From 7b141aaf8602348ce369d4204dab590e8c9c7c44 Mon Sep 17 00:00:00 2001 From: Mihovil Ilakovac Date: Wed, 22 Jan 2025 16:53:12 +0100 Subject: [PATCH 01/20] Wasp app runner. Merge todo apps. Headless CI. --- .github/workflows/waspc-ci.yaml | 43 +- headless-tests-runner/.gitignore | 2 + headless-tests-runner/README.md | 62 + headless-tests-runner/package-lock.json | 198 + headless-tests-runner/package.json | 10 + headless-tests-runner/runApp.js | 338 + .../todoApp/.env.client.headless} | 0 waspc/examples/todoApp/.env.server.example | 11 +- waspc/examples/todoApp/.env.server.headless | 22 + waspc/examples/todoApp/.gitignore | 4 + .../headless-tests}/playwright.config.ts | 26 +- .../headless-tests}/tests/auth-hooks.spec.ts | 0 .../tests/catch-all-route.spec.ts | 0 .../todoApp/headless-tests/tests/crud.spec.ts | 50 + .../todoApp/headless-tests}/tests/helpers.ts | 5 +- .../headless-tests/tests/simple.spec.ts | 71 + .../headless-tests}/tests/user-api.spec.ts | 8 +- waspc/examples/todoApp/main.wasp | 21 +- .../migration.sql | 3 + waspc/examples/todoApp/package-lock.json | 56 + waspc/examples/todoApp/package.json | 1 + waspc/examples/todoApp/schema.prisma | 6 +- waspc/examples/todoApp/src/Todo.test.tsx | 16 + waspc/examples/todoApp/src/Todo.tsx | 78 +- waspc/examples/todoApp/src/auth/hooks.ts | 75 +- .../server => examples/todoApp/src}/crud.ts | 0 .../todoApp/src}/pages/CrudTest.tsx | 0 .../todoApp/src/pages/ProfilePage.tsx | 13 +- waspc/examples/todoApp/src/queries.ts | 20 +- waspc/headless-test/.gitignore | 4 - waspc/headless-test/README.md | 26 - .../examples/todoApp/.env.server.example | 7 - .../headless-test/examples/todoApp/.gitignore | 11 - .../headless-test/examples/todoApp/.wasproot | 1 - .../headless-test/examples/todoApp/Dockerfile | 1 - .../20231213154621_initial/migration.sql | 46 - .../20240115130723_add_session/migration.sql | 17 - .../migration.sql | 2 - .../migration.sql | 2 - .../todoApp/migrations/migration_lock.toml | 3 - .../examples/todoApp/package-lock.json | 9015 ----------------- .../examples/todoApp/package.json | 19 - .../examples/todoApp/postcss.config.cjs | 6 - .../examples/todoApp/prettier.config.js | 6 - .../examples/todoApp/public/.gitkeep | 0 .../examples/todoApp/schema.prisma | 25 - .../examples/todoApp/src/.waspignore | 3 - .../examples/todoApp/src/auth/hooks.ts | 37 - .../examples/todoApp/src/client/App.tsx | 42 - .../examples/todoApp/src/client/Main.css | 46 - .../examples/todoApp/src/client/Todo.tsx | 234 - .../todoApp/src/client/clientSetup.js | 6 - .../todoApp/src/client/pages/About.jsx | 13 - .../todoApp/src/client/pages/CatchAll.tsx | 20 - .../todoApp/src/client/pages/Main.jsx | 7 - .../todoApp/src/client/pages/ProfilePage.tsx | 38 - .../todoApp/src/client/pages/Task.tsx | 74 - .../client/pages/auth/EmailVerification.tsx | 27 - .../todoApp/src/client/pages/auth/Login.tsx | 35 - .../src/client/pages/auth/PasswordReset.tsx | 27 - .../pages/auth/RequestPasswordReset.tsx | 21 - .../todoApp/src/client/pages/auth/Signup.tsx | 37 - .../src/client/pages/auth/appearance.js | 9 - .../todoApp/src/client/pages/auth/helpers.ts | 12 - .../examples/todoApp/src/client/todoLogo.png | Bin 76853 -> 0 bytes .../examples/todoApp/src/client/user.ts | 19 - .../examples/todoApp/src/server/actions.ts | 87 - .../examples/todoApp/src/server/apis.ts | 55 - .../examples/todoApp/src/server/auth/email.ts | 23 - .../examples/todoApp/src/server/dbSeeds.ts | 35 - .../examples/todoApp/src/server/jobs/bar.js | 11 - .../examples/todoApp/src/server/queries.ts | 74 - .../todoApp/src/server/serverSetup.ts | 54 - .../examples/todoApp/src/util.js | 3 - .../examples/todoApp/src/vite-env.d.ts | 1 - .../examples/todoApp/tailwind.config.cjs | 15 - .../examples/todoApp/todoApp.wasp | 219 - .../examples/todoApp/tsconfig.json | 52 - .../examples/todoApp/vite.config.ts | 7 - waspc/headless-test/package-lock.json | 315 - waspc/headless-test/package.json | 26 - waspc/headless-test/start.js | 31 - waspc/headless-test/tests/crud.spec.ts | 50 - waspc/headless-test/tests/simple.spec.ts | 71 - waspc/waspc.cabal | 1 - 85 files changed, 983 insertions(+), 11184 deletions(-) create mode 100644 headless-tests-runner/.gitignore create mode 100644 headless-tests-runner/README.md create mode 100644 headless-tests-runner/package-lock.json create mode 100644 headless-tests-runner/package.json create mode 100644 headless-tests-runner/runApp.js rename waspc/{headless-test/examples/todoApp/.env.client.example => examples/todoApp/.env.client.headless} (100%) create mode 100644 waspc/examples/todoApp/.env.server.headless rename waspc/{headless-test => examples/todoApp/headless-tests}/playwright.config.ts (71%) rename waspc/{headless-test => examples/todoApp/headless-tests}/tests/auth-hooks.spec.ts (100%) rename waspc/{headless-test => examples/todoApp/headless-tests}/tests/catch-all-route.spec.ts (100%) create mode 100644 waspc/examples/todoApp/headless-tests/tests/crud.spec.ts rename waspc/{headless-test => examples/todoApp/headless-tests}/tests/helpers.ts (87%) create mode 100644 waspc/examples/todoApp/headless-tests/tests/simple.spec.ts rename waspc/{headless-test => examples/todoApp/headless-tests}/tests/user-api.spec.ts (78%) create mode 100644 waspc/examples/todoApp/migrations/20250122145423_headless_tests_update/migration.sql rename waspc/{headless-test/examples/todoApp/src/server => examples/todoApp/src}/crud.ts (100%) rename waspc/{headless-test/examples/todoApp/src/client => examples/todoApp/src}/pages/CrudTest.tsx (100%) delete mode 100644 waspc/headless-test/.gitignore delete mode 100644 waspc/headless-test/README.md delete mode 100644 waspc/headless-test/examples/todoApp/.env.server.example delete mode 100644 waspc/headless-test/examples/todoApp/.gitignore delete mode 100644 waspc/headless-test/examples/todoApp/.wasproot delete mode 100644 waspc/headless-test/examples/todoApp/Dockerfile delete mode 100644 waspc/headless-test/examples/todoApp/migrations/20231213154621_initial/migration.sql delete mode 100644 waspc/headless-test/examples/todoApp/migrations/20240115130723_add_session/migration.sql delete mode 100644 waspc/headless-test/examples/todoApp/migrations/20240508125445_add_headless_test_property/migration.sql delete mode 100644 waspc/headless-test/examples/todoApp/migrations/20240731113303_add_login_hook_user_property/migration.sql delete mode 100644 waspc/headless-test/examples/todoApp/migrations/migration_lock.toml delete mode 100644 waspc/headless-test/examples/todoApp/package-lock.json delete mode 100644 waspc/headless-test/examples/todoApp/package.json delete mode 100644 waspc/headless-test/examples/todoApp/postcss.config.cjs delete mode 100644 waspc/headless-test/examples/todoApp/prettier.config.js delete mode 100644 waspc/headless-test/examples/todoApp/public/.gitkeep delete mode 100644 waspc/headless-test/examples/todoApp/schema.prisma delete mode 100644 waspc/headless-test/examples/todoApp/src/.waspignore delete mode 100644 waspc/headless-test/examples/todoApp/src/auth/hooks.ts delete mode 100644 waspc/headless-test/examples/todoApp/src/client/App.tsx delete mode 100644 waspc/headless-test/examples/todoApp/src/client/Main.css delete mode 100644 waspc/headless-test/examples/todoApp/src/client/Todo.tsx delete mode 100644 waspc/headless-test/examples/todoApp/src/client/clientSetup.js delete mode 100644 waspc/headless-test/examples/todoApp/src/client/pages/About.jsx delete mode 100644 waspc/headless-test/examples/todoApp/src/client/pages/CatchAll.tsx delete mode 100644 waspc/headless-test/examples/todoApp/src/client/pages/Main.jsx delete mode 100644 waspc/headless-test/examples/todoApp/src/client/pages/ProfilePage.tsx delete mode 100644 waspc/headless-test/examples/todoApp/src/client/pages/Task.tsx delete mode 100644 waspc/headless-test/examples/todoApp/src/client/pages/auth/EmailVerification.tsx delete mode 100644 waspc/headless-test/examples/todoApp/src/client/pages/auth/Login.tsx delete mode 100644 waspc/headless-test/examples/todoApp/src/client/pages/auth/PasswordReset.tsx delete mode 100644 waspc/headless-test/examples/todoApp/src/client/pages/auth/RequestPasswordReset.tsx delete mode 100644 waspc/headless-test/examples/todoApp/src/client/pages/auth/Signup.tsx delete mode 100644 waspc/headless-test/examples/todoApp/src/client/pages/auth/appearance.js delete mode 100644 waspc/headless-test/examples/todoApp/src/client/pages/auth/helpers.ts delete mode 100644 waspc/headless-test/examples/todoApp/src/client/todoLogo.png delete mode 100644 waspc/headless-test/examples/todoApp/src/client/user.ts delete mode 100644 waspc/headless-test/examples/todoApp/src/server/actions.ts delete mode 100644 waspc/headless-test/examples/todoApp/src/server/apis.ts delete mode 100644 waspc/headless-test/examples/todoApp/src/server/auth/email.ts delete mode 100644 waspc/headless-test/examples/todoApp/src/server/dbSeeds.ts delete mode 100644 waspc/headless-test/examples/todoApp/src/server/jobs/bar.js delete mode 100644 waspc/headless-test/examples/todoApp/src/server/queries.ts delete mode 100644 waspc/headless-test/examples/todoApp/src/server/serverSetup.ts delete mode 100644 waspc/headless-test/examples/todoApp/src/util.js delete mode 100644 waspc/headless-test/examples/todoApp/src/vite-env.d.ts delete mode 100644 waspc/headless-test/examples/todoApp/tailwind.config.cjs delete mode 100644 waspc/headless-test/examples/todoApp/todoApp.wasp delete mode 100644 waspc/headless-test/examples/todoApp/tsconfig.json delete mode 100644 waspc/headless-test/examples/todoApp/vite.config.ts delete mode 100644 waspc/headless-test/package-lock.json delete mode 100644 waspc/headless-test/package.json delete mode 100644 waspc/headless-test/start.js delete mode 100644 waspc/headless-test/tests/crud.spec.ts delete mode 100644 waspc/headless-test/tests/simple.spec.ts diff --git a/.github/workflows/waspc-ci.yaml b/.github/workflows/waspc-ci.yaml index 7cf040c585..ed16226b26 100644 --- a/.github/workflows/waspc-ci.yaml +++ b/.github/workflows/waspc-ci.yaml @@ -3,18 +3,18 @@ name: WASPC-CI on: push: paths: - - 'waspc/**' + - "waspc/**" branches: - main - release pull_request: paths: - - 'waspc/**' + - "waspc/**" create: { tags: [v*] } schedule: # Additionally run once per week (At 00:00 on Sunday) to avoid loosing cache # (GH deletes it after 7 days of not using it). - - cron: '0 0 * * 0' + - cron: "0 0 * * 0" env: WASP_TELEMETRY_DISABLE: 1 @@ -51,11 +51,11 @@ jobs: - macos-latest - windows-latest node-version: - - 'latest' + - "latest" ghc: - - '8.10.7' + - "8.10.7" cabal: - - '3.6.2.0' + - "3.6.2.0" # In addition to the default matrix, we also want to run the build job for # additional Node.js versions, to make sure that Wasp works with them. # To reduce the number of jobs, we only test the Node.js versions on @@ -63,12 +63,12 @@ jobs: include: - os: ubuntu-20.04 node-version: 18 - ghc: '8.10.7' - cabal: '3.6.2.0' + ghc: "8.10.7" + cabal: "3.6.2.0" - os: ubuntu-20.04 node-version: 20 - ghc: '8.10.7' - cabal: '3.6.2.0' + ghc: "8.10.7" + cabal: "3.6.2.0" steps: - name: Configure git @@ -80,7 +80,7 @@ jobs: git config --global core.autocrlf input git config --global core.eol lf - - uses: 'actions/checkout@v3' + - uses: "actions/checkout@v3" with: # Workaround for a Github Checkout action bug # https://github.com/actions/checkout/issues/1359#issuecomment-1567902034 @@ -174,14 +174,21 @@ jobs: id: headless-install-dependencies if: matrix.os == 'ubuntu-20.04' run: | - cd headless-test + cd examples/todoApp + npm ci + + - name: Headless - Setup the Wasp app runner + id: headless-install-dependencies + if: matrix.os == 'ubuntu-20.04' + run: | + cd ../headless-tests-runner npm ci - name: Headless - Store Playwright's Version id: headless-store-playwright-version if: matrix.os == 'ubuntu-20.04' run: | - cd headless-test + cd examples/todoApp PLAYWRIGHT_VERSION=$(npm ls @playwright/test | grep @playwright | sed 's/.*@//') echo "Playwright's Version: $PLAYWRIGHT_VERSION" echo "PLAYWRIGHT_VERSION=$PLAYWRIGHT_VERSION" >> $GITHUB_ENV @@ -198,18 +205,18 @@ jobs: id: headless-setup-playwright if: steps.cache-playwright-browsers.outputs.cache-hit != 'true' && matrix.os == 'ubuntu-20.04' run: | - cd headless-test + cd examples/todoApp + npm ci npx playwright install --with-deps - name: Headless - Run Playwright Tests id: headless-run-playwright-tests if: matrix.os == 'ubuntu-20.04' run: | - cd headless-test - npm ci + cd examples/todoApp # Runs the tests with the debug flag so that we can see Wasp output DEBUG=pw:webserver npx playwright test - + - name: Run e2e tests run: cabal test e2e-test @@ -226,7 +233,7 @@ jobs: with: draft: true allowUpdates: true - artifacts: 'waspc/artifacts/*' + artifacts: "waspc/artifacts/*" artifactErrorsFailBuild: true replacesArtifacts: true token: ${{ secrets.GITHUB_TOKEN }} diff --git a/headless-tests-runner/.gitignore b/headless-tests-runner/.gitignore new file mode 100644 index 0000000000..8c31c44cdf --- /dev/null +++ b/headless-tests-runner/.gitignore @@ -0,0 +1,2 @@ +node_modules/ +test-results/ \ No newline at end of file diff --git a/headless-tests-runner/README.md b/headless-tests-runner/README.md new file mode 100644 index 0000000000..b7575e0da0 --- /dev/null +++ b/headless-tests-runner/README.md @@ -0,0 +1,62 @@ +# Wasp Application Runner + +A robust script to manage your Wasp application with PostgreSQL integration, including automated database setup and migrations. + +## Installation + +``` +npm install +``` + +## Usage + +``` +node run-app.js --app-path --app-name +``` + +### Arguments Table + +| Argument | Description | Example | +| ------------ | --------------------------------------- | --------------- | +| `--app-path` | Path to your Wasp application directory | `./my-wasp-app` | +| `--app-name` | Unique name for your application | `myapp` | + +### Example Command + +``` +node run-app.js --app-path ~/projects/my-wasp-app --app-name awesome-app +``` + +## Environment File Handling + +The script automatically sets up environment files if headless versions exist: + +- If `.env.client.headless` exists ➔ copies to `.env.client` +- If `.env.server.headless` exists ➔ copies to `.env.server` + +This allows you to commit template files with default values while keeping actual credentials out of source control. **Note:** it will override any locally modified `.env.client` or `.env.server` files. + +## Configuration Details + +- Port: 5432 +- Password: `devpass` +- Docker image: `postgres:16` +- Container name template: `-postgres` +- Health check retries: 10 +- Health check delay: 2000ms + +## Environment Variables + +The script automatically sets: + +``` +DATABASE_URL=postgresql://postgres:devpass@localhost:5432/postgres +``` + +## Workflow Steps + +1. Dependency verification +2. PostgreSQL container setup +3. Database readiness checks +4. Migration execution +5. Application startup diff --git a/headless-tests-runner/package-lock.json b/headless-tests-runner/package-lock.json new file mode 100644 index 0000000000..00b2625e7d --- /dev/null +++ b/headless-tests-runner/package-lock.json @@ -0,0 +1,198 @@ +{ + "name": "headless-tests-runner", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "headless-tests-runner", + "dependencies": { + "linebyline": "^1.3.0", + "yargs": "^17.7.2" + }, + "devDependencies": { + "@types/node": "^22.10.7" + } + }, + "node_modules/@types/node": { + "version": "22.10.7", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.10.7.tgz", + "integrity": "sha512-V09KvXxFiutGp6B7XkpaDXlNadZxrzajcY50EuoLIpQ6WWYCSvf19lVIazzfIzQvhUN2HjX12spLojTnhuKlGg==", + "dev": true, + "dependencies": { + "undici-types": "~6.20.0" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "engines": { + "node": ">=6" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "engines": { + "node": ">=8" + } + }, + "node_modules/linebyline": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/linebyline/-/linebyline-1.3.0.tgz", + "integrity": "sha512-3fpIYMrSU77OCf89hjXKuCx6vGwgWEu4N5DDCGqgZ1BF0HYy9V8IbQb/3+VWIU17iBQ83qQoUokH0AhPMOTi7w==" + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/undici-types": { + "version": "6.20.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.20.0.tgz", + "integrity": "sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==", + "dev": true + }, + "node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "engines": { + "node": ">=10" + } + }, + "node_modules/yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "engines": { + "node": ">=12" + } + } + } +} diff --git a/headless-tests-runner/package.json b/headless-tests-runner/package.json new file mode 100644 index 0000000000..017197ab23 --- /dev/null +++ b/headless-tests-runner/package.json @@ -0,0 +1,10 @@ +{ + "name": "headless-tests-runner", + "dependencies": { + "linebyline": "^1.3.0", + "yargs": "^17.7.2" + }, + "devDependencies": { + "@types/node": "^22.10.7" + } +} diff --git a/headless-tests-runner/runApp.js b/headless-tests-runner/runApp.js new file mode 100644 index 0000000000..cf6b00c984 --- /dev/null +++ b/headless-tests-runner/runApp.js @@ -0,0 +1,338 @@ +const cp = require("child_process"); +const readline = require("linebyline"); +const yargs = require("yargs/yargs"); +const { hideBin } = require("yargs/helpers"); +const path = require("path"); +const fs = require("fs"); + +// Parse command line arguments +const argv = yargs(hideBin(process.argv)) + .option("app-path", { + type: "string", + description: "Path to the application", + demandOption: true, + }) + .option("app-name", { + type: "string", + description: "Name of the application (used for DB container name)", + demandOption: true, + }) + .parse(); + +const pathToApp = argv["app-path"]; +const appName = argv["app-name"]; +const children = []; +const POSTGRES_CONFIG = { + port: 5432, + password: "devpass", + image: "postgres:16", + healthCheckRetries: 10, + healthCheckDelay: 2000, + containerName: `${appName}-postgres`, +}; + +// Configure cleanup handlers +setupProcessCleanup(); + +// Improved logging with timestamps and colors +function log(processName, type, message) { + const typeColor = + { + error: 31, + warn: 33, + info: 36, + success: 32, + debug: 90, + }[type] || 0; + + console.log( + `\x1b[0m` + + `\x1b[${typeColor}m[${processName}${ + type ? `:${type}` : "" + }]\x1b[0m ${message}` + ); +} + +// Process cleanup handling +function setupProcessCleanup() { + const cleanExit = (signal) => { + log("shutdown", "warn", `Received ${signal}. Cleaning up...`); + children.forEach((child) => { + if (!child.killed) { + child.kill(); + } + }); + process.exit(); + }; + + process.on("SIGINT", () => cleanExit("SIGINT")); + process.on("SIGTERM", () => cleanExit("SIGTERM")); +} + +// Validate required commands exist +async function checkDependencies() { + const requiredCommands = ["docker", "cabal"]; + + for (const cmd of requiredCommands) { + if (!(await commandExists(cmd))) { + log( + "setup", + "error", + `Required command '${cmd}' not found. Please install it.` + ); + process.exit(1); + } + } +} + +function commandExists(command) { + return new Promise((resolve) => { + cp.exec(`command -v ${command}`, (error) => { + resolve(!error); + }); + }); +} + +async function ensurePostgresContainer() { + const { containerName, port, password, image } = POSTGRES_CONFIG; + const DATABASE_URL = `postgresql://postgres:${password}@localhost:${port}/postgres`; + + try { + // Validate application name format + const validNameRegex = /^[a-zA-Z0-9][a-zA-Z0-9_.-]*$/; + if (!validNameRegex.test(appName)) { + throw new Error( + `Invalid app name: ${appName}. It should only contain alphanumeric characters, dots, underscores, and dashes, and must start with an alphanumeric character.` + ); + } + + // Check if container exists + const exists = await dockerContainerExists(containerName); + + if (exists) { + // Check if container is running + const isRunning = await dockerContainerIsRunning(containerName); + + if (!isRunning) { + log("postgres", "info", "Starting existing PostgreSQL container..."); + await dockerStartContainer(containerName); + } else { + log("postgres", "success", "PostgreSQL container already running"); + } + } else { + log("postgres", "info", "Creating new PostgreSQL container..."); + await dockerCreateContainer(containerName, port, password, image); + } + + // Wait for PostgreSQL to become ready + await waitForPostgresReady(); + + return DATABASE_URL; + } catch (error) { + log("postgres", "error", error.message); + process.exit(1); + } +} + +async function dockerContainerExists(containerName) { + return new Promise((resolve) => { + const proc = cp.spawn("docker", [ + "inspect", + "--format={{.Name}}", + containerName, + ]); + let output = ""; + + proc.stdout.on("data", (data) => (output += data)); + proc.on("close", (code) => resolve(code === 0)); + }); +} + +async function dockerContainerIsRunning(containerName) { + return new Promise((resolve) => { + const proc = cp.spawn("docker", [ + "inspect", + "--format={{.State.Running}}", + containerName, + ]); + let output = ""; + + proc.stdout.on("data", (data) => (output += data)); + proc.on("close", (code) => resolve(code === 0 && output.trim() === "true")); + }); +} + +async function dockerStartContainer(containerName) { + return new Promise((resolve, reject) => { + const proc = cp.spawn("docker", ["start", containerName]); + + proc.on("close", (code) => { + if (code === 0) { + resolve(); + } else { + reject(new Error("Failed to start container")); + } + }); + }); +} + +async function dockerCreateContainer(containerName, port, password, image) { + return new Promise((resolve, reject) => { + const args = [ + "run", + "-d", + "--name", + containerName, + "-p", + `${port}:5432`, + "-e", + `POSTGRES_PASSWORD=${password}`, + image, + ]; + + const proc = cp.spawn("docker", args); + + proc.on("close", (code) => { + if (code === 0) { + resolve(); + } else { + reject(new Error("Failed to create container")); + } + }); + }); +} + +async function waitForPostgresReady() { + const { containerName, healthCheckRetries, healthCheckDelay } = + POSTGRES_CONFIG; + + for (let i = 1; i <= healthCheckRetries; i++) { + log( + "postgres", + "info", + `Checking PostgreSQL readiness (attempt ${i}/${healthCheckRetries})` + ); + + const success = await new Promise((resolve) => { + const proc = cp.spawn("docker", [ + "exec", + containerName, + "pg_isready", + "-U", + "postgres", + ]); + + proc.on("close", (code) => resolve(code === 0)); + }); + + if (success) { + log("postgres", "success", "PostgreSQL is ready"); + return; + } + + await new Promise((r) => setTimeout(r, healthCheckDelay)); + } + + throw new Error("PostgreSQL did not become ready in time"); +} + +async function setupEnvFiles() { + const envFiles = [ + { headless: ".env.client.headless", target: ".env.client" }, + { headless: ".env.server.headless", target: ".env.server" }, + ]; + + envFiles.forEach(({ headless, target }) => { + const headlessPath = path.join(pathToApp, headless); + const targetPath = path.join(pathToApp, target); + + if (fs.existsSync(headlessPath)) { + log("setup", "info", `Copying ${headless} to ${target}`); + fs.copyFileSync(headlessPath, targetPath); + } else { + log("setup", "warn", `Headless env file not found: ${headless}`); + } + }); +} + +function spawn({ name, cmd, args, extraEnv = {} }) { + return new Promise((resolve, reject) => { + const spawnOptions = { + cwd: pathToApp, + env: { ...process.env, ...extraEnv }, + stdio: ["ignore", "pipe", "pipe"], + }; + + log(name, "info", `Spawning: ${cmd} ${args.join(" ")}`); + + const proc = cp.spawn(cmd, args, spawnOptions); + children.push(proc); + + // Process output handling + const handleStream = (stream, type) => { + readline(stream).on("line", (line) => { + log(name, type === "stderr" ? "error" : "info", line); + }); + }; + + handleStream(proc.stdout, "stdout"); + handleStream(proc.stderr, "stderr"); + + proc.on("error", (err) => { + log(name, "error", `Process error: ${err.message}`); + if (err.code === "ENOENT") { + log(name, "error", `Command '${cmd}' not found`); + } + reject(err); + }); + + proc.on("close", (code) => { + children.splice(children.indexOf(proc), 1); + if (code === 0) { + log(name, "success", "Process completed successfully"); + resolve(code); + } else { + log(name, "error", `Process exited with code ${code}`); + reject(code); + } + }); + }); +} + +async function main() { + try { + log("setup", "info", `Starting application: ${appName}`); + + await checkDependencies(); + const DATABASE_URL = await ensurePostgresContainer(); + + log("runApp", "info", `Using DATABASE_URL: ${DATABASE_URL}`); + log( + "runApp", + "info", + `Using DB container: ${POSTGRES_CONFIG.containerName}` + ); + + // Add environment file setup + await setupEnvFiles(); + + await spawn({ + name: "migrate-db", + cmd: "cabal", + args: ["run", "wasp-cli", "db", "migrate-dev"], + extraEnv: { DATABASE_URL }, + }); + + await spawn({ + name: "start-app", + cmd: "cabal", + args: ["run", "wasp-cli", "start"], + extraEnv: { DATABASE_URL }, + }); + } catch (error) { + log("main", "error", `Fatal error: ${error.message}`); + process.exit(1); + } +} + +main(); diff --git a/waspc/headless-test/examples/todoApp/.env.client.example b/waspc/examples/todoApp/.env.client.headless similarity index 100% rename from waspc/headless-test/examples/todoApp/.env.client.example rename to waspc/examples/todoApp/.env.client.headless diff --git a/waspc/examples/todoApp/.env.server.example b/waspc/examples/todoApp/.env.server.example index 08a8f0dd11..ac78f9ffc0 100644 --- a/waspc/examples/todoApp/.env.server.example +++ b/waspc/examples/todoApp/.env.server.example @@ -8,11 +8,10 @@ GOOGLE_CLIENT_ID='dummy-g-client-id.apps.googleusercontent.com' GITHUB_CLIENT_ID='dummy-gh-client-id' GITHUB_CLIENT_SECRET='dummy-gh-client-secret' -# Uncomment lines below and set them to real values if you want to use smtp email sender. -# SMTP_HOST='smtp.dummy.com' -# SMTP_USERNAME='dummy@dummy.com' -# SMTP_PASSWORD='dummy_pass' -# SMTP_PORT='587' +SMTP_HOST='smtp.dummy.com' +SMTP_USERNAME='dummy@dummy.com' +SMTP_PASSWORD='dummy_pass' +SMTP_PORT='587' # Uncomment lines below and set them to real values if you want to use Keycloak Auth. # KEYCLOAK_CLIENT_ID='dummy-id' @@ -24,3 +23,5 @@ DISCORD_CLIENT_SECRET='dummy-discord-client-secret' DISCORD_CLIENT_ID='dummy-discord-client-id' MY_ENV_VAR=123 + +SKIP_EMAIL_VERIFICATION_IN_DEV=true diff --git a/waspc/examples/todoApp/.env.server.headless b/waspc/examples/todoApp/.env.server.headless new file mode 100644 index 0000000000..eaf3dcef13 --- /dev/null +++ b/waspc/examples/todoApp/.env.server.headless @@ -0,0 +1,22 @@ +TEST_ENV_VAR="I am test" + +# Dummy values here will allow app to run, but you will need real values to get Google Auth to work. +GOOGLE_CLIENT_SECRET='dummy-g-client-secret' +GOOGLE_CLIENT_ID='dummy-g-client-id.apps.googleusercontent.com' + +# Dummy values here will allow app to run, but you will need real values to get GitHub Auth to work. +GITHUB_CLIENT_ID='dummy-gh-client-id' +GITHUB_CLIENT_SECRET='dummy-gh-client-secret' + +SMTP_HOST='smtp.dummy.com' +SMTP_USERNAME='dummy@dummy.com' +SMTP_PASSWORD='dummy_pass' +SMTP_PORT='587' + +# Dummy values here will allow app to run, but you will need real values to get Discord Auth to work. +DISCORD_CLIENT_SECRET='dummy-discord-client-secret' +DISCORD_CLIENT_ID='dummy-discord-client-id' + +MY_ENV_VAR=123 + +SKIP_EMAIL_VERIFICATION_IN_DEV=true \ No newline at end of file diff --git a/waspc/examples/todoApp/.gitignore b/waspc/examples/todoApp/.gitignore index 26d1125343..8ab92e45a0 100644 --- a/waspc/examples/todoApp/.gitignore +++ b/waspc/examples/todoApp/.gitignore @@ -18,3 +18,7 @@ node_modules/ # These are config files for dotenv-vault, so we don't want to ignore them. !.env.project !.env.vault + +# Headless tests +!.env.*.headless +test-results/ \ No newline at end of file diff --git a/waspc/headless-test/playwright.config.ts b/waspc/examples/todoApp/headless-tests/playwright.config.ts similarity index 71% rename from waspc/headless-test/playwright.config.ts rename to waspc/examples/todoApp/headless-tests/playwright.config.ts index e3c5fdfbbe..680005aeb3 100644 --- a/waspc/headless-test/playwright.config.ts +++ b/waspc/examples/todoApp/headless-tests/playwright.config.ts @@ -1,4 +1,4 @@ -import { defineConfig, devices } from "@playwright/test"; +import { defineConfig, devices } from '@playwright/test' /** * Read environment variables from file. @@ -10,7 +10,7 @@ import { defineConfig, devices } from "@playwright/test"; * See https://playwright.dev/docs/test-configuration. */ export default defineConfig({ - testDir: "./tests", + testDir: './tests', /* Run tests in files in parallel */ fullyParallel: true, /* Fail the build on CI if you accidentally left test.only in the source code. */ @@ -20,34 +20,36 @@ export default defineConfig({ /* Opt out of parallel tests on CI. */ workers: process.env.CI ? 1 : undefined, /* Reporter to use. See https://playwright.dev/docs/test-reporters */ - reporter: process.env.CI ? "dot" : "list", + reporter: process.env.CI ? 'dot' : 'list', /* Shared settings for all the projects below. See https://playwright.dev/docs/api/class-testoptions. */ use: { /* Base URL to use in actions like `await page.goto('/')`. */ - baseURL: "http://localhost:3000", + baseURL: 'http://localhost:3000', /* Collect trace when retrying the failed test. See https://playwright.dev/docs/trace-viewer */ - trace: "on-first-retry", + trace: 'on-first-retry', }, projects: [ { - name: "chromium", - use: { ...devices["Desktop Chrome"] }, + name: 'chromium', + use: { ...devices['Desktop Chrome'] }, }, /* Test against mobile viewports. */ { - name: "Mobile Chrome", - use: { ...devices["Pixel 5"] }, + name: 'Mobile Chrome', + use: { ...devices['Pixel 5'] }, }, ], /* Run your local dev server before starting the tests */ webServer: { - command: "npm run example-app:start", + command: + 'node ../../../../headless-tests-runner/runApp.js --app-path=../ --app-name=waspc-todoApp', + // Wait for the backend to start - url: "http://localhost:3001", + url: 'http://localhost:3001', reuseExistingServer: !process.env.CI, timeout: 120 * 1000, }, -}); +}) diff --git a/waspc/headless-test/tests/auth-hooks.spec.ts b/waspc/examples/todoApp/headless-tests/tests/auth-hooks.spec.ts similarity index 100% rename from waspc/headless-test/tests/auth-hooks.spec.ts rename to waspc/examples/todoApp/headless-tests/tests/auth-hooks.spec.ts diff --git a/waspc/headless-test/tests/catch-all-route.spec.ts b/waspc/examples/todoApp/headless-tests/tests/catch-all-route.spec.ts similarity index 100% rename from waspc/headless-test/tests/catch-all-route.spec.ts rename to waspc/examples/todoApp/headless-tests/tests/catch-all-route.spec.ts diff --git a/waspc/examples/todoApp/headless-tests/tests/crud.spec.ts b/waspc/examples/todoApp/headless-tests/tests/crud.spec.ts new file mode 100644 index 0000000000..920a90a0d9 --- /dev/null +++ b/waspc/examples/todoApp/headless-tests/tests/crud.spec.ts @@ -0,0 +1,50 @@ +import { test, expect } from '@playwright/test' +import { generateRandomCredentials, performSignup } from './helpers' + +test.describe('CRUD test', () => { + const { email, password } = generateRandomCredentials() + + test.describe.configure({ mode: 'serial' }) + + test.beforeAll(async ({ browser }) => { + const page = await browser.newPage() + + await performSignup(page, { + email, + password, + }) + + await expect(page.locator('body')).toContainText( + `You've signed up successfully! Check your email for the confirmation link.` + ) + }) + + test('CRUD with override works', async ({ page }) => { + await page.goto('/login') + + await page.waitForSelector('text=Log in to your account') + + await page.locator("input[type='email']").fill(email) + await page.locator("input[type='password']").fill(password) + await page.getByRole('button', { name: 'Log in' }).click() + + await page.waitForSelector('text=User Auth Fields Demo') + + await page.goto('/crud') + + await page.waitForSelector('text=Tasks') + + await createTask(page, 'special filter 1') + await createTask(page, 'special filter 2') + await createTask(page, 'something else') + + await expect(page.locator('body')).toContainText('special filter 1') + await expect(page.locator('body')).toContainText('special filter 2') + await expect(page.locator("li[text='something else']")).not.toBeVisible() + }) +}) + +async function createTask(page: any, description: string) { + await page.locator("input[type='text']").fill(description) + await page.getByText('Create task').click() +} diff --git a/waspc/headless-test/tests/helpers.ts b/waspc/examples/todoApp/headless-tests/tests/helpers.ts similarity index 87% rename from waspc/headless-test/tests/helpers.ts rename to waspc/examples/todoApp/headless-tests/tests/helpers.ts index e16cba34ca..b15115cc30 100644 --- a/waspc/headless-test/tests/helpers.ts +++ b/waspc/examples/todoApp/headless-tests/tests/helpers.ts @@ -2,7 +2,7 @@ import type { Page } from '@playwright/test' export async function performSignup( page: Page, - { email, password }: { email: string; password: string }, + { email, password }: { email: string; password: string } ) { await page.goto('/signup') @@ -10,6 +10,7 @@ export async function performSignup( await page.locator("input[type='email']").fill(email) await page.locator("input[type='password']").fill(password) + await page.locator("input[name='address']").fill('Dummy address') await page.locator('button').click() } @@ -21,7 +22,7 @@ export async function performLogin( }: { email: string password: string - }, + } ) { await page.goto('/login') diff --git a/waspc/examples/todoApp/headless-tests/tests/simple.spec.ts b/waspc/examples/todoApp/headless-tests/tests/simple.spec.ts new file mode 100644 index 0000000000..1de68f34d7 --- /dev/null +++ b/waspc/examples/todoApp/headless-tests/tests/simple.spec.ts @@ -0,0 +1,71 @@ +import { test, expect } from '@playwright/test' +import { + generateRandomCredentials, + performLogin, + performSignup, +} from './helpers' + +test('has title', async ({ page }) => { + await page.goto('/') + + await expect(page).toHaveTitle(/ToDo App/) +}) +test.describe('signup and login', () => { + const { email, password } = generateRandomCredentials() + + test.describe.configure({ mode: 'serial' }) + + test('social button renders', async ({ page }) => { + await page.goto('/signup') + + await page.waitForSelector('text=Create a new account') + + await expect( + page.locator("a[href='http://localhost:3001/auth/google/login']") + ).toBeVisible() + }) + + test('can sign up', async ({ page }) => { + await performSignup(page, { + email, + password, + }) + + await expect(page.locator('body')).toContainText( + `You've signed up successfully! Check your email for the confirmation link.` + ) + }) + + test('can log in and create a task', async ({ page }) => { + await performLogin(page, { + email, + password: '12345678xxx', + }) + + await expect(page.locator('body')).toContainText('Invalid credentials') + + await performLogin(page, { + email, + password, + }) + + await expect(page).toHaveURL('/profile') + + await page.goto('/') + + // Create a new task + const randomTask = `New Task ${Math.random().toString(36).substring(7)}` + await page.locator("input[type='text']").fill(randomTask) + await page.getByText('Create new task').click() + + const fullTaskText = `${randomTask} by ${email}` + await page.waitForSelector(`text=${fullTaskText}`) + + await expect(page.locator('body')).toContainText(fullTaskText) + + // Navigate to task page + await page.locator(`text=${fullTaskText}`).click() + const taskPageText = `description: ${randomTask}` + await page.waitForSelector(`text=${taskPageText}`) + }) +}) diff --git a/waspc/headless-test/tests/user-api.spec.ts b/waspc/examples/todoApp/headless-tests/tests/user-api.spec.ts similarity index 78% rename from waspc/headless-test/tests/user-api.spec.ts rename to waspc/examples/todoApp/headless-tests/tests/user-api.spec.ts index f64e474575..ebf62ab822 100644 --- a/waspc/headless-test/tests/user-api.spec.ts +++ b/waspc/examples/todoApp/headless-tests/tests/user-api.spec.ts @@ -13,6 +13,10 @@ test.describe('user API', () => { email, password, }) + + await expect(page.locator('body')).toContainText( + `You've signed up successfully! Check your email for the confirmation link.` + ) }) test('user API works on the client', async ({ page }) => { @@ -24,10 +28,10 @@ test.describe('user API', () => { await page.locator("input[type='password']").fill(password) await page.getByRole('button', { name: 'Log in' }).click() - await page.waitForSelector('text=Profile page') + await page.waitForSelector('text=User Auth Fields Demo') await expect(page.locator('body')).toContainText( - `Hello ${email}! Your status is verfied`, + `Hello ${email}! Your status is verfied` ) await expect(page.locator('a[href="/profile"]')).toContainText(email) diff --git a/waspc/examples/todoApp/main.wasp b/waspc/examples/todoApp/main.wasp index f827d34e83..a21cf3592e 100644 --- a/waspc/examples/todoApp/main.wasp +++ b/waspc/examples/todoApp/main.wasp @@ -1,6 +1,6 @@ app todoApp { wasp: { - version: "^0.15.0" + version: "^0.16.0" }, title: "ToDo App", // head: [], @@ -47,7 +47,6 @@ app todoApp { onAuthSucceededRedirectTo: "/profile", onBeforeSignup: import { onBeforeSignup } from "@src/auth/hooks.js", onAfterSignup: import { onAfterSignup } from "@src/auth/hooks.js", - onBeforeOAuthRedirect: import { onBeforeOAuthRedirect } from "@src/auth/hooks.js", onBeforeLogin: import { onBeforeLogin } from "@src/auth/hooks.js", onAfterLogin: import { onAfterLogin } from "@src/auth/hooks.js", }, @@ -125,6 +124,12 @@ page TaskPage { component: import Task from "@src/pages/Task" } +route CrudRoute { path: "/crud", to: Crud } +page Crud { + component: import { CrudTestPage } from "@src/pages/CrudTest.tsx", + authRequired: true +} + route CatchAllRoute { path: "*", to: CatchAllPage } page CatchAllPage { component: import { CatchAllPage } from "@src/pages/CatchAll" @@ -327,3 +332,15 @@ action boolToVoidAuth { auth: true, entities: [Task] } + +// Crud + +crud Tasks { + entity: Task, + operations: { + getAll: { + overrideFn: import { getAllFilteredTasks } from "@src/crud" + }, + create: {} + } +} diff --git a/waspc/examples/todoApp/migrations/20250122145423_headless_tests_update/migration.sql b/waspc/examples/todoApp/migrations/20250122145423_headless_tests_update/migration.sql new file mode 100644 index 0000000000..787e231214 --- /dev/null +++ b/waspc/examples/todoApp/migrations/20250122145423_headless_tests_update/migration.sql @@ -0,0 +1,3 @@ +-- AlterTable +ALTER TABLE "User" ADD COLUMN "isOnAfterLoginHookCalled" BOOLEAN NOT NULL DEFAULT false, +ADD COLUMN "isOnAfterSignupHookCalled" BOOLEAN NOT NULL DEFAULT false; diff --git a/waspc/examples/todoApp/package-lock.json b/waspc/examples/todoApp/package-lock.json index 9b072296ec..1edb23f331 100644 --- a/waspc/examples/todoApp/package-lock.json +++ b/waspc/examples/todoApp/package-lock.json @@ -6,6 +6,7 @@ "": { "name": "todoApp", "dependencies": { + "@playwright/test": "^1.49.1", "@tailwindcss/forms": "^0.5.3", "@tailwindcss/typography": "^0.5.7", "react": "^18.2.0", @@ -1393,6 +1394,20 @@ "node": ">=14" } }, + "node_modules/@playwright/test": { + "version": "1.49.1", + "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.49.1.tgz", + "integrity": "sha512-Ky+BVzPz8pL6PQxHqNRW1k3mIyv933LML7HktS8uik0bUXNCdPhoS/kLihiO1tMf/egaJb4IutXd7UywvXEW+g==", + "dependencies": { + "playwright": "1.49.1" + }, + "bin": { + "playwright": "cli.js" + }, + "engines": { + "node": ">=18" + } + }, "node_modules/@polka/url": { "version": "1.0.0-next.28", "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.28.tgz", @@ -6683,6 +6698,47 @@ "pathe": "^1.1.2" } }, + "node_modules/playwright": { + "version": "1.49.1", + "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.49.1.tgz", + "integrity": "sha512-VYL8zLoNTBxVOrJBbDuRgDWa3i+mfQgDTrL8Ah9QXZ7ax4Dsj0MSq5bYgytRnDVVe+njoKnfsYkH3HzqVj5UZA==", + "dependencies": { + "playwright-core": "1.49.1" + }, + "bin": { + "playwright": "cli.js" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "fsevents": "2.3.2" + } + }, + "node_modules/playwright-core": { + "version": "1.49.1", + "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.49.1.tgz", + "integrity": "sha512-BzmpVcs4kE2CH15rWfzpjzVGhWERJfmnXmniSyKeRZUs9Ws65m+RGIi7mjJK/euCegfn3i7jvqWeWyHe9y3Vgg==", + "bin": { + "playwright-core": "cli.js" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/playwright/node_modules/fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, "node_modules/possible-typed-array-names": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz", diff --git a/waspc/examples/todoApp/package.json b/waspc/examples/todoApp/package.json index df4c8fc162..a80a9627dc 100644 --- a/waspc/examples/todoApp/package.json +++ b/waspc/examples/todoApp/package.json @@ -6,6 +6,7 @@ "env:push": "npx dotenv-vault@latest push development .env.server" }, "dependencies": { + "@playwright/test": "^1.49.1", "@tailwindcss/forms": "^0.5.3", "@tailwindcss/typography": "^0.5.7", "react": "^18.2.0", diff --git a/waspc/examples/todoApp/schema.prisma b/waspc/examples/todoApp/schema.prisma index 9b0900606e..66bc6012ba 100644 --- a/waspc/examples/todoApp/schema.prisma +++ b/waspc/examples/todoApp/schema.prisma @@ -10,7 +10,11 @@ generator client { } model User { - id Int @id @default(autoincrement()) + id Int @id @default(autoincrement()) + + isOnAfterSignupHookCalled Boolean @default(false) + isOnAfterLoginHookCalled Boolean @default(false) + tasks Task[] address String? votes TaskVote[] diff --git a/waspc/examples/todoApp/src/Todo.test.tsx b/waspc/examples/todoApp/src/Todo.test.tsx index 64b5c0fb51..2da327d151 100644 --- a/waspc/examples/todoApp/src/Todo.test.tsx +++ b/waspc/examples/todoApp/src/Todo.test.tsx @@ -22,6 +22,22 @@ const mockTasks = [ description: 'test todo 1', isDone: true, userId: 1, + user: { + id: 1, + isOnAfterSignupHookCalled: true, + isOnAfterLoginHookCalled: true, + address: '123 Main St', + auth: { + id: '1', + userId: 1, + identities: [ + { + providerName: 'email', + providerUserId: 'elon@tesla.com', + }, + ], + }, + }, }, ] diff --git a/waspc/examples/todoApp/src/Todo.tsx b/waspc/examples/todoApp/src/Todo.tsx index 00ce39bd22..f1ff4931e4 100644 --- a/waspc/examples/todoApp/src/Todo.tsx +++ b/waspc/examples/todoApp/src/Todo.tsx @@ -1,5 +1,4 @@ import { Link } from 'wasp/client/router' -import { type Task } from 'wasp/entities' import { useAction, @@ -10,23 +9,22 @@ import { toggleAllTasks, useQuery, getTasks, - getTask, - getDate, - getAnythingAuth, } from 'wasp/client/operations' import React, { useState, FormEventHandler, ChangeEventHandler } from 'react' +import { getEmail } from 'wasp/auth' type NonEmptyArray = [T, ...T[]] +type TaskWithUser = Awaited>[number] + export function areThereAnyTasks( - tasks: Task[] | undefined -): tasks is NonEmptyArray { + tasks: TaskWithUser[] | undefined +): tasks is NonEmptyArray { return !!(tasks && tasks.length > 0) } const Todo = () => { - // logAll() const { data: tasks, isError, error: tasksError } = useQuery(getTasks) const TasksError = () => { @@ -59,7 +57,7 @@ const Todo = () => { ) } -const Footer = ({ tasks }: { tasks: NonEmptyArray }) => { +const Footer = ({ tasks }: { tasks: NonEmptyArray }) => { const numCompletedTasks = tasks.filter((t) => t.isDone).length const numUncompletedTasks = tasks.filter((t) => !t.isDone).length @@ -87,7 +85,7 @@ const Footer = ({ tasks }: { tasks: NonEmptyArray }) => { ) } -const Tasks = ({ tasks }: { tasks: NonEmptyArray }) => { +const Tasks = ({ tasks }: { tasks: NonEmptyArray }) => { return (
@@ -101,9 +99,9 @@ const Tasks = ({ tasks }: { tasks: NonEmptyArray }) => { ) } -type UpdateTaskIsDonePayload = Pick +type UpdateTaskIsDonePayload = Pick -const TaskView = ({ task }: { task: Task }) => { +const TaskView = ({ task }: { task: TaskWithUser }) => { const updateTaskIsDoneOptimistically = useAction(updateTaskIsDone, { optimisticUpdates: [ { @@ -118,24 +116,7 @@ const TaskView = ({ task }: { task: Task }) => { ) } }, - } as OptimisticUpdateDefinition, - { - getQuerySpecifier: () => [getTask, { id: task.id }], - // This query's cache should should never be emtpy - updateQuery: ({ isDone }, oldTask) => { - if (oldTask === undefined) { - // Cache is empty (e.g., the user has not yet opened the task's - // dedicated page. - // Passes the type checker because of the assertion Returning - // undefined should be properly supported and not a hack, see - // https://github.com/wasp-lang/wasp/issues/2017 - return undefined - } else { - const result = { ...oldTask!, isDone } - return result - } - }, - } as OptimisticUpdateDefinition, + } as OptimisticUpdateDefinition, ], }) const handleTaskIsDoneChange: ChangeEventHandler = async ( @@ -151,6 +132,8 @@ const TaskView = ({ task }: { task: Task }) => { } } + const email = getEmail(task.user) + return ( @@ -179,21 +162,26 @@ const NewTaskForm = () => { { getQuerySpecifier: () => [getTasks], updateQuery: (newTask, oldTasks) => { + const newTaskWithUser = { + ...newTask, + user: {}, + } as TaskWithUser + if (oldTasks === undefined) { // cache is empty - return [newTask as Task] + return [newTaskWithUser] } else { - return [...oldTasks, newTask as Task] + return [...oldTasks, newTaskWithUser] } }, } as OptimisticUpdateDefinition< - Pick, - Task[] + Pick, + TaskWithUser[] >, ], }) - const createNewTask = async (description: Task['description']) => { + const createNewTask = async (description: TaskWithUser['description']) => { const task = { isDone: false, description } await createTaskFn(task) } @@ -243,24 +231,4 @@ const ToggleAllTasksButton = ({ disabled }: { disabled: boolean }) => { ) } -// Use this function to test calling actions directly -async function logAll() { - const tasks = await getTasks() - console.info('Got tasks:', tasks) - - const someId = tasks.map((task) => task.id).find((id) => id) - if (!someId) { - console.info('No tasks found') - } else { - const task = await getTask({ id: someId }) - console.info(`Got task with id ${someId}`, task) - } - - const date = await getDate() - console.info('Got date:', date) - - const anything = await getAnythingAuth() - console.info('Got anything:', anything) -} - export default Todo diff --git a/waspc/examples/todoApp/src/auth/hooks.ts b/waspc/examples/todoApp/src/auth/hooks.ts index 8e4e6612a2..736195cab9 100644 --- a/waspc/examples/todoApp/src/auth/hooks.ts +++ b/waspc/examples/todoApp/src/auth/hooks.ts @@ -1,70 +1,37 @@ -import { Request } from 'express' +import { HttpError } from 'wasp/server' import type { OnAfterSignupHook, - OnBeforeOAuthRedirectHook, OnBeforeSignupHook, OnBeforeLoginHook, OnAfterLoginHook, } from 'wasp/server/auth' -export const onBeforeSignup: OnBeforeSignupHook = async (args) => { - const log = createLoggerForHook('onBeforeSignup') - const count = await args.prisma.user.count() - log('number of users before', count) - log('providerId object', args.providerId) -} - -const oAuthQueryStore = new Map() - -export const onAfterSignup: OnAfterSignupHook = async (args) => { - const log = createLoggerForHook('onAfterSignup') - const count = await args.prisma.user.count() - log('number of users after', count) - log('user object', args.user) - log('providerId object', args.providerId) - - // If this is a OAuth signup, we have access token and uniqueRequestId - if (args.oauth) { - log('accessToken', args.oauth.tokens.accessToken) - log('uniqueRequestId', args.oauth.uniqueRequestId) - const id = args.oauth.uniqueRequestId - const query = oAuthQueryStore.get(id) - if (query) { - log('saved query params after oAuth redirect', query) - } - oAuthQueryStore.delete(id) +export const onBeforeSignup: OnBeforeSignupHook = async ({ providerId }) => { + if (providerId.providerUserId === 'notallowed@email.com') { + throw new HttpError(403, 'On Before Signup Hook disallows this email.') } } -export const onBeforeOAuthRedirect: OnBeforeOAuthRedirectHook = async ( - args -) => { - const log = createLoggerForHook('onBeforeOAuthRedirect') - log('query params before oAuth redirect', args.req.query) - - // Saving query params for later use in onAfterSignup hook - const id = args.oauth.uniqueRequestId - oAuthQueryStore.set(id, args.req.query) - - return { url: args.url } -} - -export const onBeforeLogin: OnBeforeLoginHook = async (args) => { - const log = createLoggerForHook('onBeforeLogin') - log('providerId object', args.providerId) +export const onAfterSignup: OnAfterSignupHook = async ({ prisma, user }) => { + await prisma.user.update({ + where: { id: user.id }, + data: { + isOnAfterSignupHookCalled: true, + }, + }) } -export const onAfterLogin: OnAfterLoginHook = async (args) => { - const log = createLoggerForHook('onAfterLogin') - log('providerId object', args.providerId) - log('user object', args.user) - if (args.oauth && args.oauth.providerName === 'google') { - log('accessToken', args.oauth.tokens.accessToken) +export const onBeforeLogin: OnBeforeLoginHook = async ({ providerId }) => { + if (providerId.providerUserId === 'cantlogin@email.com') { + throw new HttpError(403, 'On Before Login Hook disallows this email.') } } -function createLoggerForHook(hookName: string) { - return (...args: unknown[]) => { - console.log(`[${hookName}]`, ...args) - } +export const onAfterLogin: OnAfterLoginHook = async ({ prisma, user }) => { + await prisma.user.update({ + where: { id: user.id }, + data: { + isOnAfterLoginHookCalled: true, + }, + }) } diff --git a/waspc/headless-test/examples/todoApp/src/server/crud.ts b/waspc/examples/todoApp/src/crud.ts similarity index 100% rename from waspc/headless-test/examples/todoApp/src/server/crud.ts rename to waspc/examples/todoApp/src/crud.ts diff --git a/waspc/headless-test/examples/todoApp/src/client/pages/CrudTest.tsx b/waspc/examples/todoApp/src/pages/CrudTest.tsx similarity index 100% rename from waspc/headless-test/examples/todoApp/src/client/pages/CrudTest.tsx rename to waspc/examples/todoApp/src/pages/CrudTest.tsx diff --git a/waspc/examples/todoApp/src/pages/ProfilePage.tsx b/waspc/examples/todoApp/src/pages/ProfilePage.tsx index 253530b41d..837950f819 100644 --- a/waspc/examples/todoApp/src/pages/ProfilePage.tsx +++ b/waspc/examples/todoApp/src/pages/ProfilePage.tsx @@ -7,7 +7,6 @@ import { import { Link, routes } from 'wasp/client/router' import { api } from 'wasp/client/api' import React, { useEffect, useRef, useState } from 'react' -import { getName } from '../user' async function fetchCustomRoute() { const res = await api.get('/foo/bar') @@ -26,7 +25,7 @@ export const ProfilePage = ({ user }: { user: AuthUser }) => { }, []) useSocketListener('chatMessage', (msg) => - setMessages((priorMessages) => [msg, ...priorMessages]), + setMessages((priorMessages) => [msg, ...priorMessages]) ) function handleSubmit(e: React.FormEvent) { @@ -49,12 +48,20 @@ export const ProfilePage = ({ user }: { user: AuthUser }) => { <>

User Auth Fields Demo

- Hello {getName(user)}! Your status is{' '} + Hello {user.getFirstProviderUserId()}! Your status is{' '} {user.identities.email?.isEmailVerified ? 'verfied' : 'unverified'} .
+
+ Value of user.isOnAfterSignupHookCalled is{' '} + {user.isOnAfterSignupHookCalled ? 'true' : 'false'}. +
+
+ Value of user.isOnAfterLoginHookCalled is{' '} + {user.isOnAfterLoginHookCalled ? 'true' : 'false'}. +
First provider ID: {user.getFirstProviderUserId()}
diff --git a/waspc/examples/todoApp/src/queries.ts b/waspc/examples/todoApp/src/queries.ts index e61ef51601..92085504d4 100644 --- a/waspc/examples/todoApp/src/queries.ts +++ b/waspc/examples/todoApp/src/queries.ts @@ -2,7 +2,7 @@ import { type Task } from 'wasp/entities' import { HttpError } from 'wasp/server' import type { GetNumTasks, GetTask, GetTasks } from 'wasp/server/operations' -export const getTasks: GetTasks = async (_args, context) => { +export const getTasks = (async (_args, context) => { if (!context.user) { throw new HttpError(401) } @@ -13,9 +13,25 @@ export const getTasks: GetTasks = async (_args, context) => { const tasks = await Task.findMany({ where: { user: { id: context.user.id } }, orderBy: { id: 'asc' }, + include: { + user: { + include: { + auth: { + include: { + identities: { + select: { + providerName: true, + providerUserId: true, + }, + }, + }, + }, + }, + }, + }, }) return tasks -} +}) satisfies GetTasks export const getNumTasks: GetNumTasks = async ( _args, diff --git a/waspc/headless-test/.gitignore b/waspc/headless-test/.gitignore deleted file mode 100644 index 75e854d8dc..0000000000 --- a/waspc/headless-test/.gitignore +++ /dev/null @@ -1,4 +0,0 @@ -node_modules/ -/test-results/ -/playwright-report/ -/playwright/.cache/ diff --git a/waspc/headless-test/README.md b/waspc/headless-test/README.md deleted file mode 100644 index 6827e4aa26..0000000000 --- a/waspc/headless-test/README.md +++ /dev/null @@ -1,26 +0,0 @@ -## Headless Test - -We are testing if a simple scenario works for the user each time: -- signup -- login -- create a new task - -Check out the test file: `tests/simple.spec.ts` - -### How to run - -Running headless tests: -``` -$ cd headless-test -$ npm install -$ npx playwright test -``` - -If something breaks, maybe the example app won't run. Try running it and see if there are any errors: -``` -npm run example-app:start -``` - -### How to run in CI - -We set up a GitHub Action to run the test in CI. See `.github/workflows/ci.yml` for details. diff --git a/waspc/headless-test/examples/todoApp/.env.server.example b/waspc/headless-test/examples/todoApp/.env.server.example deleted file mode 100644 index d0918e891b..0000000000 --- a/waspc/headless-test/examples/todoApp/.env.server.example +++ /dev/null @@ -1,7 +0,0 @@ -GOOGLE_CLIENT_ID="mock-client-id" -GOOGLE_CLIENT_SECRET="mock-client-secret" -SKIP_EMAIL_VERIFICATION_IN_DEV=true -SMTP_HOST=dummy -SMTP_PORT=465 -SMTP_USERNAME=dummy -SMTP_PASSWORD=dummy diff --git a/waspc/headless-test/examples/todoApp/.gitignore b/waspc/headless-test/examples/todoApp/.gitignore deleted file mode 100644 index fd453426d8..0000000000 --- a/waspc/headless-test/examples/todoApp/.gitignore +++ /dev/null @@ -1,11 +0,0 @@ -.wasp/ -node_modules/ - -# Ignore all dotenv files by default to prevent accidentally committing any secrets. -# To include specific dotenv files, use the `!` operator or adjust these rules. -.env -.env.* - -# Don't ignore example dotenv files. -!.env.example -!.env.*.example diff --git a/waspc/headless-test/examples/todoApp/.wasproot b/waspc/headless-test/examples/todoApp/.wasproot deleted file mode 100644 index ca2cfdb482..0000000000 --- a/waspc/headless-test/examples/todoApp/.wasproot +++ /dev/null @@ -1 +0,0 @@ -File marking the root of Wasp project. diff --git a/waspc/headless-test/examples/todoApp/Dockerfile b/waspc/headless-test/examples/todoApp/Dockerfile deleted file mode 100644 index 33e99cfdfd..0000000000 --- a/waspc/headless-test/examples/todoApp/Dockerfile +++ /dev/null @@ -1 +0,0 @@ -## HELLO! diff --git a/waspc/headless-test/examples/todoApp/migrations/20231213154621_initial/migration.sql b/waspc/headless-test/examples/todoApp/migrations/20231213154621_initial/migration.sql deleted file mode 100644 index 3e2a39f748..0000000000 --- a/waspc/headless-test/examples/todoApp/migrations/20231213154621_initial/migration.sql +++ /dev/null @@ -1,46 +0,0 @@ --- CreateTable -CREATE TABLE "User" ( - "id" SERIAL NOT NULL, - - CONSTRAINT "User_pkey" PRIMARY KEY ("id") -); - --- CreateTable -CREATE TABLE "Task" ( - "id" SERIAL NOT NULL, - "description" TEXT NOT NULL, - "isDone" BOOLEAN NOT NULL DEFAULT false, - "userId" INTEGER NOT NULL, - - CONSTRAINT "Task_pkey" PRIMARY KEY ("id") -); - --- CreateTable -CREATE TABLE "Auth" ( - "id" TEXT NOT NULL, - "userId" INTEGER, - - CONSTRAINT "Auth_pkey" PRIMARY KEY ("id") -); - --- CreateTable -CREATE TABLE "AuthIdentity" ( - "providerName" TEXT NOT NULL, - "providerUserId" TEXT NOT NULL, - "providerData" TEXT NOT NULL DEFAULT '{}', - "authId" TEXT NOT NULL, - - CONSTRAINT "AuthIdentity_pkey" PRIMARY KEY ("providerName","providerUserId") -); - --- CreateIndex -CREATE UNIQUE INDEX "Auth_userId_key" ON "Auth"("userId"); - --- AddForeignKey -ALTER TABLE "Task" ADD CONSTRAINT "Task_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE RESTRICT ON UPDATE CASCADE; - --- AddForeignKey -ALTER TABLE "Auth" ADD CONSTRAINT "Auth_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE CASCADE ON UPDATE CASCADE; - --- AddForeignKey -ALTER TABLE "AuthIdentity" ADD CONSTRAINT "AuthIdentity_authId_fkey" FOREIGN KEY ("authId") REFERENCES "Auth"("id") ON DELETE CASCADE ON UPDATE CASCADE; diff --git a/waspc/headless-test/examples/todoApp/migrations/20240115130723_add_session/migration.sql b/waspc/headless-test/examples/todoApp/migrations/20240115130723_add_session/migration.sql deleted file mode 100644 index 47f98ace24..0000000000 --- a/waspc/headless-test/examples/todoApp/migrations/20240115130723_add_session/migration.sql +++ /dev/null @@ -1,17 +0,0 @@ --- CreateTable -CREATE TABLE "Session" ( - "id" TEXT NOT NULL, - "expiresAt" TIMESTAMP(3) NOT NULL, - "userId" TEXT NOT NULL, - - CONSTRAINT "Session_pkey" PRIMARY KEY ("id") -); - --- CreateIndex -CREATE UNIQUE INDEX "Session_id_key" ON "Session"("id"); - --- CreateIndex -CREATE INDEX "Session_userId_idx" ON "Session"("userId"); - --- AddForeignKey -ALTER TABLE "Session" ADD CONSTRAINT "Session_userId_fkey" FOREIGN KEY ("userId") REFERENCES "Auth"("id") ON DELETE CASCADE ON UPDATE CASCADE; diff --git a/waspc/headless-test/examples/todoApp/migrations/20240508125445_add_headless_test_property/migration.sql b/waspc/headless-test/examples/todoApp/migrations/20240508125445_add_headless_test_property/migration.sql deleted file mode 100644 index 5c83e174db..0000000000 --- a/waspc/headless-test/examples/todoApp/migrations/20240508125445_add_headless_test_property/migration.sql +++ /dev/null @@ -1,2 +0,0 @@ --- AlterTable -ALTER TABLE "User" ADD COLUMN "isOnAfterSignupHookCalled" BOOLEAN NOT NULL DEFAULT false; diff --git a/waspc/headless-test/examples/todoApp/migrations/20240731113303_add_login_hook_user_property/migration.sql b/waspc/headless-test/examples/todoApp/migrations/20240731113303_add_login_hook_user_property/migration.sql deleted file mode 100644 index 9c4641d915..0000000000 --- a/waspc/headless-test/examples/todoApp/migrations/20240731113303_add_login_hook_user_property/migration.sql +++ /dev/null @@ -1,2 +0,0 @@ --- AlterTable -ALTER TABLE "User" ADD COLUMN "isOnAfterLoginHookCalled" BOOLEAN NOT NULL DEFAULT false; diff --git a/waspc/headless-test/examples/todoApp/migrations/migration_lock.toml b/waspc/headless-test/examples/todoApp/migrations/migration_lock.toml deleted file mode 100644 index fbffa92c2b..0000000000 --- a/waspc/headless-test/examples/todoApp/migrations/migration_lock.toml +++ /dev/null @@ -1,3 +0,0 @@ -# Please do not edit this file manually -# It should be added in your version-control system (i.e. Git) -provider = "postgresql" \ No newline at end of file diff --git a/waspc/headless-test/examples/todoApp/package-lock.json b/waspc/headless-test/examples/todoApp/package-lock.json deleted file mode 100644 index ed9d984f8d..0000000000 --- a/waspc/headless-test/examples/todoApp/package-lock.json +++ /dev/null @@ -1,9015 +0,0 @@ -{ - "name": "todo-app", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "name": "todo-app", - "dependencies": { - "@tailwindcss/forms": "^0.5.3", - "@tailwindcss/typography": "^0.5.7", - "react": "^18.2.0", - "react-dom": "^18.2.0", - "react-router-dom": "^6.26.2", - "wasp": "file:.wasp/out/sdk/wasp" - }, - "devDependencies": { - "@types/cors": "^2.8.5", - "@types/express": "^4.17.13", - "@types/react": "^18.0.37", - "prisma": "5.19.1", - "typescript": "^5.1.0", - "vite": "^4.3.9" - } - }, - ".wasp/out/sdk/wasp": { - "version": "1.0.0", - "license": "ISC", - "dependencies": { - "@lucia-auth/adapter-prisma": "^4.0.0", - "@node-rs/argon2": "^1.8.3", - "@prisma/client": "5.19.1", - "@stitches/react": "^1.2.8", - "@tanstack/react-query": "^4.29.0", - "@testing-library/jest-dom": "^6.3.0", - "@testing-library/react": "^14.1.2", - "@vitest/ui": "^1.2.1", - "arctic": "^1.2.1", - "autoprefixer": "^10.4.13", - "axios": "^1.4.0", - "express": "~4.21.0", - "jsdom": "^21.1.1", - "lucia": "^3.0.1", - "mitt": "3.0.0", - "msw": "^1.1.0", - "nodemailer": "^6.9.1", - "oslo": "^1.1.2", - "pg-boss": "^8.4.2", - "postcss": "^8.4.21", - "prisma": "5.19.1", - "react": "^18.2.0", - "react-hook-form": "^7.45.4", - "react-router-dom": "^6.26.2", - "superjson": "^2.2.1", - "tailwindcss": "^3.2.7", - "vitest": "^1.2.1", - "zod": "^3.23.8" - }, - "devDependencies": { - "@tsconfig/node18": "latest", - "@types/express-serve-static-core": "^4.17.13" - } - }, - "node_modules/@adobe/css-tools": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/@adobe/css-tools/-/css-tools-4.4.1.tgz", - "integrity": "sha512-12WGKBQzjUAI4ayyF4IAtfw2QR/IDoqk6jTddXDhtYTJF9ASmoE1zst7cVtP0aL/F1jUJL5r+JxKXKEgHNbEUQ==" - }, - "node_modules/@alloc/quick-lru": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz", - "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@babel/code-frame": { - "version": "7.26.2", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.26.2.tgz", - "integrity": "sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==", - "dependencies": { - "@babel/helper-validator-identifier": "^7.25.9", - "js-tokens": "^4.0.0", - "picocolors": "^1.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-identifier": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz", - "integrity": "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/runtime": { - "version": "7.26.0", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.26.0.tgz", - "integrity": "sha512-FDSOghenHTiToteC/QRlv2q3DhPZ/oOXTBoirfWNx1Cx3TMVcGWQtMMmQcSvb/JjpNeGzx8Pq/b4fKEJuWm1sw==", - "dependencies": { - "regenerator-runtime": "^0.14.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@emnapi/core": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.3.1.tgz", - "integrity": "sha512-pVGjBIt1Y6gg3EJN8jTcfpP/+uuRksIo055oE/OBkDNcjZqVbfkWCksG1Jp4yZnj3iKWyWX8fdG/j6UDYPbFog==", - "optional": true, - "dependencies": { - "@emnapi/wasi-threads": "1.0.1", - "tslib": "^2.4.0" - } - }, - "node_modules/@emnapi/runtime": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.3.1.tgz", - "integrity": "sha512-kEBmG8KyqtxJZv+ygbEim+KCGtIq1fC22Ms3S4ziXmYKm8uyoLX0MHONVKwp+9opg390VaKRNt4a7A9NwmpNhw==", - "optional": true, - "dependencies": { - "tslib": "^2.4.0" - } - }, - "node_modules/@emnapi/wasi-threads": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.0.1.tgz", - "integrity": "sha512-iIBu7mwkq4UQGeMEM8bLwNK962nXdhodeScX4slfQnRhEMMzvYivHhutCIk8uojvmASXXPC2WNEjwxFWk72Oqw==", - "optional": true, - "dependencies": { - "tslib": "^2.4.0" - } - }, - "node_modules/@esbuild/aix-ppc64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz", - "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==", - "cpu": [ - "ppc64" - ], - "optional": true, - "os": [ - "aix" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/android-arm": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.18.20.tgz", - "integrity": "sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/android-arm64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.18.20.tgz", - "integrity": "sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/android-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.18.20.tgz", - "integrity": "sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/darwin-arm64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.18.20.tgz", - "integrity": "sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/darwin-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.18.20.tgz", - "integrity": "sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/freebsd-arm64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.18.20.tgz", - "integrity": "sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/freebsd-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.18.20.tgz", - "integrity": "sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-arm": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.18.20.tgz", - "integrity": "sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-arm64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.18.20.tgz", - "integrity": "sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-ia32": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.18.20.tgz", - "integrity": "sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-loong64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.18.20.tgz", - "integrity": "sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==", - "cpu": [ - "loong64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-mips64el": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.18.20.tgz", - "integrity": "sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==", - "cpu": [ - "mips64el" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-ppc64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.18.20.tgz", - "integrity": "sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==", - "cpu": [ - "ppc64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-riscv64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.18.20.tgz", - "integrity": "sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==", - "cpu": [ - "riscv64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-s390x": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.18.20.tgz", - "integrity": "sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==", - "cpu": [ - "s390x" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.18.20.tgz", - "integrity": "sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/netbsd-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.18.20.tgz", - "integrity": "sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/openbsd-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.18.20.tgz", - "integrity": "sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/sunos-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.18.20.tgz", - "integrity": "sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/win32-arm64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.18.20.tgz", - "integrity": "sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/win32-ia32": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.18.20.tgz", - "integrity": "sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/win32-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.18.20.tgz", - "integrity": "sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@isaacs/cliui": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", - "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", - "dependencies": { - "string-width": "^5.1.2", - "string-width-cjs": "npm:string-width@^4.2.0", - "strip-ansi": "^7.0.1", - "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", - "wrap-ansi": "^8.1.0", - "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@jest/schemas": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", - "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", - "dependencies": { - "@sinclair/typebox": "^0.27.8" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.8", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.8.tgz", - "integrity": "sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==", - "dependencies": { - "@jridgewell/set-array": "^1.2.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.24" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", - "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/set-array": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", - "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", - "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==" - }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.25", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", - "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", - "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" - } - }, - "node_modules/@lucia-auth/adapter-prisma": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@lucia-auth/adapter-prisma/-/adapter-prisma-4.0.1.tgz", - "integrity": "sha512-3SztRhj1RAHbbhI/0aB7YC5zl6Z6aktPhkWpn2CHhiB03B9x/+A+M6pqJuAt1usU8PzkjVilgRPhrPymMar66A==", - "peerDependencies": { - "@prisma/client": "^4.2.0 || ^5.0.0", - "lucia": "3.x" - } - }, - "node_modules/@mswjs/cookies": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/@mswjs/cookies/-/cookies-0.2.2.tgz", - "integrity": "sha512-mlN83YSrcFgk7Dm1Mys40DLssI1KdJji2CMKN8eOlBqsTADYzj2+jWzsANsUTFbxDMWPD5e9bfA1RGqBpS3O1g==", - "dependencies": { - "@types/set-cookie-parser": "^2.4.0", - "set-cookie-parser": "^2.4.6" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/@mswjs/interceptors": { - "version": "0.17.10", - "resolved": "https://registry.npmjs.org/@mswjs/interceptors/-/interceptors-0.17.10.tgz", - "integrity": "sha512-N8x7eSLGcmUFNWZRxT1vsHvypzIRgQYdG0rJey/rZCy6zT/30qDt8Joj7FxzGNLSwXbeZqJOMqDurp7ra4hgbw==", - "dependencies": { - "@open-draft/until": "^1.0.3", - "@types/debug": "^4.1.7", - "@xmldom/xmldom": "^0.8.3", - "debug": "^4.3.3", - "headers-polyfill": "3.2.5", - "outvariant": "^1.2.1", - "strict-event-emitter": "^0.2.4", - "web-encoding": "^1.1.5" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/@mswjs/interceptors/node_modules/debug": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", - "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", - "dependencies": { - "ms": "^2.1.3" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/@mswjs/interceptors/node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" - }, - "node_modules/@mswjs/interceptors/node_modules/strict-event-emitter": { - "version": "0.2.8", - "resolved": "https://registry.npmjs.org/strict-event-emitter/-/strict-event-emitter-0.2.8.tgz", - "integrity": "sha512-KDf/ujU8Zud3YaLtMCcTI4xkZlZVIYxTLr+XIULexP+77EEVWixeXroLUXQXiVtH4XH2W7jr/3PT1v3zBuvc3A==", - "dependencies": { - "events": "^3.3.0" - } - }, - "node_modules/@napi-rs/wasm-runtime": { - "version": "0.2.6", - "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-0.2.6.tgz", - "integrity": "sha512-z8YVS3XszxFTO73iwvFDNpQIzdMmSDTP/mB3E/ucR37V3Sx57hSExcXyMoNwaucWxnsWf4xfbZv0iZ30jr0M4Q==", - "optional": true, - "dependencies": { - "@emnapi/core": "^1.3.1", - "@emnapi/runtime": "^1.3.1", - "@tybys/wasm-util": "^0.9.0" - } - }, - "node_modules/@node-rs/argon2": { - "version": "1.8.3", - "resolved": "https://registry.npmjs.org/@node-rs/argon2/-/argon2-1.8.3.tgz", - "integrity": "sha512-sf/QAEI59hsMEEE2J8vO4hKrXrv4Oplte3KI2N4MhMDYpytH0drkVfErmHBfWFZxxIEK03fX1WsBNswS2nIZKg==", - "engines": { - "node": ">= 10" - }, - "optionalDependencies": { - "@node-rs/argon2-android-arm-eabi": "1.8.3", - "@node-rs/argon2-android-arm64": "1.8.3", - "@node-rs/argon2-darwin-arm64": "1.8.3", - "@node-rs/argon2-darwin-x64": "1.8.3", - "@node-rs/argon2-freebsd-x64": "1.8.3", - "@node-rs/argon2-linux-arm-gnueabihf": "1.8.3", - "@node-rs/argon2-linux-arm64-gnu": "1.8.3", - "@node-rs/argon2-linux-arm64-musl": "1.8.3", - "@node-rs/argon2-linux-x64-gnu": "1.8.3", - "@node-rs/argon2-linux-x64-musl": "1.8.3", - "@node-rs/argon2-wasm32-wasi": "1.8.3", - "@node-rs/argon2-win32-arm64-msvc": "1.8.3", - "@node-rs/argon2-win32-ia32-msvc": "1.8.3", - "@node-rs/argon2-win32-x64-msvc": "1.8.3" - } - }, - "node_modules/@node-rs/argon2-android-arm-eabi": { - "version": "1.8.3", - "resolved": "https://registry.npmjs.org/@node-rs/argon2-android-arm-eabi/-/argon2-android-arm-eabi-1.8.3.tgz", - "integrity": "sha512-JFZPlNM0A8Og+Tncb8UZsQrhEMlbHBXPsT3hRoKImzVmTmq28Os0ucFWow0AACp2coLHBSydXH3Dh0lZup3rWw==", - "cpu": [ - "arm" - ], - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@node-rs/argon2-android-arm64": { - "version": "1.8.3", - "resolved": "https://registry.npmjs.org/@node-rs/argon2-android-arm64/-/argon2-android-arm64-1.8.3.tgz", - "integrity": "sha512-zaf8P3T92caeW2xnMA7P1QvRA4pIt/04oilYP44XlTCtMye//vwXDMeK53sl7dvYiJKnzAWDRx41k8vZvpZazg==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@node-rs/argon2-darwin-arm64": { - "version": "1.8.3", - "resolved": "https://registry.npmjs.org/@node-rs/argon2-darwin-arm64/-/argon2-darwin-arm64-1.8.3.tgz", - "integrity": "sha512-DV/IbmLGdNXBtXb5o2UI5ba6kvqXqPAJgmMOTUCuHeBSp992GlLHdfU4rzGu0dNrxudBnunNZv+crd0YdEQSUA==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@node-rs/argon2-darwin-x64": { - "version": "1.8.3", - "resolved": "https://registry.npmjs.org/@node-rs/argon2-darwin-x64/-/argon2-darwin-x64-1.8.3.tgz", - "integrity": "sha512-YMjmBGFZhLfYjfQ2gll9A+BZu/zAMV7lWZIbKxb7ZgEofILQwuGmExjDtY3Jplido/6leCEdpmlk2oIsME00LA==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@node-rs/argon2-freebsd-x64": { - "version": "1.8.3", - "resolved": "https://registry.npmjs.org/@node-rs/argon2-freebsd-x64/-/argon2-freebsd-x64-1.8.3.tgz", - "integrity": "sha512-Hq3Rj5Yb2RolTG/luRPnv+XiGCbi5nAK25Pc8ou/tVapwX+iktEm/NXbxc5zsMxraYVkCvfdwBjweC5O+KqCGw==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@node-rs/argon2-linux-arm-gnueabihf": { - "version": "1.8.3", - "resolved": "https://registry.npmjs.org/@node-rs/argon2-linux-arm-gnueabihf/-/argon2-linux-arm-gnueabihf-1.8.3.tgz", - "integrity": "sha512-x49l8RgzKoG0/V0IXa5rrEl1TcJEc936ctlYFvqcunSOyowZ6kiWtrp1qrbOR8gbaNILl11KTF52vF6+h8UlEQ==", - "cpu": [ - "arm" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@node-rs/argon2-linux-arm64-gnu": { - "version": "1.8.3", - "resolved": "https://registry.npmjs.org/@node-rs/argon2-linux-arm64-gnu/-/argon2-linux-arm64-gnu-1.8.3.tgz", - "integrity": "sha512-gJesam/qA63reGkb9qJ2TjFSLBtY41zQh2oei7nfnYsmVQPuHHWItJxEa1Bm21SPW53gZex4jFJbDIgj0+PxIw==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@node-rs/argon2-linux-arm64-musl": { - "version": "1.8.3", - "resolved": "https://registry.npmjs.org/@node-rs/argon2-linux-arm64-musl/-/argon2-linux-arm64-musl-1.8.3.tgz", - "integrity": "sha512-7O6kQdSKzB4Tjx/EBa8zKIxnmLkQE8VdJgPm6Ksrpn+ueo0mx2xf76fIDnbbTCtm3UbB+y+FkTo2wLA7tOqIKg==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@node-rs/argon2-linux-x64-gnu": { - "version": "1.8.3", - "resolved": "https://registry.npmjs.org/@node-rs/argon2-linux-x64-gnu/-/argon2-linux-x64-gnu-1.8.3.tgz", - "integrity": "sha512-OBH+EFG7BGjFyldaao2H2gSCLmjtrrwf420B1L+lFn7JLW9UAjsIPFKAcWsYwPa/PwYzIge9Y7SGcpqlsSEX0w==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@node-rs/argon2-linux-x64-musl": { - "version": "1.8.3", - "resolved": "https://registry.npmjs.org/@node-rs/argon2-linux-x64-musl/-/argon2-linux-x64-musl-1.8.3.tgz", - "integrity": "sha512-bDbMuyekIxZaN7NaX+gHVkOyABB8bcMEJYeRPW1vCXKHj3brJns1wiUFSxqeUXreupifNVJlQfPt1Y5B/vFXgQ==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@node-rs/argon2-wasm32-wasi": { - "version": "1.8.3", - "resolved": "https://registry.npmjs.org/@node-rs/argon2-wasm32-wasi/-/argon2-wasm32-wasi-1.8.3.tgz", - "integrity": "sha512-NBf2cMCDbNKMzp13Pog8ZPmI0M9U4Ak5b95EUjkp17kdKZFds12dwW67EMnj7Zy+pRqby2QLECaWebDYfNENTg==", - "cpu": [ - "wasm32" - ], - "optional": true, - "dependencies": { - "@napi-rs/wasm-runtime": "^0.2.3" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@node-rs/argon2-win32-arm64-msvc": { - "version": "1.8.3", - "resolved": "https://registry.npmjs.org/@node-rs/argon2-win32-arm64-msvc/-/argon2-win32-arm64-msvc-1.8.3.tgz", - "integrity": "sha512-AHpPo7UbdW5WWjwreVpgFSY0o1RY4A7cUFaqDXZB2OqEuyrhMxBdZct9PX7PQKI18D85pLsODnR+gvVuTwJ6rQ==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@node-rs/argon2-win32-ia32-msvc": { - "version": "1.8.3", - "resolved": "https://registry.npmjs.org/@node-rs/argon2-win32-ia32-msvc/-/argon2-win32-ia32-msvc-1.8.3.tgz", - "integrity": "sha512-bqzn2rcQkEwCINefhm69ttBVVkgHJb/V03DdBKsPFtiX6H47axXKz62d1imi26zFXhOEYxhKbu3js03GobJOLw==", - "cpu": [ - "ia32" - ], - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@node-rs/argon2-win32-x64-msvc": { - "version": "1.8.3", - "resolved": "https://registry.npmjs.org/@node-rs/argon2-win32-x64-msvc/-/argon2-win32-x64-msvc-1.8.3.tgz", - "integrity": "sha512-ILlrRThdbp5xNR5gwYM2ic1n/vG5rJ8dQZ+YMRqksl+lnTJ/6FDe5BOyIhiPtiDwlCiCtUA+1NxpDB9KlUCAIA==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@node-rs/bcrypt": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@node-rs/bcrypt/-/bcrypt-1.9.0.tgz", - "integrity": "sha512-u2OlIxW264bFUfvbFqDz9HZKFjwe8FHFtn7T/U8mYjPZ7DWYpbUB+/dkW/QgYfMSfR0ejkyuWaBBe0coW7/7ig==", - "engines": { - "node": ">= 10" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/Brooooooklyn" - }, - "optionalDependencies": { - "@node-rs/bcrypt-android-arm-eabi": "1.9.0", - "@node-rs/bcrypt-android-arm64": "1.9.0", - "@node-rs/bcrypt-darwin-arm64": "1.9.0", - "@node-rs/bcrypt-darwin-x64": "1.9.0", - "@node-rs/bcrypt-freebsd-x64": "1.9.0", - "@node-rs/bcrypt-linux-arm-gnueabihf": "1.9.0", - "@node-rs/bcrypt-linux-arm64-gnu": "1.9.0", - "@node-rs/bcrypt-linux-arm64-musl": "1.9.0", - "@node-rs/bcrypt-linux-x64-gnu": "1.9.0", - "@node-rs/bcrypt-linux-x64-musl": "1.9.0", - "@node-rs/bcrypt-wasm32-wasi": "1.9.0", - "@node-rs/bcrypt-win32-arm64-msvc": "1.9.0", - "@node-rs/bcrypt-win32-ia32-msvc": "1.9.0", - "@node-rs/bcrypt-win32-x64-msvc": "1.9.0" - } - }, - "node_modules/@node-rs/bcrypt-android-arm-eabi": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@node-rs/bcrypt-android-arm-eabi/-/bcrypt-android-arm-eabi-1.9.0.tgz", - "integrity": "sha512-nOCFISGtnodGHNiLrG0WYLWr81qQzZKYfmwHc7muUeq+KY0sQXyHOwZk9OuNQAWv/lnntmtbwkwT0QNEmOyLvA==", - "cpu": [ - "arm" - ], - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@node-rs/bcrypt-android-arm64": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@node-rs/bcrypt-android-arm64/-/bcrypt-android-arm64-1.9.0.tgz", - "integrity": "sha512-+ZrIAtigVmjYkqZQTThHVlz0+TG6D+GDHWhVKvR2DifjtqJ0i+mb9gjo++hN+fWEQdWNGxKCiBBjwgT4EcXd6A==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@node-rs/bcrypt-darwin-arm64": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@node-rs/bcrypt-darwin-arm64/-/bcrypt-darwin-arm64-1.9.0.tgz", - "integrity": "sha512-CQiS+F9Pa0XozvkXR1g7uXE9QvBOPOplDg0iCCPRYTN9PqA5qYxhwe48G3o+v2UeQceNRrbnEtWuANm7JRqIhw==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@node-rs/bcrypt-darwin-x64": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@node-rs/bcrypt-darwin-x64/-/bcrypt-darwin-x64-1.9.0.tgz", - "integrity": "sha512-4pTKGawYd7sNEjdJ7R/R67uwQH1VvwPZ0SSUMmeNHbxD5QlwAPXdDH11q22uzVXsvNFZ6nGQBg8No5OUGpx6Ug==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@node-rs/bcrypt-freebsd-x64": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@node-rs/bcrypt-freebsd-x64/-/bcrypt-freebsd-x64-1.9.0.tgz", - "integrity": "sha512-UmWzySX4BJhT/B8xmTru6iFif3h0Rpx3TqxRLCcbgmH43r7k5/9QuhpiyzpvKGpKHJCFNm4F3rC2wghvw5FCIg==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@node-rs/bcrypt-linux-arm-gnueabihf": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@node-rs/bcrypt-linux-arm-gnueabihf/-/bcrypt-linux-arm-gnueabihf-1.9.0.tgz", - "integrity": "sha512-8qoX4PgBND2cVwsbajoAWo3NwdfJPEXgpCsZQZURz42oMjbGyhhSYbovBCskGU3EBLoC8RA2B1jFWooeYVn5BA==", - "cpu": [ - "arm" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@node-rs/bcrypt-linux-arm64-gnu": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@node-rs/bcrypt-linux-arm64-gnu/-/bcrypt-linux-arm64-gnu-1.9.0.tgz", - "integrity": "sha512-TuAC6kx0SbcIA4mSEWPi+OCcDjTQUMl213v5gMNlttF+D4ieIZx6pPDGTaMO6M2PDHTeCG0CBzZl0Lu+9b0c7Q==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@node-rs/bcrypt-linux-arm64-musl": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@node-rs/bcrypt-linux-arm64-musl/-/bcrypt-linux-arm64-musl-1.9.0.tgz", - "integrity": "sha512-/sIvKDABOI8QOEnLD7hIj02BVaNOuCIWBKvxcJOt8+TuwJ6zmY1UI5kSv9d99WbiHjTp97wtAUbZQwauU4b9ew==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@node-rs/bcrypt-linux-x64-gnu": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@node-rs/bcrypt-linux-x64-gnu/-/bcrypt-linux-x64-gnu-1.9.0.tgz", - "integrity": "sha512-DyyhDHDsLBsCKz1tZ1hLvUZSc1DK0FU0v52jK6IBQxrj24WscSU9zZe7ie/V9kdmA4Ep57BfpWX8Dsa2JxGdgQ==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@node-rs/bcrypt-linux-x64-musl": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@node-rs/bcrypt-linux-x64-musl/-/bcrypt-linux-x64-musl-1.9.0.tgz", - "integrity": "sha512-duIiuqQ+Lew8ASSAYm6ZRqcmfBGWwsi81XLUwz86a2HR7Qv6V4yc3ZAUQovAikhjCsIqe8C11JlAZSK6+PlXYg==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@node-rs/bcrypt-wasm32-wasi": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@node-rs/bcrypt-wasm32-wasi/-/bcrypt-wasm32-wasi-1.9.0.tgz", - "integrity": "sha512-ylaGmn9Wjwv/D5lxtawttx3H6Uu2WTTR7lWlRHGT6Ga/MB1Vj4OjSGUW8G8zIVnKuXpGbZ92pgHlt4HUpSLctw==", - "cpu": [ - "wasm32" - ], - "optional": true, - "dependencies": { - "@emnapi/core": "^0.45.0", - "@emnapi/runtime": "^0.45.0", - "@tybys/wasm-util": "^0.8.1", - "memfs-browser": "^3.4.13000" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@node-rs/bcrypt-wasm32-wasi/node_modules/@emnapi/core": { - "version": "0.45.0", - "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-0.45.0.tgz", - "integrity": "sha512-DPWjcUDQkCeEM4VnljEOEcXdAD7pp8zSZsgOujk/LGIwCXWbXJngin+MO4zbH429lzeC3WbYLGjE2MaUOwzpyw==", - "optional": true, - "dependencies": { - "tslib": "^2.4.0" - } - }, - "node_modules/@node-rs/bcrypt-wasm32-wasi/node_modules/@emnapi/runtime": { - "version": "0.45.0", - "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-0.45.0.tgz", - "integrity": "sha512-Txumi3td7J4A/xTTwlssKieHKTGl3j4A1tglBx72auZ49YK7ePY6XZricgIg9mnZT4xPfA+UPCUdnhRuEFDL+w==", - "optional": true, - "dependencies": { - "tslib": "^2.4.0" - } - }, - "node_modules/@node-rs/bcrypt-wasm32-wasi/node_modules/@tybys/wasm-util": { - "version": "0.8.3", - "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.8.3.tgz", - "integrity": "sha512-Z96T/L6dUFFxgFJ+pQtkPpne9q7i6kIPYCFnQBHSgSPV9idTsKfIhCss0h5iM9irweZCatkrdeP8yi5uM1eX6Q==", - "optional": true, - "dependencies": { - "tslib": "^2.4.0" - } - }, - "node_modules/@node-rs/bcrypt-win32-arm64-msvc": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@node-rs/bcrypt-win32-arm64-msvc/-/bcrypt-win32-arm64-msvc-1.9.0.tgz", - "integrity": "sha512-2h86gF7QFyEzODuDFml/Dp1MSJoZjxJ4yyT2Erf4NkwsiA5MqowUhUsorRwZhX6+2CtlGa7orbwi13AKMsYndw==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@node-rs/bcrypt-win32-ia32-msvc": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@node-rs/bcrypt-win32-ia32-msvc/-/bcrypt-win32-ia32-msvc-1.9.0.tgz", - "integrity": "sha512-kqxalCvhs4FkN0+gWWfa4Bdy2NQAkfiqq/CEf6mNXC13RSV673Ev9V8sRlQyNpCHCNkeXfOT9pgoBdJmMs9muA==", - "cpu": [ - "ia32" - ], - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@node-rs/bcrypt-win32-x64-msvc": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@node-rs/bcrypt-win32-x64-msvc/-/bcrypt-win32-x64-msvc-1.9.0.tgz", - "integrity": "sha512-2y0Tuo6ZAT2Cz8V7DHulSlv1Bip3zbzeXyeur+uR25IRNYXKvI/P99Zl85Fbuu/zzYAZRLLlGTRe6/9IHofe/w==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "dependencies": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@open-draft/until": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@open-draft/until/-/until-1.0.3.tgz", - "integrity": "sha512-Aq58f5HiWdyDlFffbbSjAlv596h/cOnt2DO1w3DOC7OJ5EHs0hd/nycJfiu9RJbT6Yk6F1knnRRXNSpxoIVZ9Q==" - }, - "node_modules/@oslojs/asn1": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@oslojs/asn1/-/asn1-1.0.0.tgz", - "integrity": "sha512-zw/wn0sj0j0QKbIXfIlnEcTviaCzYOY3V5rAyjR6YtOByFtJiT574+8p9Wlach0lZH9fddD4yb9laEAIl4vXQA==", - "dependencies": { - "@oslojs/binary": "1.0.0" - } - }, - "node_modules/@oslojs/binary": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@oslojs/binary/-/binary-1.0.0.tgz", - "integrity": "sha512-9RCU6OwXU6p67H4NODbuxv2S3eenuQ4/WFLrsq+K/k682xrznH5EVWA7N4VFk9VYVcbFtKqur5YQQZc0ySGhsQ==" - }, - "node_modules/@oslojs/crypto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@oslojs/crypto/-/crypto-1.0.1.tgz", - "integrity": "sha512-7n08G8nWjAr/Yu3vu9zzrd0L9XnrJfpMioQcvCMxBIiF5orECHe5/3J0jmXRVvgfqMm/+4oxlQ+Sq39COYLcNQ==", - "dependencies": { - "@oslojs/asn1": "1.0.0", - "@oslojs/binary": "1.0.0" - } - }, - "node_modules/@oslojs/encoding": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@oslojs/encoding/-/encoding-1.1.0.tgz", - "integrity": "sha512-70wQhgYmndg4GCPxPPxPGevRKqTIJ2Nh4OkiMWmDAVYsTQ+Ta7Sq+rPevXyXGdzr30/qZBnyOalCszoMxlyldQ==" - }, - "node_modules/@pkgjs/parseargs": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", - "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", - "optional": true, - "engines": { - "node": ">=14" - } - }, - "node_modules/@polka/url": { - "version": "1.0.0-next.28", - "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.28.tgz", - "integrity": "sha512-8LduaNlMZGwdZ6qWrKlfa+2M4gahzFkprZiAt2TF8uS0qQgBizKXpXURqvTJ4WtmupWxaLqjRb2UCTe72mu+Aw==" - }, - "node_modules/@prisma/client": { - "version": "5.19.1", - "resolved": "https://registry.npmjs.org/@prisma/client/-/client-5.19.1.tgz", - "integrity": "sha512-x30GFguInsgt+4z5I4WbkZP2CGpotJMUXy+Gl/aaUjHn2o1DnLYNTA+q9XdYmAQZM8fIIkvUiA2NpgosM3fneg==", - "hasInstallScript": true, - "engines": { - "node": ">=16.13" - }, - "peerDependencies": { - "prisma": "*" - }, - "peerDependenciesMeta": { - "prisma": { - "optional": true - } - } - }, - "node_modules/@prisma/debug": { - "version": "5.19.1", - "resolved": "https://registry.npmjs.org/@prisma/debug/-/debug-5.19.1.tgz", - "integrity": "sha512-lAG6A6QnG2AskAukIEucYJZxxcSqKsMK74ZFVfCTOM/7UiyJQi48v6TQ47d6qKG3LbMslqOvnTX25dj/qvclGg==" - }, - "node_modules/@prisma/engines": { - "version": "5.19.1", - "resolved": "https://registry.npmjs.org/@prisma/engines/-/engines-5.19.1.tgz", - "integrity": "sha512-kR/PoxZDrfUmbbXqqb8SlBBgCjvGaJYMCOe189PEYzq9rKqitQ2fvT/VJ8PDSe8tTNxhc2KzsCfCAL+Iwm/7Cg==", - "hasInstallScript": true, - "dependencies": { - "@prisma/debug": "5.19.1", - "@prisma/engines-version": "5.19.1-2.69d742ee20b815d88e17e54db4a2a7a3b30324e3", - "@prisma/fetch-engine": "5.19.1", - "@prisma/get-platform": "5.19.1" - } - }, - "node_modules/@prisma/engines-version": { - "version": "5.19.1-2.69d742ee20b815d88e17e54db4a2a7a3b30324e3", - "resolved": "https://registry.npmjs.org/@prisma/engines-version/-/engines-version-5.19.1-2.69d742ee20b815d88e17e54db4a2a7a3b30324e3.tgz", - "integrity": "sha512-xR6rt+z5LnNqTP5BBc+8+ySgf4WNMimOKXRn6xfNRDSpHvbOEmd7+qAOmzCrddEc4Cp8nFC0txU14dstjH7FXA==" - }, - "node_modules/@prisma/fetch-engine": { - "version": "5.19.1", - "resolved": "https://registry.npmjs.org/@prisma/fetch-engine/-/fetch-engine-5.19.1.tgz", - "integrity": "sha512-pCq74rtlOVJfn4pLmdJj+eI4P7w2dugOnnTXpRilP/6n5b2aZiA4ulJlE0ddCbTPkfHmOL9BfaRgA8o+1rfdHw==", - "dependencies": { - "@prisma/debug": "5.19.1", - "@prisma/engines-version": "5.19.1-2.69d742ee20b815d88e17e54db4a2a7a3b30324e3", - "@prisma/get-platform": "5.19.1" - } - }, - "node_modules/@prisma/get-platform": { - "version": "5.19.1", - "resolved": "https://registry.npmjs.org/@prisma/get-platform/-/get-platform-5.19.1.tgz", - "integrity": "sha512-sCeoJ+7yt0UjnR+AXZL7vXlg5eNxaFOwC23h0KvW1YIXUoa7+W2ZcAUhoEQBmJTW4GrFqCuZ8YSP0mkDa4k3Zg==", - "dependencies": { - "@prisma/debug": "5.19.1" - } - }, - "node_modules/@remix-run/router": { - "version": "1.21.0", - "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.21.0.tgz", - "integrity": "sha512-xfSkCAchbdG5PnbrKqFWwia4Bi61nH+wm8wLEqfHDyp7Y3dZzgqS2itV8i4gAq9pC2HsTpwyBC6Ds8VHZ96JlA==", - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.30.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.30.1.tgz", - "integrity": "sha512-pSWY+EVt3rJ9fQ3IqlrEUtXh3cGqGtPDH1FQlNZehO2yYxCHEX1SPsz1M//NXwYfbTlcKr9WObLnJX9FsS9K1Q==", - "cpu": [ - "arm" - ], - "optional": true, - "os": [ - "android" - ] - }, - "node_modules/@rollup/rollup-android-arm64": { - "version": "4.30.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.30.1.tgz", - "integrity": "sha512-/NA2qXxE3D/BRjOJM8wQblmArQq1YoBVJjrjoTSBS09jgUisq7bqxNHJ8kjCHeV21W/9WDGwJEWSN0KQ2mtD/w==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "android" - ] - }, - "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.30.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.30.1.tgz", - "integrity": "sha512-r7FQIXD7gB0WJ5mokTUgUWPl0eYIH0wnxqeSAhuIwvnnpjdVB8cRRClyKLQr7lgzjctkbp5KmswWszlwYln03Q==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.30.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.30.1.tgz", - "integrity": "sha512-x78BavIwSH6sqfP2xeI1hd1GpHL8J4W2BXcVM/5KYKoAD3nNsfitQhvWSw+TFtQTLZ9OmlF+FEInEHyubut2OA==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@rollup/rollup-freebsd-arm64": { - "version": "4.30.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.30.1.tgz", - "integrity": "sha512-HYTlUAjbO1z8ywxsDFWADfTRfTIIy/oUlfIDmlHYmjUP2QRDTzBuWXc9O4CXM+bo9qfiCclmHk1x4ogBjOUpUQ==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "freebsd" - ] - }, - "node_modules/@rollup/rollup-freebsd-x64": { - "version": "4.30.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.30.1.tgz", - "integrity": "sha512-1MEdGqogQLccphhX5myCJqeGNYTNcmTyaic9S7CG3JhwuIByJ7J05vGbZxsizQthP1xpVx7kd3o31eOogfEirw==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "freebsd" - ] - }, - "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.30.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.30.1.tgz", - "integrity": "sha512-PaMRNBSqCx7K3Wc9QZkFx5+CX27WFpAMxJNiYGAXfmMIKC7jstlr32UhTgK6T07OtqR+wYlWm9IxzennjnvdJg==", - "cpu": [ - "arm" - ], - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.30.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.30.1.tgz", - "integrity": "sha512-B8Rcyj9AV7ZlEFqvB5BubG5iO6ANDsRKlhIxySXcF1axXYUyqwBok+XZPgIYGBgs7LDXfWfifxhw0Ik57T0Yug==", - "cpu": [ - "arm" - ], - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.30.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.30.1.tgz", - "integrity": "sha512-hqVyueGxAj3cBKrAI4aFHLV+h0Lv5VgWZs9CUGqr1z0fZtlADVV1YPOij6AhcK5An33EXaxnDLmJdQikcn5NEw==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.30.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.30.1.tgz", - "integrity": "sha512-i4Ab2vnvS1AE1PyOIGp2kXni69gU2DAUVt6FSXeIqUCPIR3ZlheMW3oP2JkukDfu3PsexYRbOiJrY+yVNSk9oA==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-loongarch64-gnu": { - "version": "4.30.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.30.1.tgz", - "integrity": "sha512-fARcF5g296snX0oLGkVxPmysetwUk2zmHcca+e9ObOovBR++9ZPOhqFUM61UUZ2EYpXVPN1redgqVoBB34nTpQ==", - "cpu": [ - "loong64" - ], - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { - "version": "4.30.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.30.1.tgz", - "integrity": "sha512-GLrZraoO3wVT4uFXh67ElpwQY0DIygxdv0BNW9Hkm3X34wu+BkqrDrkcsIapAY+N2ATEbvak0XQ9gxZtCIA5Rw==", - "cpu": [ - "ppc64" - ], - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.30.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.30.1.tgz", - "integrity": "sha512-0WKLaAUUHKBtll0wvOmh6yh3S0wSU9+yas923JIChfxOaaBarmb/lBKPF0w/+jTVozFnOXJeRGZ8NvOxvk/jcw==", - "cpu": [ - "riscv64" - ], - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.30.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.30.1.tgz", - "integrity": "sha512-GWFs97Ruxo5Bt+cvVTQkOJ6TIx0xJDD/bMAOXWJg8TCSTEK8RnFeOeiFTxKniTc4vMIaWvCplMAFBt9miGxgkA==", - "cpu": [ - "s390x" - ], - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.30.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.30.1.tgz", - "integrity": "sha512-UtgGb7QGgXDIO+tqqJ5oZRGHsDLO8SlpE4MhqpY9Llpzi5rJMvrK6ZGhsRCST2abZdBqIBeXW6WPD5fGK5SDwg==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.30.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.30.1.tgz", - "integrity": "sha512-V9U8Ey2UqmQsBT+xTOeMzPzwDzyXmnAoO4edZhL7INkwQcaW1Ckv3WJX3qrrp/VHaDkEWIBWhRwP47r8cdrOow==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.30.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.30.1.tgz", - "integrity": "sha512-WabtHWiPaFF47W3PkHnjbmWawnX/aE57K47ZDT1BXTS5GgrBUEpvOzq0FI0V/UYzQJgdb8XlhVNH8/fwV8xDjw==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.30.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.30.1.tgz", - "integrity": "sha512-pxHAU+Zv39hLUTdQQHUVHf4P+0C47y/ZloorHpzs2SXMRqeAWmGghzAhfOlzFHHwjvgokdFAhC4V+6kC1lRRfw==", - "cpu": [ - "ia32" - ], - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.30.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.30.1.tgz", - "integrity": "sha512-D6qjsXGcvhTjv0kI4fU8tUuBDF/Ueee4SVX79VfNDXZa64TfCW1Slkb6Z7O1p7vflqZjcmOVdZlqf8gvJxc6og==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@sinclair/typebox": { - "version": "0.27.8", - "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", - "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==" - }, - "node_modules/@stitches/react": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@stitches/react/-/react-1.2.8.tgz", - "integrity": "sha512-9g9dWI4gsSVe8bNLlb+lMkBYsnIKCZTmvqvDG+Avnn69XfmHZKiaMrx7cgTaddq7aTPPmXiTsbFcUy0xgI4+wA==", - "peerDependencies": { - "react": ">= 16.3.0" - } - }, - "node_modules/@tailwindcss/forms": { - "version": "0.5.10", - "resolved": "https://registry.npmjs.org/@tailwindcss/forms/-/forms-0.5.10.tgz", - "integrity": "sha512-utI1ONF6uf/pPNO68kmN1b8rEwNXv3czukalo8VtJH8ksIkZXr3Q3VYudZLkCsDd4Wku120uF02hYK25XGPorw==", - "dependencies": { - "mini-svg-data-uri": "^1.2.3" - }, - "peerDependencies": { - "tailwindcss": ">=3.0.0 || >= 3.0.0-alpha.1 || >= 4.0.0-alpha.20 || >= 4.0.0-beta.1" - } - }, - "node_modules/@tailwindcss/typography": { - "version": "0.5.16", - "resolved": "https://registry.npmjs.org/@tailwindcss/typography/-/typography-0.5.16.tgz", - "integrity": "sha512-0wDLwCVF5V3x3b1SGXPCDcdsbDHMBe+lkFzBRaHeLvNi+nrrnZ1lA18u+OTWO8iSWU2GxUOCvlXtDuqftc1oiA==", - "dependencies": { - "lodash.castarray": "^4.4.0", - "lodash.isplainobject": "^4.0.6", - "lodash.merge": "^4.6.2", - "postcss-selector-parser": "6.0.10" - }, - "peerDependencies": { - "tailwindcss": ">=3.0.0 || insiders || >=4.0.0-alpha.20 || >=4.0.0-beta.1" - } - }, - "node_modules/@tanstack/query-core": { - "version": "4.36.1", - "resolved": "https://registry.npmjs.org/@tanstack/query-core/-/query-core-4.36.1.tgz", - "integrity": "sha512-DJSilV5+ytBP1FbFcEJovv4rnnm/CokuVvrBEtW/Va9DvuJ3HksbXUJEpI0aV1KtuL4ZoO9AVE6PyNLzF7tLeA==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/tannerlinsley" - } - }, - "node_modules/@tanstack/react-query": { - "version": "4.36.1", - "resolved": "https://registry.npmjs.org/@tanstack/react-query/-/react-query-4.36.1.tgz", - "integrity": "sha512-y7ySVHFyyQblPl3J3eQBWpXZkliroki3ARnBKsdJchlgt7yJLRDUcf4B8soufgiYt3pEQIkBWBx1N9/ZPIeUWw==", - "dependencies": { - "@tanstack/query-core": "4.36.1", - "use-sync-external-store": "^1.2.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/tannerlinsley" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0", - "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0", - "react-native": "*" - }, - "peerDependenciesMeta": { - "react-dom": { - "optional": true - }, - "react-native": { - "optional": true - } - } - }, - "node_modules/@testing-library/dom": { - "version": "9.3.4", - "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-9.3.4.tgz", - "integrity": "sha512-FlS4ZWlp97iiNWig0Muq8p+3rVDjRiYE+YKGbAqXOu9nwJFFOdL00kFpz42M+4huzYi86vAK1sOOfyOG45muIQ==", - "dependencies": { - "@babel/code-frame": "^7.10.4", - "@babel/runtime": "^7.12.5", - "@types/aria-query": "^5.0.1", - "aria-query": "5.1.3", - "chalk": "^4.1.0", - "dom-accessibility-api": "^0.5.9", - "lz-string": "^1.5.0", - "pretty-format": "^27.0.2" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/@testing-library/dom/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/@testing-library/dom/node_modules/aria-query": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.1.3.tgz", - "integrity": "sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ==", - "dependencies": { - "deep-equal": "^2.0.5" - } - }, - "node_modules/@testing-library/dom/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/@testing-library/dom/node_modules/dom-accessibility-api": { - "version": "0.5.16", - "resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.5.16.tgz", - "integrity": "sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==" - }, - "node_modules/@testing-library/jest-dom": { - "version": "6.6.3", - "resolved": "https://registry.npmjs.org/@testing-library/jest-dom/-/jest-dom-6.6.3.tgz", - "integrity": "sha512-IteBhl4XqYNkM54f4ejhLRJiZNqcSCoXUOG2CPK7qbD322KjQozM4kHQOfkG2oln9b9HTYqs+Sae8vBATubxxA==", - "dependencies": { - "@adobe/css-tools": "^4.4.0", - "aria-query": "^5.0.0", - "chalk": "^3.0.0", - "css.escape": "^1.5.1", - "dom-accessibility-api": "^0.6.3", - "lodash": "^4.17.21", - "redent": "^3.0.0" - }, - "engines": { - "node": ">=14", - "npm": ">=6", - "yarn": ">=1" - } - }, - "node_modules/@testing-library/react": { - "version": "14.3.1", - "resolved": "https://registry.npmjs.org/@testing-library/react/-/react-14.3.1.tgz", - "integrity": "sha512-H99XjUhWQw0lTgyMN05W3xQG1Nh4lq574D8keFf1dDoNTJgp66VbJozRaczoF+wsiaPJNt/TcnfpLGufGxSrZQ==", - "dependencies": { - "@babel/runtime": "^7.12.5", - "@testing-library/dom": "^9.0.0", - "@types/react-dom": "^18.0.0" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "react": "^18.0.0", - "react-dom": "^18.0.0" - } - }, - "node_modules/@tootallnate/once": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", - "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==", - "engines": { - "node": ">= 10" - } - }, - "node_modules/@tsconfig/node18": { - "version": "18.2.4", - "resolved": "https://registry.npmjs.org/@tsconfig/node18/-/node18-18.2.4.tgz", - "integrity": "sha512-5xxU8vVs9/FNcvm3gE07fPbn9tl6tqGGWA9tSlwsUEkBxtRnTsNmwrV8gasZ9F/EobaSv9+nu8AxUKccw77JpQ==", - "dev": true - }, - "node_modules/@tybys/wasm-util": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.9.0.tgz", - "integrity": "sha512-6+7nlbMVX/PVDCwaIQ8nTOPveOcFLSt8GcXdx8hD0bt39uWxYT88uXzqTd4fTvqta7oeUJqudepapKNt2DYJFw==", - "optional": true, - "dependencies": { - "tslib": "^2.4.0" - } - }, - "node_modules/@types/aria-query": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/@types/aria-query/-/aria-query-5.0.4.tgz", - "integrity": "sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==" - }, - "node_modules/@types/body-parser": { - "version": "1.19.5", - "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.5.tgz", - "integrity": "sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==", - "dev": true, - "dependencies": { - "@types/connect": "*", - "@types/node": "*" - } - }, - "node_modules/@types/connect": { - "version": "3.4.38", - "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz", - "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==", - "dev": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/cookie": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.4.1.tgz", - "integrity": "sha512-XW/Aa8APYr6jSVVA1y/DEIZX0/GMKLEVekNG727R8cs56ahETkRAy/3DR7+fJyh7oUgGwNQaRfXCun0+KbWY7Q==" - }, - "node_modules/@types/cors": { - "version": "2.8.17", - "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.17.tgz", - "integrity": "sha512-8CGDvrBj1zgo2qE+oS3pOCyYNqCPryMWY2bGfwA0dcfopWGgxs+78df0Rs3rc9THP4JkOhLsAa+15VdpAqkcUA==", - "dev": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/debug": { - "version": "4.1.12", - "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.12.tgz", - "integrity": "sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==", - "dependencies": { - "@types/ms": "*" - } - }, - "node_modules/@types/estree": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz", - "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==" - }, - "node_modules/@types/express": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.21.tgz", - "integrity": "sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ==", - "dev": true, - "dependencies": { - "@types/body-parser": "*", - "@types/express-serve-static-core": "^4.17.33", - "@types/qs": "*", - "@types/serve-static": "*" - } - }, - "node_modules/@types/express-serve-static-core": { - "version": "4.19.6", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.19.6.tgz", - "integrity": "sha512-N4LZ2xG7DatVqhCZzOGb1Yi5lMbXSZcmdLDe9EzSndPV2HpWYWzRbaerl2n27irrm94EPpprqa8KpskPT085+A==", - "dev": true, - "dependencies": { - "@types/node": "*", - "@types/qs": "*", - "@types/range-parser": "*", - "@types/send": "*" - } - }, - "node_modules/@types/http-errors": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.4.tgz", - "integrity": "sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==", - "dev": true - }, - "node_modules/@types/js-levenshtein": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/@types/js-levenshtein/-/js-levenshtein-1.1.3.tgz", - "integrity": "sha512-jd+Q+sD20Qfu9e2aEXogiO3vpOC1PYJOUdyN9gvs4Qrvkg4wF43L5OhqrPeokdv8TL0/mXoYfpkcoGZMNN2pkQ==" - }, - "node_modules/@types/mime": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.5.tgz", - "integrity": "sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==", - "dev": true - }, - "node_modules/@types/ms": { - "version": "0.7.34", - "resolved": "https://registry.npmjs.org/@types/ms/-/ms-0.7.34.tgz", - "integrity": "sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==" - }, - "node_modules/@types/node": { - "version": "22.10.6", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.10.6.tgz", - "integrity": "sha512-qNiuwC4ZDAUNcY47xgaSuS92cjf8JbSUoaKS77bmLG1rU7MlATVSiw/IlrjtIyyskXBZ8KkNfjK/P5na7rgXbQ==", - "dependencies": { - "undici-types": "~6.20.0" - } - }, - "node_modules/@types/prop-types": { - "version": "15.7.14", - "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.14.tgz", - "integrity": "sha512-gNMvNH49DJ7OJYv+KAKn0Xp45p8PLl6zo2YnvDIbTd4J6MER2BmWN49TG7n9LvkyihINxeKW8+3bfS2yDC9dzQ==" - }, - "node_modules/@types/qs": { - "version": "6.9.18", - "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.18.tgz", - "integrity": "sha512-kK7dgTYDyGqS+e2Q4aK9X3D7q234CIZ1Bv0q/7Z5IwRDoADNU81xXJK/YVyLbLTZCoIwUoDoffFeF+p/eIklAA==", - "dev": true - }, - "node_modules/@types/range-parser": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.7.tgz", - "integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==", - "dev": true - }, - "node_modules/@types/react": { - "version": "18.3.18", - "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.18.tgz", - "integrity": "sha512-t4yC+vtgnkYjNSKlFx1jkAhH8LgTo2N/7Qvi83kdEaUtMDiwpbLAktKDaAMlRcJ5eSxZkH74eEGt1ky31d7kfQ==", - "dependencies": { - "@types/prop-types": "*", - "csstype": "^3.0.2" - } - }, - "node_modules/@types/react-dom": { - "version": "18.3.5", - "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.3.5.tgz", - "integrity": "sha512-P4t6saawp+b/dFrUr2cvkVsfvPguwsxtH6dNIYRllMsefqFzkZk5UIjzyDOv5g1dXIPdG4Sp1yCR4Z6RCUsG/Q==", - "peerDependencies": { - "@types/react": "^18.0.0" - } - }, - "node_modules/@types/send": { - "version": "0.17.4", - "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.4.tgz", - "integrity": "sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==", - "dev": true, - "dependencies": { - "@types/mime": "^1", - "@types/node": "*" - } - }, - "node_modules/@types/serve-static": { - "version": "1.15.7", - "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.7.tgz", - "integrity": "sha512-W8Ym+h8nhuRwaKPaDw34QUkwsGi6Rc4yYqvKFo5rm2FUEhCFbzVWrxXUxuKK8TASjWsysJY0nsmNCGhCOIsrOw==", - "dev": true, - "dependencies": { - "@types/http-errors": "*", - "@types/node": "*", - "@types/send": "*" - } - }, - "node_modules/@types/set-cookie-parser": { - "version": "2.4.10", - "resolved": "https://registry.npmjs.org/@types/set-cookie-parser/-/set-cookie-parser-2.4.10.tgz", - "integrity": "sha512-GGmQVGpQWUe5qglJozEjZV/5dyxbOOZ0LHe/lqyWssB88Y4svNfst0uqBVscdDeIKl5Jy5+aPSvy7mI9tYRguw==", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@vitest/expect": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-1.6.0.tgz", - "integrity": "sha512-ixEvFVQjycy/oNgHjqsL6AZCDduC+tflRluaHIzKIsdbzkLn2U/iBnVeJwB6HsIjQBdfMR8Z0tRxKUsvFJEeWQ==", - "dependencies": { - "@vitest/spy": "1.6.0", - "@vitest/utils": "1.6.0", - "chai": "^4.3.10" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/@vitest/runner": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-1.6.0.tgz", - "integrity": "sha512-P4xgwPjwesuBiHisAVz/LSSZtDjOTPYZVmNAnpHHSR6ONrf8eCJOFRvUwdHn30F5M1fxhqtl7QZQUk2dprIXAg==", - "dependencies": { - "@vitest/utils": "1.6.0", - "p-limit": "^5.0.0", - "pathe": "^1.1.1" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/@vitest/snapshot": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-1.6.0.tgz", - "integrity": "sha512-+Hx43f8Chus+DCmygqqfetcAZrDJwvTj0ymqjQq4CvmpKFSTVteEOBzCusu1x2tt4OJcvBflyHUE0DZSLgEMtQ==", - "dependencies": { - "magic-string": "^0.30.5", - "pathe": "^1.1.1", - "pretty-format": "^29.7.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/@vitest/snapshot/node_modules/ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/@vitest/snapshot/node_modules/pretty-format": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", - "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", - "dependencies": { - "@jest/schemas": "^29.6.3", - "ansi-styles": "^5.0.0", - "react-is": "^18.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@vitest/snapshot/node_modules/react-is": { - "version": "18.3.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", - "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==" - }, - "node_modules/@vitest/spy": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-1.6.0.tgz", - "integrity": "sha512-leUTap6B/cqi/bQkXUu6bQV5TZPx7pmMBKBQiI0rJA8c3pB56ZsaTbREnF7CJfmvAS4V2cXIBAh/3rVwrrCYgw==", - "dependencies": { - "tinyspy": "^2.2.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/@vitest/ui": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/@vitest/ui/-/ui-1.6.0.tgz", - "integrity": "sha512-k3Lyo+ONLOgylctiGovRKy7V4+dIN2yxstX3eY5cWFXH6WP+ooVX79YSyi0GagdTQzLmT43BF27T0s6dOIPBXA==", - "dependencies": { - "@vitest/utils": "1.6.0", - "fast-glob": "^3.3.2", - "fflate": "^0.8.1", - "flatted": "^3.2.9", - "pathe": "^1.1.1", - "picocolors": "^1.0.0", - "sirv": "^2.0.4" - }, - "funding": { - "url": "https://opencollective.com/vitest" - }, - "peerDependencies": { - "vitest": "1.6.0" - } - }, - "node_modules/@vitest/utils": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-1.6.0.tgz", - "integrity": "sha512-21cPiuGMoMZwiOHa2i4LXkMkMkCGzA+MVFV70jRwHo95dL4x/ts5GZhML1QWuy7yfp3WzK3lRvZi3JnXTYqrBw==", - "dependencies": { - "diff-sequences": "^29.6.3", - "estree-walker": "^3.0.3", - "loupe": "^2.3.7", - "pretty-format": "^29.7.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/@vitest/utils/node_modules/ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/@vitest/utils/node_modules/pretty-format": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", - "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", - "dependencies": { - "@jest/schemas": "^29.6.3", - "ansi-styles": "^5.0.0", - "react-is": "^18.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@vitest/utils/node_modules/react-is": { - "version": "18.3.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", - "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==" - }, - "node_modules/@xmldom/xmldom": { - "version": "0.8.10", - "resolved": "https://registry.npmjs.org/@xmldom/xmldom/-/xmldom-0.8.10.tgz", - "integrity": "sha512-2WALfTl4xo2SkGCYRt6rDTFfk9R1czmBvUQy12gK2KuRKIpWEhcbbzy8EZXtz/jkRqHX8bFEc6FC1HjX4TUWYw==", - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/@zxing/text-encoding": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/@zxing/text-encoding/-/text-encoding-0.9.0.tgz", - "integrity": "sha512-U/4aVJ2mxI0aDNI8Uq0wEhMgY+u4CNtEb0om3+y3+niDAsoTCOB33UF0sxpzqzdqXLqmvc+vZyAt4O8pPdfkwA==", - "optional": true - }, - "node_modules/abab": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.6.tgz", - "integrity": "sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==", - "deprecated": "Use your platform's native atob() and btoa() methods instead" - }, - "node_modules/accepts": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", - "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", - "dependencies": { - "mime-types": "~2.1.34", - "negotiator": "0.6.3" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/acorn": { - "version": "8.14.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.0.tgz", - "integrity": "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==", - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/acorn-globals": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-7.0.1.tgz", - "integrity": "sha512-umOSDSDrfHbTNPuNpC2NSnnA3LUrqpevPb4T9jRx4MagXNS0rs+gwiTcAvqCRmsD6utzsrzNt+ebm00SNWiC3Q==", - "dependencies": { - "acorn": "^8.1.0", - "acorn-walk": "^8.0.2" - } - }, - "node_modules/acorn-walk": { - "version": "8.3.4", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.4.tgz", - "integrity": "sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==", - "dependencies": { - "acorn": "^8.11.0" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/agent-base": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", - "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", - "dependencies": { - "debug": "4" - }, - "engines": { - "node": ">= 6.0.0" - } - }, - "node_modules/agent-base/node_modules/debug": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", - "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", - "dependencies": { - "ms": "^2.1.3" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/agent-base/node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" - }, - "node_modules/aggregate-error": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", - "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", - "dependencies": { - "clean-stack": "^2.0.0", - "indent-string": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/ansi-escapes": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", - "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", - "dependencies": { - "type-fest": "^0.21.3" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/ansi-escapes/node_modules/type-fest": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", - "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/ansi-regex": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", - "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/ansi-styles": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", - "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/any-promise": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", - "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==" - }, - "node_modules/anymatch": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", - "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", - "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/arctic": { - "version": "1.9.2", - "resolved": "https://registry.npmjs.org/arctic/-/arctic-1.9.2.tgz", - "integrity": "sha512-VTnGpYx+ypboJdNrWnK17WeD7zN/xSCHnpecd5QYsBfVZde/5i+7DJ1wrf/ioSDMiEjagXmyNWAE3V2C9f1hNg==", - "dependencies": { - "oslo": "1.2.0" - } - }, - "node_modules/arctic/node_modules/@emnapi/core": { - "version": "0.45.0", - "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-0.45.0.tgz", - "integrity": "sha512-DPWjcUDQkCeEM4VnljEOEcXdAD7pp8zSZsgOujk/LGIwCXWbXJngin+MO4zbH429lzeC3WbYLGjE2MaUOwzpyw==", - "optional": true, - "dependencies": { - "tslib": "^2.4.0" - } - }, - "node_modules/arctic/node_modules/@emnapi/runtime": { - "version": "0.45.0", - "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-0.45.0.tgz", - "integrity": "sha512-Txumi3td7J4A/xTTwlssKieHKTGl3j4A1tglBx72auZ49YK7ePY6XZricgIg9mnZT4xPfA+UPCUdnhRuEFDL+w==", - "optional": true, - "dependencies": { - "tslib": "^2.4.0" - } - }, - "node_modules/arctic/node_modules/@node-rs/argon2": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/@node-rs/argon2/-/argon2-1.7.0.tgz", - "integrity": "sha512-zfULc+/tmcWcxn+nHkbyY8vP3+MpEqKORbszt4UkpqZgBgDAAIYvuDN/zukfTgdmo6tmJKKVfzigZOPk4LlIog==", - "engines": { - "node": ">= 10" - }, - "optionalDependencies": { - "@node-rs/argon2-android-arm-eabi": "1.7.0", - "@node-rs/argon2-android-arm64": "1.7.0", - "@node-rs/argon2-darwin-arm64": "1.7.0", - "@node-rs/argon2-darwin-x64": "1.7.0", - "@node-rs/argon2-freebsd-x64": "1.7.0", - "@node-rs/argon2-linux-arm-gnueabihf": "1.7.0", - "@node-rs/argon2-linux-arm64-gnu": "1.7.0", - "@node-rs/argon2-linux-arm64-musl": "1.7.0", - "@node-rs/argon2-linux-x64-gnu": "1.7.0", - "@node-rs/argon2-linux-x64-musl": "1.7.0", - "@node-rs/argon2-wasm32-wasi": "1.7.0", - "@node-rs/argon2-win32-arm64-msvc": "1.7.0", - "@node-rs/argon2-win32-ia32-msvc": "1.7.0", - "@node-rs/argon2-win32-x64-msvc": "1.7.0" - } - }, - "node_modules/arctic/node_modules/@node-rs/argon2-android-arm-eabi": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/@node-rs/argon2-android-arm-eabi/-/argon2-android-arm-eabi-1.7.0.tgz", - "integrity": "sha512-udDqkr5P9E+wYX1SZwAVPdyfYvaF4ry9Tm+R9LkfSHbzWH0uhU6zjIwNRp7m+n4gx691rk+lqqDAIP8RLKwbhg==", - "cpu": [ - "arm" - ], - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/arctic/node_modules/@node-rs/argon2-android-arm64": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/@node-rs/argon2-android-arm64/-/argon2-android-arm64-1.7.0.tgz", - "integrity": "sha512-s9j/G30xKUx8WU50WIhF0fIl1EdhBGq0RQ06lEhZ0Gi0ap8lhqbE2Bn5h3/G2D1k0Dx+yjeVVNmt/xOQIRG38A==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/arctic/node_modules/@node-rs/argon2-darwin-arm64": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/@node-rs/argon2-darwin-arm64/-/argon2-darwin-arm64-1.7.0.tgz", - "integrity": "sha512-ZIz4L6HGOB9U1kW23g+m7anGNuTZ0RuTw0vNp3o+2DWpb8u8rODq6A8tH4JRL79S+Co/Nq608m9uackN2pe0Rw==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/arctic/node_modules/@node-rs/argon2-darwin-x64": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/@node-rs/argon2-darwin-x64/-/argon2-darwin-x64-1.7.0.tgz", - "integrity": "sha512-5oi/pxqVhODW/pj1+3zElMTn/YukQeywPHHYDbcAW3KsojFjKySfhcJMd1DjKTc+CHQI+4lOxZzSUzK7mI14Hw==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/arctic/node_modules/@node-rs/argon2-freebsd-x64": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/@node-rs/argon2-freebsd-x64/-/argon2-freebsd-x64-1.7.0.tgz", - "integrity": "sha512-Ify08683hA4QVXYoIm5SUWOY5DPIT/CMB0CQT+IdxQAg/F+qp342+lUkeAtD5bvStQuCx/dFO3bnnzoe2clMhA==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/arctic/node_modules/@node-rs/argon2-linux-arm-gnueabihf": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/@node-rs/argon2-linux-arm-gnueabihf/-/argon2-linux-arm-gnueabihf-1.7.0.tgz", - "integrity": "sha512-7DjDZ1h5AUHAtRNjD19RnQatbhL+uuxBASuuXIBu4/w6Dx8n7YPxwTP4MXfsvuRgKuMWiOb/Ub/HJ3kXVCXRkg==", - "cpu": [ - "arm" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/arctic/node_modules/@node-rs/argon2-linux-arm64-gnu": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/@node-rs/argon2-linux-arm64-gnu/-/argon2-linux-arm64-gnu-1.7.0.tgz", - "integrity": "sha512-nJDoMP4Y3YcqGswE4DvP080w6O24RmnFEDnL0emdI8Nou17kNYBzP2546Nasx9GCyLzRcYQwZOUjrtUuQ+od2g==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/arctic/node_modules/@node-rs/argon2-linux-arm64-musl": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/@node-rs/argon2-linux-arm64-musl/-/argon2-linux-arm64-musl-1.7.0.tgz", - "integrity": "sha512-BKWS8iVconhE3jrb9mj6t1J9vwUqQPpzCbUKxfTGJfc+kNL58F1SXHBoe2cDYGnHrFEHTY0YochzXoAfm4Dm/A==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/arctic/node_modules/@node-rs/argon2-linux-x64-gnu": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/@node-rs/argon2-linux-x64-gnu/-/argon2-linux-x64-gnu-1.7.0.tgz", - "integrity": "sha512-EmgqZOlf4Jurk/szW1iTsVISx25bKksVC5uttJDUloTgsAgIGReCpUUO1R24pBhu9ESJa47iv8NSf3yAfGv6jQ==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/arctic/node_modules/@node-rs/argon2-linux-x64-musl": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/@node-rs/argon2-linux-x64-musl/-/argon2-linux-x64-musl-1.7.0.tgz", - "integrity": "sha512-/o1efYCYIxjfuoRYyBTi2Iy+1iFfhqHCvvVsnjNSgO1xWiWrX0Rrt/xXW5Zsl7vS2Y+yu8PL8KFWRzZhaVxfKA==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/arctic/node_modules/@node-rs/argon2-wasm32-wasi": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/@node-rs/argon2-wasm32-wasi/-/argon2-wasm32-wasi-1.7.0.tgz", - "integrity": "sha512-Evmk9VcxqnuwQftfAfYEr6YZYSPLzmKUsbFIMep5nTt9PT4XYRFAERj7wNYp+rOcBenF3X4xoB+LhwcOMTNE5w==", - "cpu": [ - "wasm32" - ], - "optional": true, - "dependencies": { - "@emnapi/core": "^0.45.0", - "@emnapi/runtime": "^0.45.0", - "@tybys/wasm-util": "^0.8.1", - "memfs-browser": "^3.4.13000" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/arctic/node_modules/@node-rs/argon2-win32-arm64-msvc": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/@node-rs/argon2-win32-arm64-msvc/-/argon2-win32-arm64-msvc-1.7.0.tgz", - "integrity": "sha512-qgsU7T004COWWpSA0tppDqDxbPLgg8FaU09krIJ7FBl71Sz8SFO40h7fDIjfbTT5w7u6mcaINMQ5bSHu75PCaA==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/arctic/node_modules/@node-rs/argon2-win32-ia32-msvc": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/@node-rs/argon2-win32-ia32-msvc/-/argon2-win32-ia32-msvc-1.7.0.tgz", - "integrity": "sha512-JGafwWYQ/HpZ3XSwP4adQ6W41pRvhcdXvpzIWtKvX+17+xEXAe2nmGWM6s27pVkg1iV2ZtoYLRDkOUoGqZkCcg==", - "cpu": [ - "ia32" - ], - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/arctic/node_modules/@node-rs/argon2-win32-x64-msvc": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/@node-rs/argon2-win32-x64-msvc/-/argon2-win32-x64-msvc-1.7.0.tgz", - "integrity": "sha512-9oq4ShyFakw8AG3mRls0AoCpxBFcimYx7+jvXeAf2OqKNO+mSA6eZ9z7KQeVCi0+SOEUYxMGf5UiGiDb9R6+9Q==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/arctic/node_modules/@tybys/wasm-util": { - "version": "0.8.3", - "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.8.3.tgz", - "integrity": "sha512-Z96T/L6dUFFxgFJ+pQtkPpne9q7i6kIPYCFnQBHSgSPV9idTsKfIhCss0h5iM9irweZCatkrdeP8yi5uM1eX6Q==", - "optional": true, - "dependencies": { - "tslib": "^2.4.0" - } - }, - "node_modules/arctic/node_modules/oslo": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/oslo/-/oslo-1.2.0.tgz", - "integrity": "sha512-OoFX6rDsNcOQVAD2gQD/z03u4vEjWZLzJtwkmgfRF+KpQUXwdgEXErD7zNhyowmHwHefP+PM9Pw13pgpHMRlzw==", - "dependencies": { - "@node-rs/argon2": "1.7.0", - "@node-rs/bcrypt": "1.9.0" - } - }, - "node_modules/arg": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", - "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==" - }, - "node_modules/aria-query": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.2.tgz", - "integrity": "sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/array-buffer-byte-length": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.2.tgz", - "integrity": "sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==", - "dependencies": { - "call-bound": "^1.0.3", - "is-array-buffer": "^3.0.5" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array-flatten": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" - }, - "node_modules/assertion-error": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", - "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", - "engines": { - "node": "*" - } - }, - "node_modules/asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" - }, - "node_modules/autoprefixer": { - "version": "10.4.20", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.20.tgz", - "integrity": "sha512-XY25y5xSv/wEoqzDyXXME4AFfkZI0P23z6Fs3YgymDnKJkCGOnkL0iTxCa85UTqaSgfcqyf3UA6+c7wUvx/16g==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/autoprefixer" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "dependencies": { - "browserslist": "^4.23.3", - "caniuse-lite": "^1.0.30001646", - "fraction.js": "^4.3.7", - "normalize-range": "^0.1.2", - "picocolors": "^1.0.1", - "postcss-value-parser": "^4.2.0" - }, - "bin": { - "autoprefixer": "bin/autoprefixer" - }, - "engines": { - "node": "^10 || ^12 || >=14" - }, - "peerDependencies": { - "postcss": "^8.1.0" - } - }, - "node_modules/available-typed-arrays": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", - "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", - "dependencies": { - "possible-typed-array-names": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/axios": { - "version": "1.7.9", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.9.tgz", - "integrity": "sha512-LhLcE7Hbiryz8oMDdDptSrWowmB4Bl6RCt6sIJKpRB4XtVf0iEgewX3au/pJqm+Py1kCASkb/FFKjxQaLtxJvw==", - "dependencies": { - "follow-redirects": "^1.15.6", - "form-data": "^4.0.0", - "proxy-from-env": "^1.1.0" - } - }, - "node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" - }, - "node_modules/base64-js": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/binary-extensions": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", - "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/bl": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", - "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", - "dependencies": { - "buffer": "^5.5.0", - "inherits": "^2.0.4", - "readable-stream": "^3.4.0" - } - }, - "node_modules/body-parser": { - "version": "1.20.3", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.3.tgz", - "integrity": "sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==", - "dependencies": { - "bytes": "3.1.2", - "content-type": "~1.0.5", - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "on-finished": "2.4.1", - "qs": "6.13.0", - "raw-body": "2.5.2", - "type-is": "~1.6.18", - "unpipe": "1.0.0" - }, - "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" - } - }, - "node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/braces": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", - "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", - "dependencies": { - "fill-range": "^7.1.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/browserslist": { - "version": "4.24.4", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.4.tgz", - "integrity": "sha512-KDi1Ny1gSePi1vm0q4oxSF8b4DR44GF4BbmS2YdhPLOEqd8pDviZOGH/GsmRwoWJ2+5Lr085X7naowMwKHDG1A==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "dependencies": { - "caniuse-lite": "^1.0.30001688", - "electron-to-chromium": "^1.5.73", - "node-releases": "^2.0.19", - "update-browserslist-db": "^1.1.1" - }, - "bin": { - "browserslist": "cli.js" - }, - "engines": { - "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" - } - }, - "node_modules/buffer": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", - "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.1.13" - } - }, - "node_modules/bytes": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/cac": { - "version": "6.7.14", - "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz", - "integrity": "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/call-bind": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz", - "integrity": "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==", - "dependencies": { - "call-bind-apply-helpers": "^1.0.0", - "es-define-property": "^1.0.0", - "get-intrinsic": "^1.2.4", - "set-function-length": "^1.2.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/call-bind-apply-helpers": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.1.tgz", - "integrity": "sha512-BhYE+WDaywFg2TBWYNXAE+8B1ATnThNBqXHP5nQu0jWJdVvY2hvkpyB3qOmtmDePiS5/BDQ8wASEWGMWRG148g==", - "dependencies": { - "es-errors": "^1.3.0", - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/call-bound": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.3.tgz", - "integrity": "sha512-YTd+6wGlNlPxSuri7Y6X8tY2dmm12UMH66RpKMhiX6rsk5wXXnYgbUcOt8kiS31/AjfoTOvCsE+w8nZQLQnzHA==", - "dependencies": { - "call-bind-apply-helpers": "^1.0.1", - "get-intrinsic": "^1.2.6" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/camelcase-css": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", - "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==", - "engines": { - "node": ">= 6" - } - }, - "node_modules/caniuse-lite": { - "version": "1.0.30001692", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001692.tgz", - "integrity": "sha512-A95VKan0kdtrsnMubMKxEKUKImOPSuCpYgxSQBo036P5YYgVIcOYJEgt/txJWqObiRQeISNCfef9nvlQ0vbV7A==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/caniuse-lite" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ] - }, - "node_modules/chai": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/chai/-/chai-4.5.0.tgz", - "integrity": "sha512-RITGBfijLkBddZvnn8jdqoTypxvqbOLYQkGGxXzeFjVHvudaPw0HNFD9x928/eUwYWd2dPCugVqspGALTZZQKw==", - "dependencies": { - "assertion-error": "^1.1.0", - "check-error": "^1.0.3", - "deep-eql": "^4.1.3", - "get-func-name": "^2.0.2", - "loupe": "^2.3.6", - "pathval": "^1.1.1", - "type-detect": "^4.1.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/chalk/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/chardet": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", - "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==" - }, - "node_modules/check-error": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.3.tgz", - "integrity": "sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==", - "dependencies": { - "get-func-name": "^2.0.2" - }, - "engines": { - "node": "*" - } - }, - "node_modules/chokidar": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", - "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", - "dependencies": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - }, - "engines": { - "node": ">= 8.10.0" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - } - }, - "node_modules/chokidar/node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/clean-stack": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", - "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", - "engines": { - "node": ">=6" - } - }, - "node_modules/cli-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", - "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", - "dependencies": { - "restore-cursor": "^3.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/cli-spinners": { - "version": "2.9.2", - "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.2.tgz", - "integrity": "sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==", - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/cli-width": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-3.0.0.tgz", - "integrity": "sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==", - "engines": { - "node": ">= 10" - } - }, - "node_modules/cliui": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", - "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.1", - "wrap-ansi": "^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/cliui/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/cliui/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/cliui/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" - }, - "node_modules/cliui/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/cliui/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/cliui/node_modules/wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/clone": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", - "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", - "engines": { - "node": ">=0.8" - } - }, - "node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "node_modules/combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "dependencies": { - "delayed-stream": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/commander": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", - "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", - "engines": { - "node": ">= 6" - } - }, - "node_modules/confbox": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/confbox/-/confbox-0.1.8.tgz", - "integrity": "sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==" - }, - "node_modules/content-disposition": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", - "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", - "dependencies": { - "safe-buffer": "5.2.1" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/content-type": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", - "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/cookie": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.1.tgz", - "integrity": "sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/cookie-signature": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", - "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" - }, - "node_modules/copy-anything": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/copy-anything/-/copy-anything-3.0.5.tgz", - "integrity": "sha512-yCEafptTtb4bk7GLEQoM8KVJpxAfdBJYaXyzQEgQQQgYrZiDp8SJmGKlYza6CYjEDNstAdNdKA3UuoULlEbS6w==", - "dependencies": { - "is-what": "^4.1.8" - }, - "engines": { - "node": ">=12.13" - }, - "funding": { - "url": "https://github.com/sponsors/mesqueeb" - } - }, - "node_modules/cron-parser": { - "version": "4.9.0", - "resolved": "https://registry.npmjs.org/cron-parser/-/cron-parser-4.9.0.tgz", - "integrity": "sha512-p0SaNjrHOnQeR8/VnfGbmg9te2kfyYSQ7Sc/j/6DtPL3JQvKxmjO9TSjNFpujqV3vEYYBvNNvXSxzyksBWAx1Q==", - "dependencies": { - "luxon": "^3.2.1" - }, - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/cross-spawn": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", - "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/css.escape": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/css.escape/-/css.escape-1.5.1.tgz", - "integrity": "sha512-YUifsXXuknHlUsmlgyY0PKzgPOr7/FjCePfHNt0jxm83wHZi44VDMQ7/fGNkjY3/jV1MC+1CmZbaHzugyeRtpg==" - }, - "node_modules/cssesc": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", - "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", - "bin": { - "cssesc": "bin/cssesc" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/cssstyle": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-3.0.0.tgz", - "integrity": "sha512-N4u2ABATi3Qplzf0hWbVCdjenim8F3ojEXpBDF5hBpjzW182MjNGLqfmQ0SkSPeQ+V86ZXgeH8aXj6kayd4jgg==", - "dependencies": { - "rrweb-cssom": "^0.6.0" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/csstype": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", - "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==" - }, - "node_modules/data-urls": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-4.0.0.tgz", - "integrity": "sha512-/mMTei/JXPqvFqQtfyTowxmJVwr2PVAeCcDxyFf6LhoOu/09TX2OX3kb2wzi4DMXcfj4OItwDOnhl5oziPnT6g==", - "dependencies": { - "abab": "^2.0.6", - "whatwg-mimetype": "^3.0.0", - "whatwg-url": "^12.0.0" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/decimal.js": { - "version": "10.4.3", - "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.4.3.tgz", - "integrity": "sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==" - }, - "node_modules/deep-eql": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-4.1.4.tgz", - "integrity": "sha512-SUwdGfqdKOwxCPeVYjwSyRpJ7Z+fhpwIAtmCUdZIWZ/YP5R9WAsyuSgpLVDi9bjWoN2LXHNss/dk3urXtdQxGg==", - "dependencies": { - "type-detect": "^4.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/deep-equal": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-2.2.3.tgz", - "integrity": "sha512-ZIwpnevOurS8bpT4192sqAowWM76JDKSHYzMLty3BZGSswgq6pBaH3DhCSW5xVAZICZyKdOBPjwww5wfgT/6PA==", - "dependencies": { - "array-buffer-byte-length": "^1.0.0", - "call-bind": "^1.0.5", - "es-get-iterator": "^1.1.3", - "get-intrinsic": "^1.2.2", - "is-arguments": "^1.1.1", - "is-array-buffer": "^3.0.2", - "is-date-object": "^1.0.5", - "is-regex": "^1.1.4", - "is-shared-array-buffer": "^1.0.2", - "isarray": "^2.0.5", - "object-is": "^1.1.5", - "object-keys": "^1.1.1", - "object.assign": "^4.1.4", - "regexp.prototype.flags": "^1.5.1", - "side-channel": "^1.0.4", - "which-boxed-primitive": "^1.0.2", - "which-collection": "^1.0.1", - "which-typed-array": "^1.1.13" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/defaults": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz", - "integrity": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==", - "dependencies": { - "clone": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/define-data-property": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", - "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", - "dependencies": { - "es-define-property": "^1.0.0", - "es-errors": "^1.3.0", - "gopd": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/define-properties": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", - "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", - "dependencies": { - "define-data-property": "^1.0.1", - "has-property-descriptors": "^1.0.0", - "object-keys": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/delay": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/delay/-/delay-5.0.0.tgz", - "integrity": "sha512-ReEBKkIfe4ya47wlPYf/gu5ib6yUG0/Aez0JQZQz94kiWtRQvZIQbTiehsnwHvLSWJnQdhVeqYue7Id1dKr0qw==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/depd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", - "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/destroy": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", - "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", - "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" - } - }, - "node_modules/didyoumean": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", - "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==" - }, - "node_modules/diff-sequences": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz", - "integrity": "sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==", - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/dlv": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", - "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==" - }, - "node_modules/dom-accessibility-api": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.6.3.tgz", - "integrity": "sha512-7ZgogeTnjuHbo+ct10G9Ffp0mif17idi0IyWNVA/wcwcm7NPOD/WEHVP3n7n3MhXqxoIYm8d6MuZohYWIZ4T3w==" - }, - "node_modules/domexception": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/domexception/-/domexception-4.0.0.tgz", - "integrity": "sha512-A2is4PLG+eeSfoTMA95/s4pvAoSo2mKtiM5jlHkAVewmiO8ISFTFKZjH7UAM1Atli/OT/7JHOrJRJiMKUZKYBw==", - "deprecated": "Use your platform's native DOMException instead", - "dependencies": { - "webidl-conversions": "^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/dunder-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", - "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", - "dependencies": { - "call-bind-apply-helpers": "^1.0.1", - "es-errors": "^1.3.0", - "gopd": "^1.2.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/eastasianwidth": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", - "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==" - }, - "node_modules/ee-first": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" - }, - "node_modules/electron-to-chromium": { - "version": "1.5.81", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.81.tgz", - "integrity": "sha512-SFsAz1hoR+u1eAWjofSPQnx0InE1QHGUAQ92pqYJPT8GARzmyP1zcEBDBxFFC6okJk2E94Ryfmib4DB8Sc6LBw==" - }, - "node_modules/emoji-regex": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==" - }, - "node_modules/encodeurl": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", - "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/entities": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", - "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", - "engines": { - "node": ">=0.12" - }, - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, - "node_modules/es-define-property": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", - "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-errors": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", - "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-get-iterator": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/es-get-iterator/-/es-get-iterator-1.1.3.tgz", - "integrity": "sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw==", - "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.3", - "has-symbols": "^1.0.3", - "is-arguments": "^1.1.1", - "is-map": "^2.0.2", - "is-set": "^2.0.2", - "is-string": "^1.0.7", - "isarray": "^2.0.5", - "stop-iteration-iterator": "^1.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/es-object-atoms": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.0.1.tgz", - "integrity": "sha512-BPOBuyUF9QIVhuNLhbToCLHP6+0MHwZ7xLBkPPCZqK4JmpJgGnv10035STzzQwFpqdzNFMB3irvDI63IagvDwA==", - "dependencies": { - "es-errors": "^1.3.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/esbuild": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.18.20.tgz", - "integrity": "sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==", - "dev": true, - "hasInstallScript": true, - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=12" - }, - "optionalDependencies": { - "@esbuild/android-arm": "0.18.20", - "@esbuild/android-arm64": "0.18.20", - "@esbuild/android-x64": "0.18.20", - "@esbuild/darwin-arm64": "0.18.20", - "@esbuild/darwin-x64": "0.18.20", - "@esbuild/freebsd-arm64": "0.18.20", - "@esbuild/freebsd-x64": "0.18.20", - "@esbuild/linux-arm": "0.18.20", - "@esbuild/linux-arm64": "0.18.20", - "@esbuild/linux-ia32": "0.18.20", - "@esbuild/linux-loong64": "0.18.20", - "@esbuild/linux-mips64el": "0.18.20", - "@esbuild/linux-ppc64": "0.18.20", - "@esbuild/linux-riscv64": "0.18.20", - "@esbuild/linux-s390x": "0.18.20", - "@esbuild/linux-x64": "0.18.20", - "@esbuild/netbsd-x64": "0.18.20", - "@esbuild/openbsd-x64": "0.18.20", - "@esbuild/sunos-x64": "0.18.20", - "@esbuild/win32-arm64": "0.18.20", - "@esbuild/win32-ia32": "0.18.20", - "@esbuild/win32-x64": "0.18.20" - } - }, - "node_modules/escalade": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", - "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", - "engines": { - "node": ">=6" - } - }, - "node_modules/escape-html": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" - }, - "node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/escodegen": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.1.0.tgz", - "integrity": "sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==", - "dependencies": { - "esprima": "^4.0.1", - "estraverse": "^5.2.0", - "esutils": "^2.0.2" - }, - "bin": { - "escodegen": "bin/escodegen.js", - "esgenerate": "bin/esgenerate.js" - }, - "engines": { - "node": ">=6.0" - }, - "optionalDependencies": { - "source-map": "~0.6.1" - } - }, - "node_modules/esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "engines": { - "node": ">=4.0" - } - }, - "node_modules/estree-walker": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", - "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", - "dependencies": { - "@types/estree": "^1.0.0" - } - }, - "node_modules/esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/etag": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/events": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", - "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", - "engines": { - "node": ">=0.8.x" - } - }, - "node_modules/execa": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-8.0.1.tgz", - "integrity": "sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==", - "dependencies": { - "cross-spawn": "^7.0.3", - "get-stream": "^8.0.1", - "human-signals": "^5.0.0", - "is-stream": "^3.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^5.1.0", - "onetime": "^6.0.0", - "signal-exit": "^4.1.0", - "strip-final-newline": "^3.0.0" - }, - "engines": { - "node": ">=16.17" - }, - "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" - } - }, - "node_modules/execa/node_modules/mimic-fn": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", - "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/execa/node_modules/onetime": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", - "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", - "dependencies": { - "mimic-fn": "^4.0.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/express": { - "version": "4.21.2", - "resolved": "https://registry.npmjs.org/express/-/express-4.21.2.tgz", - "integrity": "sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA==", - "dependencies": { - "accepts": "~1.3.8", - "array-flatten": "1.1.1", - "body-parser": "1.20.3", - "content-disposition": "0.5.4", - "content-type": "~1.0.4", - "cookie": "0.7.1", - "cookie-signature": "1.0.6", - "debug": "2.6.9", - "depd": "2.0.0", - "encodeurl": "~2.0.0", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "finalhandler": "1.3.1", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "merge-descriptors": "1.0.3", - "methods": "~1.1.2", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "path-to-regexp": "0.1.12", - "proxy-addr": "~2.0.7", - "qs": "6.13.0", - "range-parser": "~1.2.1", - "safe-buffer": "5.2.1", - "send": "0.19.0", - "serve-static": "1.16.2", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "type-is": "~1.6.18", - "utils-merge": "1.0.1", - "vary": "~1.1.2" - }, - "engines": { - "node": ">= 0.10.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/external-editor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", - "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", - "dependencies": { - "chardet": "^0.7.0", - "iconv-lite": "^0.4.24", - "tmp": "^0.0.33" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/fast-glob": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", - "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", - "dependencies": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.8" - }, - "engines": { - "node": ">=8.6.0" - } - }, - "node_modules/fast-glob/node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/fastq": { - "version": "1.18.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.18.0.tgz", - "integrity": "sha512-QKHXPW0hD8g4UET03SdOdunzSouc9N4AuHdsX8XNcTsuz+yYFILVNIX4l9yHABMhiEI9Db0JTTIpu0wB+Y1QQw==", - "dependencies": { - "reusify": "^1.0.4" - } - }, - "node_modules/fflate": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/fflate/-/fflate-0.8.2.tgz", - "integrity": "sha512-cPJU47OaAoCbg0pBvzsgpTPhmhqI5eJjh/JIu8tPj5q+T7iLvW/JAYUqmE7KOB4R1ZyEhzBaIQpQpardBF5z8A==" - }, - "node_modules/figures": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", - "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", - "dependencies": { - "escape-string-regexp": "^1.0.5" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/fill-range": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", - "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/finalhandler": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.1.tgz", - "integrity": "sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==", - "dependencies": { - "debug": "2.6.9", - "encodeurl": "~2.0.0", - "escape-html": "~1.0.3", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "statuses": "2.0.1", - "unpipe": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/flatted": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.2.tgz", - "integrity": "sha512-AiwGJM8YcNOaobumgtng+6NHuOqC3A7MixFeDafM3X9cIUM+xUXoS5Vfgf+OihAYe20fxqNM9yPBXJzRtZ/4eA==" - }, - "node_modules/follow-redirects": { - "version": "1.15.9", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.9.tgz", - "integrity": "sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==", - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/RubenVerborgh" - } - ], - "engines": { - "node": ">=4.0" - }, - "peerDependenciesMeta": { - "debug": { - "optional": true - } - } - }, - "node_modules/for-each": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", - "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", - "dependencies": { - "is-callable": "^1.1.3" - } - }, - "node_modules/foreground-child": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.0.tgz", - "integrity": "sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==", - "dependencies": { - "cross-spawn": "^7.0.0", - "signal-exit": "^4.0.1" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/form-data": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.1.tgz", - "integrity": "sha512-tzN8e4TX8+kkxGPK8D5u0FNmjPUjw3lwC9lSLxxoB/+GtsJG91CO8bSWy73APlgAZzZbXEYZJuxjkHH2w+Ezhw==", - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "mime-types": "^2.1.12" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/forwarded": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", - "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/fraction.js": { - "version": "4.3.7", - "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.7.tgz", - "integrity": "sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==", - "engines": { - "node": "*" - }, - "funding": { - "type": "patreon", - "url": "https://github.com/sponsors/rawify" - } - }, - "node_modules/fresh": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/fs-monkey": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.6.tgz", - "integrity": "sha512-b1FMfwetIKymC0eioW7mTywihSQE4oLzQn1dB6rZB5fx/3NpNEdAWeCSMB+60/AeT0TCXsxzAlcYVEFCTAksWg==", - "optional": true - }, - "node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "hasInstallScript": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "node_modules/function-bind": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", - "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/functions-have-names": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", - "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "engines": { - "node": "6.* || 8.* || >= 10.*" - } - }, - "node_modules/get-func-name": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.2.tgz", - "integrity": "sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==", - "engines": { - "node": "*" - } - }, - "node_modules/get-intrinsic": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.7.tgz", - "integrity": "sha512-VW6Pxhsrk0KAOqs3WEd0klDiF/+V7gQOpAvY1jVU/LHmaD/kQO4523aiJuikX/QAKYiW6x8Jh+RJej1almdtCA==", - "dependencies": { - "call-bind-apply-helpers": "^1.0.1", - "es-define-property": "^1.0.1", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.0.0", - "function-bind": "^1.1.2", - "get-proto": "^1.0.0", - "gopd": "^1.2.0", - "has-symbols": "^1.1.0", - "hasown": "^2.0.2", - "math-intrinsics": "^1.1.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/get-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", - "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", - "dependencies": { - "dunder-proto": "^1.0.1", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/get-stream": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-8.0.1.tgz", - "integrity": "sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==", - "engines": { - "node": ">=16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/glob": { - "version": "10.4.5", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", - "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", - "dependencies": { - "foreground-child": "^3.1.0", - "jackspeak": "^3.1.2", - "minimatch": "^9.0.4", - "minipass": "^7.1.2", - "package-json-from-dist": "^1.0.0", - "path-scurry": "^1.11.1" - }, - "bin": { - "glob": "dist/esm/bin.mjs" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/glob-parent": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", - "dependencies": { - "is-glob": "^4.0.3" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/gopd": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", - "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/graphql": { - "version": "16.10.0", - "resolved": "https://registry.npmjs.org/graphql/-/graphql-16.10.0.tgz", - "integrity": "sha512-AjqGKbDGUFRKIRCP9tCKiIGHyriz2oHEbPIbEtcSLSs4YjReZOIPQQWek4+6hjw62H9QShXHyaGivGiYVLeYFQ==", - "engines": { - "node": "^12.22.0 || ^14.16.0 || ^16.0.0 || >=17.0.0" - } - }, - "node_modules/has-bigints": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.1.0.tgz", - "integrity": "sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/has-property-descriptors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", - "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", - "dependencies": { - "es-define-property": "^1.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-symbols": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", - "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-tostringtag": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", - "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", - "dependencies": { - "has-symbols": "^1.0.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/hasown": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", - "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", - "dependencies": { - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/headers-polyfill": { - "version": "3.2.5", - "resolved": "https://registry.npmjs.org/headers-polyfill/-/headers-polyfill-3.2.5.tgz", - "integrity": "sha512-tUCGvt191vNSQgttSyJoibR+VO+I6+iCHIUdhzEMJKE+EAL8BwCN7fUOZlY4ofOelNHsK+gEjxB/B+9N3EWtdA==" - }, - "node_modules/html-encoding-sniffer": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-3.0.0.tgz", - "integrity": "sha512-oWv4T4yJ52iKrufjnyZPkrN0CH3QnrUqdB6In1g5Fe1mia8GmF36gnfNySxoZtxD5+NmYw1EElVXiBk93UeskA==", - "dependencies": { - "whatwg-encoding": "^2.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/http-errors": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", - "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", - "dependencies": { - "depd": "2.0.0", - "inherits": "2.0.4", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "toidentifier": "1.0.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/http-proxy-agent": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", - "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", - "dependencies": { - "@tootallnate/once": "2", - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/http-proxy-agent/node_modules/debug": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", - "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", - "dependencies": { - "ms": "^2.1.3" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/http-proxy-agent/node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" - }, - "node_modules/https-proxy-agent": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", - "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", - "dependencies": { - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/https-proxy-agent/node_modules/debug": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", - "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", - "dependencies": { - "ms": "^2.1.3" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/https-proxy-agent/node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" - }, - "node_modules/human-signals": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-5.0.0.tgz", - "integrity": "sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==", - "engines": { - "node": ">=16.17.0" - } - }, - "node_modules/iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ieee754": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/indent-string": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", - "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", - "engines": { - "node": ">=8" - } - }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" - }, - "node_modules/inquirer": { - "version": "8.2.6", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-8.2.6.tgz", - "integrity": "sha512-M1WuAmb7pn9zdFRtQYk26ZBoY043Sse0wVDdk4Bppr+JOXyQYybdtvK+l9wUibhtjdjvtoiNy8tk+EgsYIUqKg==", - "dependencies": { - "ansi-escapes": "^4.2.1", - "chalk": "^4.1.1", - "cli-cursor": "^3.1.0", - "cli-width": "^3.0.0", - "external-editor": "^3.0.3", - "figures": "^3.0.0", - "lodash": "^4.17.21", - "mute-stream": "0.0.8", - "ora": "^5.4.1", - "run-async": "^2.4.0", - "rxjs": "^7.5.5", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0", - "through": "^2.3.6", - "wrap-ansi": "^6.0.1" - }, - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/inquirer/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/inquirer/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/inquirer/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/inquirer/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" - }, - "node_modules/inquirer/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/inquirer/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/inquirer/node_modules/wrap-ansi": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", - "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/internal-slot": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.1.0.tgz", - "integrity": "sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==", - "dependencies": { - "es-errors": "^1.3.0", - "hasown": "^2.0.2", - "side-channel": "^1.1.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/ipaddr.js": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", - "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/is-arguments": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.2.0.tgz", - "integrity": "sha512-7bVbi0huj/wrIAOzb8U1aszg9kdi3KN/CyU19CTI7tAoZYEZoL9yCDXpbXN+uPsuWnP02cyug1gleqq+TU+YCA==", - "dependencies": { - "call-bound": "^1.0.2", - "has-tostringtag": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-array-buffer": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.5.tgz", - "integrity": "sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==", - "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.3", - "get-intrinsic": "^1.2.6" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-bigint": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.1.0.tgz", - "integrity": "sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==", - "dependencies": { - "has-bigints": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dependencies": { - "binary-extensions": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-boolean-object": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.2.1.tgz", - "integrity": "sha512-l9qO6eFlUETHtuihLcYOaLKByJ1f+N4kthcU9YjHy3N+B3hWv0y/2Nd0mu/7lTFnRQHTrSdXF50HQ3bl5fEnng==", - "dependencies": { - "call-bound": "^1.0.2", - "has-tostringtag": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-callable": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", - "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-core-module": { - "version": "2.16.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", - "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", - "dependencies": { - "hasown": "^2.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-date-object": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.1.0.tgz", - "integrity": "sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==", - "dependencies": { - "call-bound": "^1.0.2", - "has-tostringtag": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "engines": { - "node": ">=8" - } - }, - "node_modules/is-generator-function": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.1.0.tgz", - "integrity": "sha512-nPUB5km40q9e8UfN/Zc24eLlzdSf9OfKByBw9CIdw4H1giPMeA0OIJvbchsCu4npfI2QcMVBsGEBHKZ7wLTWmQ==", - "dependencies": { - "call-bound": "^1.0.3", - "get-proto": "^1.0.0", - "has-tostringtag": "^1.0.2", - "safe-regex-test": "^1.1.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dependencies": { - "is-extglob": "^2.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-interactive": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", - "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==", - "engines": { - "node": ">=8" - } - }, - "node_modules/is-map": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz", - "integrity": "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-node-process": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/is-node-process/-/is-node-process-1.2.0.tgz", - "integrity": "sha512-Vg4o6/fqPxIjtxgUH5QLJhwZ7gW5diGCVlXpuUfELC62CuxM1iHcRe51f2W1FDy04Ai4KJkagKjx3XaqyfRKXw==" - }, - "node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/is-number-object": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.1.1.tgz", - "integrity": "sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==", - "dependencies": { - "call-bound": "^1.0.3", - "has-tostringtag": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-potential-custom-element-name": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", - "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==" - }, - "node_modules/is-regex": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz", - "integrity": "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==", - "dependencies": { - "call-bound": "^1.0.2", - "gopd": "^1.2.0", - "has-tostringtag": "^1.0.2", - "hasown": "^2.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-set": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz", - "integrity": "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-shared-array-buffer": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.4.tgz", - "integrity": "sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==", - "dependencies": { - "call-bound": "^1.0.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-stream": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", - "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-string": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.1.1.tgz", - "integrity": "sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==", - "dependencies": { - "call-bound": "^1.0.3", - "has-tostringtag": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-symbol": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.1.1.tgz", - "integrity": "sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==", - "dependencies": { - "call-bound": "^1.0.2", - "has-symbols": "^1.1.0", - "safe-regex-test": "^1.1.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-typed-array": { - "version": "1.1.15", - "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.15.tgz", - "integrity": "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==", - "dependencies": { - "which-typed-array": "^1.1.16" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-unicode-supported": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", - "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-weakmap": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz", - "integrity": "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-weakset": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.4.tgz", - "integrity": "sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==", - "dependencies": { - "call-bound": "^1.0.3", - "get-intrinsic": "^1.2.6" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-what": { - "version": "4.1.16", - "resolved": "https://registry.npmjs.org/is-what/-/is-what-4.1.16.tgz", - "integrity": "sha512-ZhMwEosbFJkA0YhFnNDgTM4ZxDRsS6HqTo7qsZM08fehyRYIYa0yHu5R6mgo1n/8MgaPBXiPimPD77baVFYg+A==", - "engines": { - "node": ">=12.13" - }, - "funding": { - "url": "https://github.com/sponsors/mesqueeb" - } - }, - "node_modules/isarray": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", - "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==" - }, - "node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" - }, - "node_modules/jackspeak": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", - "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", - "dependencies": { - "@isaacs/cliui": "^8.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - }, - "optionalDependencies": { - "@pkgjs/parseargs": "^0.11.0" - } - }, - "node_modules/jiti": { - "version": "1.21.7", - "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.7.tgz", - "integrity": "sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A==", - "bin": { - "jiti": "bin/jiti.js" - } - }, - "node_modules/js-levenshtein": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/js-levenshtein/-/js-levenshtein-1.1.6.tgz", - "integrity": "sha512-X2BB11YZtrRqY4EnQcLX5Rh373zbK4alC1FW7D7MBhL2gtcC17cTnr6DmfHZeS0s2rTHjUTMMHfG7gO8SSdw+g==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" - }, - "node_modules/jsdom": { - "version": "21.1.2", - "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-21.1.2.tgz", - "integrity": "sha512-sCpFmK2jv+1sjff4u7fzft+pUh2KSUbUrEHYHyfSIbGTIcmnjyp83qg6qLwdJ/I3LpTXx33ACxeRL7Lsyc6lGQ==", - "dependencies": { - "abab": "^2.0.6", - "acorn": "^8.8.2", - "acorn-globals": "^7.0.0", - "cssstyle": "^3.0.0", - "data-urls": "^4.0.0", - "decimal.js": "^10.4.3", - "domexception": "^4.0.0", - "escodegen": "^2.0.0", - "form-data": "^4.0.0", - "html-encoding-sniffer": "^3.0.0", - "http-proxy-agent": "^5.0.0", - "https-proxy-agent": "^5.0.1", - "is-potential-custom-element-name": "^1.0.1", - "nwsapi": "^2.2.4", - "parse5": "^7.1.2", - "rrweb-cssom": "^0.6.0", - "saxes": "^6.0.0", - "symbol-tree": "^3.2.4", - "tough-cookie": "^4.1.2", - "w3c-xmlserializer": "^4.0.0", - "webidl-conversions": "^7.0.0", - "whatwg-encoding": "^2.0.0", - "whatwg-mimetype": "^3.0.0", - "whatwg-url": "^12.0.1", - "ws": "^8.13.0", - "xml-name-validator": "^4.0.0" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "canvas": "^2.5.0" - }, - "peerDependenciesMeta": { - "canvas": { - "optional": true - } - } - }, - "node_modules/lilconfig": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz", - "integrity": "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==", - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/antonk52" - } - }, - "node_modules/lines-and-columns": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", - "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==" - }, - "node_modules/local-pkg": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/local-pkg/-/local-pkg-0.5.1.tgz", - "integrity": "sha512-9rrA30MRRP3gBD3HTGnC6cDFpaE1kVDWxWgqWJUN0RvDNAo+Nz/9GxB+nHOH0ifbVFy0hSA1V6vFDvnx54lTEQ==", - "dependencies": { - "mlly": "^1.7.3", - "pkg-types": "^1.2.1" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, - "node_modules/lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" - }, - "node_modules/lodash.castarray": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/lodash.castarray/-/lodash.castarray-4.4.0.tgz", - "integrity": "sha512-aVx8ztPv7/2ULbArGJ2Y42bG1mEQ5mGjpdvrbJcJFU3TbYybe+QlLS4pst9zV52ymy2in1KpFPiZnAOATxD4+Q==" - }, - "node_modules/lodash.debounce": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", - "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==" - }, - "node_modules/lodash.isplainobject": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", - "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==" - }, - "node_modules/lodash.merge": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==" - }, - "node_modules/log-symbols": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", - "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", - "dependencies": { - "chalk": "^4.1.0", - "is-unicode-supported": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/log-symbols/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/log-symbols/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/loose-envify": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", - "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", - "dependencies": { - "js-tokens": "^3.0.0 || ^4.0.0" - }, - "bin": { - "loose-envify": "cli.js" - } - }, - "node_modules/loupe": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.7.tgz", - "integrity": "sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==", - "dependencies": { - "get-func-name": "^2.0.1" - } - }, - "node_modules/lru-cache": { - "version": "10.4.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", - "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==" - }, - "node_modules/lucia": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/lucia/-/lucia-3.2.2.tgz", - "integrity": "sha512-P1FlFBGCMPMXu+EGdVD9W4Mjm0DqsusmKgO7Xc33mI5X1bklmsQb0hfzPhXomQr9waWIBDsiOjvr1e6BTaUqpA==", - "dependencies": { - "@oslojs/crypto": "^1.0.1", - "@oslojs/encoding": "^1.1.0" - } - }, - "node_modules/luxon": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/luxon/-/luxon-3.5.0.tgz", - "integrity": "sha512-rh+Zjr6DNfUYR3bPwJEnuwDdqMbxZW7LOQfUN4B54+Cl+0o5zaU9RJ6bcidfDtC1cWCZXQ+nvX8bf6bAji37QQ==", - "engines": { - "node": ">=12" - } - }, - "node_modules/lz-string": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/lz-string/-/lz-string-1.5.0.tgz", - "integrity": "sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==", - "bin": { - "lz-string": "bin/bin.js" - } - }, - "node_modules/magic-string": { - "version": "0.30.17", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.17.tgz", - "integrity": "sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==", - "dependencies": { - "@jridgewell/sourcemap-codec": "^1.5.0" - } - }, - "node_modules/math-intrinsics": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", - "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/media-typer": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/memfs": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.5.3.tgz", - "integrity": "sha512-UERzLsxzllchadvbPs5aolHh65ISpKpM+ccLbOJ8/vvpBKmAWf+la7dXFy7Mr0ySHbdHrFv5kGFCUHHe6GFEmw==", - "optional": true, - "dependencies": { - "fs-monkey": "^1.0.4" - }, - "engines": { - "node": ">= 4.0.0" - } - }, - "node_modules/memfs-browser": { - "version": "3.5.10302", - "resolved": "https://registry.npmjs.org/memfs-browser/-/memfs-browser-3.5.10302.tgz", - "integrity": "sha512-JJTc/nh3ig05O0gBBGZjTCPOyydaTxNF0uHYBrcc1gHNnO+KIHIvo0Y1FKCJsaei6FCl8C6xfQomXqu+cuzkIw==", - "optional": true, - "dependencies": { - "memfs": "3.5.3" - } - }, - "node_modules/merge-descriptors": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz", - "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==", - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/merge-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==" - }, - "node_modules/merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "engines": { - "node": ">= 8" - } - }, - "node_modules/methods": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/micromatch": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", - "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", - "dependencies": { - "braces": "^3.0.3", - "picomatch": "^2.3.1" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", - "bin": { - "mime": "cli.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "dependencies": { - "mime-db": "1.52.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "engines": { - "node": ">=6" - } - }, - "node_modules/min-indent": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", - "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", - "engines": { - "node": ">=4" - } - }, - "node_modules/mini-svg-data-uri": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/mini-svg-data-uri/-/mini-svg-data-uri-1.4.4.tgz", - "integrity": "sha512-r9deDe9p5FJUPZAk3A59wGH7Ii9YrjjWw0jmw/liSbHl2CHiyXj6FcDXDu2K3TjVAXqiJdaw3xxwlZZr9E6nHg==", - "bin": { - "mini-svg-data-uri": "cli.js" - } - }, - "node_modules/minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/minipass": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", - "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", - "engines": { - "node": ">=16 || 14 >=14.17" - } - }, - "node_modules/mitt": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/mitt/-/mitt-3.0.0.tgz", - "integrity": "sha512-7dX2/10ITVyqh4aOSVI9gdape+t9l2/8QxHrFmUXu4EEUpdlxl6RudZUPZoc+zuY2hk1j7XxVroIVIan/pD/SQ==" - }, - "node_modules/mlly": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.7.4.tgz", - "integrity": "sha512-qmdSIPC4bDJXgZTCR7XosJiNKySV7O215tsPtDN9iEO/7q/76b/ijtgRu/+epFXSJhijtTCCGp3DWS549P3xKw==", - "dependencies": { - "acorn": "^8.14.0", - "pathe": "^2.0.1", - "pkg-types": "^1.3.0", - "ufo": "^1.5.4" - } - }, - "node_modules/mlly/node_modules/pathe": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.1.tgz", - "integrity": "sha512-6jpjMpOth5S9ITVu5clZ7NOgHNsv5vRQdheL9ztp2vZmM6fRbLvyua1tiBIL4lk8SAe3ARzeXEly6siXCjDHDw==" - }, - "node_modules/mrmime": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-2.0.0.tgz", - "integrity": "sha512-eu38+hdgojoyq63s+yTpN4XMBdt5l8HhMhc4VKLO9KM5caLIBvUm4thi7fFaxyTmCKeNnXZ5pAlBwCUnhA09uw==", - "engines": { - "node": ">=10" - } - }, - "node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" - }, - "node_modules/msw": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/msw/-/msw-1.3.5.tgz", - "integrity": "sha512-nG3fpmBXxFbKSIdk6miPuL3KjU6WMxgoW4tG1YgnP1M+TRG3Qn7b7R0euKAHq4vpwARHb18ZyfZljSxsTnMX2w==", - "hasInstallScript": true, - "dependencies": { - "@mswjs/cookies": "^0.2.2", - "@mswjs/interceptors": "^0.17.10", - "@open-draft/until": "^1.0.3", - "@types/cookie": "^0.4.1", - "@types/js-levenshtein": "^1.1.1", - "chalk": "^4.1.1", - "chokidar": "^3.4.2", - "cookie": "^0.4.2", - "graphql": "^16.8.1", - "headers-polyfill": "3.2.5", - "inquirer": "^8.2.0", - "is-node-process": "^1.2.0", - "js-levenshtein": "^1.1.6", - "node-fetch": "^2.6.7", - "outvariant": "^1.4.0", - "path-to-regexp": "^6.3.0", - "strict-event-emitter": "^0.4.3", - "type-fest": "^2.19.0", - "yargs": "^17.3.1" - }, - "bin": { - "msw": "cli/index.js" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/mswjs" - }, - "peerDependencies": { - "typescript": ">= 4.4.x" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/msw/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/msw/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/msw/node_modules/cookie": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz", - "integrity": "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/msw/node_modules/path-to-regexp": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-6.3.0.tgz", - "integrity": "sha512-Yhpw4T9C6hPpgPeA28us07OJeqZ5EzQTkbfwuhsUg0c237RomFoETJgmp2sa3F/41gfLE6G5cqcYwznmeEeOlQ==" - }, - "node_modules/mute-stream": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", - "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==" - }, - "node_modules/mz": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", - "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", - "dependencies": { - "any-promise": "^1.0.0", - "object-assign": "^4.0.1", - "thenify-all": "^1.0.0" - } - }, - "node_modules/nanoid": { - "version": "3.3.8", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.8.tgz", - "integrity": "sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "bin": { - "nanoid": "bin/nanoid.cjs" - }, - "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" - } - }, - "node_modules/negotiator": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", - "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/node-fetch": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", - "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", - "dependencies": { - "whatwg-url": "^5.0.0" - }, - "engines": { - "node": "4.x || >=6.0.0" - }, - "peerDependencies": { - "encoding": "^0.1.0" - }, - "peerDependenciesMeta": { - "encoding": { - "optional": true - } - } - }, - "node_modules/node-fetch/node_modules/tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" - }, - "node_modules/node-fetch/node_modules/webidl-conversions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" - }, - "node_modules/node-fetch/node_modules/whatwg-url": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", - "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", - "dependencies": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" - } - }, - "node_modules/node-releases": { - "version": "2.0.19", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz", - "integrity": "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==" - }, - "node_modules/nodemailer": { - "version": "6.9.16", - "resolved": "https://registry.npmjs.org/nodemailer/-/nodemailer-6.9.16.tgz", - "integrity": "sha512-psAuZdTIRN08HKVd/E8ObdV6NO7NTBY3KsC30F7M4H1OnmLCUNaS56FpYxyb26zWLSyYF9Ozch9KYHhHegsiOQ==", - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/normalize-range": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", - "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/npm-run-path": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.3.0.tgz", - "integrity": "sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==", - "dependencies": { - "path-key": "^4.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/npm-run-path/node_modules/path-key": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", - "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/nwsapi": { - "version": "2.2.16", - "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.16.tgz", - "integrity": "sha512-F1I/bimDpj3ncaNDhfyMWuFqmQDBwDB0Fogc2qpL3BWvkQteFD/8BzWuIRl83rq0DXfm8SGt/HFhLXZyljTXcQ==" - }, - "node_modules/object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-hash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", - "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", - "engines": { - "node": ">= 6" - } - }, - "node_modules/object-inspect": { - "version": "1.13.3", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.3.tgz", - "integrity": "sha512-kDCGIbxkDSXE3euJZZXzc6to7fCrKHNI/hSRQnRuQ+BWjFNzZwiFF8fj/6o2t2G9/jTj8PSIYTfCLelLZEeRpA==", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object-is": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.6.tgz", - "integrity": "sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q==", - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/object.assign": { - "version": "4.1.7", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.7.tgz", - "integrity": "sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==", - "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.3", - "define-properties": "^1.2.1", - "es-object-atoms": "^1.0.0", - "has-symbols": "^1.1.0", - "object-keys": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/on-finished": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", - "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", - "dependencies": { - "ee-first": "1.1.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "dependencies": { - "mimic-fn": "^2.1.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/ora": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz", - "integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==", - "dependencies": { - "bl": "^4.1.0", - "chalk": "^4.1.0", - "cli-cursor": "^3.1.0", - "cli-spinners": "^2.5.0", - "is-interactive": "^1.0.0", - "is-unicode-supported": "^0.1.0", - "log-symbols": "^4.1.0", - "strip-ansi": "^6.0.0", - "wcwidth": "^1.0.1" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/ora/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/ora/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/ora/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/ora/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/os-tmpdir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/oslo": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/oslo/-/oslo-1.2.1.tgz", - "integrity": "sha512-HfIhB5ruTdQv0XX2XlncWQiJ5SIHZ7NHZhVyHth0CSZ/xzge00etRyYy/3wp/Dsu+PkxMC+6+B2lS/GcKoewkA==", - "dependencies": { - "@node-rs/argon2": "1.7.0", - "@node-rs/bcrypt": "1.9.0" - } - }, - "node_modules/oslo/node_modules/@emnapi/core": { - "version": "0.45.0", - "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-0.45.0.tgz", - "integrity": "sha512-DPWjcUDQkCeEM4VnljEOEcXdAD7pp8zSZsgOujk/LGIwCXWbXJngin+MO4zbH429lzeC3WbYLGjE2MaUOwzpyw==", - "optional": true, - "dependencies": { - "tslib": "^2.4.0" - } - }, - "node_modules/oslo/node_modules/@emnapi/runtime": { - "version": "0.45.0", - "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-0.45.0.tgz", - "integrity": "sha512-Txumi3td7J4A/xTTwlssKieHKTGl3j4A1tglBx72auZ49YK7ePY6XZricgIg9mnZT4xPfA+UPCUdnhRuEFDL+w==", - "optional": true, - "dependencies": { - "tslib": "^2.4.0" - } - }, - "node_modules/oslo/node_modules/@node-rs/argon2": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/@node-rs/argon2/-/argon2-1.7.0.tgz", - "integrity": "sha512-zfULc+/tmcWcxn+nHkbyY8vP3+MpEqKORbszt4UkpqZgBgDAAIYvuDN/zukfTgdmo6tmJKKVfzigZOPk4LlIog==", - "engines": { - "node": ">= 10" - }, - "optionalDependencies": { - "@node-rs/argon2-android-arm-eabi": "1.7.0", - "@node-rs/argon2-android-arm64": "1.7.0", - "@node-rs/argon2-darwin-arm64": "1.7.0", - "@node-rs/argon2-darwin-x64": "1.7.0", - "@node-rs/argon2-freebsd-x64": "1.7.0", - "@node-rs/argon2-linux-arm-gnueabihf": "1.7.0", - "@node-rs/argon2-linux-arm64-gnu": "1.7.0", - "@node-rs/argon2-linux-arm64-musl": "1.7.0", - "@node-rs/argon2-linux-x64-gnu": "1.7.0", - "@node-rs/argon2-linux-x64-musl": "1.7.0", - "@node-rs/argon2-wasm32-wasi": "1.7.0", - "@node-rs/argon2-win32-arm64-msvc": "1.7.0", - "@node-rs/argon2-win32-ia32-msvc": "1.7.0", - "@node-rs/argon2-win32-x64-msvc": "1.7.0" - } - }, - "node_modules/oslo/node_modules/@node-rs/argon2-android-arm-eabi": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/@node-rs/argon2-android-arm-eabi/-/argon2-android-arm-eabi-1.7.0.tgz", - "integrity": "sha512-udDqkr5P9E+wYX1SZwAVPdyfYvaF4ry9Tm+R9LkfSHbzWH0uhU6zjIwNRp7m+n4gx691rk+lqqDAIP8RLKwbhg==", - "cpu": [ - "arm" - ], - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/oslo/node_modules/@node-rs/argon2-android-arm64": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/@node-rs/argon2-android-arm64/-/argon2-android-arm64-1.7.0.tgz", - "integrity": "sha512-s9j/G30xKUx8WU50WIhF0fIl1EdhBGq0RQ06lEhZ0Gi0ap8lhqbE2Bn5h3/G2D1k0Dx+yjeVVNmt/xOQIRG38A==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/oslo/node_modules/@node-rs/argon2-darwin-arm64": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/@node-rs/argon2-darwin-arm64/-/argon2-darwin-arm64-1.7.0.tgz", - "integrity": "sha512-ZIz4L6HGOB9U1kW23g+m7anGNuTZ0RuTw0vNp3o+2DWpb8u8rODq6A8tH4JRL79S+Co/Nq608m9uackN2pe0Rw==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/oslo/node_modules/@node-rs/argon2-darwin-x64": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/@node-rs/argon2-darwin-x64/-/argon2-darwin-x64-1.7.0.tgz", - "integrity": "sha512-5oi/pxqVhODW/pj1+3zElMTn/YukQeywPHHYDbcAW3KsojFjKySfhcJMd1DjKTc+CHQI+4lOxZzSUzK7mI14Hw==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/oslo/node_modules/@node-rs/argon2-freebsd-x64": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/@node-rs/argon2-freebsd-x64/-/argon2-freebsd-x64-1.7.0.tgz", - "integrity": "sha512-Ify08683hA4QVXYoIm5SUWOY5DPIT/CMB0CQT+IdxQAg/F+qp342+lUkeAtD5bvStQuCx/dFO3bnnzoe2clMhA==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/oslo/node_modules/@node-rs/argon2-linux-arm-gnueabihf": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/@node-rs/argon2-linux-arm-gnueabihf/-/argon2-linux-arm-gnueabihf-1.7.0.tgz", - "integrity": "sha512-7DjDZ1h5AUHAtRNjD19RnQatbhL+uuxBASuuXIBu4/w6Dx8n7YPxwTP4MXfsvuRgKuMWiOb/Ub/HJ3kXVCXRkg==", - "cpu": [ - "arm" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/oslo/node_modules/@node-rs/argon2-linux-arm64-gnu": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/@node-rs/argon2-linux-arm64-gnu/-/argon2-linux-arm64-gnu-1.7.0.tgz", - "integrity": "sha512-nJDoMP4Y3YcqGswE4DvP080w6O24RmnFEDnL0emdI8Nou17kNYBzP2546Nasx9GCyLzRcYQwZOUjrtUuQ+od2g==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/oslo/node_modules/@node-rs/argon2-linux-arm64-musl": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/@node-rs/argon2-linux-arm64-musl/-/argon2-linux-arm64-musl-1.7.0.tgz", - "integrity": "sha512-BKWS8iVconhE3jrb9mj6t1J9vwUqQPpzCbUKxfTGJfc+kNL58F1SXHBoe2cDYGnHrFEHTY0YochzXoAfm4Dm/A==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/oslo/node_modules/@node-rs/argon2-linux-x64-gnu": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/@node-rs/argon2-linux-x64-gnu/-/argon2-linux-x64-gnu-1.7.0.tgz", - "integrity": "sha512-EmgqZOlf4Jurk/szW1iTsVISx25bKksVC5uttJDUloTgsAgIGReCpUUO1R24pBhu9ESJa47iv8NSf3yAfGv6jQ==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/oslo/node_modules/@node-rs/argon2-linux-x64-musl": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/@node-rs/argon2-linux-x64-musl/-/argon2-linux-x64-musl-1.7.0.tgz", - "integrity": "sha512-/o1efYCYIxjfuoRYyBTi2Iy+1iFfhqHCvvVsnjNSgO1xWiWrX0Rrt/xXW5Zsl7vS2Y+yu8PL8KFWRzZhaVxfKA==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/oslo/node_modules/@node-rs/argon2-wasm32-wasi": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/@node-rs/argon2-wasm32-wasi/-/argon2-wasm32-wasi-1.7.0.tgz", - "integrity": "sha512-Evmk9VcxqnuwQftfAfYEr6YZYSPLzmKUsbFIMep5nTt9PT4XYRFAERj7wNYp+rOcBenF3X4xoB+LhwcOMTNE5w==", - "cpu": [ - "wasm32" - ], - "optional": true, - "dependencies": { - "@emnapi/core": "^0.45.0", - "@emnapi/runtime": "^0.45.0", - "@tybys/wasm-util": "^0.8.1", - "memfs-browser": "^3.4.13000" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/oslo/node_modules/@node-rs/argon2-win32-arm64-msvc": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/@node-rs/argon2-win32-arm64-msvc/-/argon2-win32-arm64-msvc-1.7.0.tgz", - "integrity": "sha512-qgsU7T004COWWpSA0tppDqDxbPLgg8FaU09krIJ7FBl71Sz8SFO40h7fDIjfbTT5w7u6mcaINMQ5bSHu75PCaA==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/oslo/node_modules/@node-rs/argon2-win32-ia32-msvc": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/@node-rs/argon2-win32-ia32-msvc/-/argon2-win32-ia32-msvc-1.7.0.tgz", - "integrity": "sha512-JGafwWYQ/HpZ3XSwP4adQ6W41pRvhcdXvpzIWtKvX+17+xEXAe2nmGWM6s27pVkg1iV2ZtoYLRDkOUoGqZkCcg==", - "cpu": [ - "ia32" - ], - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/oslo/node_modules/@node-rs/argon2-win32-x64-msvc": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/@node-rs/argon2-win32-x64-msvc/-/argon2-win32-x64-msvc-1.7.0.tgz", - "integrity": "sha512-9oq4ShyFakw8AG3mRls0AoCpxBFcimYx7+jvXeAf2OqKNO+mSA6eZ9z7KQeVCi0+SOEUYxMGf5UiGiDb9R6+9Q==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/oslo/node_modules/@tybys/wasm-util": { - "version": "0.8.3", - "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.8.3.tgz", - "integrity": "sha512-Z96T/L6dUFFxgFJ+pQtkPpne9q7i6kIPYCFnQBHSgSPV9idTsKfIhCss0h5iM9irweZCatkrdeP8yi5uM1eX6Q==", - "optional": true, - "dependencies": { - "tslib": "^2.4.0" - } - }, - "node_modules/outvariant": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/outvariant/-/outvariant-1.4.3.tgz", - "integrity": "sha512-+Sl2UErvtsoajRDKCE5/dBz4DIvHXQQnAxtQTF04OJxY0+DyZXSo5P5Bb7XYWOh81syohlYL24hbDwxedPUJCA==" - }, - "node_modules/p-limit": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-5.0.0.tgz", - "integrity": "sha512-/Eaoq+QyLSiXQ4lyYV23f14mZRQcXnxfHrN0vCai+ak9G0pp9iEQukIIZq5NccEvwRB8PUnZT0KsOoDCINS1qQ==", - "dependencies": { - "yocto-queue": "^1.0.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-map": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", - "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", - "dependencies": { - "aggregate-error": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/package-json-from-dist": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", - "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==" - }, - "node_modules/parse5": { - "version": "7.2.1", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.2.1.tgz", - "integrity": "sha512-BuBYQYlv1ckiPdQi/ohiivi9Sagc9JG+Ozs0r7b/0iK3sKmrb0b9FdWdBbOdx6hBCM/F9Ir82ofnBhtZOjCRPQ==", - "dependencies": { - "entities": "^4.5.0" - }, - "funding": { - "url": "https://github.com/inikulin/parse5?sponsor=1" - } - }, - "node_modules/parseurl": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", - "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "engines": { - "node": ">=8" - } - }, - "node_modules/path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" - }, - "node_modules/path-scurry": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", - "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", - "dependencies": { - "lru-cache": "^10.2.0", - "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" - }, - "engines": { - "node": ">=16 || 14 >=14.18" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/path-to-regexp": { - "version": "0.1.12", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.12.tgz", - "integrity": "sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==" - }, - "node_modules/pathe": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.2.tgz", - "integrity": "sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==" - }, - "node_modules/pathval": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz", - "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==", - "engines": { - "node": "*" - } - }, - "node_modules/pg": { - "version": "8.13.1", - "resolved": "https://registry.npmjs.org/pg/-/pg-8.13.1.tgz", - "integrity": "sha512-OUir1A0rPNZlX//c7ksiu7crsGZTKSOXJPgtNiHGIlC9H0lO+NC6ZDYksSgBYY/thSWhnSRBv8w1lieNNGATNQ==", - "dependencies": { - "pg-connection-string": "^2.7.0", - "pg-pool": "^3.7.0", - "pg-protocol": "^1.7.0", - "pg-types": "^2.1.0", - "pgpass": "1.x" - }, - "engines": { - "node": ">= 8.0.0" - }, - "optionalDependencies": { - "pg-cloudflare": "^1.1.1" - }, - "peerDependencies": { - "pg-native": ">=3.0.1" - }, - "peerDependenciesMeta": { - "pg-native": { - "optional": true - } - } - }, - "node_modules/pg-boss": { - "version": "8.4.2", - "resolved": "https://registry.npmjs.org/pg-boss/-/pg-boss-8.4.2.tgz", - "integrity": "sha512-xcl/G8C7qlCyrcvlQvgLVBIe68zO0XfZc6K86/G9fq/mL+YQMEo1spW6lHqsPpNi2KGlpXwBEL/XZxkMa19eRA==", - "dependencies": { - "cron-parser": "^4.0.0", - "delay": "^5.0.0", - "lodash.debounce": "^4.0.8", - "p-map": "^4.0.0", - "pg": "^8.5.1", - "serialize-error": "^8.1.0", - "uuid": "^9.0.0" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/pg-cloudflare": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/pg-cloudflare/-/pg-cloudflare-1.1.1.tgz", - "integrity": "sha512-xWPagP/4B6BgFO+EKz3JONXv3YDgvkbVrGw2mTo3D6tVDQRh1e7cqVGvyR3BE+eQgAvx1XhW/iEASj4/jCWl3Q==", - "optional": true - }, - "node_modules/pg-connection-string": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/pg-connection-string/-/pg-connection-string-2.7.0.tgz", - "integrity": "sha512-PI2W9mv53rXJQEOb8xNR8lH7Hr+EKa6oJa38zsK0S/ky2er16ios1wLKhZyxzD7jUReiWokc9WK5nxSnC7W1TA==" - }, - "node_modules/pg-int8": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/pg-int8/-/pg-int8-1.0.1.tgz", - "integrity": "sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw==", - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/pg-pool": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/pg-pool/-/pg-pool-3.7.0.tgz", - "integrity": "sha512-ZOBQForurqh4zZWjrgSwwAtzJ7QiRX0ovFkZr2klsen3Nm0aoh33Ls0fzfv3imeH/nw/O27cjdz5kzYJfeGp/g==", - "peerDependencies": { - "pg": ">=8.0" - } - }, - "node_modules/pg-protocol": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/pg-protocol/-/pg-protocol-1.7.0.tgz", - "integrity": "sha512-hTK/mE36i8fDDhgDFjy6xNOG+LCorxLG3WO17tku+ij6sVHXh1jQUJ8hYAnRhNla4QVD2H8er/FOjc/+EgC6yQ==" - }, - "node_modules/pg-types": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/pg-types/-/pg-types-2.2.0.tgz", - "integrity": "sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA==", - "dependencies": { - "pg-int8": "1.0.1", - "postgres-array": "~2.0.0", - "postgres-bytea": "~1.0.0", - "postgres-date": "~1.0.4", - "postgres-interval": "^1.1.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/pgpass": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/pgpass/-/pgpass-1.0.5.tgz", - "integrity": "sha512-FdW9r/jQZhSeohs1Z3sI1yxFQNFvMcnmfuj4WBMUTxOrAyLMaTcE1aAMBiTlbMNaXvBCQuVi0R7hd8udDSP7ug==", - "dependencies": { - "split2": "^4.1.0" - } - }, - "node_modules/picocolors": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", - "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==" - }, - "node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/pirates": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz", - "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==", - "engines": { - "node": ">= 6" - } - }, - "node_modules/pkg-types": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-1.3.1.tgz", - "integrity": "sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==", - "dependencies": { - "confbox": "^0.1.8", - "mlly": "^1.7.4", - "pathe": "^2.0.1" - } - }, - "node_modules/pkg-types/node_modules/pathe": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.1.tgz", - "integrity": "sha512-6jpjMpOth5S9ITVu5clZ7NOgHNsv5vRQdheL9ztp2vZmM6fRbLvyua1tiBIL4lk8SAe3ARzeXEly6siXCjDHDw==" - }, - "node_modules/possible-typed-array-names": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz", - "integrity": "sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/postcss": { - "version": "8.5.1", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.1.tgz", - "integrity": "sha512-6oz2beyjc5VMn/KV1pPw8fliQkhBXrVn1Z3TVyqZxU8kZpzEKhBdmCFqI6ZbmGtamQvQGuU1sgPTk8ZrXDD7jQ==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/postcss" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "dependencies": { - "nanoid": "^3.3.8", - "picocolors": "^1.1.1", - "source-map-js": "^1.2.1" - }, - "engines": { - "node": "^10 || ^12 || >=14" - } - }, - "node_modules/postcss-import": { - "version": "15.1.0", - "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-15.1.0.tgz", - "integrity": "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==", - "dependencies": { - "postcss-value-parser": "^4.0.0", - "read-cache": "^1.0.0", - "resolve": "^1.1.7" - }, - "engines": { - "node": ">=14.0.0" - }, - "peerDependencies": { - "postcss": "^8.0.0" - } - }, - "node_modules/postcss-js": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.1.tgz", - "integrity": "sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==", - "dependencies": { - "camelcase-css": "^2.0.1" - }, - "engines": { - "node": "^12 || ^14 || >= 16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - "peerDependencies": { - "postcss": "^8.4.21" - } - }, - "node_modules/postcss-load-config": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-4.0.2.tgz", - "integrity": "sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "dependencies": { - "lilconfig": "^3.0.0", - "yaml": "^2.3.4" - }, - "engines": { - "node": ">= 14" - }, - "peerDependencies": { - "postcss": ">=8.0.9", - "ts-node": ">=9.0.0" - }, - "peerDependenciesMeta": { - "postcss": { - "optional": true - }, - "ts-node": { - "optional": true - } - } - }, - "node_modules/postcss-nested": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.2.0.tgz", - "integrity": "sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "dependencies": { - "postcss-selector-parser": "^6.1.1" - }, - "engines": { - "node": ">=12.0" - }, - "peerDependencies": { - "postcss": "^8.2.14" - } - }, - "node_modules/postcss-nested/node_modules/postcss-selector-parser": { - "version": "6.1.2", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz", - "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==", - "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/postcss-selector-parser": { - "version": "6.0.10", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.10.tgz", - "integrity": "sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w==", - "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/postcss-value-parser": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", - "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==" - }, - "node_modules/postgres-array": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/postgres-array/-/postgres-array-2.0.0.tgz", - "integrity": "sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA==", - "engines": { - "node": ">=4" - } - }, - "node_modules/postgres-bytea": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/postgres-bytea/-/postgres-bytea-1.0.0.tgz", - "integrity": "sha512-xy3pmLuQqRBZBXDULy7KbaitYqLcmxigw14Q5sj8QBVLqEwXfeybIKVWiqAXTlcvdvb0+xkOtDbfQMOf4lST1w==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/postgres-date": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/postgres-date/-/postgres-date-1.0.7.tgz", - "integrity": "sha512-suDmjLVQg78nMK2UZ454hAG+OAW+HQPZ6n++TNDUX+L0+uUlLywnoxJKDou51Zm+zTCjrCl0Nq6J9C5hP9vK/Q==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/postgres-interval": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/postgres-interval/-/postgres-interval-1.2.0.tgz", - "integrity": "sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ==", - "dependencies": { - "xtend": "^4.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/pretty-format": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz", - "integrity": "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==", - "dependencies": { - "ansi-regex": "^5.0.1", - "ansi-styles": "^5.0.0", - "react-is": "^17.0.1" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/pretty-format/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/pretty-format/node_modules/ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/prisma": { - "version": "5.19.1", - "resolved": "https://registry.npmjs.org/prisma/-/prisma-5.19.1.tgz", - "integrity": "sha512-c5K9MiDaa+VAAyh1OiYk76PXOme9s3E992D7kvvIOhCrNsBQfy2mP2QAQtX0WNj140IgG++12kwZpYB9iIydNQ==", - "hasInstallScript": true, - "dependencies": { - "@prisma/engines": "5.19.1" - }, - "bin": { - "prisma": "build/index.js" - }, - "engines": { - "node": ">=16.13" - }, - "optionalDependencies": { - "fsevents": "2.3.3" - } - }, - "node_modules/proxy-addr": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", - "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", - "dependencies": { - "forwarded": "0.2.0", - "ipaddr.js": "1.9.1" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/proxy-from-env": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", - "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" - }, - "node_modules/psl": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.15.0.tgz", - "integrity": "sha512-JZd3gMVBAVQkSs6HdNZo9Sdo0LNcQeMNP3CozBJb3JYC/QUYZTnKxP+f8oWRX4rHP5EurWxqAHTSwUCjlNKa1w==", - "dependencies": { - "punycode": "^2.3.1" - }, - "funding": { - "url": "https://github.com/sponsors/lupomontero" - } - }, - "node_modules/punycode": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", - "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", - "engines": { - "node": ">=6" - } - }, - "node_modules/qs": { - "version": "6.13.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz", - "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==", - "dependencies": { - "side-channel": "^1.0.6" - }, - "engines": { - "node": ">=0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/querystringify": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", - "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==" - }, - "node_modules/queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/range-parser": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", - "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/raw-body": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", - "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", - "dependencies": { - "bytes": "3.1.2", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/react": { - "version": "18.3.1", - "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", - "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", - "dependencies": { - "loose-envify": "^1.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/react-dom": { - "version": "18.3.1", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz", - "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==", - "dependencies": { - "loose-envify": "^1.1.0", - "scheduler": "^0.23.2" - }, - "peerDependencies": { - "react": "^18.3.1" - } - }, - "node_modules/react-hook-form": { - "version": "7.54.2", - "resolved": "https://registry.npmjs.org/react-hook-form/-/react-hook-form-7.54.2.tgz", - "integrity": "sha512-eHpAUgUjWbZocoQYUHposymRb4ZP6d0uwUnooL2uOybA9/3tPUvoAKqEWK1WaSiTxxOfTpffNZP7QwlnM3/gEg==", - "engines": { - "node": ">=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/react-hook-form" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17 || ^18 || ^19" - } - }, - "node_modules/react-is": { - "version": "17.0.2", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", - "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==" - }, - "node_modules/react-router": { - "version": "6.28.1", - "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.28.1.tgz", - "integrity": "sha512-2omQTA3rkMljmrvvo6WtewGdVh45SpL9hGiCI9uUrwGGfNFDIvGK4gYJsKlJoNVi6AQZcopSCballL+QGOm7fA==", - "dependencies": { - "@remix-run/router": "1.21.0" - }, - "engines": { - "node": ">=14.0.0" - }, - "peerDependencies": { - "react": ">=16.8" - } - }, - "node_modules/react-router-dom": { - "version": "6.28.1", - "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.28.1.tgz", - "integrity": "sha512-YraE27C/RdjcZwl5UCqF/ffXnZDxpJdk9Q6jw38SZHjXs7NNdpViq2l2c7fO7+4uWaEfcwfGCv3RSg4e1By/fQ==", - "dependencies": { - "@remix-run/router": "1.21.0", - "react-router": "6.28.1" - }, - "engines": { - "node": ">=14.0.0" - }, - "peerDependencies": { - "react": ">=16.8", - "react-dom": ">=16.8" - } - }, - "node_modules/read-cache": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", - "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", - "dependencies": { - "pify": "^2.3.0" - } - }, - "node_modules/readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "dependencies": { - "picomatch": "^2.2.1" - }, - "engines": { - "node": ">=8.10.0" - } - }, - "node_modules/redent": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz", - "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==", - "dependencies": { - "indent-string": "^4.0.0", - "strip-indent": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/regenerator-runtime": { - "version": "0.14.1", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", - "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==" - }, - "node_modules/regexp.prototype.flags": { - "version": "1.5.4", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.4.tgz", - "integrity": "sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==", - "dependencies": { - "call-bind": "^1.0.8", - "define-properties": "^1.2.1", - "es-errors": "^1.3.0", - "get-proto": "^1.0.1", - "gopd": "^1.2.0", - "set-function-name": "^2.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/requires-port": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", - "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==" - }, - "node_modules/resolve": { - "version": "1.22.10", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz", - "integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==", - "dependencies": { - "is-core-module": "^2.16.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/restore-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", - "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", - "dependencies": { - "onetime": "^5.1.0", - "signal-exit": "^3.0.2" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/restore-cursor/node_modules/signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" - }, - "node_modules/reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "engines": { - "iojs": ">=1.0.0", - "node": ">=0.10.0" - } - }, - "node_modules/rollup": { - "version": "3.29.5", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.29.5.tgz", - "integrity": "sha512-GVsDdsbJzzy4S/v3dqWPJ7EfvZJfCHiDqe80IyrF59LYuP+e6U1LJoUqeuqRbwAWoMNoXivMNeNAOf5E22VA1w==", - "dev": true, - "bin": { - "rollup": "dist/bin/rollup" - }, - "engines": { - "node": ">=14.18.0", - "npm": ">=8.0.0" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - } - }, - "node_modules/rrweb-cssom": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/rrweb-cssom/-/rrweb-cssom-0.6.0.tgz", - "integrity": "sha512-APM0Gt1KoXBz0iIkkdB/kfvGOwC4UuJFeG/c+yV7wSc7q96cG/kJ0HiYCnzivD9SB53cLV1MlHFNfOuPaadYSw==" - }, - "node_modules/run-async": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", - "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==", - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "dependencies": { - "queue-microtask": "^1.2.2" - } - }, - "node_modules/rxjs": { - "version": "7.8.1", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", - "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", - "dependencies": { - "tslib": "^2.1.0" - } - }, - "node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/safe-regex-test": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.1.0.tgz", - "integrity": "sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==", - "dependencies": { - "call-bound": "^1.0.2", - "es-errors": "^1.3.0", - "is-regex": "^1.2.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" - }, - "node_modules/saxes": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/saxes/-/saxes-6.0.0.tgz", - "integrity": "sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==", - "dependencies": { - "xmlchars": "^2.2.0" - }, - "engines": { - "node": ">=v12.22.7" - } - }, - "node_modules/scheduler": { - "version": "0.23.2", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz", - "integrity": "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==", - "dependencies": { - "loose-envify": "^1.1.0" - } - }, - "node_modules/send": { - "version": "0.19.0", - "resolved": "https://registry.npmjs.org/send/-/send-0.19.0.tgz", - "integrity": "sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==", - "dependencies": { - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "mime": "1.6.0", - "ms": "2.1.3", - "on-finished": "2.4.1", - "range-parser": "~1.2.1", - "statuses": "2.0.1" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/send/node_modules/encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/send/node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" - }, - "node_modules/serialize-error": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/serialize-error/-/serialize-error-8.1.0.tgz", - "integrity": "sha512-3NnuWfM6vBYoy5gZFvHiYsVbafvI9vZv/+jlIigFn4oP4zjNPK3LhcY0xSCgeb1a5L8jO71Mit9LlNoi2UfDDQ==", - "dependencies": { - "type-fest": "^0.20.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/serialize-error/node_modules/type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/serve-static": { - "version": "1.16.2", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.2.tgz", - "integrity": "sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==", - "dependencies": { - "encodeurl": "~2.0.0", - "escape-html": "~1.0.3", - "parseurl": "~1.3.3", - "send": "0.19.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/set-cookie-parser": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-2.7.1.tgz", - "integrity": "sha512-IOc8uWeOZgnb3ptbCURJWNjWUPcO3ZnTTdzsurqERrP6nPyv+paC55vJM0LpOlT2ne+Ix+9+CRG1MNLlyZ4GjQ==" - }, - "node_modules/set-function-length": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", - "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", - "dependencies": { - "define-data-property": "^1.1.4", - "es-errors": "^1.3.0", - "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.4", - "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/set-function-name": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", - "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", - "dependencies": { - "define-data-property": "^1.1.4", - "es-errors": "^1.3.0", - "functions-have-names": "^1.2.3", - "has-property-descriptors": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/setprototypeof": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", - "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" - }, - "node_modules/shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dependencies": { - "shebang-regex": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "engines": { - "node": ">=8" - } - }, - "node_modules/side-channel": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", - "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", - "dependencies": { - "es-errors": "^1.3.0", - "object-inspect": "^1.13.3", - "side-channel-list": "^1.0.0", - "side-channel-map": "^1.0.1", - "side-channel-weakmap": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/side-channel-list": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", - "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", - "dependencies": { - "es-errors": "^1.3.0", - "object-inspect": "^1.13.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/side-channel-map": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", - "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", - "dependencies": { - "call-bound": "^1.0.2", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.5", - "object-inspect": "^1.13.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/side-channel-weakmap": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", - "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", - "dependencies": { - "call-bound": "^1.0.2", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.5", - "object-inspect": "^1.13.3", - "side-channel-map": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/siginfo": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz", - "integrity": "sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==" - }, - "node_modules/signal-exit": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", - "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/sirv": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/sirv/-/sirv-2.0.4.tgz", - "integrity": "sha512-94Bdh3cC2PKrbgSOUqTiGPWVZeSiXfKOVZNJniWoqrWrRkB1CJzBU3NEbiTsPcYy1lDsANA/THzS+9WBiy5nfQ==", - "dependencies": { - "@polka/url": "^1.0.0-next.24", - "mrmime": "^2.0.0", - "totalist": "^3.0.0" - }, - "engines": { - "node": ">= 10" - } - }, - "node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "optional": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/source-map-js": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", - "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/split2": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/split2/-/split2-4.2.0.tgz", - "integrity": "sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==", - "engines": { - "node": ">= 10.x" - } - }, - "node_modules/stackback": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz", - "integrity": "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==" - }, - "node_modules/statuses": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", - "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/std-env": { - "version": "3.8.0", - "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.8.0.tgz", - "integrity": "sha512-Bc3YwwCB+OzldMxOXJIIvC6cPRWr/LxOp48CdQTOkPyk/t4JWWJbrilwBd7RJzKV8QW7tJkcgAmeuLLJugl5/w==" - }, - "node_modules/stop-iteration-iterator": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.1.0.tgz", - "integrity": "sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==", - "dependencies": { - "es-errors": "^1.3.0", - "internal-slot": "^1.1.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/strict-event-emitter": { - "version": "0.4.6", - "resolved": "https://registry.npmjs.org/strict-event-emitter/-/strict-event-emitter-0.4.6.tgz", - "integrity": "sha512-12KWeb+wixJohmnwNFerbyiBrAlq5qJLwIt38etRtKtmmHyDSoGlIqFE9wx+4IwG0aDjI7GV8tc8ZccjWZZtTg==" - }, - "node_modules/string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "dependencies": { - "safe-buffer": "~5.2.0" - } - }, - "node_modules/string-width": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", - "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", - "dependencies": { - "eastasianwidth": "^0.2.0", - "emoji-regex": "^9.2.2", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/string-width-cjs": { - "name": "string-width", - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/string-width-cjs/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/string-width-cjs/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" - }, - "node_modules/string-width-cjs/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, - "node_modules/strip-ansi-cjs": { - "name": "strip-ansi", - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-ansi-cjs/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-final-newline": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", - "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/strip-indent": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", - "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", - "dependencies": { - "min-indent": "^1.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-literal": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/strip-literal/-/strip-literal-2.1.1.tgz", - "integrity": "sha512-631UJ6O00eNGfMiWG78ck80dfBab8X6IVFB51jZK5Icd7XAs60Z5y7QdSd/wGIklnWvRbUNloVzhOKKmutxQ6Q==", - "dependencies": { - "js-tokens": "^9.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, - "node_modules/strip-literal/node_modules/js-tokens": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-9.0.1.tgz", - "integrity": "sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ==" - }, - "node_modules/sucrase": { - "version": "3.35.0", - "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.35.0.tgz", - "integrity": "sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==", - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.2", - "commander": "^4.0.0", - "glob": "^10.3.10", - "lines-and-columns": "^1.1.6", - "mz": "^2.7.0", - "pirates": "^4.0.1", - "ts-interface-checker": "^0.1.9" - }, - "bin": { - "sucrase": "bin/sucrase", - "sucrase-node": "bin/sucrase-node" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - } - }, - "node_modules/superjson": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/superjson/-/superjson-2.2.2.tgz", - "integrity": "sha512-5JRxVqC8I8NuOUjzBbvVJAKNM8qoVuH0O77h4WInc/qC2q5IreqKxYwgkga3PfA22OayK2ikceb/B26dztPl+Q==", - "dependencies": { - "copy-anything": "^3.0.2" - }, - "engines": { - "node": ">=16" - } - }, - "node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/supports-preserve-symlinks-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/symbol-tree": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", - "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==" - }, - "node_modules/tailwindcss": { - "version": "3.4.17", - "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.17.tgz", - "integrity": "sha512-w33E2aCvSDP0tW9RZuNXadXlkHXqFzSkQew/aIa2i/Sj8fThxwovwlXHSPXTbAHwEIhBFXAedUhP2tueAKP8Og==", - "dependencies": { - "@alloc/quick-lru": "^5.2.0", - "arg": "^5.0.2", - "chokidar": "^3.6.0", - "didyoumean": "^1.2.2", - "dlv": "^1.1.3", - "fast-glob": "^3.3.2", - "glob-parent": "^6.0.2", - "is-glob": "^4.0.3", - "jiti": "^1.21.6", - "lilconfig": "^3.1.3", - "micromatch": "^4.0.8", - "normalize-path": "^3.0.0", - "object-hash": "^3.0.0", - "picocolors": "^1.1.1", - "postcss": "^8.4.47", - "postcss-import": "^15.1.0", - "postcss-js": "^4.0.1", - "postcss-load-config": "^4.0.2", - "postcss-nested": "^6.2.0", - "postcss-selector-parser": "^6.1.2", - "resolve": "^1.22.8", - "sucrase": "^3.35.0" - }, - "bin": { - "tailwind": "lib/cli.js", - "tailwindcss": "lib/cli.js" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/tailwindcss/node_modules/postcss-selector-parser": { - "version": "6.1.2", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz", - "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==", - "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/thenify": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", - "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", - "dependencies": { - "any-promise": "^1.0.0" - } - }, - "node_modules/thenify-all": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", - "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", - "dependencies": { - "thenify": ">= 3.1.0 < 4" - }, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/through": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==" - }, - "node_modules/tinybench": { - "version": "2.9.0", - "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.9.0.tgz", - "integrity": "sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==" - }, - "node_modules/tinypool": { - "version": "0.8.4", - "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-0.8.4.tgz", - "integrity": "sha512-i11VH5gS6IFeLY3gMBQ00/MmLncVP7JLXOw1vlgkytLmJK7QnEr7NXf0LBdxfmNPAeyetukOk0bOYrJrFGjYJQ==", - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/tinyspy": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/tinyspy/-/tinyspy-2.2.1.tgz", - "integrity": "sha512-KYad6Vy5VDWV4GH3fjpseMQ/XU2BhIYP7Vzd0LG44qRWm/Yt2WCOTicFdvmgo6gWaqooMQCawTtILVQJupKu7A==", - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/tmp": { - "version": "0.0.33", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", - "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", - "dependencies": { - "os-tmpdir": "~1.0.2" - }, - "engines": { - "node": ">=0.6.0" - } - }, - "node_modules/to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dependencies": { - "is-number": "^7.0.0" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/toidentifier": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", - "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", - "engines": { - "node": ">=0.6" - } - }, - "node_modules/totalist": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/totalist/-/totalist-3.0.1.tgz", - "integrity": "sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==", - "engines": { - "node": ">=6" - } - }, - "node_modules/tough-cookie": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.4.tgz", - "integrity": "sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag==", - "dependencies": { - "psl": "^1.1.33", - "punycode": "^2.1.1", - "universalify": "^0.2.0", - "url-parse": "^1.5.3" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/tr46": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-4.1.1.tgz", - "integrity": "sha512-2lv/66T7e5yNyhAAC4NaKe5nVavzuGJQVVtRYLyQ2OI8tsJ61PMLlelehb0wi2Hx6+hT/OJUWZcw8MjlSRnxvw==", - "dependencies": { - "punycode": "^2.3.0" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/ts-interface-checker": { - "version": "0.1.13", - "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", - "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==" - }, - "node_modules/tslib": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", - "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==" - }, - "node_modules/type-detect": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.1.0.tgz", - "integrity": "sha512-Acylog8/luQ8L7il+geoSxhEkazvkslg7PSNKOX59mbB9cOveP5aq9h74Y7YU8yDpJwetzQQrfIwtf4Wp4LKcw==", - "engines": { - "node": ">=4" - } - }, - "node_modules/type-fest": { - "version": "2.19.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz", - "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==", - "engines": { - "node": ">=12.20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/type-is": { - "version": "1.6.18", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", - "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", - "dependencies": { - "media-typer": "0.3.0", - "mime-types": "~2.1.24" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/typescript": { - "version": "5.7.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.7.3.tgz", - "integrity": "sha512-84MVSjMEHP+FQRPy3pX9sTVV/INIex71s9TL2Gm5FG/WG1SqXeKyZ0k7/blY/4FdOzI12CBy1vGc4og/eus0fw==", - "devOptional": true, - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=14.17" - } - }, - "node_modules/ufo": { - "version": "1.5.4", - "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.5.4.tgz", - "integrity": "sha512-UsUk3byDzKd04EyoZ7U4DOlxQaD14JUKQl6/P7wiX4FNvUfm3XL246n9W5AmqwW5RSFJ27NAuM0iLscAOYUiGQ==" - }, - "node_modules/undici-types": { - "version": "6.20.0", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.20.0.tgz", - "integrity": "sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==" - }, - "node_modules/universalify": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz", - "integrity": "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==", - "engines": { - "node": ">= 4.0.0" - } - }, - "node_modules/unpipe": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/update-browserslist-db": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.2.tgz", - "integrity": "sha512-PPypAm5qvlD7XMZC3BujecnaOxwhrtoFR+Dqkk5Aa/6DssiH0ibKoketaj9w8LP7Bont1rYeoV5plxD7RTEPRg==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "dependencies": { - "escalade": "^3.2.0", - "picocolors": "^1.1.1" - }, - "bin": { - "update-browserslist-db": "cli.js" - }, - "peerDependencies": { - "browserslist": ">= 4.21.0" - } - }, - "node_modules/url-parse": { - "version": "1.5.10", - "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz", - "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==", - "dependencies": { - "querystringify": "^2.1.1", - "requires-port": "^1.0.0" - } - }, - "node_modules/use-sync-external-store": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.4.0.tgz", - "integrity": "sha512-9WXSPC5fMv61vaupRkCKCxsPxBocVnwakBEkMIHHpkTTg6icbJtg6jzgtLDm4bl3cSHAca52rYWih0k4K3PfHw==", - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" - } - }, - "node_modules/util": { - "version": "0.12.5", - "resolved": "https://registry.npmjs.org/util/-/util-0.12.5.tgz", - "integrity": "sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==", - "dependencies": { - "inherits": "^2.0.3", - "is-arguments": "^1.0.4", - "is-generator-function": "^1.0.7", - "is-typed-array": "^1.1.3", - "which-typed-array": "^1.1.2" - } - }, - "node_modules/util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" - }, - "node_modules/utils-merge": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", - "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/uuid": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", - "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", - "funding": [ - "https://github.com/sponsors/broofa", - "https://github.com/sponsors/ctavan" - ], - "bin": { - "uuid": "dist/bin/uuid" - } - }, - "node_modules/vary": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/vite": { - "version": "4.5.5", - "resolved": "https://registry.npmjs.org/vite/-/vite-4.5.5.tgz", - "integrity": "sha512-ifW3Lb2sMdX+WU91s3R0FyQlAyLxOzCSCP37ujw0+r5POeHPwe6udWVIElKQq8gk3t7b8rkmvqC6IHBpCff4GQ==", - "dev": true, - "dependencies": { - "esbuild": "^0.18.10", - "postcss": "^8.4.27", - "rollup": "^3.27.1" - }, - "bin": { - "vite": "bin/vite.js" - }, - "engines": { - "node": "^14.18.0 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/vitejs/vite?sponsor=1" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - }, - "peerDependencies": { - "@types/node": ">= 14", - "less": "*", - "lightningcss": "^1.21.0", - "sass": "*", - "stylus": "*", - "sugarss": "*", - "terser": "^5.4.0" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - }, - "less": { - "optional": true - }, - "lightningcss": { - "optional": true - }, - "sass": { - "optional": true - }, - "stylus": { - "optional": true - }, - "sugarss": { - "optional": true - }, - "terser": { - "optional": true - } - } - }, - "node_modules/vite-node": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-1.6.0.tgz", - "integrity": "sha512-de6HJgzC+TFzOu0NTC4RAIsyf/DY/ibWDYQUcuEA84EMHhcefTUGkjFHKKEJhQN4A+6I0u++kr3l36ZF2d7XRw==", - "dependencies": { - "cac": "^6.7.14", - "debug": "^4.3.4", - "pathe": "^1.1.1", - "picocolors": "^1.0.0", - "vite": "^5.0.0" - }, - "bin": { - "vite-node": "vite-node.mjs" - }, - "engines": { - "node": "^18.0.0 || >=20.0.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/vite-node/node_modules/@esbuild/android-arm": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz", - "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==", - "cpu": [ - "arm" - ], - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite-node/node_modules/@esbuild/android-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz", - "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite-node/node_modules/@esbuild/android-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz", - "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite-node/node_modules/@esbuild/darwin-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz", - "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite-node/node_modules/@esbuild/darwin-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz", - "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite-node/node_modules/@esbuild/freebsd-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz", - "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite-node/node_modules/@esbuild/freebsd-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz", - "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite-node/node_modules/@esbuild/linux-arm": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz", - "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==", - "cpu": [ - "arm" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite-node/node_modules/@esbuild/linux-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz", - "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite-node/node_modules/@esbuild/linux-ia32": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz", - "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==", - "cpu": [ - "ia32" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite-node/node_modules/@esbuild/linux-loong64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz", - "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==", - "cpu": [ - "loong64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite-node/node_modules/@esbuild/linux-mips64el": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz", - "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==", - "cpu": [ - "mips64el" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite-node/node_modules/@esbuild/linux-ppc64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz", - "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==", - "cpu": [ - "ppc64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite-node/node_modules/@esbuild/linux-riscv64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz", - "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==", - "cpu": [ - "riscv64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite-node/node_modules/@esbuild/linux-s390x": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz", - "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==", - "cpu": [ - "s390x" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite-node/node_modules/@esbuild/linux-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz", - "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite-node/node_modules/@esbuild/netbsd-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz", - "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite-node/node_modules/@esbuild/openbsd-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz", - "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite-node/node_modules/@esbuild/sunos-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz", - "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite-node/node_modules/@esbuild/win32-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz", - "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite-node/node_modules/@esbuild/win32-ia32": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz", - "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==", - "cpu": [ - "ia32" - ], - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite-node/node_modules/@esbuild/win32-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz", - "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite-node/node_modules/debug": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", - "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", - "dependencies": { - "ms": "^2.1.3" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/vite-node/node_modules/esbuild": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz", - "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==", - "hasInstallScript": true, - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=12" - }, - "optionalDependencies": { - "@esbuild/aix-ppc64": "0.21.5", - "@esbuild/android-arm": "0.21.5", - "@esbuild/android-arm64": "0.21.5", - "@esbuild/android-x64": "0.21.5", - "@esbuild/darwin-arm64": "0.21.5", - "@esbuild/darwin-x64": "0.21.5", - "@esbuild/freebsd-arm64": "0.21.5", - "@esbuild/freebsd-x64": "0.21.5", - "@esbuild/linux-arm": "0.21.5", - "@esbuild/linux-arm64": "0.21.5", - "@esbuild/linux-ia32": "0.21.5", - "@esbuild/linux-loong64": "0.21.5", - "@esbuild/linux-mips64el": "0.21.5", - "@esbuild/linux-ppc64": "0.21.5", - "@esbuild/linux-riscv64": "0.21.5", - "@esbuild/linux-s390x": "0.21.5", - "@esbuild/linux-x64": "0.21.5", - "@esbuild/netbsd-x64": "0.21.5", - "@esbuild/openbsd-x64": "0.21.5", - "@esbuild/sunos-x64": "0.21.5", - "@esbuild/win32-arm64": "0.21.5", - "@esbuild/win32-ia32": "0.21.5", - "@esbuild/win32-x64": "0.21.5" - } - }, - "node_modules/vite-node/node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" - }, - "node_modules/vite-node/node_modules/rollup": { - "version": "4.30.1", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.30.1.tgz", - "integrity": "sha512-mlJ4glW020fPuLi7DkM/lN97mYEZGWeqBnrljzN0gs7GLctqX3lNWxKQ7Gl712UAX+6fog/L3jh4gb7R6aVi3w==", - "dependencies": { - "@types/estree": "1.0.6" - }, - "bin": { - "rollup": "dist/bin/rollup" - }, - "engines": { - "node": ">=18.0.0", - "npm": ">=8.0.0" - }, - "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.30.1", - "@rollup/rollup-android-arm64": "4.30.1", - "@rollup/rollup-darwin-arm64": "4.30.1", - "@rollup/rollup-darwin-x64": "4.30.1", - "@rollup/rollup-freebsd-arm64": "4.30.1", - "@rollup/rollup-freebsd-x64": "4.30.1", - "@rollup/rollup-linux-arm-gnueabihf": "4.30.1", - "@rollup/rollup-linux-arm-musleabihf": "4.30.1", - "@rollup/rollup-linux-arm64-gnu": "4.30.1", - "@rollup/rollup-linux-arm64-musl": "4.30.1", - "@rollup/rollup-linux-loongarch64-gnu": "4.30.1", - "@rollup/rollup-linux-powerpc64le-gnu": "4.30.1", - "@rollup/rollup-linux-riscv64-gnu": "4.30.1", - "@rollup/rollup-linux-s390x-gnu": "4.30.1", - "@rollup/rollup-linux-x64-gnu": "4.30.1", - "@rollup/rollup-linux-x64-musl": "4.30.1", - "@rollup/rollup-win32-arm64-msvc": "4.30.1", - "@rollup/rollup-win32-ia32-msvc": "4.30.1", - "@rollup/rollup-win32-x64-msvc": "4.30.1", - "fsevents": "~2.3.2" - } - }, - "node_modules/vite-node/node_modules/vite": { - "version": "5.4.11", - "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.11.tgz", - "integrity": "sha512-c7jFQRklXua0mTzneGW9QVyxFjUgwcihC4bXEtujIo2ouWCe1Ajt/amn2PCxYnhYfd5k09JX3SB7OYWFKYqj8Q==", - "dependencies": { - "esbuild": "^0.21.3", - "postcss": "^8.4.43", - "rollup": "^4.20.0" - }, - "bin": { - "vite": "bin/vite.js" - }, - "engines": { - "node": "^18.0.0 || >=20.0.0" - }, - "funding": { - "url": "https://github.com/vitejs/vite?sponsor=1" - }, - "optionalDependencies": { - "fsevents": "~2.3.3" - }, - "peerDependencies": { - "@types/node": "^18.0.0 || >=20.0.0", - "less": "*", - "lightningcss": "^1.21.0", - "sass": "*", - "sass-embedded": "*", - "stylus": "*", - "sugarss": "*", - "terser": "^5.4.0" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - }, - "less": { - "optional": true - }, - "lightningcss": { - "optional": true - }, - "sass": { - "optional": true - }, - "sass-embedded": { - "optional": true - }, - "stylus": { - "optional": true - }, - "sugarss": { - "optional": true - }, - "terser": { - "optional": true - } - } - }, - "node_modules/vitest": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/vitest/-/vitest-1.6.0.tgz", - "integrity": "sha512-H5r/dN06swuFnzNFhq/dnz37bPXnq8xB2xB5JOVk8K09rUtoeNN+LHWkoQ0A/i3hvbUKKcCei9KpbxqHMLhLLA==", - "dependencies": { - "@vitest/expect": "1.6.0", - "@vitest/runner": "1.6.0", - "@vitest/snapshot": "1.6.0", - "@vitest/spy": "1.6.0", - "@vitest/utils": "1.6.0", - "acorn-walk": "^8.3.2", - "chai": "^4.3.10", - "debug": "^4.3.4", - "execa": "^8.0.1", - "local-pkg": "^0.5.0", - "magic-string": "^0.30.5", - "pathe": "^1.1.1", - "picocolors": "^1.0.0", - "std-env": "^3.5.0", - "strip-literal": "^2.0.0", - "tinybench": "^2.5.1", - "tinypool": "^0.8.3", - "vite": "^5.0.0", - "vite-node": "1.6.0", - "why-is-node-running": "^2.2.2" - }, - "bin": { - "vitest": "vitest.mjs" - }, - "engines": { - "node": "^18.0.0 || >=20.0.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - }, - "peerDependencies": { - "@edge-runtime/vm": "*", - "@types/node": "^18.0.0 || >=20.0.0", - "@vitest/browser": "1.6.0", - "@vitest/ui": "1.6.0", - "happy-dom": "*", - "jsdom": "*" - }, - "peerDependenciesMeta": { - "@edge-runtime/vm": { - "optional": true - }, - "@types/node": { - "optional": true - }, - "@vitest/browser": { - "optional": true - }, - "@vitest/ui": { - "optional": true - }, - "happy-dom": { - "optional": true - }, - "jsdom": { - "optional": true - } - } - }, - "node_modules/vitest/node_modules/@esbuild/android-arm": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz", - "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==", - "cpu": [ - "arm" - ], - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vitest/node_modules/@esbuild/android-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz", - "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vitest/node_modules/@esbuild/android-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz", - "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vitest/node_modules/@esbuild/darwin-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz", - "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vitest/node_modules/@esbuild/darwin-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz", - "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vitest/node_modules/@esbuild/freebsd-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz", - "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vitest/node_modules/@esbuild/freebsd-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz", - "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vitest/node_modules/@esbuild/linux-arm": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz", - "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==", - "cpu": [ - "arm" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vitest/node_modules/@esbuild/linux-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz", - "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vitest/node_modules/@esbuild/linux-ia32": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz", - "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==", - "cpu": [ - "ia32" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vitest/node_modules/@esbuild/linux-loong64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz", - "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==", - "cpu": [ - "loong64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vitest/node_modules/@esbuild/linux-mips64el": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz", - "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==", - "cpu": [ - "mips64el" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vitest/node_modules/@esbuild/linux-ppc64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz", - "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==", - "cpu": [ - "ppc64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vitest/node_modules/@esbuild/linux-riscv64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz", - "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==", - "cpu": [ - "riscv64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vitest/node_modules/@esbuild/linux-s390x": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz", - "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==", - "cpu": [ - "s390x" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vitest/node_modules/@esbuild/linux-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz", - "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vitest/node_modules/@esbuild/netbsd-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz", - "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vitest/node_modules/@esbuild/openbsd-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz", - "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vitest/node_modules/@esbuild/sunos-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz", - "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vitest/node_modules/@esbuild/win32-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz", - "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vitest/node_modules/@esbuild/win32-ia32": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz", - "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==", - "cpu": [ - "ia32" - ], - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vitest/node_modules/@esbuild/win32-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz", - "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vitest/node_modules/debug": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", - "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", - "dependencies": { - "ms": "^2.1.3" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/vitest/node_modules/esbuild": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz", - "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==", - "hasInstallScript": true, - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=12" - }, - "optionalDependencies": { - "@esbuild/aix-ppc64": "0.21.5", - "@esbuild/android-arm": "0.21.5", - "@esbuild/android-arm64": "0.21.5", - "@esbuild/android-x64": "0.21.5", - "@esbuild/darwin-arm64": "0.21.5", - "@esbuild/darwin-x64": "0.21.5", - "@esbuild/freebsd-arm64": "0.21.5", - "@esbuild/freebsd-x64": "0.21.5", - "@esbuild/linux-arm": "0.21.5", - "@esbuild/linux-arm64": "0.21.5", - "@esbuild/linux-ia32": "0.21.5", - "@esbuild/linux-loong64": "0.21.5", - "@esbuild/linux-mips64el": "0.21.5", - "@esbuild/linux-ppc64": "0.21.5", - "@esbuild/linux-riscv64": "0.21.5", - "@esbuild/linux-s390x": "0.21.5", - "@esbuild/linux-x64": "0.21.5", - "@esbuild/netbsd-x64": "0.21.5", - "@esbuild/openbsd-x64": "0.21.5", - "@esbuild/sunos-x64": "0.21.5", - "@esbuild/win32-arm64": "0.21.5", - "@esbuild/win32-ia32": "0.21.5", - "@esbuild/win32-x64": "0.21.5" - } - }, - "node_modules/vitest/node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" - }, - "node_modules/vitest/node_modules/rollup": { - "version": "4.30.1", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.30.1.tgz", - "integrity": "sha512-mlJ4glW020fPuLi7DkM/lN97mYEZGWeqBnrljzN0gs7GLctqX3lNWxKQ7Gl712UAX+6fog/L3jh4gb7R6aVi3w==", - "dependencies": { - "@types/estree": "1.0.6" - }, - "bin": { - "rollup": "dist/bin/rollup" - }, - "engines": { - "node": ">=18.0.0", - "npm": ">=8.0.0" - }, - "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.30.1", - "@rollup/rollup-android-arm64": "4.30.1", - "@rollup/rollup-darwin-arm64": "4.30.1", - "@rollup/rollup-darwin-x64": "4.30.1", - "@rollup/rollup-freebsd-arm64": "4.30.1", - "@rollup/rollup-freebsd-x64": "4.30.1", - "@rollup/rollup-linux-arm-gnueabihf": "4.30.1", - "@rollup/rollup-linux-arm-musleabihf": "4.30.1", - "@rollup/rollup-linux-arm64-gnu": "4.30.1", - "@rollup/rollup-linux-arm64-musl": "4.30.1", - "@rollup/rollup-linux-loongarch64-gnu": "4.30.1", - "@rollup/rollup-linux-powerpc64le-gnu": "4.30.1", - "@rollup/rollup-linux-riscv64-gnu": "4.30.1", - "@rollup/rollup-linux-s390x-gnu": "4.30.1", - "@rollup/rollup-linux-x64-gnu": "4.30.1", - "@rollup/rollup-linux-x64-musl": "4.30.1", - "@rollup/rollup-win32-arm64-msvc": "4.30.1", - "@rollup/rollup-win32-ia32-msvc": "4.30.1", - "@rollup/rollup-win32-x64-msvc": "4.30.1", - "fsevents": "~2.3.2" - } - }, - "node_modules/vitest/node_modules/vite": { - "version": "5.4.11", - "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.11.tgz", - "integrity": "sha512-c7jFQRklXua0mTzneGW9QVyxFjUgwcihC4bXEtujIo2ouWCe1Ajt/amn2PCxYnhYfd5k09JX3SB7OYWFKYqj8Q==", - "dependencies": { - "esbuild": "^0.21.3", - "postcss": "^8.4.43", - "rollup": "^4.20.0" - }, - "bin": { - "vite": "bin/vite.js" - }, - "engines": { - "node": "^18.0.0 || >=20.0.0" - }, - "funding": { - "url": "https://github.com/vitejs/vite?sponsor=1" - }, - "optionalDependencies": { - "fsevents": "~2.3.3" - }, - "peerDependencies": { - "@types/node": "^18.0.0 || >=20.0.0", - "less": "*", - "lightningcss": "^1.21.0", - "sass": "*", - "sass-embedded": "*", - "stylus": "*", - "sugarss": "*", - "terser": "^5.4.0" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - }, - "less": { - "optional": true - }, - "lightningcss": { - "optional": true - }, - "sass": { - "optional": true - }, - "sass-embedded": { - "optional": true - }, - "stylus": { - "optional": true - }, - "sugarss": { - "optional": true - }, - "terser": { - "optional": true - } - } - }, - "node_modules/w3c-xmlserializer": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-4.0.0.tgz", - "integrity": "sha512-d+BFHzbiCx6zGfz0HyQ6Rg69w9k19nviJspaj4yNscGjrHu94sVP+aRm75yEbCh+r2/yR+7q6hux9LVtbuTGBw==", - "dependencies": { - "xml-name-validator": "^4.0.0" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/wasp": { - "resolved": ".wasp/out/sdk/wasp", - "link": true - }, - "node_modules/wcwidth": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", - "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==", - "dependencies": { - "defaults": "^1.0.3" - } - }, - "node_modules/web-encoding": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/web-encoding/-/web-encoding-1.1.5.tgz", - "integrity": "sha512-HYLeVCdJ0+lBYV2FvNZmv3HJ2Nt0QYXqZojk3d9FJOLkwnuhzM9tmamh8d7HPM8QqjKH8DeHkFTx+CFlWpZZDA==", - "dependencies": { - "util": "^0.12.3" - }, - "optionalDependencies": { - "@zxing/text-encoding": "0.9.0" - } - }, - "node_modules/webidl-conversions": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", - "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==", - "engines": { - "node": ">=12" - } - }, - "node_modules/whatwg-encoding": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-2.0.0.tgz", - "integrity": "sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg==", - "dependencies": { - "iconv-lite": "0.6.3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/whatwg-encoding/node_modules/iconv-lite": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", - "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/whatwg-mimetype": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-3.0.0.tgz", - "integrity": "sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q==", - "engines": { - "node": ">=12" - } - }, - "node_modules/whatwg-url": { - "version": "12.0.1", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-12.0.1.tgz", - "integrity": "sha512-Ed/LrqB8EPlGxjS+TrsXcpUond1mhccS3pchLhzSgPCnTimUCKj3IZE75pAs5m6heB2U2TMerKFUXheyHY+VDQ==", - "dependencies": { - "tr46": "^4.1.1", - "webidl-conversions": "^7.0.0" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/which-boxed-primitive": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.1.1.tgz", - "integrity": "sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==", - "dependencies": { - "is-bigint": "^1.1.0", - "is-boolean-object": "^1.2.1", - "is-number-object": "^1.1.1", - "is-string": "^1.1.1", - "is-symbol": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/which-collection": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.2.tgz", - "integrity": "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==", - "dependencies": { - "is-map": "^2.0.3", - "is-set": "^2.0.3", - "is-weakmap": "^2.0.2", - "is-weakset": "^2.0.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/which-typed-array": { - "version": "1.1.18", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.18.tgz", - "integrity": "sha512-qEcY+KJYlWyLH9vNbsr6/5j59AXk5ni5aakf8ldzBvGde6Iz4sxZGkJyWSAueTG7QhOvNRYb1lDdFmL5Td0QKA==", - "dependencies": { - "available-typed-arrays": "^1.0.7", - "call-bind": "^1.0.8", - "call-bound": "^1.0.3", - "for-each": "^0.3.3", - "gopd": "^1.2.0", - "has-tostringtag": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/why-is-node-running": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-2.3.0.tgz", - "integrity": "sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==", - "dependencies": { - "siginfo": "^2.0.0", - "stackback": "0.0.2" - }, - "bin": { - "why-is-node-running": "cli.js" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/wrap-ansi": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", - "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", - "dependencies": { - "ansi-styles": "^6.1.0", - "string-width": "^5.0.1", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/wrap-ansi-cjs": { - "name": "wrap-ansi", - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/wrap-ansi-cjs/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/wrap-ansi-cjs/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" - }, - "node_modules/wrap-ansi-cjs/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/wrap-ansi-cjs/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/ws": { - "version": "8.18.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.0.tgz", - "integrity": "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==", - "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": ">=5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - }, - "node_modules/xml-name-validator": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-4.0.0.tgz", - "integrity": "sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==", - "engines": { - "node": ">=12" - } - }, - "node_modules/xmlchars": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", - "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==" - }, - "node_modules/xtend": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", - "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", - "engines": { - "node": ">=0.4" - } - }, - "node_modules/y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "engines": { - "node": ">=10" - } - }, - "node_modules/yaml": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.7.0.tgz", - "integrity": "sha512-+hSoy/QHluxmC9kCIJyL/uyFmLmc+e5CFR5Wa+bpIhIj85LVb9ZH2nVnqrHoSvKogwODv0ClqZkmiSSaIH5LTA==", - "bin": { - "yaml": "bin.mjs" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/yargs": { - "version": "17.7.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", - "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", - "dependencies": { - "cliui": "^8.0.1", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.3", - "y18n": "^5.0.5", - "yargs-parser": "^21.1.1" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/yargs-parser": { - "version": "21.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", - "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", - "engines": { - "node": ">=12" - } - }, - "node_modules/yargs/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/yargs/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" - }, - "node_modules/yargs/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/yargs/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/yocto-queue": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.1.1.tgz", - "integrity": "sha512-b4JR1PFR10y1mKjhHY9LaGo6tmrgjit7hxVIeAmyMw3jegXR4dhYqLaQF5zMXZxY7tLpMyJeLjr1C4rLmkVe8g==", - "engines": { - "node": ">=12.20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/zod": { - "version": "3.24.1", - "resolved": "https://registry.npmjs.org/zod/-/zod-3.24.1.tgz", - "integrity": "sha512-muH7gBL9sI1nciMZV67X5fTKKBLtwpZ5VBp1vsOQzj1MhrBZ4wlVCm3gedKZWLp0Oyel8sIGfeiz54Su+OVT+A==", - "funding": { - "url": "https://github.com/sponsors/colinhacks" - } - } - } -} diff --git a/waspc/headless-test/examples/todoApp/package.json b/waspc/headless-test/examples/todoApp/package.json deleted file mode 100644 index 15751e4481..0000000000 --- a/waspc/headless-test/examples/todoApp/package.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "name": "todo-app", - "dependencies": { - "@tailwindcss/forms": "^0.5.3", - "@tailwindcss/typography": "^0.5.7", - "react": "^18.2.0", - "react-dom": "^18.2.0", - "react-router-dom": "^6.26.2", - "wasp": "file:.wasp/out/sdk/wasp" - }, - "devDependencies": { - "@types/cors": "^2.8.5", - "@types/express": "^4.17.13", - "@types/react": "^18.0.37", - "prisma": "5.19.1", - "typescript": "^5.1.0", - "vite": "^4.3.9" - } -} diff --git a/waspc/headless-test/examples/todoApp/postcss.config.cjs b/waspc/headless-test/examples/todoApp/postcss.config.cjs deleted file mode 100644 index 33ad091d26..0000000000 --- a/waspc/headless-test/examples/todoApp/postcss.config.cjs +++ /dev/null @@ -1,6 +0,0 @@ -module.exports = { - plugins: { - tailwindcss: {}, - autoprefixer: {}, - }, -} diff --git a/waspc/headless-test/examples/todoApp/prettier.config.js b/waspc/headless-test/examples/todoApp/prettier.config.js deleted file mode 100644 index abcda7180c..0000000000 --- a/waspc/headless-test/examples/todoApp/prettier.config.js +++ /dev/null @@ -1,6 +0,0 @@ -module.exports = { - trailingComma: 'es5', - tabWidth: 2, - semi: false, - singleQuote: true, -} diff --git a/waspc/headless-test/examples/todoApp/public/.gitkeep b/waspc/headless-test/examples/todoApp/public/.gitkeep deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/waspc/headless-test/examples/todoApp/schema.prisma b/waspc/headless-test/examples/todoApp/schema.prisma deleted file mode 100644 index bbcea3fa81..0000000000 --- a/waspc/headless-test/examples/todoApp/schema.prisma +++ /dev/null @@ -1,25 +0,0 @@ -// Wasp uses the datasource you specify but overwrites the `url` field. -datasource db { - provider = "postgresql" - url = env("DATABASE_URL") -} - -// Wasp requires the `prisma-client-js` generator to be present. -generator client { - provider = "prisma-client-js" -} - -model User { - id Int @id @default(autoincrement()) - isOnAfterSignupHookCalled Boolean @default(false) - isOnAfterLoginHookCalled Boolean @default(false) - tasks Task[] -} - -model Task { - id Int @id @default(autoincrement()) - description String - isDone Boolean @default(false) - user User @relation(fields: [userId], references: [id]) - userId Int -} diff --git a/waspc/headless-test/examples/todoApp/src/.waspignore b/waspc/headless-test/examples/todoApp/src/.waspignore deleted file mode 100644 index 1c432f30d9..0000000000 --- a/waspc/headless-test/examples/todoApp/src/.waspignore +++ /dev/null @@ -1,3 +0,0 @@ -# Ignore editor tmp files -**/*~ -**/#*# diff --git a/waspc/headless-test/examples/todoApp/src/auth/hooks.ts b/waspc/headless-test/examples/todoApp/src/auth/hooks.ts deleted file mode 100644 index 736195cab9..0000000000 --- a/waspc/headless-test/examples/todoApp/src/auth/hooks.ts +++ /dev/null @@ -1,37 +0,0 @@ -import { HttpError } from 'wasp/server' -import type { - OnAfterSignupHook, - OnBeforeSignupHook, - OnBeforeLoginHook, - OnAfterLoginHook, -} from 'wasp/server/auth' - -export const onBeforeSignup: OnBeforeSignupHook = async ({ providerId }) => { - if (providerId.providerUserId === 'notallowed@email.com') { - throw new HttpError(403, 'On Before Signup Hook disallows this email.') - } -} - -export const onAfterSignup: OnAfterSignupHook = async ({ prisma, user }) => { - await prisma.user.update({ - where: { id: user.id }, - data: { - isOnAfterSignupHookCalled: true, - }, - }) -} - -export const onBeforeLogin: OnBeforeLoginHook = async ({ providerId }) => { - if (providerId.providerUserId === 'cantlogin@email.com') { - throw new HttpError(403, 'On Before Login Hook disallows this email.') - } -} - -export const onAfterLogin: OnAfterLoginHook = async ({ prisma, user }) => { - await prisma.user.update({ - where: { id: user.id }, - data: { - isOnAfterLoginHookCalled: true, - }, - }) -} diff --git a/waspc/headless-test/examples/todoApp/src/client/App.tsx b/waspc/headless-test/examples/todoApp/src/client/App.tsx deleted file mode 100644 index 1c0e690c4d..0000000000 --- a/waspc/headless-test/examples/todoApp/src/client/App.tsx +++ /dev/null @@ -1,42 +0,0 @@ -import { Outlet } from 'react-router-dom' - -import { Link } from 'wasp/client/router' -import { logout, useAuth } from 'wasp/client/auth' -import { useQuery, getDate } from 'wasp/client/operations' - -import './Main.css' -import { getName } from './user' - -export function App() { - const { data: user } = useAuth() - const { data: date } = useQuery(getDate) - - const name = user ? getName(user) : null - - return ( -
-
-

- ToDo App -

-

Your site was loaded at: {date?.toLocaleString()}

- {user && ( -
-
- Hello, {name} -
-
- -
-
- )} -
-
- -
-
Created with Wasp
-
- ) -} diff --git a/waspc/headless-test/examples/todoApp/src/client/Main.css b/waspc/headless-test/examples/todoApp/src/client/Main.css deleted file mode 100644 index f2dd1cc826..0000000000 --- a/waspc/headless-test/examples/todoApp/src/client/Main.css +++ /dev/null @@ -1,46 +0,0 @@ -@tailwind base; -@tailwind components; -@tailwind utilities; - -@layer base { - body { - @apply m-2; - } - a { - @apply underline text-blue-600 hover:text-blue-800 visited:text-purple-600; - } - input[type="text"], - input[type="password"] { - @apply rounded; - } - input[type="submit"] { - @apply btn btn-primary; - } - form.auth-form input { - @apply my-2; - } - input[type="checkbox"] { - @apply appearance-none h-4 w-4 border border-gray-300 rounded-sm bg-white checked:bg-blue-600 checked:border-blue-600 focus:outline-none transition duration-200 mt-1 align-top bg-no-repeat bg-center bg-contain float-left mr-2 cursor-pointer; - } - h1 { - @apply text-2xl; - } - h2 { - @apply text-xl; - } -} - -@layer components { - .btn { - @apply font-bold py-2 px-4 rounded; - } - .btn-primary { - @apply bg-blue-500 text-white; - } - .btn-red { - @apply bg-red-500 text-white; - } - .btn-primary:hover { - @apply bg-blue-600; - } -} diff --git a/waspc/headless-test/examples/todoApp/src/client/Todo.tsx b/waspc/headless-test/examples/todoApp/src/client/Todo.tsx deleted file mode 100644 index f1ff4931e4..0000000000 --- a/waspc/headless-test/examples/todoApp/src/client/Todo.tsx +++ /dev/null @@ -1,234 +0,0 @@ -import { Link } from 'wasp/client/router' - -import { - useAction, - type OptimisticUpdateDefinition, - createTask, - updateTaskIsDone, - deleteCompletedTasks, - toggleAllTasks, - useQuery, - getTasks, -} from 'wasp/client/operations' - -import React, { useState, FormEventHandler, ChangeEventHandler } from 'react' -import { getEmail } from 'wasp/auth' - -type NonEmptyArray = [T, ...T[]] - -type TaskWithUser = Awaited>[number] - -export function areThereAnyTasks( - tasks: TaskWithUser[] | undefined -): tasks is NonEmptyArray { - return !!(tasks && tasks.length > 0) -} - -const Todo = () => { - const { data: tasks, isError, error: tasksError } = useQuery(getTasks) - - const TasksError = () => { - return ( -
{'Error during fetching tasks: ' + (tasksError?.message || '')}
- ) - } - - return ( -
-
-

Todos

- -
- - -
- - {isError && } - - {areThereAnyTasks(tasks) && ( - <> - - -
- - )} -
-
- ) -} - -const Footer = ({ tasks }: { tasks: NonEmptyArray }) => { - const numCompletedTasks = tasks.filter((t) => t.isDone).length - const numUncompletedTasks = tasks.filter((t) => !t.isDone).length - - const handleDeleteCompletedTasks = async () => { - try { - await deleteCompletedTasks() - } catch (err) { - console.log(err) - } - } - - return ( -
-
{numUncompletedTasks} items left
- -
- -
-
- ) -} - -const Tasks = ({ tasks }: { tasks: NonEmptyArray }) => { - return ( -
-
@@ -164,7 +147,7 @@ const TaskView = ({ task }: { task: Task }) => { - {task.description} + {task.description} {email && `by ${email}`}
- - {tasks.map((task, idx) => ( - - ))} - -
-
- ) -} - -type UpdateTaskIsDonePayload = Pick - -const TaskView = ({ task }: { task: TaskWithUser }) => { - const updateTaskIsDoneOptimistically = useAction(updateTaskIsDone, { - optimisticUpdates: [ - { - getQuerySpecifier: () => [getTasks], - updateQuery: (updatedTask, oldTasks) => { - if (oldTasks === undefined) { - // cache is empty - return [{ ...task, ...updatedTask }] - } else { - return oldTasks.map((task) => - task.id === updatedTask.id ? { ...task, ...updatedTask } : task - ) - } - }, - } as OptimisticUpdateDefinition, - ], - }) - const handleTaskIsDoneChange: ChangeEventHandler = async ( - event - ) => { - const id = parseInt(event.target.id) - const isDone = event.target.checked - - try { - await updateTaskIsDoneOptimistically({ id, isDone }) - } catch (err) { - console.log(err) - } - } - - const email = getEmail(task.user) - - return ( - - - - - - - {task.description} {email && `by ${email}`} - - - - ) -} - -const NewTaskForm = () => { - const defaultDescription = '' - const [description, setDescription] = useState(defaultDescription) - const createTaskFn = useAction(createTask, { - optimisticUpdates: [ - { - getQuerySpecifier: () => [getTasks], - updateQuery: (newTask, oldTasks) => { - const newTaskWithUser = { - ...newTask, - user: {}, - } as TaskWithUser - - if (oldTasks === undefined) { - // cache is empty - return [newTaskWithUser] - } else { - return [...oldTasks, newTaskWithUser] - } - }, - } as OptimisticUpdateDefinition< - Pick, - TaskWithUser[] - >, - ], - }) - - const createNewTask = async (description: TaskWithUser['description']) => { - const task = { isDone: false, description } - await createTaskFn(task) - } - - const handleNewTaskSubmit: FormEventHandler = async ( - event - ) => { - event.preventDefault() - try { - setDescription(defaultDescription) - await createNewTask(description) - } catch (err) { - console.log(err) - } - } - - return ( -
- setDescription(e.target.value)} - /> - -
- ) -} - -const ToggleAllTasksButton = ({ disabled }: { disabled: boolean }) => { - const handleToggleAllTasks = async () => { - try { - await toggleAllTasks() - } catch (err) { - console.log(err) - } - } - - return ( - - ) -} - -export default Todo diff --git a/waspc/headless-test/examples/todoApp/src/client/clientSetup.js b/waspc/headless-test/examples/todoApp/src/client/clientSetup.js deleted file mode 100644 index b26f88034c..0000000000 --- a/waspc/headless-test/examples/todoApp/src/client/clientSetup.js +++ /dev/null @@ -1,6 +0,0 @@ -import { sayHi } from '../util' - -export default function setup() { - console.log('This was called from the client setup function') - sayHi() -} diff --git a/waspc/headless-test/examples/todoApp/src/client/pages/About.jsx b/waspc/headless-test/examples/todoApp/src/client/pages/About.jsx deleted file mode 100644 index 5bed6ef416..0000000000 --- a/waspc/headless-test/examples/todoApp/src/client/pages/About.jsx +++ /dev/null @@ -1,13 +0,0 @@ -import React from 'react' -import { Link } from "wasp/client/router"; - -const About = () => { - return ( - <> -
I am About page!
- Go to dashboard - - ) -} - -export default About diff --git a/waspc/headless-test/examples/todoApp/src/client/pages/CatchAll.tsx b/waspc/headless-test/examples/todoApp/src/client/pages/CatchAll.tsx deleted file mode 100644 index 94037b1eff..0000000000 --- a/waspc/headless-test/examples/todoApp/src/client/pages/CatchAll.tsx +++ /dev/null @@ -1,20 +0,0 @@ -import { useLocation } from 'react-router-dom' - -export function CatchAllPage() { - const location = useLocation() - - return ( -
-
-

Not found

-

- We couldn't find anything at the{' '} - - {location.pathname} - {' '} - location. -

-
-
- ) -} diff --git a/waspc/headless-test/examples/todoApp/src/client/pages/Main.jsx b/waspc/headless-test/examples/todoApp/src/client/pages/Main.jsx deleted file mode 100644 index 4dfa1a451f..0000000000 --- a/waspc/headless-test/examples/todoApp/src/client/pages/Main.jsx +++ /dev/null @@ -1,7 +0,0 @@ -import Todo from '../Todo' - -const Main = () => { - return -} - -export default Main diff --git a/waspc/headless-test/examples/todoApp/src/client/pages/ProfilePage.tsx b/waspc/headless-test/examples/todoApp/src/client/pages/ProfilePage.tsx deleted file mode 100644 index 93aab4d51e..0000000000 --- a/waspc/headless-test/examples/todoApp/src/client/pages/ProfilePage.tsx +++ /dev/null @@ -1,38 +0,0 @@ -import React, { useEffect } from 'react' -import { type AuthUser as User } from 'wasp/auth' -import { Link } from 'wasp/client/router' -import { api } from 'wasp/client/api' - -async function fetchCustomRoute() { - const res = await api.get('/foo/bar') - console.log(res.data) -} - -export const ProfilePage = ({ user }: { user: User }) => { - useEffect(() => { - fetchCustomRoute() - }, []) - - return ( - <> -

Profile page

-
- Hello {user.getFirstProviderUserId()}! Your status is{' '} - - {user.identities.email?.isEmailVerified ? 'verfied' : 'unverified'} - - . -
-
- Value of user.isOnAfterSignupHookCalled is{' '} - {user.isOnAfterSignupHookCalled ? 'true' : 'false'}. -
-
- Value of user.isOnAfterLoginHookCalled is{' '} - {user.isOnAfterLoginHookCalled ? 'true' : 'false'}. -
-
- Go to dashboard - - ) -} diff --git a/waspc/headless-test/examples/todoApp/src/client/pages/Task.tsx b/waspc/headless-test/examples/todoApp/src/client/pages/Task.tsx deleted file mode 100644 index 2f3910240d..0000000000 --- a/waspc/headless-test/examples/todoApp/src/client/pages/Task.tsx +++ /dev/null @@ -1,74 +0,0 @@ -import React from 'react' -import { useParams } from 'react-router-dom' -import { Link } from 'wasp/client/router' -import { type Task } from 'wasp/entities' - -import { - useAction, - type OptimisticUpdateDefinition, - updateTaskIsDone, - useQuery, - getTask, - getTasks, -} from 'wasp/client/operations' - - -type TaskPayload = Pick - -const Todo = () => { - const { id } = useParams() - const taskId = parseInt(id!) - - const { data: task, isFetching, error } = useQuery(getTask, { id: taskId }) - - const updateTaskIsDoneOptimistically = useAction(updateTaskIsDone, { - optimisticUpdates: [ - { - getQuerySpecifier: () => [getTask, { id: taskId }], - // This query's cache should should never be emtpy - updateQuery: ({ isDone }, oldTask) => ({ ...oldTask!, isDone }), - } as OptimisticUpdateDefinition, - { - getQuerySpecifier: () => [getTasks], - updateQuery: (updatedTask, oldTasks) => - oldTasks && - oldTasks.map((task) => - task.id === updatedTask.id ? { ...task, ...updatedTask } : task - ), - } as OptimisticUpdateDefinition, - ], - }) - - if (!task) return
Task with id {taskId} does not exist.
- if (error) return
Error occurred! {error.message}
- - async function toggleIsDone({ id, isDone }: Task) { - try { - updateTaskIsDoneOptimistically({ id, isDone: !isDone }) - } catch (err) { - console.log(err) - } - } - - return ( - <> - {isFetching ? ( -
Fetching task ...
- ) : ( - <> -

Task

-
id: {task.id}
-
description: {task.description}
-
is done: {task.isDone ? 'Yes' : 'No'}
- - - )} -
- Go to dashboard - - ) -} - -export default Todo diff --git a/waspc/headless-test/examples/todoApp/src/client/pages/auth/EmailVerification.tsx b/waspc/headless-test/examples/todoApp/src/client/pages/auth/EmailVerification.tsx deleted file mode 100644 index 8be489bd0b..0000000000 --- a/waspc/headless-test/examples/todoApp/src/client/pages/auth/EmailVerification.tsx +++ /dev/null @@ -1,27 +0,0 @@ -import { Link } from "wasp/client/router"; - -import { VerifyEmailForm } from "wasp/client/auth"; -import appearance from './appearance' -import todoLogo from '../../todoLogo.png' - -export function EmailVerification() { - return ( -
-
-
-
- -
- - If everything is okay, go to login - -
-
-
-
- ) -} diff --git a/waspc/headless-test/examples/todoApp/src/client/pages/auth/Login.tsx b/waspc/headless-test/examples/todoApp/src/client/pages/auth/Login.tsx deleted file mode 100644 index 19868ff86b..0000000000 --- a/waspc/headless-test/examples/todoApp/src/client/pages/auth/Login.tsx +++ /dev/null @@ -1,35 +0,0 @@ -import { Link } from "wasp/client/router"; - -import { LoginForm } from "wasp/client/auth"; - -import appearance from './appearance' -import todoLogo from '../../todoLogo.png' - -const Login = () => { - return ( -
-
-
-
- -
- - Don't have an account yet? go to signup. - -
- - Forgot your password?{' '} - reset it. - -
-
-
-
- ) -} - -export default Login diff --git a/waspc/headless-test/examples/todoApp/src/client/pages/auth/PasswordReset.tsx b/waspc/headless-test/examples/todoApp/src/client/pages/auth/PasswordReset.tsx deleted file mode 100644 index b81413710b..0000000000 --- a/waspc/headless-test/examples/todoApp/src/client/pages/auth/PasswordReset.tsx +++ /dev/null @@ -1,27 +0,0 @@ -import { Link } from "wasp/client/router"; - -import { ResetPasswordForm } from "wasp/client/auth"; -import appearance from './appearance' -import todoLogo from '../../todoLogo.png' - -export function PasswordReset() { - return ( -
-
-
-
- -
- - If everything is okay, go to login - -
-
-
-
- ) -} diff --git a/waspc/headless-test/examples/todoApp/src/client/pages/auth/RequestPasswordReset.tsx b/waspc/headless-test/examples/todoApp/src/client/pages/auth/RequestPasswordReset.tsx deleted file mode 100644 index 04340687b8..0000000000 --- a/waspc/headless-test/examples/todoApp/src/client/pages/auth/RequestPasswordReset.tsx +++ /dev/null @@ -1,21 +0,0 @@ -import { ForgotPasswordForm } from "wasp/client/auth"; -import appearance from './appearance' -import todoLogo from '../../todoLogo.png' - -export function RequestPasswordReset() { - return ( -
-
-
-
- -
-
-
-
- ) -} diff --git a/waspc/headless-test/examples/todoApp/src/client/pages/auth/Signup.tsx b/waspc/headless-test/examples/todoApp/src/client/pages/auth/Signup.tsx deleted file mode 100644 index 0e06adddc8..0000000000 --- a/waspc/headless-test/examples/todoApp/src/client/pages/auth/Signup.tsx +++ /dev/null @@ -1,37 +0,0 @@ -import { Link } from "wasp/client/router"; -import { SignupForm } from "wasp/client/auth"; -import { useQuery, getNumTasks } from "wasp/client/operations"; -import { getTotalTaskCountMessage } from './helpers' - -import appearance from './appearance' -import todoLogo from '../../todoLogo.png' - -const Signup = () => { - const { data: numTasks } = useQuery(getNumTasks) - - return ( -
-
-
-
- -
- - I already have an account (go to login). - -
-
-
-
- {getTotalTaskCountMessage(numTasks)} -
-
-
- ) -} - -export default Signup diff --git a/waspc/headless-test/examples/todoApp/src/client/pages/auth/appearance.js b/waspc/headless-test/examples/todoApp/src/client/pages/auth/appearance.js deleted file mode 100644 index 8498d31873..0000000000 --- a/waspc/headless-test/examples/todoApp/src/client/pages/auth/appearance.js +++ /dev/null @@ -1,9 +0,0 @@ -const appearance = { - colors: { - brand: '#5969b8', // blue - brandAccent: '#de5998', // pink - submitButtonText: 'white', - }, -} - -export default appearance diff --git a/waspc/headless-test/examples/todoApp/src/client/pages/auth/helpers.ts b/waspc/headless-test/examples/todoApp/src/client/pages/auth/helpers.ts deleted file mode 100644 index ee4cc5b659..0000000000 --- a/waspc/headless-test/examples/todoApp/src/client/pages/auth/helpers.ts +++ /dev/null @@ -1,12 +0,0 @@ -export function getTotalTaskCountMessage(numTasks?: number): string { - if (numTasks === undefined) { - return '' - } - if (numTasks === 0) { - return 'No tasks created, yet.' - } - if (numTasks === 1) { - return 'There is just one task.' - } - return `There are ${numTasks} tasks created so far.` -} diff --git a/waspc/headless-test/examples/todoApp/src/client/todoLogo.png b/waspc/headless-test/examples/todoApp/src/client/todoLogo.png deleted file mode 100644 index 809bd97a8e26b683010355c9be708e08486305ba..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 76853 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 diff --git a/waspc/headless-test/examples/todoApp/src/client/user.ts b/waspc/headless-test/examples/todoApp/src/client/user.ts deleted file mode 100644 index 2e16e77066..0000000000 --- a/waspc/headless-test/examples/todoApp/src/client/user.ts +++ /dev/null @@ -1,19 +0,0 @@ -import { type AuthUser } from 'wasp/auth' - -export function getName(user?: AuthUser) { - if (!user) { - return null - } - - // We use multiple auth methods, so we need to check which one is available. - if (user.identities.email !== null) { - return user.identities.email.id - } - - if (user.identities.google !== null) { - return `Google user ${user.identities.google.id}` - } - - // If we don't know how to get the name, return null. - return null -} diff --git a/waspc/headless-test/examples/todoApp/src/server/actions.ts b/waspc/headless-test/examples/todoApp/src/server/actions.ts deleted file mode 100644 index 3b9f72ceee..0000000000 --- a/waspc/headless-test/examples/todoApp/src/server/actions.ts +++ /dev/null @@ -1,87 +0,0 @@ -import { type Task } from 'wasp/entities' -import { HttpError } from 'wasp/server' -import { - type CreateTask, - type DeleteCompletedTasks, - type ToggleAllTasks, - type UpdateTaskIsDone, -} from 'wasp/server/operations' -import { getSomeResource } from './serverSetup.js' - -export const createTask: CreateTask> = async ( - task, - context -) => { - if (!context.user) { - throw new HttpError(401) - } - - const Task = context.entities.Task - - console.log( - 'New task created! Btw, current value of someResource is: ' + - getSomeResource() - ) - - return Task.create({ - data: { - description: task.description, - user: { - connect: { id: context.user.id }, - }, - }, - }) -} - -export const updateTaskIsDone: UpdateTaskIsDone< - Pick -> = async ({ id, isDone }, context) => { - if (!context.user) { - throw new HttpError(401) - } - - // Uncomment to test optimistic updates - // const sleep = (ms) => new Promise(res => setTimeout(res, ms)) - // await sleep(3000); - - const Task = context.entities.Task - const updateResult = await Task.updateMany({ - where: { id, user: { id: context.user.id } }, - data: { isDone }, - }) - return updateResult -} - -export const deleteCompletedTasks: DeleteCompletedTasks = async ( - _args, - context -) => { - if (!context.user) { - throw new HttpError(401) - } - - const Task = context.entities.Task - await Task.deleteMany({ - where: { isDone: true, user: { id: context.user.id } }, - }) -} - -export const toggleAllTasks: ToggleAllTasks = async (_args, context) => { - if (!context.user) { - throw new HttpError(401) - } - - const userId = context.user.id - const whereIsDone = (isDone: boolean) => ({ - isDone, - user: { id: userId }, - }) - const Task = context.entities.Task - const notDoneTasksCount = await Task.count({ where: whereIsDone(false) }) - - if (notDoneTasksCount > 0) { - await Task.updateMany({ where: whereIsDone(false), data: { isDone: true } }) - } else { - await Task.updateMany({ where: whereIsDone(true), data: { isDone: false } }) - } -} diff --git a/waspc/headless-test/examples/todoApp/src/server/apis.ts b/waspc/headless-test/examples/todoApp/src/server/apis.ts deleted file mode 100644 index 32a98d3cb3..0000000000 --- a/waspc/headless-test/examples/todoApp/src/server/apis.ts +++ /dev/null @@ -1,55 +0,0 @@ -import { type MiddlewareConfigFn } from 'wasp/server' -import { type BarBaz, type FooBar, type WebhookCallback } from 'wasp/server/api' -import express from 'express' - -export const fooBar: FooBar = (_req, res, context) => { - const username = context?.user?.getFirstProviderUserId() ?? 'Anonymous' - res.json({ msg: `Hello, ${username}!` }) -} - -export const fooBarMiddlewareFn: MiddlewareConfigFn = (middlewareConfig) => { - // console.log('fooBarMiddlewareFn: Adding custom middleware for route.') - - const customMiddleware: express.RequestHandler = (_req, _res, next) => { - console.log('fooBarMiddlewareFn: custom route middleware') - next() - } - - middlewareConfig.set('custom.route', customMiddleware) - - return middlewareConfig -} - -export const barBaz: BarBaz = (_req, res, _context) => { - res.json({ msg: `Hello, stranger!` }) -} - -export const barNamespaceMiddlewareFn: MiddlewareConfigFn = ( - middlewareConfig -) => { - console.log('barNamespaceMiddlewareFn: Ignoring all default middleware.') - - middlewareConfig.set('custom.apiNamespace', (req, _res, next) => { - console.log( - `barNamespaceMiddlewareFn: custom middleware (path: ${req.path})` - ) - next() - }) - - return middlewareConfig -} - -export const webhookCallback: WebhookCallback = (req, res, _context) => { - res.json({ msg: req.body.length }) -} - -export const webhookCallbackMiddlewareFn: MiddlewareConfigFn = ( - middlewareConfig -) => { - // console.log('webhookCallbackMiddlewareFn: Swap express.json for express.raw') - - middlewareConfig.delete('express.json') - middlewareConfig.set('express.raw', express.raw({ type: '*/*' })) - - return middlewareConfig -} diff --git a/waspc/headless-test/examples/todoApp/src/server/auth/email.ts b/waspc/headless-test/examples/todoApp/src/server/auth/email.ts deleted file mode 100644 index 7b4fcf02a9..0000000000 --- a/waspc/headless-test/examples/todoApp/src/server/auth/email.ts +++ /dev/null @@ -1,23 +0,0 @@ -import { type GetVerificationEmailContentFn, type GetPasswordResetEmailContentFn } from "wasp/server/auth"; - -export const getPasswordResetEmailContent: GetPasswordResetEmailContentFn = ({ - passwordResetLink, -}) => ({ - subject: 'Password reset', - text: `Click the link below to reset your password: ${passwordResetLink}`, - html: ` -

Click the link below to reset your password

- Reset password - `, -}) - -export const getVerificationEmailContent: GetVerificationEmailContentFn = ({ - verificationLink, -}) => ({ - subject: 'Verify your email', - text: `Click the link below to verify your email: ${verificationLink}`, - html: ` -

Click the link below to verify your email

- Verify email - `, -}) diff --git a/waspc/headless-test/examples/todoApp/src/server/dbSeeds.ts b/waspc/headless-test/examples/todoApp/src/server/dbSeeds.ts deleted file mode 100644 index 051393a657..0000000000 --- a/waspc/headless-test/examples/todoApp/src/server/dbSeeds.ts +++ /dev/null @@ -1,35 +0,0 @@ -import { type DbSeedFn } from "wasp/server"; -import { createTask } from './actions.js' - -async function createUser (prismaClient, data) { - const { password, ...newUser } = await prismaClient.user.create({ data }) - return newUser -} - -export const devSeedSimple: DbSeedFn = async (prismaClient) => { - const user = await createUser(prismaClient, { - username: "martinsos", - password: "test1234" - }) - - await createTask( - { description: "My initial task" }, - { user, entities: { Task: prismaClient.task } } - ) - - console.log("Did simple dev seed!") -} - -export const prodSeed: DbSeedFn = async (prismaClient) => { - const user = await createUser(prismaClient, { - username: "martinsosProd", - password: "test1234prod" - }) - - await createTask( - { description: "My initial task in production" }, - { user, entities: { Task: prismaClient.task } } - ) - - console.log("Did seeding intended for production!") -} diff --git a/waspc/headless-test/examples/todoApp/src/server/jobs/bar.js b/waspc/headless-test/examples/todoApp/src/server/jobs/bar.js deleted file mode 100644 index 69997d7790..0000000000 --- a/waspc/headless-test/examples/todoApp/src/server/jobs/bar.js +++ /dev/null @@ -1,11 +0,0 @@ -export async function foo(args, context) { - console.log("Inside Job bar's callback foo: ", args, context) - await sleep(4000) - return { hello: 'world' } -} - -async function sleep(ms) { - return new Promise((resolve) => { - setTimeout(resolve, ms) - }) -} diff --git a/waspc/headless-test/examples/todoApp/src/server/queries.ts b/waspc/headless-test/examples/todoApp/src/server/queries.ts deleted file mode 100644 index 12030819f1..0000000000 --- a/waspc/headless-test/examples/todoApp/src/server/queries.ts +++ /dev/null @@ -1,74 +0,0 @@ -import { type Task } from 'wasp/entities' -import { HttpError } from 'wasp/server' -import { - type GetNumTasks, - type GetTask, - type GetTasks, - type GetDate, -} from 'wasp/server/operations' - -export const getTasks = (async (_args, context) => { - if (!context.user) { - throw new HttpError(401) - } - console.log('user who made the query: ', context.user) - console.log('TEST_ENV_VAR', process.env.TEST_ENV_VAR) - - const Task = context.entities.Task - const tasks = await Task.findMany({ - where: { user: { id: context.user.id } }, - orderBy: { id: 'asc' }, - include: { - user: { - include: { - auth: { - include: { - identities: { - select: { - providerName: true, - providerUserId: true, - }, - }, - }, - }, - }, - }, - }, - }) - return tasks -}) satisfies GetTasks - -export const getNumTasks: GetNumTasks = async ( - _args, - context -) => { - return context.entities.Task.count() -} - -export const getTask: GetTask, Task> = async ( - where, - context -) => { - if (!context.user) { - throw new HttpError(401) - } - - const Task = context.entities.Task - // NOTE(matija): we can't call findUnique() with the specific user, so we have to fetch user first - // and then manually check. - const task = await Task.findUnique({ where, include: { user: true } }) - if (!task) { - throw new HttpError(404) - } - // 404 is used to 'hide' the current existence of a forbidden target resource as a security measure - // for vulnerabilities like IDOR - if (task.user.id !== context.user.id) { - throw new HttpError(404) - } - - return task -} - -export const getDate: GetDate = async () => { - return new Date() -} diff --git a/waspc/headless-test/examples/todoApp/src/server/serverSetup.ts b/waspc/headless-test/examples/todoApp/src/server/serverSetup.ts deleted file mode 100644 index 9b202815af..0000000000 --- a/waspc/headless-test/examples/todoApp/src/server/serverSetup.ts +++ /dev/null @@ -1,54 +0,0 @@ -import { type Application } from 'express' -import { mySpecialJob } from 'wasp/server/jobs' -import { - config, - type MiddlewareConfigFn, - type ServerSetupFn, -} from 'wasp/server' -import { sayHi } from '../util.js' -import cors from 'cors' - -let someResource: string | undefined = undefined - -export const getSomeResource = () => someResource - -const setup: ServerSetupFn = async ({ app }) => { - addCustomRoute(app) - - sayHi() - await new Promise((resolve) => setTimeout(resolve, 2000)) - someResource = 'This resource is now set up.' - console.log('Custom server setup done!') - - console.log('Kicking off Job...') - // Or: const submittedJob = await mySpecialJob.delay(10).submit({ something: "here" }) - const submittedJob = await mySpecialJob.submit({ something: 'here' }) - console.log( - submittedJob.jobId, - submittedJob.job.jobName, - submittedJob.job.executorName - ) - console.log( - 'submittedJob.pgBoss.details()', - await submittedJob.pgBoss.details() - ) -} - -function addCustomRoute(app: Application) { - app.get('/customRoute', (_req, res) => { - res.set('Access-Control-Allow-Origin', 'example-cors-override.com') - res.removeHeader('X-Frame-Options') - res.send('I am a custom route') - }) -} - -export const serverMiddlewareFn: MiddlewareConfigFn = (middlewareConfig) => { - // Example of adding an extra domain to CORS. - middlewareConfig.set( - 'cors', - cors({ origin: [config.frontendUrl, 'http://127.0.0.1:3000'] }) - ) - return middlewareConfig -} - -export default setup diff --git a/waspc/headless-test/examples/todoApp/src/util.js b/waspc/headless-test/examples/todoApp/src/util.js deleted file mode 100644 index 76de186600..0000000000 --- a/waspc/headless-test/examples/todoApp/src/util.js +++ /dev/null @@ -1,3 +0,0 @@ -export function sayHi() { - console.log("This is coming from shared function.") -} diff --git a/waspc/headless-test/examples/todoApp/src/vite-env.d.ts b/waspc/headless-test/examples/todoApp/src/vite-env.d.ts deleted file mode 100644 index 11f02fe2a0..0000000000 --- a/waspc/headless-test/examples/todoApp/src/vite-env.d.ts +++ /dev/null @@ -1 +0,0 @@ -/// diff --git a/waspc/headless-test/examples/todoApp/tailwind.config.cjs b/waspc/headless-test/examples/todoApp/tailwind.config.cjs deleted file mode 100644 index 9a77b1cd0c..0000000000 --- a/waspc/headless-test/examples/todoApp/tailwind.config.cjs +++ /dev/null @@ -1,15 +0,0 @@ -const { resolveProjectPath } = require('wasp/dev') - -/** @type {import('tailwindcss').Config} */ -module.exports = { - content: [ - resolveProjectPath("./src/**/*.{js,jsx,ts,tsx}"), - ], - theme: { - extend: {}, - }, - plugins: [ - require('@tailwindcss/forms'), - require('@tailwindcss/typography'), - ], -} diff --git a/waspc/headless-test/examples/todoApp/todoApp.wasp b/waspc/headless-test/examples/todoApp/todoApp.wasp deleted file mode 100644 index a7c7850339..0000000000 --- a/waspc/headless-test/examples/todoApp/todoApp.wasp +++ /dev/null @@ -1,219 +0,0 @@ -app todoApp { - wasp: { - version: "^0.16.0" - }, - title: "ToDo App", - auth: { - userEntity: User, - methods: { - email: { - fromField: { - name: "ToDO App", - email: "mihovil@ilakovac.com" - }, - emailVerification: { - getEmailContentFn: import { getVerificationEmailContent } from "@src/server/auth/email.js", - clientRoute: EmailVerificationRoute, - }, - passwordReset: { - getEmailContentFn: import { getPasswordResetEmailContent } from "@src/server/auth/email.js", - clientRoute: PasswordResetRoute - } - }, - google: {} - }, - onAuthFailedRedirectTo: "/login", - onAuthSucceededRedirectTo: "/profile", - onBeforeSignup: import { onBeforeSignup } from "@src/auth/hooks.js", - onAfterSignup: import { onAfterSignup } from "@src/auth/hooks.js", - onBeforeLogin: import { onBeforeLogin } from "@src/auth/hooks.js", - onAfterLogin: import { onAfterLogin } from "@src/auth/hooks.js", - }, - server: { - setupFn: import setup from "@src/server/serverSetup.js", - middlewareConfigFn: import { serverMiddlewareFn } from "@src/server/serverSetup.js" - }, - client: { - rootComponent: import { App } from "@src/client/App.tsx", - setupFn: import setup from "@src/client/clientSetup.js" - }, - db: { - seeds: [ - import { devSeedSimple } from "@src/server/dbSeeds.js", - import { prodSeed } from "@src/server/dbSeeds.js" - ] - }, - emailSender: { - provider: SMTP, - defaultFrom: { - email: "mihovil@ilakovac.com" - }, - }, -} - -route SignupRoute { path: "/signup", to: SignupPage } -page SignupPage { - component: import Signup from "@src/client/pages/auth/Signup.tsx" -} - -route LoginRoute { path: "/login", to: LoginPage } -page LoginPage { - component: import Login from "@src/client/pages/auth/Login.tsx" -} - -route PasswordResetRoute { path: "/password-reset", to: PasswordResetPage } -page PasswordResetPage { - component: import { PasswordReset } from "@src/client/pages/auth/PasswordReset.tsx", -} - -route EmailVerificationRoute { path: "/email-verification-", to: EmailVerificationPage } -page EmailVerificationPage { - component: import { EmailVerification } from "@src/client/pages/auth/EmailVerification.tsx", -} - -route RequestPasswordResetRoute { path: "/request-password-reset", to: RequestPasswordResetPage } -page RequestPasswordResetPage { - component: import { RequestPasswordReset } from "@src/client/pages/auth/RequestPasswordReset.tsx", -} - -route HomeRoute { path: "/", to: MainPage } -page MainPage { - authRequired: true, - component: import Main from "@src/client/pages/Main.jsx" -} - -route AboutRoute { path: "/about", to: AboutPage } -page AboutPage { - component: import About from "@src/client/pages/About.jsx" -} - -route ProfileRoute { path: "/profile", to: ProfilePage } -page ProfilePage { - authRequired: true, - component: import { ProfilePage } from "@src/client/pages/ProfilePage.tsx" -} - -// Page for viewing a specific task -// -route TaskRoute { path: "/task/:id", to: TaskPage } -page TaskPage { - authRequired: true, - component: import Task from "@src/client/pages/Task.tsx" -} - -route CrudRoute { path: "/crud", to: Crud } -page Crud { - component: import { CrudTestPage } from "@src/client/pages/CrudTest.tsx", - authRequired: true -} - -route CatchAllRoute { path: "*", to: CatchAllPage } -page CatchAllPage { - component: import { CatchAllPage } from "@src/client/pages/CatchAll" -} - -// --------- Queries --------- // - -query getTasks { - fn: import { getTasks } from "@src/server/queries.js", - entities: [Task] -} - -api fooBar { - fn: import { fooBar } from "@src/server/apis.js", - middlewareConfigFn: import { fooBarMiddlewareFn } from "@src/server/apis.js", - entities: [Task], - // ALL here let's our CORS work. If we did GET, we would need an apiNamespace over it with CORS. - httpRoute: (ALL, "/foo/bar") -} - -apiNamespace bar { - middlewareConfigFn: import { barNamespaceMiddlewareFn } from "@src/server/apis.js", - path: "/bar" -} - -api barBaz { - fn: import { barBaz } from "@src/server/apis.js", - auth: false, - entities: [Task], - httpRoute: (GET, "/bar/baz") -} - -api webhookCallback { - fn: import { webhookCallback } from "@src/server/apis.js", - middlewareConfigFn: import { webhookCallbackMiddlewareFn } from "@src/server/apis.js", - httpRoute: (POST, "/webhook/callback"), - auth: false -} - -query getNumTasks { - fn: import { getNumTasks } from "@src/server/queries.js", - entities: [Task], - auth: false -} - -query getTask { - fn: import { getTask } from "@src/server/queries.js", - entities: [Task] -} - -query getDate { - fn: import { getDate } from "@src/server/queries.js" -} - -// --------- Actions --------- // - -action createTask { - fn: import { createTask } from "@src/server/actions.js", - entities: [Task] -} - -action updateTaskIsDone { - fn: import { updateTaskIsDone } from "@src/server/actions.js", - entities: [Task] -} - -action deleteCompletedTasks { - fn: import { deleteCompletedTasks } from "@src/server/actions.js", - entities: [Task] -} - -action toggleAllTasks { - fn: import { toggleAllTasks } from "@src/server/actions.js", - entities: [Task] -} - -job mySpecialJob { - executor: PgBoss, - perform: { - fn: import { foo } from "@src/server/jobs/bar.js", - executorOptions: { - pgBoss: {=json { "retryLimit": 1 } json=} - } - }, - entities: [Task] -} - -job mySpecialScheduledJob { - executor: PgBoss, - perform: { - fn: import { foo } from "@src/server/jobs/bar.js" - }, - schedule: { - cron: "0 * * * *", - args: {=json { "foo": "bar" } json=}, - executorOptions: { - pgBoss: {=json { "retryLimit": 2 } json=} - } - } -} - -crud Tasks { - entity: Task, - operations: { - getAll: { - overrideFn: import { getAllFilteredTasks } from "@src/server/crud" - }, - create: {} - } -} diff --git a/waspc/headless-test/examples/todoApp/tsconfig.json b/waspc/headless-test/examples/todoApp/tsconfig.json deleted file mode 100644 index e8f2a3eec6..0000000000 --- a/waspc/headless-test/examples/todoApp/tsconfig.json +++ /dev/null @@ -1,52 +0,0 @@ -// =============================== IMPORTANT ================================= -// This file is mainly used for Wasp IDE support. -// -// Wasp will compile your code with slightly different (less strict) compilerOptions. -// You can increase the configuration's strictness (e.g., by adding -// "noUncheckedIndexedAccess": true), but you shouldn't reduce it (e.g., by -// adding "strict": false). Just keep in mind that this will only affect your -// IDE support, not the actual compilation. -// -// Full TypeScript configurability is coming very soon :) -{ - "compilerOptions": { - "module": "esnext", - // Needed because this is used as a project reference. - "composite": true, - "target": "esnext", - // We're bundling all code in the end so this is the most appropriate option, - // it's also important for autocomplete to work properly. - "moduleResolution": "bundler", - // JSX support - "jsx": "preserve", - "strict": true, - // Allow default imports. - "esModuleInterop": true, - "lib": [ - "dom", - "dom.iterable", - "esnext" - ], - "skipLibCheck": true, - "allowJs": true, - "typeRoots": [ - // This is needed to properly support Vitest testing with jest-dom matchers. - // Types for jest-dom are not recognized automatically and Typescript complains - // about missing types e.g. when using `toBeInTheDocument` and other matchers. - "node_modules/@testing-library", - // Specifying type roots overrides the default behavior of looking at the - // node_modules/@types folder so we had to list it explicitly. - // Source 1: https://www.typescriptlang.org/tsconfig#typeRoots - // Source 2: https://github.com/testing-library/jest-dom/issues/546#issuecomment-1889884843 - "node_modules/@types" - ], - "outDir": ".wasp/out/user", - "paths" : { - "@util": ["./src/util.js"], - "@components/*": ["./src/components/*"], - } - }, - "include": [ - "src" - ] -} diff --git a/waspc/headless-test/examples/todoApp/vite.config.ts b/waspc/headless-test/examples/todoApp/vite.config.ts deleted file mode 100644 index 6e16a4c901..0000000000 --- a/waspc/headless-test/examples/todoApp/vite.config.ts +++ /dev/null @@ -1,7 +0,0 @@ -import { defineConfig } from "vite"; - -export default defineConfig({ - server: { - open: false, - }, -}); diff --git a/waspc/headless-test/package-lock.json b/waspc/headless-test/package-lock.json deleted file mode 100644 index 37b0a3f064..0000000000 --- a/waspc/headless-test/package-lock.json +++ /dev/null @@ -1,315 +0,0 @@ -{ - "name": "headless-test", - "version": "1.0.0", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "name": "headless-test", - "version": "1.0.0", - "license": "ISC", - "dependencies": { - "@prisma/client": "^4.12.0" - }, - "devDependencies": { - "@playwright/test": "^1.33.0", - "linebyline": "^1.3.0", - "prisma": "5.19.1", - "wait-port": "^1.0.4" - } - }, - "node_modules/@playwright/test": { - "version": "1.33.0", - "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.33.0.tgz", - "integrity": "sha512-YunBa2mE7Hq4CfPkGzQRK916a4tuZoVx/EpLjeWlTVOnD4S2+fdaQZE0LJkbfhN5FTSKNLdcl7MoT5XB37bTkg==", - "dev": true, - "dependencies": { - "@types/node": "*", - "playwright-core": "1.33.0" - }, - "bin": { - "playwright": "cli.js" - }, - "engines": { - "node": ">=14" - }, - "optionalDependencies": { - "fsevents": "2.3.2" - } - }, - "node_modules/@prisma/client": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/@prisma/client/-/client-4.12.0.tgz", - "integrity": "sha512-j9/ighfWwux97J2dS15nqhl60tYoH8V0IuSsgZDb6bCFcQD3fXbXmxjYC8GHhIgOk3lB7Pq+8CwElz2MiDpsSg==", - "hasInstallScript": true, - "dependencies": { - "@prisma/engines-version": "4.12.0-67.659ef412370fa3b41cd7bf6e94587c1dfb7f67e7" - }, - "engines": { - "node": ">=14.17" - }, - "peerDependencies": { - "prisma": "*" - }, - "peerDependenciesMeta": { - "prisma": { - "optional": true - } - } - }, - "node_modules/@prisma/debug": { - "version": "5.19.1", - "resolved": "https://registry.npmjs.org/@prisma/debug/-/debug-5.19.1.tgz", - "integrity": "sha512-lAG6A6QnG2AskAukIEucYJZxxcSqKsMK74ZFVfCTOM/7UiyJQi48v6TQ47d6qKG3LbMslqOvnTX25dj/qvclGg==", - "devOptional": true, - "license": "Apache-2.0" - }, - "node_modules/@prisma/engines": { - "version": "5.19.1", - "resolved": "https://registry.npmjs.org/@prisma/engines/-/engines-5.19.1.tgz", - "integrity": "sha512-kR/PoxZDrfUmbbXqqb8SlBBgCjvGaJYMCOe189PEYzq9rKqitQ2fvT/VJ8PDSe8tTNxhc2KzsCfCAL+Iwm/7Cg==", - "devOptional": true, - "hasInstallScript": true, - "license": "Apache-2.0", - "dependencies": { - "@prisma/debug": "5.19.1", - "@prisma/engines-version": "5.19.1-2.69d742ee20b815d88e17e54db4a2a7a3b30324e3", - "@prisma/fetch-engine": "5.19.1", - "@prisma/get-platform": "5.19.1" - } - }, - "node_modules/@prisma/engines-version": { - "version": "4.12.0-67.659ef412370fa3b41cd7bf6e94587c1dfb7f67e7", - "resolved": "https://registry.npmjs.org/@prisma/engines-version/-/engines-version-4.12.0-67.659ef412370fa3b41cd7bf6e94587c1dfb7f67e7.tgz", - "integrity": "sha512-JIHNj5jlXb9mcaJwakM0vpgRYJIAurxTUqM0iX0tfEQA5XLZ9ONkIckkhuAKdAzocZ+80GYg7QSsfpjg7OxbOA==" - }, - "node_modules/@prisma/engines/node_modules/@prisma/engines-version": { - "version": "5.19.1-2.69d742ee20b815d88e17e54db4a2a7a3b30324e3", - "resolved": "https://registry.npmjs.org/@prisma/engines-version/-/engines-version-5.19.1-2.69d742ee20b815d88e17e54db4a2a7a3b30324e3.tgz", - "integrity": "sha512-xR6rt+z5LnNqTP5BBc+8+ySgf4WNMimOKXRn6xfNRDSpHvbOEmd7+qAOmzCrddEc4Cp8nFC0txU14dstjH7FXA==", - "devOptional": true, - "license": "Apache-2.0" - }, - "node_modules/@prisma/fetch-engine": { - "version": "5.19.1", - "resolved": "https://registry.npmjs.org/@prisma/fetch-engine/-/fetch-engine-5.19.1.tgz", - "integrity": "sha512-pCq74rtlOVJfn4pLmdJj+eI4P7w2dugOnnTXpRilP/6n5b2aZiA4ulJlE0ddCbTPkfHmOL9BfaRgA8o+1rfdHw==", - "devOptional": true, - "license": "Apache-2.0", - "dependencies": { - "@prisma/debug": "5.19.1", - "@prisma/engines-version": "5.19.1-2.69d742ee20b815d88e17e54db4a2a7a3b30324e3", - "@prisma/get-platform": "5.19.1" - } - }, - "node_modules/@prisma/fetch-engine/node_modules/@prisma/engines-version": { - "version": "5.19.1-2.69d742ee20b815d88e17e54db4a2a7a3b30324e3", - "resolved": "https://registry.npmjs.org/@prisma/engines-version/-/engines-version-5.19.1-2.69d742ee20b815d88e17e54db4a2a7a3b30324e3.tgz", - "integrity": "sha512-xR6rt+z5LnNqTP5BBc+8+ySgf4WNMimOKXRn6xfNRDSpHvbOEmd7+qAOmzCrddEc4Cp8nFC0txU14dstjH7FXA==", - "devOptional": true, - "license": "Apache-2.0" - }, - "node_modules/@prisma/get-platform": { - "version": "5.19.1", - "resolved": "https://registry.npmjs.org/@prisma/get-platform/-/get-platform-5.19.1.tgz", - "integrity": "sha512-sCeoJ+7yt0UjnR+AXZL7vXlg5eNxaFOwC23h0KvW1YIXUoa7+W2ZcAUhoEQBmJTW4GrFqCuZ8YSP0mkDa4k3Zg==", - "devOptional": true, - "license": "Apache-2.0", - "dependencies": { - "@prisma/debug": "5.19.1" - } - }, - "node_modules/@types/node": { - "version": "18.16.3", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.16.3.tgz", - "integrity": "sha512-OPs5WnnT1xkCBiuQrZA4+YAV4HEJejmHneyraIaxsbev5yCEr6KMwINNFP9wQeFIw8FWcoTqF3vQsa5CDaI+8Q==", - "dev": true - }, - "node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/chalk/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/commander": { - "version": "9.5.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-9.5.0.tgz", - "integrity": "sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==", - "dev": true, - "engines": { - "node": "^12.20.0 || >=14" - } - }, - "node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", - "dev": true, - "hasInstallScript": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/linebyline": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/linebyline/-/linebyline-1.3.0.tgz", - "integrity": "sha512-3fpIYMrSU77OCf89hjXKuCx6vGwgWEu4N5DDCGqgZ1BF0HYy9V8IbQb/3+VWIU17iBQ83qQoUokH0AhPMOTi7w==", - "dev": true - }, - "node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "node_modules/playwright-core": { - "version": "1.33.0", - "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.33.0.tgz", - "integrity": "sha512-aizyPE1Cj62vAECdph1iaMILpT0WUDCq3E6rW6I+dleSbBoGbktvJtzS6VHkZ4DKNEOG9qJpiom/ZxO+S15LAw==", - "dev": true, - "bin": { - "playwright": "cli.js" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/prisma": { - "version": "5.19.1", - "resolved": "https://registry.npmjs.org/prisma/-/prisma-5.19.1.tgz", - "integrity": "sha512-c5K9MiDaa+VAAyh1OiYk76PXOme9s3E992D7kvvIOhCrNsBQfy2mP2QAQtX0WNj140IgG++12kwZpYB9iIydNQ==", - "devOptional": true, - "hasInstallScript": true, - "license": "Apache-2.0", - "dependencies": { - "@prisma/engines": "5.19.1" - }, - "bin": { - "prisma": "build/index.js" - }, - "engines": { - "node": ">=16.13" - }, - "optionalDependencies": { - "fsevents": "2.3.3" - } - }, - "node_modules/prisma/node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "node_modules/wait-port": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/wait-port/-/wait-port-1.0.4.tgz", - "integrity": "sha512-w8Ftna3h6XSFWWc2JC5gZEgp64nz8bnaTp5cvzbJSZ53j+omktWTDdwXxEF0jM8YveviLgFWvNGrSvRHnkyHyw==", - "dev": true, - "dependencies": { - "chalk": "^4.1.2", - "commander": "^9.3.0", - "debug": "^4.3.4" - }, - "bin": { - "wait-port": "bin/wait-port.js" - }, - "engines": { - "node": ">=10" - } - } - } -} diff --git a/waspc/headless-test/package.json b/waspc/headless-test/package.json deleted file mode 100644 index 9f8373669d..0000000000 --- a/waspc/headless-test/package.json +++ /dev/null @@ -1,26 +0,0 @@ -{ - "name": "headless-test", - "version": "1.0.0", - "description": "", - "main": "index.js", - "scripts": { - "example-app:start": "node start.js", - "example-app:start-db": "npm run example-app:cleanup-db && cd ./examples/todoApp && cabal run wasp-cli start db", - "example-app:start-app": "npm run example-app:wait-for-db && npm run example-app:prepare-env && cd ./examples/todoApp && cabal run wasp-cli db migrate-dev && cabal run wasp-cli start", - "example-app:wait-for-db": "sleep 5 && ./node_modules/.bin/wait-port 5432", - "example-app:prepare-env": "cp ./examples/todoApp/.env.server.example ./examples/todoApp/.env.server", - "example-app:cleanup-db": "(docker container rm $(docker container ls -f name=^wasp-dev-db-todoApp- -q) -f || true) && docker volume rm $(docker volume ls -f name=^wasp-dev-db-todoApp- -q) -f || true" - }, - "keywords": [], - "author": "", - "license": "ISC", - "devDependencies": { - "@playwright/test": "^1.33.0", - "prisma": "5.19.1", - "wait-port": "^1.0.4", - "linebyline": "^1.3.0" - }, - "dependencies": { - "@prisma/client": "^4.12.0" - } -} diff --git a/waspc/headless-test/start.js b/waspc/headless-test/start.js deleted file mode 100644 index 58585e9a65..0000000000 --- a/waspc/headless-test/start.js +++ /dev/null @@ -1,31 +0,0 @@ -const cp = require('child_process'); -const readline = require('linebyline'); - -function spawn(name, cmd, args, done) { - const spawnOptions = { - detached: true, - }; - const proc = cp.spawn(cmd, args, spawnOptions); - - // We close stdin stream on the new process because otherwise the start-app - // process hangs. - // See https://github.com/wasp-lang/wasp/pull/1218#issuecomment-1599098272. - proc.stdin.destroy(); - - readline(proc.stdout).on('line', data => { - console.log(`\x1b[0m\x1b[33m[${name}][out]\x1b[0m ${data}`); - }); - readline(proc.stderr).on('line', data => { - console.log(`\x1b[0m\x1b[33m[${name}][err]\x1b[0m ${data}`); - }); - proc.on('exit', done); -} - -// Exit if either child fails -const cb = (code) => { - if (code !== 0) { - process.exit(code); - } -} -spawn('app', 'npm', ['run', 'example-app:start-app'], cb); -spawn('db', 'npm', ['run', 'example-app:start-db'], cb) diff --git a/waspc/headless-test/tests/crud.spec.ts b/waspc/headless-test/tests/crud.spec.ts deleted file mode 100644 index 26507cdc20..0000000000 --- a/waspc/headless-test/tests/crud.spec.ts +++ /dev/null @@ -1,50 +0,0 @@ -import { test, expect } from "@playwright/test"; - -test.describe("CRUD test", () => { - const randomEmail = `test${Math.random().toString(36).substring(7)}@test.com`; - const password = "12345678"; - - test.describe.configure({ mode: "serial" }); - - test.beforeAll(async ({ browser }) => { - const page = await browser.newPage(); - - // Sign up - await page.goto("/signup"); - - await page.waitForSelector("text=Create a new account"); - - await page.locator("input[type='email']").fill(randomEmail); - await page.locator("input[type='password']").fill(password); - await page.locator("button").click(); - }); - - test("CRUD with override works", async ({ page }) => { - await page.goto("/login"); - - await page.waitForSelector("text=Log in to your account"); - - await page.locator("input[type='email']").fill(randomEmail); - await page.locator("input[type='password']").fill(password); - await page.getByRole("button", { name: "Log in" }).click(); - - await page.waitForSelector("text=Profile page"); - - await page.goto("/crud"); - - await page.waitForSelector("text=Tasks"); - - await createTask(page, "special filter 1"); - await createTask(page, "special filter 2"); - await createTask(page, "something else"); - - await expect(page.locator("body")).toContainText("special filter 1"); - await expect(page.locator("body")).toContainText("special filter 2"); - await expect(page.locator("li[text='something else']")).not.toBeVisible(); - }); -}); - -async function createTask(page: any, description: string) { - await page.locator("input[type='text']").fill(description); - await page.getByText("Create task").click(); -} diff --git a/waspc/headless-test/tests/simple.spec.ts b/waspc/headless-test/tests/simple.spec.ts deleted file mode 100644 index 637310fff4..0000000000 --- a/waspc/headless-test/tests/simple.spec.ts +++ /dev/null @@ -1,71 +0,0 @@ -import { test, expect } from "@playwright/test"; -import { - generateRandomCredentials, - performLogin, - performSignup, -} from "./helpers"; - -test("has title", async ({ page }) => { - await page.goto("/"); - - await expect(page).toHaveTitle(/ToDo App/); -}); -test.describe("signup and login", () => { - const { email, password } = generateRandomCredentials(); - - test.describe.configure({ mode: "serial" }); - - test("social button renders", async ({ page }) => { - await page.goto("/signup"); - - await page.waitForSelector("text=Create a new account"); - - await expect( - page.locator("a[href='http://localhost:3001/auth/google/login']") - ).toBeVisible(); - }); - - test("can sign up", async ({ page }) => { - await performSignup(page, { - email, - password, - }); - - await expect(page.locator("body")).toContainText( - `You've signed up successfully! Check your email for the confirmation link.` - ); - }); - - test("can log in and create a task", async ({ page }) => { - await performLogin(page, { - email, - password: "12345678xxx", - }); - - await expect(page.locator("body")).toContainText("Invalid credentials"); - - await performLogin(page, { - email, - password, - }); - - await expect(page).toHaveURL("/profile"); - - await page.goto("/"); - - // Create a new task - const randomTask = `New Task ${Math.random().toString(36).substring(7)}`; - await page.locator("input[type='text']").fill(randomTask); - await page.getByText("Create new task").click(); - - const fullTaskText = `${randomTask} by ${email}`; - await page.waitForSelector(`text=${fullTaskText}`); - - await expect(page.locator("body")).toContainText(fullTaskText); - - // Navigate to task page - await page.locator(`text=${fullTaskText}`).click(); - const taskPageText = `description: ${randomTask}`; - await page.waitForSelector(`text=${taskPageText}`); - }); -}); diff --git a/waspc/waspc.cabal b/waspc/waspc.cabal index d8af354554..a70ea00b5a 100644 --- a/waspc/waspc.cabal +++ b/waspc/waspc.cabal @@ -304,7 +304,6 @@ library Wasp.Generator.NpmInstall Wasp.Generator.NpmInstall.Common Wasp.Generator.NpmInstall.InstalledNpmDepsLog - Wasp.Generator.ImportPathAlias Wasp.Generator.SdkGenerator Wasp.Generator.SdkGenerator.Auth.AuthFormsG Wasp.Generator.SdkGenerator.Auth.EmailAuthG From b2be5c679467da0b55767a0db87924f66cc62678 Mon Sep 17 00:00:00 2001 From: Mihovil Ilakovac Date: Wed, 22 Jan 2025 16:57:18 +0100 Subject: [PATCH 02/20] Cleanup --- .github/workflows/waspc-ci.yaml | 2 +- headless-tests-runner/.gitignore | 2 +- waspc/examples/todoApp/.env.server.headless | 2 +- waspc/examples/todoApp/.gitignore | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/waspc-ci.yaml b/.github/workflows/waspc-ci.yaml index ed16226b26..534f4d523e 100644 --- a/.github/workflows/waspc-ci.yaml +++ b/.github/workflows/waspc-ci.yaml @@ -215,7 +215,7 @@ jobs: run: | cd examples/todoApp # Runs the tests with the debug flag so that we can see Wasp output - DEBUG=pw:webserver npx playwright test + DEBUG=pw:webserver npx playwright test --config headless-tests/ - name: Run e2e tests run: cabal test e2e-test diff --git a/headless-tests-runner/.gitignore b/headless-tests-runner/.gitignore index 8c31c44cdf..ae2f5329ed 100644 --- a/headless-tests-runner/.gitignore +++ b/headless-tests-runner/.gitignore @@ -1,2 +1,2 @@ node_modules/ -test-results/ \ No newline at end of file +test-results/ diff --git a/waspc/examples/todoApp/.env.server.headless b/waspc/examples/todoApp/.env.server.headless index eaf3dcef13..5608b32fd7 100644 --- a/waspc/examples/todoApp/.env.server.headless +++ b/waspc/examples/todoApp/.env.server.headless @@ -19,4 +19,4 @@ DISCORD_CLIENT_ID='dummy-discord-client-id' MY_ENV_VAR=123 -SKIP_EMAIL_VERIFICATION_IN_DEV=true \ No newline at end of file +SKIP_EMAIL_VERIFICATION_IN_DEV=true diff --git a/waspc/examples/todoApp/.gitignore b/waspc/examples/todoApp/.gitignore index 8ab92e45a0..b22070d255 100644 --- a/waspc/examples/todoApp/.gitignore +++ b/waspc/examples/todoApp/.gitignore @@ -21,4 +21,4 @@ node_modules/ # Headless tests !.env.*.headless -test-results/ \ No newline at end of file +test-results/ From 7f726f94cf02cb6d401f07c3bb33f7f39ff904c3 Mon Sep 17 00:00:00 2001 From: Mihovil Ilakovac Date: Wed, 22 Jan 2025 16:58:18 +0100 Subject: [PATCH 03/20] Fix CI --- .github/workflows/waspc-ci.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/waspc-ci.yaml b/.github/workflows/waspc-ci.yaml index 534f4d523e..51aa25fa47 100644 --- a/.github/workflows/waspc-ci.yaml +++ b/.github/workflows/waspc-ci.yaml @@ -178,7 +178,7 @@ jobs: npm ci - name: Headless - Setup the Wasp app runner - id: headless-install-dependencies + id: headless-setup-wasp-app-runner if: matrix.os == 'ubuntu-20.04' run: | cd ../headless-tests-runner From 6bc50ca8e392d05b3bdb3bad9d614e1f44daae6f Mon Sep 17 00:00:00 2001 From: Mihovil Ilakovac Date: Wed, 22 Jan 2025 17:36:34 +0100 Subject: [PATCH 04/20] Make sure apps outside of waspc can be started. --- examples/todo-typescript/.gitignore | 3 + .../headless-tests/playwright.config.ts | 55 ++++++++++++++ .../headless-tests/tests/helpers.ts | 43 +++++++++++ .../headless-tests/tests/simple.spec.ts | 56 ++++++++++++++ examples/todo-typescript/main.wasp | 2 +- examples/todo-typescript/package-lock.json | 74 +++++++++++++++++-- examples/todo-typescript/package.json | 1 + examples/todo-typescript/src/Main.css | 5 +- examples/todo-typescript/src/MainPage.tsx | 10 ++- examples/todo-typescript/tsconfig.json | 11 +-- headless-tests-runner/runApp.js | 60 +++++++++++---- waspc/examples/todo-typescript/src/Main.css | 5 +- .../examples/todo-typescript/src/MainPage.tsx | 2 +- 13 files changed, 289 insertions(+), 38 deletions(-) create mode 100644 examples/todo-typescript/headless-tests/playwright.config.ts create mode 100644 examples/todo-typescript/headless-tests/tests/helpers.ts create mode 100644 examples/todo-typescript/headless-tests/tests/simple.spec.ts diff --git a/examples/todo-typescript/.gitignore b/examples/todo-typescript/.gitignore index fd453426d8..2d87ab6f8a 100644 --- a/examples/todo-typescript/.gitignore +++ b/examples/todo-typescript/.gitignore @@ -9,3 +9,6 @@ node_modules/ # Don't ignore example dotenv files. !.env.example !.env.*.example + +# Headless tests +test-results/ \ No newline at end of file diff --git a/examples/todo-typescript/headless-tests/playwright.config.ts b/examples/todo-typescript/headless-tests/playwright.config.ts new file mode 100644 index 0000000000..5d1b7d92e1 --- /dev/null +++ b/examples/todo-typescript/headless-tests/playwright.config.ts @@ -0,0 +1,55 @@ +import { defineConfig, devices } from "@playwright/test"; + +/** + * Read environment variables from file. + * https://github.com/motdotla/dotenv + */ +// require('dotenv').config(); + +/** + * See https://playwright.dev/docs/test-configuration. + */ +export default defineConfig({ + testDir: "./tests", + /* Run tests in files in parallel */ + fullyParallel: true, + /* Fail the build on CI if you accidentally left test.only in the source code. */ + forbidOnly: !!process.env.CI, + /* Retry on CI only */ + retries: process.env.CI ? 2 : 0, + /* Opt out of parallel tests on CI. */ + workers: process.env.CI ? 1 : undefined, + /* Reporter to use. See https://playwright.dev/docs/test-reporters */ + reporter: process.env.CI ? "dot" : "list", + /* Shared settings for all the projects below. See https://playwright.dev/docs/api/class-testoptions. */ + use: { + /* Base URL to use in actions like `await page.goto('/')`. */ + baseURL: "http://localhost:3000", + + /* Collect trace when retrying the failed test. See https://playwright.dev/docs/trace-viewer */ + trace: "on-first-retry", + }, + + projects: [ + { + name: "chromium", + use: { ...devices["Desktop Chrome"] }, + }, + /* Test against mobile viewports. */ + { + name: "Mobile Chrome", + use: { ...devices["Pixel 5"] }, + }, + ], + + /* Run your local dev server before starting the tests */ + webServer: { + command: + "node ../../../headless-tests-runner/runApp.js --app-path=../ --app-name=examples-todo-typescript --db-type=sqlite", + + // Wait for the backend to start + url: "http://localhost:3001", + reuseExistingServer: !process.env.CI, + timeout: 120 * 1000, + }, +}); diff --git a/examples/todo-typescript/headless-tests/tests/helpers.ts b/examples/todo-typescript/headless-tests/tests/helpers.ts new file mode 100644 index 0000000000..005cbac02e --- /dev/null +++ b/examples/todo-typescript/headless-tests/tests/helpers.ts @@ -0,0 +1,43 @@ +import type { Page } from "@playwright/test"; + +export async function performSignup( + page: Page, + { username, password }: { username: string; password: string } +) { + await page.goto("/signup"); + + await page.waitForSelector("text=Create a new account"); + + await page.locator("input[name='username']").fill(username); + await page.locator("input[type='password']").fill(password); + await page.locator("button").click(); +} + +export async function performLogin( + page: Page, + { + username, + password, + }: { + username: string; + password: string; + } +) { + await page.goto("/login"); + + await page.waitForSelector("text=Log in to your account"); + + await page.locator("input[name='username']").fill(username); + await page.locator("input[type='password']").fill(password); + await page.getByRole("button", { name: "Log in" }).click(); +} + +export function generateRandomCredentials(): { + username: string; + password: string; +} { + return { + username: `test${Math.random().toString(36).substring(7)}`, + password: "12345678", + }; +} diff --git a/examples/todo-typescript/headless-tests/tests/simple.spec.ts b/examples/todo-typescript/headless-tests/tests/simple.spec.ts new file mode 100644 index 0000000000..cd8131de56 --- /dev/null +++ b/examples/todo-typescript/headless-tests/tests/simple.spec.ts @@ -0,0 +1,56 @@ +import { test, expect } from "@playwright/test"; +import { + generateRandomCredentials, + performLogin, + performSignup, +} from "./helpers"; + +test("has title", async ({ page }) => { + await page.goto("/"); + + await expect(page).toHaveTitle(/ToDo TypeScript/); +}); +test.describe("signup and login", () => { + const { username, password } = generateRandomCredentials(); + + test.describe.configure({ mode: "serial" }); + + test("can sign up", async ({ page }) => { + await performSignup(page, { + username, + password, + }); + + await expect(page).toHaveURL("/"); + + await page.locator("button.logout").click(); + + await expect(page).toHaveURL("/login"); + }); + + test("can log in and create a task", async ({ page }) => { + await performLogin(page, { + username, + password: "12345678xxx", + }); + + await expect(page.locator("body")).toContainText("Invalid credentials"); + + await performLogin(page, { + username, + password, + }); + + await expect(page).toHaveURL("/"); + + // Create a new task + const randomTask = `New Task ${Math.random().toString(36).substring(7)}`; + await page.locator("input[type='text']").fill(randomTask); + await page.getByText("Create task").click(); + + const fullTaskText = `${randomTask}`; + await page.waitForSelector(`text=${fullTaskText}`); + + await expect(page.locator("body")).toContainText(fullTaskText); + }); +}); diff --git a/examples/todo-typescript/main.wasp b/examples/todo-typescript/main.wasp index 9febee3abf..f2469e2ee0 100644 --- a/examples/todo-typescript/main.wasp +++ b/examples/todo-typescript/main.wasp @@ -1,6 +1,6 @@ app TodoTypescript { wasp: { - version: "^0.15.0" + version: "^0.16.0" }, title: "ToDo TypeScript", diff --git a/examples/todo-typescript/package-lock.json b/examples/todo-typescript/package-lock.json index 8837738de7..ae40a80784 100644 --- a/examples/todo-typescript/package-lock.json +++ b/examples/todo-typescript/package-lock.json @@ -6,6 +6,7 @@ "": { "name": "todoTypescript", "dependencies": { + "@playwright/test": "^1.49.1", "react": "^18.2.0", "react-dom": "^18.2.0", "react-router-dom": "^6.26.2", @@ -33,7 +34,6 @@ "axios": "^1.4.0", "express": "~4.21.0", "jsdom": "^21.1.1", - "lodash.merge": "^4.6.2", "lucia": "^3.0.1", "mitt": "3.0.0", "msw": "^1.1.0", @@ -43,7 +43,8 @@ "react-hook-form": "^7.45.4", "react-router-dom": "^6.26.2", "superjson": "^2.2.1", - "vitest": "^1.2.1" + "vitest": "^1.2.1", + "zod": "^3.23.8" }, "devDependencies": { "@tsconfig/node18": "latest", @@ -1299,6 +1300,20 @@ "integrity": "sha512-70wQhgYmndg4GCPxPPxPGevRKqTIJ2Nh4OkiMWmDAVYsTQ+Ta7Sq+rPevXyXGdzr30/qZBnyOalCszoMxlyldQ==", "license": "MIT" }, + "node_modules/@playwright/test": { + "version": "1.49.1", + "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.49.1.tgz", + "integrity": "sha512-Ky+BVzPz8pL6PQxHqNRW1k3mIyv933LML7HktS8uik0bUXNCdPhoS/kLihiO1tMf/egaJb4IutXd7UywvXEW+g==", + "dependencies": { + "playwright": "1.49.1" + }, + "bin": { + "playwright": "cli.js" + }, + "engines": { + "node": ">=18" + } + }, "node_modules/@polka/url": { "version": "1.0.0-next.28", "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.28.tgz", @@ -4212,12 +4227,6 @@ "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", "license": "MIT" }, - "node_modules/lodash.merge": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", - "license": "MIT" - }, "node_modules/log-symbols": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", @@ -5178,6 +5187,47 @@ "pathe": "^1.1.2" } }, + "node_modules/playwright": { + "version": "1.49.1", + "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.49.1.tgz", + "integrity": "sha512-VYL8zLoNTBxVOrJBbDuRgDWa3i+mfQgDTrL8Ah9QXZ7ax4Dsj0MSq5bYgytRnDVVe+njoKnfsYkH3HzqVj5UZA==", + "dependencies": { + "playwright-core": "1.49.1" + }, + "bin": { + "playwright": "cli.js" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "fsevents": "2.3.2" + } + }, + "node_modules/playwright-core": { + "version": "1.49.1", + "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.49.1.tgz", + "integrity": "sha512-BzmpVcs4kE2CH15rWfzpjzVGhWERJfmnXmniSyKeRZUs9Ws65m+RGIi7mjJK/euCegfn3i7jvqWeWyHe9y3Vgg==", + "bin": { + "playwright-core": "cli.js" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/playwright/node_modules/fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, "node_modules/possible-typed-array-names": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz", @@ -7645,6 +7695,14 @@ "funding": { "url": "https://github.com/sponsors/sindresorhus" } + }, + "node_modules/zod": { + "version": "3.24.1", + "resolved": "https://registry.npmjs.org/zod/-/zod-3.24.1.tgz", + "integrity": "sha512-muH7gBL9sI1nciMZV67X5fTKKBLtwpZ5VBp1vsOQzj1MhrBZ4wlVCm3gedKZWLp0Oyel8sIGfeiz54Su+OVT+A==", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } } } } diff --git a/examples/todo-typescript/package.json b/examples/todo-typescript/package.json index 460afdb83b..ceb95e31cc 100644 --- a/examples/todo-typescript/package.json +++ b/examples/todo-typescript/package.json @@ -2,6 +2,7 @@ "name": "todoTypescript", "type": "module", "dependencies": { + "@playwright/test": "^1.49.1", "react": "^18.2.0", "react-dom": "^18.2.0", "react-router-dom": "^6.26.2", diff --git a/examples/todo-typescript/src/Main.css b/examples/todo-typescript/src/Main.css index 15a61f2399..8baf1f89d8 100644 --- a/examples/todo-typescript/src/Main.css +++ b/examples/todo-typescript/src/Main.css @@ -26,7 +26,8 @@ img { max-height: 100px; } -.logout { +.logout, +.delete-tasks { margin-top: 1rem; } @@ -70,4 +71,4 @@ li { flex-direction: row; justify-content: space-between; align-items: center; -} +} \ No newline at end of file diff --git a/examples/todo-typescript/src/MainPage.tsx b/examples/todo-typescript/src/MainPage.tsx index e8b2567881..ca5d22d0b5 100644 --- a/examples/todo-typescript/src/MainPage.tsx +++ b/examples/todo-typescript/src/MainPage.tsx @@ -1,7 +1,13 @@ import { getUsername, type AuthUser as User } from "wasp/auth"; import { type Task } from "wasp/entities"; import { logout } from "wasp/client/auth"; -import { createTask, updateTask, deleteTasks, useQuery, getTasks } from "wasp/client/operations"; +import { + createTask, + updateTask, + deleteTasks, + useQuery, + getTasks, +} from "wasp/client/operations"; import React, { FormEventHandler, FormEvent } from "react"; import waspLogo from "./waspLogo.png"; @@ -28,7 +34,7 @@ export const MainPage = ({ user }: { user: User }) => { {tasks && }