diff --git a/.github/workflows/validate.yml b/.github/workflows/validate.yml index 489ed492b..efe5a5ab7 100644 --- a/.github/workflows/validate.yml +++ b/.github/workflows/validate.yml @@ -13,30 +13,36 @@ on: - 'main' jobs: setup: + name: 🔧 Setup + timeout-minutes: 20 strategy: matrix: os: [ubuntu-latest, windows-latest, macos-latest] runs-on: ${{ matrix.os }} steps: - - name: ⬇️ Checkout repo - uses: actions/checkout@v4 - - name: ⎔ Setup node uses: actions/setup-node@v4 with: - node-version: 20 + node-version: 24 - - name: ▶️ Run setup script - run: npm run setup + - name: ▶️ Add repo + run: | + npx --yes epicshop@latest add ${{ github.event.repository.name }}#${{ github.head_ref || github.ref_name }} ./workshop + env: + # Kept getting npm ECOMPROMISED errors on windows. This fixed it. + npm_config_cache: ${{ runner.temp }}/npm-cache - name: ʦ TypeScript run: npm run typecheck + working-directory: ./workshop - name: ⬣ ESLint run: npm run lint + working-directory: ./workshop deploy: name: 🚀 Deploy + timeout-minutes: 10 runs-on: ubuntu-latest # only deploy main branch on pushes if: ${{ github.ref == 'refs/heads/main' && github.event_name == 'push' }} diff --git a/.gitignore b/.gitignore index abfeda735..d811f2695 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,11 @@ node_modules +# non-npm JavaScript lockfiles +yarn.lock +pnpm-lock.yaml +bun.lock +bun.lockb + workspace/ **/.cache/ **/build/ @@ -12,3 +18,5 @@ workspace/ # file as well, but since this is for a workshop # we're going to keep them around. # .env + +saved-playgrounds diff --git a/CHANGELOG.md b/CHANGELOG.md index 886bb7fa2..8ee64bcd4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -23,3 +23,14 @@ Vitest renamed `SpyInstance` to `MockInstance` so the videos will use - SpyInstance> + MockInstance ``` + +## Prisma v6 + +Updated everything to use Prisma v6. The only substantial change is instead of +using `Buffer.from` to convert a file to a `Uint8Array`, we now use +`new Uint8Array(await file.arrayBuffer())`. + +## `installGlobals` + +`installGlobals` is no longer needed in modern versions of Node.js and +references to it have been removed from the exercise content. diff --git a/README.md b/README.md index b7cb83069..40c2cc4ea 100644 --- a/README.md +++ b/README.md @@ -74,22 +74,10 @@ variable and how to fix it here for [windows][win-path] or ## Setup -This is a pretty large project (it's actually many apps in one) so it can take -several minutes to get everything set up the first time. Please have a strong -network connection before running the setup and grab a snack. - -> **Warning**: This repo is _very_ large. Make sure you have a good internet -> connection before you start the setup process. The instructions below use -> `--depth` to limit the amount you download, but if you have a slow connection, -> or you pay for bandwidth, you may want to find a place with a better -> connection. - -Follow these steps to get this set up: +Use the Epic Workshop CLI to get this setup: ```sh nonumber -git clone --depth 1 https://github.com/epicweb-dev/full-stack-testing.git -cd full-stack-testing -npm run setup +npx --yes epicshop@latest add full-stack-testing ``` If you experience errors here, please open [an issue][issue] with as many @@ -143,6 +131,14 @@ EPICSHOP_EDITOR="C:\Program Files\Microsoft VS Code\bin\code.cmd" Make certain that if the path includes spaces that you wrap the path in quotes as above. +### Remote Playwright Server + +If you're using DevContainers, can't install Playwright binaries/dependencies or +can't launch the UI mode natively, check this +[issue](https://github.com/epicweb-dev/full-stack-testing/issues/41) for +information on how to run Playwright in a container and/or launch the UI mode in +the browser. + ## Exercises - `exercises/*.*/README.md`: Exercise background information diff --git a/epicshop/Dockerfile b/epicshop/Dockerfile index d23c9c5d9..62646455c 100644 --- a/epicshop/Dockerfile +++ b/epicshop/Dockerfile @@ -1,8 +1,10 @@ -FROM node:20-bookworm-slim as base +FROM node:24-bookworm-slim as base RUN apt-get update && apt-get install -y git +ENV EPICSHOP_REPO=https://github.com/epicweb-dev/full-stack-testing ENV EPICSHOP_CONTEXT_CWD="/myapp/workshop-content" +ENV EPICSHOP_HOME_DIR="/myapp/.epicshop" ENV EPICSHOP_DEPLOYED="true" ENV EPICSHOP_DISABLE_WATCHER="true" ENV FLY="true" @@ -11,11 +13,16 @@ ENV NODE_ENV="production" WORKDIR /myapp +# Clone the workshop repo during build time, excluding database files +RUN git clone --depth 1 ${EPICSHOP_REPO} ${EPICSHOP_CONTEXT_CWD} && \ + find ${EPICSHOP_CONTEXT_CWD} -name "data.db" -delete + ADD . . RUN npm install --omit=dev -CMD rm -rf ${EPICSHOP_CONTEXT_CWD} && \ - git clone https://github.com/epicweb-dev/full-stack-testing ${EPICSHOP_CONTEXT_CWD} && \ - cd ${EPICSHOP_CONTEXT_CWD} && \ +RUN cd ${EPICSHOP_CONTEXT_CWD} && \ + npx epicshop warm + +CMD cd ${EPICSHOP_CONTEXT_CWD} && \ npx epicshop start diff --git a/epicshop/fly.toml b/epicshop/fly.toml deleted file mode 100644 index a77deee9f..000000000 --- a/epicshop/fly.toml +++ /dev/null @@ -1,46 +0,0 @@ -app = "epicweb-dev-full-stack-testing" -primary_region = "sjc" -kill_signal = "SIGINT" -kill_timeout = 5 -processes = [ ] -swap_size_mb = 512 - -[experimental] -allowed_public_ports = [ ] -auto_rollback = true - -[[services]] -internal_port = 8080 -processes = [ "app" ] -protocol = "tcp" -script_checks = [ ] - - [services.concurrency] - hard_limit = 100 - soft_limit = 80 - type = "connections" - - [[services.ports]] - handlers = [ "http" ] - port = 80 - force_https = true - - [[services.ports]] - handlers = [ "tls", "http" ] - port = 443 - - [[services.tcp_checks]] - grace_period = "1s" - interval = "15s" - restart_limit = 0 - timeout = "2s" - - [[services.http_checks]] - interval = "10s" - grace_period = "5s" - method = "get" - path = "/" - protocol = "http" - timeout = "2s" - tls_skip_verify = false - headers = { } \ No newline at end of file diff --git a/epicshop/fly.yaml b/epicshop/fly.yaml new file mode 100644 index 000000000..cd9cf33e4 --- /dev/null +++ b/epicshop/fly.yaml @@ -0,0 +1,51 @@ +# See https://fly.io/docs/reference/configuration/ for information about how to use this file. +# + +app: 'epicweb-dev-full-stack-testing' +primary_region: sjc +kill_signal: SIGINT +kill_timeout: 5s +swap_size_mb: 512 + +experimental: + auto_rollback: true + + attached: + secrets: {} + +services: + - processes: + - app + protocol: tcp + internal_port: 8080 + + ports: + - port: 80 + + handlers: + - http + force_https: true + - port: 443 + + handlers: + - tls + - http + + concurrency: + type: connections + hard_limit: 100 + soft_limit: 80 + + tcp_checks: + - interval: 15s + timeout: 2s + grace_period: 1s + + http_checks: + - interval: 10s + timeout: 2s + grace_period: 5s + method: get + path: /resources/healthcheck + protocol: http + tls_skip_verify: false diff --git a/epicshop/package-lock.json b/epicshop/package-lock.json index 83247cb2d..25fe70943 100644 --- a/epicshop/package-lock.json +++ b/epicshop/package-lock.json @@ -5,64 +5,92 @@ "packages": { "": { "dependencies": { - "@epic-web/workshop-app": "^4.21.1", + "@epic-web/workshop-app": "^6.80.1", + "@epic-web/workshop-utils": "^6.80.1", "chokidar": "^3.6.0", - "execa": "^9.3.0", - "fs-extra": "^11.2.0" + "enquirer": "^2.4.1", + "epicshop": "^6.80.1", + "execa": "^9.6.1", + "fs-extra": "^11.2.0", + "match-sorter": "^8.2.0", + "p-limit": "^7.2.0" } }, "node_modules/@adobe/css-tools": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/@adobe/css-tools/-/css-tools-4.4.0.tgz", - "integrity": "sha512-Ff9+ksdQQB3rMncgqDK78uLznstjyfIf2Arnh22pW8kBpLs6rpKDwgnZT46hin5Hl1WzazzK64DOrhSwYpS7bQ==" + "version": "4.4.4", + "resolved": "https://registry.npmjs.org/@adobe/css-tools/-/css-tools-4.4.4.tgz", + "integrity": "sha512-Elp+iwUx5rN5+Y8xLt5/GRoG20WGoDCQ/1Fb+1LiGtvwbDavuSk0jhD/eZdckHAuzcDzccnkv+rEjyWfRx18gg==", + "license": "MIT" }, - "node_modules/@ampproject/remapping": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", - "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", + "node_modules/@antfu/install-pkg": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@antfu/install-pkg/-/install-pkg-1.1.0.tgz", + "integrity": "sha512-MGQsmw10ZyI+EJo45CdSER4zEb+p31LpDAFp2Z3gkSd1yqVZGi0Ebx++YTEMonJy4oChEMLsxZ64j8FH6sSqtQ==", + "license": "MIT", "dependencies": { - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.24" + "package-manager-detector": "^1.3.0", + "tinyexec": "^1.0.1" }, - "engines": { - "node": ">=6.0.0" + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/@apm-js-collab/code-transformer": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/@apm-js-collab/code-transformer/-/code-transformer-0.8.2.tgz", + "integrity": "sha512-YRjJjNq5KFSjDUoqu5pFUWrrsvGOxl6c3bu+uMFc9HNNptZ2rNU/TI2nLw4jnhQNtka972Ee2m3uqbvDQtPeCA==", + "license": "Apache-2.0" + }, + "node_modules/@apm-js-collab/tracing-hooks": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@apm-js-collab/tracing-hooks/-/tracing-hooks-0.3.1.tgz", + "integrity": "sha512-Vu1CbmPURlN5fTboVuKMoJjbO5qcq9fA5YXpskx3dXe/zTBvjODFoerw+69rVBlRLrJpwPqSDqEuJDEKIrTldw==", + "license": "Apache-2.0", + "dependencies": { + "@apm-js-collab/code-transformer": "^0.8.0", + "debug": "^4.4.1", + "module-details-from-path": "^1.0.4" } }, "node_modules/@babel/code-frame": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.7.tgz", - "integrity": "sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz", + "integrity": "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==", + "license": "MIT", "dependencies": { - "@babel/highlight": "^7.24.7", - "picocolors": "^1.0.0" + "@babel/helper-validator-identifier": "^7.27.1", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/compat-data": { - "version": "7.25.2", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.25.2.tgz", - "integrity": "sha512-bYcppcpKBvX4znYaPEeFau03bp89ShqNMLs+rmdptMw+heSZh9+z84d2YG+K7cYLbWwzdjtDoW/uqZmPjulClQ==", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.28.5.tgz", + "integrity": "sha512-6uFXyCayocRbqhZOB+6XcuZbkMNimwfVGFji8CTZnCzOHVGvDqzvitu1re2AU5LROliz7eQPhB8CpAMvnx9EjA==", + "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/core": { - "version": "7.25.2", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.25.2.tgz", - "integrity": "sha512-BBt3opiCOxUr9euZ5/ro/Xv8/V7yJ5bjYMqG/C1YAo8MIKAnumZalCN+msbci3Pigy4lIQfPUpfMM27HMGaYEA==", - "dependencies": { - "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.24.7", - "@babel/generator": "^7.25.0", - "@babel/helper-compilation-targets": "^7.25.2", - "@babel/helper-module-transforms": "^7.25.2", - "@babel/helpers": "^7.25.0", - "@babel/parser": "^7.25.0", - "@babel/template": "^7.25.0", - "@babel/traverse": "^7.25.2", - "@babel/types": "^7.25.2", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.28.5.tgz", + "integrity": "sha512-e7jT4DxYvIDLk1ZHmU/m/mB19rex9sv0c2ftBtjSBv+kVM/902eh0fINUzD7UwLLNR+jU585GxUJ8/EBfAM5fw==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.27.1", + "@babel/generator": "^7.28.5", + "@babel/helper-compilation-targets": "^7.27.2", + "@babel/helper-module-transforms": "^7.28.3", + "@babel/helpers": "^7.28.4", + "@babel/parser": "^7.28.5", + "@babel/template": "^7.27.2", + "@babel/traverse": "^7.28.5", + "@babel/types": "^7.28.5", + "@jridgewell/remapping": "^2.3.5", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -77,49 +105,40 @@ "url": "https://opencollective.com/babel" } }, - "node_modules/@babel/core/node_modules/debug": { - "version": "4.3.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.6.tgz", - "integrity": "sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg==", - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } + "node_modules/@babel/core/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" } }, - "node_modules/@babel/core/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==" - }, "node_modules/@babel/generator": { - "version": "7.25.0", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.25.0.tgz", - "integrity": "sha512-3LEEcj3PVW8pW2R1SR1M89g/qrYk/m/mB/tLqn7dn4sbBUQyTqnlod+II2U4dqiGtUmkcnAmkMDralTFZttRiw==", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.28.5.tgz", + "integrity": "sha512-3EwLFhZ38J4VyIP6WNtt2kUdW9dokXA9Cr4IVIFHuCpZ3H8/YFOl5JjZHisrn1fATPBmKKqXzDFvh9fUwHz6CQ==", + "license": "MIT", "dependencies": { - "@babel/types": "^7.25.0", - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.25", - "jsesc": "^2.5.1" + "@babel/parser": "^7.28.5", + "@babel/types": "^7.28.5", + "@jridgewell/gen-mapping": "^0.3.12", + "@jridgewell/trace-mapping": "^0.3.28", + "jsesc": "^3.0.2" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-compilation-targets": { - "version": "7.25.2", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.25.2.tgz", - "integrity": "sha512-U2U5LsSaZ7TAt3cfaymQ8WHh0pxvdHoEk6HVpaexxixjyEquMh0L0YNJNM6CTGKMXV1iksi0iZkGw4AcFkPaaw==", + "version": "7.27.2", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.27.2.tgz", + "integrity": "sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==", + "license": "MIT", "dependencies": { - "@babel/compat-data": "^7.25.2", - "@babel/helper-validator-option": "^7.24.8", - "browserslist": "^4.23.1", + "@babel/compat-data": "^7.27.2", + "@babel/helper-validator-option": "^7.27.1", + "browserslist": "^4.24.0", "lru-cache": "^5.1.1", "semver": "^6.3.1" }, @@ -131,36 +150,51 @@ "version": "5.1.1", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "license": "ISC", "dependencies": { "yallist": "^3.0.2" } }, - "node_modules/@babel/helper-compilation-targets/node_modules/yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" + "node_modules/@babel/helper-compilation-targets/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-globals": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz", + "integrity": "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } }, "node_modules/@babel/helper-module-imports": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.24.7.tgz", - "integrity": "sha512-8AyH3C+74cgCVVXow/myrynrAGv+nTVg5vKu2nZph9x7RcRwzmh0VFallJuFTZ9mx6u4eSdXZfcOzSqTUm0HCA==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.27.1.tgz", + "integrity": "sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==", + "license": "MIT", "dependencies": { - "@babel/traverse": "^7.24.7", - "@babel/types": "^7.24.7" + "@babel/traverse": "^7.27.1", + "@babel/types": "^7.27.1" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.25.2", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.25.2.tgz", - "integrity": "sha512-BjyRAbix6j/wv83ftcVJmBt72QtHI56C7JXZoG2xATiLpmoC7dpd8WnkikExHDVPpi/3qCmO6WY1EaXOluiecQ==", + "version": "7.28.3", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.28.3.tgz", + "integrity": "sha512-gytXUbs8k2sXS9PnQptz5o0QnpLL51SwASIORY6XaBKF88nsOT0Zw9szLqlSGQDP/4TljBAD5y98p2U1fqkdsw==", + "license": "MIT", "dependencies": { - "@babel/helper-module-imports": "^7.24.7", - "@babel/helper-simple-access": "^7.24.7", - "@babel/helper-validator-identifier": "^7.24.7", - "@babel/traverse": "^7.25.2" + "@babel/helper-module-imports": "^7.27.1", + "@babel/helper-validator-identifier": "^7.27.1", + "@babel/traverse": "^7.28.3" }, "engines": { "node": ">=6.9.0" @@ -169,106 +203,53 @@ "@babel/core": "^7.0.0" } }, - "node_modules/@babel/helper-simple-access": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.24.7.tgz", - "integrity": "sha512-zBAIvbCMh5Ts+b86r/CjU+4XGYIs+R1j951gxI3KmmxBMhCg4oQMsv6ZXQ64XOm/cvzfU1FmoCyt6+owc5QMYg==", - "dependencies": { - "@babel/traverse": "^7.24.7", - "@babel/types": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/helper-string-parser": { - "version": "7.24.8", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.24.8.tgz", - "integrity": "sha512-pO9KhhRcuUyGnJWwyEgnRJTSIZHiT+vMD0kPeD+so0l7mxkMT19g3pjY9GTnHySck/hDzq+dtW/4VgnMkippsQ==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", + "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", + "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.7.tgz", - "integrity": "sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz", + "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==", + "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-option": { - "version": "7.24.8", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.24.8.tgz", - "integrity": "sha512-xb8t9tD1MHLungh/AIoWYN+gVHaB9kwlu8gffXGSt3FFEIT7RjS+xWbc2vUD1UTZdIpKj/ab3rdqJ7ufngyi2Q==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz", + "integrity": "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==", + "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helpers": { - "version": "7.25.0", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.25.0.tgz", - "integrity": "sha512-MjgLZ42aCm0oGjJj8CtSM3DB8NOOf8h2l7DCTePJs29u+v7yO/RBX9nShlKMgFnRks/Q4tBAe7Hxnov9VkGwLw==", - "dependencies": { - "@babel/template": "^7.25.0", - "@babel/types": "^7.25.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/highlight": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.7.tgz", - "integrity": "sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw==", + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.28.4.tgz", + "integrity": "sha512-HFN59MmQXGHVyYadKLVumYsA9dBFun/ldYxipEjzA4196jpLZd8UjEEBLkbEkvfYreDqJhZxYAWFPtrfhNpj4w==", + "license": "MIT", "dependencies": { - "@babel/helper-validator-identifier": "^7.24.7", - "chalk": "^2.4.2", - "js-tokens": "^4.0.0", - "picocolors": "^1.0.0" + "@babel/template": "^7.27.2", + "@babel/types": "^7.28.4" }, "engines": { "node": ">=6.9.0" } }, - "node_modules/@babel/highlight/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/highlight/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/highlight/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/@babel/parser": { - "version": "7.25.3", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.25.3.tgz", - "integrity": "sha512-iLTJKDbJ4hMvFPgQwwsVoxtHyWpKKPBrxkANrSYewDPaPpT5py5yeVkgPIJ7XYXhndxJpaA3PyALSXQ7u8e/Dw==", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.5.tgz", + "integrity": "sha512-KKBU1VGYR7ORr3At5HAtUQ+TV3SzRCXmA/8OdDZiLDBIZxVyzXuztPjfLd3BV1PRAQGCMWWSHYhL0F8d5uHBDQ==", + "license": "MIT", "dependencies": { - "@babel/types": "^7.25.2" + "@babel/types": "^7.28.5" }, "bin": { "parser": "bin/babel-parser.js" @@ -278,497 +259,2177 @@ } }, "node_modules/@babel/runtime": { - "version": "7.25.4", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.25.4.tgz", - "integrity": "sha512-DSgLeL/FNcpXuzav5wfYvHCGvynXkJbn3Zvc3823AEe9nPwW9IK4UoCSS5yGymmQzN0pCPvivtgS6/8U2kkm1w==", - "dependencies": { - "regenerator-runtime": "^0.14.0" - }, + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.28.4.tgz", + "integrity": "sha512-Q/N6JNWvIvPnLDvjlE1OUBLPQHH6l3CltCEsHIujp45zQUSSh8K+gHnaEX45yAT1nyngnINhvWtzN+Nb9D8RAQ==", + "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/template": { - "version": "7.25.0", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.25.0.tgz", - "integrity": "sha512-aOOgh1/5XzKvg1jvVz7AVrx2piJ2XBi227DHmbY6y+bM9H2FlN+IfecYu4Xl0cNiiVejlsCri89LUsbj8vJD9Q==", + "version": "7.27.2", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.2.tgz", + "integrity": "sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==", + "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.24.7", - "@babel/parser": "^7.25.0", - "@babel/types": "^7.25.0" + "@babel/code-frame": "^7.27.1", + "@babel/parser": "^7.27.2", + "@babel/types": "^7.27.1" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/traverse": { - "version": "7.25.3", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.25.3.tgz", - "integrity": "sha512-HefgyP1x754oGCsKmV5reSmtV7IXj/kpaE1XYY+D9G5PvKKoFfSbiS4M77MdjuwlZKDIKFCffq9rPU+H/s3ZdQ==", - "dependencies": { - "@babel/code-frame": "^7.24.7", - "@babel/generator": "^7.25.0", - "@babel/parser": "^7.25.3", - "@babel/template": "^7.25.0", - "@babel/types": "^7.25.2", - "debug": "^4.3.1", - "globals": "^11.1.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/traverse/node_modules/debug": { - "version": "4.3.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.6.tgz", - "integrity": "sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg==", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.28.5.tgz", + "integrity": "sha512-TCCj4t55U90khlYkVV/0TfkJkAkUg3jZFA3Neb7unZT8CPok7iiRfaX0F+WnqWqt7OxhOn0uBKXCw4lbL8W0aQ==", + "license": "MIT", "dependencies": { - "ms": "2.1.2" + "@babel/code-frame": "^7.27.1", + "@babel/generator": "^7.28.5", + "@babel/helper-globals": "^7.28.0", + "@babel/parser": "^7.28.5", + "@babel/template": "^7.27.2", + "@babel/types": "^7.28.5", + "debug": "^4.3.1" }, "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } + "node": ">=6.9.0" } }, - "node_modules/@babel/traverse/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==" - }, "node_modules/@babel/types": { - "version": "7.25.2", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.25.2.tgz", - "integrity": "sha512-YTnYtra7W9e6/oAZEHj0bJehPRUlLH9/fbpT5LfB0NhQXyALCRkRs3zH9v07IYhkgpqX6Z78FnuccZr/l4Fs4Q==", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.5.tgz", + "integrity": "sha512-qQ5m48eI/MFLQ5PxQj4PFaprjyCTLI37ElWMmNs0K8Lk3dVeOdNpB3ks8jc7yM5CDmVC73eMVk/trk3fgmrUpA==", + "license": "MIT", "dependencies": { - "@babel/helper-string-parser": "^7.24.8", - "@babel/helper-validator-identifier": "^7.24.7", - "to-fast-properties": "^2.0.0" + "@babel/helper-string-parser": "^7.27.1", + "@babel/helper-validator-identifier": "^7.28.5" }, "engines": { "node": ">=6.9.0" } }, - "node_modules/@bundled-es-modules/cookie": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@bundled-es-modules/cookie/-/cookie-2.0.0.tgz", - "integrity": "sha512-Or6YHg/kamKHpxULAdSqhGqnWFneIXu1NKvvfBBzKGwpVsYuFIQ5aBPHDnnoR3ghW1nvSkALd+EF9iMtY7Vjxw==", - "dependencies": { - "cookie": "^0.5.0" - } + "node_modules/@braintree/sanitize-url": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/@braintree/sanitize-url/-/sanitize-url-7.1.1.tgz", + "integrity": "sha512-i1L7noDNxtFyL5DmZafWy1wRVhGehQmzZaz1HiN5e7iylJMSZR7ekOV7NsIqa5qBldlLrsKv4HbgFUVlQrz8Mw==", + "license": "MIT" }, - "node_modules/@bundled-es-modules/cookie/node_modules/cookie": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", - "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", - "engines": { - "node": ">= 0.6" + "node_modules/@chevrotain/cst-dts-gen": { + "version": "11.0.3", + "resolved": "https://registry.npmjs.org/@chevrotain/cst-dts-gen/-/cst-dts-gen-11.0.3.tgz", + "integrity": "sha512-BvIKpRLeS/8UbfxXxgC33xOumsacaeCKAjAeLyOn7Pcp95HiRbrpl14S+9vaZLolnbssPIUuiUd8IvgkRyt6NQ==", + "license": "Apache-2.0", + "dependencies": { + "@chevrotain/gast": "11.0.3", + "@chevrotain/types": "11.0.3", + "lodash-es": "4.17.21" + } + }, + "node_modules/@chevrotain/gast": { + "version": "11.0.3", + "resolved": "https://registry.npmjs.org/@chevrotain/gast/-/gast-11.0.3.tgz", + "integrity": "sha512-+qNfcoNk70PyS/uxmj3li5NiECO+2YKZZQMbmjTqRI3Qchu8Hig/Q9vgkHpI3alNjr7M+a2St5pw5w5F6NL5/Q==", + "license": "Apache-2.0", + "dependencies": { + "@chevrotain/types": "11.0.3", + "lodash-es": "4.17.21" + } + }, + "node_modules/@chevrotain/regexp-to-ast": { + "version": "11.0.3", + "resolved": "https://registry.npmjs.org/@chevrotain/regexp-to-ast/-/regexp-to-ast-11.0.3.tgz", + "integrity": "sha512-1fMHaBZxLFvWI067AVbGJav1eRY7N8DDvYCTwGBiE/ytKBgP8azTdgyrKyWZ9Mfh09eHWb5PgTSO8wi7U824RA==", + "license": "Apache-2.0" + }, + "node_modules/@chevrotain/types": { + "version": "11.0.3", + "resolved": "https://registry.npmjs.org/@chevrotain/types/-/types-11.0.3.tgz", + "integrity": "sha512-gsiM3G8b58kZC2HaWR50gu6Y1440cHiJ+i3JUvcp/35JchYejb2+5MVeJK0iKThYpAa/P2PYFV4hoi44HD+aHQ==", + "license": "Apache-2.0" + }, + "node_modules/@chevrotain/utils": { + "version": "11.0.3", + "resolved": "https://registry.npmjs.org/@chevrotain/utils/-/utils-11.0.3.tgz", + "integrity": "sha512-YslZMgtJUyuMbZ+aKvfF3x1f5liK4mWNxghFRv7jqRR9C3R3fAOGTTKvxXDa2Y1s9zSbcpuO0cAxDYsc9SrXoQ==", + "license": "Apache-2.0" + }, + "node_modules/@conform-to/dom": { + "version": "1.16.0", + "resolved": "https://registry.npmjs.org/@conform-to/dom/-/dom-1.16.0.tgz", + "integrity": "sha512-KkURoALYztq5kli8/Ojqe4PyTcAmc9pHOmIoU5RJzre8poWgmjCsHQt28xhEyDk5XBwo8bkvyKm8oKqwSAAucw==", + "license": "MIT" + }, + "node_modules/@conform-to/react": { + "version": "1.16.0", + "resolved": "https://registry.npmjs.org/@conform-to/react/-/react-1.16.0.tgz", + "integrity": "sha512-xDPwDCijAMTcQcDD2fgGh76KIOsx8xEbPGdFTbal7RJyHPA4FYL0v4mBp4jPN5ejKkCOF9mVeb1UbZZ3GiZ/AA==", + "license": "MIT", + "dependencies": { + "@conform-to/dom": "1.16.0" + }, + "peerDependencies": { + "react": ">=18" } }, - "node_modules/@bundled-es-modules/statuses": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@bundled-es-modules/statuses/-/statuses-1.0.1.tgz", - "integrity": "sha512-yn7BklA5acgcBr+7w064fGV+SGIFySjCKpqjcWgBAIfrAkY+4GQTJJHQMeT3V/sgz23VTEVV8TtOmkvJAhFVfg==", + "node_modules/@conform-to/zod": { + "version": "1.16.0", + "resolved": "https://registry.npmjs.org/@conform-to/zod/-/zod-1.16.0.tgz", + "integrity": "sha512-c976dE2Hqrl5E984NZGQOe1b1+HGfp7jdqjz/1qbpWLTcNHO1MpJo0dCt0x0E2NSOv7BNcjpEPrEholVnt/4rw==", + "license": "MIT", "dependencies": { - "statuses": "^2.0.1" + "@conform-to/dom": "1.16.0" + }, + "peerDependencies": { + "zod": "^3.21.0 || ^4.0.0" } }, "node_modules/@epic-web/cachified": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/@epic-web/cachified/-/cachified-5.2.0.tgz", - "integrity": "sha512-E/2LdIhS/wcn3ykV+u5xbTFahKtzReO0k4/cVtE7KBYiLCgR6bPRmlDUuyfWhbZX3zOmK+6OL7qdHkvgCWwSiA==" + "version": "5.6.1", + "resolved": "https://registry.npmjs.org/@epic-web/cachified/-/cachified-5.6.1.tgz", + "integrity": "sha512-+VKwMhqM43l2s+gX28Telcf6bUJk1Zaj0Ix2i8K4R2QW8WgPE0q3THCnr0xZg5chw35/B4SkHS43an2fqKOFnQ==", + "license": "MIT" + }, + "node_modules/@epic-web/client-hints": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/@epic-web/client-hints/-/client-hints-1.3.8.tgz", + "integrity": "sha512-Ih3Hxd5JAKQ8PU3CSbGe1bd3zlyXAcKTwpy10UvHEcaBz2CLEg59V+xJk202WFX2RvXy532yKTrHa1aE+MdUGQ==", + "license": "MIT" }, "node_modules/@epic-web/invariant": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/@epic-web/invariant/-/invariant-1.0.0.tgz", - "integrity": "sha512-lrTPqgvfFQtR/eY/qkIzp98OGdNJu0m5ji3q/nJI8v3SXkRKEnWiOxMmbvcSoAIzv/cGiuvRy57k4suKQSAdwA==" + "integrity": "sha512-lrTPqgvfFQtR/eY/qkIzp98OGdNJu0m5ji3q/nJI8v3SXkRKEnWiOxMmbvcSoAIzv/cGiuvRy57k4suKQSAdwA==", + "license": "MIT" }, "node_modules/@epic-web/remember": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@epic-web/remember/-/remember-1.1.0.tgz", - "integrity": "sha512-FIhO7PFUVEbcnrJOtom8gb4GXog4Z44n4Jxwmw2nkKt4mx8I/q/d0O4tMabjYndM1QX2oXvRYzpZxtP61s2P5A==" + "integrity": "sha512-FIhO7PFUVEbcnrJOtom8gb4GXog4Z44n4Jxwmw2nkKt4mx8I/q/d0O4tMabjYndM1QX2oXvRYzpZxtP61s2P5A==", + "license": "MIT" + }, + "node_modules/@epic-web/restore-scroll": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@epic-web/restore-scroll/-/restore-scroll-2.0.0.tgz", + "integrity": "sha512-QgjAXcDGcqsd+BGgM8u2tGRpP4kyrON53Bp8VKguOM/U4uH2N7KMnRq8uMmUMpOPxl8dvzwzz/yOJ9l6HRFVvA==", + "license": "MIT", + "peerDependencies": { + "react": ">=18.0.0", + "react-router": ">=7.0.0" + } }, "node_modules/@epic-web/workshop-app": { - "version": "4.21.1", - "resolved": "https://registry.npmjs.org/@epic-web/workshop-app/-/workshop-app-4.21.1.tgz", - "integrity": "sha512-93+ejdZXQPl4Op//MHnBzAvVQQi9/GnfEoqQTtEaqni6tsBuu5IC7jGjbfgsYczUuIdhvFGHpfzDJ7wL09vpWQ==", - "bundleDependencies": [ - "@conform-to/react", - "@conform-to/zod", - "@epic-web/client-hints", - "@epic-web/restore-scroll", - "@radix-ui/react-accordion", - "@radix-ui/react-popover", - "@radix-ui/react-select", - "@radix-ui/react-tabs", - "@radix-ui/react-toast", - "@remix-run/react", - "@remix-run/router", - "react-router", - "react-router-dom", - "clsx", - "chai", - "chai-dom", - "framer-motion", - "remix-utils", - "tailwind-merge", - "zod" - ], - "dependencies": { - "@conform-to/react": "^1.1.3", - "@conform-to/zod": "^1.1.3", - "@epic-web/cachified": "^5.2.0", - "@epic-web/client-hints": "^1.3.2", + "version": "6.80.1", + "resolved": "https://registry.npmjs.org/@epic-web/workshop-app/-/workshop-app-6.80.1.tgz", + "integrity": "sha512-FQoj33X8f7duQh0qIaOBPZ4DJJXAPK2astarwLJxUxOn+NmzQB5di/GE+VFMrnIVm7dt6irI5S09mhdFTH2LDg==", + "dependencies": { + "@conform-to/react": "^1.16.0", + "@conform-to/zod": "^1.16.0", + "@epic-web/cachified": "^5.6.1", + "@epic-web/client-hints": "^1.3.8", "@epic-web/invariant": "^1.0.0", - "@epic-web/remember": "^1.0.2", - "@epic-web/restore-scroll": "^1.1.1", - "@epic-web/workshop-presence": "4.21.1", - "@epic-web/workshop-utils": "4.21.1", - "@mdx-js/mdx": "^3.0.1", - "@mux/mux-player-react": "^2.6.0", + "@epic-web/remember": "^1.1.0", + "@epic-web/restore-scroll": "^2.0.0", + "@epic-web/workshop-presence": "6.80.1", + "@epic-web/workshop-utils": "6.80.1", + "@mdx-js/mdx": "^3.1.1", + "@mux/mux-player-react": "^3.10.2", "@nasa-gcn/remix-seo": "^2.0.1", - "@paralleldrive/cuid2": "^2.2.2", - "@radix-ui/react-accordion": "^1.1.2", - "@radix-ui/react-dialog": "^1.0.5", - "@radix-ui/react-popover": "^1.0.7", - "@radix-ui/react-select": "^2.0.0", - "@radix-ui/react-tabs": "^1.0.4", - "@radix-ui/react-toast": "^1.1.5", - "@radix-ui/react-tooltip": "^1.0.7", - "@remix-run/css-bundle": "^2.9.2", - "@remix-run/express": "^2.9.2", - "@remix-run/node": "^2.9.2", - "@remix-run/react": "^2.9.2", - "@remix-run/router": "*", + "@radix-ui/react-accordion": "^1.2.12", + "@radix-ui/react-dialog": "^1.1.15", + "@radix-ui/react-popover": "^1.1.15", + "@radix-ui/react-select": "^2.2.6", + "@radix-ui/react-tabs": "^1.1.13", + "@radix-ui/react-toast": "^1.2.15", + "@radix-ui/react-tooltip": "^1.2.8", + "@react-router/express": "^7.13.0", + "@react-router/node": "^7.13.0", + "@react-router/remix-routes-option-adapter": "^7.13.0", "@resvg/resvg-js": "^2.6.2", - "@sindresorhus/slugify": "^2.2.1", - "@types/chai": "^4.3.16", - "@types/chai-dom": "^1.11.3", + "@sentry/profiling-node": "^10.38.0", + "@sentry/react-router": "^10.38.0", + "@sentry/vite-plugin": "^4.8.0", + "@sindresorhus/slugify": "^3.0.0", "address": "^2.0.3", "ansi-to-html": "^0.7.2", - "chai": "^5.1.1", - "chai-dom": "^1.12.0", - "chalk": "^5.3.0", - "chokidar": "^3.6.0", - "close-with-grace": "^1.3.0", + "chalk": "^5.6.2", + "chokidar": "^5.0.0", + "close-with-grace": "^2.4.0", "clsx": "^2.1.1", - "compression": "^1.7.4", - "confetti-react": "^2.5.0", - "cookie": "^0.6.0", - "cross-env": "^7.0.3", - "cross-spawn": "^7.0.3", - "dayjs": "^1.11.11", - "dotenv": "^16.4.5", - "esbuild": "0.17.6", + "compression": "^1.8.1", + "confetti-react": "^2.6.0", + "cookie": "^1.1.1", + "cross-env": "^10.1.0", + "cross-spawn": "^7.0.6", + "dotenv": "^17.2.3", + "esbuild": "^0.27.2", "etag": "^1.8.1", - "execa": "^9.1.0", - "express": "^4.19.2", - "fkill": "^9.0.0", - "framer-motion": "^11.2.6", - "fs-extra": "^11.2.0", + "execa": "^9.6.1", + "express": "^5.2.1", + "fkill": "^10.0.3", + "framer-motion": "^12.29.2", + "fs-extra": "^11.3.3", "get-port": "^7.1.0", - "glob": "^10.3.16", - "globby": "^14.0.1", - "ignore": "^5.3.1", - "isbot": "^5.1.6", - "lru-cache": "^10.2.2", + "glob": "^13.0.0", + "isbot": "^5.1.34", + "lru-cache": "^11.2.5", "md5-hex": "^5.0.0", - "mdx-bundler": "^10.0.2", - "mime-types": "^2.1.35", - "morgan": "^1.10.0", - "msw": "^2.3.0", - "openid-client": "^5.6.5", - "p-queue": "^8.0.1", - "parse-git-diff": "^0.0.15", - "partysocket": "^1.0.1", - "react": "19.0.0-rc-f994737d14-20240522", - "react-dom": "19.0.0-rc-f994737d14-20240522", - "react-router": "*", - "react-router-dom": "*", - "remark-autolink-headings": "^7.0.1", - "remark-emoji": "^4.0.1", - "remark-gfm": "^4.0.0", - "remix-flat-routes": "^0.6.5", - "remix-utils": "7.6.0", - "satori": "^0.10.13", - "shell-quote": "^1.8.1", - "shiki": "^1.6.0", - "sonner": "^1.4.41", + "mdx-bundler": "^10.1.1", + "media-chrome": "^4.17.2", + "mermaid": "^11.12.2", + "mime-types": "^3.0.2", + "morgan": "^1.10.1", + "msw": "^2.12.7", + "open": "^11.0.0", + "openid-client": "^6.8.1", + "p-queue": "^9.1.0", + "partysocket": "^1.1.10", + "react": "^19.2.4", + "react-dom": "^19.2.4", + "react-error-boundary": "^6.1.0", + "react-router": "^7.13.0", + "remix-flat-routes": "^0.8.5", + "remix-utils": "^9.0.0", + "satori": "^0.19.1", + "semver": "^7.7.3", + "sonner": "^2.0.7", "source-map-support": "^0.5.21", - "spin-delay": "^2.0.0", - "tailwind-merge": "^2.3.0", - "tailwindcss-radix": "^3.0.3", - "unified": "^11.0.4", - "unist-util-remove-position": "^5.0.0", - "unist-util-visit": "^5.0.0", + "spin-delay": "^2.0.1", + "tailwind-merge": "^3.4.0", "vite-env-only": "^3.0.3", - "ws": "^8.17.0", - "zod": "^3.23.8" - }, - "bin": { - "epicshop": "bin/epicshop.js" + "ws": "^8.19.0", + "zod": "^4.3.6" }, "engines": { - "node": ">=18" + "node": "20 || 22 || 24" } }, - "node_modules/@epic-web/workshop-app/node_modules/@babel/runtime": { - "version": "7.24.7", - "inBundle": true, + "node_modules/@epic-web/workshop-app/node_modules/chokidar": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-5.0.0.tgz", + "integrity": "sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw==", "license": "MIT", "dependencies": { - "regenerator-runtime": "^0.14.0" + "readdirp": "^5.0.0" }, "engines": { - "node": ">=6.9.0" + "node": ">= 20.19.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" } }, - "node_modules/@epic-web/workshop-app/node_modules/@conform-to/dom": { - "version": "1.1.5", - "inBundle": true, - "license": "MIT" - }, - "node_modules/@epic-web/workshop-app/node_modules/@conform-to/react": { - "version": "1.1.5", - "inBundle": true, + "node_modules/@epic-web/workshop-app/node_modules/readdirp": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-5.0.0.tgz", + "integrity": "sha512-9u/XQ1pvrQtYyMpZe7DXKv2p5CNvyVwzUB6uhLAnQwHMSgKMBR62lc7AHljaeteeHXn11XTAaLLUVZYVZyuRBQ==", "license": "MIT", - "dependencies": { - "@conform-to/dom": "1.1.5" + "engines": { + "node": ">= 20.19.0" }, - "peerDependencies": { - "react": ">=18" + "funding": { + "type": "individual", + "url": "https://paulmillr.com/funding/" } }, - "node_modules/@epic-web/workshop-app/node_modules/@conform-to/zod": { - "version": "1.1.5", - "inBundle": true, - "license": "MIT", + "node_modules/@epic-web/workshop-presence": { + "version": "6.80.1", + "resolved": "https://registry.npmjs.org/@epic-web/workshop-presence/-/workshop-presence-6.80.1.tgz", + "integrity": "sha512-CrJufnOoavsFL2ypl+idp3BVKlGWohf662rRrjADqfXN3UrkA22/iFWGYQ96ZBonzjAyugPz9MKqqvjs8r0Rng==", "dependencies": { - "@conform-to/dom": "1.1.5" - }, - "peerDependencies": { - "zod": "^3.21.0" + "@epic-web/workshop-utils": "6.80.1", + "zod": "^4.3.6" } }, - "node_modules/@epic-web/workshop-app/node_modules/@epic-web/client-hints": { - "version": "1.3.2", - "inBundle": true, - "license": "MIT" - }, - "node_modules/@epic-web/workshop-app/node_modules/@epic-web/restore-scroll": { - "version": "1.1.1", - "inBundle": true, - "license": "MIT", - "peerDependencies": { - "react": ">=18.0.0", - "react-router-dom": ">=6.4.0" + "node_modules/@epic-web/workshop-utils": { + "version": "6.80.1", + "resolved": "https://registry.npmjs.org/@epic-web/workshop-utils/-/workshop-utils-6.80.1.tgz", + "integrity": "sha512-7SrzAmnU++vb41ducKQGA4FE3dXTKOHWJk6AkM5jbOuQhwJ6Abc+6DSN5UH0ExebETNiCIAn3l0ySDNVaNazIw==", + "dependencies": { + "@epic-web/cachified": "^5.6.1", + "@epic-web/invariant": "^1.0.0", + "@epic-web/remember": "^1.1.0", + "@kentcdodds/md-temp": "^10.0.1", + "@mdx-js/mdx": "^3.1.1", + "@playwright/test": "^1.58.0", + "@react-router/node": "^7.12.0", + "@sentry/react-router": "^10.38.0", + "@testing-library/dom": "^10.4.1", + "@testing-library/jest-dom": "^6.9.1", + "@total-typescript/ts-reset": "^0.6.1", + "@types/chai": "^5.2.3", + "@types/chai-dom": "^1.11.3", + "@vitest/expect": "^4.0.18", + "chai": "^6.2.2", + "chai-dom": "^1.12.1", + "chalk": "^5.6.2", + "chokidar": "^5.0.0", + "close-with-grace": "^2.4.0", + "cookie": "^1.1.1", + "cross-spawn": "^7.0.6", + "dayjs": "^1.11.19", + "esbuild": "^0.27.2", + "execa": "^9.6.1", + "find-process": "^2.0.0", + "fkill": "^10.0.3", + "fs-extra": "^11.3.3", + "globby": "^16.1.0", + "ignore": "^7.0.5", + "json5": "^2.2.3", + "lru-cache": "^11.2.5", + "lz-string": "^1.5.0", + "md5-hex": "^5.0.0", + "mdast-util-mdx-jsx": "^3.2.0", + "mdx-bundler": "^10.1.1", + "p-queue": "^9.1.0", + "parse-git-diff": "^0.0.19", + "pkgmgr": "^1.1.1", + "react": "^19.2.4", + "react-dom": "^19.2.4", + "react-router": "^7.12.0", + "rehype": "^13.0.2", + "rehype-autolink-headings": "^7.1.0", + "remark": "^15.0.1", + "remark-emoji": "^5.0.2", + "remark-gfm": "^4.0.1", + "shell-quote": "^1.8.3", + "shiki": "^3.21.0", + "unified": "^11.0.5", + "unist-util-remove-position": "^5.0.0", + "unist-util-visit": "^5.1.0", + "zod": "^4.3.6" } }, - "node_modules/@epic-web/workshop-app/node_modules/@floating-ui/core": { - "version": "1.6.3", - "inBundle": true, + "node_modules/@epic-web/workshop-utils/node_modules/chokidar": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-5.0.0.tgz", + "integrity": "sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw==", "license": "MIT", "dependencies": { - "@floating-ui/utils": "^0.2.3" + "readdirp": "^5.0.0" + }, + "engines": { + "node": ">= 20.19.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" } }, - "node_modules/@epic-web/workshop-app/node_modules/@floating-ui/dom": { - "version": "1.6.6", - "inBundle": true, + "node_modules/@epic-web/workshop-utils/node_modules/readdirp": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-5.0.0.tgz", + "integrity": "sha512-9u/XQ1pvrQtYyMpZe7DXKv2p5CNvyVwzUB6uhLAnQwHMSgKMBR62lc7AHljaeteeHXn11XTAaLLUVZYVZyuRBQ==", "license": "MIT", - "dependencies": { - "@floating-ui/core": "^1.0.0", - "@floating-ui/utils": "^0.2.3" + "engines": { + "node": ">= 20.19.0" + }, + "funding": { + "type": "individual", + "url": "https://paulmillr.com/funding/" } }, - "node_modules/@epic-web/workshop-app/node_modules/@floating-ui/react-dom": { - "version": "2.1.1", - "inBundle": true, - "license": "MIT", + "node_modules/@esbuild-plugins/node-resolve": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/@esbuild-plugins/node-resolve/-/node-resolve-0.2.2.tgz", + "integrity": "sha512-+t5FdX3ATQlb53UFDBRb4nqjYBz492bIrnVWvpQHpzZlu9BQL5HasMZhqc409ygUwOWCXZhrWr6NyZ6T6Y+cxw==", + "license": "ISC", "dependencies": { - "@floating-ui/dom": "^1.0.0" + "@types/resolve": "^1.17.1", + "debug": "^4.3.1", + "escape-string-regexp": "^4.0.0", + "resolve": "^1.19.0" }, "peerDependencies": { - "react": ">=16.8.0", - "react-dom": ">=16.8.0" + "esbuild": "*" } }, - "node_modules/@epic-web/workshop-app/node_modules/@floating-ui/utils": { - "version": "0.2.3", - "inBundle": true, - "license": "MIT" - }, - "node_modules/@epic-web/workshop-app/node_modules/@radix-ui/number": { - "version": "1.1.0", - "inBundle": true, - "license": "MIT" - }, - "node_modules/@epic-web/workshop-app/node_modules/@radix-ui/primitive": { - "version": "1.1.0", - "inBundle": true, - "license": "MIT" - }, - "node_modules/@epic-web/workshop-app/node_modules/@radix-ui/react-accordion": { - "version": "1.2.0", - "inBundle": true, + "node_modules/@esbuild-plugins/node-resolve/node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", "license": "MIT", - "dependencies": { - "@radix-ui/primitive": "1.1.0", - "@radix-ui/react-collapsible": "1.1.0", - "@radix-ui/react-collection": "1.1.0", - "@radix-ui/react-compose-refs": "1.1.0", - "@radix-ui/react-context": "1.1.0", - "@radix-ui/react-direction": "1.1.0", - "@radix-ui/react-id": "1.1.0", - "@radix-ui/react-primitive": "2.0.0", - "@radix-ui/react-use-controllable-state": "1.1.0" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + "engines": { + "node": ">=10" }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@epic-web/workshop-app/node_modules/@radix-ui/react-arrow": { - "version": "1.1.0", - "inBundle": true, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.27.2.tgz", + "integrity": "sha512-GZMB+a0mOMZs4MpDbj8RJp4cw+w1WV5NYD6xzgvzUJ5Ek2jerwfO2eADyI6ExDSUED+1X8aMbegahsJi+8mgpw==", + "cpu": [ + "ppc64" + ], "license": "MIT", - "dependencies": { - "@radix-ui/react-primitive": "2.0.0" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.27.2.tgz", + "integrity": "sha512-DVNI8jlPa7Ujbr1yjU2PfUSRtAUZPG9I1RwW4F4xFB1Imiu2on0ADiI/c3td+KmDtVKNbi+nffGDQMfcIMkwIA==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.27.2.tgz", + "integrity": "sha512-pvz8ZZ7ot/RBphf8fv60ljmaoydPU12VuXHImtAs0XhLLw+EXBi2BLe3OYSBslR4rryHvweW5gmkKFwTiFy6KA==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.27.2.tgz", + "integrity": "sha512-z8Ank4Byh4TJJOh4wpz8g2vDy75zFL0TlZlkUkEwYXuPSgX8yzep596n6mT7905kA9uHZsf/o2OJZubl2l3M7A==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.27.2.tgz", + "integrity": "sha512-davCD2Zc80nzDVRwXTcQP/28fiJbcOwvdolL0sOiOsbwBa72kegmVU0Wrh1MYrbuCL98Omp5dVhQFWRKR2ZAlg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.27.2.tgz", + "integrity": "sha512-ZxtijOmlQCBWGwbVmwOF/UCzuGIbUkqB1faQRf5akQmxRJ1ujusWsb3CVfk/9iZKr2L5SMU5wPBi1UWbvL+VQA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.27.2.tgz", + "integrity": "sha512-lS/9CN+rgqQ9czogxlMcBMGd+l8Q3Nj1MFQwBZJyoEKI50XGxwuzznYdwcav6lpOGv5BqaZXqvBSiB/kJ5op+g==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.27.2.tgz", + "integrity": "sha512-tAfqtNYb4YgPnJlEFu4c212HYjQWSO/w/h/lQaBK7RbwGIkBOuNKQI9tqWzx7Wtp7bTPaGC6MJvWI608P3wXYA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.27.2.tgz", + "integrity": "sha512-vWfq4GaIMP9AIe4yj1ZUW18RDhx6EPQKjwe7n8BbIecFtCQG4CfHGaHuh7fdfq+y3LIA2vGS/o9ZBGVxIDi9hw==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.27.2.tgz", + "integrity": "sha512-hYxN8pr66NsCCiRFkHUAsxylNOcAQaxSSkHMMjcpx0si13t1LHFphxJZUiGwojB1a/Hd5OiPIqDdXONia6bhTw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.27.2.tgz", + "integrity": "sha512-MJt5BRRSScPDwG2hLelYhAAKh9imjHK5+NE/tvnRLbIqUWa+0E9N4WNMjmp/kXXPHZGqPLxggwVhz7QP8CTR8w==", + "cpu": [ + "ia32" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.27.2.tgz", + "integrity": "sha512-lugyF1atnAT463aO6KPshVCJK5NgRnU4yb3FUumyVz+cGvZbontBgzeGFO1nF+dPueHD367a2ZXe1NtUkAjOtg==", + "cpu": [ + "loong64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.27.2.tgz", + "integrity": "sha512-nlP2I6ArEBewvJ2gjrrkESEZkB5mIoaTswuqNFRv/WYd+ATtUpe9Y09RnJvgvdag7he0OWgEZWhviS1OTOKixw==", + "cpu": [ + "mips64el" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.27.2.tgz", + "integrity": "sha512-C92gnpey7tUQONqg1n6dKVbx3vphKtTHJaNG2Ok9lGwbZil6DrfyecMsp9CrmXGQJmZ7iiVXvvZH6Ml5hL6XdQ==", + "cpu": [ + "ppc64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.27.2.tgz", + "integrity": "sha512-B5BOmojNtUyN8AXlK0QJyvjEZkWwy/FKvakkTDCziX95AowLZKR6aCDhG7LeF7uMCXEJqwa8Bejz5LTPYm8AvA==", + "cpu": [ + "riscv64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.27.2.tgz", + "integrity": "sha512-p4bm9+wsPwup5Z8f4EpfN63qNagQ47Ua2znaqGH6bqLlmJ4bx97Y9JdqxgGZ6Y8xVTixUnEkoKSHcpRlDnNr5w==", + "cpu": [ + "s390x" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.27.2.tgz", + "integrity": "sha512-uwp2Tip5aPmH+NRUwTcfLb+W32WXjpFejTIOWZFw/v7/KnpCDKG66u4DLcurQpiYTiYwQ9B7KOeMJvLCu/OvbA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.27.2.tgz", + "integrity": "sha512-Kj6DiBlwXrPsCRDeRvGAUb/LNrBASrfqAIok+xB0LxK8CHqxZ037viF13ugfsIpePH93mX7xfJp97cyDuTZ3cw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.27.2.tgz", + "integrity": "sha512-HwGDZ0VLVBY3Y+Nw0JexZy9o/nUAWq9MlV7cahpaXKW6TOzfVno3y3/M8Ga8u8Yr7GldLOov27xiCnqRZf0tCA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.27.2.tgz", + "integrity": "sha512-DNIHH2BPQ5551A7oSHD0CKbwIA/Ox7+78/AWkbS5QoRzaqlev2uFayfSxq68EkonB+IKjiuxBFoV8ESJy8bOHA==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.27.2.tgz", + "integrity": "sha512-/it7w9Nb7+0KFIzjalNJVR5bOzA9Vay+yIPLVHfIQYG/j+j9VTH84aNB8ExGKPU4AzfaEvN9/V4HV+F+vo8OEg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openharmony-arm64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.27.2.tgz", + "integrity": "sha512-LRBbCmiU51IXfeXk59csuX/aSaToeG7w48nMwA6049Y4J4+VbWALAuXcs+qcD04rHDuSCSRKdmY63sruDS5qag==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.27.2.tgz", + "integrity": "sha512-kMtx1yqJHTmqaqHPAzKCAkDaKsffmXkPHThSfRwZGyuqyIeBvf08KSsYXl+abf5HDAPMJIPnbBfXvP2ZC2TfHg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.27.2.tgz", + "integrity": "sha512-Yaf78O/B3Kkh+nKABUF++bvJv5Ijoy9AN1ww904rOXZFLWVc5OLOfL56W+C8F9xn5JQZa3UX6m+IktJnIb1Jjg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.27.2.tgz", + "integrity": "sha512-Iuws0kxo4yusk7sw70Xa2E2imZU5HoixzxfGCdxwBdhiDgt9vX9VUCBhqcwY7/uh//78A1hMkkROMJq9l27oLQ==", + "cpu": [ + "ia32" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.27.2.tgz", + "integrity": "sha512-sRdU18mcKf7F+YgheI/zGf5alZatMUTKj/jNS6l744f9u3WFu4v7twcUI9vu4mknF4Y9aDlblIie0IM+5xxaqQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@fal-works/esbuild-plugin-global-externals": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@fal-works/esbuild-plugin-global-externals/-/esbuild-plugin-global-externals-2.1.2.tgz", + "integrity": "sha512-cEee/Z+I12mZcFJshKcCqC8tuX5hG3s+d+9nZ3LabqKF1vKdF41B92pJVCBggjAGORAeOzyyDDKrZwIkLffeOQ==", + "license": "MIT" + }, + "node_modules/@floating-ui/core": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.7.3.tgz", + "integrity": "sha512-sGnvb5dmrJaKEZ+LDIpguvdX3bDlEllmv4/ClQ9awcmCZrlx5jQyyMWFM5kBI+EyNOCDDiKk8il0zeuX3Zlg/w==", + "license": "MIT", + "dependencies": { + "@floating-ui/utils": "^0.2.10" + } + }, + "node_modules/@floating-ui/dom": { + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.7.4.tgz", + "integrity": "sha512-OOchDgh4F2CchOX94cRVqhvy7b3AFb+/rQXyswmzmGakRfkMgoWVjfnLWkRirfLEfuD4ysVW16eXzwt3jHIzKA==", + "license": "MIT", + "dependencies": { + "@floating-ui/core": "^1.7.3", + "@floating-ui/utils": "^0.2.10" + } + }, + "node_modules/@floating-ui/react-dom": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.1.6.tgz", + "integrity": "sha512-4JX6rEatQEvlmgU80wZyq9RT96HZJa88q8hp0pBd+LrczeDI4o6uA2M+uvxngVHo4Ihr8uibXxH6+70zhAFrVw==", + "license": "MIT", + "dependencies": { + "@floating-ui/dom": "^1.7.4" + }, + "peerDependencies": { + "react": ">=16.8.0", + "react-dom": ">=16.8.0" + } + }, + "node_modules/@floating-ui/utils": { + "version": "0.2.10", + "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.10.tgz", + "integrity": "sha512-aGTxbpbg8/b5JfU1HXSrbH3wXZuLPJcNEcZQFMxLs3oSzgtVu6nFPkbbGGUvBcUjKV2YyB9Wxxabo+HEH9tcRQ==", + "license": "MIT" + }, + "node_modules/@iconify/types": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@iconify/types/-/types-2.0.0.tgz", + "integrity": "sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg==", + "license": "MIT" + }, + "node_modules/@iconify/utils": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@iconify/utils/-/utils-3.1.0.tgz", + "integrity": "sha512-Zlzem1ZXhI1iHeeERabLNzBHdOa4VhQbqAcOQaMKuTuyZCpwKbC2R4Dd0Zo3g9EAc+Y4fiarO8HIHRAth7+skw==", + "license": "MIT", + "dependencies": { + "@antfu/install-pkg": "^1.1.0", + "@iconify/types": "^2.0.0", + "mlly": "^1.8.0" + } + }, + "node_modules/@inquirer/ansi": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@inquirer/ansi/-/ansi-2.0.3.tgz", + "integrity": "sha512-g44zhR3NIKVs0zUesa4iMzExmZpLUdTLRMCStqX3GE5NT6VkPcxQGJ+uC8tDgBUC/vB1rUhUd55cOf++4NZcmw==", + "license": "MIT", + "engines": { + "node": ">=23.5.0 || ^22.13.0 || ^21.7.0 || ^20.12.0" + } + }, + "node_modules/@inquirer/checkbox": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/@inquirer/checkbox/-/checkbox-5.0.4.tgz", + "integrity": "sha512-DrAMU3YBGMUAp6ArwTIp/25CNDtDbxk7UjIrrtM25JVVrlVYlVzHh5HR1BDFu9JMyUoZ4ZanzeaHqNDttf3gVg==", + "license": "MIT", + "dependencies": { + "@inquirer/ansi": "^2.0.3", + "@inquirer/core": "^11.1.1", + "@inquirer/figures": "^2.0.3", + "@inquirer/type": "^4.0.3" + }, + "engines": { + "node": ">=23.5.0 || ^22.13.0 || ^21.7.0 || ^20.12.0" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/confirm": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/@inquirer/confirm/-/confirm-6.0.4.tgz", + "integrity": "sha512-WdaPe7foUnoGYvXzH4jp4wH/3l+dBhZ3uwhKjXjwdrq5tEIFaANxj6zrGHxLdsIA0yKM0kFPVcEalOZXBB5ISA==", + "license": "MIT", + "dependencies": { + "@inquirer/core": "^11.1.1", + "@inquirer/type": "^4.0.3" + }, + "engines": { + "node": ">=23.5.0 || ^22.13.0 || ^21.7.0 || ^20.12.0" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/core": { + "version": "11.1.1", + "resolved": "https://registry.npmjs.org/@inquirer/core/-/core-11.1.1.tgz", + "integrity": "sha512-hV9o15UxX46OyQAtaoMqAOxGR8RVl1aZtDx1jHbCtSJy1tBdTfKxLPKf7utsE4cRy4tcmCQ4+vdV+ca+oNxqNA==", + "license": "MIT", + "dependencies": { + "@inquirer/ansi": "^2.0.3", + "@inquirer/figures": "^2.0.3", + "@inquirer/type": "^4.0.3", + "cli-width": "^4.1.0", + "mute-stream": "^3.0.0", + "signal-exit": "^4.1.0", + "wrap-ansi": "^9.0.2" + }, + "engines": { + "node": ">=23.5.0 || ^22.13.0 || ^21.7.0 || ^20.12.0" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/editor": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/@inquirer/editor/-/editor-5.0.4.tgz", + "integrity": "sha512-QI3Jfqcv6UO2/VJaEFONH8Im1ll++Xn/AJTBn9Xf+qx2M+H8KZAdQ5sAe2vtYlo+mLW+d7JaMJB4qWtK4BG3pw==", + "license": "MIT", + "dependencies": { + "@inquirer/core": "^11.1.1", + "@inquirer/external-editor": "^2.0.3", + "@inquirer/type": "^4.0.3" + }, + "engines": { + "node": ">=23.5.0 || ^22.13.0 || ^21.7.0 || ^20.12.0" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/expand": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/@inquirer/expand/-/expand-5.0.4.tgz", + "integrity": "sha512-0I/16YwPPP0Co7a5MsomlZLpch48NzYfToyqYAOWtBmaXSB80RiNQ1J+0xx2eG+Wfxt0nHtpEWSRr6CzNVnOGg==", + "license": "MIT", + "dependencies": { + "@inquirer/core": "^11.1.1", + "@inquirer/type": "^4.0.3" + }, + "engines": { + "node": ">=23.5.0 || ^22.13.0 || ^21.7.0 || ^20.12.0" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/external-editor": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@inquirer/external-editor/-/external-editor-2.0.3.tgz", + "integrity": "sha512-LgyI7Agbda74/cL5MvA88iDpvdXI2KuMBCGRkbCl2Dg1vzHeOgs+s0SDcXV7b+WZJrv2+ERpWSM65Fpi9VfY3w==", + "license": "MIT", + "dependencies": { + "chardet": "^2.1.1", + "iconv-lite": "^0.7.2" + }, + "engines": { + "node": ">=23.5.0 || ^22.13.0 || ^21.7.0 || ^20.12.0" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/figures": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@inquirer/figures/-/figures-2.0.3.tgz", + "integrity": "sha512-y09iGt3JKoOCBQ3w4YrSJdokcD8ciSlMIWsD+auPu+OZpfxLuyz+gICAQ6GCBOmJJt4KEQGHuZSVff2jiNOy7g==", + "license": "MIT", + "engines": { + "node": ">=23.5.0 || ^22.13.0 || ^21.7.0 || ^20.12.0" + } + }, + "node_modules/@inquirer/input": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/@inquirer/input/-/input-5.0.4.tgz", + "integrity": "sha512-4B3s3jvTREDFvXWit92Yc6jF1RJMDy2VpSqKtm4We2oVU65YOh2szY5/G14h4fHlyQdpUmazU5MPCFZPRJ0AOw==", + "license": "MIT", + "dependencies": { + "@inquirer/core": "^11.1.1", + "@inquirer/type": "^4.0.3" + }, + "engines": { + "node": ">=23.5.0 || ^22.13.0 || ^21.7.0 || ^20.12.0" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/number": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@inquirer/number/-/number-4.0.4.tgz", + "integrity": "sha512-CmMp9LF5HwE+G/xWsC333TlCzYYbXMkcADkKzcawh49fg2a1ryLc7JL1NJYYt1lJ+8f4slikNjJM9TEL/AljYQ==", + "license": "MIT", + "dependencies": { + "@inquirer/core": "^11.1.1", + "@inquirer/type": "^4.0.3" + }, + "engines": { + "node": ">=23.5.0 || ^22.13.0 || ^21.7.0 || ^20.12.0" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/password": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/@inquirer/password/-/password-5.0.4.tgz", + "integrity": "sha512-ZCEPyVYvHK4W4p2Gy6sTp9nqsdHQCfiPXIP9LbJVW4yCinnxL/dDDmPaEZVysGrj8vxVReRnpfS2fOeODe9zjg==", + "license": "MIT", + "dependencies": { + "@inquirer/ansi": "^2.0.3", + "@inquirer/core": "^11.1.1", + "@inquirer/type": "^4.0.3" + }, + "engines": { + "node": ">=23.5.0 || ^22.13.0 || ^21.7.0 || ^20.12.0" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/prompts": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/@inquirer/prompts/-/prompts-8.2.0.tgz", + "integrity": "sha512-rqTzOprAj55a27jctS3vhvDDJzYXsr33WXTjODgVOru21NvBo9yIgLIAf7SBdSV0WERVly3dR6TWyp7ZHkvKFA==", + "license": "MIT", + "dependencies": { + "@inquirer/checkbox": "^5.0.4", + "@inquirer/confirm": "^6.0.4", + "@inquirer/editor": "^5.0.4", + "@inquirer/expand": "^5.0.4", + "@inquirer/input": "^5.0.4", + "@inquirer/number": "^4.0.4", + "@inquirer/password": "^5.0.4", + "@inquirer/rawlist": "^5.2.0", + "@inquirer/search": "^4.1.0", + "@inquirer/select": "^5.0.4" + }, + "engines": { + "node": ">=23.5.0 || ^22.13.0 || ^21.7.0 || ^20.12.0" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/rawlist": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@inquirer/rawlist/-/rawlist-5.2.0.tgz", + "integrity": "sha512-CciqGoOUMrFo6HxvOtU5uL8fkjCmzyeB6fG7O1vdVAZVSopUBYECOwevDBlqNLyyYmzpm2Gsn/7nLrpruy9RFg==", + "license": "MIT", + "dependencies": { + "@inquirer/core": "^11.1.1", + "@inquirer/type": "^4.0.3" + }, + "engines": { + "node": ">=23.5.0 || ^22.13.0 || ^21.7.0 || ^20.12.0" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/search": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@inquirer/search/-/search-4.1.0.tgz", + "integrity": "sha512-EAzemfiP4IFvIuWnrHpgZs9lAhWDA0GM3l9F4t4mTQ22IFtzfrk8xbkMLcAN7gmVML9O/i+Hzu8yOUyAaL6BKA==", + "license": "MIT", + "dependencies": { + "@inquirer/core": "^11.1.1", + "@inquirer/figures": "^2.0.3", + "@inquirer/type": "^4.0.3" + }, + "engines": { + "node": ">=23.5.0 || ^22.13.0 || ^21.7.0 || ^20.12.0" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/select": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/@inquirer/select/-/select-5.0.4.tgz", + "integrity": "sha512-s8KoGpPYMEQ6WXc0dT9blX2NtIulMdLOO3LA1UKOiv7KFWzlJ6eLkEYTDBIi+JkyKXyn8t/CD6TinxGjyLt57g==", + "license": "MIT", + "dependencies": { + "@inquirer/ansi": "^2.0.3", + "@inquirer/core": "^11.1.1", + "@inquirer/figures": "^2.0.3", + "@inquirer/type": "^4.0.3" + }, + "engines": { + "node": ">=23.5.0 || ^22.13.0 || ^21.7.0 || ^20.12.0" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/type": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@inquirer/type/-/type-4.0.3.tgz", + "integrity": "sha512-cKZN7qcXOpj1h+1eTTcGDVLaBIHNMT1Rz9JqJP5MnEJ0JhgVWllx7H/tahUp5YEK1qaByH2Itb8wLG/iScD5kw==", + "license": "MIT", + "engines": { + "node": ">=23.5.0 || ^22.13.0 || ^21.7.0 || ^20.12.0" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@isaacs/balanced-match": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@isaacs/balanced-match/-/balanced-match-4.0.1.tgz", + "integrity": "sha512-yzMTt9lEb8Gv7zRioUilSglI0c0smZ9k5D65677DLWLtWJaXIS3CqcGyUFByYKlnUj6TkjLVs54fBl6+TiGQDQ==", + "license": "MIT", + "engines": { + "node": "20 || >=22" + } + }, + "node_modules/@isaacs/brace-expansion": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@isaacs/brace-expansion/-/brace-expansion-5.0.0.tgz", + "integrity": "sha512-ZT55BDLV0yv0RBm2czMiZ+SqCGO7AvmOM3G/w2xhVPH+te0aKgFjmBvGlL1dH+ql2tgGO3MVrbb3jCKyvpgnxA==", + "license": "MIT", + "dependencies": { + "@isaacs/balanced-match": "^4.0.1" + }, + "engines": { + "node": "20 || >=22" + } + }, + "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==", + "license": "ISC", + "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/@isaacs/cliui/node_modules/ansi-styles": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", + "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/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==", + "license": "MIT" + }, + "node_modules/@isaacs/cliui/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==", + "license": "MIT", + "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/@isaacs/cliui/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==", + "license": "MIT", + "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/@jridgewell/gen-mapping": { + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/remapping": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", + "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "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==", + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@kentcdodds/md-temp": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/@kentcdodds/md-temp/-/md-temp-10.0.1.tgz", + "integrity": "sha512-AN6jXnByJUPY5yckpPD9m9Wvitat2/uheYPznisrh532BOG3A1nkdPnM7LNtji9u2aEvAfFMRN51b8Udw2p0mA==", + "license": "MIT", + "dependencies": { + "escape-goat": "^4.0.0", + "parse-numeric-range": "^1.3.0", + "shiki": "^3.7.0", + "tinypool": "^1.1.1", + "unified": "^11.0.5", + "unist-util-visit": "^5.0.0" + } + }, + "node_modules/@mdx-js/esbuild": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@mdx-js/esbuild/-/esbuild-3.1.1.tgz", + "integrity": "sha512-NS35VhTdvKNj5/B1JSD5W3kN1R0WDHgk+zCWq+tSChQw5L2Bgeiz7yyZPFrc5LWuPVOxE1xMbJr82bO9VVzmfQ==", + "license": "MIT", + "dependencies": { + "@mdx-js/mdx": "^3.0.0", + "@types/unist": "^3.0.0", + "source-map": "^0.7.0", + "vfile": "^6.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + }, + "peerDependencies": { + "esbuild": ">=0.14.0" + } + }, + "node_modules/@mdx-js/mdx": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@mdx-js/mdx/-/mdx-3.1.1.tgz", + "integrity": "sha512-f6ZO2ifpwAQIpzGWaBQT2TXxPv6z3RBzQKpVftEWN78Vl/YweF1uwussDx8ECAXVtr3Rs89fKyG9YlzUs9DyGQ==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "@types/estree-jsx": "^1.0.0", + "@types/hast": "^3.0.0", + "@types/mdx": "^2.0.0", + "acorn": "^8.0.0", + "collapse-white-space": "^2.0.0", + "devlop": "^1.0.0", + "estree-util-is-identifier-name": "^3.0.0", + "estree-util-scope": "^1.0.0", + "estree-walker": "^3.0.0", + "hast-util-to-jsx-runtime": "^2.0.0", + "markdown-extensions": "^2.0.0", + "recma-build-jsx": "^1.0.0", + "recma-jsx": "^1.0.0", + "recma-stringify": "^1.0.0", + "rehype-recma": "^1.0.0", + "remark-mdx": "^3.0.0", + "remark-parse": "^11.0.0", + "remark-rehype": "^11.0.0", + "source-map": "^0.7.0", + "unified": "^11.0.0", + "unist-util-position-from-estree": "^2.0.0", + "unist-util-stringify-position": "^4.0.0", + "unist-util-visit": "^5.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/@mermaid-js/parser": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/@mermaid-js/parser/-/parser-0.6.3.tgz", + "integrity": "sha512-lnjOhe7zyHjc+If7yT4zoedx2vo4sHaTmtkl1+or8BRTnCtDmcTpAjpzDSfCZrshM5bCoz0GyidzadJAH1xobA==", + "license": "MIT", + "dependencies": { + "langium": "3.3.1" + } + }, + "node_modules/@mjackson/node-fetch-server": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/@mjackson/node-fetch-server/-/node-fetch-server-0.2.0.tgz", + "integrity": "sha512-EMlH1e30yzmTpGLQjlFmaDAjyOeZhng1/XCd7DExR8PNAnG/G1tyruZxEoUe11ClnwGhGrtsdnyyUx1frSzjng==", + "license": "MIT" + }, + "node_modules/@mswjs/interceptors": { + "version": "0.40.0", + "resolved": "https://registry.npmjs.org/@mswjs/interceptors/-/interceptors-0.40.0.tgz", + "integrity": "sha512-EFd6cVbHsgLa6wa4RljGj6Wk75qoHxUSyc5asLyyPSyuhIcdS2Q3Phw6ImS1q+CkALthJRShiYfKANcQMuMqsQ==", + "license": "MIT", + "dependencies": { + "@open-draft/deferred-promise": "^2.2.0", + "@open-draft/logger": "^0.3.0", + "@open-draft/until": "^2.0.0", + "is-node-process": "^1.2.0", + "outvariant": "^1.4.3", + "strict-event-emitter": "^0.5.1" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@mux/mux-data-google-ima": { + "version": "0.2.8", + "resolved": "https://registry.npmjs.org/@mux/mux-data-google-ima/-/mux-data-google-ima-0.2.8.tgz", + "integrity": "sha512-0ZEkHdcZ6bS8QtcjFcoJeZxJTpX7qRIledf4q1trMWPznugvtajCjCM2kieK/pzkZj1JM6liDRFs1PJSfVUs2A==", + "license": "MIT", + "dependencies": { + "mux-embed": "5.9.0" + } + }, + "node_modules/@mux/mux-player": { + "version": "3.10.2", + "resolved": "https://registry.npmjs.org/@mux/mux-player/-/mux-player-3.10.2.tgz", + "integrity": "sha512-iLFOCUgIqXum7bErn2cPb+f/DHCXC8i2rbFl6+SIf6r/oHRp0djkoLaeaX30hsA/SUdCLQze7oL4IM2QHRmONg==", + "license": "MIT", + "dependencies": { + "@mux/mux-video": "0.29.2", + "@mux/playback-core": "0.32.2", + "media-chrome": "~4.17.2", + "player.style": "^0.3.0" + } + }, + "node_modules/@mux/mux-player-react": { + "version": "3.10.2", + "resolved": "https://registry.npmjs.org/@mux/mux-player-react/-/mux-player-react-3.10.2.tgz", + "integrity": "sha512-Grg9us93llxESHAPDxWZJKZiknTi0AtpqPLuyiqiLc7DYcJkgnUHG8pSHQ8i7A/gKC5tOhCyCoKm3p2Ei8vIrQ==", + "license": "MIT", + "dependencies": { + "@mux/mux-player": "3.10.2", + "@mux/playback-core": "0.32.2", + "prop-types": "^15.8.1" + }, + "peerDependencies": { + "@types/react": "^17.0.0 || ^17.0.0-0 || ^18 || ^18.0.0-0 || ^19 || ^19.0.0-0", + "react": "^17.0.2 || ^17.0.0-0 || ^18 || ^18.0.0-0 || ^19 || ^19.0.0-0", + "react-dom": "^17.0.2 || ^17.0.2-0 || ^18 || ^18.0.0-0 || ^19 || ^19.0.0-0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@mux/mux-video": { + "version": "0.29.2", + "resolved": "https://registry.npmjs.org/@mux/mux-video/-/mux-video-0.29.2.tgz", + "integrity": "sha512-qKnbMoPI50oJnH89d8UJjWPx6yrtyAmm6wysr1biZI561f257b7P8VE8fnXb9Ak1Gs3rBiNLiw/vCXwBdCkl+A==", + "license": "MIT", + "dependencies": { + "@mux/mux-data-google-ima": "0.2.8", + "@mux/playback-core": "0.32.2", + "castable-video": "~1.1.11", + "custom-media-element": "~1.4.5", + "media-tracks": "~0.3.4" + } + }, + "node_modules/@mux/playback-core": { + "version": "0.32.2", + "resolved": "https://registry.npmjs.org/@mux/playback-core/-/playback-core-0.32.2.tgz", + "integrity": "sha512-cmaZN0hRIrEFcSVsj+quBDOeztg5oxug02WwuAiweWkMt1vSBM8nlzuF03coRnD/sKhgnQawdJOrng42R8I0Cg==", + "license": "MIT", + "dependencies": { + "hls.js": "~1.6.15", + "mux-embed": "^5.8.3" + } + }, + "node_modules/@nasa-gcn/remix-seo": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@nasa-gcn/remix-seo/-/remix-seo-2.0.1.tgz", + "integrity": "sha512-g9biDdYfsdFBnOU7lM+7vPGEXSEMRnWmfVLDQ98pT0PnTT/O3pFuA+s3DA0Mj9IwnAq9IcLs2Wee/aL6fvEA+A==", + "license": "MIT", + "dependencies": { + "lodash": "^4.17.21" + }, + "peerDependencies": { + "@remix-run/react": "^1.0.0 || ^2.0.0", + "@remix-run/server-runtime": "^1.0.0 || ^2.0.0" + } + }, + "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==", + "license": "MIT", + "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==", + "license": "MIT", + "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==", + "license": "MIT", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@open-draft/deferred-promise": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@open-draft/deferred-promise/-/deferred-promise-2.2.0.tgz", + "integrity": "sha512-CecwLWx3rhxVQF6V4bAgPS5t+So2sTbPgAzafKkVizyi7tlwpcFpdFqq+wqF2OwNBmqFuu6tOyouTuxgpMfzmA==", + "license": "MIT" + }, + "node_modules/@open-draft/logger": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@open-draft/logger/-/logger-0.3.0.tgz", + "integrity": "sha512-X2g45fzhxH238HKO4xbSr7+wBS8Fvw6ixhTDuvLd5mqh6bJJCFAPwU9mPDxbcrRtfxv4u5IHCEH77BmxvXmmxQ==", + "license": "MIT", + "dependencies": { + "is-node-process": "^1.2.0", + "outvariant": "^1.4.0" + } + }, + "node_modules/@open-draft/until": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@open-draft/until/-/until-2.1.0.tgz", + "integrity": "sha512-U69T3ItWHvLwGg5eJ0n3I62nWuE6ilHlmz7zM0npLBRvPRd7e6NYmg54vvRtP5mZG7kZqZCFVdsTWo7BPtBujg==", + "license": "MIT" + }, + "node_modules/@opentelemetry/api": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/api/-/api-1.9.0.tgz", + "integrity": "sha512-3giAOQvZiH5F9bMlMiv8+GSPMeqg0dbaeo58/0SlA9sxSqZhnUtxzX9/2FzyhS9sWQf5S0GJE0AKBrFqjpeYcg==", + "license": "Apache-2.0", + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/@opentelemetry/api-logs": { + "version": "0.211.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/api-logs/-/api-logs-0.211.0.tgz", + "integrity": "sha512-swFdZq8MCdmdR22jTVGQDhwqDzcI4M10nhjXkLr1EsIzXgZBqm4ZlmmcWsg3TSNf+3mzgOiqveXmBLZuDi2Lgg==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/api": "^1.3.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/@opentelemetry/context-async-hooks": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/context-async-hooks/-/context-async-hooks-2.5.0.tgz", + "integrity": "sha512-uOXpVX0ZjO7heSVjhheW2XEPrhQAWr2BScDPoZ9UDycl5iuHG+Usyc3AIfG6kZeC1GyLpMInpQ6X5+9n69yOFw==", + "license": "Apache-2.0", + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/core": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.5.0.tgz", + "integrity": "sha512-ka4H8OM6+DlUhSAZpONu0cPBtPPTQKxbxVzC4CzVx5+K4JnroJVBtDzLAMx4/3CDTJXRvVFhpFjtl4SaiTNoyQ==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/semantic-conventions": "^1.29.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/instrumentation": { + "version": "0.211.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.211.0.tgz", + "integrity": "sha512-h0nrZEC/zvI994nhg7EgQ8URIHt0uDTwN90r3qQUdZORS455bbx+YebnGeEuFghUT0HlJSrLF4iHw67f+odY+Q==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/api-logs": "0.211.0", + "import-in-the-middle": "^2.0.0", + "require-in-the-middle": "^8.0.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-amqplib": { + "version": "0.58.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-amqplib/-/instrumentation-amqplib-0.58.0.tgz", + "integrity": "sha512-fjpQtH18J6GxzUZ+cwNhWUpb71u+DzT7rFkg5pLssDGaEber91Y2WNGdpVpwGivfEluMlNMZumzjEqfg8DeKXQ==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "^2.0.0", + "@opentelemetry/instrumentation": "^0.211.0", + "@opentelemetry/semantic-conventions": "^1.33.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-connect": { + "version": "0.54.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-connect/-/instrumentation-connect-0.54.0.tgz", + "integrity": "sha512-43RmbhUhqt3uuPnc16cX6NsxEASEtn8z/cYV8Zpt6EP4p2h9s4FNuJ4Q9BbEQ2C0YlCCB/2crO1ruVz/hWt8fA==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "^2.0.0", + "@opentelemetry/instrumentation": "^0.211.0", + "@opentelemetry/semantic-conventions": "^1.27.0", + "@types/connect": "3.4.38" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-dataloader": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-dataloader/-/instrumentation-dataloader-0.28.0.tgz", + "integrity": "sha512-ExXGBp0sUj8yhm6Znhf9jmuOaGDsYfDES3gswZnKr4MCqoBWQdEFn6EoDdt5u+RdbxQER+t43FoUihEfTSqsjA==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/instrumentation": "^0.211.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-express": { + "version": "0.59.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-express/-/instrumentation-express-0.59.0.tgz", + "integrity": "sha512-pMKV/qnHiW/Q6pmbKkxt0eIhuNEtvJ7sUAyee192HErlr+a1Jx+FZ3WjfmzhQL1geewyGEiPGkmjjAgNY8TgDA==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "^2.0.0", + "@opentelemetry/instrumentation": "^0.211.0", + "@opentelemetry/semantic-conventions": "^1.27.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-fs": { + "version": "0.30.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-fs/-/instrumentation-fs-0.30.0.tgz", + "integrity": "sha512-n3Cf8YhG7reaj5dncGlRIU7iT40bxPOjsBEA5Bc1a1g6e9Qvb+JFJ7SEiMlPbUw4PBmxE3h40ltE8LZ3zVt6OA==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "^2.0.0", + "@opentelemetry/instrumentation": "^0.211.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-generic-pool": { + "version": "0.54.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-generic-pool/-/instrumentation-generic-pool-0.54.0.tgz", + "integrity": "sha512-8dXMBzzmEdXfH/wjuRvcJnUFeWzZHUnExkmFJ2uPfa31wmpyBCMxO59yr8f/OXXgSogNgi/uPo9KW9H7LMIZ+g==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/instrumentation": "^0.211.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-graphql": { + "version": "0.58.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-graphql/-/instrumentation-graphql-0.58.0.tgz", + "integrity": "sha512-+yWVVY7fxOs3j2RixCbvue8vUuJ1inHxN2q1sduqDB0Wnkr4vOzVKRYl/Zy7B31/dcPS72D9lo/kltdOTBM3bQ==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/instrumentation": "^0.211.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-hapi": { + "version": "0.57.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-hapi/-/instrumentation-hapi-0.57.0.tgz", + "integrity": "sha512-Os4THbvls8cTQTVA8ApLfZZztuuqGEeqog0XUnyRW7QVF0d/vOVBEcBCk1pazPFmllXGEdNbbat8e2fYIWdFbw==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "^2.0.0", + "@opentelemetry/instrumentation": "^0.211.0", + "@opentelemetry/semantic-conventions": "^1.27.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" } }, - "node_modules/@epic-web/workshop-app/node_modules/@radix-ui/react-collapsible": { - "version": "1.1.0", - "inBundle": true, - "license": "MIT", + "node_modules/@opentelemetry/instrumentation-http": { + "version": "0.211.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-http/-/instrumentation-http-0.211.0.tgz", + "integrity": "sha512-n0IaQ6oVll9PP84SjbOCwDjaJasWRHi6BLsbMLiT6tNj7QbVOkuA5sk/EfZczwI0j5uTKl1awQPivO/ldVtsqA==", + "license": "Apache-2.0", "dependencies": { - "@radix-ui/primitive": "1.1.0", - "@radix-ui/react-compose-refs": "1.1.0", - "@radix-ui/react-context": "1.1.0", - "@radix-ui/react-id": "1.1.0", - "@radix-ui/react-presence": "1.1.0", - "@radix-ui/react-primitive": "2.0.0", - "@radix-ui/react-use-controllable-state": "1.1.0", - "@radix-ui/react-use-layout-effect": "1.1.0" + "@opentelemetry/core": "2.5.0", + "@opentelemetry/instrumentation": "0.211.0", + "@opentelemetry/semantic-conventions": "^1.29.0", + "forwarded-parse": "2.1.2" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" }, "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-ioredis": { + "version": "0.59.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-ioredis/-/instrumentation-ioredis-0.59.0.tgz", + "integrity": "sha512-875UxzBHWkW+P4Y45SoFM2AR8f8TzBMD8eO7QXGCyFSCUMP5s9vtt/BS8b/r2kqLyaRPK6mLbdnZznK3XzQWvw==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/instrumentation": "^0.211.0", + "@opentelemetry/redis-common": "^0.38.2", + "@opentelemetry/semantic-conventions": "^1.33.0" }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" } }, - "node_modules/@epic-web/workshop-app/node_modules/@radix-ui/react-collection": { - "version": "1.1.0", - "inBundle": true, - "license": "MIT", + "node_modules/@opentelemetry/instrumentation-kafkajs": { + "version": "0.20.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-kafkajs/-/instrumentation-kafkajs-0.20.0.tgz", + "integrity": "sha512-yJXOuWZROzj7WmYCUiyT27tIfqBrVtl1/TwVbQyWPz7rL0r1Lu7kWjD0PiVeTCIL6CrIZ7M2s8eBxsTAOxbNvw==", + "license": "Apache-2.0", "dependencies": { - "@radix-ui/react-compose-refs": "1.1.0", - "@radix-ui/react-context": "1.1.0", - "@radix-ui/react-primitive": "2.0.0", - "@radix-ui/react-slot": "1.1.0" + "@opentelemetry/instrumentation": "^0.211.0", + "@opentelemetry/semantic-conventions": "^1.30.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" }, "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-knex": { + "version": "0.55.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-knex/-/instrumentation-knex-0.55.0.tgz", + "integrity": "sha512-FtTL5DUx5Ka/8VK6P1VwnlUXPa3nrb7REvm5ddLUIeXXq4tb9pKd+/ThB1xM/IjefkRSN3z8a5t7epYw1JLBJQ==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/instrumentation": "^0.211.0", + "@opentelemetry/semantic-conventions": "^1.33.1" }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" } }, - "node_modules/@epic-web/workshop-app/node_modules/@radix-ui/react-compose-refs": { - "version": "1.1.0", - "inBundle": true, - "license": "MIT", + "node_modules/@opentelemetry/instrumentation-koa": { + "version": "0.59.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-koa/-/instrumentation-koa-0.59.0.tgz", + "integrity": "sha512-K9o2skADV20Skdu5tG2bogPKiSpXh4KxfLjz6FuqIVvDJNibwSdu5UvyyBzRVp1rQMV6UmoIk6d3PyPtJbaGSg==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "^2.0.0", + "@opentelemetry/instrumentation": "^0.211.0", + "@opentelemetry/semantic-conventions": "^1.36.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + "@opentelemetry/api": "^1.9.0" + } + }, + "node_modules/@opentelemetry/instrumentation-lru-memoizer": { + "version": "0.55.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-lru-memoizer/-/instrumentation-lru-memoizer-0.55.0.tgz", + "integrity": "sha512-FDBfT7yDGcspN0Cxbu/k8A0Pp1Jhv/m7BMTzXGpcb8ENl3tDj/51U65R5lWzUH15GaZA15HQ5A5wtafklxYj7g==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/instrumentation": "^0.211.0" }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" } }, - "node_modules/@epic-web/workshop-app/node_modules/@radix-ui/react-context": { - "version": "1.1.0", - "inBundle": true, - "license": "MIT", + "node_modules/@opentelemetry/instrumentation-mongodb": { + "version": "0.64.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-mongodb/-/instrumentation-mongodb-0.64.0.tgz", + "integrity": "sha512-pFlCJjweTqVp7B220mCvCld1c1eYKZfQt1p3bxSbcReypKLJTwat+wbL2YZoX9jPi5X2O8tTKFEOahO5ehQGsA==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/instrumentation": "^0.211.0", + "@opentelemetry/semantic-conventions": "^1.33.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-mongoose": { + "version": "0.57.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-mongoose/-/instrumentation-mongoose-0.57.0.tgz", + "integrity": "sha512-MthiekrU/BAJc5JZoZeJmo0OTX6ycJMiP6sMOSRTkvz5BrPMYDqaJos0OgsLPL/HpcgHP7eo5pduETuLguOqcg==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "^2.0.0", + "@opentelemetry/instrumentation": "^0.211.0", + "@opentelemetry/semantic-conventions": "^1.33.0" }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" } }, - "node_modules/@epic-web/workshop-app/node_modules/@radix-ui/react-direction": { - "version": "1.1.0", - "inBundle": true, + "node_modules/@opentelemetry/instrumentation-mysql": { + "version": "0.57.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-mysql/-/instrumentation-mysql-0.57.0.tgz", + "integrity": "sha512-HFS/+FcZ6Q7piM7Il7CzQ4VHhJvGMJWjx7EgCkP5AnTntSN5rb5Xi3TkYJHBKeR27A0QqPlGaCITi93fUDs++Q==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/instrumentation": "^0.211.0", + "@opentelemetry/semantic-conventions": "^1.33.0", + "@types/mysql": "2.15.27" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-mysql2": { + "version": "0.57.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-mysql2/-/instrumentation-mysql2-0.57.0.tgz", + "integrity": "sha512-nHSrYAwF7+aV1E1V9yOOP9TchOodb6fjn4gFvdrdQXiRE7cMuffyLLbCZlZd4wsspBzVwOXX8mpURdRserAhNA==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/instrumentation": "^0.211.0", + "@opentelemetry/semantic-conventions": "^1.33.0", + "@opentelemetry/sql-common": "^0.41.2" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-pg": { + "version": "0.63.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-pg/-/instrumentation-pg-0.63.0.tgz", + "integrity": "sha512-dKm/ODNN3GgIQVlbD6ZPxwRc3kleLf95hrRWXM+l8wYo+vSeXtEpQPT53afEf6VFWDVzJK55VGn8KMLtSve/cg==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "^2.0.0", + "@opentelemetry/instrumentation": "^0.211.0", + "@opentelemetry/semantic-conventions": "^1.34.0", + "@opentelemetry/sql-common": "^0.41.2", + "@types/pg": "8.15.6", + "@types/pg-pool": "2.0.7" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-redis": { + "version": "0.59.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-redis/-/instrumentation-redis-0.59.0.tgz", + "integrity": "sha512-JKv1KDDYA2chJ1PC3pLP+Q9ISMQk6h5ey+99mB57/ARk0vQPGZTTEb4h4/JlcEpy7AYT8HIGv7X6l+br03Neeg==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/instrumentation": "^0.211.0", + "@opentelemetry/redis-common": "^0.38.2", + "@opentelemetry/semantic-conventions": "^1.27.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-tedious": { + "version": "0.30.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-tedious/-/instrumentation-tedious-0.30.0.tgz", + "integrity": "sha512-bZy9Q8jFdycKQ2pAsyuHYUHNmCxCOGdG6eg1Mn75RvQDccq832sU5OWOBnc12EFUELI6icJkhR7+EQKMBam2GA==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/instrumentation": "^0.211.0", + "@opentelemetry/semantic-conventions": "^1.33.0", + "@types/tedious": "^4.0.14" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-undici": { + "version": "0.21.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-undici/-/instrumentation-undici-0.21.0.tgz", + "integrity": "sha512-gok0LPUOTz2FQ1YJMZzaHcOzDFyT64XJ8M9rNkugk923/p6lDGms/cRW1cqgqp6N6qcd6K6YdVHwPEhnx9BWbw==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "^2.0.0", + "@opentelemetry/instrumentation": "^0.211.0", + "@opentelemetry/semantic-conventions": "^1.24.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.7.0" + } + }, + "node_modules/@opentelemetry/redis-common": { + "version": "0.38.2", + "resolved": "https://registry.npmjs.org/@opentelemetry/redis-common/-/redis-common-0.38.2.tgz", + "integrity": "sha512-1BCcU93iwSRZvDAgwUxC/DV4T/406SkMfxGqu5ojc3AvNI+I9GhV7v0J1HljsczuuhcnFLYqD5VmwVXfCGHzxA==", + "license": "Apache-2.0", + "engines": { + "node": "^18.19.0 || >=20.6.0" + } + }, + "node_modules/@opentelemetry/resources": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-2.5.0.tgz", + "integrity": "sha512-F8W52ApePshpoSrfsSk1H2yJn9aKjCrbpQF1M9Qii0GHzbfVeFUB+rc3X4aggyZD8x9Gu3Slua+s6krmq6Dt8g==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "2.5.0", + "@opentelemetry/semantic-conventions": "^1.29.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.3.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/sdk-trace-base": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-base/-/sdk-trace-base-2.5.0.tgz", + "integrity": "sha512-VzRf8LzotASEyNDUxTdaJ9IRJ1/h692WyArDBInf5puLCjxbICD6XkHgpuudis56EndyS7LYFmtTMny6UABNdQ==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "2.5.0", + "@opentelemetry/resources": "2.5.0", + "@opentelemetry/semantic-conventions": "^1.29.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.3.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/semantic-conventions": { + "version": "1.39.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.39.0.tgz", + "integrity": "sha512-R5R9tb2AXs2IRLNKLBJDynhkfmx7mX0vi8NkhZb3gUkPWHn6HXk5J8iQ/dql0U3ApfWym4kXXmBDRGO+oeOfjg==", + "license": "Apache-2.0", + "engines": { + "node": ">=14" + } + }, + "node_modules/@opentelemetry/sql-common": { + "version": "0.41.2", + "resolved": "https://registry.npmjs.org/@opentelemetry/sql-common/-/sql-common-0.41.2.tgz", + "integrity": "sha512-4mhWm3Z8z+i508zQJ7r6Xi7y4mmoJpdvH0fZPFRkWrdp5fq7hhZ2HhYokEOLkfqSMgPR4Z9EyB3DBkbKGOqZiQ==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "^2.0.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.1.0" + } + }, + "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==", "license": "MIT", + "optional": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/@playwright/test": { + "version": "1.58.0", + "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.58.0.tgz", + "integrity": "sha512-fWza+Lpbj6SkQKCrU6si4iu+fD2dD3gxNHFhUPxsfXBPhnv3rRSQVd0NtBUT9Z/RhF/boCBcuUaMUSTRTopjZg==", + "license": "Apache-2.0", + "dependencies": { + "playwright": "1.58.0" + }, + "bin": { + "playwright": "cli.js" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@prisma/instrumentation": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@prisma/instrumentation/-/instrumentation-7.2.0.tgz", + "integrity": "sha512-Rh9Z4x5kEj1OdARd7U18AtVrnL6rmLSI0qYShaB4W7Wx5BKbgzndWF+QnuzMb7GLfVdlT5aYCXoPQVYuYtVu0g==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/instrumentation": "^0.207.0" + }, "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + "@opentelemetry/api": "^1.8" + } + }, + "node_modules/@prisma/instrumentation/node_modules/@opentelemetry/api-logs": { + "version": "0.207.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/api-logs/-/api-logs-0.207.0.tgz", + "integrity": "sha512-lAb0jQRVyleQQGiuuvCOTDVspc14nx6XJjP4FspJ1sNARo3Regq4ZZbrc3rN4b1TYSuUCvgH+UXUPug4SLOqEQ==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/api": "^1.3.0" }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } + "engines": { + "node": ">=8.0.0" } }, - "node_modules/@epic-web/workshop-app/node_modules/@radix-ui/react-dismissable-layer": { - "version": "1.1.0", - "inBundle": true, + "node_modules/@prisma/instrumentation/node_modules/@opentelemetry/instrumentation": { + "version": "0.207.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.207.0.tgz", + "integrity": "sha512-y6eeli9+TLKnznrR8AZlQMSJT7wILpXH+6EYq5Vf/4Ao+huI7EedxQHwRgVUOMLFbe7VFDvHJrX9/f4lcwnJsA==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/api-logs": "0.207.0", + "import-in-the-middle": "^2.0.0", + "require-in-the-middle": "^8.0.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@radix-ui/number": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/number/-/number-1.1.1.tgz", + "integrity": "sha512-MkKCwxlXTgz6CFoJx3pCwn07GKp36+aZyu/u2Ln2VrA5DcdyCZkASEDBTd8x5whTQQL5CiYf4prXKLcgQdv29g==", + "license": "MIT" + }, + "node_modules/@radix-ui/primitive": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@radix-ui/primitive/-/primitive-1.1.3.tgz", + "integrity": "sha512-JTF99U/6XIjCBo0wqkU5sK10glYe27MRRsfwoiq5zzOEZLHU3A3KCMa5X/azekYRCJ0HlwI0crAXS/5dEHTzDg==", + "license": "MIT" + }, + "node_modules/@radix-ui/react-accordion": { + "version": "1.2.12", + "resolved": "https://registry.npmjs.org/@radix-ui/react-accordion/-/react-accordion-1.2.12.tgz", + "integrity": "sha512-T4nygeh9YE9dLRPhAHSeOZi7HBXo+0kYIPJXayZfvWOWA0+n3dESrZbjfDPUABkUNym6Hd+f2IR113To8D2GPA==", "license": "MIT", "dependencies": { - "@radix-ui/primitive": "1.1.0", - "@radix-ui/react-compose-refs": "1.1.0", - "@radix-ui/react-primitive": "2.0.0", - "@radix-ui/react-use-callback-ref": "1.1.0", - "@radix-ui/react-use-escape-keydown": "1.1.0" + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-collapsible": "1.1.12", + "@radix-ui/react-collection": "1.1.7", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-direction": "1.1.1", + "@radix-ui/react-id": "1.1.1", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-use-controllable-state": "1.2.2" }, "peerDependencies": { "@types/react": "*", @@ -785,28 +2446,43 @@ } } }, - "node_modules/@epic-web/workshop-app/node_modules/@radix-ui/react-focus-guards": { - "version": "1.1.0", - "inBundle": true, + "node_modules/@radix-ui/react-arrow": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/@radix-ui/react-arrow/-/react-arrow-1.1.7.tgz", + "integrity": "sha512-F+M1tLhO+mlQaOWspE8Wstg+z6PwxwRd8oQ8IXceWz92kfAmalTRf0EjrouQeo7QssEPfCn05B4Ihs1K9WQ/7w==", "license": "MIT", + "dependencies": { + "@radix-ui/react-primitive": "2.1.3" + }, "peerDependencies": { "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "peerDependenciesMeta": { "@types/react": { "optional": true + }, + "@types/react-dom": { + "optional": true } } }, - "node_modules/@epic-web/workshop-app/node_modules/@radix-ui/react-focus-scope": { - "version": "1.1.0", - "inBundle": true, + "node_modules/@radix-ui/react-collapsible": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/@radix-ui/react-collapsible/-/react-collapsible-1.1.12.tgz", + "integrity": "sha512-Uu+mSh4agx2ib1uIGPP4/CKNULyajb3p92LsVXmH2EHVMTfZWpll88XJ0j4W0z3f8NK1eYl1+Mf/szHPmcHzyA==", "license": "MIT", "dependencies": { - "@radix-ui/react-compose-refs": "1.1.0", - "@radix-ui/react-primitive": "2.0.0", - "@radix-ui/react-use-callback-ref": "1.1.0" + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-id": "1.1.1", + "@radix-ui/react-presence": "1.1.5", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-use-controllable-state": "1.2.2", + "@radix-ui/react-use-layout-effect": "1.1.1" }, "peerDependencies": { "@types/react": "*", @@ -823,97 +2499,82 @@ } } }, - "node_modules/@epic-web/workshop-app/node_modules/@radix-ui/react-id": { - "version": "1.1.0", - "inBundle": true, + "node_modules/@radix-ui/react-collection": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/@radix-ui/react-collection/-/react-collection-1.1.7.tgz", + "integrity": "sha512-Fh9rGN0MoI4ZFUNyfFVNU4y9LUz93u9/0K+yLgA2bwRojxM8JU1DyvvMBabnZPBgMWREAJvU2jjVzq+LrFUglw==", "license": "MIT", "dependencies": { - "@radix-ui/react-use-layout-effect": "1.1.0" + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-slot": "1.2.3" }, "peerDependencies": { "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "peerDependenciesMeta": { "@types/react": { "optional": true + }, + "@types/react-dom": { + "optional": true } } }, - "node_modules/@epic-web/workshop-app/node_modules/@radix-ui/react-popover": { - "version": "1.1.1", - "inBundle": true, - "license": "MIT", - "dependencies": { - "@radix-ui/primitive": "1.1.0", - "@radix-ui/react-compose-refs": "1.1.0", - "@radix-ui/react-context": "1.1.0", - "@radix-ui/react-dismissable-layer": "1.1.0", - "@radix-ui/react-focus-guards": "1.1.0", - "@radix-ui/react-focus-scope": "1.1.0", - "@radix-ui/react-id": "1.1.0", - "@radix-ui/react-popper": "1.2.0", - "@radix-ui/react-portal": "1.1.1", - "@radix-ui/react-presence": "1.1.0", - "@radix-ui/react-primitive": "2.0.0", - "@radix-ui/react-slot": "1.1.0", - "@radix-ui/react-use-controllable-state": "1.1.0", - "aria-hidden": "^1.1.1", - "react-remove-scroll": "2.5.7" - }, + "node_modules/@radix-ui/react-compose-refs": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.1.2.tgz", + "integrity": "sha512-z4eqJvfiNnFMHIIvXP3CY57y2WJs5g2v3X0zm9mEJkrkNv4rDxu+sg9Jh8EkXyeqBkB7SOcboo9dMVqhyrACIg==", + "license": "MIT", "peerDependencies": { "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "peerDependenciesMeta": { "@types/react": { "optional": true - }, - "@types/react-dom": { - "optional": true } } }, - "node_modules/@epic-web/workshop-app/node_modules/@radix-ui/react-popper": { - "version": "1.2.0", - "inBundle": true, + "node_modules/@radix-ui/react-context": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.1.2.tgz", + "integrity": "sha512-jCi/QKUM2r1Ju5a3J64TH2A5SpKAgh0LpknyqdQ4m6DCV0xJ2HG1xARRwNGPQfi1SLdLWZ1OJz6F4OMBBNiGJA==", "license": "MIT", - "dependencies": { - "@floating-ui/react-dom": "^2.0.0", - "@radix-ui/react-arrow": "1.1.0", - "@radix-ui/react-compose-refs": "1.1.0", - "@radix-ui/react-context": "1.1.0", - "@radix-ui/react-primitive": "2.0.0", - "@radix-ui/react-use-callback-ref": "1.1.0", - "@radix-ui/react-use-layout-effect": "1.1.0", - "@radix-ui/react-use-rect": "1.1.0", - "@radix-ui/react-use-size": "1.1.0", - "@radix-ui/rect": "1.1.0" - }, "peerDependencies": { "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "peerDependenciesMeta": { "@types/react": { "optional": true - }, - "@types/react-dom": { - "optional": true } } }, - "node_modules/@epic-web/workshop-app/node_modules/@radix-ui/react-portal": { - "version": "1.1.1", - "inBundle": true, + "node_modules/@radix-ui/react-dialog": { + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/@radix-ui/react-dialog/-/react-dialog-1.1.15.tgz", + "integrity": "sha512-TCglVRtzlffRNxRMEyR36DGBLJpeusFcgMVD9PZEzAKnUs1lKCgX5u9BmC2Yg+LL9MgZDugFFs1Vl+Jp4t/PGw==", "license": "MIT", "dependencies": { - "@radix-ui/react-primitive": "2.0.0", - "@radix-ui/react-use-layout-effect": "1.1.0" + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-dismissable-layer": "1.1.11", + "@radix-ui/react-focus-guards": "1.1.3", + "@radix-ui/react-focus-scope": "1.1.7", + "@radix-ui/react-id": "1.1.1", + "@radix-ui/react-portal": "1.1.9", + "@radix-ui/react-presence": "1.1.5", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-slot": "1.2.3", + "@radix-ui/react-use-controllable-state": "1.2.2", + "aria-hidden": "^1.2.4", + "react-remove-scroll": "^2.6.3" }, "peerDependencies": { "@types/react": "*", @@ -930,35 +2591,32 @@ } } }, - "node_modules/@epic-web/workshop-app/node_modules/@radix-ui/react-presence": { - "version": "1.1.0", - "inBundle": true, + "node_modules/@radix-ui/react-direction": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-direction/-/react-direction-1.1.1.tgz", + "integrity": "sha512-1UEWRX6jnOA2y4H5WczZ44gOOjTEmlqv1uNW4GAJEO5+bauCBhv8snY65Iw5/VOS/ghKN9gr2KjnLKxrsvoMVw==", "license": "MIT", - "dependencies": { - "@radix-ui/react-compose-refs": "1.1.0", - "@radix-ui/react-use-layout-effect": "1.1.0" - }, "peerDependencies": { "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "peerDependenciesMeta": { "@types/react": { "optional": true - }, - "@types/react-dom": { - "optional": true } } }, - "node_modules/@epic-web/workshop-app/node_modules/@radix-ui/react-primitive": { - "version": "2.0.0", - "inBundle": true, + "node_modules/@radix-ui/react-dismissable-layer": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/@radix-ui/react-dismissable-layer/-/react-dismissable-layer-1.1.11.tgz", + "integrity": "sha512-Nqcp+t5cTB8BinFkZgXiMJniQH0PsUt2k51FUhbdfeKvc4ACcG2uQniY/8+h1Yv6Kza4Q7lD7PQV0z0oicE0Mg==", "license": "MIT", "dependencies": { - "@radix-ui/react-slot": "1.1.0" + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-use-callback-ref": "1.1.1", + "@radix-ui/react-use-escape-keydown": "1.1.1" }, "peerDependencies": { "@types/react": "*", @@ -975,62 +2633,30 @@ } } }, - "node_modules/@epic-web/workshop-app/node_modules/@radix-ui/react-roving-focus": { - "version": "1.1.0", - "inBundle": true, + "node_modules/@radix-ui/react-focus-guards": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-guards/-/react-focus-guards-1.1.3.tgz", + "integrity": "sha512-0rFg/Rj2Q62NCm62jZw0QX7a3sz6QCQU0LpZdNrJX8byRGaGVTqbrW9jAoIAHyMQqsNpeZ81YgSizOt5WXq0Pw==", "license": "MIT", - "dependencies": { - "@radix-ui/primitive": "1.1.0", - "@radix-ui/react-collection": "1.1.0", - "@radix-ui/react-compose-refs": "1.1.0", - "@radix-ui/react-context": "1.1.0", - "@radix-ui/react-direction": "1.1.0", - "@radix-ui/react-id": "1.1.0", - "@radix-ui/react-primitive": "2.0.0", - "@radix-ui/react-use-callback-ref": "1.1.0", - "@radix-ui/react-use-controllable-state": "1.1.0" - }, "peerDependencies": { "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "peerDependenciesMeta": { "@types/react": { "optional": true - }, - "@types/react-dom": { - "optional": true } } }, - "node_modules/@epic-web/workshop-app/node_modules/@radix-ui/react-select": { - "version": "2.1.1", - "inBundle": true, - "license": "MIT", - "dependencies": { - "@radix-ui/number": "1.1.0", - "@radix-ui/primitive": "1.1.0", - "@radix-ui/react-collection": "1.1.0", - "@radix-ui/react-compose-refs": "1.1.0", - "@radix-ui/react-context": "1.1.0", - "@radix-ui/react-direction": "1.1.0", - "@radix-ui/react-dismissable-layer": "1.1.0", - "@radix-ui/react-focus-guards": "1.1.0", - "@radix-ui/react-focus-scope": "1.1.0", - "@radix-ui/react-id": "1.1.0", - "@radix-ui/react-popper": "1.2.0", - "@radix-ui/react-portal": "1.1.1", - "@radix-ui/react-primitive": "2.0.0", - "@radix-ui/react-slot": "1.1.0", - "@radix-ui/react-use-callback-ref": "1.1.0", - "@radix-ui/react-use-controllable-state": "1.1.0", - "@radix-ui/react-use-layout-effect": "1.1.0", - "@radix-ui/react-use-previous": "1.1.0", - "@radix-ui/react-visually-hidden": "1.1.0", - "aria-hidden": "^1.1.1", - "react-remove-scroll": "2.5.7" + "node_modules/@radix-ui/react-focus-scope": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-scope/-/react-focus-scope-1.1.7.tgz", + "integrity": "sha512-t2ODlkXBQyn7jkl6TNaw/MtVEVvIGelJDCG41Okq/KwUsJBwQ4XVZsHAVUkK4mBv3ewiAS3PGuUWuY2BoK4ZUw==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-use-callback-ref": "1.1.1" }, "peerDependencies": { "@types/react": "*", @@ -1047,12 +2673,13 @@ } } }, - "node_modules/@epic-web/workshop-app/node_modules/@radix-ui/react-slot": { - "version": "1.1.0", - "inBundle": true, + "node_modules/@radix-ui/react-id": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-id/-/react-id-1.1.1.tgz", + "integrity": "sha512-kGkGegYIdQsOb4XjsfM97rXsiHaBwco+hFI66oO4s9LU+PLAC5oJ7khdOVFxkhsmlbpUqDAvXw11CluXP+jkHg==", "license": "MIT", "dependencies": { - "@radix-ui/react-compose-refs": "1.1.0" + "@radix-ui/react-use-layout-effect": "1.1.1" }, "peerDependencies": { "@types/react": "*", @@ -1064,19 +2691,27 @@ } } }, - "node_modules/@epic-web/workshop-app/node_modules/@radix-ui/react-tabs": { - "version": "1.1.0", - "inBundle": true, + "node_modules/@radix-ui/react-popover": { + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/@radix-ui/react-popover/-/react-popover-1.1.15.tgz", + "integrity": "sha512-kr0X2+6Yy/vJzLYJUPCZEc8SfQcf+1COFoAqauJm74umQhta9M7lNJHP7QQS3vkvcGLQUbWpMzwrXYwrYztHKA==", "license": "MIT", "dependencies": { - "@radix-ui/primitive": "1.1.0", - "@radix-ui/react-context": "1.1.0", - "@radix-ui/react-direction": "1.1.0", - "@radix-ui/react-id": "1.1.0", - "@radix-ui/react-presence": "1.1.0", - "@radix-ui/react-primitive": "2.0.0", - "@radix-ui/react-roving-focus": "1.1.0", - "@radix-ui/react-use-controllable-state": "1.1.0" + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-dismissable-layer": "1.1.11", + "@radix-ui/react-focus-guards": "1.1.3", + "@radix-ui/react-focus-scope": "1.1.7", + "@radix-ui/react-id": "1.1.1", + "@radix-ui/react-popper": "1.2.8", + "@radix-ui/react-portal": "1.1.9", + "@radix-ui/react-presence": "1.1.5", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-slot": "1.2.3", + "@radix-ui/react-use-controllable-state": "1.2.2", + "aria-hidden": "^1.2.4", + "react-remove-scroll": "^2.6.3" }, "peerDependencies": { "@types/react": "*", @@ -1093,23 +2728,22 @@ } } }, - "node_modules/@epic-web/workshop-app/node_modules/@radix-ui/react-toast": { - "version": "1.2.1", - "inBundle": true, - "license": "MIT", - "dependencies": { - "@radix-ui/primitive": "1.1.0", - "@radix-ui/react-collection": "1.1.0", - "@radix-ui/react-compose-refs": "1.1.0", - "@radix-ui/react-context": "1.1.0", - "@radix-ui/react-dismissable-layer": "1.1.0", - "@radix-ui/react-portal": "1.1.1", - "@radix-ui/react-presence": "1.1.0", - "@radix-ui/react-primitive": "2.0.0", - "@radix-ui/react-use-callback-ref": "1.1.0", - "@radix-ui/react-use-controllable-state": "1.1.0", - "@radix-ui/react-use-layout-effect": "1.1.0", - "@radix-ui/react-visually-hidden": "1.1.0" + "node_modules/@radix-ui/react-popper": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@radix-ui/react-popper/-/react-popper-1.2.8.tgz", + "integrity": "sha512-0NJQ4LFFUuWkE7Oxf0htBKS6zLkkjBH+hM1uk7Ng705ReR8m/uelduy1DBo0PyBXPKVnBA6YBlU94MBGXrSBCw==", + "license": "MIT", + "dependencies": { + "@floating-ui/react-dom": "^2.0.0", + "@radix-ui/react-arrow": "1.1.7", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-use-callback-ref": "1.1.1", + "@radix-ui/react-use-layout-effect": "1.1.1", + "@radix-ui/react-use-rect": "1.1.1", + "@radix-ui/react-use-size": "1.1.1", + "@radix-ui/rect": "1.1.1" }, "peerDependencies": { "@types/react": "*", @@ -1126,105 +2760,158 @@ } } }, - "node_modules/@epic-web/workshop-app/node_modules/@radix-ui/react-use-callback-ref": { - "version": "1.1.0", - "inBundle": true, + "node_modules/@radix-ui/react-portal": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/@radix-ui/react-portal/-/react-portal-1.1.9.tgz", + "integrity": "sha512-bpIxvq03if6UNwXZ+HTK71JLh4APvnXntDc6XOX8UVq4XQOVl7lwok0AvIl+b8zgCw3fSaVTZMpAPPagXbKmHQ==", "license": "MIT", + "dependencies": { + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-use-layout-effect": "1.1.1" + }, "peerDependencies": { "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "peerDependenciesMeta": { "@types/react": { "optional": true + }, + "@types/react-dom": { + "optional": true } } }, - "node_modules/@epic-web/workshop-app/node_modules/@radix-ui/react-use-controllable-state": { - "version": "1.1.0", - "inBundle": true, + "node_modules/@radix-ui/react-presence": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@radix-ui/react-presence/-/react-presence-1.1.5.tgz", + "integrity": "sha512-/jfEwNDdQVBCNvjkGit4h6pMOzq8bHkopq458dPt2lMjx+eBQUohZNG9A7DtO/O5ukSbxuaNGXMjHicgwy6rQQ==", "license": "MIT", "dependencies": { - "@radix-ui/react-use-callback-ref": "1.1.0" + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-use-layout-effect": "1.1.1" }, "peerDependencies": { "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "peerDependenciesMeta": { "@types/react": { "optional": true + }, + "@types/react-dom": { + "optional": true } } }, - "node_modules/@epic-web/workshop-app/node_modules/@radix-ui/react-use-escape-keydown": { - "version": "1.1.0", - "inBundle": true, + "node_modules/@radix-ui/react-primitive": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.1.3.tgz", + "integrity": "sha512-m9gTwRkhy2lvCPe6QJp4d3G1TYEUHn/FzJUtq9MjH46an1wJU+GdoGC5VLof8RX8Ft/DlpshApkhswDLZzHIcQ==", "license": "MIT", "dependencies": { - "@radix-ui/react-use-callback-ref": "1.1.0" + "@radix-ui/react-slot": "1.2.3" }, "peerDependencies": { "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "peerDependenciesMeta": { "@types/react": { "optional": true - } - } - }, - "node_modules/@epic-web/workshop-app/node_modules/@radix-ui/react-use-layout-effect": { - "version": "1.1.0", - "inBundle": true, - "license": "MIT", - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { + }, + "@types/react-dom": { "optional": true } } }, - "node_modules/@epic-web/workshop-app/node_modules/@radix-ui/react-use-previous": { - "version": "1.1.0", - "inBundle": true, + "node_modules/@radix-ui/react-roving-focus": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/@radix-ui/react-roving-focus/-/react-roving-focus-1.1.11.tgz", + "integrity": "sha512-7A6S9jSgm/S+7MdtNDSb+IU859vQqJ/QAtcYQcfFC6W8RS4IxIZDldLR0xqCFZ6DCyrQLjLPsxtTNch5jVA4lA==", "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-collection": "1.1.7", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-direction": "1.1.1", + "@radix-ui/react-id": "1.1.1", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-use-callback-ref": "1.1.1", + "@radix-ui/react-use-controllable-state": "1.2.2" + }, "peerDependencies": { "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "peerDependenciesMeta": { "@types/react": { "optional": true + }, + "@types/react-dom": { + "optional": true } } }, - "node_modules/@epic-web/workshop-app/node_modules/@radix-ui/react-use-rect": { - "version": "1.1.0", - "inBundle": true, + "node_modules/@radix-ui/react-select": { + "version": "2.2.6", + "resolved": "https://registry.npmjs.org/@radix-ui/react-select/-/react-select-2.2.6.tgz", + "integrity": "sha512-I30RydO+bnn2PQztvo25tswPH+wFBjehVGtmagkU78yMdwTwVf12wnAOF+AeP8S2N8xD+5UPbGhkUfPyvT+mwQ==", "license": "MIT", "dependencies": { - "@radix-ui/rect": "1.1.0" + "@radix-ui/number": "1.1.1", + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-collection": "1.1.7", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-direction": "1.1.1", + "@radix-ui/react-dismissable-layer": "1.1.11", + "@radix-ui/react-focus-guards": "1.1.3", + "@radix-ui/react-focus-scope": "1.1.7", + "@radix-ui/react-id": "1.1.1", + "@radix-ui/react-popper": "1.2.8", + "@radix-ui/react-portal": "1.1.9", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-slot": "1.2.3", + "@radix-ui/react-use-callback-ref": "1.1.1", + "@radix-ui/react-use-controllable-state": "1.2.2", + "@radix-ui/react-use-layout-effect": "1.1.1", + "@radix-ui/react-use-previous": "1.1.1", + "@radix-ui/react-visually-hidden": "1.2.3", + "aria-hidden": "^1.2.4", + "react-remove-scroll": "^2.6.3" }, "peerDependencies": { "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "peerDependenciesMeta": { "@types/react": { "optional": true + }, + "@types/react-dom": { + "optional": true } } }, - "node_modules/@epic-web/workshop-app/node_modules/@radix-ui/react-use-size": { - "version": "1.1.0", - "inBundle": true, + "node_modules/@radix-ui/react-slot": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.2.3.tgz", + "integrity": "sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A==", "license": "MIT", "dependencies": { - "@radix-ui/react-use-layout-effect": "1.1.0" + "@radix-ui/react-compose-refs": "1.1.2" }, "peerDependencies": { "@types/react": "*", @@ -1236,12 +2923,20 @@ } } }, - "node_modules/@epic-web/workshop-app/node_modules/@radix-ui/react-visually-hidden": { - "version": "1.1.0", - "inBundle": true, + "node_modules/@radix-ui/react-tabs": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/@radix-ui/react-tabs/-/react-tabs-1.1.13.tgz", + "integrity": "sha512-7xdcatg7/U+7+Udyoj2zodtI9H/IIopqo+YOIcZOq1nJwXWBZ9p8xiu5llXlekDbZkca79a/fozEYQXIA4sW6A==", "license": "MIT", "dependencies": { - "@radix-ui/react-primitive": "2.0.0" + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-direction": "1.1.1", + "@radix-ui/react-id": "1.1.1", + "@radix-ui/react-presence": "1.1.5", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-roving-focus": "1.1.11", + "@radix-ui/react-use-controllable-state": "1.2.2" }, "peerDependencies": { "@types/react": "*", @@ -1258,258 +2953,82 @@ } } }, - "node_modules/@epic-web/workshop-app/node_modules/@radix-ui/rect": { - "version": "1.1.0", - "inBundle": true, - "license": "MIT" - }, - "node_modules/@epic-web/workshop-app/node_modules/@remix-run/react": { - "version": "2.10.0", - "inBundle": true, + "node_modules/@radix-ui/react-toast": { + "version": "1.2.15", + "resolved": "https://registry.npmjs.org/@radix-ui/react-toast/-/react-toast-1.2.15.tgz", + "integrity": "sha512-3OSz3TacUWy4WtOXV38DggwxoqJK4+eDkNMl5Z/MJZaoUPaP4/9lf81xXMe1I2ReTAptverZUpbPY4wWwWyL5g==", "license": "MIT", "dependencies": { - "@remix-run/router": "1.17.0", - "@remix-run/server-runtime": "2.10.0", - "react-router": "6.24.0", - "react-router-dom": "6.24.0", - "turbo-stream": "2.2.0" - }, - "engines": { - "node": ">=18.0.0" + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-collection": "1.1.7", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-dismissable-layer": "1.1.11", + "@radix-ui/react-portal": "1.1.9", + "@radix-ui/react-presence": "1.1.5", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-use-callback-ref": "1.1.1", + "@radix-ui/react-use-controllable-state": "1.2.2", + "@radix-ui/react-use-layout-effect": "1.1.1", + "@radix-ui/react-visually-hidden": "1.2.3" }, "peerDependencies": { - "react": "^18.0.0", - "react-dom": "^18.0.0", - "typescript": "^5.1.0" + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "peerDependenciesMeta": { - "typescript": { + "@types/react": { "optional": true - } - } - }, - "node_modules/@epic-web/workshop-app/node_modules/@remix-run/router": { - "version": "1.17.0", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@epic-web/workshop-app/node_modules/@remix-run/server-runtime": { - "version": "2.10.0", - "inBundle": true, - "license": "MIT", - "dependencies": { - "@remix-run/router": "1.17.0", - "@types/cookie": "^0.6.0", - "@web3-storage/multipart-parser": "^1.0.0", - "cookie": "^0.6.0", - "set-cookie-parser": "^2.4.8", - "source-map": "^0.7.3", - "turbo-stream": "2.2.0" - }, - "engines": { - "node": ">=18.0.0" - }, - "peerDependencies": { - "typescript": "^5.1.0" - }, - "peerDependenciesMeta": { - "typescript": { + }, + "@types/react-dom": { "optional": true } } }, - "node_modules/@epic-web/workshop-app/node_modules/@types/cookie": { - "version": "0.6.0", - "inBundle": true, - "license": "MIT" - }, - "node_modules/@epic-web/workshop-app/node_modules/@web3-storage/multipart-parser": { - "version": "1.0.0", - "inBundle": true, - "license": "(Apache-2.0 AND MIT)" - }, - "node_modules/@epic-web/workshop-app/node_modules/aria-hidden": { - "version": "1.2.4", - "inBundle": true, - "license": "MIT", - "dependencies": { - "tslib": "^2.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@epic-web/workshop-app/node_modules/assertion-error": { - "version": "2.0.1", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=12" - } - }, - "node_modules/@epic-web/workshop-app/node_modules/chai": { - "version": "5.1.1", - "inBundle": true, - "license": "MIT", - "dependencies": { - "assertion-error": "^2.0.1", - "check-error": "^2.1.1", - "deep-eql": "^5.0.1", - "loupe": "^3.1.0", - "pathval": "^2.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@epic-web/workshop-app/node_modules/chai-dom": { - "version": "1.12.0", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">= 0.12.0" - }, - "peerDependencies": { - "chai": ">= 3" - } - }, - "node_modules/@epic-web/workshop-app/node_modules/check-error": { - "version": "2.1.1", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">= 16" - } - }, - "node_modules/@epic-web/workshop-app/node_modules/clsx": { - "version": "2.1.1", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/@epic-web/workshop-app/node_modules/cookie": { - "version": "0.6.0", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/@epic-web/workshop-app/node_modules/deep-eql": { - "version": "5.0.2", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/@epic-web/workshop-app/node_modules/detect-node-es": { - "version": "1.1.0", - "inBundle": true, - "license": "MIT" - }, - "node_modules/@epic-web/workshop-app/node_modules/framer-motion": { - "version": "11.2.12", - "inBundle": true, + "node_modules/@radix-ui/react-tooltip": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@radix-ui/react-tooltip/-/react-tooltip-1.2.8.tgz", + "integrity": "sha512-tY7sVt1yL9ozIxvmbtN5qtmH2krXcBCfjEiCgKGLqunJHvgvZG2Pcl2oQ3kbcZARb1BGEHdkLzcYGO8ynVlieg==", "license": "MIT", "dependencies": { - "tslib": "^2.4.0" + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-dismissable-layer": "1.1.11", + "@radix-ui/react-id": "1.1.1", + "@radix-ui/react-popper": "1.2.8", + "@radix-ui/react-portal": "1.1.9", + "@radix-ui/react-presence": "1.1.5", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-slot": "1.2.3", + "@radix-ui/react-use-controllable-state": "1.2.2", + "@radix-ui/react-visually-hidden": "1.2.3" }, "peerDependencies": { - "@emotion/is-prop-valid": "*", - "react": "^18.0.0", - "react-dom": "^18.0.0" + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "peerDependenciesMeta": { - "@emotion/is-prop-valid": { - "optional": true - }, - "react": { + "@types/react": { "optional": true }, - "react-dom": { + "@types/react-dom": { "optional": true } } }, - "node_modules/@epic-web/workshop-app/node_modules/get-func-name": { - "version": "2.0.2", - "inBundle": true, - "license": "MIT", - "engines": { - "node": "*" - } - }, - "node_modules/@epic-web/workshop-app/node_modules/get-nonce": { - "version": "1.0.1", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/@epic-web/workshop-app/node_modules/invariant": { - "version": "2.2.4", - "inBundle": true, - "license": "MIT", - "dependencies": { - "loose-envify": "^1.0.0" - } - }, - "node_modules/@epic-web/workshop-app/node_modules/js-tokens": { - "version": "4.0.0", - "inBundle": true, - "license": "MIT" - }, - "node_modules/@epic-web/workshop-app/node_modules/loose-envify": { - "version": "1.4.0", - "inBundle": true, - "license": "MIT", - "dependencies": { - "js-tokens": "^3.0.0 || ^4.0.0" - }, - "bin": { - "loose-envify": "cli.js" - } - }, - "node_modules/@epic-web/workshop-app/node_modules/loupe": { - "version": "3.1.1", - "inBundle": true, - "license": "MIT", - "dependencies": { - "get-func-name": "^2.0.1" - } - }, - "node_modules/@epic-web/workshop-app/node_modules/pathval": { - "version": "2.0.0", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">= 14.16" - } - }, - "node_modules/@epic-web/workshop-app/node_modules/react-remove-scroll": { - "version": "2.5.7", - "inBundle": true, + "node_modules/@radix-ui/react-use-callback-ref": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-callback-ref/-/react-use-callback-ref-1.1.1.tgz", + "integrity": "sha512-FkBMwD+qbGQeMu1cOHnuGB6x4yzPjho8ap5WtbEJ26umhgqVXbhekKUQO+hZEL1vU92a3wHwdp0HAcqAUF5iDg==", "license": "MIT", - "dependencies": { - "react-remove-scroll-bar": "^2.3.4", - "react-style-singleton": "^2.2.1", - "tslib": "^2.1.0", - "use-callback-ref": "^1.3.0", - "use-sidecar": "^1.1.2" - }, - "engines": { - "node": ">=10" - }, "peerDependencies": { - "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0", - "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "peerDependenciesMeta": { "@types/react": { @@ -1517,20 +3036,18 @@ } } }, - "node_modules/@epic-web/workshop-app/node_modules/react-remove-scroll-bar": { - "version": "2.3.6", - "inBundle": true, + "node_modules/@radix-ui/react-use-controllable-state": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-controllable-state/-/react-use-controllable-state-1.2.2.tgz", + "integrity": "sha512-BjasUjixPFdS+NKkypcyyN5Pmg83Olst0+c6vGov0diwTEo6mgdqVR6hxcEgFuh4QrAs7Rc+9KuGJ9TVCj0Zzg==", "license": "MIT", "dependencies": { - "react-style-singleton": "^2.2.1", - "tslib": "^2.0.0" - }, - "engines": { - "node": ">=10" + "@radix-ui/react-use-effect-event": "0.0.2", + "@radix-ui/react-use-layout-effect": "1.1.1" }, "peerDependencies": { - "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0", - "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "peerDependenciesMeta": { "@types/react": { @@ -1538,51 +3055,35 @@ } } }, - "node_modules/@epic-web/workshop-app/node_modules/react-router": { - "version": "6.24.0", - "inBundle": true, + "node_modules/@radix-ui/react-use-effect-event": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-effect-event/-/react-use-effect-event-0.0.2.tgz", + "integrity": "sha512-Qp8WbZOBe+blgpuUT+lw2xheLP8q0oatc9UpmiemEICxGvFLYmHm9QowVZGHtJlGbS6A6yJ3iViad/2cVjnOiA==", "license": "MIT", "dependencies": { - "@remix-run/router": "1.17.0" - }, - "engines": { - "node": ">=14.0.0" + "@radix-ui/react-use-layout-effect": "1.1.1" }, "peerDependencies": { - "react": ">=16.8" - } - }, - "node_modules/@epic-web/workshop-app/node_modules/react-router-dom": { - "version": "6.24.0", - "inBundle": true, - "license": "MIT", - "dependencies": { - "@remix-run/router": "1.17.0", - "react-router": "6.24.0" - }, - "engines": { - "node": ">=14.0.0" + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, - "peerDependencies": { - "react": ">=16.8", - "react-dom": ">=16.8" + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } } }, - "node_modules/@epic-web/workshop-app/node_modules/react-style-singleton": { - "version": "2.2.1", - "inBundle": true, + "node_modules/@radix-ui/react-use-escape-keydown": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-escape-keydown/-/react-use-escape-keydown-1.1.1.tgz", + "integrity": "sha512-Il0+boE7w/XebUHyBjroE+DbByORGR9KKmITzbR7MyQ4akpORYP/ZmbhAr0DG7RmmBqoOnZdy2QlvajJ2QA59g==", "license": "MIT", "dependencies": { - "get-nonce": "^1.0.0", - "invariant": "^2.2.4", - "tslib": "^2.0.0" - }, - "engines": { - "node": ">=10" + "@radix-ui/react-use-callback-ref": "1.1.1" }, "peerDependencies": { - "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0", - "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "peerDependenciesMeta": { "@types/react": { @@ -1590,125 +3091,47 @@ } } }, - "node_modules/@epic-web/workshop-app/node_modules/regenerator-runtime": { - "version": "0.14.1", - "inBundle": true, - "license": "MIT" - }, - "node_modules/@epic-web/workshop-app/node_modules/remix-utils": { - "version": "7.6.0", - "inBundle": true, + "node_modules/@radix-ui/react-use-layout-effect": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-layout-effect/-/react-use-layout-effect-1.1.1.tgz", + "integrity": "sha512-RbJRS4UWQFkzHTTwVymMTUv8EqYhOp8dOOviLj2ugtTiXRaRQS7GLGxZTLL1jWhMeoSCf5zmcZkqTl9IiYfXcQ==", "license": "MIT", - "dependencies": { - "type-fest": "^4.3.3" - }, - "engines": { - "node": ">=18.0.0" - }, "peerDependencies": { - "@remix-run/cloudflare": "^2.0.0", - "@remix-run/deno": "^2.0.0", - "@remix-run/node": "^2.0.0", - "@remix-run/react": "^2.0.0", - "@remix-run/router": "^1.7.2", - "crypto-js": "^4.1.1", - "intl-parse-accept-language": "^1.0.0", - "is-ip": "^5.0.1", - "react": "^18.0.0", - "zod": "^3.22.4" + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "peerDependenciesMeta": { - "@remix-run/cloudflare": { - "optional": true - }, - "@remix-run/deno": { - "optional": true - }, - "@remix-run/node": { - "optional": true - }, - "@remix-run/react": { - "optional": true - }, - "@remix-run/router": { - "optional": true - }, - "crypto-js": { - "optional": true - }, - "intl-parse-accept-language": { - "optional": true - }, - "is-ip": { - "optional": true - }, - "react": { - "optional": true - }, - "zod": { + "@types/react": { "optional": true } } }, - "node_modules/@epic-web/workshop-app/node_modules/set-cookie-parser": { - "version": "2.6.0", - "inBundle": true, - "license": "MIT" - }, - "node_modules/@epic-web/workshop-app/node_modules/source-map": { - "version": "0.6.1", - "inBundle": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/@epic-web/workshop-app/node_modules/tailwind-merge": { - "version": "2.3.0", - "inBundle": true, + "node_modules/@radix-ui/react-use-previous": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-previous/-/react-use-previous-1.1.1.tgz", + "integrity": "sha512-2dHfToCj/pzca2Ck724OZ5L0EVrr3eHRNsG/b3xQJLA2hZpVCS99bLAX+hm1IHXDEnzU6by5z/5MIY794/a8NQ==", "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.24.1" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/dcastil" - } - }, - "node_modules/@epic-web/workshop-app/node_modules/tslib": { - "version": "2.6.3", - "inBundle": true, - "license": "0BSD" - }, - "node_modules/@epic-web/workshop-app/node_modules/turbo-stream": { - "version": "2.2.0", - "inBundle": true, - "license": "ISC" - }, - "node_modules/@epic-web/workshop-app/node_modules/type-fest": { - "version": "4.20.1", - "inBundle": true, - "license": "(MIT OR CC0-1.0)", - "engines": { - "node": ">=16" + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } } }, - "node_modules/@epic-web/workshop-app/node_modules/use-callback-ref": { - "version": "1.3.2", - "inBundle": true, + "node_modules/@radix-ui/react-use-rect": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-rect/-/react-use-rect-1.1.1.tgz", + "integrity": "sha512-QTYuDesS0VtuHNNvMh+CjlKJ4LJickCMUAqjlE3+j8w+RlRpwyX3apEQKGFzbZGdo7XNG1tXa+bQqIE7HIXT2w==", "license": "MIT", "dependencies": { - "tslib": "^2.0.0" - }, - "engines": { - "node": ">=10" + "@radix-ui/rect": "1.1.1" }, "peerDependencies": { - "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0", - "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "peerDependenciesMeta": { "@types/react": { @@ -1716,20 +3139,17 @@ } } }, - "node_modules/@epic-web/workshop-app/node_modules/use-sidecar": { - "version": "1.1.2", - "inBundle": true, + "node_modules/@radix-ui/react-use-size": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-size/-/react-use-size-1.1.1.tgz", + "integrity": "sha512-ewrXRDTAqAXlkl6t/fkXWNAhFX9I+CkKlw6zjEwk86RSPKwZr3xpBRso655aqYafwtnbpHLj6toFzmd6xdVptQ==", "license": "MIT", "dependencies": { - "detect-node-es": "^1.1.0", - "tslib": "^2.0.0" - }, - "engines": { - "node": ">=10" + "@radix-ui/react-use-layout-effect": "1.1.1" }, "peerDependencies": { - "@types/react": "^16.9.0 || ^17.0.0 || ^18.0.0", - "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "peerDependenciesMeta": { "@types/react": { @@ -1737,3010 +3157,3029 @@ } } }, - "node_modules/@epic-web/workshop-app/node_modules/zod": { - "version": "3.23.8", - "inBundle": true, + "node_modules/@radix-ui/react-visually-hidden": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-visually-hidden/-/react-visually-hidden-1.2.3.tgz", + "integrity": "sha512-pzJq12tEaaIhqjbzpCuv/OypJY/BPavOofm+dbab+MHLajy277+1lLm6JFcGgF5eskJ6mquGirhXY2GD/8u8Ug==", "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/colinhacks" - } - }, - "node_modules/@epic-web/workshop-presence": { - "version": "4.21.1", - "resolved": "https://registry.npmjs.org/@epic-web/workshop-presence/-/workshop-presence-4.21.1.tgz", - "integrity": "sha512-YlZ741f4RYJD8WUdOS1B/eMVlhCEKiHb9olc7hks8NAn7I1xuZvd42q0bIrlgXpD9opakWYlHg7O9kR689wVBw==", - "dependencies": { - "@epic-web/workshop-utils": "4.21.1", - "zod": "^3.23.8" - } - }, - "node_modules/@epic-web/workshop-utils": { - "version": "4.21.1", - "resolved": "https://registry.npmjs.org/@epic-web/workshop-utils/-/workshop-utils-4.21.1.tgz", - "integrity": "sha512-fr/EHIjZgkvJTOs28xTYuE01Cj5Ksy5tBgpXglF+Z1xdonfiiiEgoGp8Gn7B/7fjYcApPMk4UH0ATj4FJGl18g==", - "dependencies": { - "@epic-web/cachified": "^5.2.0", - "@epic-web/remember": "^1.0.2", - "@kentcdodds/md-temp": "^9.0.1", - "@mdx-js/mdx": "^3.0.1", - "@playwright/test": "^1.44.1", - "@remix-run/node": "^2.9.2", - "@testing-library/dom": "^10.1.0", - "@testing-library/jest-dom": "^6.4.8", - "@total-typescript/ts-reset": "^0.5.1", - "@types/chai": "^4.3.17", - "@types/chai-dom": "^1.11.3", - "@vitest/expect": "^2.0.5", - "chai": "^5.1.1", - "chai-dom": "^1.12.0", - "chalk": "^5.3.0", - "chokidar": "^3.6.0", - "close-with-grace": "^1.3.0", - "cross-spawn": "^7.0.3", - "execa": "^9.1.0", - "fkill": "^9.0.0", - "fs-extra": "^11.2.0", - "glob": "^10.3.16", - "globby": "^14.0.1", - "lru-cache": "^10.2.2", - "md5-hex": "^5.0.0", - "mdast-util-mdx-jsx": "^3.1.2", - "mdx-bundler": "^10.0.2", - "p-queue": "^8.0.1", - "rehype": "^13.0.1", - "remark": "^15.0.1", - "remark-autolink-headings": "^7.0.1", - "remark-emoji": "^4.0.1", - "remark-gfm": "^4.0.0", - "unified": "^11.0.4", - "unist-util-remove-position": "^5.0.0", - "unist-util-visit": "^5.0.0", - "zod": "^3.23.8" - } - }, - "node_modules/@esbuild-plugins/node-resolve": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/@esbuild-plugins/node-resolve/-/node-resolve-0.2.2.tgz", - "integrity": "sha512-+t5FdX3ATQlb53UFDBRb4nqjYBz492bIrnVWvpQHpzZlu9BQL5HasMZhqc409ygUwOWCXZhrWr6NyZ6T6Y+cxw==", "dependencies": { - "@types/resolve": "^1.17.1", - "debug": "^4.3.1", - "escape-string-regexp": "^4.0.0", - "resolve": "^1.19.0" + "@radix-ui/react-primitive": "2.1.3" }, "peerDependencies": { - "esbuild": "*" - } - }, - "node_modules/@esbuild-plugins/node-resolve/node_modules/debug": { - "version": "4.3.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.6.tgz", - "integrity": "sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg==", - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "peerDependenciesMeta": { - "supports-color": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { "optional": true } } }, - "node_modules/@esbuild-plugins/node-resolve/node_modules/escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@esbuild-plugins/node-resolve/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==" - }, - "node_modules/@esbuild/android-arm": { - "version": "0.17.6", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.17.6.tgz", - "integrity": "sha512-bSC9YVUjADDy1gae8RrioINU6e1lCkg3VGVwm0QQ2E1CWcC4gnMce9+B6RpxuSsrsXsk1yojn7sp1fnG8erE2g==", - "cpu": [ - "arm" - ], - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/android-arm64": { - "version": "0.17.6", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.17.6.tgz", - "integrity": "sha512-YnYSCceN/dUzUr5kdtUzB+wZprCafuD89Hs0Aqv9QSdwhYQybhXTaSTcrl6X/aWThn1a/j0eEpUBGOE7269REg==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/android-x64": { - "version": "0.17.6", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.17.6.tgz", - "integrity": "sha512-MVcYcgSO7pfu/x34uX9u2QIZHmXAB7dEiLQC5bBl5Ryqtpj9lT2sg3gNDEsrPEmimSJW2FXIaxqSQ501YLDsZQ==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/darwin-arm64": { - "version": "0.17.6", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.17.6.tgz", - "integrity": "sha512-bsDRvlbKMQMt6Wl08nHtFz++yoZHsyTOxnjfB2Q95gato+Yi4WnRl13oC2/PJJA9yLCoRv9gqT/EYX0/zDsyMA==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/darwin-x64": { - "version": "0.17.6", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.17.6.tgz", - "integrity": "sha512-xh2A5oPrYRfMFz74QXIQTQo8uA+hYzGWJFoeTE8EvoZGHb+idyV4ATaukaUvnnxJiauhs/fPx3vYhU4wiGfosg==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/freebsd-arm64": { - "version": "0.17.6", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.17.6.tgz", - "integrity": "sha512-EnUwjRc1inT4ccZh4pB3v1cIhohE2S4YXlt1OvI7sw/+pD+dIE4smwekZlEPIwY6PhU6oDWwITrQQm5S2/iZgg==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } + "node_modules/@radix-ui/rect": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/rect/-/rect-1.1.1.tgz", + "integrity": "sha512-HPwpGIzkl28mWyZqG52jiqDJ12waP11Pa1lGoiyUkIEuMLBP0oeK/C89esbXrxsky5we7dfd8U58nm0SgAWpVw==", + "license": "MIT" }, - "node_modules/@esbuild/freebsd-x64": { - "version": "0.17.6", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.17.6.tgz", - "integrity": "sha512-Uh3HLWGzH6FwpviUcLMKPCbZUAFzv67Wj5MTwK6jn89b576SR2IbEp+tqUHTr8DIl0iDmBAf51MVaP7pw6PY5Q==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "freebsd" - ], + "node_modules/@react-router/express": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@react-router/express/-/express-7.13.0.tgz", + "integrity": "sha512-9az5P7sjbfxb0l4TtS5tlyV2tI8ZY4dWeuddxK2JLtgWwe+MGGSEO62fY87PidmgTqpQXguT6iyR5RXP9gJucA==", + "license": "MIT", + "dependencies": { + "@react-router/node": "7.13.0" + }, "engines": { - "node": ">=12" + "node": ">=20.0.0" + }, + "peerDependencies": { + "express": "^4.17.1 || ^5", + "react-router": "7.13.0", + "typescript": "^5.1.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, - "node_modules/@esbuild/linux-arm": { - "version": "0.17.6", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.17.6.tgz", - "integrity": "sha512-7YdGiurNt7lqO0Bf/U9/arrPWPqdPqcV6JCZda4LZgEn+PTQ5SMEI4MGR52Bfn3+d6bNEGcWFzlIxiQdS48YUw==", - "cpu": [ - "arm" - ], - "optional": true, - "os": [ - "linux" - ], + "node_modules/@react-router/node": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@react-router/node/-/node-7.13.0.tgz", + "integrity": "sha512-Mhr3fAou19oc/S93tKMIBHwCPfqLpWyWM/m0NWd3pJh/wZin8/9KhAdjwxhYbXw1TrTBZBLDENa35uZ+Y7oh3A==", + "license": "MIT", + "dependencies": { + "@mjackson/node-fetch-server": "^0.2.0" + }, "engines": { - "node": ">=12" + "node": ">=20.0.0" + }, + "peerDependencies": { + "react-router": "7.13.0", + "typescript": "^5.1.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, - "node_modules/@esbuild/linux-arm64": { - "version": "0.17.6", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.17.6.tgz", - "integrity": "sha512-bUR58IFOMJX523aDVozswnlp5yry7+0cRLCXDsxnUeQYJik1DukMY+apBsLOZJblpH+K7ox7YrKrHmJoWqVR9w==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "linux" - ], + "node_modules/@react-router/remix-routes-option-adapter": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@react-router/remix-routes-option-adapter/-/remix-routes-option-adapter-7.13.0.tgz", + "integrity": "sha512-Ydnx4mv+E6ZFtf91g188ieHzakExMkRS1ki/x2osrwN75q8Kq8yZlzKky3Fyr0wpsBiZA7SeZBZKaRX2QW4BqQ==", + "license": "MIT", "engines": { - "node": ">=12" + "node": ">=20.0.0" + }, + "peerDependencies": { + "@react-router/dev": "^7.13.0", + "typescript": "^5.1.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, - "node_modules/@esbuild/linux-ia32": { - "version": "0.17.6", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.17.6.tgz", - "integrity": "sha512-ujp8uoQCM9FRcbDfkqECoARsLnLfCUhKARTP56TFPog8ie9JG83D5GVKjQ6yVrEVdMie1djH86fm98eY3quQkQ==", - "cpu": [ - "ia32" - ], - "optional": true, - "os": [ - "linux" - ], + "node_modules/@resvg/resvg-js": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/@resvg/resvg-js/-/resvg-js-2.6.2.tgz", + "integrity": "sha512-xBaJish5OeGmniDj9cW5PRa/PtmuVU3ziqrbr5xJj901ZDN4TosrVaNZpEiLZAxdfnhAe7uQ7QFWfjPe9d9K2Q==", + "license": "MPL-2.0", "engines": { - "node": ">=12" + "node": ">= 10" + }, + "optionalDependencies": { + "@resvg/resvg-js-android-arm-eabi": "2.6.2", + "@resvg/resvg-js-android-arm64": "2.6.2", + "@resvg/resvg-js-darwin-arm64": "2.6.2", + "@resvg/resvg-js-darwin-x64": "2.6.2", + "@resvg/resvg-js-linux-arm-gnueabihf": "2.6.2", + "@resvg/resvg-js-linux-arm64-gnu": "2.6.2", + "@resvg/resvg-js-linux-arm64-musl": "2.6.2", + "@resvg/resvg-js-linux-x64-gnu": "2.6.2", + "@resvg/resvg-js-linux-x64-musl": "2.6.2", + "@resvg/resvg-js-win32-arm64-msvc": "2.6.2", + "@resvg/resvg-js-win32-ia32-msvc": "2.6.2", + "@resvg/resvg-js-win32-x64-msvc": "2.6.2" } }, - "node_modules/@esbuild/linux-loong64": { - "version": "0.17.6", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.17.6.tgz", - "integrity": "sha512-y2NX1+X/Nt+izj9bLoiaYB9YXT/LoaQFYvCkVD77G/4F+/yuVXYCWz4SE9yr5CBMbOxOfBcy/xFL4LlOeNlzYQ==", + "node_modules/@resvg/resvg-js-android-arm-eabi": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/@resvg/resvg-js-android-arm-eabi/-/resvg-js-android-arm-eabi-2.6.2.tgz", + "integrity": "sha512-FrJibrAk6v29eabIPgcTUMPXiEz8ssrAk7TXxsiZzww9UTQ1Z5KAbFJs+Z0Ez+VZTYgnE5IQJqBcoSiMebtPHA==", "cpu": [ - "loong64" + "arm" ], + "license": "MPL-2.0", "optional": true, "os": [ - "linux" + "android" ], "engines": { - "node": ">=12" + "node": ">= 10" } }, - "node_modules/@esbuild/linux-mips64el": { - "version": "0.17.6", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.17.6.tgz", - "integrity": "sha512-09AXKB1HDOzXD+j3FdXCiL/MWmZP0Ex9eR8DLMBVcHorrWJxWmY8Nms2Nm41iRM64WVx7bA/JVHMv081iP2kUA==", + "node_modules/@resvg/resvg-js-android-arm64": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/@resvg/resvg-js-android-arm64/-/resvg-js-android-arm64-2.6.2.tgz", + "integrity": "sha512-VcOKezEhm2VqzXpcIJoITuvUS/fcjIw5NA/w3tjzWyzmvoCdd+QXIqy3FBGulWdClvp4g+IfUemigrkLThSjAQ==", "cpu": [ - "mips64el" + "arm64" ], + "license": "MPL-2.0", "optional": true, "os": [ - "linux" + "android" ], "engines": { - "node": ">=12" + "node": ">= 10" } }, - "node_modules/@esbuild/linux-ppc64": { - "version": "0.17.6", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.17.6.tgz", - "integrity": "sha512-AmLhMzkM8JuqTIOhxnX4ubh0XWJIznEynRnZAVdA2mMKE6FAfwT2TWKTwdqMG+qEaeyDPtfNoZRpJbD4ZBv0Tg==", + "node_modules/@resvg/resvg-js-darwin-arm64": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/@resvg/resvg-js-darwin-arm64/-/resvg-js-darwin-arm64-2.6.2.tgz", + "integrity": "sha512-nmok2LnAd6nLUKI16aEB9ydMC6Lidiiq2m1nEBDR1LaaP7FGs4AJ90qDraxX+CWlVuRlvNjyYJTNv8qFjtL9+A==", "cpu": [ - "ppc64" + "arm64" ], + "license": "MPL-2.0", "optional": true, "os": [ - "linux" + "darwin" ], "engines": { - "node": ">=12" + "node": ">= 10" } }, - "node_modules/@esbuild/linux-riscv64": { - "version": "0.17.6", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.17.6.tgz", - "integrity": "sha512-Y4Ri62PfavhLQhFbqucysHOmRamlTVK10zPWlqjNbj2XMea+BOs4w6ASKwQwAiqf9ZqcY9Ab7NOU4wIgpxwoSQ==", + "node_modules/@resvg/resvg-js-darwin-x64": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/@resvg/resvg-js-darwin-x64/-/resvg-js-darwin-x64-2.6.2.tgz", + "integrity": "sha512-GInyZLjgWDfsVT6+SHxQVRwNzV0AuA1uqGsOAW+0th56J7Nh6bHHKXHBWzUrihxMetcFDmQMAX1tZ1fZDYSRsw==", "cpu": [ - "riscv64" + "x64" ], + "license": "MPL-2.0", "optional": true, "os": [ - "linux" + "darwin" ], "engines": { - "node": ">=12" + "node": ">= 10" } }, - "node_modules/@esbuild/linux-s390x": { - "version": "0.17.6", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.17.6.tgz", - "integrity": "sha512-SPUiz4fDbnNEm3JSdUW8pBJ/vkop3M1YwZAVwvdwlFLoJwKEZ9L98l3tzeyMzq27CyepDQ3Qgoba44StgbiN5Q==", + "node_modules/@resvg/resvg-js-linux-arm-gnueabihf": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/@resvg/resvg-js-linux-arm-gnueabihf/-/resvg-js-linux-arm-gnueabihf-2.6.2.tgz", + "integrity": "sha512-YIV3u/R9zJbpqTTNwTZM5/ocWetDKGsro0SWp70eGEM9eV2MerWyBRZnQIgzU3YBnSBQ1RcxRZvY/UxwESfZIw==", "cpu": [ - "s390x" + "arm" ], + "license": "MPL-2.0", "optional": true, "os": [ "linux" ], "engines": { - "node": ">=12" + "node": ">= 10" } }, - "node_modules/@esbuild/linux-x64": { - "version": "0.17.6", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.17.6.tgz", - "integrity": "sha512-a3yHLmOodHrzuNgdpB7peFGPx1iJ2x6m+uDvhP2CKdr2CwOaqEFMeSqYAHU7hG+RjCq8r2NFujcd/YsEsFgTGw==", + "node_modules/@resvg/resvg-js-linux-arm64-gnu": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/@resvg/resvg-js-linux-arm64-gnu/-/resvg-js-linux-arm64-gnu-2.6.2.tgz", + "integrity": "sha512-zc2BlJSim7YR4FZDQ8OUoJg5holYzdiYMeobb9pJuGDidGL9KZUv7SbiD4E8oZogtYY42UZEap7dqkkYuA91pg==", "cpu": [ - "x64" + "arm64" ], + "license": "MPL-2.0", "optional": true, "os": [ "linux" ], "engines": { - "node": ">=12" + "node": ">= 10" } }, - "node_modules/@esbuild/netbsd-x64": { - "version": "0.17.6", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.17.6.tgz", - "integrity": "sha512-EanJqcU/4uZIBreTrnbnre2DXgXSa+Gjap7ifRfllpmyAU7YMvaXmljdArptTHmjrkkKm9BK6GH5D5Yo+p6y5A==", + "node_modules/@resvg/resvg-js-linux-arm64-musl": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/@resvg/resvg-js-linux-arm64-musl/-/resvg-js-linux-arm64-musl-2.6.2.tgz", + "integrity": "sha512-3h3dLPWNgSsD4lQBJPb4f+kvdOSJHa5PjTYVsWHxLUzH4IFTJUAnmuWpw4KqyQ3NA5QCyhw4TWgxk3jRkQxEKg==", "cpu": [ - "x64" + "arm64" ], + "license": "MPL-2.0", "optional": true, "os": [ - "netbsd" + "linux" ], "engines": { - "node": ">=12" + "node": ">= 10" } }, - "node_modules/@esbuild/openbsd-x64": { - "version": "0.17.6", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.17.6.tgz", - "integrity": "sha512-xaxeSunhQRsTNGFanoOkkLtnmMn5QbA0qBhNet/XLVsc+OVkpIWPHcr3zTW2gxVU5YOHFbIHR9ODuaUdNza2Vw==", + "node_modules/@resvg/resvg-js-linux-x64-gnu": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/@resvg/resvg-js-linux-x64-gnu/-/resvg-js-linux-x64-gnu-2.6.2.tgz", + "integrity": "sha512-IVUe+ckIerA7xMZ50duAZzwf1U7khQe2E0QpUxu5MBJNao5RqC0zwV/Zm965vw6D3gGFUl7j4m+oJjubBVoftw==", "cpu": [ "x64" ], + "license": "MPL-2.0", "optional": true, "os": [ - "openbsd" + "linux" ], "engines": { - "node": ">=12" + "node": ">= 10" } }, - "node_modules/@esbuild/sunos-x64": { - "version": "0.17.6", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.17.6.tgz", - "integrity": "sha512-gnMnMPg5pfMkZvhHee21KbKdc6W3GR8/JuE0Da1kjwpK6oiFU3nqfHuVPgUX2rsOx9N2SadSQTIYV1CIjYG+xw==", + "node_modules/@resvg/resvg-js-linux-x64-musl": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/@resvg/resvg-js-linux-x64-musl/-/resvg-js-linux-x64-musl-2.6.2.tgz", + "integrity": "sha512-UOf83vqTzoYQO9SZ0fPl2ZIFtNIz/Rr/y+7X8XRX1ZnBYsQ/tTb+cj9TE+KHOdmlTFBxhYzVkP2lRByCzqi4jQ==", "cpu": [ "x64" ], + "license": "MPL-2.0", "optional": true, "os": [ - "sunos" + "linux" ], "engines": { - "node": ">=12" + "node": ">= 10" } }, - "node_modules/@esbuild/win32-arm64": { - "version": "0.17.6", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.17.6.tgz", - "integrity": "sha512-G95n7vP1UnGJPsVdKXllAJPtqjMvFYbN20e8RK8LVLhlTiSOH1sd7+Gt7rm70xiG+I5tM58nYgwWrLs6I1jHqg==", + "node_modules/@resvg/resvg-js-win32-arm64-msvc": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/@resvg/resvg-js-win32-arm64-msvc/-/resvg-js-win32-arm64-msvc-2.6.2.tgz", + "integrity": "sha512-7C/RSgCa+7vqZ7qAbItfiaAWhyRSoD4l4BQAbVDqRRsRgY+S+hgS3in0Rxr7IorKUpGE69X48q6/nOAuTJQxeQ==", "cpu": [ "arm64" ], + "license": "MPL-2.0", "optional": true, "os": [ "win32" ], "engines": { - "node": ">=12" + "node": ">= 10" } }, - "node_modules/@esbuild/win32-ia32": { - "version": "0.17.6", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.17.6.tgz", - "integrity": "sha512-96yEFzLhq5bv9jJo5JhTs1gI+1cKQ83cUpyxHuGqXVwQtY5Eq54ZEsKs8veKtiKwlrNimtckHEkj4mRh4pPjsg==", + "node_modules/@resvg/resvg-js-win32-ia32-msvc": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/@resvg/resvg-js-win32-ia32-msvc/-/resvg-js-win32-ia32-msvc-2.6.2.tgz", + "integrity": "sha512-har4aPAlvjnLcil40AC77YDIk6loMawuJwFINEM7n0pZviwMkMvjb2W5ZirsNOZY4aDbo5tLx0wNMREp5Brk+w==", "cpu": [ "ia32" ], + "license": "MPL-2.0", "optional": true, "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/win32-x64": { - "version": "0.17.6", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.17.6.tgz", - "integrity": "sha512-n6d8MOyUrNp6G4VSpRcgjs5xj4A91svJSaiwLIDWVWEsZtpN5FA9NlBbZHDmAJc2e8e6SF4tkBD3HAvPF+7igA==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@fal-works/esbuild-plugin-global-externals": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/@fal-works/esbuild-plugin-global-externals/-/esbuild-plugin-global-externals-2.1.2.tgz", - "integrity": "sha512-cEee/Z+I12mZcFJshKcCqC8tuX5hG3s+d+9nZ3LabqKF1vKdF41B92pJVCBggjAGORAeOzyyDDKrZwIkLffeOQ==" - }, - "node_modules/@floating-ui/core": { - "version": "1.6.4", - "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.6.4.tgz", - "integrity": "sha512-a4IowK4QkXl4SCWTGUR0INAfEOX3wtsYw3rKK5InQEHMGObkR8Xk44qYQD9P4r6HHw0iIfK6GUKECmY8sTkqRA==", - "dependencies": { - "@floating-ui/utils": "^0.2.4" - } - }, - "node_modules/@floating-ui/dom": { - "version": "1.6.7", - "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.6.7.tgz", - "integrity": "sha512-wmVfPG5o2xnKDU4jx/m4w5qva9FWHcnZ8BvzEe90D/RpwsJaTAVYPEPdQ8sbr/N8zZTAHlZUTQdqg8ZUbzHmng==", - "dependencies": { - "@floating-ui/core": "^1.6.0", - "@floating-ui/utils": "^0.2.4" - } - }, - "node_modules/@floating-ui/react-dom": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.1.1.tgz", - "integrity": "sha512-4h84MJt3CHrtG18mGsXuLCHMrug49d7DFkU0RMIyshRveBeyV2hmV/pDaF2Uxtu8kgq5r46llp5E5FQiR0K2Yg==", - "dependencies": { - "@floating-ui/dom": "^1.0.0" - }, - "peerDependencies": { - "react": ">=16.8.0", - "react-dom": ">=16.8.0" - } - }, - "node_modules/@floating-ui/utils": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.4.tgz", - "integrity": "sha512-dWO2pw8hhi+WrXq1YJy2yCuWoL20PddgGaqTgVe4cOS9Q6qklXCiA1tJEqX6BEwRNSCP84/afac9hd4MS+zEUA==" - }, - "node_modules/@inquirer/confirm": { - "version": "3.1.14", - "resolved": "https://registry.npmjs.org/@inquirer/confirm/-/confirm-3.1.14.tgz", - "integrity": "sha512-nbLSX37b2dGPtKWL3rPuR/5hOuD30S+pqJ/MuFiUEgN6GiMs8UMxiurKAMDzKt6C95ltjupa8zH6+3csXNHWpA==", - "dependencies": { - "@inquirer/core": "^9.0.2", - "@inquirer/type": "^1.4.0" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/@inquirer/core": { - "version": "9.0.2", - "resolved": "https://registry.npmjs.org/@inquirer/core/-/core-9.0.2.tgz", - "integrity": "sha512-nguvH3TZar3ACwbytZrraRTzGqyxJfYJwv+ZwqZNatAosdWQMP1GV8zvmkNlBe2JeZSaw0WYBHZk52pDpWC9qA==", - "dependencies": { - "@inquirer/figures": "^1.0.3", - "@inquirer/type": "^1.4.0", - "@types/mute-stream": "^0.0.4", - "@types/node": "^20.14.9", - "@types/wrap-ansi": "^3.0.0", - "ansi-escapes": "^4.3.2", - "cli-spinners": "^2.9.2", - "cli-width": "^4.1.0", - "mute-stream": "^1.0.0", - "signal-exit": "^4.1.0", - "strip-ansi": "^6.0.1", - "wrap-ansi": "^6.2.0", - "yoctocolors-cjs": "^2.1.2" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/@inquirer/core/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" - }, + "win32" + ], "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "node": ">= 10" } }, - "node_modules/@inquirer/core/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" - }, + "node_modules/@resvg/resvg-js-win32-x64-msvc": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/@resvg/resvg-js-win32-x64-msvc/-/resvg-js-win32-x64-msvc-2.6.2.tgz", + "integrity": "sha512-ZXtYhtUr5SSaBrUDq7DiyjOFJqBVL/dOBN7N/qmi/pO0IgiWW/f/ue3nbvu9joWE5aAKDoIzy/CxsY0suwGosQ==", + "cpu": [ + "x64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], "engines": { - "node": ">=7.0.0" + "node": ">= 10" } }, - "node_modules/@inquirer/core/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/@sec-ant/readable-stream": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@sec-ant/readable-stream/-/readable-stream-0.4.1.tgz", + "integrity": "sha512-831qok9r2t8AlxLko40y2ebgSDhenenCatLVeW/uBtnHPyhHOvG0C7TvfgecV+wHzIm5KUICgzmVpWS+IMEAeg==", + "license": "MIT" }, - "node_modules/@inquirer/core/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==", + "node_modules/@sentry-internal/browser-utils": { + "version": "10.38.0", + "resolved": "https://registry.npmjs.org/@sentry-internal/browser-utils/-/browser-utils-10.38.0.tgz", + "integrity": "sha512-UOJtYmdcxHCcV0NPfXFff/a95iXl/E0EhuQ1y0uE0BuZDMupWSF5t2BgC4HaE5Aw3RTjDF3XkSHWoIF6ohy7eA==", + "license": "MIT", "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" + "@sentry/core": "10.38.0" }, "engines": { - "node": ">=8" + "node": ">=18" } }, - "node_modules/@inquirer/core/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==", + "node_modules/@sentry-internal/feedback": { + "version": "10.38.0", + "resolved": "https://registry.npmjs.org/@sentry-internal/feedback/-/feedback-10.38.0.tgz", + "integrity": "sha512-JXneg9zRftyfy1Fyfc39bBlF/Qd8g4UDublFFkVvdc1S6JQPlK+P6q22DKz3Pc8w3ySby+xlIq/eTu9Pzqi4KA==", + "license": "MIT", "dependencies": { - "ansi-regex": "^5.0.1" + "@sentry/core": "10.38.0" }, "engines": { - "node": ">=8" + "node": ">=18" } }, - "node_modules/@inquirer/core/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==", + "node_modules/@sentry-internal/node-cpu-profiler": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@sentry-internal/node-cpu-profiler/-/node-cpu-profiler-2.2.0.tgz", + "integrity": "sha512-oLHVYurqZfADPh5hvmQYS5qx8t0UZzT2u6+/68VXsFruQEOnYJTODKgU3BVLmemRs3WE6kCJjPeFdHVYOQGSzQ==", + "hasInstallScript": true, + "license": "MIT", "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" + "detect-libc": "^2.0.3", + "node-abi": "^3.73.0" }, "engines": { - "node": ">=8" + "node": ">=18" } }, - "node_modules/@inquirer/figures": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@inquirer/figures/-/figures-1.0.3.tgz", - "integrity": "sha512-ErXXzENMH5pJt5/ssXV0DfWUZqly8nGzf0UcBV9xTnP+KyffE2mqyxIMBrZ8ijQck2nU0TQm40EQB53YreyWHw==", + "node_modules/@sentry-internal/replay": { + "version": "10.38.0", + "resolved": "https://registry.npmjs.org/@sentry-internal/replay/-/replay-10.38.0.tgz", + "integrity": "sha512-YWIkL6/dnaiQyFiZXJ/nN+NXGv/15z45ia86bE/TMq01CubX/DUOilgsFz0pk2v/pg3tp/U2MskLO9Hz0cnqeg==", + "license": "MIT", + "dependencies": { + "@sentry-internal/browser-utils": "10.38.0", + "@sentry/core": "10.38.0" + }, "engines": { "node": ">=18" } }, - "node_modules/@inquirer/type": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@inquirer/type/-/type-1.4.0.tgz", - "integrity": "sha512-AjOqykVyjdJQvtfkNDGUyMYGF8xN50VUxftCQWsOyIo4DFRLr6VQhW0VItGI1JIyQGCGgIpKa7hMMwNhZb4OIw==", + "node_modules/@sentry-internal/replay-canvas": { + "version": "10.38.0", + "resolved": "https://registry.npmjs.org/@sentry-internal/replay-canvas/-/replay-canvas-10.38.0.tgz", + "integrity": "sha512-OXWM9jEqNYh4VTvrMu7v+z1anz+QKQ/fZXIZdsO7JTT2lGNZe58UUMeoq386M+Saxen8F9SUH7yTORy/8KI5qw==", + "license": "MIT", "dependencies": { - "mute-stream": "^1.0.0" + "@sentry-internal/replay": "10.38.0", + "@sentry/core": "10.38.0" }, "engines": { "node": ">=18" } }, - "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" - }, + "node_modules/@sentry/babel-plugin-component-annotate": { + "version": "4.8.0", + "resolved": "https://registry.npmjs.org/@sentry/babel-plugin-component-annotate/-/babel-plugin-component-annotate-4.8.0.tgz", + "integrity": "sha512-cy/9Eipkv23MsEJ4IuB4dNlVwS9UqOzI3Eu+QPake5BVFgPYCX0uP0Tr3Z43Ime6Rb+BiDnWC51AJK9i9afHYw==", + "license": "MIT", "engines": { - "node": ">=12" + "node": ">= 14" } }, - "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", - "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", + "node_modules/@sentry/browser": { + "version": "10.38.0", + "resolved": "https://registry.npmjs.org/@sentry/browser/-/browser-10.38.0.tgz", + "integrity": "sha512-3phzp1YX4wcQr9mocGWKbjv0jwtuoDBv7+Y6Yfrys/kwyaL84mDLjjQhRf4gL5SX7JdYkhBp4WaiNlR0UC4kTA==", + "license": "MIT", "dependencies": { - "@jridgewell/set-array": "^1.2.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.24" + "@sentry-internal/browser-utils": "10.38.0", + "@sentry-internal/feedback": "10.38.0", + "@sentry-internal/replay": "10.38.0", + "@sentry-internal/replay-canvas": "10.38.0", + "@sentry/core": "10.38.0" }, "engines": { - "node": ">=6.0.0" + "node": ">=18" } }, - "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==", + "node_modules/@sentry/bundler-plugin-core": { + "version": "4.8.0", + "resolved": "https://registry.npmjs.org/@sentry/bundler-plugin-core/-/bundler-plugin-core-4.8.0.tgz", + "integrity": "sha512-QaXd/NzaZ2vmiA2FNu2nBkgQU+17N3fE+zVOTzG0YK54QDSJMd4n3AeJIEyPhSzkOob+GqtO22nbYf6AATFMAw==", + "license": "MIT", + "dependencies": { + "@babel/core": "^7.18.5", + "@sentry/babel-plugin-component-annotate": "4.8.0", + "@sentry/cli": "^2.57.0", + "dotenv": "^16.3.1", + "find-up": "^5.0.0", + "glob": "^10.5.0", + "magic-string": "0.30.8", + "unplugin": "1.0.1" + }, "engines": { - "node": ">=6.0.0" + "node": ">= 14" } }, - "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==", + "node_modules/@sentry/bundler-plugin-core/node_modules/dotenv": { + "version": "16.6.1", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.6.1.tgz", + "integrity": "sha512-uBq4egWHTcTt33a72vpSG0z3HnPuIl6NqYcTrKEg2azoEyl2hpW0zqlxysq2pK9HlDIHyHyakeYaYnSAwd8bow==", + "license": "BSD-2-Clause", "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/@kentcdodds/md-temp": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/@kentcdodds/md-temp/-/md-temp-9.0.1.tgz", - "integrity": "sha512-zlT9youXBwoP6eiYBfwfrRLJrH33gJa3hCcERea0dFQTW28EM7oGQIWIieB+wzEROD99iluDCoPE65TXm6/PQw==", - "dependencies": { - "escape-goat": "^4.0.0", - "parse-numeric-range": "^1.3.0", - "shiki": "^1.7.0", - "tinypool": "^1.0.0", - "unified": "^11.0.4", - "unist-util-visit": "^5.0.0" - } - }, - "node_modules/@mdx-js/esbuild": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@mdx-js/esbuild/-/esbuild-3.0.1.tgz", - "integrity": "sha512-+KZbCKcRjFtRD6qzD+c70Vq/VPVt5LHFsOshNcsdcONkaLTCSjmM7/uj71i3BcP+170f+P4DwVEMtqR/k0t5aw==", - "dependencies": { - "@mdx-js/mdx": "^3.0.0", - "@types/unist": "^3.0.0", - "vfile": "^6.0.0", - "vfile-message": "^4.0.0" + "node": ">=12" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - }, - "peerDependencies": { - "esbuild": ">=0.14.0" + "url": "https://dotenvx.com" } }, - "node_modules/@mdx-js/mdx": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@mdx-js/mdx/-/mdx-3.0.1.tgz", - "integrity": "sha512-eIQ4QTrOWyL3LWEe/bu6Taqzq2HQvHcyTMaOrI95P2/LmJE7AsfPfgJGuFLPVqBUE1BC1rik3VIhU+s9u72arA==", + "node_modules/@sentry/bundler-plugin-core/node_modules/glob": { + "version": "10.5.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.5.0.tgz", + "integrity": "sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==", + "license": "ISC", "dependencies": { - "@types/estree": "^1.0.0", - "@types/estree-jsx": "^1.0.0", - "@types/hast": "^3.0.0", - "@types/mdx": "^2.0.0", - "collapse-white-space": "^2.0.0", - "devlop": "^1.0.0", - "estree-util-build-jsx": "^3.0.0", - "estree-util-is-identifier-name": "^3.0.0", - "estree-util-to-js": "^2.0.0", - "estree-walker": "^3.0.0", - "hast-util-to-estree": "^3.0.0", - "hast-util-to-jsx-runtime": "^2.0.0", - "markdown-extensions": "^2.0.0", - "periscopic": "^3.0.0", - "remark-mdx": "^3.0.0", - "remark-parse": "^11.0.0", - "remark-rehype": "^11.0.0", - "source-map": "^0.7.0", - "unified": "^11.0.0", - "unist-util-position-from-estree": "^2.0.0", - "unist-util-stringify-position": "^4.0.0", - "unist-util-visit": "^5.0.0", - "vfile": "^6.0.0" + "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": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/@mswjs/cookies": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@mswjs/cookies/-/cookies-1.1.1.tgz", - "integrity": "sha512-W68qOHEjx1iD+4VjQudlx26CPIoxmIAtK4ZCexU0/UJBG6jYhcuyzKJx+Iw8uhBIGd9eba64XgWVgo20it1qwA==", - "engines": { - "node": ">=18" - } + "node_modules/@sentry/bundler-plugin-core/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==", + "license": "ISC" }, - "node_modules/@mswjs/interceptors": { - "version": "0.29.1", - "resolved": "https://registry.npmjs.org/@mswjs/interceptors/-/interceptors-0.29.1.tgz", - "integrity": "sha512-3rDakgJZ77+RiQUuSK69t1F0m8BQKA8Vh5DCS5V0DWvNY67zob2JhhQrhCO0AKLGINTRSFd1tBaHcJTkhefoSw==", + "node_modules/@sentry/bundler-plugin-core/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==", + "license": "BlueOak-1.0.0", "dependencies": { - "@open-draft/deferred-promise": "^2.2.0", - "@open-draft/logger": "^0.3.0", - "@open-draft/until": "^2.0.0", - "is-node-process": "^1.2.0", - "outvariant": "^1.2.1", - "strict-event-emitter": "^0.5.1" + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" }, "engines": { - "node": ">=18" - } - }, - "node_modules/@mux/mux-player": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/@mux/mux-player/-/mux-player-2.8.0.tgz", - "integrity": "sha512-qVuLRIFx5IquyBohKbGc8YU7eccRiYeaWBlfbhQcEWI5fSIrn5Lf8YOwlJN0k3TAEWCvX3PXBBr+X77HHH/2wg==", - "dependencies": { - "@mux/mux-video": "0.20.0", - "@mux/playback-core": "0.25.0", - "media-chrome": "~3.2.3" + "node": ">=16 || 14 >=14.18" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/@mux/mux-player-react": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/@mux/mux-player-react/-/mux-player-react-2.8.0.tgz", - "integrity": "sha512-uN+/Tr/9OYwI77ytmMI+u104LCf70O3sHRqZCJQV9BKdMIzsEsuHNxQqY+0EtU39tHrUHdgYmLXD7G2khgwUSw==", + "node_modules/@sentry/cli": { + "version": "2.58.4", + "resolved": "https://registry.npmjs.org/@sentry/cli/-/cli-2.58.4.tgz", + "integrity": "sha512-ArDrpuS8JtDYEvwGleVE+FgR+qHaOp77IgdGSacz6SZy6Lv90uX0Nu4UrHCQJz8/xwIcNxSqnN22lq0dH4IqTg==", + "hasInstallScript": true, + "license": "FSL-1.1-MIT", "dependencies": { - "@mux/mux-player": "2.8.0", - "@mux/playback-core": "0.25.0", - "prop-types": "^15.7.2" + "https-proxy-agent": "^5.0.0", + "node-fetch": "^2.6.7", + "progress": "^2.0.3", + "proxy-from-env": "^1.1.0", + "which": "^2.0.2" }, - "peerDependencies": { - "@types/react": "^17.0.0 || ^18", - "react": "^17.0.2 || ^18", - "react-dom": "^17.0.2 || ^18" + "bin": { + "sentry-cli": "bin/sentry-cli" }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@mux/mux-video": { - "version": "0.20.0", - "resolved": "https://registry.npmjs.org/@mux/mux-video/-/mux-video-0.20.0.tgz", - "integrity": "sha512-KFfsy3MVwd3QiTdkm65JTUA+XZ3OKqaEp5FLAiHYHnl+3fffZhM14Kqd8HhDFVoDEtGAOiMmXV0DPa3/f/IFlg==", - "dependencies": { - "@mux/playback-core": "0.25.0", - "castable-video": "~1.0.9", - "custom-media-element": "~1.3.1", - "media-tracks": "~0.3.2" - } - }, - "node_modules/@mux/playback-core": { - "version": "0.25.0", - "resolved": "https://registry.npmjs.org/@mux/playback-core/-/playback-core-0.25.0.tgz", - "integrity": "sha512-4sqHZ6uKrt8WC6hywHDQihgU0oyy84PTKe9LVzLUI6WXx7nFUeS9nMUPgkGRzlW5xZOXxKiZVAOSMx9AhzMouQ==", - "dependencies": { - "hls.js": "~1.5.11", - "mux-embed": "~5.2.0" - } - }, - "node_modules/@nasa-gcn/remix-seo": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@nasa-gcn/remix-seo/-/remix-seo-2.0.1.tgz", - "integrity": "sha512-g9biDdYfsdFBnOU7lM+7vPGEXSEMRnWmfVLDQ98pT0PnTT/O3pFuA+s3DA0Mj9IwnAq9IcLs2Wee/aL6fvEA+A==", - "dependencies": { - "lodash": "^4.17.21" + "engines": { + "node": ">= 10" }, - "peerDependencies": { - "@remix-run/react": "^1.0.0 || ^2.0.0", - "@remix-run/server-runtime": "^1.0.0 || ^2.0.0" + "optionalDependencies": { + "@sentry/cli-darwin": "2.58.4", + "@sentry/cli-linux-arm": "2.58.4", + "@sentry/cli-linux-arm64": "2.58.4", + "@sentry/cli-linux-i686": "2.58.4", + "@sentry/cli-linux-x64": "2.58.4", + "@sentry/cli-win32-arm64": "2.58.4", + "@sentry/cli-win32-i686": "2.58.4", + "@sentry/cli-win32-x64": "2.58.4" + } + }, + "node_modules/@sentry/cli-darwin": { + "version": "2.58.4", + "resolved": "https://registry.npmjs.org/@sentry/cli-darwin/-/cli-darwin-2.58.4.tgz", + "integrity": "sha512-kbTD+P4X8O+nsNwPxCywtj3q22ecyRHWff98rdcmtRrvwz8CKi/T4Jxn/fnn2i4VEchy08OWBuZAqaA5Kh2hRQ==", + "license": "FSL-1.1-MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=10" } }, - "node_modules/@noble/hashes": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.4.0.tgz", - "integrity": "sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg==", + "node_modules/@sentry/cli-linux-arm": { + "version": "2.58.4", + "resolved": "https://registry.npmjs.org/@sentry/cli-linux-arm/-/cli-linux-arm-2.58.4.tgz", + "integrity": "sha512-rdQ8beTwnN48hv7iV7e7ZKucPec5NJkRdrrycMJMZlzGBPi56LqnclgsHySJ6Kfq506A2MNuQnKGaf/sBC9REA==", + "cpu": [ + "arm" + ], + "license": "FSL-1.1-MIT", + "optional": true, + "os": [ + "linux", + "freebsd", + "android" + ], "engines": { - "node": ">= 16" - }, - "funding": { - "url": "https://paulmillr.com/funding/" + "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" - }, + "node_modules/@sentry/cli-linux-arm64": { + "version": "2.58.4", + "resolved": "https://registry.npmjs.org/@sentry/cli-linux-arm64/-/cli-linux-arm64-2.58.4.tgz", + "integrity": "sha512-0g0KwsOozkLtzN8/0+oMZoOuQ0o7W6O+hx+ydVU1bktaMGKEJLMAWxOQNjsh1TcBbNIXVOKM/I8l0ROhaAb8Ig==", + "cpu": [ + "arm64" + ], + "license": "FSL-1.1-MIT", + "optional": true, + "os": [ + "linux", + "freebsd", + "android" + ], "engines": { - "node": ">= 8" + "node": ">=10" } }, - "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==", + "node_modules/@sentry/cli-linux-i686": { + "version": "2.58.4", + "resolved": "https://registry.npmjs.org/@sentry/cli-linux-i686/-/cli-linux-i686-2.58.4.tgz", + "integrity": "sha512-NseoIQAFtkziHyjZNPTu1Gm1opeQHt7Wm1LbLrGWVIRvUOzlslO9/8i6wETUZ6TjlQxBVRgd3Q0lRBG2A8rFYA==", + "cpu": [ + "x86", + "ia32" + ], + "license": "FSL-1.1-MIT", + "optional": true, + "os": [ + "linux", + "freebsd", + "android" + ], "engines": { - "node": ">= 8" + "node": ">=10" } }, - "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" - }, + "node_modules/@sentry/cli-linux-x64": { + "version": "2.58.4", + "resolved": "https://registry.npmjs.org/@sentry/cli-linux-x64/-/cli-linux-x64-2.58.4.tgz", + "integrity": "sha512-d3Arz+OO/wJYTqCYlSN3Ktm+W8rynQ/IMtSZLK8nu0ryh5mJOh+9XlXY6oDXw4YlsM8qCRrNquR8iEI1Y/IH+Q==", + "cpu": [ + "x64" + ], + "license": "FSL-1.1-MIT", + "optional": true, + "os": [ + "linux", + "freebsd", + "android" + ], "engines": { - "node": ">= 8" + "node": ">=10" } }, - "node_modules/@open-draft/deferred-promise": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@open-draft/deferred-promise/-/deferred-promise-2.2.0.tgz", - "integrity": "sha512-CecwLWx3rhxVQF6V4bAgPS5t+So2sTbPgAzafKkVizyi7tlwpcFpdFqq+wqF2OwNBmqFuu6tOyouTuxgpMfzmA==" - }, - "node_modules/@open-draft/logger": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/@open-draft/logger/-/logger-0.3.0.tgz", - "integrity": "sha512-X2g45fzhxH238HKO4xbSr7+wBS8Fvw6ixhTDuvLd5mqh6bJJCFAPwU9mPDxbcrRtfxv4u5IHCEH77BmxvXmmxQ==", - "dependencies": { - "is-node-process": "^1.2.0", - "outvariant": "^1.4.0" + "node_modules/@sentry/cli-win32-arm64": { + "version": "2.58.4", + "resolved": "https://registry.npmjs.org/@sentry/cli-win32-arm64/-/cli-win32-arm64-2.58.4.tgz", + "integrity": "sha512-bqYrF43+jXdDBh0f8HIJU3tbvlOFtGyRjHB8AoRuMQv9TEDUfENZyCelhdjA+KwDKYl48R1Yasb4EHNzsoO83w==", + "cpu": [ + "arm64" + ], + "license": "FSL-1.1-MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=10" } }, - "node_modules/@open-draft/until": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@open-draft/until/-/until-2.1.0.tgz", - "integrity": "sha512-U69T3ItWHvLwGg5eJ0n3I62nWuE6ilHlmz7zM0npLBRvPRd7e6NYmg54vvRtP5mZG7kZqZCFVdsTWo7BPtBujg==" - }, - "node_modules/@paralleldrive/cuid2": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/@paralleldrive/cuid2/-/cuid2-2.2.2.tgz", - "integrity": "sha512-ZOBkgDwEdoYVlSeRbYYXs0S9MejQofiVYoTbKzy/6GQa39/q5tQU2IX46+shYnUkpEl3wc+J6wRlar7r2EK2xA==", - "dependencies": { - "@noble/hashes": "^1.1.5" + "node_modules/@sentry/cli-win32-i686": { + "version": "2.58.4", + "resolved": "https://registry.npmjs.org/@sentry/cli-win32-i686/-/cli-win32-i686-2.58.4.tgz", + "integrity": "sha512-3triFD6jyvhVcXOmGyttf+deKZcC1tURdhnmDUIBkiDPJKGT/N5xa4qAtHJlAB/h8L9jgYih9bvJnvvFVM7yug==", + "cpu": [ + "x86", + "ia32" + ], + "license": "FSL-1.1-MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=10" } }, - "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==", + "node_modules/@sentry/cli-win32-x64": { + "version": "2.58.4", + "resolved": "https://registry.npmjs.org/@sentry/cli-win32-x64/-/cli-win32-x64-2.58.4.tgz", + "integrity": "sha512-cSzN4PjM1RsCZ4pxMjI0VI7yNCkxiJ5jmWncyiwHXGiXrV1eXYdQ3n1LhUYLZ91CafyprR0OhDcE+RVZ26Qb5w==", + "cpu": [ + "x64" + ], + "license": "FSL-1.1-MIT", "optional": true, + "os": [ + "win32" + ], "engines": { - "node": ">=14" + "node": ">=10" } }, - "node_modules/@playwright/test": { - "version": "1.46.1", - "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.46.1.tgz", - "integrity": "sha512-Fq6SwLujA/DOIvNC2EL/SojJnkKf/rAwJ//APpJJHRyMi1PdKrY3Az+4XNQ51N4RTbItbIByQ0jgd1tayq1aeA==", - "dependencies": { - "playwright": "1.46.1" - }, - "bin": { - "playwright": "cli.js" - }, + "node_modules/@sentry/core": { + "version": "10.38.0", + "resolved": "https://registry.npmjs.org/@sentry/core/-/core-10.38.0.tgz", + "integrity": "sha512-1pubWDZE5y5HZEPMAZERP4fVl2NH3Ihp1A+vMoVkb3Qc66Diqj1WierAnStlZP7tCx0TBa0dK85GTW/ZFYyB9g==", + "license": "MIT", "engines": { "node": ">=18" } }, - "node_modules/@radix-ui/primitive": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@radix-ui/primitive/-/primitive-1.1.0.tgz", - "integrity": "sha512-4Z8dn6Upk0qk4P74xBhZ6Hd/w0mPEzOOLxy4xiPXOXqjF7jZS0VAKk7/x/H6FyY2zCkYJqePf1G5KmkmNJ4RBA==" - }, - "node_modules/@radix-ui/react-arrow": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@radix-ui/react-arrow/-/react-arrow-1.1.0.tgz", - "integrity": "sha512-FmlW1rCg7hBpEBwFbjHwCW6AmWLQM6g/v0Sn8XbP9NvmSZ2San1FpQeyPtufzOMSIx7Y4dzjlHoifhp+7NkZhw==", + "node_modules/@sentry/node": { + "version": "10.38.0", + "resolved": "https://registry.npmjs.org/@sentry/node/-/node-10.38.0.tgz", + "integrity": "sha512-wriyDtWDAoatn8EhOj0U4PJR1WufiijTsCGALqakOHbFiadtBJANLe6aSkXoXT4tegw59cz1wY4NlzHjYksaPw==", + "license": "MIT", "dependencies": { - "@radix-ui/react-primitive": "2.0.0" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + "@opentelemetry/api": "^1.9.0", + "@opentelemetry/context-async-hooks": "^2.5.0", + "@opentelemetry/core": "^2.5.0", + "@opentelemetry/instrumentation": "^0.211.0", + "@opentelemetry/instrumentation-amqplib": "0.58.0", + "@opentelemetry/instrumentation-connect": "0.54.0", + "@opentelemetry/instrumentation-dataloader": "0.28.0", + "@opentelemetry/instrumentation-express": "0.59.0", + "@opentelemetry/instrumentation-fs": "0.30.0", + "@opentelemetry/instrumentation-generic-pool": "0.54.0", + "@opentelemetry/instrumentation-graphql": "0.58.0", + "@opentelemetry/instrumentation-hapi": "0.57.0", + "@opentelemetry/instrumentation-http": "0.211.0", + "@opentelemetry/instrumentation-ioredis": "0.59.0", + "@opentelemetry/instrumentation-kafkajs": "0.20.0", + "@opentelemetry/instrumentation-knex": "0.55.0", + "@opentelemetry/instrumentation-koa": "0.59.0", + "@opentelemetry/instrumentation-lru-memoizer": "0.55.0", + "@opentelemetry/instrumentation-mongodb": "0.64.0", + "@opentelemetry/instrumentation-mongoose": "0.57.0", + "@opentelemetry/instrumentation-mysql": "0.57.0", + "@opentelemetry/instrumentation-mysql2": "0.57.0", + "@opentelemetry/instrumentation-pg": "0.63.0", + "@opentelemetry/instrumentation-redis": "0.59.0", + "@opentelemetry/instrumentation-tedious": "0.30.0", + "@opentelemetry/instrumentation-undici": "0.21.0", + "@opentelemetry/resources": "^2.5.0", + "@opentelemetry/sdk-trace-base": "^2.5.0", + "@opentelemetry/semantic-conventions": "^1.39.0", + "@prisma/instrumentation": "7.2.0", + "@sentry/core": "10.38.0", + "@sentry/node-core": "10.38.0", + "@sentry/opentelemetry": "10.38.0", + "import-in-the-middle": "^2.0.6", + "minimatch": "^9.0.0" }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } + "engines": { + "node": ">=18" } }, - "node_modules/@radix-ui/react-compose-refs": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.1.0.tgz", - "integrity": "sha512-b4inOtiaOnYf9KWyO3jAeeCG6FeyfY6ldiEPanbUjWd+xIk5wZeHa8yVwmrJ2vderhu/BQvzCrJI0lHd+wIiqw==", - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + "node_modules/@sentry/node-core": { + "version": "10.38.0", + "resolved": "https://registry.npmjs.org/@sentry/node-core/-/node-core-10.38.0.tgz", + "integrity": "sha512-ErXtpedrY1HghgwM6AliilZPcUCoNNP1NThdO4YpeMq04wMX9/GMmFCu46TnCcg6b7IFIOSr2S4yD086PxLlHQ==", + "license": "MIT", + "dependencies": { + "@apm-js-collab/tracing-hooks": "^0.3.1", + "@sentry/core": "10.38.0", + "@sentry/opentelemetry": "10.38.0", + "import-in-the-middle": "^2.0.6" + }, + "engines": { + "node": ">=18" }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-context": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.1.0.tgz", - "integrity": "sha512-OKrckBy+sMEgYM/sMmqmErVn0kZqrHPJze+Ql3DzYsDDp0hl0L62nx/2122/Bvps1qz645jlcu2tD9lrRSdf8A==", "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + "@opentelemetry/api": "^1.9.0", + "@opentelemetry/context-async-hooks": "^1.30.1 || ^2.1.0", + "@opentelemetry/core": "^1.30.1 || ^2.1.0", + "@opentelemetry/instrumentation": ">=0.57.1 <1", + "@opentelemetry/resources": "^1.30.1 || ^2.1.0", + "@opentelemetry/sdk-trace-base": "^1.30.1 || ^2.1.0", + "@opentelemetry/semantic-conventions": "^1.39.0" + } + }, + "node_modules/@sentry/opentelemetry": { + "version": "10.38.0", + "resolved": "https://registry.npmjs.org/@sentry/opentelemetry/-/opentelemetry-10.38.0.tgz", + "integrity": "sha512-YPVhWfYmC7nD3EJqEHGtjp4fp5LwtAbE5rt9egQ4hqJlYFvr8YEz9sdoqSZxO0cZzgs2v97HFl/nmWAXe52G2Q==", + "license": "MIT", + "dependencies": { + "@sentry/core": "10.38.0" }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-dialog": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@radix-ui/react-dialog/-/react-dialog-1.1.1.tgz", - "integrity": "sha512-zysS+iU4YP3STKNS6USvFVqI4qqx8EpiwmT5TuCApVEBca+eRCbONi4EgzfNSuVnOXvC5UPHHMjs8RXO6DH9Bg==", - "dependencies": { - "@radix-ui/primitive": "1.1.0", - "@radix-ui/react-compose-refs": "1.1.0", - "@radix-ui/react-context": "1.1.0", - "@radix-ui/react-dismissable-layer": "1.1.0", - "@radix-ui/react-focus-guards": "1.1.0", - "@radix-ui/react-focus-scope": "1.1.0", - "@radix-ui/react-id": "1.1.0", - "@radix-ui/react-portal": "1.1.1", - "@radix-ui/react-presence": "1.1.0", - "@radix-ui/react-primitive": "2.0.0", - "@radix-ui/react-slot": "1.1.0", - "@radix-ui/react-use-controllable-state": "1.1.0", - "aria-hidden": "^1.1.1", - "react-remove-scroll": "2.5.7" + "engines": { + "node": ">=18" }, "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } + "@opentelemetry/api": "^1.9.0", + "@opentelemetry/context-async-hooks": "^1.30.1 || ^2.1.0", + "@opentelemetry/core": "^1.30.1 || ^2.1.0", + "@opentelemetry/sdk-trace-base": "^1.30.1 || ^2.1.0", + "@opentelemetry/semantic-conventions": "^1.39.0" } }, - "node_modules/@radix-ui/react-dismissable-layer": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@radix-ui/react-dismissable-layer/-/react-dismissable-layer-1.1.0.tgz", - "integrity": "sha512-/UovfmmXGptwGcBQawLzvn2jOfM0t4z3/uKffoBlj724+n3FvBbZ7M0aaBOmkp6pqFYpO4yx8tSVJjx3Fl2jig==", + "node_modules/@sentry/profiling-node": { + "version": "10.38.0", + "resolved": "https://registry.npmjs.org/@sentry/profiling-node/-/profiling-node-10.38.0.tgz", + "integrity": "sha512-XIjVSiPmXfcrKq+UjroehbfNY+l89JWSos3vyvkXEXEwnjDWrjHHv9sUyXHje0rlFOR+Qp1MKn2EySiMa/DZag==", + "license": "MIT", "dependencies": { - "@radix-ui/primitive": "1.1.0", - "@radix-ui/react-compose-refs": "1.1.0", - "@radix-ui/react-primitive": "2.0.0", - "@radix-ui/react-use-callback-ref": "1.1.0", - "@radix-ui/react-use-escape-keydown": "1.1.0" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + "@sentry-internal/node-cpu-profiler": "^2.2.0", + "@sentry/core": "10.38.0", + "@sentry/node": "10.38.0" }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-focus-guards": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-guards/-/react-focus-guards-1.1.0.tgz", - "integrity": "sha512-w6XZNUPVv6xCpZUqb/yN9DL6auvpGX3C/ee6Hdi16v2UUy25HV2Q5bcflsiDyT/g5RwbPQ/GIT1vLkeRb+ITBw==", - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + "bin": { + "sentry-prune-profiler-binaries": "scripts/prune-profiler-binaries.js" }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } + "engines": { + "node": ">=18" } }, - "node_modules/@radix-ui/react-focus-scope": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-scope/-/react-focus-scope-1.1.0.tgz", - "integrity": "sha512-200UD8zylvEyL8Bx+z76RJnASR2gRMuxlgFCPAe/Q/679a/r0eK3MBVYMb7vZODZcffZBdob1EGnky78xmVvcA==", + "node_modules/@sentry/react": { + "version": "10.38.0", + "resolved": "https://registry.npmjs.org/@sentry/react/-/react-10.38.0.tgz", + "integrity": "sha512-3UiKo6QsqTyPGUt0XWRY9KLaxc/cs6Kz4vlldBSOXEL6qPDL/EfpwNJT61osRo81VFWu8pKu7ZY2bvLPryrnBQ==", + "license": "MIT", "dependencies": { - "@radix-ui/react-compose-refs": "1.1.0", - "@radix-ui/react-primitive": "2.0.0", - "@radix-ui/react-use-callback-ref": "1.1.0" + "@sentry/browser": "10.38.0", + "@sentry/core": "10.38.0" }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + "engines": { + "node": ">=18" }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } + "peerDependencies": { + "react": "^16.14.0 || 17.x || 18.x || 19.x" } }, - "node_modules/@radix-ui/react-id": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@radix-ui/react-id/-/react-id-1.1.0.tgz", - "integrity": "sha512-EJUrI8yYh7WOjNOqpoJaf1jlFIH2LvtgAl+YcFqNCa+4hj64ZXmPkAKOFs/ukjz3byN6bdb/AVUqHkI8/uWWMA==", + "node_modules/@sentry/react-router": { + "version": "10.38.0", + "resolved": "https://registry.npmjs.org/@sentry/react-router/-/react-router-10.38.0.tgz", + "integrity": "sha512-jUqRwTF8Kux7cidgjuMuYOMO4pYPfUuEtqPn4BKQMJppl5XxYIsXer353sOsLxIvKT29030uAMK2/LAenzyrIg==", + "license": "MIT", "dependencies": { - "@radix-ui/react-use-layout-effect": "1.1.0" + "@opentelemetry/api": "^1.9.0", + "@opentelemetry/core": "^2.5.0", + "@opentelemetry/instrumentation": "^0.211.0", + "@opentelemetry/semantic-conventions": "^1.39.0", + "@sentry/browser": "10.38.0", + "@sentry/cli": "^2.58.4", + "@sentry/core": "10.38.0", + "@sentry/node": "10.38.0", + "@sentry/react": "10.38.0", + "@sentry/vite-plugin": "^4.8.0", + "glob": "11.1.0" }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + "engines": { + "node": ">=20" }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } + "peerDependencies": { + "@react-router/node": "7.x", + "react": ">=18", + "react-router": "7.x" } }, - "node_modules/@radix-ui/react-popper": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@radix-ui/react-popper/-/react-popper-1.2.0.tgz", - "integrity": "sha512-ZnRMshKF43aBxVWPWvbj21+7TQCvhuULWJ4gNIKYpRlQt5xGRhLx66tMp8pya2UkGHTSlhpXwmjqltDYHhw7Vg==", + "node_modules/@sentry/react-router/node_modules/glob": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-11.1.0.tgz", + "integrity": "sha512-vuNwKSaKiqm7g0THUBu2x7ckSs3XJLXE+2ssL7/MfTGPLLcrJQ/4Uq1CjPTtO5cCIiRxqvN6Twy1qOwhL0Xjcw==", + "license": "BlueOak-1.0.0", "dependencies": { - "@floating-ui/react-dom": "^2.0.0", - "@radix-ui/react-arrow": "1.1.0", - "@radix-ui/react-compose-refs": "1.1.0", - "@radix-ui/react-context": "1.1.0", - "@radix-ui/react-primitive": "2.0.0", - "@radix-ui/react-use-callback-ref": "1.1.0", - "@radix-ui/react-use-layout-effect": "1.1.0", - "@radix-ui/react-use-rect": "1.1.0", - "@radix-ui/react-use-size": "1.1.0", - "@radix-ui/rect": "1.1.0" + "foreground-child": "^3.3.1", + "jackspeak": "^4.1.1", + "minimatch": "^10.1.1", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^2.0.0" }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + "bin": { + "glob": "dist/esm/bin.mjs" }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/@radix-ui/react-portal": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@radix-ui/react-portal/-/react-portal-1.1.1.tgz", - "integrity": "sha512-A3UtLk85UtqhzFqtoC8Q0KvR2GbXF3mtPgACSazajqq6A41mEQgo53iPzY4i6BwDxlIFqWIhiQ2G729n+2aw/g==", + "node_modules/@sentry/react-router/node_modules/jackspeak": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-4.1.1.tgz", + "integrity": "sha512-zptv57P3GpL+O0I7VdMJNBZCu+BPHVQUk55Ft8/QCJjTVxrnJHuVuX/0Bl2A6/+2oyR/ZMEuFKwmzqqZ/U5nPQ==", + "license": "BlueOak-1.0.0", "dependencies": { - "@radix-ui/react-primitive": "2.0.0", - "@radix-ui/react-use-layout-effect": "1.1.0" + "@isaacs/cliui": "^8.0.2" }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + "engines": { + "node": "20 || >=22" }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/@radix-ui/react-presence": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@radix-ui/react-presence/-/react-presence-1.1.0.tgz", - "integrity": "sha512-Gq6wuRN/asf9H/E/VzdKoUtT8GC9PQc9z40/vEr0VCJ4u5XvvhWIrSsCB6vD2/cH7ugTdSfYq9fLJCcM00acrQ==", + "node_modules/@sentry/react-router/node_modules/minimatch": { + "version": "10.1.1", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.1.1.tgz", + "integrity": "sha512-enIvLvRAFZYXJzkCYG5RKmPfrFArdLv+R+lbQ53BmIMLIry74bjKzX6iHAm8WYamJkhSSEabrWN5D97XnKObjQ==", + "license": "BlueOak-1.0.0", "dependencies": { - "@radix-ui/react-compose-refs": "1.1.0", - "@radix-ui/react-use-layout-effect": "1.1.0" + "@isaacs/brace-expansion": "^5.0.0" }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + "engines": { + "node": "20 || >=22" }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/@radix-ui/react-primitive": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.0.0.tgz", - "integrity": "sha512-ZSpFm0/uHa8zTvKBDjLFWLo8dkr4MBsiDLz0g3gMUwqgLHz9rTaRRGYDgvZPtBJgYCBKXkS9fzmoySgr8CO6Cw==", + "node_modules/@sentry/vite-plugin": { + "version": "4.8.0", + "resolved": "https://registry.npmjs.org/@sentry/vite-plugin/-/vite-plugin-4.8.0.tgz", + "integrity": "sha512-/YZJitGsx/o72FFQYy3tucUfs4w3COvSI1d2NYyAhIzay4tjLLRjpM5PdwFnoBT7Uj/7jSbuHkg87PAliLiu2g==", + "license": "MIT", "dependencies": { - "@radix-ui/react-slot": "1.1.0" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + "@sentry/bundler-plugin-core": "4.8.0", + "unplugin": "1.0.1" }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } + "engines": { + "node": ">= 14" } }, - "node_modules/@radix-ui/react-slot": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.1.0.tgz", - "integrity": "sha512-FUCf5XMfmW4dtYl69pdS4DbxKy8nj4M7SafBgPllysxmdachynNflAdp/gCsnYWNDnge6tI9onzMp5ARYc1KNw==", + "node_modules/@shikijs/core": { + "version": "3.21.0", + "resolved": "https://registry.npmjs.org/@shikijs/core/-/core-3.21.0.tgz", + "integrity": "sha512-AXSQu/2n1UIQekY8euBJlvFYZIw0PHY63jUzGbrOma4wPxzznJXTXkri+QcHeBNaFxiiOljKxxJkVSoB3PjbyA==", + "license": "MIT", "dependencies": { - "@radix-ui/react-compose-refs": "1.1.0" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } + "@shikijs/types": "3.21.0", + "@shikijs/vscode-textmate": "^10.0.2", + "@types/hast": "^3.0.4", + "hast-util-to-html": "^9.0.5" } }, - "node_modules/@radix-ui/react-tooltip": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@radix-ui/react-tooltip/-/react-tooltip-1.1.2.tgz", - "integrity": "sha512-9XRsLwe6Yb9B/tlnYCPVUd/TFS4J7HuOZW345DCeC6vKIxQGMZdx21RK4VoZauPD5frgkXTYVS5y90L+3YBn4w==", - "dependencies": { - "@radix-ui/primitive": "1.1.0", - "@radix-ui/react-compose-refs": "1.1.0", - "@radix-ui/react-context": "1.1.0", - "@radix-ui/react-dismissable-layer": "1.1.0", - "@radix-ui/react-id": "1.1.0", - "@radix-ui/react-popper": "1.2.0", - "@radix-ui/react-portal": "1.1.1", - "@radix-ui/react-presence": "1.1.0", - "@radix-ui/react-primitive": "2.0.0", - "@radix-ui/react-slot": "1.1.0", - "@radix-ui/react-use-controllable-state": "1.1.0", - "@radix-ui/react-visually-hidden": "1.1.0" + "node_modules/@shikijs/engine-javascript": { + "version": "3.21.0", + "resolved": "https://registry.npmjs.org/@shikijs/engine-javascript/-/engine-javascript-3.21.0.tgz", + "integrity": "sha512-ATwv86xlbmfD9n9gKRiwuPpWgPENAWCLwYCGz9ugTJlsO2kOzhOkvoyV/UD+tJ0uT7YRyD530x6ugNSffmvIiQ==", + "license": "MIT", + "dependencies": { + "@shikijs/types": "3.21.0", + "@shikijs/vscode-textmate": "^10.0.2", + "oniguruma-to-es": "^4.3.4" + } + }, + "node_modules/@shikijs/engine-oniguruma": { + "version": "3.21.0", + "resolved": "https://registry.npmjs.org/@shikijs/engine-oniguruma/-/engine-oniguruma-3.21.0.tgz", + "integrity": "sha512-OYknTCct6qiwpQDqDdf3iedRdzj6hFlOPv5hMvI+hkWfCKs5mlJ4TXziBG9nyabLwGulrUjHiCq3xCspSzErYQ==", + "license": "MIT", + "dependencies": { + "@shikijs/types": "3.21.0", + "@shikijs/vscode-textmate": "^10.0.2" + } + }, + "node_modules/@shikijs/langs": { + "version": "3.21.0", + "resolved": "https://registry.npmjs.org/@shikijs/langs/-/langs-3.21.0.tgz", + "integrity": "sha512-g6mn5m+Y6GBJ4wxmBYqalK9Sp0CFkUqfNzUy2pJglUginz6ZpWbaWjDB4fbQ/8SHzFjYbtU6Ddlp1pc+PPNDVA==", + "license": "MIT", + "dependencies": { + "@shikijs/types": "3.21.0" + } + }, + "node_modules/@shikijs/themes": { + "version": "3.21.0", + "resolved": "https://registry.npmjs.org/@shikijs/themes/-/themes-3.21.0.tgz", + "integrity": "sha512-BAE4cr9EDiZyYzwIHEk7JTBJ9CzlPuM4PchfcA5ao1dWXb25nv6hYsoDiBq2aZK9E3dlt3WB78uI96UESD+8Mw==", + "license": "MIT", + "dependencies": { + "@shikijs/types": "3.21.0" + } + }, + "node_modules/@shikijs/types": { + "version": "3.21.0", + "resolved": "https://registry.npmjs.org/@shikijs/types/-/types-3.21.0.tgz", + "integrity": "sha512-zGrWOxZ0/+0ovPY7PvBU2gIS9tmhSUUt30jAcNV0Bq0gb2S98gwfjIs1vxlmH5zM7/4YxLamT6ChlqqAJmPPjA==", + "license": "MIT", + "dependencies": { + "@shikijs/vscode-textmate": "^10.0.2", + "@types/hast": "^3.0.4" + } + }, + "node_modules/@shikijs/vscode-textmate": { + "version": "10.0.2", + "resolved": "https://registry.npmjs.org/@shikijs/vscode-textmate/-/vscode-textmate-10.0.2.tgz", + "integrity": "sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg==", + "license": "MIT" + }, + "node_modules/@shuding/opentype.js": { + "version": "1.4.0-beta.0", + "resolved": "https://registry.npmjs.org/@shuding/opentype.js/-/opentype.js-1.4.0-beta.0.tgz", + "integrity": "sha512-3NgmNyH3l/Hv6EvsWJbsvpcpUba6R8IREQ83nH83cyakCw7uM1arZKNfHwv1Wz6jgqrF/j4x5ELvR6PnK9nTcA==", + "license": "MIT", + "dependencies": { + "fflate": "^0.7.3", + "string.prototype.codepointat": "^0.2.1" }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + "bin": { + "ot": "bin/ot" }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } + "engines": { + "node": ">= 8.0.0" } }, - "node_modules/@radix-ui/react-use-callback-ref": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-callback-ref/-/react-use-callback-ref-1.1.0.tgz", - "integrity": "sha512-CasTfvsy+frcFkbXtSJ2Zu9JHpN8TYKxkgJGWbjiZhFivxaeW7rMeZt7QELGVLaYVfFMsKHjb7Ak0nMEe+2Vfw==", - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + "node_modules/@sindresorhus/is": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz", + "integrity": "sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==", + "license": "MIT", + "engines": { + "node": ">=10" }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } + "funding": { + "url": "https://github.com/sindresorhus/is?sponsor=1" } }, - "node_modules/@radix-ui/react-use-controllable-state": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-controllable-state/-/react-use-controllable-state-1.1.0.tgz", - "integrity": "sha512-MtfMVJiSr2NjzS0Aa90NPTnvTSg6C/JLCV7ma0W6+OMV78vd8OyRpID+Ng9LxzsPbLeuBnWBA1Nq30AtBIDChw==", - "dependencies": { - "@radix-ui/react-use-callback-ref": "1.1.0" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + "node_modules/@sindresorhus/merge-streams": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/merge-streams/-/merge-streams-4.0.0.tgz", + "integrity": "sha512-tlqY9xq5ukxTUZBmoOp+m61cqwQD5pHJtFY3Mn8CA8ps6yghLH/Hw8UPdqg4OLmFW3IFlcXnQNmo/dh8HzXYIQ==", + "license": "MIT", + "engines": { + "node": ">=18" }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@radix-ui/react-use-escape-keydown": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-escape-keydown/-/react-use-escape-keydown-1.1.0.tgz", - "integrity": "sha512-L7vwWlR1kTTQ3oh7g1O0CBF3YCyyTj8NmhLR+phShpyA50HCfBFKVJTpshm9PzLiKmehsrQzTYTpX9HvmC9rhw==", + "node_modules/@sindresorhus/slugify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/slugify/-/slugify-3.0.0.tgz", + "integrity": "sha512-SCrKh1zS96q+CuH5GumHcyQEVPsM4Ve8oE0E6tw7AAhGq50K8ojbTUOQnX/j9Mhcv/AXiIsbCfquovyGOo5fGw==", + "license": "MIT", "dependencies": { - "@radix-ui/react-use-callback-ref": "1.1.0" + "@sindresorhus/transliterate": "^2.0.0", + "escape-string-regexp": "^5.0.0" }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + "engines": { + "node": ">=20" }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@radix-ui/react-use-layout-effect": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-layout-effect/-/react-use-layout-effect-1.1.0.tgz", - "integrity": "sha512-+FPE0rOdziWSrH9athwI1R0HDVbWlEhd+FR+aSDk4uWGmSJ9Z54sdZVDQPZAinJhJXwfT+qnj969mCsT2gfm5w==", - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + "node_modules/@sindresorhus/transliterate": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/transliterate/-/transliterate-2.2.0.tgz", + "integrity": "sha512-aLtANYAx3qvFilasPhZke27+Cm7WawGGuGiOd2EAp0lg1NdWKfulslcql/Qi7lNQ9odkPjwRbwk9c4CYsTh+Rg==", + "license": "MIT", + "engines": { + "node": ">=20" }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@radix-ui/react-use-rect": { + "node_modules/@standard-schema/spec": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-rect/-/react-use-rect-1.1.0.tgz", - "integrity": "sha512-0Fmkebhr6PiseyZlYAOtLS+nb7jLmpqTrJyv61Pe68MKYW6OWdRE2kI70TaYY27u7H0lajqM3hSMMLFq18Z7nQ==", + "resolved": "https://registry.npmjs.org/@standard-schema/spec/-/spec-1.1.0.tgz", + "integrity": "sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==", + "license": "MIT" + }, + "node_modules/@testing-library/dom": { + "version": "10.4.1", + "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-10.4.1.tgz", + "integrity": "sha512-o4PXJQidqJl82ckFaXUeoAW+XysPLauYI43Abki5hABd853iMhitooc6znOnczgbTYmEP6U6/y1ZyKAIsvMKGg==", + "license": "MIT", "dependencies": { - "@radix-ui/rect": "1.1.0" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + "@babel/code-frame": "^7.10.4", + "@babel/runtime": "^7.12.5", + "@types/aria-query": "^5.0.1", + "aria-query": "5.3.0", + "dom-accessibility-api": "^0.5.9", + "lz-string": "^1.5.0", + "picocolors": "1.1.1", + "pretty-format": "^27.0.2" }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } + "engines": { + "node": ">=18" } }, - "node_modules/@radix-ui/react-use-size": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-size/-/react-use-size-1.1.0.tgz", - "integrity": "sha512-XW3/vWuIXHa+2Uwcc2ABSfcCledmXhhQPlGbfcRXbiUQI5Icjcg19BGCZVKKInYbvUCut/ufbbLLPFC5cbb1hw==", + "node_modules/@testing-library/jest-dom": { + "version": "6.9.1", + "resolved": "https://registry.npmjs.org/@testing-library/jest-dom/-/jest-dom-6.9.1.tgz", + "integrity": "sha512-zIcONa+hVtVSSep9UT3jZ5rizo2BsxgyDYU7WFD5eICBE7no3881HGeb/QkGfsJs6JTkY1aQhT7rIPC7e+0nnA==", + "license": "MIT", "dependencies": { - "@radix-ui/react-use-layout-effect": "1.1.0" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + "@adobe/css-tools": "^4.4.0", + "aria-query": "^5.0.0", + "css.escape": "^1.5.1", + "dom-accessibility-api": "^0.6.3", + "picocolors": "^1.1.1", + "redent": "^3.0.0" }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } + "engines": { + "node": ">=14", + "npm": ">=6", + "yarn": ">=1" } }, - "node_modules/@radix-ui/react-visually-hidden": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@radix-ui/react-visually-hidden/-/react-visually-hidden-1.1.0.tgz", - "integrity": "sha512-N8MDZqtgCgG5S3aV60INAB475osJousYpZ4cTJ2cFbMpdHS5Y6loLTH8LPtkj2QN0x93J30HT/M3qJXM0+lyeQ==", + "node_modules/@testing-library/jest-dom/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==", + "license": "MIT" + }, + "node_modules/@total-typescript/ts-reset": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/@total-typescript/ts-reset/-/ts-reset-0.6.1.tgz", + "integrity": "sha512-cka47fVSo6lfQDIATYqb/vO1nvFfbPw7uWLayIXIhGETj0wcOOlrlkobOMDNQOFr9QOafegUPq13V2+6vtD7yg==", + "license": "MIT" + }, + "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==", + "license": "MIT" + }, + "node_modules/@types/chai": { + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/@types/chai/-/chai-5.2.3.tgz", + "integrity": "sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA==", + "license": "MIT", "dependencies": { - "@radix-ui/react-primitive": "2.0.0" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } + "@types/deep-eql": "*", + "assertion-error": "^2.0.1" } }, - "node_modules/@radix-ui/rect": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@radix-ui/rect/-/rect-1.1.0.tgz", - "integrity": "sha512-A9+lCBZoaMJlVKcRBz2YByCG+Cp2t6nAnMnNba+XiWxnj6r4JUFqfsgwocMBZU9LPtdxC6wB56ySYpc7LQIoJg==" + "node_modules/@types/chai-dom": { + "version": "1.11.3", + "resolved": "https://registry.npmjs.org/@types/chai-dom/-/chai-dom-1.11.3.tgz", + "integrity": "sha512-EUEZI7uID4ewzxnU7DJXtyvykhQuwe+etJ1wwOiJyQRTH/ifMWKX+ghiXkxCUvNJ6IQDodf0JXhuP6zZcy2qXQ==", + "license": "MIT", + "dependencies": { + "@types/chai": "*" + } }, - "node_modules/@remix-run/css-bundle": { - "version": "2.10.2", - "resolved": "https://registry.npmjs.org/@remix-run/css-bundle/-/css-bundle-2.10.2.tgz", - "integrity": "sha512-rtnDV62iR6l+l70BcQeDIGPkaF0WZoscxD0FXPR+IrBXMcfz44T3PcnmXEeY0bUmBc3VXkBOKWSJzKU4m3gYFA==", - "engines": { - "node": ">=18.0.0" + "node_modules/@types/connect": { + "version": "3.4.38", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz", + "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==", + "license": "MIT", + "dependencies": { + "@types/node": "*" } }, - "node_modules/@remix-run/express": { - "version": "2.10.2", - "resolved": "https://registry.npmjs.org/@remix-run/express/-/express-2.10.2.tgz", - "integrity": "sha512-er8b1aLULkM3KHTrU97ovBy5KDu53gCE7VjbqefHG9ZYLMZPOifawmCUaNAirhpkxW/nb08gyJo/5c+WYRrsuQ==", + "node_modules/@types/d3": { + "version": "7.4.3", + "resolved": "https://registry.npmjs.org/@types/d3/-/d3-7.4.3.tgz", + "integrity": "sha512-lZXZ9ckh5R8uiFVt8ogUNf+pIrK4EsWrx2Np75WvF/eTpJ0FMHNhjXk8CKEx/+gpHbNQyJWehbFaTvqmHWB3ww==", + "license": "MIT", "dependencies": { - "@remix-run/node": "2.10.2" - }, - "engines": { - "node": ">=18.0.0" - }, - "peerDependencies": { - "express": "^4.19.2", - "typescript": "^5.1.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } + "@types/d3-array": "*", + "@types/d3-axis": "*", + "@types/d3-brush": "*", + "@types/d3-chord": "*", + "@types/d3-color": "*", + "@types/d3-contour": "*", + "@types/d3-delaunay": "*", + "@types/d3-dispatch": "*", + "@types/d3-drag": "*", + "@types/d3-dsv": "*", + "@types/d3-ease": "*", + "@types/d3-fetch": "*", + "@types/d3-force": "*", + "@types/d3-format": "*", + "@types/d3-geo": "*", + "@types/d3-hierarchy": "*", + "@types/d3-interpolate": "*", + "@types/d3-path": "*", + "@types/d3-polygon": "*", + "@types/d3-quadtree": "*", + "@types/d3-random": "*", + "@types/d3-scale": "*", + "@types/d3-scale-chromatic": "*", + "@types/d3-selection": "*", + "@types/d3-shape": "*", + "@types/d3-time": "*", + "@types/d3-time-format": "*", + "@types/d3-timer": "*", + "@types/d3-transition": "*", + "@types/d3-zoom": "*" + } + }, + "node_modules/@types/d3-array": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/@types/d3-array/-/d3-array-3.2.2.tgz", + "integrity": "sha512-hOLWVbm7uRza0BYXpIIW5pxfrKe0W+D5lrFiAEYR+pb6w3N2SwSMaJbXdUfSEv+dT4MfHBLtn5js0LAWaO6otw==", + "license": "MIT" }, - "node_modules/@remix-run/node": { - "version": "2.10.2", - "resolved": "https://registry.npmjs.org/@remix-run/node/-/node-2.10.2.tgz", - "integrity": "sha512-Ni4yMQCf6avK2fz91/luuS3wnHzqtbxsdc19es1gAWEnUKfeCwqq5v1R0kzNwrXyh5NYCRhxaegzVH3tGsdYFg==", + "node_modules/@types/d3-axis": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@types/d3-axis/-/d3-axis-3.0.6.tgz", + "integrity": "sha512-pYeijfZuBd87T0hGn0FO1vQ/cgLk6E1ALJjfkC0oJ8cbwkZl3TpgS8bVBLZN+2jjGgg38epgxb2zmoGtSfvgMw==", + "license": "MIT", "dependencies": { - "@remix-run/server-runtime": "2.10.2", - "@remix-run/web-fetch": "^4.4.2", - "@web3-storage/multipart-parser": "^1.0.0", - "cookie-signature": "^1.1.0", - "source-map-support": "^0.5.21", - "stream-slice": "^0.1.2", - "undici": "^6.11.1" - }, - "engines": { - "node": ">=18.0.0" - }, - "peerDependencies": { - "typescript": "^5.1.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } + "@types/d3-selection": "*" } }, - "node_modules/@remix-run/router": { - "version": "1.17.1", - "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.17.1.tgz", - "integrity": "sha512-mCOMec4BKd6BRGBZeSnGiIgwsbLGp3yhVqAD8H+PxiRNEHgDpZb8J1TnrSDlg97t0ySKMQJTHCWBCmBpSmkF6Q==", - "engines": { - "node": ">=14.0.0" + "node_modules/@types/d3-brush": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@types/d3-brush/-/d3-brush-3.0.6.tgz", + "integrity": "sha512-nH60IZNNxEcrh6L1ZSMNA28rj27ut/2ZmI3r96Zd+1jrZD++zD3LsMIjWlvg4AYrHn/Pqz4CF3veCxGjtbqt7A==", + "license": "MIT", + "dependencies": { + "@types/d3-selection": "*" } }, - "node_modules/@remix-run/server-runtime": { - "version": "2.10.2", - "resolved": "https://registry.npmjs.org/@remix-run/server-runtime/-/server-runtime-2.10.2.tgz", - "integrity": "sha512-c6CzKw4WBP4FkPnz63ua7g73/P1v34Uho2C44SZZf8IOVCGzEM9liLq6slDivn0m/UbyQnXThdXmsVjFcobmZg==", + "node_modules/@types/d3-chord": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@types/d3-chord/-/d3-chord-3.0.6.tgz", + "integrity": "sha512-LFYWWd8nwfwEmTZG9PfQxd17HbNPksHBiJHaKuY1XeqscXacsS2tyoo6OdRsjf+NQYeB6XrNL3a25E3gH69lcg==", + "license": "MIT" + }, + "node_modules/@types/d3-color": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/@types/d3-color/-/d3-color-3.1.3.tgz", + "integrity": "sha512-iO90scth9WAbmgv7ogoq57O9YpKmFBbmoEoCHDB2xMBY0+/KVrqAaCDyCE16dUspeOvIxFFRI+0sEtqDqy2b4A==", + "license": "MIT" + }, + "node_modules/@types/d3-contour": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@types/d3-contour/-/d3-contour-3.0.6.tgz", + "integrity": "sha512-BjzLgXGnCWjUSYGfH1cpdo41/hgdWETu4YxpezoztawmqsvCeep+8QGfiY6YbDvfgHz/DkjeIkkZVJavB4a3rg==", + "license": "MIT", "dependencies": { - "@remix-run/router": "1.17.1", - "@types/cookie": "^0.6.0", - "@web3-storage/multipart-parser": "^1.0.0", - "cookie": "^0.6.0", - "set-cookie-parser": "^2.4.8", - "source-map": "^0.7.3", - "turbo-stream": "2.2.0" - }, - "engines": { - "node": ">=18.0.0" - }, - "peerDependencies": { - "typescript": "^5.1.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } + "@types/d3-array": "*", + "@types/geojson": "*" } }, - "node_modules/@remix-run/v1-route-convention": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/@remix-run/v1-route-convention/-/v1-route-convention-0.1.4.tgz", - "integrity": "sha512-fVTr9YlNLWfaiM/6Y56sOtcY8x1bBJQHY0sDWO5+Z/vjJ2Ni7fe2fwrzs1jUFciMPXqBQdFGePnkuiYLz3cuUA==", + "node_modules/@types/d3-delaunay": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/@types/d3-delaunay/-/d3-delaunay-6.0.4.tgz", + "integrity": "sha512-ZMaSKu4THYCU6sV64Lhg6qjf1orxBthaC161plr5KuPHo3CNm8DTHiLw/5Eq2b6TsNP0W0iJrUOFscY6Q450Hw==", + "license": "MIT" + }, + "node_modules/@types/d3-dispatch": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@types/d3-dispatch/-/d3-dispatch-3.0.7.tgz", + "integrity": "sha512-5o9OIAdKkhN1QItV2oqaE5KMIiXAvDWBDPrD85e58Qlz1c1kI/J0NcqbEG88CoTwJrYe7ntUCVfeUl2UJKbWgA==", + "license": "MIT" + }, + "node_modules/@types/d3-drag": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@types/d3-drag/-/d3-drag-3.0.7.tgz", + "integrity": "sha512-HE3jVKlzU9AaMazNufooRJ5ZpWmLIoc90A37WU2JMmeq28w1FQqCZswHZ3xR+SuxYftzHq6WU6KJHvqxKzTxxQ==", + "license": "MIT", "dependencies": { - "minimatch": "^7.4.3" - }, - "peerDependencies": { - "@remix-run/dev": "^1.15.0 || ^2.0.0" + "@types/d3-selection": "*" } }, - "node_modules/@remix-run/v1-route-convention/node_modules/minimatch": { - "version": "7.4.6", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-7.4.6.tgz", - "integrity": "sha512-sBz8G/YjVniEz6lKPNpKxXwazJe4c19fEfV2GDMX6AjFz+MX9uDWIZW8XreVhkFW3fkIdTv/gxWr/Kks5FFAVw==", + "node_modules/@types/d3-dsv": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@types/d3-dsv/-/d3-dsv-3.0.7.tgz", + "integrity": "sha512-n6QBF9/+XASqcKK6waudgL0pf/S5XHPPI8APyMLLUHd8NqouBGLsU8MgtO7NINGtPBtk9Kko/W4ea0oAspwh9g==", + "license": "MIT" + }, + "node_modules/@types/d3-ease": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/d3-ease/-/d3-ease-3.0.2.tgz", + "integrity": "sha512-NcV1JjO5oDzoK26oMzbILE6HW7uVXOHLQvHshBUW4UMdZGfiY6v5BeQwh9a9tCzv+CeefZQHJt5SRgK154RtiA==", + "license": "MIT" + }, + "node_modules/@types/d3-fetch": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@types/d3-fetch/-/d3-fetch-3.0.7.tgz", + "integrity": "sha512-fTAfNmxSb9SOWNB9IoG5c8Hg6R+AzUHDRlsXsDZsNp6sxAEOP0tkP3gKkNSO/qmHPoBFTxNrjDprVHDQDvo5aA==", + "license": "MIT", "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "@types/d3-dsv": "*" } }, - "node_modules/@remix-run/web-blob": { + "node_modules/@types/d3-force": { + "version": "3.0.10", + "resolved": "https://registry.npmjs.org/@types/d3-force/-/d3-force-3.0.10.tgz", + "integrity": "sha512-ZYeSaCF3p73RdOKcjj+swRlZfnYpK1EbaDiYICEEp5Q6sUiqFaFQ9qgoshp5CzIyyb/yD09kD9o2zEltCexlgw==", + "license": "MIT" + }, + "node_modules/@types/d3-format": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/d3-format/-/d3-format-3.0.4.tgz", + "integrity": "sha512-fALi2aI6shfg7vM5KiR1wNJnZ7r6UuggVqtDA+xiEdPZQwy/trcQaHnwShLuLdta2rTymCNpxYTiMZX/e09F4g==", + "license": "MIT" + }, + "node_modules/@types/d3-geo": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@remix-run/web-blob/-/web-blob-3.1.0.tgz", - "integrity": "sha512-owGzFLbqPH9PlKb8KvpNJ0NO74HWE2euAn61eEiyCXX/oteoVzTVSN8mpLgDjaxBf2btj5/nUllSUgpyd6IH6g==", + "resolved": "https://registry.npmjs.org/@types/d3-geo/-/d3-geo-3.1.0.tgz", + "integrity": "sha512-856sckF0oP/diXtS4jNsiQw/UuK5fQG8l/a9VVLeSouf1/PPbBE1i1W852zVwKwYCBkFJJB7nCFTbk6UMEXBOQ==", + "license": "MIT", "dependencies": { - "@remix-run/web-stream": "^1.1.0", - "web-encoding": "1.1.5" + "@types/geojson": "*" } }, - "node_modules/@remix-run/web-fetch": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/@remix-run/web-fetch/-/web-fetch-4.4.2.tgz", - "integrity": "sha512-jgKfzA713/4kAW/oZ4bC3MoLWyjModOVDjFPNseVqcJKSafgIscrYL9G50SurEYLswPuoU3HzSbO0jQCMYWHhA==", + "node_modules/@types/d3-hierarchy": { + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/@types/d3-hierarchy/-/d3-hierarchy-3.1.7.tgz", + "integrity": "sha512-tJFtNoYBtRtkNysX1Xq4sxtjK8YgoWUNpIiUee0/jHGRwqvzYxkq0hGVbbOGSz+JgFxxRu4K8nb3YpG3CMARtg==", + "license": "MIT" + }, + "node_modules/@types/d3-interpolate": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/d3-interpolate/-/d3-interpolate-3.0.4.tgz", + "integrity": "sha512-mgLPETlrpVV1YRJIglr4Ez47g7Yxjl1lj7YKsiMCb27VJH9W8NVM6Bb9d8kkpG/uAQS5AmbA48q2IAolKKo1MA==", + "license": "MIT", "dependencies": { - "@remix-run/web-blob": "^3.1.0", - "@remix-run/web-file": "^3.1.0", - "@remix-run/web-form-data": "^3.1.0", - "@remix-run/web-stream": "^1.1.0", - "@web3-storage/multipart-parser": "^1.0.0", - "abort-controller": "^3.0.0", - "data-uri-to-buffer": "^3.0.1", - "mrmime": "^1.0.0" - }, - "engines": { - "node": "^10.17 || >=12.3" + "@types/d3-color": "*" } }, - "node_modules/@remix-run/web-file": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@remix-run/web-file/-/web-file-3.1.0.tgz", - "integrity": "sha512-dW2MNGwoiEYhlspOAXFBasmLeYshyAyhIdrlXBi06Duex5tDr3ut2LFKVj7tyHLmn8nnNwFf1BjNbkQpygC2aQ==", + "node_modules/@types/d3-path": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@types/d3-path/-/d3-path-3.1.1.tgz", + "integrity": "sha512-VMZBYyQvbGmWyWVea0EHs/BwLgxc+MKi1zLDCONksozI4YJMcTt8ZEuIR4Sb1MMTE8MMW49v0IwI5+b7RmfWlg==", + "license": "MIT" + }, + "node_modules/@types/d3-polygon": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/d3-polygon/-/d3-polygon-3.0.2.tgz", + "integrity": "sha512-ZuWOtMaHCkN9xoeEMr1ubW2nGWsp4nIql+OPQRstu4ypeZ+zk3YKqQT0CXVe/PYqrKpZAi+J9mTs05TKwjXSRA==", + "license": "MIT" + }, + "node_modules/@types/d3-quadtree": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@types/d3-quadtree/-/d3-quadtree-3.0.6.tgz", + "integrity": "sha512-oUzyO1/Zm6rsxKRHA1vH0NEDG58HrT5icx/azi9MF1TWdtttWl0UIUsjEQBBh+SIkrpd21ZjEv7ptxWys1ncsg==", + "license": "MIT" + }, + "node_modules/@types/d3-random": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/d3-random/-/d3-random-3.0.3.tgz", + "integrity": "sha512-Imagg1vJ3y76Y2ea0871wpabqp613+8/r0mCLEBfdtqC7xMSfj9idOnmBYyMoULfHePJyxMAw3nWhJxzc+LFwQ==", + "license": "MIT" + }, + "node_modules/@types/d3-scale": { + "version": "4.0.9", + "resolved": "https://registry.npmjs.org/@types/d3-scale/-/d3-scale-4.0.9.tgz", + "integrity": "sha512-dLmtwB8zkAeO/juAMfnV+sItKjlsw2lKdZVVy6LRr0cBmegxSABiLEpGVmSJJ8O08i4+sGR6qQtb6WtuwJdvVw==", + "license": "MIT", "dependencies": { - "@remix-run/web-blob": "^3.1.0" + "@types/d3-time": "*" } }, - "node_modules/@remix-run/web-form-data": { + "node_modules/@types/d3-scale-chromatic": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@remix-run/web-form-data/-/web-form-data-3.1.0.tgz", - "integrity": "sha512-NdeohLMdrb+pHxMQ/Geuzdp0eqPbea+Ieo8M8Jx2lGC6TBHsgHzYcBvr0LyPdPVycNRDEpWpiDdCOdCryo3f9A==", + "resolved": "https://registry.npmjs.org/@types/d3-scale-chromatic/-/d3-scale-chromatic-3.1.0.tgz", + "integrity": "sha512-iWMJgwkK7yTRmWqRB5plb1kadXyQ5Sj8V/zYlFGMUBbIPKQScw+Dku9cAAMgJG+z5GYDoMjWGLVOvjghDEFnKQ==", + "license": "MIT" + }, + "node_modules/@types/d3-selection": { + "version": "3.0.11", + "resolved": "https://registry.npmjs.org/@types/d3-selection/-/d3-selection-3.0.11.tgz", + "integrity": "sha512-bhAXu23DJWsrI45xafYpkQ4NtcKMwWnAC/vKrd2l+nxMFuvOT3XMYTIj2opv8vq8AO5Yh7Qac/nSeP/3zjTK0w==", + "license": "MIT" + }, + "node_modules/@types/d3-shape": { + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/@types/d3-shape/-/d3-shape-3.1.7.tgz", + "integrity": "sha512-VLvUQ33C+3J+8p+Daf+nYSOsjB4GXp19/S/aGo60m9h1v6XaxjiT82lKVWJCfzhtuZ3yD7i/TPeC/fuKLLOSmg==", + "license": "MIT", "dependencies": { - "web-encoding": "1.1.5" + "@types/d3-path": "*" } }, - "node_modules/@remix-run/web-stream": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@remix-run/web-stream/-/web-stream-1.1.0.tgz", - "integrity": "sha512-KRJtwrjRV5Bb+pM7zxcTJkhIqWWSy+MYsIxHK+0m5atcznsf15YwUBWHWulZerV2+vvHH1Lp1DD7pw6qKW8SgA==", + "node_modules/@types/d3-time": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/d3-time/-/d3-time-3.0.4.tgz", + "integrity": "sha512-yuzZug1nkAAaBlBBikKZTgzCeA+k1uy4ZFwWANOfKw5z5LRhV0gNA7gNkKm7HoK+HRN0wX3EkxGk0fpbWhmB7g==", + "license": "MIT" + }, + "node_modules/@types/d3-time-format": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@types/d3-time-format/-/d3-time-format-4.0.3.tgz", + "integrity": "sha512-5xg9rC+wWL8kdDj153qZcsJ0FWiFt0J5RB6LYUNZjwSnesfblqrI/bJ1wBdJ8OQfncgbJG5+2F+qfqnqyzYxyg==", + "license": "MIT" + }, + "node_modules/@types/d3-timer": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/d3-timer/-/d3-timer-3.0.2.tgz", + "integrity": "sha512-Ps3T8E8dZDam6fUyNiMkekK3XUsaUEik+idO9/YjPtfj2qruF8tFBXS7XhtE4iIXBLxhmLjP3SXpLhVf21I9Lw==", + "license": "MIT" + }, + "node_modules/@types/d3-transition": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/@types/d3-transition/-/d3-transition-3.0.9.tgz", + "integrity": "sha512-uZS5shfxzO3rGlu0cC3bjmMFKsXv+SmZZcgp0KD22ts4uGXp5EVYGzu/0YdwZeKmddhcAccYtREJKkPfXkZuCg==", + "license": "MIT", "dependencies": { - "web-streams-polyfill": "^3.1.1" + "@types/d3-selection": "*" } }, - "node_modules/@resvg/resvg-js": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/@resvg/resvg-js/-/resvg-js-2.6.2.tgz", - "integrity": "sha512-xBaJish5OeGmniDj9cW5PRa/PtmuVU3ziqrbr5xJj901ZDN4TosrVaNZpEiLZAxdfnhAe7uQ7QFWfjPe9d9K2Q==", - "engines": { - "node": ">= 10" - }, - "optionalDependencies": { - "@resvg/resvg-js-android-arm-eabi": "2.6.2", - "@resvg/resvg-js-android-arm64": "2.6.2", - "@resvg/resvg-js-darwin-arm64": "2.6.2", - "@resvg/resvg-js-darwin-x64": "2.6.2", - "@resvg/resvg-js-linux-arm-gnueabihf": "2.6.2", - "@resvg/resvg-js-linux-arm64-gnu": "2.6.2", - "@resvg/resvg-js-linux-arm64-musl": "2.6.2", - "@resvg/resvg-js-linux-x64-gnu": "2.6.2", - "@resvg/resvg-js-linux-x64-musl": "2.6.2", - "@resvg/resvg-js-win32-arm64-msvc": "2.6.2", - "@resvg/resvg-js-win32-ia32-msvc": "2.6.2", - "@resvg/resvg-js-win32-x64-msvc": "2.6.2" + "node_modules/@types/d3-zoom": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/@types/d3-zoom/-/d3-zoom-3.0.8.tgz", + "integrity": "sha512-iqMC4/YlFCSlO8+2Ii1GGGliCAY4XdeG748w5vQUbevlbDu0zSjH/+jojorQVBK/se0j6DUFNPBGSqD3YWYnDw==", + "license": "MIT", + "dependencies": { + "@types/d3-interpolate": "*", + "@types/d3-selection": "*" } }, - "node_modules/@resvg/resvg-js-android-arm-eabi": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/@resvg/resvg-js-android-arm-eabi/-/resvg-js-android-arm-eabi-2.6.2.tgz", - "integrity": "sha512-FrJibrAk6v29eabIPgcTUMPXiEz8ssrAk7TXxsiZzww9UTQ1Z5KAbFJs+Z0Ez+VZTYgnE5IQJqBcoSiMebtPHA==", - "cpu": [ - "arm" - ], - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">= 10" + "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==", + "license": "MIT", + "dependencies": { + "@types/ms": "*" } }, - "node_modules/@resvg/resvg-js-android-arm64": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/@resvg/resvg-js-android-arm64/-/resvg-js-android-arm64-2.6.2.tgz", - "integrity": "sha512-VcOKezEhm2VqzXpcIJoITuvUS/fcjIw5NA/w3tjzWyzmvoCdd+QXIqy3FBGulWdClvp4g+IfUemigrkLThSjAQ==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">= 10" - } + "node_modules/@types/deep-eql": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@types/deep-eql/-/deep-eql-4.0.2.tgz", + "integrity": "sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==", + "license": "MIT" }, - "node_modules/@resvg/resvg-js-darwin-arm64": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/@resvg/resvg-js-darwin-arm64/-/resvg-js-darwin-arm64-2.6.2.tgz", - "integrity": "sha512-nmok2LnAd6nLUKI16aEB9ydMC6Lidiiq2m1nEBDR1LaaP7FGs4AJ90qDraxX+CWlVuRlvNjyYJTNv8qFjtL9+A==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 10" - } + "node_modules/@types/estree": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", + "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", + "license": "MIT" }, - "node_modules/@resvg/resvg-js-darwin-x64": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/@resvg/resvg-js-darwin-x64/-/resvg-js-darwin-x64-2.6.2.tgz", - "integrity": "sha512-GInyZLjgWDfsVT6+SHxQVRwNzV0AuA1uqGsOAW+0th56J7Nh6bHHKXHBWzUrihxMetcFDmQMAX1tZ1fZDYSRsw==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 10" + "node_modules/@types/estree-jsx": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@types/estree-jsx/-/estree-jsx-1.0.5.tgz", + "integrity": "sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg==", + "license": "MIT", + "dependencies": { + "@types/estree": "*" } }, - "node_modules/@resvg/resvg-js-linux-arm-gnueabihf": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/@resvg/resvg-js-linux-arm-gnueabihf/-/resvg-js-linux-arm-gnueabihf-2.6.2.tgz", - "integrity": "sha512-YIV3u/R9zJbpqTTNwTZM5/ocWetDKGsro0SWp70eGEM9eV2MerWyBRZnQIgzU3YBnSBQ1RcxRZvY/UxwESfZIw==", - "cpu": [ - "arm" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } + "node_modules/@types/geojson": { + "version": "7946.0.16", + "resolved": "https://registry.npmjs.org/@types/geojson/-/geojson-7946.0.16.tgz", + "integrity": "sha512-6C8nqWur3j98U6+lXDfTUWIfgvZU+EumvpHKcYjujKH7woYyLj2sUmff0tRhrqM7BohUw7Pz3ZB1jj2gW9Fvmg==", + "license": "MIT" }, - "node_modules/@resvg/resvg-js-linux-arm64-gnu": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/@resvg/resvg-js-linux-arm64-gnu/-/resvg-js-linux-arm64-gnu-2.6.2.tgz", - "integrity": "sha512-zc2BlJSim7YR4FZDQ8OUoJg5holYzdiYMeobb9pJuGDidGL9KZUv7SbiD4E8oZogtYY42UZEap7dqkkYuA91pg==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" + "node_modules/@types/hast": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.4.tgz", + "integrity": "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==", + "license": "MIT", + "dependencies": { + "@types/unist": "*" } }, - "node_modules/@resvg/resvg-js-linux-arm64-musl": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/@resvg/resvg-js-linux-arm64-musl/-/resvg-js-linux-arm64-musl-2.6.2.tgz", - "integrity": "sha512-3h3dLPWNgSsD4lQBJPb4f+kvdOSJHa5PjTYVsWHxLUzH4IFTJUAnmuWpw4KqyQ3NA5QCyhw4TWgxk3jRkQxEKg==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" + "node_modules/@types/mdast": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz", + "integrity": "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==", + "license": "MIT", + "dependencies": { + "@types/unist": "*" } }, - "node_modules/@resvg/resvg-js-linux-x64-gnu": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/@resvg/resvg-js-linux-x64-gnu/-/resvg-js-linux-x64-gnu-2.6.2.tgz", - "integrity": "sha512-IVUe+ckIerA7xMZ50duAZzwf1U7khQe2E0QpUxu5MBJNao5RqC0zwV/Zm965vw6D3gGFUl7j4m+oJjubBVoftw==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } + "node_modules/@types/mdx": { + "version": "2.0.13", + "resolved": "https://registry.npmjs.org/@types/mdx/-/mdx-2.0.13.tgz", + "integrity": "sha512-+OWZQfAYyio6YkJb3HLxDrvnx6SWWDbC0zVPfBRzUk0/nqoDyf6dNxQi3eArPe8rJ473nobTMQ/8Zk+LxJ+Yuw==", + "license": "MIT" }, - "node_modules/@resvg/resvg-js-linux-x64-musl": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/@resvg/resvg-js-linux-x64-musl/-/resvg-js-linux-x64-musl-2.6.2.tgz", - "integrity": "sha512-UOf83vqTzoYQO9SZ0fPl2ZIFtNIz/Rr/y+7X8XRX1ZnBYsQ/tTb+cj9TE+KHOdmlTFBxhYzVkP2lRByCzqi4jQ==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" + "node_modules/@types/ms": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@types/ms/-/ms-2.1.0.tgz", + "integrity": "sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==", + "license": "MIT" + }, + "node_modules/@types/mysql": { + "version": "2.15.27", + "resolved": "https://registry.npmjs.org/@types/mysql/-/mysql-2.15.27.tgz", + "integrity": "sha512-YfWiV16IY0OeBfBCk8+hXKmdTKrKlwKN1MNKAPBu5JYxLwBEZl7QzeEpGnlZb3VMGJrrGmB84gXiH+ofs/TezA==", + "license": "MIT", + "dependencies": { + "@types/node": "*" } }, - "node_modules/@resvg/resvg-js-win32-arm64-msvc": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/@resvg/resvg-js-win32-arm64-msvc/-/resvg-js-win32-arm64-msvc-2.6.2.tgz", - "integrity": "sha512-7C/RSgCa+7vqZ7qAbItfiaAWhyRSoD4l4BQAbVDqRRsRgY+S+hgS3in0Rxr7IorKUpGE69X48q6/nOAuTJQxeQ==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10" + "node_modules/@types/node": { + "version": "25.1.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-25.1.0.tgz", + "integrity": "sha512-t7frlewr6+cbx+9Ohpl0NOTKXZNV9xHRmNOvql47BFJKcEG1CxtxlPEEe+gR9uhVWM4DwhnvTF110mIL4yP9RA==", + "license": "MIT", + "dependencies": { + "undici-types": "~7.16.0" } }, - "node_modules/@resvg/resvg-js-win32-ia32-msvc": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/@resvg/resvg-js-win32-ia32-msvc/-/resvg-js-win32-ia32-msvc-2.6.2.tgz", - "integrity": "sha512-har4aPAlvjnLcil40AC77YDIk6loMawuJwFINEM7n0pZviwMkMvjb2W5ZirsNOZY4aDbo5tLx0wNMREp5Brk+w==", - "cpu": [ - "ia32" - ], - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10" + "node_modules/@types/pg": { + "version": "8.15.6", + "resolved": "https://registry.npmjs.org/@types/pg/-/pg-8.15.6.tgz", + "integrity": "sha512-NoaMtzhxOrubeL/7UZuNTrejB4MPAJ0RpxZqXQf2qXuVlTPuG6Y8p4u9dKRaue4yjmC7ZhzVO2/Yyyn25znrPQ==", + "license": "MIT", + "dependencies": { + "@types/node": "*", + "pg-protocol": "*", + "pg-types": "^2.2.0" } }, - "node_modules/@resvg/resvg-js-win32-x64-msvc": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/@resvg/resvg-js-win32-x64-msvc/-/resvg-js-win32-x64-msvc-2.6.2.tgz", - "integrity": "sha512-ZXtYhtUr5SSaBrUDq7DiyjOFJqBVL/dOBN7N/qmi/pO0IgiWW/f/ue3nbvu9joWE5aAKDoIzy/CxsY0suwGosQ==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10" + "node_modules/@types/pg-pool": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/@types/pg-pool/-/pg-pool-2.0.7.tgz", + "integrity": "sha512-U4CwmGVQcbEuqpyju8/ptOKg6gEC+Tqsvj2xS9o1g71bUh8twxnC6ZL5rZKCsGN0iyH0CwgUyc9VR5owNQF9Ng==", + "license": "MIT", + "dependencies": { + "@types/pg": "*" } }, - "node_modules/@sec-ant/readable-stream": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/@sec-ant/readable-stream/-/readable-stream-0.4.1.tgz", - "integrity": "sha512-831qok9r2t8AlxLko40y2ebgSDhenenCatLVeW/uBtnHPyhHOvG0C7TvfgecV+wHzIm5KUICgzmVpWS+IMEAeg==" + "node_modules/@types/resolve": { + "version": "1.20.6", + "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-1.20.6.tgz", + "integrity": "sha512-A4STmOXPhMUtHH+S6ymgE2GiBSMqf4oTvcQZMcHzokuTLVYzXTB8ttjcgxOVaAp2lGwEdzZ0J+cRbbeevQj1UQ==", + "license": "MIT" }, - "node_modules/@shikijs/core": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@shikijs/core/-/core-1.14.1.tgz", - "integrity": "sha512-KyHIIpKNaT20FtFPFjCQB5WVSTpLR/n+jQXhWHWVUMm9MaOaG9BGOG0MSyt7yA4+Lm+4c9rTc03tt3nYzeYSfw==", + "node_modules/@types/statuses": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@types/statuses/-/statuses-2.0.6.tgz", + "integrity": "sha512-xMAgYwceFhRA2zY+XbEA7mxYbA093wdiW8Vu6gZPGWy9cmOyU9XesH1tNcEWsKFd5Vzrqx5T3D38PWx1FIIXkA==", + "license": "MIT" + }, + "node_modules/@types/tedious": { + "version": "4.0.14", + "resolved": "https://registry.npmjs.org/@types/tedious/-/tedious-4.0.14.tgz", + "integrity": "sha512-KHPsfX/FoVbUGbyYvk1q9MMQHLPeRZhRJZdO45Q4YjvFkv4hMNghCWTvy7rdKessBsmtz4euWCWAB6/tVpI1Iw==", + "license": "MIT", "dependencies": { - "@types/hast": "^3.0.4" + "@types/node": "*" } }, - "node_modules/@shuding/opentype.js": { - "version": "1.4.0-beta.0", - "resolved": "https://registry.npmjs.org/@shuding/opentype.js/-/opentype.js-1.4.0-beta.0.tgz", - "integrity": "sha512-3NgmNyH3l/Hv6EvsWJbsvpcpUba6R8IREQ83nH83cyakCw7uM1arZKNfHwv1Wz6jgqrF/j4x5ELvR6PnK9nTcA==", + "node_modules/@types/trusted-types": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.7.tgz", + "integrity": "sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==", + "license": "MIT", + "optional": true + }, + "node_modules/@types/unist": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz", + "integrity": "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==", + "license": "MIT" + }, + "node_modules/@ungap/structured-clone": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.0.tgz", + "integrity": "sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==", + "license": "ISC" + }, + "node_modules/@vitest/expect": { + "version": "4.0.18", + "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-4.0.18.tgz", + "integrity": "sha512-8sCWUyckXXYvx4opfzVY03EOiYVxyNrHS5QxX3DAIi5dpJAAkyJezHCP77VMX4HKA2LDT/Jpfo8i2r5BE3GnQQ==", + "license": "MIT", "dependencies": { - "fflate": "^0.7.3", - "string.prototype.codepointat": "^0.2.1" - }, - "bin": { - "ot": "bin/ot" + "@standard-schema/spec": "^1.0.0", + "@types/chai": "^5.2.2", + "@vitest/spy": "4.0.18", + "@vitest/utils": "4.0.18", + "chai": "^6.2.1", + "tinyrainbow": "^3.0.3" }, - "engines": { - "node": ">= 8.0.0" + "funding": { + "url": "https://opencollective.com/vitest" } }, - "node_modules/@sindresorhus/is": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz", - "integrity": "sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==", - "engines": { - "node": ">=10" + "node_modules/@vitest/pretty-format": { + "version": "4.0.18", + "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-4.0.18.tgz", + "integrity": "sha512-P24GK3GulZWC5tz87ux0m8OADrQIUVDPIjjj65vBXYG17ZeU3qD7r+MNZ1RNv4l8CGU2vtTRqixrOi9fYk/yKw==", + "license": "MIT", + "dependencies": { + "tinyrainbow": "^3.0.3" }, "funding": { - "url": "https://github.com/sindresorhus/is?sponsor=1" + "url": "https://opencollective.com/vitest" } }, - "node_modules/@sindresorhus/merge-streams": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/merge-streams/-/merge-streams-4.0.0.tgz", - "integrity": "sha512-tlqY9xq5ukxTUZBmoOp+m61cqwQD5pHJtFY3Mn8CA8ps6yghLH/Hw8UPdqg4OLmFW3IFlcXnQNmo/dh8HzXYIQ==", - "engines": { - "node": ">=18" - }, + "node_modules/@vitest/spy": { + "version": "4.0.18", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-4.0.18.tgz", + "integrity": "sha512-cbQt3PTSD7P2OARdVW3qWER5EGq7PHlvE+QfzSC0lbwO+xnt7+XH06ZzFjFRgzUX//JmpxrCu92VdwvEPlWSNw==", + "license": "MIT", "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://opencollective.com/vitest" } }, - "node_modules/@sindresorhus/slugify": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/@sindresorhus/slugify/-/slugify-2.2.1.tgz", - "integrity": "sha512-MkngSCRZ8JdSOCHRaYd+D01XhvU3Hjy6MGl06zhOk614hp9EOAp5gIkBeQg7wtmxpitU6eAL4kdiRMcJa2dlrw==", + "node_modules/@vitest/utils": { + "version": "4.0.18", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-4.0.18.tgz", + "integrity": "sha512-msMRKLMVLWygpK3u2Hybgi4MNjcYJvwTb0Ru09+fOyCXIgT5raYP041DRRdiJiI3k/2U6SEbAETB3YtBrUkCFA==", + "license": "MIT", "dependencies": { - "@sindresorhus/transliterate": "^1.0.0", - "escape-string-regexp": "^5.0.0" - }, - "engines": { - "node": ">=12" + "@vitest/pretty-format": "4.0.18", + "tinyrainbow": "^3.0.3" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://opencollective.com/vitest" } }, - "node_modules/@sindresorhus/transliterate": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/transliterate/-/transliterate-1.6.0.tgz", - "integrity": "sha512-doH1gimEu3A46VX6aVxpHTeHrytJAG6HgdxntYnCFiIFHEM/ZGpG8KiZGBChchjQmG0XFIBL552kBTjVcMZXwQ==", + "node_modules/accepts": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-2.0.0.tgz", + "integrity": "sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==", + "license": "MIT", "dependencies": { - "escape-string-regexp": "^5.0.0" + "mime-types": "^3.0.0", + "negotiator": "^1.0.0" }, "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">= 0.6" } }, - "node_modules/@testing-library/dom": { - "version": "10.4.0", - "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-10.4.0.tgz", - "integrity": "sha512-pemlzrSESWbdAloYml3bAJMEfNh1Z7EduzqPKprCH5S341frlpYnUEW0H72dLxa6IsYr+mPno20GiSm+h9dEdQ==", - "dependencies": { - "@babel/code-frame": "^7.10.4", - "@babel/runtime": "^7.12.5", - "@types/aria-query": "^5.0.1", - "aria-query": "5.3.0", - "chalk": "^4.1.0", - "dom-accessibility-api": "^0.5.9", - "lz-string": "^1.5.0", - "pretty-format": "^27.0.2" + "node_modules/accepts/node_modules/negotiator": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-1.0.0.tgz", + "integrity": "sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/acorn": { + "version": "8.15.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", + "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", + "license": "MIT", + "bin": { + "acorn": "bin/acorn" }, "engines": { - "node": ">=18" + "node": ">=0.4.0" } }, - "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==", + "node_modules/acorn-import-attributes": { + "version": "1.9.5", + "resolved": "https://registry.npmjs.org/acorn-import-attributes/-/acorn-import-attributes-1.9.5.tgz", + "integrity": "sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ==", + "license": "MIT", + "peerDependencies": { + "acorn": "^8" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "license": "MIT", + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/address": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/address/-/address-2.0.3.tgz", + "integrity": "sha512-XNAb/a6TCqou+TufU8/u11HCu9x1gYvOoxLwtlXgIqmkrYQADVv6ljyW2zwiPhHz9R1gItAWpuDrdJMmrOBFEA==", + "license": "MIT", + "engines": { + "node": ">= 16.0.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==", + "license": "MIT", "dependencies": { - "color-convert": "^2.0.1" + "debug": "4" }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/ansi-colors": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", + "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "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==", + "license": "MIT", "engines": { "node": ">=8" + } + }, + "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==", + "license": "MIT", + "engines": { + "node": ">=10" }, "funding": { "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "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==", + "node_modules/ansi-to-html": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/ansi-to-html/-/ansi-to-html-0.7.2.tgz", + "integrity": "sha512-v6MqmEpNlxF+POuyhKkidusCHWWkaLcGRURzivcU3I9tv7k4JVhFcnukrM5Rlk2rUywdZuzYAZ+kbZqWCnfN3g==", + "license": "MIT", "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" + "entities": "^2.2.0" + }, + "bin": { + "ansi-to-html": "bin/ansi-to-html" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "node": ">=8.0.0" } }, - "node_modules/@testing-library/dom/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==", + "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==", + "license": "ISC", "dependencies": { - "color-name": "~1.1.4" + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" }, "engines": { - "node": ">=7.0.0" + "node": ">= 8" } }, - "node_modules/@testing-library/dom/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/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "license": "MIT", + "dependencies": { + "sprintf-js": "~1.0.2" } }, - "node_modules/@testing-library/dom/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==", + "node_modules/aria-hidden": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/aria-hidden/-/aria-hidden-1.2.6.tgz", + "integrity": "sha512-ik3ZgC9dY/lYVVM++OISsaYDeg1tb0VtP5uL3ouh1koGOaUMDPpbFIei4JkFimWUFPn90sbMNMXQAIVOlnYKJA==", + "license": "MIT", "dependencies": { - "has-flag": "^4.0.0" + "tslib": "^2.0.0" }, "engines": { - "node": ">=8" + "node": ">=10" } }, - "node_modules/@testing-library/jest-dom": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@testing-library/jest-dom/-/jest-dom-6.5.0.tgz", - "integrity": "sha512-xGGHpBXYSHUUr6XsKBfs85TWlYKpTc37cSBBVrXcib2MkHLboWlkClhWF37JKlDb9KEq3dHs+f2xR7XJEWGBxA==", + "node_modules/aria-query": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.0.tgz", + "integrity": "sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==", + "license": "Apache-2.0", "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" - }, + "dequal": "^2.0.3" + } + }, + "node_modules/assertion-error": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-2.0.1.tgz", + "integrity": "sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==", + "license": "MIT", "engines": { - "node": ">=14", - "npm": ">=6", - "yarn": ">=1" + "node": ">=12" } }, - "node_modules/@testing-library/jest-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==", + "node_modules/astring": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/astring/-/astring-1.9.0.tgz", + "integrity": "sha512-LElXdjswlqjWrPpJFg1Fx4wpkOCxj1TDHlSV4PlaRxHGWko024xICaa97ZkMfs6DRKlCguiAI+rbXv5GWwXIkg==", + "license": "MIT", + "bin": { + "astring": "bin/astring" + } + }, + "node_modules/babel-dead-code-elimination": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/babel-dead-code-elimination/-/babel-dead-code-elimination-1.0.10.tgz", + "integrity": "sha512-DV5bdJZTzZ0zn0DC24v3jD7Mnidh6xhKa4GfKCbq3sfW8kaWhDdZjP3i81geA8T33tdYqWKw4D3fVv0CwEgKVA==", + "license": "MIT", "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, + "@babel/core": "^7.23.7", + "@babel/parser": "^7.23.6", + "@babel/traverse": "^7.23.7", + "@babel/types": "^7.23.6" + } + }, + "node_modules/bail": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/bail/-/bail-2.0.2.tgz", + "integrity": "sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==", + "license": "MIT", "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "type": "github", + "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/@testing-library/jest-dom/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" - }, + "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==", + "license": "MIT" + }, + "node_modules/base64-js": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-0.0.8.tgz", + "integrity": "sha512-3XSA2cR/h/73EzlXXdU6YNycmYI7+kicTxks4eJg2g39biHR84slg2+des+p7iHYhbRg/udIS4TD53WabcOUkw==", + "license": "MIT", "engines": { - "node": ">=8" + "node": ">= 0.4" + } + }, + "node_modules/baseline-browser-mapping": { + "version": "2.9.6", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.9.6.tgz", + "integrity": "sha512-v9BVVpOTLB59C9E7aSnmIF8h7qRsFpx+A2nugVMTszEOMcfjlZMsXRm4LF23I3Z9AJxc8ANpIvzbzONoX9VJlg==", + "license": "Apache-2.0", + "bin": { + "baseline-browser-mapping": "dist/cli.js" } }, - "node_modules/@testing-library/jest-dom/node_modules/color-convert": { + "node_modules/basic-auth": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "resolved": "https://registry.npmjs.org/basic-auth/-/basic-auth-2.0.1.tgz", + "integrity": "sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg==", + "license": "MIT", "dependencies": { - "color-name": "~1.1.4" + "safe-buffer": "5.1.2" }, "engines": { - "node": ">=7.0.0" + "node": ">= 0.8" } }, - "node_modules/@testing-library/jest-dom/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/basic-auth/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "license": "MIT" }, - "node_modules/@testing-library/jest-dom/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==", + "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==", + "license": "MIT", "engines": { "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@testing-library/jest-dom/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==", + "node_modules/blueimp-md5": { + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/blueimp-md5/-/blueimp-md5-2.19.0.tgz", + "integrity": "sha512-DRQrD6gJyy8FbiE4s+bDoXS9hiW3Vbx5uCdwvcCf3zLHL+Iv7LtGHLpr+GZV8rHG8tK766FGYBwRbu8pELTt+w==", + "license": "MIT" + }, + "node_modules/body-parser": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-2.2.1.tgz", + "integrity": "sha512-nfDwkulwiZYQIGwxdy0RUmowMhKcFVcYXUU7m4QlKYim1rUtg83xm2yjZ40QjDuc291AJjjeSc9b++AWHSgSHw==", + "license": "MIT", "dependencies": { - "has-flag": "^4.0.0" + "bytes": "^3.1.2", + "content-type": "^1.0.5", + "debug": "^4.4.3", + "http-errors": "^2.0.0", + "iconv-lite": "^0.7.0", + "on-finished": "^2.4.1", + "qs": "^6.14.0", + "raw-body": "^3.0.1", + "type-is": "^2.0.1" }, "engines": { - "node": ">=8" + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" } }, - "node_modules/@total-typescript/ts-reset": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/@total-typescript/ts-reset/-/ts-reset-0.5.1.tgz", - "integrity": "sha512-AqlrT8YA1o7Ff5wPfMOL0pvL+1X+sw60NN6CcOCqs658emD6RfiXhF7Gu9QcfKBH7ELY2nInLhKSCWVoNL70MQ==" - }, - "node_modules/@types/acorn": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/@types/acorn/-/acorn-4.0.6.tgz", - "integrity": "sha512-veQTnWP+1D/xbxVrPC3zHnCZRjSrKfhbMUlEA43iMZLu7EsnTtkJklIuwrCPbOi8YkvDQAiW05VQQFvvz9oieQ==", + "node_modules/brace-expansion": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", + "license": "MIT", "dependencies": { - "@types/estree": "*" + "balanced-match": "^1.0.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/chai": { - "version": "4.3.18", - "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.3.18.tgz", - "integrity": "sha512-2UfJzigyNa8kYTKn7o4hNMPphkxtu4WTJyobK3m4FBpyj7EK5xgtPcOtxLm7Dznk/Qxr0QXn+gQbkg7mCZKdfg==" - }, - "node_modules/@types/chai-dom": { - "version": "1.11.3", - "resolved": "https://registry.npmjs.org/@types/chai-dom/-/chai-dom-1.11.3.tgz", - "integrity": "sha512-EUEZI7uID4ewzxnU7DJXtyvykhQuwe+etJ1wwOiJyQRTH/ifMWKX+ghiXkxCUvNJ6IQDodf0JXhuP6zZcy2qXQ==", + "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==", + "license": "MIT", "dependencies": { - "@types/chai": "*" + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" } }, - "node_modules/@types/cookie": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.6.0.tgz", - "integrity": "sha512-4Kh9a6B2bQciAhf7FSuMRRkUWecJgJu9nPnx3yzpsfXX/c50REIqpHY4C82bXP90qrLtXtkDxTZosYO3UpOwlA==" - }, - "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==", + "node_modules/browserslist": { + "version": "4.28.1", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.1.tgz", + "integrity": "sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA==", + "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" + } + ], + "license": "MIT", "dependencies": { - "@types/ms": "*" + "baseline-browser-mapping": "^2.9.0", + "caniuse-lite": "^1.0.30001759", + "electron-to-chromium": "^1.5.263", + "node-releases": "^2.0.27", + "update-browserslist-db": "^1.2.0" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" } }, - "node_modules/@types/estree": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", - "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==" + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "license": "MIT" }, - "node_modules/@types/estree-jsx": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@types/estree-jsx/-/estree-jsx-1.0.5.tgz", - "integrity": "sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg==", + "node_modules/bundle-name": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bundle-name/-/bundle-name-4.1.0.tgz", + "integrity": "sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q==", + "license": "MIT", "dependencies": { - "@types/estree": "*" + "run-applescript": "^7.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@types/hast": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.4.tgz", - "integrity": "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==", + "node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "license": "MIT", "dependencies": { - "@types/unist": "*" + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" } }, - "node_modules/@types/mdast": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz", - "integrity": "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==", + "node_modules/call-bound": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", + "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", + "license": "MIT", "dependencies": { - "@types/unist": "*" + "call-bind-apply-helpers": "^1.0.2", + "get-intrinsic": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/@types/mdx": { - "version": "2.0.13", - "resolved": "https://registry.npmjs.org/@types/mdx/-/mdx-2.0.13.tgz", - "integrity": "sha512-+OWZQfAYyio6YkJb3HLxDrvnx6SWWDbC0zVPfBRzUk0/nqoDyf6dNxQi3eArPe8rJ473nobTMQ/8Zk+LxJ+Yuw==" + "node_modules/camelize": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/camelize/-/camelize-1.0.1.tgz", + "integrity": "sha512-dU+Tx2fsypxTgtLoE36npi3UqcjSSMNYfkqgmoEhtZrraP5VWq0K7FkWVTYa8eMPtnU/G2txVsfdCJTn9uzpuQ==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, - "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/caniuse-lite": { + "version": "1.0.30001760", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001760.tgz", + "integrity": "sha512-7AAMPcueWELt1p3mi13HR/LHH0TJLT11cnwDJEs3xA4+CK/PLKeO9Kl1oru24htkyUKtkGCvAx4ohB0Ttry8Dw==", + "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" + } + ], + "license": "CC-BY-4.0" }, - "node_modules/@types/mute-stream": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/@types/mute-stream/-/mute-stream-0.0.4.tgz", - "integrity": "sha512-CPM9nzrCPPJHQNA9keH9CVkVI+WR5kMa+7XEs5jcGQ0VoAGnLv242w8lIVgwAEfmE4oufJRaTc9PNLQl0ioAow==", + "node_modules/castable-video": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/castable-video/-/castable-video-1.1.11.tgz", + "integrity": "sha512-LCRTK6oe7SB1SiUQFzZCo6D6gcEzijqBTVIuj3smKpQdesXM18QTbCVqWgh9MfOeQgTx/i9ji5jGcdqNPeWg2g==", + "license": "MIT", "dependencies": { - "@types/node": "*" + "custom-media-element": "~1.4.5" } }, - "node_modules/@types/node": { - "version": "20.14.10", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.14.10.tgz", - "integrity": "sha512-MdiXf+nDuMvY0gJKxyfZ7/6UFsETO7mGKF54MVD/ekJS6HdFtpZFBgrh6Pseu64XTb2MLyFPlbW6hj8HYRQNOQ==", - "dependencies": { - "undici-types": "~5.26.4" + "node_modules/ccount": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/ccount/-/ccount-2.0.1.tgz", + "integrity": "sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/@types/resolve": { - "version": "1.20.6", - "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-1.20.6.tgz", - "integrity": "sha512-A4STmOXPhMUtHH+S6ymgE2GiBSMqf4oTvcQZMcHzokuTLVYzXTB8ttjcgxOVaAp2lGwEdzZ0J+cRbbeevQj1UQ==" + "node_modules/ce-la-react": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/ce-la-react/-/ce-la-react-0.3.2.tgz", + "integrity": "sha512-QJ6k4lOD/btI08xG8jBPxRCGXvCnusGGkTsiXk0u3NqUu/W+BXRnFD4PYjwtqh8AWmGa5LDbGk0fLQsqr0nSMA==", + "license": "BSD-3-Clause", + "peerDependencies": { + "react": ">=17.0.0" + } }, - "node_modules/@types/statuses": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@types/statuses/-/statuses-2.0.5.tgz", - "integrity": "sha512-jmIUGWrAiwu3dZpxntxieC+1n/5c3mjrImkmOSQ2NC5uP6cYO4aAZDdSmRcI5C1oiTmqlZGHC+/NmJrKogbP5A==" + "node_modules/chai": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/chai/-/chai-6.2.2.tgz", + "integrity": "sha512-NUPRluOfOiTKBKvWPtSD4PhFvWCqOi0BGStNWs57X9js7XGTprSmFoz5F0tWhR4WPjNeR9jXqdC7/UpSJTnlRg==", + "license": "MIT", + "engines": { + "node": ">=18" + } }, - "node_modules/@types/unist": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz", - "integrity": "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==" + "node_modules/chai-dom": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/chai-dom/-/chai-dom-1.12.1.tgz", + "integrity": "sha512-tvz+D0PJue2VHXRec3udgP/OeeXBiePU3VH6JhEnHQJYzvNzR2nUvEykA9dXVS76JvaUENSOYH8Ufr0kZSnlCQ==", + "license": "MIT", + "engines": { + "node": ">= 0.12.0" + }, + "peerDependencies": { + "chai": ">= 3" + } }, - "node_modules/@types/wrap-ansi": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@types/wrap-ansi/-/wrap-ansi-3.0.0.tgz", - "integrity": "sha512-ltIpx+kM7g/MLRZfkbL7EsCEjfzCcScLpkg37eXEtx5kmrAKBkTJwd1GIAjDSL8wTpM6Hzn5YO4pSb91BEwu1g==" + "node_modules/chalk": { + "version": "5.6.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.6.2.tgz", + "integrity": "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==", + "license": "MIT", + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } }, - "node_modules/@ungap/structured-clone": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", - "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==" + "node_modules/char-regex": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", + "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", + "license": "MIT", + "engines": { + "node": ">=10" + } }, - "node_modules/@vitest/expect": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-2.0.5.tgz", - "integrity": "sha512-yHZtwuP7JZivj65Gxoi8upUN2OzHTi3zVfjwdpu2WrvCZPLwsJ2Ey5ILIPccoW23dd/zQBlJ4/dhi7DWNyXCpA==", - "dependencies": { - "@vitest/spy": "2.0.5", - "@vitest/utils": "2.0.5", - "chai": "^5.1.1", - "tinyrainbow": "^1.2.0" - }, + "node_modules/character-entities": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-2.0.2.tgz", + "integrity": "sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==", + "license": "MIT", "funding": { - "url": "https://opencollective.com/vitest" + "type": "github", + "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/@vitest/pretty-format": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-2.0.5.tgz", - "integrity": "sha512-h8k+1oWHfwTkyTkb9egzwNMfJAEx4veaPSnMeKbVSjp4euqGSbQlm5+6VHwTr7u4FJslVVsUG5nopCaAYdOmSQ==", - "dependencies": { - "tinyrainbow": "^1.2.0" - }, + "node_modules/character-entities-html4": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/character-entities-html4/-/character-entities-html4-2.1.0.tgz", + "integrity": "sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==", + "license": "MIT", "funding": { - "url": "https://opencollective.com/vitest" + "type": "github", + "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/@vitest/spy": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-2.0.5.tgz", - "integrity": "sha512-c/jdthAhvJdpfVuaexSrnawxZz6pywlTPe84LUB2m/4t3rl2fTo9NFGBG4oWgaD+FTgDDV8hJ/nibT7IfH3JfA==", - "dependencies": { - "tinyspy": "^3.0.0" - }, + "node_modules/character-entities-legacy": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-3.0.0.tgz", + "integrity": "sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==", + "license": "MIT", "funding": { - "url": "https://opencollective.com/vitest" + "type": "github", + "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/@vitest/utils": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-2.0.5.tgz", - "integrity": "sha512-d8HKbqIcya+GR67mkZbrzhS5kKhtp8dQLcmRZLGTscGVg7yImT82cIrhtn2L8+VujWcy6KZweApgNmPsTAO/UQ==", - "dependencies": { - "@vitest/pretty-format": "2.0.5", - "estree-walker": "^3.0.3", - "loupe": "^3.1.1", - "tinyrainbow": "^1.2.0" - }, + "node_modules/character-reference-invalid": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-2.0.1.tgz", + "integrity": "sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==", + "license": "MIT", "funding": { - "url": "https://opencollective.com/vitest" + "type": "github", + "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/@web3-storage/multipart-parser": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@web3-storage/multipart-parser/-/multipart-parser-1.0.0.tgz", - "integrity": "sha512-BEO6al7BYqcnfX15W2cnGR+Q566ACXAT9UQykORCWW80lmkpWsnEob6zJS1ZVBKsSJC8+7vJkHwlp+lXG1UCdw==" + "node_modules/chardet": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-2.1.1.tgz", + "integrity": "sha512-PsezH1rqdV9VvyNhxxOW32/d75r01NY7TQCmOqomRo15ZSOKbpTFVsfjghxo6JloQUCGnH4k1LGu0R4yCLlWQQ==", + "license": "MIT" }, - "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/chevrotain": { + "version": "11.0.3", + "resolved": "https://registry.npmjs.org/chevrotain/-/chevrotain-11.0.3.tgz", + "integrity": "sha512-ci2iJH6LeIkvP9eJW6gpueU8cnZhv85ELY8w8WiFtNjMHA5ad6pQLaJo9mEly/9qUyCpvqX8/POVUTf18/HFdw==", + "license": "Apache-2.0", + "dependencies": { + "@chevrotain/cst-dts-gen": "11.0.3", + "@chevrotain/gast": "11.0.3", + "@chevrotain/regexp-to-ast": "11.0.3", + "@chevrotain/types": "11.0.3", + "@chevrotain/utils": "11.0.3", + "lodash-es": "4.17.21" + } }, - "node_modules/abort-controller": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", - "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", + "node_modules/chevrotain-allstar": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/chevrotain-allstar/-/chevrotain-allstar-0.3.1.tgz", + "integrity": "sha512-b7g+y9A0v4mxCW1qUhf3BSVPg+/NvGErk/dOkrDaHA0nQIQGAtrOjlX//9OQtRlSCy+x9rfB5N8yC71lH1nvMw==", + "license": "MIT", "dependencies": { - "event-target-shim": "^5.0.0" + "lodash-es": "^4.17.21" }, - "engines": { - "node": ">=6.5" + "peerDependencies": { + "chevrotain": "^11.0.0" } }, - "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==", + "node_modules/chokidar": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "license": "MIT", "dependencies": { - "mime-types": "~2.1.34", - "negotiator": "0.6.3" + "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": ">= 0.6" + "node": ">= 8.10.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" } }, - "node_modules/acorn": { - "version": "8.12.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.12.1.tgz", - "integrity": "sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==", - "bin": { - "acorn": "bin/acorn" + "node_modules/cjs-module-lexer": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-2.2.0.tgz", + "integrity": "sha512-4bHTS2YuzUvtoLjdy+98ykbNB5jS0+07EvFNXerqZQJ89F7DI6ET7OQo/HJuW6K0aVsKA9hj9/RVb2kQVOrPDQ==", + "license": "MIT" + }, + "node_modules/cli-cursor": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-5.0.0.tgz", + "integrity": "sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==", + "license": "MIT", + "dependencies": { + "restore-cursor": "^5.0.0" }, "engines": { - "node": ">=0.4.0" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/acorn-jsx": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", - "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", - "peerDependencies": { - "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + "node_modules/cli-spinners": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-3.4.0.tgz", + "integrity": "sha512-bXfOC4QcT1tKXGorxL3wbJm6XJPDqEnij2gQ2m7ESQuE+/z9YFIWnl/5RpTiKWbMq3EVKR4fRLJGn6DVfu0mpw==", + "license": "MIT", + "engines": { + "node": ">=18.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/address": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/address/-/address-2.0.3.tgz", - "integrity": "sha512-XNAb/a6TCqou+TufU8/u11HCu9x1gYvOoxLwtlXgIqmkrYQADVv6ljyW2zwiPhHz9R1gItAWpuDrdJMmrOBFEA==", + "node_modules/cli-width": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-4.1.0.tgz", + "integrity": "sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==", + "license": "ISC", "engines": { - "node": ">= 16.0.0" + "node": ">= 12" } }, - "node_modules/aggregate-error": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-5.0.0.tgz", - "integrity": "sha512-gOsf2YwSlleG6IjRYG2A7k0HmBMEo6qVNk9Bp/EaLgAJT5ngH6PXbqa4ItvnEwCm/velL5jAnQgsHsWnjhGmvw==", + "node_modules/cliui": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-9.0.1.tgz", + "integrity": "sha512-k7ndgKhwoQveBL+/1tqGJYNz097I7WOvwbmmU2AR5+magtbjPWQTS1C5vzGkBC8Ym8UWRzfKUzUUqFLypY4Q+w==", + "license": "ISC", "dependencies": { - "clean-stack": "^5.2.0", - "indent-string": "^5.0.0" + "string-width": "^7.2.0", + "strip-ansi": "^7.1.0", + "wrap-ansi": "^9.0.0" }, "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=20" } }, - "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==", + "node_modules/cliui/node_modules/emoji-regex": { + "version": "10.6.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.6.0.tgz", + "integrity": "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==", + "license": "MIT" + }, + "node_modules/cliui/node_modules/string-width": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", + "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", + "license": "MIT", "dependencies": { - "type-fest": "^0.21.3" + "emoji-regex": "^10.3.0", + "get-east-asian-width": "^1.0.0", + "strip-ansi": "^7.1.0" }, "engines": { - "node": ">=8" + "node": ">=18" }, "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==", + "node_modules/close-with-grace": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/close-with-grace/-/close-with-grace-2.4.0.tgz", + "integrity": "sha512-bzAYS0Kax7I0ejiCFHVshsT9giz6MrOpkdpP1CEGpkDRG3mXVgHZ9QdzVGHRZR0jrAq6JyN1mB4Ty3ILnmzLdg==", + "license": "MIT" + }, + "node_modules/clsx": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", + "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", + "license": "MIT", "engines": { - "node": ">=10" + "node": ">=6" + } + }, + "node_modules/collapse-white-space": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/collapse-white-space/-/collapse-white-space-2.1.0.tgz", + "integrity": "sha512-loKTxY1zCOuG4j9f6EPnuyyYkf58RnhhWTvRoZEokgB+WbdXehfjFviyOVYkqzEWz1Q5kRiZdBYS5SwxbQYwzw==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "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==", + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "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": ">=7.0.0" } }, - "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" - }, + "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==", + "license": "MIT" + }, + "node_modules/comma-separated-tokens": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz", + "integrity": "sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==", + "license": "MIT", "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "type": "github", + "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/ansi-to-html": { - "version": "0.7.2", - "resolved": "https://registry.npmjs.org/ansi-to-html/-/ansi-to-html-0.7.2.tgz", - "integrity": "sha512-v6MqmEpNlxF+POuyhKkidusCHWWkaLcGRURzivcU3I9tv7k4JVhFcnukrM5Rlk2rUywdZuzYAZ+kbZqWCnfN3g==", - "dependencies": { - "entities": "^2.2.0" - }, - "bin": { - "ansi-to-html": "bin/ansi-to-html" - }, + "node_modules/commander": { + "version": "12.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-12.1.0.tgz", + "integrity": "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==", + "license": "MIT", "engines": { - "node": ">=8.0.0" + "node": ">=18" } }, - "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==", + "node_modules/compressible": { + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", + "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", + "license": "MIT", "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" + "mime-db": ">= 1.43.0 < 2" }, "engines": { - "node": ">= 8" - } - }, - "node_modules/argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dependencies": { - "sprintf-js": "~1.0.2" + "node": ">= 0.6" } }, - "node_modules/aria-hidden": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/aria-hidden/-/aria-hidden-1.2.4.tgz", - "integrity": "sha512-y+CcFFwelSXpLZk/7fMB2mUbGtX9lKycf1MWJ7CaTIERyitVlyQx6C+sxcROU2BAJ24OiZyK+8wj2i8AlBoS3A==", + "node_modules/compression": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/compression/-/compression-1.8.1.tgz", + "integrity": "sha512-9mAqGPHLakhCLeNyxPkK4xVo746zQ/czLH1Ky+vkitMnWfWZps8r0qXuwhwizagCRttsL4lfG4pIOvaWLpAP0w==", + "license": "MIT", "dependencies": { - "tslib": "^2.0.0" + "bytes": "3.1.2", + "compressible": "~2.0.18", + "debug": "2.6.9", + "negotiator": "~0.6.4", + "on-headers": "~1.1.0", + "safe-buffer": "5.2.1", + "vary": "~1.1.2" }, "engines": { - "node": ">=10" + "node": ">= 0.8.0" } }, - "node_modules/aria-query": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.0.tgz", - "integrity": "sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==", + "node_modules/compression/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", "dependencies": { - "dequal": "^2.0.3" + "ms": "2.0.0" } }, - "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": "2.0.1", - "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-2.0.1.tgz", - "integrity": "sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==", - "engines": { - "node": ">=12" - } + "node_modules/compression/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" }, - "node_modules/astring": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/astring/-/astring-1.9.0.tgz", - "integrity": "sha512-LElXdjswlqjWrPpJFg1Fx4wpkOCxj1TDHlSV4PlaRxHGWko024xICaa97ZkMfs6DRKlCguiAI+rbXv5GWwXIkg==", - "bin": { - "astring": "bin/astring" - } + "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==", + "license": "MIT" }, - "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==", + "node_modules/confetti-react": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/confetti-react/-/confetti-react-2.6.0.tgz", + "integrity": "sha512-1eBh8WZxLuXk4s7DlFcctNJETb6AbDxArJrotOoSdk8zFBmOw5Ey1O6ZM5wCOmBa+cG1Kd2YCC85u8oitocpbg==", + "license": "MIT", "dependencies": { - "possible-typed-array-names": "^1.0.0" + "tween-functions": "^1.2.0" }, + "peerDependencies": { + "react": "^16.3.0 || ^17.0.0 || ^18.3.1" + } + }, + "node_modules/content-disposition": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-1.0.1.tgz", + "integrity": "sha512-oIXISMynqSqm241k6kcQ5UwttDILMK4BiurCfGEREw6+X9jkkpEe5T9FZaApyLGGOnFuyMWZpdolTXMtvEJ08Q==", + "license": "MIT", "engines": { - "node": ">= 0.4" + "node": ">=18" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "type": "opencollective", + "url": "https://opencollective.com/express" } }, - "node_modules/babel-dead-code-elimination": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/babel-dead-code-elimination/-/babel-dead-code-elimination-1.0.6.tgz", - "integrity": "sha512-JxFi9qyRJpN0LjEbbjbN8g0ux71Qppn9R8Qe3k6QzHg2CaKsbUQtbn307LQGiDLGjV6JCtEFqfxzVig9MyDCHQ==", - "dependencies": { - "@babel/core": "^7.23.7", - "@babel/parser": "^7.23.6", - "@babel/traverse": "^7.23.7", - "@babel/types": "^7.23.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==", + "license": "MIT", + "engines": { + "node": ">= 0.6" } }, - "node_modules/bail": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/bail/-/bail-2.0.2.tgz", - "integrity": "sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==", + "node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "license": "MIT" + }, + "node_modules/cookie": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-1.1.1.tgz", + "integrity": "sha512-ei8Aos7ja0weRpFzJnEA9UHJ/7XQmqglbRwnf2ATjcB9Wq874VKH9kfjjirM6UhU2/E5fFYadylyhFldcqSidQ==", + "license": "MIT", + "engines": { + "node": ">=18" + }, "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" + "type": "opencollective", + "url": "https://opencollective.com/express" } }, - "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": "0.0.8", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-0.0.8.tgz", - "integrity": "sha512-3XSA2cR/h/73EzlXXdU6YNycmYI7+kicTxks4eJg2g39biHR84slg2+des+p7iHYhbRg/udIS4TD53WabcOUkw==", + "node_modules/cookie-signature": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.2.2.tgz", + "integrity": "sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==", + "license": "MIT", "engines": { - "node": ">= 0.4" + "node": ">=6.6.0" } }, - "node_modules/basic-auth": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/basic-auth/-/basic-auth-2.0.1.tgz", - "integrity": "sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg==", + "node_modules/cose-base": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/cose-base/-/cose-base-1.0.3.tgz", + "integrity": "sha512-s9whTXInMSgAp/NVXVNuVxVKzGH2qck3aQlVHxDCdAEPgtMKwc4Wq6/QKhgdEdgbLSi9rBTAcPoRa6JpiG4ksg==", + "license": "MIT", "dependencies": { - "safe-buffer": "5.1.2" - }, - "engines": { - "node": ">= 0.8" + "layout-base": "^1.0.0" } }, - "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" + "node_modules/cross-env": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/cross-env/-/cross-env-10.1.0.tgz", + "integrity": "sha512-GsYosgnACZTADcmEyJctkJIoqAhHjttw7RsFrVoJNXbsWWqaq6Ym+7kZjq6mS45O0jij6vtiReppKQEtqWy6Dw==", + "license": "MIT", + "dependencies": { + "@epic-web/invariant": "^1.0.0", + "cross-spawn": "^7.0.6" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "bin": { + "cross-env": "dist/bin/cross-env.js", + "cross-env-shell": "dist/bin/cross-env-shell.js" + }, + "engines": { + "node": ">=20" } }, - "node_modules/blueimp-md5": { - "version": "2.19.0", - "resolved": "https://registry.npmjs.org/blueimp-md5/-/blueimp-md5-2.19.0.tgz", - "integrity": "sha512-DRQrD6gJyy8FbiE4s+bDoXS9hiW3Vbx5uCdwvcCf3zLHL+Iv7LtGHLpr+GZV8rHG8tK766FGYBwRbu8pELTt+w==" - }, - "node_modules/body-parser": { - "version": "1.20.2", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.2.tgz", - "integrity": "sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==", + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "license": "MIT", "dependencies": { - "bytes": "3.1.2", - "content-type": "~1.0.5", - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "on-finished": "2.4.1", - "qs": "6.11.0", - "raw-body": "2.5.2", - "type-is": "~1.6.18", - "unpipe": "1.0.0" + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" }, "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" + "node": ">= 8" } }, - "node_modules/body-parser/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/css-background-parser": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/css-background-parser/-/css-background-parser-0.1.0.tgz", + "integrity": "sha512-2EZLisiZQ+7m4wwur/qiYJRniHX4K5Tc9w93MT3AS0WS1u5kaZ4FKXlOTBhOjc+CgEgPiGY+fX1yWD8UwpEqUA==", + "license": "MIT" }, - "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/css-box-shadow": { + "version": "1.0.0-3", + "resolved": "https://registry.npmjs.org/css-box-shadow/-/css-box-shadow-1.0.0-3.tgz", + "integrity": "sha512-9jaqR6e7Ohds+aWwmhe6wILJ99xYQbfmK9QQB9CcMjDbTxPZjwEmUQpU91OG05Xgm8BahT5fW+svbsQGjS/zPg==", + "license": "MIT" + }, + "node_modules/css-color-keywords": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/css-color-keywords/-/css-color-keywords-1.0.0.tgz", + "integrity": "sha512-FyyrDHZKEjXDpNJYvVsV960FiqQyXc/LlYmsxl2BcdMb2WPx0OGRVgTg55rPSyLSNMqP52R9r8geSp7apN3Ofg==", + "license": "ISC", + "engines": { + "node": ">=4" } }, - "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" - }, + "node_modules/css-gradient-parser": { + "version": "0.0.17", + "resolved": "https://registry.npmjs.org/css-gradient-parser/-/css-gradient-parser-0.0.17.tgz", + "integrity": "sha512-w2Xy9UMMwlKtou0vlRnXvWglPAceXCTtcmVSo8ZBUvqCV5aXEFP/PC6d+I464810I9FT++UACwTD5511bmGPUg==", + "license": "MIT", "engines": { - "node": ">=8" + "node": ">=16" } }, - "node_modules/browserslist": { - "version": "4.23.3", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.3.tgz", - "integrity": "sha512-btwCFJVjI4YWDNfau8RhZ+B1Q/VLoUITrm3RlP6y1tYGWIOa+InuYiRGXUBXo8nA1qKmHMyLB/iVQg5TT4eFoA==", - "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" - } - ], + "node_modules/css-to-react-native": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/css-to-react-native/-/css-to-react-native-3.2.0.tgz", + "integrity": "sha512-e8RKaLXMOFii+02mOlqwjbD00KSEKqblnpO9e++1aXS1fPQOpS1YoqdVHBqPjHNoxeF2mimzVqawm2KCbEdtHQ==", + "license": "MIT", "dependencies": { - "caniuse-lite": "^1.0.30001646", - "electron-to-chromium": "^1.5.4", - "node-releases": "^2.0.18", - "update-browserslist-db": "^1.1.0" - }, - "bin": { - "browserslist": "cli.js" - }, - "engines": { - "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + "camelize": "^1.0.0", + "css-color-keywords": "^1.0.0", + "postcss-value-parser": "^4.0.2" } }, - "node_modules/buffer-from": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" + "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==", + "license": "MIT" }, - "node_modules/bytes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", - "integrity": "sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==", + "node_modules/custom-media-element": { + "version": "1.4.5", + "resolved": "https://registry.npmjs.org/custom-media-element/-/custom-media-element-1.4.5.tgz", + "integrity": "sha512-cjrsQufETwxjvwZbYbKBCJNvmQ2++G9AvT45zDi7NXL9k2PdVcs2h0jQz96J6G4TMKRCcEsoJ+QTgQD00Igtjw==", + "license": "MIT" + }, + "node_modules/cytoscape": { + "version": "3.33.1", + "resolved": "https://registry.npmjs.org/cytoscape/-/cytoscape-3.33.1.tgz", + "integrity": "sha512-iJc4TwyANnOGR1OmWhsS9ayRS3s+XQ185FmuHObThD+5AeJCakAAbWv8KimMTt08xCCLNgneQwFp+JRJOr9qGQ==", + "license": "MIT", "engines": { - "node": ">= 0.8" + "node": ">=0.10" } }, - "node_modules/call-bind": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", - "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", + "node_modules/cytoscape-cose-bilkent": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/cytoscape-cose-bilkent/-/cytoscape-cose-bilkent-4.1.0.tgz", + "integrity": "sha512-wgQlVIUJF13Quxiv5e1gstZ08rnZj2XaLHGoFMYXz7SkNfCDOOteKBE6SYRfA9WxxI/iBc3ajfDoc6hb/MRAHQ==", + "license": "MIT", "dependencies": { - "es-define-property": "^1.0.0", - "es-errors": "^1.3.0", - "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.4", - "set-function-length": "^1.2.1" - }, - "engines": { - "node": ">= 0.4" + "cose-base": "^1.0.0" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "peerDependencies": { + "cytoscape": "^3.2.0" } }, - "node_modules/camelize": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/camelize/-/camelize-1.0.1.tgz", - "integrity": "sha512-dU+Tx2fsypxTgtLoE36npi3UqcjSSMNYfkqgmoEhtZrraP5VWq0K7FkWVTYa8eMPtnU/G2txVsfdCJTn9uzpuQ==", - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node_modules/cytoscape-fcose": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/cytoscape-fcose/-/cytoscape-fcose-2.2.0.tgz", + "integrity": "sha512-ki1/VuRIHFCzxWNrsshHYPs6L7TvLu3DL+TyIGEsRcvVERmxokbf5Gdk7mFxZnTdiGtnA4cfSmjZJMviqSuZrQ==", + "license": "MIT", + "dependencies": { + "cose-base": "^2.2.0" + }, + "peerDependencies": { + "cytoscape": "^3.2.0" } }, - "node_modules/caniuse-lite": { - "version": "1.0.30001651", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001651.tgz", - "integrity": "sha512-9Cf+Xv1jJNe1xPZLGuUXLNkE1BoDkqRqYyFJ9TDYSqhduqA4hu4oR9HluGoWYQC/aj8WHjsGVV+bwkh0+tegRg==", - "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/castable-video": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/castable-video/-/castable-video-1.0.10.tgz", - "integrity": "sha512-tJgUv+8/zE191y8EKojvB0eKIyKA9obIttd6Wpdm6x2qBmuwZ7wDgzVCSmf5cN2v9jBiuu0s7O5poz8a8cFX/w==", + "node_modules/cytoscape-fcose/node_modules/cose-base": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/cose-base/-/cose-base-2.2.0.tgz", + "integrity": "sha512-AzlgcsCbUMymkADOJtQm3wO9S3ltPfYOFD5033keQn9NJzIbtnZj+UdBJe7DYml/8TdbtHJW3j58SOnKhWY/5g==", + "license": "MIT", "dependencies": { - "custom-media-element": "~1.3.2" + "layout-base": "^2.0.0" } }, - "node_modules/ccount": { + "node_modules/cytoscape-fcose/node_modules/layout-base": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/ccount/-/ccount-2.0.1.tgz", - "integrity": "sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } + "resolved": "https://registry.npmjs.org/layout-base/-/layout-base-2.0.1.tgz", + "integrity": "sha512-dp3s92+uNI1hWIpPGH3jK2kxE2lMjdXdr+DH8ynZHpd6PUlH6x6cbuXnoMmiNumznqaNO31xu9e79F0uuZ0JFg==", + "license": "MIT" }, - "node_modules/chai": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/chai/-/chai-5.1.1.tgz", - "integrity": "sha512-pT1ZgP8rPNqUgieVaEY+ryQr6Q4HXNg8Ei9UnLUrjN4IA7dvQC5JB+/kxVcPNDHyBcc/26CXPkbNzq3qwrOEKA==", - "dependencies": { - "assertion-error": "^2.0.1", - "check-error": "^2.1.1", - "deep-eql": "^5.0.1", - "loupe": "^3.1.0", - "pathval": "^2.0.0" + "node_modules/d3": { + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/d3/-/d3-7.9.0.tgz", + "integrity": "sha512-e1U46jVP+w7Iut8Jt8ri1YsPOvFpg46k+K8TpCb0P+zjCkjkPnV7WzfDJzMHy1LnA+wj5pLT1wjO901gLXeEhA==", + "license": "ISC", + "dependencies": { + "d3-array": "3", + "d3-axis": "3", + "d3-brush": "3", + "d3-chord": "3", + "d3-color": "3", + "d3-contour": "4", + "d3-delaunay": "6", + "d3-dispatch": "3", + "d3-drag": "3", + "d3-dsv": "3", + "d3-ease": "3", + "d3-fetch": "3", + "d3-force": "3", + "d3-format": "3", + "d3-geo": "3", + "d3-hierarchy": "3", + "d3-interpolate": "3", + "d3-path": "3", + "d3-polygon": "3", + "d3-quadtree": "3", + "d3-random": "3", + "d3-scale": "4", + "d3-scale-chromatic": "3", + "d3-selection": "3", + "d3-shape": "3", + "d3-time": "3", + "d3-time-format": "4", + "d3-timer": "3", + "d3-transition": "3", + "d3-zoom": "3" }, "engines": { "node": ">=12" } }, - "node_modules/chai-dom": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/chai-dom/-/chai-dom-1.12.0.tgz", - "integrity": "sha512-pLP8h6IBR8z1AdeQ+EMcJ7dXPdsax/1Q7gdGZjsnAmSBl3/gItQUYSCo32br1qOy4SlcBjvqId7ilAf3uJ2K1w==", - "engines": { - "node": ">= 0.12.0" + "node_modules/d3-array": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-3.2.4.tgz", + "integrity": "sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==", + "license": "ISC", + "dependencies": { + "internmap": "1 - 2" }, - "peerDependencies": { - "chai": ">= 3" + "engines": { + "node": ">=12" } }, - "node_modules/chalk": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", - "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", + "node_modules/d3-axis": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-axis/-/d3-axis-3.0.0.tgz", + "integrity": "sha512-IH5tgjV4jE/GhHkRV0HiVYPDtvfjHQlQfJHs0usq7M30XcSBvOotpmH1IgkcXsO/5gEQZD43B//fc7SRT5S+xw==", + "license": "ISC", "engines": { - "node": "^12.17.0 || ^14.13 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "node": ">=12" } }, - "node_modules/char-regex": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", - "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", + "node_modules/d3-brush": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-brush/-/d3-brush-3.0.0.tgz", + "integrity": "sha512-ALnjWlVYkXsVIGlOsuWH1+3udkYFI48Ljihfnh8FZPF2QS9o+PzGLBslO0PjzVoHLZ2KCVgAM8NVkXPJB2aNnQ==", + "license": "ISC", + "dependencies": { + "d3-dispatch": "1 - 3", + "d3-drag": "2 - 3", + "d3-interpolate": "1 - 3", + "d3-selection": "3", + "d3-transition": "3" + }, "engines": { - "node": ">=10" + "node": ">=12" } }, - "node_modules/character-entities": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-2.0.2.tgz", - "integrity": "sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" + "node_modules/d3-chord": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-chord/-/d3-chord-3.0.1.tgz", + "integrity": "sha512-VE5S6TNa+j8msksl7HwjxMHDM2yNK3XCkusIlpX5kwauBfXuyLAtNg9jCp/iHH61tgI4sb6R/EIMWCqEIdjT/g==", + "license": "ISC", + "dependencies": { + "d3-path": "1 - 3" + }, + "engines": { + "node": ">=12" } }, - "node_modules/character-entities-html4": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/character-entities-html4/-/character-entities-html4-2.1.0.tgz", - "integrity": "sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" + "node_modules/d3-color": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-3.1.0.tgz", + "integrity": "sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==", + "license": "ISC", + "engines": { + "node": ">=12" } }, - "node_modules/character-entities-legacy": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-3.0.0.tgz", - "integrity": "sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" + "node_modules/d3-contour": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/d3-contour/-/d3-contour-4.0.2.tgz", + "integrity": "sha512-4EzFTRIikzs47RGmdxbeUvLWtGedDUNkTcmzoeyg4sP/dvCexO47AaQL7VKy/gul85TOxw+IBgA8US2xwbToNA==", + "license": "ISC", + "dependencies": { + "d3-array": "^3.2.0" + }, + "engines": { + "node": ">=12" } }, - "node_modules/character-reference-invalid": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-2.0.1.tgz", - "integrity": "sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" + "node_modules/d3-delaunay": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/d3-delaunay/-/d3-delaunay-6.0.4.tgz", + "integrity": "sha512-mdjtIZ1XLAM8bm/hx3WwjfHt6Sggek7qH043O8KEjDXN40xi3vx/6pYSVTwLjEgiXQTbvaouWKynLBiUZ6SK6A==", + "license": "ISC", + "dependencies": { + "delaunator": "5" + }, + "engines": { + "node": ">=12" } }, - "node_modules/check-error": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/check-error/-/check-error-2.1.1.tgz", - "integrity": "sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==", + "node_modules/d3-dispatch": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-dispatch/-/d3-dispatch-3.0.1.tgz", + "integrity": "sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg==", + "license": "ISC", "engines": { - "node": ">= 16" + "node": ">=12" } }, - "node_modules/chokidar": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", - "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "node_modules/d3-drag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-drag/-/d3-drag-3.0.0.tgz", + "integrity": "sha512-pWbUJLdETVA8lQNJecMxoXfH6x+mO2UQo8rSmZ+QqxcbyA3hfeprFgIT//HW2nlHChWeIIMwS2Fq+gEARkhTkg==", + "license": "ISC", "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" + "d3-dispatch": "1 - 3", + "d3-selection": "3" }, "engines": { - "node": ">= 8.10.0" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" + "node": ">=12" } }, - "node_modules/clean-stack": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-5.2.0.tgz", - "integrity": "sha512-TyUIUJgdFnCISzG5zu3291TAsE77ddchd0bepon1VVQrKLGKFED4iXFEDQ24mIPdPBbyE16PK3F8MYE1CmcBEQ==", + "node_modules/d3-dsv": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-dsv/-/d3-dsv-3.0.1.tgz", + "integrity": "sha512-UG6OvdI5afDIFP9w4G0mNq50dSOsXHJaRE8arAS5o9ApWnIElp8GZw1Dun8vP8OyHOZ/QJUKUJwxiiCCnUwm+Q==", + "license": "ISC", "dependencies": { - "escape-string-regexp": "5.0.0" + "commander": "7", + "iconv-lite": "0.6", + "rw": "1" }, - "engines": { - "node": ">=14.16" + "bin": { + "csv2json": "bin/dsv2json.js", + "csv2tsv": "bin/dsv2dsv.js", + "dsv2dsv": "bin/dsv2dsv.js", + "dsv2json": "bin/dsv2json.js", + "json2csv": "bin/json2dsv.js", + "json2dsv": "bin/json2dsv.js", + "json2tsv": "bin/json2dsv.js", + "tsv2csv": "bin/dsv2dsv.js", + "tsv2json": "bin/dsv2json.js" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "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": ">=12" } }, - "node_modules/cli-width": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-4.1.0.tgz", - "integrity": "sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==", + "node_modules/d3-dsv/node_modules/commander": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "license": "MIT", "engines": { - "node": ">= 12" + "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==", + "node_modules/d3-dsv/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==", + "license": "MIT", "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.1", - "wrap-ansi": "^7.0.0" + "safer-buffer": ">= 2.1.2 < 3.0.0" }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/d3-ease": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-ease/-/d3-ease-3.0.1.tgz", + "integrity": "sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==", + "license": "BSD-3-Clause", "engines": { "node": ">=12" } }, - "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==", + "node_modules/d3-fetch": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-fetch/-/d3-fetch-3.0.1.tgz", + "integrity": "sha512-kpkQIM20n3oLVBKGg6oHrUchHM3xODkTzjMoj7aWQFq5QEM+R6E4WkzT5+tojDY7yjez8KgCBRoj4aEr99Fdqw==", + "license": "ISC", "dependencies": { - "color-convert": "^2.0.1" + "d3-dsv": "1 - 3" }, "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "node": ">=12" } }, - "node_modules/cliui/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==", + "node_modules/d3-force": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-force/-/d3-force-3.0.0.tgz", + "integrity": "sha512-zxV/SsA+U4yte8051P4ECydjD/S+qeYtnaIyAs9tgHCqfguma/aAQDjo85A9Z6EKhBirHRJHXIgJUlffT4wdLg==", + "license": "ISC", "dependencies": { - "color-name": "~1.1.4" + "d3-dispatch": "1 - 3", + "d3-quadtree": "1 - 3", + "d3-timer": "1 - 3" }, "engines": { - "node": ">=7.0.0" + "node": ">=12" } }, - "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/d3-format": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-3.1.0.tgz", + "integrity": "sha512-YyUI6AEuY/Wpt8KWLgZHsIU86atmikuoOmCfommt0LYHiQSPjvX2AcFc38PX0CBpr2RCyZhjex+NS/LPOv6YqA==", + "license": "ISC", + "engines": { + "node": ">=12" + } }, - "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==", + "node_modules/d3-geo": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/d3-geo/-/d3-geo-3.1.1.tgz", + "integrity": "sha512-637ln3gXKXOwhalDzinUgY83KzNWZRKbYubaG+fGVuc/dxO64RRljtCTnf5ecMyE1RIdtqpkVcq0IbtU2S8j2Q==", + "license": "ISC", "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" + "d3-array": "2.5.0 - 3" }, "engines": { - "node": ">=8" + "node": ">=12" } }, - "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==", + "node_modules/d3-hierarchy": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/d3-hierarchy/-/d3-hierarchy-3.1.2.tgz", + "integrity": "sha512-FX/9frcub54beBdugHjDCdikxThEqjnR93Qt7PvQTOHxyiNCAlvMrHhclk3cD5VeAaq9fxmfRp+CnWw9rEMBuA==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-interpolate": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-3.0.1.tgz", + "integrity": "sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==", + "license": "ISC", "dependencies": { - "ansi-regex": "^5.0.1" + "d3-color": "1 - 3" }, "engines": { - "node": ">=8" + "node": ">=12" + } + }, + "node_modules/d3-path": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-3.1.0.tgz", + "integrity": "sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ==", + "license": "ISC", + "engines": { + "node": ">=12" } }, - "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" - }, + "node_modules/d3-polygon": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-polygon/-/d3-polygon-3.0.1.tgz", + "integrity": "sha512-3vbA7vXYwfe1SYhED++fPUQlWSYTTGmFmQiany/gdbiWgU/iEyQzyymwL9SkJjFFuCS4902BSzewVGsHHmHtXg==", + "license": "ISC", "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + "node": ">=12" } }, - "node_modules/close-with-grace": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/close-with-grace/-/close-with-grace-1.3.0.tgz", - "integrity": "sha512-lvm0rmLIR5bNz4CRKW6YvCfn9Wg5Wb9A8PJ3Bb+hjyikgC1RO1W3J4z9rBXQYw97mAte7dNSQI8BmUsxdlXQyw==" + "node_modules/d3-quadtree": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-quadtree/-/d3-quadtree-3.0.1.tgz", + "integrity": "sha512-04xDrxQTDTCFwP5H6hRhsRcb9xxv2RzkcsygFzmkSIOJy3PeRJP7sNk3VRIbKXcog561P9oU0/rVH6vDROAgUw==", + "license": "ISC", + "engines": { + "node": ">=12" + } }, - "node_modules/collapse-white-space": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/collapse-white-space/-/collapse-white-space-2.1.0.tgz", - "integrity": "sha512-loKTxY1zCOuG4j9f6EPnuyyYkf58RnhhWTvRoZEokgB+WbdXehfjFviyOVYkqzEWz1Q5kRiZdBYS5SwxbQYwzw==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" + "node_modules/d3-random": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-random/-/d3-random-3.0.1.tgz", + "integrity": "sha512-FXMe9GfxTxqd5D6jFsQ+DJ8BJS4E/fT5mqqdjovykEB2oFbTMDVdg1MGFxfQW+FBOGoB++k8swBrgwSHT1cUXQ==", + "license": "ISC", + "engines": { + "node": ">=12" } }, - "node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "node_modules/d3-sankey": { + "version": "0.12.3", + "resolved": "https://registry.npmjs.org/d3-sankey/-/d3-sankey-0.12.3.tgz", + "integrity": "sha512-nQhsBRmM19Ax5xEIPLMY9ZmJ/cDvd1BG3UVvt5h3WRxKg5zGRbvnteTyWAbzeSvlh3tW7ZEmq4VwR5mB3tutmQ==", + "license": "BSD-3-Clause", "dependencies": { - "color-name": "1.1.3" + "d3-array": "1 - 2", + "d3-shape": "^1.2.0" } }, - "node_modules/color-convert/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" + "node_modules/d3-sankey/node_modules/d3-array": { + "version": "2.12.1", + "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-2.12.1.tgz", + "integrity": "sha512-B0ErZK/66mHtEsR1TkPEEkwdy+WDesimkM5gpZr5Dsg54BiTA5RXtYW5qTLIAcekaS9xfZrzBLF/OAkB3Qn1YQ==", + "license": "BSD-3-Clause", + "dependencies": { + "internmap": "^1.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/d3-sankey/node_modules/d3-path": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-1.0.9.tgz", + "integrity": "sha512-VLaYcn81dtHVTjEHd8B+pbe9yHWpXKZUC87PzoFmsFrJqgFwDe/qxfp5MlfsfM1V5E/iVt0MmEbWQ7FVIXh/bg==", + "license": "BSD-3-Clause" }, - "node_modules/comma-separated-tokens": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz", - "integrity": "sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" + "node_modules/d3-sankey/node_modules/d3-shape": { + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-1.3.7.tgz", + "integrity": "sha512-EUkvKjqPFUAZyOlhY5gzCxCeI0Aep04LwIRpsZ/mLFelJiUfnK56jo5JMDSE7yyP2kLSb6LtF+S5chMk7uqPqw==", + "license": "BSD-3-Clause", + "dependencies": { + "d3-path": "1" } }, - "node_modules/compressible": { - "version": "2.0.18", - "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", - "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", + "node_modules/d3-sankey/node_modules/internmap": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/internmap/-/internmap-1.0.1.tgz", + "integrity": "sha512-lDB5YccMydFBtasVtxnZ3MRBHuaoE8GKsppq+EchKL2U4nK/DmEpPHNH8MZe5HkMtpSiTSOZwfN0tzYjO/lJEw==", + "license": "ISC" + }, + "node_modules/d3-scale": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-4.0.2.tgz", + "integrity": "sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==", + "license": "ISC", "dependencies": { - "mime-db": ">= 1.43.0 < 2" + "d3-array": "2.10.0 - 3", + "d3-format": "1 - 3", + "d3-interpolate": "1.2.0 - 3", + "d3-time": "2.1.1 - 3", + "d3-time-format": "2 - 4" }, "engines": { - "node": ">= 0.6" + "node": ">=12" } }, - "node_modules/compression": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz", - "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==", + "node_modules/d3-scale-chromatic": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-scale-chromatic/-/d3-scale-chromatic-3.1.0.tgz", + "integrity": "sha512-A3s5PWiZ9YCXFye1o246KoscMWqf8BsD9eRiJ3He7C9OBaxKhAd5TFCdEx/7VbKtxxTsu//1mMJFrEt572cEyQ==", + "license": "ISC", "dependencies": { - "accepts": "~1.3.5", - "bytes": "3.0.0", - "compressible": "~2.0.16", - "debug": "2.6.9", - "on-headers": "~1.0.2", - "safe-buffer": "5.1.2", - "vary": "~1.1.2" + "d3-color": "1 - 3", + "d3-interpolate": "1 - 3" }, "engines": { - "node": ">= 0.8.0" + "node": ">=12" } }, - "node_modules/confetti-react": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/confetti-react/-/confetti-react-2.5.0.tgz", - "integrity": "sha512-MqzdSqiksBFFVxFaueC6PIbhGw9vU+FgXvSfOYXxXVSZnmkEzX+MTbAovcc+AUu0cMjpxAYPO5eBR5xIfKTQnA==", - "dependencies": { - "tween-functions": "^1.2.0" - }, - "peerDependencies": { - "react": "^16.3.0 || ^17.0.0" + "node_modules/d3-selection": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-3.0.0.tgz", + "integrity": "sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==", + "license": "ISC", + "engines": { + "node": ">=12" } }, - "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==", + "node_modules/d3-shape": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-3.2.0.tgz", + "integrity": "sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA==", + "license": "ISC", "dependencies": { - "safe-buffer": "5.2.1" + "d3-path": "^3.1.0" }, "engines": { - "node": ">= 0.6" + "node": ">=12" } }, - "node_modules/content-disposition/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/content-type": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", - "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "node_modules/d3-time": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-time/-/d3-time-3.1.0.tgz", + "integrity": "sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q==", + "license": "ISC", + "dependencies": { + "d3-array": "2 - 3" + }, "engines": { - "node": ">= 0.6" + "node": ">=12" } }, - "node_modules/convert-source-map": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", - "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==" - }, - "node_modules/cookie": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.6.0.tgz", - "integrity": "sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==", + "node_modules/d3-time-format": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-4.1.0.tgz", + "integrity": "sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg==", + "license": "ISC", + "dependencies": { + "d3-time": "1 - 3" + }, "engines": { - "node": ">= 0.6" + "node": ">=12" } }, - "node_modules/cookie-signature": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.2.1.tgz", - "integrity": "sha512-78KWk9T26NhzXtuL26cIJ8/qNHANyJ/ZYrmEXFzUmhZdjpBv+DlWlOANRTGBt48YcyslsLrj0bMLFTmXvLRCOw==", + "node_modules/d3-timer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-3.0.1.tgz", + "integrity": "sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==", + "license": "ISC", "engines": { - "node": ">=6.6.0" + "node": ">=12" } }, - "node_modules/cross-env": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-env/-/cross-env-7.0.3.tgz", - "integrity": "sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw==", + "node_modules/d3-transition": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-transition/-/d3-transition-3.0.1.tgz", + "integrity": "sha512-ApKvfjsSR6tg06xrL434C0WydLr7JewBB3V+/39RMHsaXTOG0zmt/OAXeng5M5LBm0ojmxJrpomQVZ1aPvBL4w==", + "license": "ISC", "dependencies": { - "cross-spawn": "^7.0.1" - }, - "bin": { - "cross-env": "src/bin/cross-env.js", - "cross-env-shell": "src/bin/cross-env-shell.js" + "d3-color": "1 - 3", + "d3-dispatch": "1 - 3", + "d3-ease": "1 - 3", + "d3-interpolate": "1 - 3", + "d3-timer": "1 - 3" }, "engines": { - "node": ">=10.14", - "npm": ">=6", - "yarn": ">=1" + "node": ">=12" + }, + "peerDependencies": { + "d3-selection": "2 - 3" } }, - "node_modules/cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "node_modules/d3-zoom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-zoom/-/d3-zoom-3.0.0.tgz", + "integrity": "sha512-b8AmV3kfQaqWAuacbPuNbL6vahnOJflOhexLzMMNLga62+/nh0JzvJ0aO/5a5MVgUFGS7Hu1P9P03o3fJkDCyw==", + "license": "ISC", "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" + "d3-dispatch": "1 - 3", + "d3-drag": "2 - 3", + "d3-interpolate": "1 - 3", + "d3-selection": "2 - 3", + "d3-transition": "2 - 3" }, "engines": { - "node": ">= 8" - } - }, - "node_modules/css-background-parser": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/css-background-parser/-/css-background-parser-0.1.0.tgz", - "integrity": "sha512-2EZLisiZQ+7m4wwur/qiYJRniHX4K5Tc9w93MT3AS0WS1u5kaZ4FKXlOTBhOjc+CgEgPiGY+fX1yWD8UwpEqUA==" - }, - "node_modules/css-box-shadow": { - "version": "1.0.0-3", - "resolved": "https://registry.npmjs.org/css-box-shadow/-/css-box-shadow-1.0.0-3.tgz", - "integrity": "sha512-9jaqR6e7Ohds+aWwmhe6wILJ99xYQbfmK9QQB9CcMjDbTxPZjwEmUQpU91OG05Xgm8BahT5fW+svbsQGjS/zPg==" - }, - "node_modules/css-color-keywords": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/css-color-keywords/-/css-color-keywords-1.0.0.tgz", - "integrity": "sha512-FyyrDHZKEjXDpNJYvVsV960FiqQyXc/LlYmsxl2BcdMb2WPx0OGRVgTg55rPSyLSNMqP52R9r8geSp7apN3Ofg==", - "engines": { - "node": ">=4" + "node": ">=12" } }, - "node_modules/css-to-react-native": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/css-to-react-native/-/css-to-react-native-3.2.0.tgz", - "integrity": "sha512-e8RKaLXMOFii+02mOlqwjbD00KSEKqblnpO9e++1aXS1fPQOpS1YoqdVHBqPjHNoxeF2mimzVqawm2KCbEdtHQ==", + "node_modules/dagre-d3-es": { + "version": "7.0.13", + "resolved": "https://registry.npmjs.org/dagre-d3-es/-/dagre-d3-es-7.0.13.tgz", + "integrity": "sha512-efEhnxpSuwpYOKRm/L5KbqoZmNNukHa/Flty4Wp62JRvgH2ojwVgPgdYyr4twpieZnyRDdIH7PY2mopX26+j2Q==", + "license": "MIT", "dependencies": { - "camelize": "^1.0.0", - "css-color-keywords": "^1.0.0", - "postcss-value-parser": "^4.0.2" - } - }, - "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/custom-media-element": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/custom-media-element/-/custom-media-element-1.3.2.tgz", - "integrity": "sha512-nDyMobZgoAVqz7mA8rsn7i1/6bjH6N9ab2Ge7LyyNxrvxAq7zQJPg8i3u2VH7wEB+Y1T1+C3/h1G774/D+ZLag==" - }, - "node_modules/data-uri-to-buffer": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-3.0.1.tgz", - "integrity": "sha512-WboRycPNsVw3B3TL559F7kuBUM4d8CgMEvk6xEJlOp7OBPjt6G7z8WMWlD2rOFZLk6OYfFIUGsCOWzcQH9K2og==", - "engines": { - "node": ">= 6" + "d3": "^7.9.0", + "lodash-es": "^4.17.21" } }, "node_modules/dayjs": { - "version": "1.11.11", - "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.11.tgz", - "integrity": "sha512-okzr3f11N6WuqYtZSvm+F776mB41wRZMhKP+hc34YdW+KmtYYK9iqvHSwo2k9FEH3fhGXvOPV6yz2IcSrfRUDg==" + "version": "1.11.19", + "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.19.tgz", + "integrity": "sha512-t5EcLVS6QPBNqM2z8fakk/NKel+Xzshgt8FFKAn+qwlD1pzZWxh0nVCrvFK7ZDb6XucZeF9z8C7CBWTRIVApAw==", + "license": "MIT" }, "node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "license": "MIT", "dependencies": { - "ms": "2.0.0" + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } } }, "node_modules/decode-named-character-reference": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/decode-named-character-reference/-/decode-named-character-reference-1.0.2.tgz", - "integrity": "sha512-O8x12RzrUF8xyVcY0KJowWsmaJxQbmy0/EtnNtHRpsOcT7dFk5W598coHqBVpmWo1oQQfsCqfCmkZN5DJrZVdg==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decode-named-character-reference/-/decode-named-character-reference-1.2.0.tgz", + "integrity": "sha512-c6fcElNV6ShtZXmsgNgFFV5tVX2PaV4g+MOAkb8eXHvn6sryJBrZa9r0zV6+dtTyoCKxtDy5tyQ5ZwQuidtd+Q==", + "license": "MIT", "dependencies": { "character-entities": "^2.0.0" }, @@ -4749,34 +6188,60 @@ "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/deep-eql": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-5.0.2.tgz", - "integrity": "sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==", + "node_modules/default-browser": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/default-browser/-/default-browser-5.4.0.tgz", + "integrity": "sha512-XDuvSq38Hr1MdN47EDvYtx3U0MTqpCEn+F6ft8z2vYDzMrvQhVp0ui9oQdqW3MvK3vqUETglt1tVGgjLuJ5izg==", + "license": "MIT", + "dependencies": { + "bundle-name": "^4.1.0", + "default-browser-id": "^5.0.0" + }, "engines": { - "node": ">=6" + "node": ">=18" + }, + "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" + "node_modules/default-browser-id": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/default-browser-id/-/default-browser-id-5.0.1.tgz", + "integrity": "sha512-x1VCxdX4t+8wVfd1so/9w+vQ4vx7lKd2Qp5tDRutErwmR85OgmfX7RlLRMWafRMY7hbEiXIbudNrjOAPa/hL8Q==", + "license": "MIT", + "engines": { + "node": ">=18" }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/define-lazy-prop": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-3.0.0.tgz", + "integrity": "sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==", + "license": "MIT", "engines": { - "node": ">= 0.4" + "node": ">=12" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/delaunator": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/delaunator/-/delaunator-5.0.1.tgz", + "integrity": "sha512-8nvh+XBe96aCESrGOqMp/84b13H9cdKbG5P2ejQCh4d4sK9RL4371qou9drQjMhvnPmhWl5hnmqbEE0fXr9Xnw==", + "license": "ISC", + "dependencies": { + "robust-predicates": "^3.0.2" } }, "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==", + "license": "MIT", "engines": { "node": ">= 0.8" } @@ -4785,28 +6250,31 @@ "version": "2.0.3", "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", + "license": "MIT", "engines": { "node": ">=6" } }, - "node_modules/destroy": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", - "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "node_modules/detect-libc": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", + "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", + "license": "Apache-2.0", "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" + "node": ">=8" } }, "node_modules/detect-node-es": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/detect-node-es/-/detect-node-es-1.1.0.tgz", - "integrity": "sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==" + "integrity": "sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==", + "license": "MIT" }, "node_modules/devlop": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/devlop/-/devlop-1.1.0.tgz", "integrity": "sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==", + "license": "MIT", "dependencies": { "dequal": "^2.0.0" }, @@ -4818,12 +6286,23 @@ "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==" + "integrity": "sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==", + "license": "MIT" + }, + "node_modules/dompurify": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-3.3.1.tgz", + "integrity": "sha512-qkdCKzLNtrgPFP1Vo+98FRzJnBRGe4ffyCea9IwHB1fyxPOeNTHpLKYGd4Uk9xvNoH0ZoOjwZxNptyMwqrId1Q==", + "license": "(MPL-2.0 OR Apache-2.0)", + "optionalDependencies": { + "@types/trusted-types": "^2.0.7" + } }, "node_modules/dotenv": { - "version": "16.4.5", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.5.tgz", - "integrity": "sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==", + "version": "17.2.3", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-17.2.3.tgz", + "integrity": "sha512-JVUnt+DUIzu87TABbhPmNfVdBDt18BLOWjMUFJMSi/Qqg7NTYtabbvSNJGOJ7afbRuv9D/lngizHtP7QyLQ+9w==", + "license": "BSD-2-Clause", "engines": { "node": ">=12" }, @@ -4831,63 +6310,139 @@ "url": "https://dotenvx.com" } }, + "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==", + "license": "MIT", + "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==" + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", + "license": "MIT" }, "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==" + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", + "license": "MIT" }, "node_modules/electron-to-chromium": { - "version": "1.5.9", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.9.tgz", - "integrity": "sha512-HfkT8ndXR0SEkU8gBQQM3rz035bpE/hxkZ1YIt4KJPEFES68HfIU6LzKukH0H794Lm83WJtkSAMfEToxCs15VA==" + "version": "1.5.267", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.267.tgz", + "integrity": "sha512-0Drusm6MVRXSOJpGbaSVgcQsuB4hEkMpHXaVstcPmhu5LIedxs1xNK/nIxmQIU/RPC0+1/o0AVZfBTkTNJOdUw==", + "license": "ISC" }, "node_modules/emoji-regex": { - "version": "10.3.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.3.0.tgz", - "integrity": "sha512-QpLs9D9v9kArv4lfDEgg1X/gN5XLnf/A6l9cs8SPZLRZR3ZkY9+kwIQTxm+fsSej5UMYGE8fdoaZVIBlqG0XTw==" + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "license": "MIT" + }, + "node_modules/emoji-regex-xs": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/emoji-regex-xs/-/emoji-regex-xs-2.0.1.tgz", + "integrity": "sha512-1QFuh8l7LqUcKe24LsPUNzjrzJQ7pgRwp1QMcZ5MX6mFplk2zQ08NVCM84++1cveaUUYtcCYHmeFEuNg16sU4g==", + "license": "MIT", + "engines": { + "node": ">=10.0.0" + } }, "node_modules/emojilib": { "version": "2.4.0", "resolved": "https://registry.npmjs.org/emojilib/-/emojilib-2.4.0.tgz", - "integrity": "sha512-5U0rVMU5Y2n2+ykNLQqMoqklN9ICBT/KsvC1Gz6vqHbz2AXXGkG+Pm5rMWk/8Vjrr/mY9985Hi8DYzn1F09Nyw==" + "integrity": "sha512-5U0rVMU5Y2n2+ykNLQqMoqklN9ICBT/KsvC1Gz6vqHbz2AXXGkG+Pm5rMWk/8Vjrr/mY9985Hi8DYzn1F09Nyw==", + "license": "MIT" }, "node_modules/emoticon": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/emoticon/-/emoticon-4.1.0.tgz", "integrity": "sha512-VWZfnxqwNcc51hIy/sbOdEem6D+cVtpPzEEtVAFdaas30+1dgkyaOQ4sQ6Bp0tOMqWO1v+HQfYaoodOkdhK6SQ==", + "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" } }, "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==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", + "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", + "license": "MIT", "engines": { "node": ">= 0.8" } }, + "node_modules/enquirer": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.4.1.tgz", + "integrity": "sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==", + "license": "MIT", + "dependencies": { + "ansi-colors": "^4.1.1", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/enquirer/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==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/entities": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", + "license": "BSD-2-Clause", "funding": { "url": "https://github.com/fb55/entities?sponsor=1" } }, - "node_modules/es-define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", - "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", + "node_modules/epicshop": { + "version": "6.80.1", + "resolved": "https://registry.npmjs.org/epicshop/-/epicshop-6.80.1.tgz", + "integrity": "sha512-AzMKTqmtvIILbkwsOhrLmuBF9re3CPnujvftrh8alkWfRZfJA8F8KvbjdwX2XEt+KiubJ96INAimfogZ0f4erA==", "dependencies": { - "get-intrinsic": "^1.2.4" + "@epic-web/workshop-utils": "6.80.1", + "@inquirer/prompts": "^8.2.0", + "@sentry/node": "^10.38.0", + "chalk": "^5.6.2", + "close-with-grace": "^2.4.0", + "execa": "^9.6.1", + "get-port": "^7.1.0", + "match-sorter": "^8.2.0", + "open": "^11.0.0", + "openid-client": "^6.8.1", + "ora": "^9.1.0", + "yargs": "^18.0.0" }, + "bin": { + "epicshop": "cli.js" + } + }, + "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==", + "license": "MIT", "engines": { "node": ">= 0.4" } @@ -4896,50 +6451,101 @@ "version": "1.3.0", "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-object-atoms": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, "engines": { "node": ">= 0.4" } }, + "node_modules/esast-util-from-estree": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/esast-util-from-estree/-/esast-util-from-estree-2.0.0.tgz", + "integrity": "sha512-4CyanoAudUSBAn5K13H4JhsMH6L9ZP7XbLVe/dKybkxMO7eDyLsT8UHl9TRNrU2Gr9nz+FovfSIjuXWJ81uVwQ==", + "license": "MIT", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "devlop": "^1.0.0", + "estree-util-visit": "^2.0.0", + "unist-util-position-from-estree": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/esast-util-from-js": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/esast-util-from-js/-/esast-util-from-js-2.0.1.tgz", + "integrity": "sha512-8Ja+rNJ0Lt56Pcf3TAmpBZjmx8ZcK5Ts4cAzIOjsjevg9oSXJnl6SUQ2EevU8tv3h6ZLWmoKL5H4fgWvdvfETw==", + "license": "MIT", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "acorn": "^8.0.0", + "esast-util-from-estree": "^2.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/esbuild": { - "version": "0.17.6", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.17.6.tgz", - "integrity": "sha512-TKFRp9TxrJDdRWfSsSERKEovm6v30iHnrjlcGhLBOtReE28Yp1VSBRfO3GTaOFMoxsNerx4TjrhzSuma9ha83Q==", + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.27.2.tgz", + "integrity": "sha512-HyNQImnsOC7X9PMNaCIeAm4ISCQXs5a5YasTXVliKv4uuBo1dKrG0A+uQS8M5eXjVMnLg3WgXaKvprHlFJQffw==", "hasInstallScript": true, + "license": "MIT", "bin": { "esbuild": "bin/esbuild" }, "engines": { - "node": ">=12" + "node": ">=18" }, "optionalDependencies": { - "@esbuild/android-arm": "0.17.6", - "@esbuild/android-arm64": "0.17.6", - "@esbuild/android-x64": "0.17.6", - "@esbuild/darwin-arm64": "0.17.6", - "@esbuild/darwin-x64": "0.17.6", - "@esbuild/freebsd-arm64": "0.17.6", - "@esbuild/freebsd-x64": "0.17.6", - "@esbuild/linux-arm": "0.17.6", - "@esbuild/linux-arm64": "0.17.6", - "@esbuild/linux-ia32": "0.17.6", - "@esbuild/linux-loong64": "0.17.6", - "@esbuild/linux-mips64el": "0.17.6", - "@esbuild/linux-ppc64": "0.17.6", - "@esbuild/linux-riscv64": "0.17.6", - "@esbuild/linux-s390x": "0.17.6", - "@esbuild/linux-x64": "0.17.6", - "@esbuild/netbsd-x64": "0.17.6", - "@esbuild/openbsd-x64": "0.17.6", - "@esbuild/sunos-x64": "0.17.6", - "@esbuild/win32-arm64": "0.17.6", - "@esbuild/win32-ia32": "0.17.6", - "@esbuild/win32-x64": "0.17.6" + "@esbuild/aix-ppc64": "0.27.2", + "@esbuild/android-arm": "0.27.2", + "@esbuild/android-arm64": "0.27.2", + "@esbuild/android-x64": "0.27.2", + "@esbuild/darwin-arm64": "0.27.2", + "@esbuild/darwin-x64": "0.27.2", + "@esbuild/freebsd-arm64": "0.27.2", + "@esbuild/freebsd-x64": "0.27.2", + "@esbuild/linux-arm": "0.27.2", + "@esbuild/linux-arm64": "0.27.2", + "@esbuild/linux-ia32": "0.27.2", + "@esbuild/linux-loong64": "0.27.2", + "@esbuild/linux-mips64el": "0.27.2", + "@esbuild/linux-ppc64": "0.27.2", + "@esbuild/linux-riscv64": "0.27.2", + "@esbuild/linux-s390x": "0.27.2", + "@esbuild/linux-x64": "0.27.2", + "@esbuild/netbsd-arm64": "0.27.2", + "@esbuild/netbsd-x64": "0.27.2", + "@esbuild/openbsd-arm64": "0.27.2", + "@esbuild/openbsd-x64": "0.27.2", + "@esbuild/openharmony-arm64": "0.27.2", + "@esbuild/sunos-x64": "0.27.2", + "@esbuild/win32-arm64": "0.27.2", + "@esbuild/win32-ia32": "0.27.2", + "@esbuild/win32-x64": "0.27.2" } }, "node_modules/escalade": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz", - "integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "license": "MIT", "engines": { "node": ">=6" } @@ -4948,6 +6554,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/escape-goat/-/escape-goat-4.0.0.tgz", "integrity": "sha512-2Sd4ShcWxbx6OY1IHyla/CVNwvg7XwZVoXZHcSu9w9SReNP1EzzD5T8NWKIR38fIqEns9kDWKUQTXXAmlDrdPg==", + "license": "MIT", "engines": { "node": ">=12" }, @@ -4958,12 +6565,14 @@ "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==" + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", + "license": "MIT" }, "node_modules/escape-string-regexp": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", + "license": "MIT", "engines": { "node": ">=12" }, @@ -4975,6 +6584,7 @@ "version": "4.0.1", "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "license": "BSD-2-Clause", "bin": { "esparse": "bin/esparse.js", "esvalidate": "bin/esvalidate.js" @@ -4987,6 +6597,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/estree-util-attach-comments/-/estree-util-attach-comments-3.0.0.tgz", "integrity": "sha512-cKUwm/HUcTDsYh/9FgnuFqpfquUbwIqwKM26BVCGDPVgvaCl/nDCCjUfiLlx6lsEZ3Z4RFxNbOQ60pkaEwFxGw==", + "license": "MIT", "dependencies": { "@types/estree": "^1.0.0" }, @@ -4999,6 +6610,7 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/estree-util-build-jsx/-/estree-util-build-jsx-3.0.1.tgz", "integrity": "sha512-8U5eiL6BTrPxp/CHbs2yMgP8ftMhR5ww1eIKoWRMlqvltHF8fZn5LRDvTKuxD3DUn+shRbLGqXemcP51oFCsGQ==", + "license": "MIT", "dependencies": { "@types/estree-jsx": "^1.0.0", "devlop": "^1.0.0", @@ -5014,6 +6626,21 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/estree-util-is-identifier-name/-/estree-util-is-identifier-name-3.0.0.tgz", "integrity": "sha512-hFtqIDZTIUZ9BXLb8y4pYGyk6+wekIivNVTcmvk8NoOh+VeRn5y6cEHzbURrWbfp1fIqdVipilzj+lfaadNZmg==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/estree-util-scope": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/estree-util-scope/-/estree-util-scope-1.0.0.tgz", + "integrity": "sha512-2CAASclonf+JFWBNJPndcOpA8EMJwa0Q8LUFJEKqXLW6+qBvbFZuF5gItbQOs/umBUkjviCSDCbBwU2cXbmrhQ==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "devlop": "^1.0.0" + }, "funding": { "type": "opencollective", "url": "https://opencollective.com/unified" @@ -5023,6 +6650,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/estree-util-to-js/-/estree-util-to-js-2.0.0.tgz", "integrity": "sha512-WDF+xj5rRWmD5tj6bIqRi6CkLIXbbNQUcxQHzGysQzvHmdYG2G7p/Tf0J0gpxGgkeMZNTIjT/AoSvC9Xehcgdg==", + "license": "MIT", "dependencies": { "@types/estree-jsx": "^1.0.0", "astring": "^1.8.0", @@ -5034,9 +6662,10 @@ } }, "node_modules/estree-util-value-to-estree": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/estree-util-value-to-estree/-/estree-util-value-to-estree-3.1.2.tgz", - "integrity": "sha512-S0gW2+XZkmsx00tU2uJ4L9hUT7IFabbml9pHh2WQqFmAbxit++YGZne0sKJbNwkj9Wvg9E4uqWl4nCIFQMmfag==", + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/estree-util-value-to-estree/-/estree-util-value-to-estree-3.5.0.tgz", + "integrity": "sha512-aMV56R27Gv3QmfmF1MY12GWkGzzeAezAX+UplqHVASfjc9wNzI/X6hC0S9oxq61WT4aQesLGslWP9tKk6ghRZQ==", + "license": "MIT", "dependencies": { "@types/estree": "^1.0.0" }, @@ -5048,6 +6677,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/estree-util-visit/-/estree-util-visit-2.0.0.tgz", "integrity": "sha512-m5KgiH85xAhhW8Wta0vShLcUvOsh3LLPI2YVwcbio1l7E09NTLL1EyMZFM1OyWowoH0skScNbhOPl4kcBgzTww==", + "license": "MIT", "dependencies": { "@types/estree-jsx": "^1.0.0", "@types/unist": "^3.0.0" @@ -5061,6 +6691,7 @@ "version": "3.0.3", "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", + "license": "MIT", "dependencies": { "@types/estree": "^1.0.0" } @@ -5069,40 +6700,41 @@ "version": "1.8.1", "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "license": "MIT", "engines": { "node": ">= 0.6" } }, - "node_modules/event-target-shim": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", - "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", - "engines": { - "node": ">=6" - } + "node_modules/event-target-polyfill": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/event-target-polyfill/-/event-target-polyfill-0.0.4.tgz", + "integrity": "sha512-Gs6RLjzlLRdT8X9ZipJdIZI/Y6/HhRLyq9RdDlCsnpxr/+Nn6bU2EFGuC94GjxqhM+Nmij2Vcq98yoHrU8uNFQ==", + "license": "MIT" }, "node_modules/eventemitter3": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz", - "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==" + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.4.tgz", + "integrity": "sha512-mlsTRyGaPBjPedk6Bvw+aqbsXDtoAyAzm5MO7JgU+yVRyMQ5O8bD4Kcci7BS85f93veegeCPkL8R4GLClnjLFw==", + "license": "MIT" }, "node_modules/execa": { - "version": "9.3.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-9.3.0.tgz", - "integrity": "sha512-l6JFbqnHEadBoVAVpN5dl2yCyfX28WoBAGaoQcNmLLSedOxTxcn2Qa83s8I/PA5i56vWru2OHOtrwF7Om2vqlg==", + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-9.6.1.tgz", + "integrity": "sha512-9Be3ZoN4LmYR90tUoVu2te2BsbzHfhJyfEiAVfz7N5/zv+jduIfLrV2xdQXOHbaD6KgpGdO9PRPM1Y4Q9QkPkA==", + "license": "MIT", "dependencies": { "@sindresorhus/merge-streams": "^4.0.0", - "cross-spawn": "^7.0.3", + "cross-spawn": "^7.0.6", "figures": "^6.1.0", "get-stream": "^9.0.0", - "human-signals": "^7.0.0", + "human-signals": "^8.0.1", "is-plain-obj": "^4.1.0", "is-stream": "^4.0.1", - "npm-run-path": "^5.2.0", - "pretty-ms": "^9.0.0", + "npm-run-path": "^6.0.0", + "pretty-ms": "^9.2.0", "signal-exit": "^4.1.0", "strip-final-newline": "^4.0.0", - "yoctocolors": "^2.0.0" + "yoctocolors": "^2.1.1" }, "engines": { "node": "^18.19.0 || >=20.5.0" @@ -5112,79 +6744,68 @@ } }, "node_modules/express": { - "version": "4.19.2", - "resolved": "https://registry.npmjs.org/express/-/express-4.19.2.tgz", - "integrity": "sha512-5T6nhjsT+EOMzuck8JjBHARTHfMht0POzlA60WV2pMD3gyXw2LZnZ+ueGdNxG+0calOJcWKbpFcuzLZ91YWq9Q==", - "dependencies": { - "accepts": "~1.3.8", - "array-flatten": "1.1.1", - "body-parser": "1.20.2", - "content-disposition": "0.5.4", - "content-type": "~1.0.4", - "cookie": "0.6.0", - "cookie-signature": "1.0.6", - "debug": "2.6.9", - "depd": "2.0.0", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "finalhandler": "1.2.0", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "merge-descriptors": "1.0.1", - "methods": "~1.1.2", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "path-to-regexp": "0.1.7", - "proxy-addr": "~2.0.7", - "qs": "6.11.0", - "range-parser": "~1.2.1", - "safe-buffer": "5.2.1", - "send": "0.18.0", - "serve-static": "1.15.0", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "type-is": "~1.6.18", - "utils-merge": "1.0.1", - "vary": "~1.1.2" + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/express/-/express-5.2.1.tgz", + "integrity": "sha512-hIS4idWWai69NezIdRt2xFVofaF4j+6INOpJlVOLDO8zXGpUVEVzIYk12UUi2JzjEzWL3IOAxcTubgz9Po0yXw==", + "license": "MIT", + "dependencies": { + "accepts": "^2.0.0", + "body-parser": "^2.2.1", + "content-disposition": "^1.0.0", + "content-type": "^1.0.5", + "cookie": "^0.7.1", + "cookie-signature": "^1.2.1", + "debug": "^4.4.0", + "depd": "^2.0.0", + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "etag": "^1.8.1", + "finalhandler": "^2.1.0", + "fresh": "^2.0.0", + "http-errors": "^2.0.0", + "merge-descriptors": "^2.0.0", + "mime-types": "^3.0.0", + "on-finished": "^2.4.1", + "once": "^1.4.0", + "parseurl": "^1.3.3", + "proxy-addr": "^2.0.7", + "qs": "^6.14.0", + "range-parser": "^1.2.1", + "router": "^2.2.0", + "send": "^1.1.0", + "serve-static": "^2.2.0", + "statuses": "^2.0.1", + "type-is": "^2.0.1", + "vary": "^1.1.2" + }, + "engines": { + "node": ">= 18" }, - "engines": { - "node": ">= 0.10.0" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" } }, - "node_modules/express/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/express/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/express/node_modules/cookie": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz", + "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } }, "node_modules/extend": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "license": "MIT" }, "node_modules/extend-shallow": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", + "license": "MIT", "dependencies": { "is-extendable": "^0.1.0" }, @@ -5193,24 +6814,26 @@ } }, "node_modules/fast-glob": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", - "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", + "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", + "license": "MIT", "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.4" + "micromatch": "^4.0.8" }, "engines": { "node": ">=8.6.0" } }, "node_modules/fastq": { - "version": "1.17.1", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", - "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", + "version": "1.20.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.20.1.tgz", + "integrity": "sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==", + "license": "ISC", "dependencies": { "reusify": "^1.0.4" } @@ -5219,6 +6842,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/fault/-/fault-2.0.1.tgz", "integrity": "sha512-WtySTkS4OKev5JtpHXnib4Gxiurzh5NCGvWrFaZ34m6JehfTUhKZvn9njTfw48t6JumVQOmrKqpmGcdwxnhqBQ==", + "license": "MIT", "dependencies": { "format": "^0.2.0" }, @@ -5230,12 +6854,14 @@ "node_modules/fflate": { "version": "0.7.4", "resolved": "https://registry.npmjs.org/fflate/-/fflate-0.7.4.tgz", - "integrity": "sha512-5u2V/CDW15QM1XbbgS+0DfPxVB+jUKhWEKuuFuHncbk3tEEqzmoXL+2KyOFuKGqOnmdIy0/davWF1CkuwtibCw==" + "integrity": "sha512-5u2V/CDW15QM1XbbgS+0DfPxVB+jUKhWEKuuFuHncbk3tEEqzmoXL+2KyOFuKGqOnmdIy0/davWF1CkuwtibCw==", + "license": "MIT" }, "node_modules/figures": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/figures/-/figures-6.1.0.tgz", "integrity": "sha512-d+l3qxjSesT4V7v2fh+QnmFnUWv9lSpjarhShNTgBOfA0ttejbQUAlHLitbjkoRiDulW0OPoQPYIGhIC8ohejg==", + "license": "MIT", "dependencies": { "is-unicode-supported": "^2.0.0" }, @@ -5250,6 +6876,7 @@ "version": "7.1.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "license": "MIT", "dependencies": { "to-regex-range": "^5.0.1" }, @@ -5258,118 +6885,113 @@ } }, "node_modules/finalhandler": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", - "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-2.1.1.tgz", + "integrity": "sha512-S8KoZgRZN+a5rNwqTxlZZePjT/4cnm0ROV70LedRHZ0p8u9fRID0hJUZQpkKLzro8LfmC8sx23bY6tVNxv8pQA==", + "license": "MIT", "dependencies": { - "debug": "2.6.9", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "statuses": "2.0.1", - "unpipe": "~1.0.0" + "debug": "^4.4.0", + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "on-finished": "^2.4.1", + "parseurl": "^1.3.3", + "statuses": "^2.0.1" }, "engines": { - "node": ">= 0.8" + "node": ">= 18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" } }, - "node_modules/fkill": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/fkill/-/fkill-9.0.0.tgz", - "integrity": "sha512-MdYSsbdCaIRjzo5edthZtWmEZVMfr1qrtYZUHIdO3swCE+CoZA8S5l0s4jDsYlTa9ZiXv0pTgpzE7s4N8NeUOA==", + "node_modules/find-process": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/find-process/-/find-process-2.0.0.tgz", + "integrity": "sha512-YUBQnteWGASJoEVVsOXy6XtKAY2O1FCsWnnvQ8y0YwgY1rZiKeVptnFvMu6RSELZAJOGklqseTnUGGs5D0bKmg==", + "license": "MIT", "dependencies": { - "aggregate-error": "^5.0.0", - "execa": "^8.0.1", - "pid-port": "^1.0.0", - "process-exists": "^5.0.0", - "ps-list": "^8.1.1", - "taskkill": "^5.0.0" - }, - "engines": { - "node": ">=18" + "chalk": "~4.1.2", + "commander": "^12.1.0", + "loglevel": "^1.9.2" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "bin": { + "find-process": "dist/bin/find-process.js" } }, - "node_modules/fkill/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==", + "node_modules/find-process/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==", + "license": "MIT", "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" + "color-convert": "^2.0.1" }, "engines": { - "node": ">=16.17" + "node": ">=8" }, "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/fkill/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==", + "node_modules/find-process/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, "engines": { - "node": ">=16" + "node": ">=10" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/fkill/node_modules/human-signals": { + "node_modules/find-up": { "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/fkill/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==", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "license": "MIT", + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/fkill/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==", + "node_modules/fkill": { + "version": "10.0.3", + "resolved": "https://registry.npmjs.org/fkill/-/fkill-10.0.3.tgz", + "integrity": "sha512-E0zxFLM/drPziQ8UXxbgD2L1N3oSllgdNJjDOdUNx3g5l9vdouPZiF9up1av27sA9taZmS5VowatuVDNHAUymg==", + "license": "MIT", + "dependencies": { + "execa": "^9.6.0", + "pid-port": "^2.0.0", + "process-exists": "^5.0.0", + "ps-list": "^9.0.0", + "taskkill": "^5.0.0" + }, "engines": { - "node": ">=12" + "node": ">=20" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "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==", + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz", + "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==", + "license": "ISC", "dependencies": { - "cross-spawn": "^7.0.0", + "cross-spawn": "^7.0.6", "signal-exit": "^4.0.1" }, "engines": { @@ -5391,22 +7013,58 @@ "version": "0.2.0", "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "license": "MIT", "engines": { "node": ">= 0.6" } }, + "node_modules/forwarded-parse": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/forwarded-parse/-/forwarded-parse-2.1.2.tgz", + "integrity": "sha512-alTFZZQDKMporBH77856pXgzhEzaUVmLCDk+egLgIgHst3Tpndzz8MnKe+GzRJRfvVdn69HhpW7cmXzvtLvJAw==", + "license": "MIT" + }, + "node_modules/framer-motion": { + "version": "12.29.2", + "resolved": "https://registry.npmjs.org/framer-motion/-/framer-motion-12.29.2.tgz", + "integrity": "sha512-lSNRzBJk4wuIy0emYQ/nfZ7eWhqud2umPKw2QAQki6uKhZPKm2hRQHeQoHTG9MIvfobb+A/LbEWPJU794ZUKrg==", + "license": "MIT", + "dependencies": { + "motion-dom": "^12.29.2", + "motion-utils": "^12.29.2", + "tslib": "^2.4.0" + }, + "peerDependencies": { + "@emotion/is-prop-valid": "*", + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@emotion/is-prop-valid": { + "optional": true + }, + "react": { + "optional": true + }, + "react-dom": { + "optional": true + } + } + }, "node_modules/fresh": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-2.0.0.tgz", + "integrity": "sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==", + "license": "MIT", "engines": { - "node": ">= 0.6" + "node": ">= 0.8" } }, "node_modules/fs-extra": { - "version": "11.2.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.2.0.tgz", - "integrity": "sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==", + "version": "11.3.3", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.3.tgz", + "integrity": "sha512-VWSRii4t0AFm6ixFFmLLx1t7wS1gh+ckoa84aOeapGum0h+EZd1EhEumSB+ZdDLnEPuucsVB9oB7cxJHap6Afg==", + "license": "MIT", "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", @@ -5421,6 +7079,7 @@ "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", "hasInstallScript": true, + "license": "MIT", "optional": true, "os": [ "darwin" @@ -5433,6 +7092,7 @@ "version": "1.1.2", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -5441,6 +7101,7 @@ "version": "1.0.0-beta.2", "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "license": "MIT", "engines": { "node": ">=6.9.0" } @@ -5449,28 +7110,39 @@ "version": "2.0.5", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "license": "ISC", "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==", + "node_modules/get-east-asian-width": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.4.0.tgz", + "integrity": "sha512-QZjmEOC+IT1uk6Rx0sX22V6uHWVwbdbxf1faPqJ1QhLdGgsRGCZoyaQBm/piRdJy/D2um6hM1UP7ZEeQ4EkP+Q==", + "license": "MIT", "engines": { - "node": "*" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/get-intrinsic": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", - "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "license": "MIT", "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", "function-bind": "^1.1.2", - "has-proto": "^1.0.1", - "has-symbols": "^1.0.3", - "hasown": "^2.0.0" + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" }, "engines": { "node": ">= 0.4" @@ -5483,6 +7155,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/get-nonce/-/get-nonce-1.0.1.tgz", "integrity": "sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==", + "license": "MIT", "engines": { "node": ">=6" } @@ -5491,6 +7164,7 @@ "version": "7.1.0", "resolved": "https://registry.npmjs.org/get-port/-/get-port-7.1.0.tgz", "integrity": "sha512-QB9NKEeDg3xxVwCCwJQ9+xycaz6pBB6iQ76wiWMl1927n0Kir6alPiP+yuiICLLU4jpMe08dXfpebuQppFA2zw==", + "license": "MIT", "engines": { "node": ">=16" }, @@ -5498,10 +7172,24 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "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==", + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/get-stream": { "version": "9.0.1", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-9.0.1.tgz", "integrity": "sha512-kVCxPF3vQM/N0B1PmoqVUqgHP+EeVjmZSQn+1oCRPxd2P21P2F19lIgbR3HBosbB1PUhOAoctJnfEn2GbN2eZA==", + "license": "MIT", "dependencies": { "@sec-ant/readable-stream": "^0.4.1", "is-stream": "^4.0.1" @@ -5514,19 +7202,17 @@ } }, "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==", + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-13.0.0.tgz", + "integrity": "sha512-tvZgpqk6fz4BaNZ66ZsRaZnbHvP/jG3uKJvAZOwEVUL4RTA5nJeeLYfyN9/VA8NX/V3IBG+hkeuGpKjvELkVhA==", + "license": "BlueOak-1.0.0", "dependencies": { - "foreground-child": "^3.1.0", - "jackspeak": "^3.1.2", - "minimatch": "^9.0.4", + "minimatch": "^10.1.1", "minipass": "^7.1.2", - "package-json-from-dist": "^1.0.0", - "path-scurry": "^1.11.1" + "path-scurry": "^2.0.0" }, - "bin": { - "glob": "dist/esm/bin.mjs" + "engines": { + "node": "20 || >=22" }, "funding": { "url": "https://github.com/sponsors/isaacs" @@ -5536,6 +7222,7 @@ "version": "5.1.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "license": "ISC", "dependencies": { "is-glob": "^4.0.1" }, @@ -5543,50 +7230,60 @@ "node": ">= 6" } }, - "node_modules/globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "node_modules/glob/node_modules/minimatch": { + "version": "10.1.1", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.1.1.tgz", + "integrity": "sha512-enIvLvRAFZYXJzkCYG5RKmPfrFArdLv+R+lbQ53BmIMLIry74bjKzX6iHAm8WYamJkhSSEabrWN5D97XnKObjQ==", + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/brace-expansion": "^5.0.0" + }, "engines": { - "node": ">=4" + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, "node_modules/globby": { - "version": "14.0.2", - "resolved": "https://registry.npmjs.org/globby/-/globby-14.0.2.tgz", - "integrity": "sha512-s3Fq41ZVh7vbbe2PN3nrW7yC7U7MFVc5c98/iTl9c2GawNMKx/J648KQRW6WKkuU8GIbbh2IXfIRQjOZnXcTnw==", - "dependencies": { - "@sindresorhus/merge-streams": "^2.1.0", - "fast-glob": "^3.3.2", - "ignore": "^5.2.4", - "path-type": "^5.0.0", + "version": "16.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-16.1.0.tgz", + "integrity": "sha512-+A4Hq7m7Ze592k9gZRy4gJ27DrXRNnC1vPjxTt1qQxEY8RxagBkBxivkCwg7FxSTG0iLLEMaUx13oOr0R2/qcQ==", + "license": "MIT", + "dependencies": { + "@sindresorhus/merge-streams": "^4.0.0", + "fast-glob": "^3.3.3", + "ignore": "^7.0.5", + "is-path-inside": "^4.0.0", "slash": "^5.1.0", - "unicorn-magic": "^0.1.0" + "unicorn-magic": "^0.4.0" }, "engines": { - "node": ">=18" + "node": ">=20" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/globby/node_modules/@sindresorhus/merge-streams": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/merge-streams/-/merge-streams-2.3.0.tgz", - "integrity": "sha512-LtoMMhxAlorcGhmFYI+LhPgbPZCkgP6ra1YL604EeF6U98pLlQ3iWIGMdWSC+vWmPBWBNgmDBAhnAobLROJmwg==", + "node_modules/globby/node_modules/unicorn-magic": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/unicorn-magic/-/unicorn-magic-0.4.0.tgz", + "integrity": "sha512-wH590V9VNgYH9g3lH9wWjTrUoKsjLF6sGLjhR4sH1LWpLmCOH0Zf7PukhDA8BiS7KHe4oPNkcTHqYkj7SOGUOw==", + "license": "MIT", "engines": { - "node": ">=18" + "node": ">=20" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/gopd": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", - "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", - "dependencies": { - "get-intrinsic": "^1.1.3" + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "license": "MIT", + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -5595,12 +7292,14 @@ "node_modules/graceful-fs": { "version": "4.2.11", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "license": "ISC" }, "node_modules/graphql": { - "version": "16.9.0", - "resolved": "https://registry.npmjs.org/graphql/-/graphql-16.9.0.tgz", - "integrity": "sha512-GGTKBX4SD7Wdb8mqeDLni2oaRGYQWjWHGKPQ24ZMnUtKfcsVoiv4uX8+LJr1K6U5VW2Lu1BwJnj7uiori0YtRw==", + "version": "16.12.0", + "resolved": "https://registry.npmjs.org/graphql/-/graphql-16.12.0.tgz", + "integrity": "sha512-DKKrynuQRne0PNpEbzuEdHlYOMksHSUI8Zc9Unei5gTsMNA2/vMpoMz/yKba50pejK56qj98qM0SjYxAKi13gQ==", + "license": "MIT", "engines": { "node": "^12.22.0 || ^14.16.0 || ^16.0.0 || >=17.0.0" } @@ -5609,6 +7308,7 @@ "version": "4.0.3", "resolved": "https://registry.npmjs.org/gray-matter/-/gray-matter-4.0.3.tgz", "integrity": "sha512-5v6yZd4JK3eMI3FqqCouswVqwugaA9r4dNZB1wwcmrD02QkV5H0y7XBQW8QwQqEaZY1pM9aqORSORhJRdNK44Q==", + "license": "MIT", "dependencies": { "js-yaml": "^3.13.1", "kind-of": "^6.0.2", @@ -5619,54 +7319,26 @@ "node": ">=6.0" } }, - "node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "engines": { - "node": ">=4" - } - }, - "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/hachure-fill": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/hachure-fill/-/hachure-fill-0.5.2.tgz", + "integrity": "sha512-3GKBOn+m2LX9iq+JC1064cSFprJY4jL1jCXTcpnfER5HYE2l/4EfWSGzkPa/ZDBmYI0ZOEj5VHV/eKnPGkHuOg==", + "license": "MIT" }, - "node_modules/has-proto": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", - "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", + "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==", + "license": "MIT", "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=8" } }, "node_modules/has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", - "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" - }, + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -5678,6 +7350,7 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "license": "MIT", "dependencies": { "function-bind": "^1.1.2" }, @@ -5686,9 +7359,10 @@ } }, "node_modules/hast-util-from-html": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/hast-util-from-html/-/hast-util-from-html-2.0.2.tgz", - "integrity": "sha512-HwOHwxdt2zC5KQ/CNoybBntRook2zJvfZE/u5/Ap7aLPe22bDqen7KwGkOqOyzL5zIqKwiYX/OTtE0FWgr6XXA==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/hast-util-from-html/-/hast-util-from-html-2.0.3.tgz", + "integrity": "sha512-CUSRHXyKjzHov8yKsQjGOElXy/3EKpyX56ELnkHH34vDVw1N1XSQ1ZcAvTyAPtGqLTuKP/uxM+aLkSPqF/EtMw==", + "license": "MIT", "dependencies": { "@types/hast": "^3.0.0", "devlop": "^1.1.0", @@ -5703,15 +7377,16 @@ } }, "node_modules/hast-util-from-parse5": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/hast-util-from-parse5/-/hast-util-from-parse5-8.0.1.tgz", - "integrity": "sha512-Er/Iixbc7IEa7r/XLtuG52zoqn/b3Xng/w6aZQ0xGVxzhw5xUFxcRqdPzP6yFi/4HBYRaifaI5fQ1RH8n0ZeOQ==", + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/hast-util-from-parse5/-/hast-util-from-parse5-8.0.3.tgz", + "integrity": "sha512-3kxEVkEKt0zvcZ3hCRYI8rqrgwtlIOFMWkbclACvjlDw8Li9S2hk/d51OI0nr/gIpdMHNepwgOKqZ/sy0Clpyg==", + "license": "MIT", "dependencies": { "@types/hast": "^3.0.0", "@types/unist": "^3.0.0", "devlop": "^1.0.0", - "hastscript": "^8.0.0", - "property-information": "^6.0.0", + "hastscript": "^9.0.0", + "property-information": "^7.0.0", "vfile": "^6.0.0", "vfile-location": "^5.0.0", "web-namespaces": "^2.0.0" @@ -5721,10 +7396,11 @@ "url": "https://opencollective.com/unified" } }, - "node_modules/hast-util-parse-selector": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/hast-util-parse-selector/-/hast-util-parse-selector-4.0.0.tgz", - "integrity": "sha512-wkQCkSYoOGCRKERFWcxMVMOcYE2K1AaNLU8DXS9arxnLOUEWbOXKXiJUNzEpqZ3JOKpnha3jkFrumEjVliDe7A==", + "node_modules/hast-util-heading-rank": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/hast-util-heading-rank/-/hast-util-heading-rank-3.0.0.tgz", + "integrity": "sha512-EJKb8oMUXVHcWZTDepnr+WNbfnXKFNf9duMesmr4S8SXTJBJ9M4Yok08pu9vxdJwdlGRhVumk9mEhkEvKGifwA==", + "license": "MIT", "dependencies": { "@types/hast": "^3.0.0" }, @@ -5733,24 +7409,26 @@ "url": "https://opencollective.com/unified" } }, - "node_modules/hast-util-raw": { - "version": "9.0.4", - "resolved": "https://registry.npmjs.org/hast-util-raw/-/hast-util-raw-9.0.4.tgz", - "integrity": "sha512-LHE65TD2YiNsHD3YuXcKPHXPLuYh/gjp12mOfU8jxSrm1f/yJpsb0F/KKljS6U9LJoP0Ux+tCe8iJ2AsPzTdgA==", + "node_modules/hast-util-is-element": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/hast-util-is-element/-/hast-util-is-element-3.0.0.tgz", + "integrity": "sha512-Val9mnv2IWpLbNPqc/pUem+a7Ipj2aHacCwgNfTiK0vJKl0LF+4Ba4+v1oPHFpf3bLYmreq0/l3Gud9S5OH42g==", + "license": "MIT", "dependencies": { - "@types/hast": "^3.0.0", - "@types/unist": "^3.0.0", - "@ungap/structured-clone": "^1.0.0", - "hast-util-from-parse5": "^8.0.0", - "hast-util-to-parse5": "^8.0.0", - "html-void-elements": "^3.0.0", - "mdast-util-to-hast": "^13.0.0", - "parse5": "^7.0.0", - "unist-util-position": "^5.0.0", - "unist-util-visit": "^5.0.0", - "vfile": "^6.0.0", - "web-namespaces": "^2.0.0", - "zwitch": "^2.0.0" + "@types/hast": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-parse-selector": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/hast-util-parse-selector/-/hast-util-parse-selector-4.0.0.tgz", + "integrity": "sha512-wkQCkSYoOGCRKERFWcxMVMOcYE2K1AaNLU8DXS9arxnLOUEWbOXKXiJUNzEpqZ3JOKpnha3jkFrumEjVliDe7A==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0" }, "funding": { "type": "opencollective", @@ -5758,9 +7436,10 @@ } }, "node_modules/hast-util-to-estree": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/hast-util-to-estree/-/hast-util-to-estree-3.1.0.tgz", - "integrity": "sha512-lfX5g6hqVh9kjS/B9E2gSkvHH4SZNiQFiqWS0x9fENzEl+8W12RqdRxX6d/Cwxi30tPQs3bIO+aolQJNp1bIyw==", + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/hast-util-to-estree/-/hast-util-to-estree-3.1.3.tgz", + "integrity": "sha512-48+B/rJWAp0jamNbAAf9M7Uf//UVqAoMmgXhBdxTDJLGKY+LRnZ99qcG+Qjl5HfMpYNzS5v4EAwVEF34LeAj7w==", + "license": "MIT", "dependencies": { "@types/estree": "^1.0.0", "@types/estree-jsx": "^1.0.0", @@ -5773,9 +7452,9 @@ "mdast-util-mdx-expression": "^2.0.0", "mdast-util-mdx-jsx": "^3.0.0", "mdast-util-mdxjs-esm": "^2.0.0", - "property-information": "^6.0.0", + "property-information": "^7.0.0", "space-separated-tokens": "^2.0.0", - "style-to-object": "^0.4.0", + "style-to-js": "^1.0.0", "unist-util-position": "^5.0.0", "zwitch": "^2.0.0" }, @@ -5785,19 +7464,19 @@ } }, "node_modules/hast-util-to-html": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/hast-util-to-html/-/hast-util-to-html-9.0.1.tgz", - "integrity": "sha512-hZOofyZANbyWo+9RP75xIDV/gq+OUKx+T46IlwERnKmfpwp81XBFbT9mi26ws+SJchA4RVUQwIBJpqEOBhMzEQ==", + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/hast-util-to-html/-/hast-util-to-html-9.0.5.tgz", + "integrity": "sha512-OguPdidb+fbHQSU4Q4ZiLKnzWo8Wwsf5bZfbvu7//a9oTYoqD/fWpe96NuHkoS9h0ccGOTe0C4NGXdtS0iObOw==", + "license": "MIT", "dependencies": { "@types/hast": "^3.0.0", "@types/unist": "^3.0.0", "ccount": "^2.0.0", "comma-separated-tokens": "^2.0.0", - "hast-util-raw": "^9.0.0", "hast-util-whitespace": "^3.0.0", "html-void-elements": "^3.0.0", "mdast-util-to-hast": "^13.0.0", - "property-information": "^6.0.0", + "property-information": "^7.0.0", "space-separated-tokens": "^2.0.0", "stringify-entities": "^4.0.0", "zwitch": "^2.0.4" @@ -5808,9 +7487,10 @@ } }, "node_modules/hast-util-to-jsx-runtime": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/hast-util-to-jsx-runtime/-/hast-util-to-jsx-runtime-2.3.0.tgz", - "integrity": "sha512-H/y0+IWPdsLLS738P8tDnrQ8Z+dj12zQQ6WC11TIM21C8WFVoIxcqWXf2H3hiTVZjF1AWqoimGwrTWecWrnmRQ==", + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/hast-util-to-jsx-runtime/-/hast-util-to-jsx-runtime-2.3.6.tgz", + "integrity": "sha512-zl6s8LwNyo1P9uw+XJGvZtdFF1GdAkOg8ujOw+4Pyb76874fLps4ueHXDhXWdk6YHQ6OgUtinliG7RsYvCbbBg==", + "license": "MIT", "dependencies": { "@types/estree": "^1.0.0", "@types/hast": "^3.0.0", @@ -5822,9 +7502,9 @@ "mdast-util-mdx-expression": "^2.0.0", "mdast-util-mdx-jsx": "^3.0.0", "mdast-util-mdxjs-esm": "^2.0.0", - "property-information": "^6.0.0", + "property-information": "^7.0.0", "space-separated-tokens": "^2.0.0", - "style-to-object": "^1.0.0", + "style-to-js": "^1.0.0", "unist-util-position": "^5.0.0", "vfile-message": "^4.0.0" }, @@ -5833,41 +7513,11 @@ "url": "https://opencollective.com/unified" } }, - "node_modules/hast-util-to-jsx-runtime/node_modules/inline-style-parser": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.2.3.tgz", - "integrity": "sha512-qlD8YNDqyTKTyuITrDOffsl6Tdhv+UC4hcdAVuQsK4IMQ99nSgd1MIA/Q+jQYoh9r3hVUXhYh7urSRmXPkW04g==" - }, - "node_modules/hast-util-to-jsx-runtime/node_modules/style-to-object": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/style-to-object/-/style-to-object-1.0.6.tgz", - "integrity": "sha512-khxq+Qm3xEyZfKd/y9L3oIWQimxuc4STrQKtQn8aSDRHb8mFgpukgX1hdzfrMEW6JCjyJ8p89x+IUMVnCBI1PA==", - "dependencies": { - "inline-style-parser": "0.2.3" - } - }, - "node_modules/hast-util-to-parse5": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/hast-util-to-parse5/-/hast-util-to-parse5-8.0.0.tgz", - "integrity": "sha512-3KKrV5ZVI8if87DVSi1vDeByYrkGzg4mEfeu4alwgmmIeARiBLKCZS2uw5Gb6nU9x9Yufyj3iudm6i7nl52PFw==", - "dependencies": { - "@types/hast": "^3.0.0", - "comma-separated-tokens": "^2.0.0", - "devlop": "^1.0.0", - "property-information": "^6.0.0", - "space-separated-tokens": "^2.0.0", - "web-namespaces": "^2.0.0", - "zwitch": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, "node_modules/hast-util-whitespace": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/hast-util-whitespace/-/hast-util-whitespace-3.0.0.tgz", "integrity": "sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==", + "license": "MIT", "dependencies": { "@types/hast": "^3.0.0" }, @@ -5877,14 +7527,15 @@ } }, "node_modules/hastscript": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/hastscript/-/hastscript-8.0.0.tgz", - "integrity": "sha512-dMOtzCEd3ABUeSIISmrETiKuyydk1w0pa+gE/uormcTpSYuaNJPbX1NU3JLyscSLjwAQM8bWMhhIlnCqnRvDTw==", + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/hastscript/-/hastscript-9.0.1.tgz", + "integrity": "sha512-g7df9rMFX/SPi34tyGCyUBREQoKkapwdY/T04Qn9TDWfHhAYt4/I0gMVirzK5wEzeUqIjEB+LXC/ypb7Aqno5w==", + "license": "MIT", "dependencies": { "@types/hast": "^3.0.0", "comma-separated-tokens": "^2.0.0", "hast-util-parse-selector": "^4.0.0", - "property-information": "^6.0.0", + "property-information": "^7.0.0", "space-separated-tokens": "^2.0.0" }, "funding": { @@ -5895,12 +7546,14 @@ "node_modules/headers-polyfill": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/headers-polyfill/-/headers-polyfill-4.0.3.tgz", - "integrity": "sha512-IScLbePpkvO846sIwOtOTDjutRMWdXdJmXdMvk6gCBHxFO8d+QKOQedyZSxFTTFYRSmlgSTDtXqqq4pcenBXLQ==" + "integrity": "sha512-IScLbePpkvO846sIwOtOTDjutRMWdXdJmXdMvk6gCBHxFO8d+QKOQedyZSxFTTFYRSmlgSTDtXqqq4pcenBXLQ==", + "license": "MIT" }, "node_modules/hex-rgb": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/hex-rgb/-/hex-rgb-4.3.0.tgz", "integrity": "sha512-Ox1pJVrDCyGHMG9CFg1tmrRUMRPRsAWYc/PinY0XzJU4K7y7vjNoLKIQ7BR5UJMCxNN8EM1MNDmHWA/B3aZUuw==", + "license": "MIT", "engines": { "node": ">=6" }, @@ -5909,94 +7562,135 @@ } }, "node_modules/hls.js": { - "version": "1.5.13", - "resolved": "https://registry.npmjs.org/hls.js/-/hls.js-1.5.13.tgz", - "integrity": "sha512-xRgKo84nsC7clEvSfIdgn/Tc0NOT+d7vdiL/wvkLO+0k0juc26NRBPPG1SfB8pd5bHXIjMW/F5VM8VYYkOYYdw==" + "version": "1.6.15", + "resolved": "https://registry.npmjs.org/hls.js/-/hls.js-1.6.15.tgz", + "integrity": "sha512-E3a5VwgXimGHwpRGV+WxRTKeSp2DW5DI5MWv34ulL3t5UNmyJWCQ1KmLEHbYzcfThfXG8amBL+fCYPneGHC4VA==", + "license": "Apache-2.0" }, "node_modules/html-void-elements": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/html-void-elements/-/html-void-elements-3.0.0.tgz", "integrity": "sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==", + "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" } }, "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==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.1.tgz", + "integrity": "sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==", + "license": "MIT", "dependencies": { - "depd": "2.0.0", - "inherits": "2.0.4", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "toidentifier": "1.0.1" + "depd": "~2.0.0", + "inherits": "~2.0.4", + "setprototypeof": "~1.2.0", + "statuses": "~2.0.2", + "toidentifier": "~1.0.1" }, "engines": { "node": ">= 0.8" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "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==", + "license": "MIT", + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" } }, "node_modules/human-signals": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-7.0.0.tgz", - "integrity": "sha512-74kytxOUSvNbjrT9KisAbaTZ/eJwD/LrbM/kh5j0IhPuJzwuA19dWvniFGwBzN9rVjg+O/e+F310PjObDXS+9Q==", + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-8.0.1.tgz", + "integrity": "sha512-eKCa6bwnJhvxj14kZk5NCPc6Hb6BdsU9DZcOnmQKSnO1VKrfV0zCvtttPZUsBvjmNDn8rpcJfpwSYnHBjc95MQ==", + "license": "Apache-2.0", "engines": { "node": ">=18.18.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==", + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.7.2.tgz", + "integrity": "sha512-im9DjEDQ55s9fL4EYzOAv0yMqmMBSZp6G0VvFyTMPKWxiSBHUj9NW/qqLmXUwXrrM7AvqSlTCfvqRb0cM8yYqw==", + "license": "MIT", "dependencies": { - "safer-buffer": ">= 2.1.2 < 3" + "safer-buffer": ">= 2.1.2 < 3.0.0" }, "engines": { "node": ">=0.10.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" } }, "node_modules/ignore": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", - "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz", + "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==", + "license": "MIT", "engines": { "node": ">= 4" } }, + "node_modules/import-in-the-middle": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/import-in-the-middle/-/import-in-the-middle-2.0.6.tgz", + "integrity": "sha512-3vZV3jX0XRFW3EJDTwzWoZa+RH1b8eTTx6YOCjglrLyPuepwoBti1k3L2dKwdCUrnVEfc5CuRuGstaC/uQJJaw==", + "license": "Apache-2.0", + "dependencies": { + "acorn": "^8.15.0", + "acorn-import-attributes": "^1.9.5", + "cjs-module-lexer": "^2.2.0", + "module-details-from-path": "^1.0.4" + } + }, "node_modules/indent-string": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-5.0.0.tgz", - "integrity": "sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "license": "MIT", "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "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==" + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "license": "ISC" }, "node_modules/inline-style-parser": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.1.1.tgz", - "integrity": "sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q==" + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.2.7.tgz", + "integrity": "sha512-Nb2ctOyNR8DqQoR0OwRG95uNWIC0C1lCgf5Naz5H6Ji72KZ8OcFZLz2P5sNgwlyoJ8Yif11oMuYs5pBQa86csA==", + "license": "MIT" }, - "node_modules/invariant": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", - "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", - "dependencies": { - "loose-envify": "^1.0.0" + "node_modules/internmap": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/internmap/-/internmap-2.0.3.tgz", + "integrity": "sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==", + "license": "ISC", + "engines": { + "node": ">=12" } }, "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==", + "license": "MIT", "engines": { "node": ">= 0.10" } @@ -6005,6 +7699,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-2.0.1.tgz", "integrity": "sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==", + "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" @@ -6014,6 +7709,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-2.0.1.tgz", "integrity": "sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==", + "license": "MIT", "dependencies": { "is-alphabetical": "^2.0.0", "is-decimal": "^2.0.0" @@ -6023,25 +7719,11 @@ "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/is-arguments": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", - "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", - "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - }, - "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==", + "license": "MIT", "dependencies": { "binary-extensions": "^2.0.0" }, @@ -6049,43 +7731,11 @@ "node": ">=8" } }, - "node_modules/is-buffer": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz", - "integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "engines": { - "node": ">=4" - } - }, - "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.15.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.15.1.tgz", - "integrity": "sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ==", + "version": "2.16.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", + "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", + "license": "MIT", "dependencies": { "hasown": "^2.0.2" }, @@ -6100,15 +7750,32 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-2.0.1.tgz", "integrity": "sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-docker": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-3.0.0.tgz", + "integrity": "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==", + "license": "MIT", + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/is-extendable": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", + "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -6117,6 +7784,7 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -6125,28 +7793,16 @@ "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==", + "license": "MIT", "engines": { "node": ">=8" } }, - "node_modules/is-generator-function": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", - "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==", - "dependencies": { - "has-tostringtag": "^1.0.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==", + "license": "MIT", "dependencies": { "is-extglob": "^2.1.1" }, @@ -6158,28 +7814,86 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-2.0.1.tgz", "integrity": "sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==", + "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" } }, + "node_modules/is-in-ssh": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-in-ssh/-/is-in-ssh-1.0.0.tgz", + "integrity": "sha512-jYa6Q9rH90kR1vKB6NM7qqd1mge3Fx4Dhw5TVlK1MUBqhEOuCagrEHMevNuCcbECmXZ0ThXkRm+Ymr51HwEPAw==", + "license": "MIT", + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-inside-container": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-inside-container/-/is-inside-container-1.0.0.tgz", + "integrity": "sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==", + "license": "MIT", + "dependencies": { + "is-docker": "^3.0.0" + }, + "bin": { + "is-inside-container": "cli.js" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-interactive": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-2.0.0.tgz", + "integrity": "sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "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==" + "integrity": "sha512-Vg4o6/fqPxIjtxgUH5QLJhwZ7gW5diGCVlXpuUfELC62CuxM1iHcRe51f2W1FDy04Ai4KJkagKjx3XaqyfRKXw==", + "license": "MIT" }, "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==", + "license": "MIT", "engines": { "node": ">=0.12.0" } }, + "node_modules/is-path-inside": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-4.0.0.tgz", + "integrity": "sha512-lJJV/5dYS+RcL8uQdBDW9c9uWFLLBNRyFhnAKXw5tVqLlKZ4RMGZKv+YQ/IA3OhD+RpbJa1LLFM1FQPGyIXvOA==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/is-plain-obj": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz", "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==", + "license": "MIT", "engines": { "node": ">=12" }, @@ -6187,18 +7901,17 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/is-reference": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/is-reference/-/is-reference-3.0.2.tgz", - "integrity": "sha512-v3rht/LgVcsdZa3O2Nqs+NMowLOxeOm7Ay9+/ARQ2F+qEoANRcqrjAZKGN0v8ymUetZGgkp26LTnGT7H0Qo9Pg==", - "dependencies": { - "@types/estree": "*" - } + "node_modules/is-promise": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-4.0.0.tgz", + "integrity": "sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==", + "license": "MIT" }, "node_modules/is-stream": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-4.0.1.tgz", "integrity": "sha512-Dnz92NInDqYckGEUJv689RbRiTSEHCQ7wOVeALbkOz999YpqT46yMRIGtSNl2iCL1waAZSx40+h59NV/EwzV/A==", + "license": "MIT", "engines": { "node": ">=18" }, @@ -6206,35 +7919,38 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/is-typed-array": { - "version": "1.1.13", - "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.13.tgz", - "integrity": "sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==", - "dependencies": { - "which-typed-array": "^1.1.14" - }, + "node_modules/is-unicode-supported": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-2.1.0.tgz", + "integrity": "sha512-mE00Gnza5EEB3Ds0HfMyllZzbBrmLOX3vfWoj9A9PEnTfratQ/BcaJOuMhnkhjXvb2+FkY3VuHqtAGpTPmglFQ==", + "license": "MIT", "engines": { - "node": ">= 0.4" + "node": ">=18" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/is-unicode-supported": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-2.0.0.tgz", - "integrity": "sha512-FRdAyx5lusK1iHG0TWpVtk9+1i+GjrzRffhDg4ovQ7mcidMQ6mj+MhKPmvh7Xwyv5gIS06ns49CA7Sqg7lC22Q==", + "node_modules/is-wsl": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-3.1.0.tgz", + "integrity": "sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw==", + "license": "MIT", + "dependencies": { + "is-inside-container": "^1.0.0" + }, "engines": { - "node": ">=18" + "node": ">=16" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/isbot": { - "version": "5.1.12", - "resolved": "https://registry.npmjs.org/isbot/-/isbot-5.1.12.tgz", - "integrity": "sha512-Igy8nbj3Yn/XgYboRFTixH5ccUBvNPA89ek2zx3jCcBYkDkEnuFs0RkT36EPag5OFd2nLlK7u4uzG5AXfXR46w==", + "version": "5.1.34", + "resolved": "https://registry.npmjs.org/isbot/-/isbot-5.1.34.tgz", + "integrity": "sha512-aCMIBSKd/XPRYdiCQTLC8QHH4YT8B3JUADu+7COgYIZPvkeoMcUHMRjZLM9/7V8fCj+l7FSREc1lOPNjzogo/A==", + "license": "Unlicense", "engines": { "node": ">=18" } @@ -6242,12 +7958,14 @@ "node_modules/isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "license": "ISC" }, "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==", + "license": "BlueOak-1.0.0", "dependencies": { "@isaacs/cliui": "^8.0.2" }, @@ -6259,9 +7977,10 @@ } }, "node_modules/jose": { - "version": "4.15.9", - "resolved": "https://registry.npmjs.org/jose/-/jose-4.15.9.tgz", - "integrity": "sha512-1vUQX+IdDMVPj4k8kOxgUqlcK518yluMuGZwqlr44FS1ppZB/5GWh4rZG89erpOBOJjU/OBsnCVFfapsRz6nEA==", + "version": "6.1.3", + "resolved": "https://registry.npmjs.org/jose/-/jose-6.1.3.tgz", + "integrity": "sha512-0TpaTfihd4QMNwrz/ob2Bp7X04yuxJkjRGi4aKmOqwhov54i6u79oCv7T+C7lo70MKH6BesI3vscD1yb/yzKXQ==", + "license": "MIT", "funding": { "url": "https://github.com/sponsors/panva" } @@ -6269,12 +7988,14 @@ "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==" + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "license": "MIT" }, "node_modules/js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "version": "3.14.2", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.2.tgz", + "integrity": "sha512-PMSmkqxr106Xa156c2M265Z+FTrPl+oxd/rgOQy2tijQeK5TxQ43psO1ZCwhVOSdnn+RzkzlRz/eY4BgJBYVpg==", + "license": "MIT", "dependencies": { "argparse": "^1.0.7", "esprima": "^4.0.0" @@ -6284,20 +8005,22 @@ } }, "node_modules/jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", + "license": "MIT", "bin": { "jsesc": "bin/jsesc" }, "engines": { - "node": ">=4" + "node": ">=6" } }, "node_modules/json5": { "version": "2.2.3", "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "license": "MIT", "bin": { "json5": "lib/cli.js" }, @@ -6306,9 +8029,10 @@ } }, "node_modules/jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.0.tgz", + "integrity": "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==", + "license": "MIT", "dependencies": { "universalify": "^2.0.0" }, @@ -6316,32 +8040,138 @@ "graceful-fs": "^4.1.6" } }, + "node_modules/katex": { + "version": "0.16.27", + "resolved": "https://registry.npmjs.org/katex/-/katex-0.16.27.tgz", + "integrity": "sha512-aeQoDkuRWSqQN6nSvVCEFvfXdqo1OQiCmmW1kc9xSdjutPv7BGO7pqY9sQRJpMOGrEdfDgF2TfRXe5eUAD2Waw==", + "funding": [ + "https://opencollective.com/katex", + "https://github.com/sponsors/katex" + ], + "license": "MIT", + "dependencies": { + "commander": "^8.3.0" + }, + "bin": { + "katex": "cli.js" + } + }, + "node_modules/katex/node_modules/commander": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", + "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", + "license": "MIT", + "engines": { + "node": ">= 12" + } + }, + "node_modules/khroma": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/khroma/-/khroma-2.1.0.tgz", + "integrity": "sha512-Ls993zuzfayK269Svk9hzpeGUKob/sIgZzyHYdjQoAdQetRKpOLj+k/QQQ/6Qi0Yz65mlROrfd+Ev+1+7dz9Kw==" + }, "node_modules/kind-of": { "version": "6.0.3", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "license": "MIT", "engines": { "node": ">=0.10.0" } }, + "node_modules/langium": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/langium/-/langium-3.3.1.tgz", + "integrity": "sha512-QJv/h939gDpvT+9SiLVlY7tZC3xB2qK57v0J04Sh9wpMb6MP1q8gB21L3WIo8T5P1MSMg3Ep14L7KkDCFG3y4w==", + "license": "MIT", + "dependencies": { + "chevrotain": "~11.0.3", + "chevrotain-allstar": "~0.3.0", + "vscode-languageserver": "~9.0.1", + "vscode-languageserver-textdocument": "~1.0.11", + "vscode-uri": "~3.0.8" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/layout-base": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/layout-base/-/layout-base-1.0.2.tgz", + "integrity": "sha512-8h2oVEZNktL4BH2JCOI90iD1yXwL6iNW7KcCKT2QZgQJR2vbqDsldCTPRU9NifTCqHZci57XvQQ15YTu+sTYPg==", + "license": "MIT" + }, "node_modules/linebreak": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/linebreak/-/linebreak-1.1.0.tgz", "integrity": "sha512-MHp03UImeVhB7XZtjd0E4n6+3xr5Dq/9xI/5FptGk5FrbDR3zagPa2DS6U8ks/3HjbKWG9Q1M2ufOzxV2qLYSQ==", + "license": "MIT", "dependencies": { "base64-js": "0.0.8", "unicode-trie": "^2.0.0" } }, + "node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "license": "MIT", + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/lodash": { "version": "4.17.21", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "license": "MIT" + }, + "node_modules/lodash-es": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz", + "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==", + "license": "MIT" + }, + "node_modules/log-symbols": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-7.0.1.tgz", + "integrity": "sha512-ja1E3yCr9i/0hmBVaM0bfwDjnGy8I/s6PP4DFp+yP+a+mrHO4Rm7DtmnqROTUkHIkqffC84YY7AeqX6oFk0WFg==", + "license": "MIT", + "dependencies": { + "is-unicode-supported": "^2.0.0", + "yoctocolors": "^2.1.1" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/loglevel": { + "version": "1.9.2", + "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.9.2.tgz", + "integrity": "sha512-HgMmCqIJSAKqo68l0rS2AanEWfkxaZ5wNiEFb5ggm08lDs9Xl2KxBlX3PTcaD2chBM1gXAYf491/M2Rv8Jwayg==", + "license": "MIT", + "engines": { + "node": ">= 0.6.0" + }, + "funding": { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/loglevel" + } }, "node_modules/longest-streak": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/longest-streak/-/longest-streak-3.1.0.tgz", "integrity": "sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==", + "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" @@ -6351,6 +8181,7 @@ "version": "1.4.0", "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "license": "MIT", "dependencies": { "js-tokens": "^3.0.0 || ^4.0.0" }, @@ -6358,31 +8189,41 @@ "loose-envify": "cli.js" } }, - "node_modules/loupe": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/loupe/-/loupe-3.1.1.tgz", - "integrity": "sha512-edNu/8D5MKVfGVFRhFf8aAxiTM6Wumfz5XsaatSxlD3w4R1d/WEKUTydCdPGbl9K7QG/Ca3GnDV2sIKIpXRQcw==", - "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==" + "version": "11.2.5", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.2.5.tgz", + "integrity": "sha512-vFrFJkWtJvJnD5hg+hJvVE8Lh/TcMzKnTgCWmtBipwI5yLX/iX+5UB2tfuyODF5E7k9xEzMdYgGqaSb1c0c5Yw==", + "license": "BlueOak-1.0.0", + "engines": { + "node": "20 || >=22" + } }, "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==", + "license": "MIT", "bin": { "lz-string": "bin/bin.js" } }, + "node_modules/magic-string": { + "version": "0.30.8", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.8.tgz", + "integrity": "sha512-ISQTe55T2ao7XtlAStud6qwYPZjE4GK1S/BeVPus4jrq6JuOnQ00YKQC581RWhR122W7msZV263KzVeLoqidyQ==", + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.4.15" + }, + "engines": { + "node": ">=12" + } + }, "node_modules/markdown-extensions": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/markdown-extensions/-/markdown-extensions-2.0.0.tgz", "integrity": "sha512-o5vL7aDWatOTX8LzaS1WMoaoxIiLRQJuIKKe2wAw6IeULDHaqbiqiggmx+pKvZDb1Sj+pE46Sn1T7lCqfFtg1Q==", + "license": "MIT", "engines": { "node": ">=16" }, @@ -6391,18 +8232,51 @@ } }, "node_modules/markdown-table": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-3.0.3.tgz", - "integrity": "sha512-Z1NL3Tb1M9wH4XESsCDEksWoKTdlUafKc4pt0GRwjUyXaCFZ+dc3g2erqB6zm3szA2IUSi7VnPI+o/9jnxh9hw==", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-3.0.4.tgz", + "integrity": "sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw==", + "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" } }, + "node_modules/marked": { + "version": "16.4.2", + "resolved": "https://registry.npmjs.org/marked/-/marked-16.4.2.tgz", + "integrity": "sha512-TI3V8YYWvkVf3KJe1dRkpnjs68JUPyEa5vjKrp1XEEJUAOaQc+Qj+L1qWbPd0SJuAdQkFU0h73sXXqwDYxsiDA==", + "license": "MIT", + "bin": { + "marked": "bin/marked.js" + }, + "engines": { + "node": ">= 20" + } + }, + "node_modules/match-sorter": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/match-sorter/-/match-sorter-8.2.0.tgz", + "integrity": "sha512-qRVB7wYMJXizAWR4TKo5UYwgW7oAVzA8V9jve0wGzRvV91ou9dcqL+/2gJtD0PZ/Pm2Fq6cVT4VHXHmDFVMGRA==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.23.8", + "remove-accents": "0.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==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, "node_modules/md5-hex": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/md5-hex/-/md5-hex-5.0.0.tgz", "integrity": "sha512-18TKd0nxBzMLflLBSCM/I9n50izl7NQGuujgbKjVUs/9acY+a5uzpDUVd4wV130vaK67TzDnPin2gze88u+e4Q==", + "license": "MIT", "dependencies": { "blueimp-md5": "^2.19.0" }, @@ -6414,9 +8288,10 @@ } }, "node_modules/mdast-util-find-and-replace": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/mdast-util-find-and-replace/-/mdast-util-find-and-replace-3.0.1.tgz", - "integrity": "sha512-SG21kZHGC3XRTSUhtofZkBzZTJNM5ecCi0SK2IMKmSXR8vO3peL+kb1O0z7Zl83jKtutG4k5Wv/W7V3/YHvzPA==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/mdast-util-find-and-replace/-/mdast-util-find-and-replace-3.0.2.tgz", + "integrity": "sha512-Tmd1Vg/m3Xz43afeNxDIhWRtFZgM2VLyaf4vSTYwudTyeuTneoL3qtWMA5jeLyz/O1vDJmmV4QuScFCA2tBPwg==", + "license": "MIT", "dependencies": { "@types/mdast": "^4.0.0", "escape-string-regexp": "^5.0.0", @@ -6429,9 +8304,10 @@ } }, "node_modules/mdast-util-from-markdown": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-2.0.1.tgz", - "integrity": "sha512-aJEUyzZ6TzlsX2s5B4Of7lN7EQtAxvtradMMglCQDyaTFgse6CmtmdJ15ElnVRlCg1vpNyVtbem0PWzlNieZsA==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-2.0.2.tgz", + "integrity": "sha512-uZhTV/8NBuw0WHkPTrCqDOl0zVe1BIng5ZtHoDk49ME1qqcjYmmLmOf0gELgcRMxN4w2iuIeVso5/6QymSrgmA==", + "license": "MIT", "dependencies": { "@types/mdast": "^4.0.0", "@types/unist": "^3.0.0", @@ -6455,6 +8331,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/mdast-util-frontmatter/-/mdast-util-frontmatter-2.0.1.tgz", "integrity": "sha512-LRqI9+wdgC25P0URIJY9vwocIzCcksduHQ9OF2joxQoyTNVduwLAFUzjoopuRJbJAReaKrNQKAZKL3uCMugWJA==", + "license": "MIT", "dependencies": { "@types/mdast": "^4.0.0", "devlop": "^1.0.0", @@ -6469,9 +8346,10 @@ } }, "node_modules/mdast-util-gfm": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/mdast-util-gfm/-/mdast-util-gfm-3.0.0.tgz", - "integrity": "sha512-dgQEX5Amaq+DuUqf26jJqSK9qgixgd6rYDHAv4aTBuA92cTknZlKpPfa86Z/s8Dj8xsAQpFfBmPUHWJBWqS4Bw==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm/-/mdast-util-gfm-3.1.0.tgz", + "integrity": "sha512-0ulfdQOM3ysHhCJ1p06l0b0VKlhU0wuQs3thxZQagjcjPrlFRqY215uZGHHJan9GEAXd9MbfPjFJz+qMkVR6zQ==", + "license": "MIT", "dependencies": { "mdast-util-from-markdown": "^2.0.0", "mdast-util-gfm-autolink-literal": "^2.0.0", @@ -6490,6 +8368,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/mdast-util-gfm-autolink-literal/-/mdast-util-gfm-autolink-literal-2.0.1.tgz", "integrity": "sha512-5HVP2MKaP6L+G6YaxPNjuL0BPrq9orG3TsrZ9YXbA3vDw/ACI4MEsnoDpn6ZNm7GnZgtAcONJyPhOP8tNJQavQ==", + "license": "MIT", "dependencies": { "@types/mdast": "^4.0.0", "ccount": "^2.0.0", @@ -6503,9 +8382,10 @@ } }, "node_modules/mdast-util-gfm-footnote": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/mdast-util-gfm-footnote/-/mdast-util-gfm-footnote-2.0.0.tgz", - "integrity": "sha512-5jOT2boTSVkMnQ7LTrd6n/18kqwjmuYqo7JUPe+tRCY6O7dAuTFMtTPauYYrMPpox9hlN0uOx/FL8XvEfG9/mQ==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-footnote/-/mdast-util-gfm-footnote-2.1.0.tgz", + "integrity": "sha512-sqpDWlsHn7Ac9GNZQMeUzPQSMzR6Wv0WKRNvQRg0KqHh02fpTz69Qc1QSseNX29bhz1ROIyNyxExfawVKTm1GQ==", + "license": "MIT", "dependencies": { "@types/mdast": "^4.0.0", "devlop": "^1.1.0", @@ -6522,6 +8402,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/mdast-util-gfm-strikethrough/-/mdast-util-gfm-strikethrough-2.0.0.tgz", "integrity": "sha512-mKKb915TF+OC5ptj5bJ7WFRPdYtuHv0yTRxK2tJvi+BDqbkiG7h7u/9SI89nRAYcmap2xHQL9D+QG/6wSrTtXg==", + "license": "MIT", "dependencies": { "@types/mdast": "^4.0.0", "mdast-util-from-markdown": "^2.0.0", @@ -6536,6 +8417,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/mdast-util-gfm-table/-/mdast-util-gfm-table-2.0.0.tgz", "integrity": "sha512-78UEvebzz/rJIxLvE7ZtDd/vIQ0RHv+3Mh5DR96p7cS7HsBhYIICDBCu8csTNWNO6tBWfqXPWekRuj2FNOGOZg==", + "license": "MIT", "dependencies": { "@types/mdast": "^4.0.0", "devlop": "^1.0.0", @@ -6552,6 +8434,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/mdast-util-gfm-task-list-item/-/mdast-util-gfm-task-list-item-2.0.0.tgz", "integrity": "sha512-IrtvNvjxC1o06taBAVJznEnkiHxLFTzgonUdy8hzFVeDun0uTjxxrRGVaNFqkU1wJR3RBPEfsxmU6jDWPofrTQ==", + "license": "MIT", "dependencies": { "@types/mdast": "^4.0.0", "devlop": "^1.0.0", @@ -6567,6 +8450,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/mdast-util-mdx/-/mdast-util-mdx-3.0.0.tgz", "integrity": "sha512-JfbYLAW7XnYTTbUsmpu0kdBUVe+yKVJZBItEjwyYJiDJuZ9w4eeaqks4HQO+R7objWgS2ymV60GYpI14Ug554w==", + "license": "MIT", "dependencies": { "mdast-util-from-markdown": "^2.0.0", "mdast-util-mdx-expression": "^2.0.0", @@ -6580,9 +8464,10 @@ } }, "node_modules/mdast-util-mdx-expression": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/mdast-util-mdx-expression/-/mdast-util-mdx-expression-2.0.0.tgz", - "integrity": "sha512-fGCu8eWdKUKNu5mohVGkhBXCXGnOTLuFqOvGMvdikr+J1w7lDJgxThOKpwRWzzbyXAU2hhSwsmssOY4yTokluw==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mdast-util-mdx-expression/-/mdast-util-mdx-expression-2.0.1.tgz", + "integrity": "sha512-J6f+9hUp+ldTZqKRSg7Vw5V6MqjATc+3E4gf3CFNcuZNWD8XdyI6zQ8GqH7f8169MM6P7hMBRDVGnn7oHB9kXQ==", + "license": "MIT", "dependencies": { "@types/estree-jsx": "^1.0.0", "@types/hast": "^3.0.0", @@ -6597,9 +8482,10 @@ } }, "node_modules/mdast-util-mdx-jsx": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/mdast-util-mdx-jsx/-/mdast-util-mdx-jsx-3.1.2.tgz", - "integrity": "sha512-eKMQDeywY2wlHc97k5eD8VC+9ASMjN8ItEZQNGwJ6E0XWKiW/Z0V5/H8pvoXUf+y+Mj0VIgeRRbujBmFn4FTyA==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/mdast-util-mdx-jsx/-/mdast-util-mdx-jsx-3.2.0.tgz", + "integrity": "sha512-lj/z8v0r6ZtsN/cGNNtemmmfoLAFZnjMbNyLzBafjzikOM+glrjNHPlf6lQDOTccj9n5b0PPihEBbhneMyGs1Q==", + "license": "MIT", "dependencies": { "@types/estree-jsx": "^1.0.0", "@types/hast": "^3.0.0", @@ -6611,7 +8497,6 @@ "mdast-util-to-markdown": "^2.0.0", "parse-entities": "^4.0.0", "stringify-entities": "^4.0.0", - "unist-util-remove-position": "^5.0.0", "unist-util-stringify-position": "^4.0.0", "vfile-message": "^4.0.0" }, @@ -6624,6 +8509,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/mdast-util-mdxjs-esm/-/mdast-util-mdxjs-esm-2.0.1.tgz", "integrity": "sha512-EcmOpxsZ96CvlP03NghtH1EsLtr0n9Tm4lPUJUBccV9RwUOneqSycg19n5HGzCf+10LozMRSObtVr3ee1WoHtg==", + "license": "MIT", "dependencies": { "@types/estree-jsx": "^1.0.0", "@types/hast": "^3.0.0", @@ -6641,6 +8527,7 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/mdast-util-phrasing/-/mdast-util-phrasing-4.1.0.tgz", "integrity": "sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w==", + "license": "MIT", "dependencies": { "@types/mdast": "^4.0.0", "unist-util-is": "^6.0.0" @@ -6651,9 +8538,10 @@ } }, "node_modules/mdast-util-to-hast": { - "version": "13.2.0", - "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-13.2.0.tgz", - "integrity": "sha512-QGYKEuUsYT9ykKBCMOEDLsU5JRObWQusAolFMeko/tYPufNkRffBAQjIE+99jbA87xv6FgmjLtwjh9wBWajwAA==", + "version": "13.2.1", + "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-13.2.1.tgz", + "integrity": "sha512-cctsq2wp5vTsLIcaymblUriiTcZd0CwWtCbLvrOzYCDZoWyMNV8sZ7krj09FSnsiJi3WVsHLM4k6Dq/yaPyCXA==", + "license": "MIT", "dependencies": { "@types/hast": "^3.0.0", "@types/mdast": "^4.0.0", @@ -6671,15 +8559,17 @@ } }, "node_modules/mdast-util-to-markdown": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mdast-util-to-markdown/-/mdast-util-to-markdown-2.1.0.tgz", - "integrity": "sha512-SR2VnIEdVNCJbP6y7kVTJgPLifdr8WEU440fQec7qHoHOUz/oJ2jmNRqdDQ3rbiStOXb2mCDGTuwsK5OPUgYlQ==", + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/mdast-util-to-markdown/-/mdast-util-to-markdown-2.1.2.tgz", + "integrity": "sha512-xj68wMTvGXVOKonmog6LwyJKrYXZPvlwabaryTjLh9LuvovB/KAH+kvi8Gjj+7rJjsFi23nkUxRQv1KqSroMqA==", + "license": "MIT", "dependencies": { "@types/mdast": "^4.0.0", "@types/unist": "^3.0.0", "longest-streak": "^3.0.0", "mdast-util-phrasing": "^4.0.0", "mdast-util-to-string": "^4.0.0", + "micromark-util-classify-character": "^2.0.0", "micromark-util-decode-string": "^2.0.0", "unist-util-visit": "^5.0.0", "zwitch": "^2.0.0" @@ -6693,6 +8583,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-4.0.0.tgz", "integrity": "sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==", + "license": "MIT", "dependencies": { "@types/mdast": "^4.0.0" }, @@ -6702,9 +8593,10 @@ } }, "node_modules/mdx-bundler": { - "version": "10.0.3", - "resolved": "https://registry.npmjs.org/mdx-bundler/-/mdx-bundler-10.0.3.tgz", - "integrity": "sha512-vRtVZ5t+nUP0QtoRVgjDFO10YDjRgKe/19ie0IR8FqE8SugNn5RP4sCWBPzKoEwoGbqfQOrgHy+PHCVyfaCDQQ==", + "version": "10.1.1", + "resolved": "https://registry.npmjs.org/mdx-bundler/-/mdx-bundler-10.1.1.tgz", + "integrity": "sha512-87FtxC7miUPznwqEaAlJARinHJ6Qin9kDuG2E2BCCNEOszr62kHpqivI/IF/CmwObVSpvApVFFxN1ftM/Gykvw==", + "license": "MIT", "dependencies": { "@babel/runtime": "^7.23.2", "@esbuild-plugins/node-resolve": "^0.2.2", @@ -6725,53 +8617,101 @@ } }, "node_modules/media-chrome": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/media-chrome/-/media-chrome-3.2.3.tgz", - "integrity": "sha512-DlOlyciT5YgOn5cwGvLWz+OVUVgvyxsRLtfpIQJ11F10+Ix7tDjEqMWsnkL81be9iD3uh/SN35TIk2pRvvEAig==" + "version": "4.17.2", + "resolved": "https://registry.npmjs.org/media-chrome/-/media-chrome-4.17.2.tgz", + "integrity": "sha512-o/IgiHx0tdSVwRxxqF5H12FK31A/A8T71sv3KdAvh7b6XeBS9dXwqvIFwlR9kdEuqg3n7xpmRIuL83rmYq8FTg==", + "license": "MIT", + "dependencies": { + "ce-la-react": "^0.3.2" + } }, "node_modules/media-tracks": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/media-tracks/-/media-tracks-0.3.3.tgz", - "integrity": "sha512-9P2FuUHnZZ3iji+2RQk7Zkh5AmZTnOG5fODACnjhCVveX1McY3jmCRHofIEI+yTBqplz7LXy48c7fQ3Uigp88w==" + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/media-tracks/-/media-tracks-0.3.4.tgz", + "integrity": "sha512-5SUElzGMYXA7bcyZBL1YzLTxH9Iyw1AeYNJxzByqbestrrtB0F3wfiWUr7aROpwodO4fwnxOt78Xjb3o3ONNQg==", + "license": "MIT" }, "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==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-1.1.0.tgz", + "integrity": "sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==", + "license": "MIT", "engines": { - "node": ">= 0.6" + "node": ">= 0.8" } }, "node_modules/merge-descriptors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", - "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==" + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-2.0.0.tgz", + "integrity": "sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "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==" + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "license": "MIT" }, "node_modules/merge2": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "license": "MIT", "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/mermaid": { + "version": "11.12.2", + "resolved": "https://registry.npmjs.org/mermaid/-/mermaid-11.12.2.tgz", + "integrity": "sha512-n34QPDPEKmaeCG4WDMGy0OT6PSyxKCfy2pJgShP+Qow2KLrvWjclwbc3yXfSIf4BanqWEhQEpngWwNp/XhZt6w==", + "license": "MIT", + "dependencies": { + "@braintree/sanitize-url": "^7.1.1", + "@iconify/utils": "^3.0.1", + "@mermaid-js/parser": "^0.6.3", + "@types/d3": "^7.4.3", + "cytoscape": "^3.29.3", + "cytoscape-cose-bilkent": "^4.1.0", + "cytoscape-fcose": "^2.2.0", + "d3": "^7.9.0", + "d3-sankey": "^0.12.3", + "dagre-d3-es": "7.0.13", + "dayjs": "^1.11.18", + "dompurify": "^3.2.5", + "katex": "^0.16.22", + "khroma": "^2.1.0", + "lodash-es": "^4.17.21", + "marked": "^16.2.1", + "roughjs": "^4.6.6", + "stylis": "^4.3.6", + "ts-dedent": "^2.2.0", + "uuid": "^11.1.0" + } + }, + "node_modules/mermaid/node_modules/uuid": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-11.1.0.tgz", + "integrity": "sha512-0/A9rDy9P7cJ+8w1c9WD9V//9Wj15Ce2MPz8Ri6032usz+NfePxx5AcN3bN+r6ZL6jEo066/yNYB3tn4pQEx+A==", + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "license": "MIT", + "bin": { + "uuid": "dist/esm/bin/uuid" } }, "node_modules/micromark": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/micromark/-/micromark-4.0.0.tgz", - "integrity": "sha512-o/sd0nMof8kYff+TqcDx3VSrgBTcZpSvYcAHIfHhv5VAuNmisCxjhx6YmxS8PFEpb9z5WKWKPdzf0jM23ro3RQ==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/micromark/-/micromark-4.0.2.tgz", + "integrity": "sha512-zpe98Q6kvavpCr1NPVSCMebCKfD7CA2NqZ+rykeNhONIJBpc1tFKt9hucLGwha3jNTNI8lHpctWJWoimVF4PfA==", "funding": [ { "type": "GitHub Sponsors", @@ -6782,6 +8722,7 @@ "url": "https://opencollective.com/unified" } ], + "license": "MIT", "dependencies": { "@types/debug": "^4.0.0", "debug": "^4.0.0", @@ -6803,9 +8744,9 @@ } }, "node_modules/micromark-core-commonmark": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-core-commonmark/-/micromark-core-commonmark-2.0.1.tgz", - "integrity": "sha512-CUQyKr1e///ZODyD1U3xit6zXwy1a8q2a1S1HKtIlmgvurrEpaw/Y9y6KSIbF8P59cn/NjzHyO+Q2fAyYLQrAA==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/micromark-core-commonmark/-/micromark-core-commonmark-2.0.3.tgz", + "integrity": "sha512-RDBrHEMSxVFLg6xvnXmb1Ayr2WzLAWjeSATAoxwKYJV94TeNavgoIdA0a9ytzDSVzBy2YKFK+emCPOEibLeCrg==", "funding": [ { "type": "GitHub Sponsors", @@ -6816,6 +8757,7 @@ "url": "https://opencollective.com/unified" } ], + "license": "MIT", "dependencies": { "decode-named-character-reference": "^1.0.0", "devlop": "^1.0.0", @@ -6839,6 +8781,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/micromark-extension-frontmatter/-/micromark-extension-frontmatter-2.0.0.tgz", "integrity": "sha512-C4AkuM3dA58cgZha7zVnuVxBhDsbttIMiytjgsM2XbHAB2faRVaHRle40558FBN+DJcrLNCoqG5mlrpdU4cRtg==", + "license": "MIT", "dependencies": { "fault": "^2.0.0", "micromark-util-character": "^2.0.0", @@ -6854,6 +8797,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/micromark-extension-gfm/-/micromark-extension-gfm-3.0.0.tgz", "integrity": "sha512-vsKArQsicm7t0z2GugkCKtZehqUm31oeGBV/KVSorWSy8ZlNAv7ytjFhvaryUiCUJYqs+NoE6AFhpQvBTM6Q4w==", + "license": "MIT", "dependencies": { "micromark-extension-gfm-autolink-literal": "^2.0.0", "micromark-extension-gfm-footnote": "^2.0.0", @@ -6873,6 +8817,7 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/micromark-extension-gfm-autolink-literal/-/micromark-extension-gfm-autolink-literal-2.1.0.tgz", "integrity": "sha512-oOg7knzhicgQ3t4QCjCWgTmfNhvQbDDnJeVu9v81r7NltNCVmhPy1fJRX27pISafdjL+SVc4d3l48Gb6pbRypw==", + "license": "MIT", "dependencies": { "micromark-util-character": "^2.0.0", "micromark-util-sanitize-uri": "^2.0.0", @@ -6888,6 +8833,7 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/micromark-extension-gfm-footnote/-/micromark-extension-gfm-footnote-2.1.0.tgz", "integrity": "sha512-/yPhxI1ntnDNsiHtzLKYnE3vf9JZ6cAisqVDauhp4CEHxlb4uoOTxOCJ+9s51bIB8U1N1FJ1RXOKTIlD5B/gqw==", + "license": "MIT", "dependencies": { "devlop": "^1.0.0", "micromark-core-commonmark": "^2.0.0", @@ -6907,6 +8853,7 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/micromark-extension-gfm-strikethrough/-/micromark-extension-gfm-strikethrough-2.1.0.tgz", "integrity": "sha512-ADVjpOOkjz1hhkZLlBiYA9cR2Anf8F4HqZUO6e5eDcPQd0Txw5fxLzzxnEkSkfnD0wziSGiv7sYhk/ktvbf1uw==", + "license": "MIT", "dependencies": { "devlop": "^1.0.0", "micromark-util-chunked": "^2.0.0", @@ -6921,9 +8868,10 @@ } }, "node_modules/micromark-extension-gfm-table": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm-table/-/micromark-extension-gfm-table-2.1.0.tgz", - "integrity": "sha512-Ub2ncQv+fwD70/l4ou27b4YzfNaCJOvyX4HxXU15m7mpYY+rjuWzsLIPZHJL253Z643RpbcP1oeIJlQ/SKW67g==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-table/-/micromark-extension-gfm-table-2.1.1.tgz", + "integrity": "sha512-t2OU/dXXioARrC6yWfJ4hqB7rct14e8f7m0cbI5hUmDyyIlwv5vEtooptH8INkbLzOatzKuVbQmAYcbWoyz6Dg==", + "license": "MIT", "dependencies": { "devlop": "^1.0.0", "micromark-factory-space": "^2.0.0", @@ -6940,6 +8888,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/micromark-extension-gfm-tagfilter/-/micromark-extension-gfm-tagfilter-2.0.0.tgz", "integrity": "sha512-xHlTOmuCSotIA8TW1mDIM6X2O1SiX5P9IuDtqGonFhEK0qgRI4yeC6vMxEV2dgyr2TiD+2PQ10o+cOhdVAcwfg==", + "license": "MIT", "dependencies": { "micromark-util-types": "^2.0.0" }, @@ -6952,6 +8901,7 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/micromark-extension-gfm-task-list-item/-/micromark-extension-gfm-task-list-item-2.1.0.tgz", "integrity": "sha512-qIBZhqxqI6fjLDYFTBIa4eivDMnP+OZqsNwmQ3xNLE4Cxwc+zfQEfbs6tzAo2Hjq+bh6q5F+Z8/cksrLFYWQQw==", + "license": "MIT", "dependencies": { "devlop": "^1.0.0", "micromark-factory-space": "^2.0.0", @@ -6965,9 +8915,9 @@ } }, "node_modules/micromark-extension-mdx-expression": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/micromark-extension-mdx-expression/-/micromark-extension-mdx-expression-3.0.0.tgz", - "integrity": "sha512-sI0nwhUDz97xyzqJAbHQhp5TfaxEvZZZ2JDqUo+7NvyIYG6BZ5CPPqj2ogUoPJlmXHBnyZUzISg9+oUmU6tUjQ==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/micromark-extension-mdx-expression/-/micromark-extension-mdx-expression-3.0.1.tgz", + "integrity": "sha512-dD/ADLJ1AeMvSAKBwO22zG22N4ybhe7kFIZ3LsDI0GlsNr2A3KYxb0LdC1u5rj4Nw+CHKY0RVdnHX8vj8ejm4Q==", "funding": [ { "type": "GitHub Sponsors", @@ -6978,6 +8928,7 @@ "url": "https://opencollective.com/unified" } ], + "license": "MIT", "dependencies": { "@types/estree": "^1.0.0", "devlop": "^1.0.0", @@ -6990,17 +8941,18 @@ } }, "node_modules/micromark-extension-mdx-jsx": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/micromark-extension-mdx-jsx/-/micromark-extension-mdx-jsx-3.0.0.tgz", - "integrity": "sha512-uvhhss8OGuzR4/N17L1JwvmJIpPhAd8oByMawEKx6NVdBCbesjH4t+vjEp3ZXft9DwvlKSD07fCeI44/N0Vf2w==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/micromark-extension-mdx-jsx/-/micromark-extension-mdx-jsx-3.0.2.tgz", + "integrity": "sha512-e5+q1DjMh62LZAJOnDraSSbDMvGJ8x3cbjygy2qFEi7HCeUT4BDKCvMozPozcD6WmOt6sVvYDNBKhFSz3kjOVQ==", + "license": "MIT", "dependencies": { - "@types/acorn": "^4.0.0", "@types/estree": "^1.0.0", "devlop": "^1.0.0", "estree-util-is-identifier-name": "^3.0.0", "micromark-factory-mdx-expression": "^2.0.0", "micromark-factory-space": "^2.0.0", "micromark-util-character": "^2.0.0", + "micromark-util-events-to-acorn": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0", "vfile-message": "^4.0.0" @@ -7014,6 +8966,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/micromark-extension-mdx-md/-/micromark-extension-mdx-md-2.0.0.tgz", "integrity": "sha512-EpAiszsB3blw4Rpba7xTOUptcFeBFi+6PY8VnJ2hhimH+vCQDirWgsMpz7w1XcZE7LVrSAUGb9VJpG9ghlYvYQ==", + "license": "MIT", "dependencies": { "micromark-util-types": "^2.0.0" }, @@ -7026,6 +8979,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/micromark-extension-mdxjs/-/micromark-extension-mdxjs-3.0.0.tgz", "integrity": "sha512-A873fJfhnJ2siZyUrJ31l34Uqwy4xIFmvPY1oj+Ean5PHcPBYzEsvqvWGaWcfEIr11O5Dlw3p2y0tZWpKHDejQ==", + "license": "MIT", "dependencies": { "acorn": "^8.0.0", "acorn-jsx": "^5.0.0", @@ -7045,6 +8999,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/micromark-extension-mdxjs-esm/-/micromark-extension-mdxjs-esm-3.0.0.tgz", "integrity": "sha512-DJFl4ZqkErRpq/dAPyeWp15tGrcrrJho1hKK5uBS70BCtfrIFg81sqcTVu3Ta+KD1Tk5vAtBNElWxtAa+m8K9A==", + "license": "MIT", "dependencies": { "@types/estree": "^1.0.0", "devlop": "^1.0.0", @@ -7062,9 +9017,9 @@ } }, "node_modules/micromark-factory-destination": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-factory-destination/-/micromark-factory-destination-2.0.0.tgz", - "integrity": "sha512-j9DGrQLm/Uhl2tCzcbLhy5kXsgkHUrjJHg4fFAeoMRwJmJerT9aw4FEhIbZStWN8A3qMwOp1uzHr4UL8AInxtA==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-destination/-/micromark-factory-destination-2.0.1.tgz", + "integrity": "sha512-Xe6rDdJlkmbFRExpTOmRj9N3MaWmbAgdpSrBQvCFqhezUn4AHqJHbaEnfbVYYiexVSs//tqOdY/DxhjdCiJnIA==", "funding": [ { "type": "GitHub Sponsors", @@ -7075,6 +9030,7 @@ "url": "https://opencollective.com/unified" } ], + "license": "MIT", "dependencies": { "micromark-util-character": "^2.0.0", "micromark-util-symbol": "^2.0.0", @@ -7082,9 +9038,9 @@ } }, "node_modules/micromark-factory-label": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-factory-label/-/micromark-factory-label-2.0.0.tgz", - "integrity": "sha512-RR3i96ohZGde//4WSe/dJsxOX6vxIg9TimLAS3i4EhBAFx8Sm5SmqVfR8E87DPSR31nEAjZfbt91OMZWcNgdZw==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-label/-/micromark-factory-label-2.0.1.tgz", + "integrity": "sha512-VFMekyQExqIW7xIChcXn4ok29YE3rnuyveW3wZQWWqF4Nv9Wk5rgJ99KzPvHjkmPXF93FXIbBp6YdW3t71/7Vg==", "funding": [ { "type": "GitHub Sponsors", @@ -7095,6 +9051,7 @@ "url": "https://opencollective.com/unified" } ], + "license": "MIT", "dependencies": { "devlop": "^1.0.0", "micromark-util-character": "^2.0.0", @@ -7103,9 +9060,9 @@ } }, "node_modules/micromark-factory-mdx-expression": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-factory-mdx-expression/-/micromark-factory-mdx-expression-2.0.1.tgz", - "integrity": "sha512-F0ccWIUHRLRrYp5TC9ZYXmZo+p2AM13ggbsW4T0b5CRKP8KHVRB8t4pwtBgTxtjRmwrK0Irwm7vs2JOZabHZfg==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/micromark-factory-mdx-expression/-/micromark-factory-mdx-expression-2.0.3.tgz", + "integrity": "sha512-kQnEtA3vzucU2BkrIa8/VaSAsP+EJ3CKOvhMuJgOEGg9KDC6OAY6nSnNDVRiVNRqj7Y4SlSzcStaH/5jge8JdQ==", "funding": [ { "type": "GitHub Sponsors", @@ -7116,9 +9073,11 @@ "url": "https://opencollective.com/unified" } ], + "license": "MIT", "dependencies": { "@types/estree": "^1.0.0", "devlop": "^1.0.0", + "micromark-factory-space": "^2.0.0", "micromark-util-character": "^2.0.0", "micromark-util-events-to-acorn": "^2.0.0", "micromark-util-symbol": "^2.0.0", @@ -7128,9 +9087,9 @@ } }, "node_modules/micromark-factory-space": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.0.tgz", - "integrity": "sha512-TKr+LIDX2pkBJXFLzpyPyljzYK3MtmllMUMODTQJIUfDGncESaqB90db9IAUcz4AZAJFdd8U9zOp9ty1458rxg==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz", + "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==", "funding": [ { "type": "GitHub Sponsors", @@ -7141,15 +9100,16 @@ "url": "https://opencollective.com/unified" } ], + "license": "MIT", "dependencies": { "micromark-util-character": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "node_modules/micromark-factory-title": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-factory-title/-/micromark-factory-title-2.0.0.tgz", - "integrity": "sha512-jY8CSxmpWLOxS+t8W+FG3Xigc0RDQA9bKMY/EwILvsesiRniiVMejYTE4wumNc2f4UbAa4WsHqe3J1QS1sli+A==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-title/-/micromark-factory-title-2.0.1.tgz", + "integrity": "sha512-5bZ+3CjhAd9eChYTHsjy6TGxpOFSKgKKJPJxr293jTbfry2KDoWkhBb6TcPVB4NmzaPhMs1Frm9AZH7OD4Cjzw==", "funding": [ { "type": "GitHub Sponsors", @@ -7160,6 +9120,7 @@ "url": "https://opencollective.com/unified" } ], + "license": "MIT", "dependencies": { "micromark-factory-space": "^2.0.0", "micromark-util-character": "^2.0.0", @@ -7168,9 +9129,9 @@ } }, "node_modules/micromark-factory-whitespace": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-factory-whitespace/-/micromark-factory-whitespace-2.0.0.tgz", - "integrity": "sha512-28kbwaBjc5yAI1XadbdPYHX/eDnqaUFVikLwrO7FDnKG7lpgxnvk/XGRhX/PN0mOZ+dBSZ+LgunHS+6tYQAzhA==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-whitespace/-/micromark-factory-whitespace-2.0.1.tgz", + "integrity": "sha512-Ob0nuZ3PKt/n0hORHyvoD9uZhr+Za8sFoP+OnMcnWK5lngSzALgQYKMr9RJVOWLqQYuyn6ulqGWSXdwf6F80lQ==", "funding": [ { "type": "GitHub Sponsors", @@ -7181,6 +9142,7 @@ "url": "https://opencollective.com/unified" } ], + "license": "MIT", "dependencies": { "micromark-factory-space": "^2.0.0", "micromark-util-character": "^2.0.0", @@ -7189,9 +9151,9 @@ } }, "node_modules/micromark-util-character": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.0.tgz", - "integrity": "sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", "funding": [ { "type": "GitHub Sponsors", @@ -7202,15 +9164,16 @@ "url": "https://opencollective.com/unified" } ], + "license": "MIT", "dependencies": { "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "node_modules/micromark-util-chunked": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-chunked/-/micromark-util-chunked-2.0.0.tgz", - "integrity": "sha512-anK8SWmNphkXdaKgz5hJvGa7l00qmcaUQoMYsBwDlSKFKjc6gjGXPDw3FNL3Nbwq5L8gE+RCbGqTw49FK5Qyvg==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-chunked/-/micromark-util-chunked-2.0.1.tgz", + "integrity": "sha512-QUNFEOPELfmvv+4xiNg2sRYeS/P84pTW0TCgP5zc9FpXetHY0ab7SxKyAQCNCc1eK0459uoLI1y5oO5Vc1dbhA==", "funding": [ { "type": "GitHub Sponsors", @@ -7221,14 +9184,15 @@ "url": "https://opencollective.com/unified" } ], + "license": "MIT", "dependencies": { "micromark-util-symbol": "^2.0.0" } }, "node_modules/micromark-util-classify-character": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-classify-character/-/micromark-util-classify-character-2.0.0.tgz", - "integrity": "sha512-S0ze2R9GH+fu41FA7pbSqNWObo/kzwf8rN/+IGlW/4tC6oACOs8B++bh+i9bVyNnwCcuksbFwsBme5OCKXCwIw==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-classify-character/-/micromark-util-classify-character-2.0.1.tgz", + "integrity": "sha512-K0kHzM6afW/MbeWYWLjoHQv1sgg2Q9EccHEDzSkxiP/EaagNzCm7T/WMKZ3rjMbvIpvBiZgwR3dKMygtA4mG1Q==", "funding": [ { "type": "GitHub Sponsors", @@ -7239,6 +9203,7 @@ "url": "https://opencollective.com/unified" } ], + "license": "MIT", "dependencies": { "micromark-util-character": "^2.0.0", "micromark-util-symbol": "^2.0.0", @@ -7246,9 +9211,9 @@ } }, "node_modules/micromark-util-combine-extensions": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-combine-extensions/-/micromark-util-combine-extensions-2.0.0.tgz", - "integrity": "sha512-vZZio48k7ON0fVS3CUgFatWHoKbbLTK/rT7pzpJ4Bjp5JjkZeasRfrS9wsBdDJK2cJLHMckXZdzPSSr1B8a4oQ==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-combine-extensions/-/micromark-util-combine-extensions-2.0.1.tgz", + "integrity": "sha512-OnAnH8Ujmy59JcyZw8JSbK9cGpdVY44NKgSM7E9Eh7DiLS2E9RNQf0dONaGDzEG9yjEl5hcqeIsj4hfRkLH/Bg==", "funding": [ { "type": "GitHub Sponsors", @@ -7259,15 +9224,16 @@ "url": "https://opencollective.com/unified" } ], + "license": "MIT", "dependencies": { "micromark-util-chunked": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "node_modules/micromark-util-decode-numeric-character-reference": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-2.0.1.tgz", - "integrity": "sha512-bmkNc7z8Wn6kgjZmVHOX3SowGmVdhYS7yBpMnuMnPzDq/6xwVA604DuOXMZTO1lvq01g+Adfa0pE2UKGlxL1XQ==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-2.0.2.tgz", + "integrity": "sha512-ccUbYk6CwVdkmCQMyr64dXz42EfHGkPQlBj5p7YVGzq8I7CtjXZJrubAYezf7Rp+bjPseiROqe7G6foFd+lEuw==", "funding": [ { "type": "GitHub Sponsors", @@ -7278,14 +9244,15 @@ "url": "https://opencollective.com/unified" } ], + "license": "MIT", "dependencies": { "micromark-util-symbol": "^2.0.0" } }, "node_modules/micromark-util-decode-string": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-decode-string/-/micromark-util-decode-string-2.0.0.tgz", - "integrity": "sha512-r4Sc6leeUTn3P6gk20aFMj2ntPwn6qpDZqWvYmAG6NgvFTIlj4WtrAudLi65qYoaGdXYViXYw2pkmn7QnIFasA==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-decode-string/-/micromark-util-decode-string-2.0.1.tgz", + "integrity": "sha512-nDV/77Fj6eH1ynwscYTOsbK7rR//Uj0bZXBwJZRfaLEJ1iGBR6kIfNmlNqaqJf649EP0F3NWNdeJi03elllNUQ==", "funding": [ { "type": "GitHub Sponsors", @@ -7296,6 +9263,7 @@ "url": "https://opencollective.com/unified" } ], + "license": "MIT", "dependencies": { "decode-named-character-reference": "^1.0.0", "micromark-util-character": "^2.0.0", @@ -7304,9 +9272,9 @@ } }, "node_modules/micromark-util-encode": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-2.0.0.tgz", - "integrity": "sha512-pS+ROfCXAGLWCOc8egcBvT0kf27GoWMqtdarNfDcjb6YLuV5cM3ioG45Ys2qOVqeqSbjaKg72vU+Wby3eddPsA==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-2.0.1.tgz", + "integrity": "sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==", "funding": [ { "type": "GitHub Sponsors", @@ -7316,12 +9284,13 @@ "type": "OpenCollective", "url": "https://opencollective.com/unified" } - ] + ], + "license": "MIT" }, "node_modules/micromark-util-events-to-acorn": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/micromark-util-events-to-acorn/-/micromark-util-events-to-acorn-2.0.2.tgz", - "integrity": "sha512-Fk+xmBrOv9QZnEDguL9OI9/NQQp6Hz4FuQ4YmCb/5V7+9eAh1s6AYSvL20kHkD67YIg7EpE54TiSlcsf3vyZgA==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/micromark-util-events-to-acorn/-/micromark-util-events-to-acorn-2.0.3.tgz", + "integrity": "sha512-jmsiEIiZ1n7X1Rr5k8wVExBQCg5jy4UXVADItHmNk1zkwEVhBuIUKRu3fqv+hs4nxLISi2DQGlqIOGiFxgbfHg==", "funding": [ { "type": "GitHub Sponsors", @@ -7332,8 +9301,8 @@ "url": "https://opencollective.com/unified" } ], + "license": "MIT", "dependencies": { - "@types/acorn": "^4.0.0", "@types/estree": "^1.0.0", "@types/unist": "^3.0.0", "devlop": "^1.0.0", @@ -7344,9 +9313,9 @@ } }, "node_modules/micromark-util-html-tag-name": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-html-tag-name/-/micromark-util-html-tag-name-2.0.0.tgz", - "integrity": "sha512-xNn4Pqkj2puRhKdKTm8t1YHC/BAjx6CEwRFXntTaRf/x16aqka6ouVoutm+QdkISTlT7e2zU7U4ZdlDLJd2Mcw==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-html-tag-name/-/micromark-util-html-tag-name-2.0.1.tgz", + "integrity": "sha512-2cNEiYDhCWKI+Gs9T0Tiysk136SnR13hhO8yW6BGNyhOC4qYFnwF1nKfD3HFAIXA5c45RrIG1ub11GiXeYd1xA==", "funding": [ { "type": "GitHub Sponsors", @@ -7356,12 +9325,13 @@ "type": "OpenCollective", "url": "https://opencollective.com/unified" } - ] + ], + "license": "MIT" }, "node_modules/micromark-util-normalize-identifier": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-2.0.0.tgz", - "integrity": "sha512-2xhYT0sfo85FMrUPtHcPo2rrp1lwbDEEzpx7jiH2xXJLqBuy4H0GgXk5ToU8IEwoROtXuL8ND0ttVa4rNqYK3w==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-2.0.1.tgz", + "integrity": "sha512-sxPqmo70LyARJs0w2UclACPUUEqltCkJ6PhKdMIDuJ3gSf/Q+/GIe3WKl0Ijb/GyH9lOpUkRAO2wp0GVkLvS9Q==", "funding": [ { "type": "GitHub Sponsors", @@ -7372,14 +9342,15 @@ "url": "https://opencollective.com/unified" } ], + "license": "MIT", "dependencies": { "micromark-util-symbol": "^2.0.0" } }, "node_modules/micromark-util-resolve-all": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-resolve-all/-/micromark-util-resolve-all-2.0.0.tgz", - "integrity": "sha512-6KU6qO7DZ7GJkaCgwBNtplXCvGkJToU86ybBAUdavvgsCiG8lSSvYxr9MhwmQ+udpzywHsl4RpGJsYWG1pDOcA==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-resolve-all/-/micromark-util-resolve-all-2.0.1.tgz", + "integrity": "sha512-VdQyxFWFT2/FGJgwQnJYbe1jjQoNTS4RjglmSjTUlpUMa95Htx9NHeYW4rGDJzbjvCsl9eLjMQwGeElsqmzcHg==", "funding": [ { "type": "GitHub Sponsors", @@ -7390,14 +9361,15 @@ "url": "https://opencollective.com/unified" } ], + "license": "MIT", "dependencies": { "micromark-util-types": "^2.0.0" } }, "node_modules/micromark-util-sanitize-uri": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-2.0.0.tgz", - "integrity": "sha512-WhYv5UEcZrbAtlsnPuChHUAsu/iBPOVaEVsntLBIdpibO0ddy8OzavZz3iL2xVvBZOpolujSliP65Kq0/7KIYw==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-2.0.1.tgz", + "integrity": "sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==", "funding": [ { "type": "GitHub Sponsors", @@ -7408,6 +9380,7 @@ "url": "https://opencollective.com/unified" } ], + "license": "MIT", "dependencies": { "micromark-util-character": "^2.0.0", "micromark-util-encode": "^2.0.0", @@ -7415,9 +9388,9 @@ } }, "node_modules/micromark-util-subtokenize": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-subtokenize/-/micromark-util-subtokenize-2.0.1.tgz", - "integrity": "sha512-jZNtiFl/1aY73yS3UGQkutD0UbhTt68qnRpw2Pifmz5wV9h8gOVsN70v+Lq/f1rKaU/W8pxRe8y8Q9FX1AOe1Q==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-subtokenize/-/micromark-util-subtokenize-2.1.0.tgz", + "integrity": "sha512-XQLu552iSctvnEcgXw6+Sx75GflAPNED1qx7eBJ+wydBb2KCbRZe+NwvIEEMM83uml1+2WSXpBAcp9IUCgCYWA==", "funding": [ { "type": "GitHub Sponsors", @@ -7428,6 +9401,7 @@ "url": "https://opencollective.com/unified" } ], + "license": "MIT", "dependencies": { "devlop": "^1.0.0", "micromark-util-chunked": "^2.0.0", @@ -7436,9 +9410,9 @@ } }, "node_modules/micromark-util-symbol": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", - "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", "funding": [ { "type": "GitHub Sponsors", @@ -7448,12 +9422,13 @@ "type": "OpenCollective", "url": "https://opencollective.com/unified" } - ] + ], + "license": "MIT" }, "node_modules/micromark-util-types": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.0.tgz", - "integrity": "sha512-oNh6S2WMHWRZrmutsRmDDfkzKtxF+bc2VxLC9dvtrDIRFln627VsFP6fLMgTryGDljgLPjkrzQSDcPrjPyDJ5w==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.2.tgz", + "integrity": "sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==", "funding": [ { "type": "GitHub Sponsors", @@ -7463,33 +9438,14 @@ "type": "OpenCollective", "url": "https://opencollective.com/unified" } - ] - }, - "node_modules/micromark/node_modules/debug": { - "version": "4.3.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.6.tgz", - "integrity": "sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg==", - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/micromark/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==" + ], + "license": "MIT" }, "node_modules/micromatch": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.7.tgz", - "integrity": "sha512-LPP/3KorzCwBxfeUuZmaR6bG2kdeHSbe0P2tY3FLRU4vYrjYz5hI4QZwV0njUx3jeuKe67YukQ1LSPZBKDqO/Q==", + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "license": "MIT", "dependencies": { "braces": "^3.0.3", "picomatch": "^2.3.1" @@ -7498,40 +9454,36 @@ "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==", + "version": "1.54.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", + "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", + "license": "MIT", "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==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.2.tgz", + "integrity": "sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A==", + "license": "MIT", "dependencies": { - "mime-db": "1.52.0" + "mime-db": "^1.54.0" }, "engines": { - "node": ">= 0.6" + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" } }, "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==", + "license": "MIT", "engines": { "node": ">=12" }, @@ -7539,10 +9491,23 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/mimic-function": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/mimic-function/-/mimic-function-5.0.1.tgz", + "integrity": "sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "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==", + "license": "MIT", "engines": { "node": ">=4" } @@ -7551,6 +9516,7 @@ "version": "9.0.5", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "license": "ISC", "dependencies": { "brace-expansion": "^2.0.1" }, @@ -7565,29 +9531,65 @@ "version": "7.1.2", "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "license": "ISC", "engines": { "node": ">=16 || 14 >=14.17" } }, + "node_modules/mlly": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.8.0.tgz", + "integrity": "sha512-l8D9ODSRWLe2KHJSifWGwBqpTZXIXTeo8mlKjY+E2HAakaTeNpqAyBZ8GSqLzHgw4XmHmC8whvpjJNMbFZN7/g==", + "license": "MIT", + "dependencies": { + "acorn": "^8.15.0", + "pathe": "^2.0.3", + "pkg-types": "^1.3.1", + "ufo": "^1.6.1" + } + }, + "node_modules/module-details-from-path": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/module-details-from-path/-/module-details-from-path-1.0.4.tgz", + "integrity": "sha512-EGWKgxALGMgzvxYF1UyGTy0HXX/2vHLkw6+NvDKW2jypWbHpjQuj4UMcqQWXHERJhVGKikolT06G3bcKe4fi7w==", + "license": "MIT" + }, "node_modules/morgan": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/morgan/-/morgan-1.10.0.tgz", - "integrity": "sha512-AbegBVI4sh6El+1gNwvD5YIck7nSA36weD7xvIxG4in80j/UoK8AEGaWnnz8v1GxonMCltmlNs5ZKbGvl9b1XQ==", + "version": "1.10.1", + "resolved": "https://registry.npmjs.org/morgan/-/morgan-1.10.1.tgz", + "integrity": "sha512-223dMRJtI/l25dJKWpgij2cMtywuG/WiUKXdvwfbhGKBhy1puASqXwFzmWZ7+K73vUPoR7SS2Qz2cI/g9MKw0A==", + "license": "MIT", "dependencies": { "basic-auth": "~2.0.1", "debug": "2.6.9", "depd": "~2.0.0", "on-finished": "~2.3.0", - "on-headers": "~1.0.2" + "on-headers": "~1.1.0" }, "engines": { "node": ">= 0.8.0" } }, + "node_modules/morgan/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/morgan/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" + }, "node_modules/morgan/node_modules/on-finished": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", "integrity": "sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==", + "license": "MIT", "dependencies": { "ee-first": "1.1.1" }, @@ -7595,41 +9597,51 @@ "node": ">= 0.8" } }, - "node_modules/mrmime": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-1.0.1.tgz", - "integrity": "sha512-hzzEagAgDyoU1Q6yg5uI+AorQgdvMCur3FcKf7NhMKWsaYg+RnbTyHRa/9IlLF9rf455MOCtcqqrQQ83pPP7Uw==", - "engines": { - "node": ">=10" + "node_modules/motion-dom": { + "version": "12.29.2", + "resolved": "https://registry.npmjs.org/motion-dom/-/motion-dom-12.29.2.tgz", + "integrity": "sha512-/k+NuycVV8pykxyiTCoFzIVLA95Nb1BFIVvfSu9L50/6K6qNeAYtkxXILy/LRutt7AzaYDc2myj0wkCVVYAPPA==", + "license": "MIT", + "dependencies": { + "motion-utils": "^12.29.2" } }, + "node_modules/motion-utils": { + "version": "12.29.2", + "resolved": "https://registry.npmjs.org/motion-utils/-/motion-utils-12.29.2.tgz", + "integrity": "sha512-G3kc34H2cX2gI63RqU+cZq+zWRRPSsNIOjpdl9TN4AQwC4sgwYPl/Q/Obf/d53nOm569T0fYK+tcoSV50BWx8A==", + "license": "MIT" + }, "node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "license": "MIT" }, "node_modules/msw": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/msw/-/msw-2.3.1.tgz", - "integrity": "sha512-ocgvBCLn/5l3jpl1lssIb3cniuACJLoOfZu01e3n5dbJrpA5PeeWn28jCLgQDNt6d7QT8tF2fYRzm9JoEHtiig==", + "version": "2.12.7", + "resolved": "https://registry.npmjs.org/msw/-/msw-2.12.7.tgz", + "integrity": "sha512-retd5i3xCZDVWMYjHEVuKTmhqY8lSsxujjVrZiGbbdoxxIBg5S7rCuYy/YQpfrTYIxpd/o0Kyb/3H+1udBMoYg==", "hasInstallScript": true, + "license": "MIT", "dependencies": { - "@bundled-es-modules/cookie": "^2.0.0", - "@bundled-es-modules/statuses": "^1.0.1", - "@inquirer/confirm": "^3.0.0", - "@mswjs/cookies": "^1.1.0", - "@mswjs/interceptors": "^0.29.0", - "@open-draft/until": "^2.1.0", - "@types/cookie": "^0.6.0", - "@types/statuses": "^2.0.4", - "chalk": "^4.1.2", - "graphql": "^16.8.1", + "@inquirer/confirm": "^5.0.0", + "@mswjs/interceptors": "^0.40.0", + "@open-draft/deferred-promise": "^2.2.0", + "@types/statuses": "^2.0.6", + "cookie": "^1.0.2", + "graphql": "^16.12.0", "headers-polyfill": "^4.0.2", "is-node-process": "^1.2.0", - "outvariant": "^1.4.2", - "path-to-regexp": "^6.2.0", + "outvariant": "^1.4.3", + "path-to-regexp": "^6.3.0", + "picocolors": "^1.1.1", + "rettime": "^0.7.0", + "statuses": "^2.0.2", "strict-event-emitter": "^0.5.1", - "type-fest": "^4.9.0", + "tough-cookie": "^6.0.0", + "type-fest": "^5.2.0", + "until-async": "^3.0.2", "yargs": "^17.7.2" }, "bin": { @@ -7642,7 +9654,7 @@ "url": "https://github.com/sponsors/mswjs" }, "peerDependencies": { - "typescript": ">= 4.7.x" + "typescript": ">= 4.8.x" }, "peerDependenciesMeta": { "typescript": { @@ -7650,95 +9662,252 @@ } } }, + "node_modules/msw/node_modules/@inquirer/ansi": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@inquirer/ansi/-/ansi-1.0.2.tgz", + "integrity": "sha512-S8qNSZiYzFd0wAcyG5AXCvUHC5Sr7xpZ9wZ2py9XR88jUz8wooStVx5M6dRzczbBWjic9NP7+rY0Xi7qqK/aMQ==", + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/msw/node_modules/@inquirer/confirm": { + "version": "5.1.21", + "resolved": "https://registry.npmjs.org/@inquirer/confirm/-/confirm-5.1.21.tgz", + "integrity": "sha512-KR8edRkIsUayMXV+o3Gv+q4jlhENF9nMYUZs9PA2HzrXeHI8M5uDag70U7RJn9yyiMZSbtF5/UexBtAVtZGSbQ==", + "license": "MIT", + "dependencies": { + "@inquirer/core": "^10.3.2", + "@inquirer/type": "^3.0.10" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/msw/node_modules/@inquirer/core": { + "version": "10.3.2", + "resolved": "https://registry.npmjs.org/@inquirer/core/-/core-10.3.2.tgz", + "integrity": "sha512-43RTuEbfP8MbKzedNqBrlhhNKVwoK//vUFNW3Q3vZ88BLcrs4kYpGg+B2mm5p2K/HfygoCxuKwJJiv8PbGmE0A==", + "license": "MIT", + "dependencies": { + "@inquirer/ansi": "^1.0.2", + "@inquirer/figures": "^1.0.15", + "@inquirer/type": "^3.0.10", + "cli-width": "^4.1.0", + "mute-stream": "^2.0.0", + "signal-exit": "^4.1.0", + "wrap-ansi": "^6.2.0", + "yoctocolors-cjs": "^2.1.3" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/msw/node_modules/@inquirer/figures": { + "version": "1.0.15", + "resolved": "https://registry.npmjs.org/@inquirer/figures/-/figures-1.0.15.tgz", + "integrity": "sha512-t2IEY+unGHOzAaVM5Xx6DEWKeXlDDcNPeDyUpsRc6CUhBfU3VQOEl+Vssh7VNp1dR8MdUJBWhuObjXCsVpjN5g==", + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/msw/node_modules/@inquirer/type": { + "version": "3.0.10", + "resolved": "https://registry.npmjs.org/@inquirer/type/-/type-3.0.10.tgz", + "integrity": "sha512-BvziSRxfz5Ov8ch0z/n3oijRSEcEsHnhggm4xFZe93DHcUCTlutlq9Ox4SVENAfcRD22UQq7T/atg9Wr3k09eA==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "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==", + "license": "MIT", "dependencies": { "color-convert": "^2.0.1" }, "engines": { - "node": ">=8" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/msw/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==", + "license": "ISC", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/msw/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==", + "license": "MIT", + "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/ansi-styles?sponsor=1" + "url": "https://github.com/chalk/wrap-ansi?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==", + "node_modules/msw/node_modules/mute-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-2.0.0.tgz", + "integrity": "sha512-WWdIxpyjEn+FhQJQQv9aQAYlHoNVdzIzUySNV1gHUPDSdZJ3yZn7pAAbQcV7B56Mvu881q9FZV+0Vx2xC44VWA==", + "license": "ISC", + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/msw/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==", + "license": "MIT", "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "node": ">=8" } }, - "node_modules/msw/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==", + "node_modules/msw/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==", + "license": "MIT", "dependencies": { - "color-name": "~1.1.4" + "ansi-regex": "^5.0.1" }, "engines": { - "node": ">=7.0.0" + "node": ">=8" } }, - "node_modules/msw/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==", + "node_modules/msw/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==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, "engines": { "node": ">=8" } }, - "node_modules/msw/node_modules/path-to-regexp": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-6.2.2.tgz", - "integrity": "sha512-GQX3SSMokngb36+whdpRXE+3f9V8UzyAorlYvOGx87ufGHehNTn5lCxrKtLyZ4Yl/wEKnNnr98ZzOwwDZV5ogw==" - }, - "node_modules/msw/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==", + "node_modules/msw/node_modules/yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "license": "MIT", "dependencies": { - "has-flag": "^4.0.0" + "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": ">=8" + "node": ">=12" + } + }, + "node_modules/msw/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==", + "license": "ISC", + "engines": { + "node": ">=12" } }, "node_modules/mute-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-1.0.0.tgz", - "integrity": "sha512-avsJQhyd+680gKXyG/sQc0nXaC6rBkPOfyHYcFb9+hdkqQkR9bdnkJ0AMZhke0oesPqIO+mFFJ+IdBc7mst4IA==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-3.0.0.tgz", + "integrity": "sha512-dkEJPVvun4FryqBmZ5KhDo0K9iDXAwn08tMLDinNdRBNPcYEDiWYysLcc6k3mjTMlbP9KyylvRpd4wFtwrT9rw==", + "license": "ISC", "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": "^20.17.0 || >=22.9.0" } }, "node_modules/mux-embed": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/mux-embed/-/mux-embed-5.2.1.tgz", - "integrity": "sha512-NukHw91xeEVDBeXVDBpi2BvXNix7gSuvdtyvOph5yR/ROn1hHbTlcYWoKQyCyJX9frsF00UROEul+S8wPzU3aQ==" + "version": "5.9.0", + "resolved": "https://registry.npmjs.org/mux-embed/-/mux-embed-5.9.0.tgz", + "integrity": "sha512-wmunL3uoPhma/tWy8PrDPZkvJpXvSFBwbD3KkC4PG8Ztjfb1X3hRJwGUAQyRz7z99b/ovLm2UTTitrkvStjH4w==", + "license": "MIT" }, "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==", + "version": "0.6.4", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.4.tgz", + "integrity": "sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w==", + "license": "MIT", "engines": { "node": ">= 0.6" } }, + "node_modules/node-abi": { + "version": "3.87.0", + "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.87.0.tgz", + "integrity": "sha512-+CGM1L1CgmtheLcBuleyYOn7NWPVu0s0EJH2C4puxgEZb9h8QpR9G2dBfZJOAUhi7VQxuBPMd0hiISWcTyiYyQ==", + "license": "MIT", + "dependencies": { + "semver": "^7.3.5" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/node-emoji": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/node-emoji/-/node-emoji-2.1.3.tgz", - "integrity": "sha512-E2WEOVsgs7O16zsURJ/eH8BqhF029wGpEOnv7Urwdo2wmQanOACwJQh0devF9D9RhoZru0+9JXIS0dBXIAz+lA==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/node-emoji/-/node-emoji-2.2.0.tgz", + "integrity": "sha512-Z3lTE9pLaJF47NyMhd4ww1yFTAP8YhYI8SleJiHzM46Fgpm5cnNzSl9XfzFNqbaz+VlJrIj3fXQ4DeN1Rjm6cw==", + "license": "MIT", "dependencies": { "@sindresorhus/is": "^4.6.0", "char-regex": "^1.0.2", @@ -7749,28 +9918,52 @@ "node": ">=18" } }, + "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==", + "license": "MIT", + "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-releases": { - "version": "2.0.18", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.18.tgz", - "integrity": "sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==" + "version": "2.0.27", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.27.tgz", + "integrity": "sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==", + "license": "MIT" }, "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==", + "license": "MIT", "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==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-6.0.0.tgz", + "integrity": "sha512-9qny7Z9DsQU8Ou39ERsPU4OZQlSTP47ShQzuKZ6PRXpYLtIFgl/DEBYEXKlvcEa+9tHVcK8CF81Y2V72qaZhWA==", + "license": "MIT", "dependencies": { - "path-key": "^4.0.0" + "path-key": "^4.0.0", + "unicorn-magic": "^0.3.0" }, "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -7780,6 +9973,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", + "license": "MIT", "engines": { "node": ">=12" }, @@ -7787,26 +9981,29 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/oauth4webapi": { + "version": "3.8.3", + "resolved": "https://registry.npmjs.org/oauth4webapi/-/oauth4webapi-3.8.3.tgz", + "integrity": "sha512-pQ5BsX3QRTgnt5HxgHwgunIRaDXBdkT23tf8dfzmtTIL2LTpdmxgbpbBm0VgFWAIDlezQvQCTgnVIUmHupXHxw==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/panva" + } + }, "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==", + "license": "MIT", "engines": { "node": ">=0.10.0" } }, - "node_modules/object-hash": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-2.2.0.tgz", - "integrity": "sha512-gScRMn0bS5fH+IuwyIFgnh9zBdo4DV+6GhygmWM9HyNJSgS0hScp1f5vjtm7oIIOiT9trXrShAkLFSc2IqKNgw==", - "engines": { - "node": ">= 6" - } - }, "node_modules/object-inspect": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.2.tgz", - "integrity": "sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g==", + "version": "1.13.4", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", + "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", + "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -7814,18 +10011,11 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/oidc-token-hash": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/oidc-token-hash/-/oidc-token-hash-5.0.3.tgz", - "integrity": "sha512-IF4PcGgzAr6XXSff26Sk/+P4KZFJVuHAJZj3wgO3vX2bMdNVp/QXTP3P7CEm9V1IdG8lDLY3HhiqpsE/nOwpPw==", - "engines": { - "node": "^10.13.0 || >=12.0.0" - } - }, "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==", + "license": "MIT", "dependencies": { "ee-first": "1.1.1" }, @@ -7834,109 +10024,236 @@ } }, "node_modules/on-headers": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", - "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.1.0.tgz", + "integrity": "sha512-737ZY3yNnXy37FHkQxPzt4UZ2UWPWiCZWLvFZ4fu5cueciegX0zGPnrlY6bwRg4FdQOe9YU8MkmJwGhoMybl8A==", + "license": "MIT", "engines": { "node": ">= 0.8" } }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "license": "ISC", + "dependencies": { + "wrappy": "1" + } + }, "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==", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-7.0.0.tgz", + "integrity": "sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==", + "license": "MIT", "dependencies": { - "mimic-fn": "^4.0.0" + "mimic-function": "^5.0.0" }, "engines": { - "node": ">=12" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/oniguruma-parser": { + "version": "0.12.1", + "resolved": "https://registry.npmjs.org/oniguruma-parser/-/oniguruma-parser-0.12.1.tgz", + "integrity": "sha512-8Unqkvk1RYc6yq2WBYRj4hdnsAxVze8i7iPfQr8e4uSP3tRv0rpZcbGUDvxfQQcdwHt/e9PrMvGCsa8OqG9X3w==", + "license": "MIT" + }, + "node_modules/oniguruma-to-es": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/oniguruma-to-es/-/oniguruma-to-es-4.3.4.tgz", + "integrity": "sha512-3VhUGN3w2eYxnTzHn+ikMI+fp/96KoRSVK9/kMTcFqj1NRDh2IhQCKvYxDnWePKRXY/AqH+Fuiyb7VHSzBjHfA==", + "license": "MIT", + "dependencies": { + "oniguruma-parser": "^0.12.1", + "regex": "^6.0.1", + "regex-recursion": "^6.0.2" + } + }, + "node_modules/open": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/open/-/open-11.0.0.tgz", + "integrity": "sha512-smsWv2LzFjP03xmvFoJ331ss6h+jixfA4UUV/Bsiyuu4YJPfN+FIQGOIiv4w9/+MoHkfkJ22UIaQWRVFRfH6Vw==", + "license": "MIT", + "dependencies": { + "default-browser": "^5.4.0", + "define-lazy-prop": "^3.0.0", + "is-in-ssh": "^1.0.0", + "is-inside-container": "^1.0.0", + "powershell-utils": "^0.1.0", + "wsl-utils": "^0.3.0" + }, + "engines": { + "node": ">=20" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/openid-client": { - "version": "5.6.5", - "resolved": "https://registry.npmjs.org/openid-client/-/openid-client-5.6.5.tgz", - "integrity": "sha512-5P4qO9nGJzB5PI0LFlhj4Dzg3m4odt0qsJTfyEtZyOlkgpILwEioOhVVJOrS1iVH494S4Ee5OCjjg6Bf5WOj3w==", + "version": "6.8.1", + "resolved": "https://registry.npmjs.org/openid-client/-/openid-client-6.8.1.tgz", + "integrity": "sha512-VoYT6enBo6Vj2j3Q5Ec0AezS+9YGzQo1f5Xc42lreMGlfP4ljiXPKVDvCADh+XHCV/bqPu/wWSiCVXbJKvrODw==", + "license": "MIT", "dependencies": { - "jose": "^4.15.5", - "lru-cache": "^6.0.0", - "object-hash": "^2.2.0", - "oidc-token-hash": "^5.0.3" + "jose": "^6.1.0", + "oauth4webapi": "^3.8.2" }, "funding": { "url": "https://github.com/sponsors/panva" } }, - "node_modules/openid-client/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "node_modules/ora": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/ora/-/ora-9.1.0.tgz", + "integrity": "sha512-53uuLsXHOAJl5zLrUrzY9/kE+uIFEx7iaH4g2BIJQK4LZjY4LpCCYZVKDWIkL+F01wAaCg93duQ1whnK/AmY1A==", + "license": "MIT", "dependencies": { - "yallist": "^4.0.0" + "chalk": "^5.6.2", + "cli-cursor": "^5.0.0", + "cli-spinners": "^3.2.0", + "is-interactive": "^2.0.0", + "is-unicode-supported": "^2.1.0", + "log-symbols": "^7.0.1", + "stdin-discarder": "^0.2.2", + "string-width": "^8.1.0" }, "engines": { - "node": ">=10" + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/outvariant": { "version": "1.4.3", "resolved": "https://registry.npmjs.org/outvariant/-/outvariant-1.4.3.tgz", - "integrity": "sha512-+Sl2UErvtsoajRDKCE5/dBz4DIvHXQQnAxtQTF04OJxY0+DyZXSo5P5Bb7XYWOh81syohlYL24hbDwxedPUJCA==" + "integrity": "sha512-+Sl2UErvtsoajRDKCE5/dBz4DIvHXQQnAxtQTF04OJxY0+DyZXSo5P5Bb7XYWOh81syohlYL24hbDwxedPUJCA==", + "license": "MIT" + }, + "node_modules/p-limit": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-7.2.0.tgz", + "integrity": "sha512-ATHLtwoTNDloHRFFxFJdHnG6n2WUeFjaR8XQMFdKIv0xkXjrER8/iG9iu265jOM95zXHAfv9oTkqhrfbIzosrQ==", + "license": "MIT", + "dependencies": { + "yocto-queue": "^1.2.1" + }, + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "license": "MIT", + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate/node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "license": "MIT", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate/node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, "node_modules/p-queue": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/p-queue/-/p-queue-8.0.1.tgz", - "integrity": "sha512-NXzu9aQJTAzbBqOt2hwsR63ea7yvxJc0PwN/zobNAudYfb1B7R08SzB4TsLeSbUCuG467NhnoT0oO6w1qRO+BA==", + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/p-queue/-/p-queue-9.1.0.tgz", + "integrity": "sha512-O/ZPaXuQV29uSLbxWBGGZO1mCQXV2BLIwUr59JUU9SoH76mnYvtms7aafH/isNSNGwuEfP6W/4xD0/TJXxrizw==", + "license": "MIT", "dependencies": { "eventemitter3": "^5.0.1", - "p-timeout": "^6.1.2" + "p-timeout": "^7.0.0" }, "engines": { - "node": ">=18" + "node": ">=20" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/p-timeout": { - "version": "6.1.2", - "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-6.1.2.tgz", - "integrity": "sha512-UbD77BuZ9Bc9aABo74gfXhNvzC9Tx7SxtHSh1fxvx3jTLLYvmVhiQZZrJzqqU0jKbN32kb5VOKiLEQI/3bIjgQ==", + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-7.0.1.tgz", + "integrity": "sha512-AxTM2wDGORHGEkPCt8yqxOTMgpfbEHqF51f/5fJCmwFC3C/zNcGT63SymH2ttOAaiIws2zVg4+izQCjrakcwHg==", + "license": "MIT", "engines": { - "node": ">=14.16" + "node": ">=20" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/package-json-from-dist": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.0.tgz", - "integrity": "sha512-dATvCeZN/8wQsGywez1mzHtTlP22H8OEfPrVMLNr4/eGa+ijtLn/6M5f0dY8UKNrC2O9UCU6SSoG3qRKnt7STw==" + "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==", + "license": "BlueOak-1.0.0" + }, + "node_modules/package-manager-detector": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/package-manager-detector/-/package-manager-detector-1.6.0.tgz", + "integrity": "sha512-61A5ThoTiDG/C8s8UMZwSorAGwMJ0ERVGj2OjoW5pAalsNOg15+iQiPzrLJ4jhZ1HJzmC2PIHT2oEiH3R5fzNA==", + "license": "MIT" }, "node_modules/pako": { "version": "0.2.9", "resolved": "https://registry.npmjs.org/pako/-/pako-0.2.9.tgz", - "integrity": "sha512-NUcwaKxUxWrZLpDG+z/xZaCgQITkA/Dv4V/T6bw7VON6l1Xz/VnrBqrYjZQ12TamKHzITTfOEIYUj48y2KXImA==" + "integrity": "sha512-NUcwaKxUxWrZLpDG+z/xZaCgQITkA/Dv4V/T6bw7VON6l1Xz/VnrBqrYjZQ12TamKHzITTfOEIYUj48y2KXImA==", + "license": "MIT" }, "node_modules/parse-css-color": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/parse-css-color/-/parse-css-color-0.2.1.tgz", "integrity": "sha512-bwS/GGIFV3b6KS4uwpzCFj4w297Yl3uqnSgIPsoQkx7GMLROXfMnWvxfNkL0oh8HVhZA4hvJoEoEIqonfJ3BWg==", + "license": "MIT", "dependencies": { "color-name": "^1.1.4", "hex-rgb": "^4.1.0" } }, "node_modules/parse-entities": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-4.0.1.tgz", - "integrity": "sha512-SWzvYcSJh4d/SGLIOQfZ/CoNv6BTlI6YEQ7Nj82oDVnRpwe/Z/F1EMx42x3JAOwGBlCjeCH0BRJQbQ/opHL17w==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-4.0.2.tgz", + "integrity": "sha512-GG2AQYWoLgL877gQIKeRPGO1xF9+eG1ujIb5soS5gPvLQ1y2o8FL90w2QWNdf9I361Mpp7726c+lj3U0qK1uGw==", + "license": "MIT", "dependencies": { "@types/unist": "^2.0.0", - "character-entities": "^2.0.0", "character-entities-legacy": "^3.0.0", "character-reference-invalid": "^2.0.0", "decode-named-character-reference": "^1.0.0", @@ -7952,17 +10269,20 @@ "node_modules/parse-entities/node_modules/@types/unist": { "version": "2.0.11", "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.11.tgz", - "integrity": "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==" + "integrity": "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==", + "license": "MIT" }, "node_modules/parse-git-diff": { - "version": "0.0.15", - "resolved": "https://registry.npmjs.org/parse-git-diff/-/parse-git-diff-0.0.15.tgz", - "integrity": "sha512-KU7FMvw7ybx2BqkSJthyLl6G4LmKzWwOyalNLdJtzkV7xIFU5oCIVDP9OQl+0vkVv7EKiKDnJlkdzPQ6ueFsgw==" + "version": "0.0.19", + "resolved": "https://registry.npmjs.org/parse-git-diff/-/parse-git-diff-0.0.19.tgz", + "integrity": "sha512-oh3giwKzsPlOhekiDDyd/pfFKn04IZoTjEThquhfKigwiUHymiP/Tp6AN5nGIwXQdWuBTQvz9AaRdN5TBsJ8MA==", + "license": "MIT" }, "node_modules/parse-ms": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/parse-ms/-/parse-ms-4.0.0.tgz", "integrity": "sha512-TXfryirbmq34y8QBwgqCVLi+8oA3oWx2eAnSn62ITyEhEYaWRlVZ2DvMM9eZbMs/RfxPu/PK/aBLyGj4IrqMHw==", + "license": "MIT", "engines": { "node": ">=18" }, @@ -7973,23 +10293,26 @@ "node_modules/parse-numeric-range": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/parse-numeric-range/-/parse-numeric-range-1.3.0.tgz", - "integrity": "sha512-twN+njEipszzlMJd4ONUYgSfZPDxgHhT9Ahed5uTigpQn90FggW4SA/AIPq/6a149fTbE9qBEcSwE3FAEp6wQQ==" + "integrity": "sha512-twN+njEipszzlMJd4ONUYgSfZPDxgHhT9Ahed5uTigpQn90FggW4SA/AIPq/6a149fTbE9qBEcSwE3FAEp6wQQ==", + "license": "ISC" }, "node_modules/parse5": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz", - "integrity": "sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==", + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.3.0.tgz", + "integrity": "sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==", + "license": "MIT", "dependencies": { - "entities": "^4.4.0" + "entities": "^6.0.0" }, "funding": { "url": "https://github.com/inikulin/parse5?sponsor=1" } }, "node_modules/parse5/node_modules/entities": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", - "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-6.0.1.tgz", + "integrity": "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==", + "license": "BSD-2-Clause", "engines": { "node": ">=0.12" }, @@ -8001,33 +10324,40 @@ "version": "1.3.3", "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "license": "MIT", "engines": { "node": ">= 0.8" } }, "node_modules/partysocket": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/partysocket/-/partysocket-1.0.1.tgz", - "integrity": "sha512-sSnLf9X0Oaxw0wXp0liKho0QQqStDJB5I4ViaqmtI4nHm6cpb2kUealErPrcQpYUF6zgTHzLQhIO++2tcJc59A==", + "version": "1.1.10", + "resolved": "https://registry.npmjs.org/partysocket/-/partysocket-1.1.10.tgz", + "integrity": "sha512-ACfn0P6lQuj8/AqB4L5ZDFcIEbpnIteNNObrlxqV1Ge80GTGhjuJ2sNKwNQlFzhGi4kI7fP/C1Eqh8TR78HjDQ==", + "license": "MIT", "dependencies": { - "event-target-shim": "^6.0.2" + "event-target-polyfill": "^0.0.4" } }, - "node_modules/partysocket/node_modules/event-target-shim": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-6.0.2.tgz", - "integrity": "sha512-8q3LsZjRezbFZ2PN+uP+Q7pnHUMmAOziU2vA2OwoFaKIXxlxl38IylhSSgUorWu/rf4er67w0ikBqjBFk/pomA==", + "node_modules/path-data-parser": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/path-data-parser/-/path-data-parser-0.1.0.tgz", + "integrity": "sha512-NOnmBpt5Y2RWbuv0LMzsayp3lVylAHLPUTut412ZA3l+C4uw4ZVkQbjShYCQ8TCpUMdPapr4YjUqLYD6v68j+w==", + "license": "MIT" + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "license": "MIT", "engines": { - "node": ">=10.13.0" - }, - "funding": { - "url": "https://github.com/sponsors/mysticatea" + "node": ">=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==", + "license": "MIT", "engines": { "node": ">=8" } @@ -8035,66 +10365,79 @@ "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==" + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "license": "MIT" }, "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==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-2.0.1.tgz", + "integrity": "sha512-oWyT4gICAu+kaA7QWk/jvCHWarMKNs6pXOGWKDTr7cw4IGcUbW+PeTfbaQiLGheFRpjo6O9J0PmyMfQPjH71oA==", + "license": "BlueOak-1.0.0", "dependencies": { - "lru-cache": "^10.2.0", - "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + "lru-cache": "^11.0.0", + "minipass": "^7.1.2" }, "engines": { - "node": ">=16 || 14 >=14.18" + "node": "20 || >=22" }, "funding": { "url": "https://github.com/sponsors/isaacs" } }, "node_modules/path-to-regexp": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", - "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==" + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-6.3.0.tgz", + "integrity": "sha512-Yhpw4T9C6hPpgPeA28us07OJeqZ5EzQTkbfwuhsUg0c237RomFoETJgmp2sa3F/41gfLE6G5cqcYwznmeEeOlQ==", + "license": "MIT" }, - "node_modules/path-type": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-5.0.0.tgz", - "integrity": "sha512-5HviZNaZcfqP95rwpv+1HDgUamezbqdSYTyzjTvwtJSnIH+3vnbmWsItli8OFEndS984VT55M3jduxZbX351gg==", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } + "node_modules/pathe": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", + "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", + "license": "MIT" }, - "node_modules/pathval": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/pathval/-/pathval-2.0.0.tgz", - "integrity": "sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA==", + "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==", + "license": "ISC", "engines": { - "node": ">= 14.16" + "node": ">=4.0.0" } }, - "node_modules/periscopic": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/periscopic/-/periscopic-3.1.0.tgz", - "integrity": "sha512-vKiQ8RRtkl9P+r/+oefh25C3fhybptkHKCZSPlcXiJux2tJF55GnEj3BVn4A5gKfq9NWWXXrxkHBwVPUfH0opw==", + "node_modules/pg-protocol": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/pg-protocol/-/pg-protocol-1.11.0.tgz", + "integrity": "sha512-pfsxk2M9M3BuGgDOfuy37VNRRX3jmKgMjcvAcWqNDpZSf4cUmv8HSOl5ViRQFsfARFn0KuUQTgLxVMbNq5NW3g==", + "license": "MIT" + }, + "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==", + "license": "MIT", "dependencies": { - "@types/estree": "^1.0.0", - "estree-walker": "^3.0.0", - "is-reference": "^3.0.0" + "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/picocolors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.1.tgz", - "integrity": "sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==" + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "license": "ISC" }, "node_modules/picomatch": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "license": "MIT", "engines": { "node": ">=8.6" }, @@ -8103,88 +10446,82 @@ } }, "node_modules/pid-port": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/pid-port/-/pid-port-1.0.0.tgz", - "integrity": "sha512-LSNBeKChRPA4Xlrs6+zV588G1hSrFvANtPV5rt/5MPfSPK3V9XPWxx1d29svsrOjngT9ifLisXWCLS7DvO9ZhQ==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pid-port/-/pid-port-2.0.1.tgz", + "integrity": "sha512-pnLo01AmMclw8l+/gfknsP2N351oe8VkVmCLFUvJZ11NRPPmghJrv0OcwsdgPQxsZkFYwm6hPWW0JKmXYCaXAw==", + "license": "MIT", "dependencies": { - "execa": "^8.0.1" + "execa": "^9.6.0" }, "engines": { - "node": ">=18" + "node": ">=20" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/pid-port/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==", + "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==", + "license": "MIT", "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" + "confbox": "^0.1.8", + "mlly": "^1.7.4", + "pathe": "^2.0.1" } }, - "node_modules/pid-port/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" + "node_modules/pkgmgr": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/pkgmgr/-/pkgmgr-1.1.1.tgz", + "integrity": "sha512-KodFOumBjt6dnD8oHrqJBgsMvy11OF3kTKEoIdR08UDhscKIt55DI8XyCz7UTfuDLf37bhF9ATAoRVhvjOP/dw==", + "license": "MIT", + "bin": { + "pkgmgr": "bin/pkgmgr.js", + "pkgmgr-bun": "bin/pkgmgr-bun.js", + "pkgmgr-pnpm": "bin/pkgmgr-pnpm.js", + "pkgmgr-yarn": "bin/pkgmgr-yarn.js", + "pkgmgrx": "bin/pkgmgrx.js", + "pkgmgrx-bun": "bin/pkgmgrx-bun.js", + "pkgmgrx-pnpm": "bin/pkgmgrx-pnpm.js", + "pkgmgrx-yarn": "bin/pkgmgrx-yarn.js" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/pid-port/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": ">=18" } }, - "node_modules/pid-port/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/player.style": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/player.style/-/player.style-0.3.1.tgz", + "integrity": "sha512-z/T8hJGaTkHT9vdXgWdOgF37eB1FV7/j52VXQZ2lgEhpru9oT8TaUWIxp6GoxTnhPBM4X6nSbpkAHrT7UTjUKg==", + "license": "MIT", + "workspaces": [ + ".", + "site", + "examples/*", + "scripts/*", + "themes/*" + ], + "dependencies": { + "media-chrome": "~4.16.1" } }, - "node_modules/pid-port/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/player.style/node_modules/media-chrome": { + "version": "4.16.1", + "resolved": "https://registry.npmjs.org/media-chrome/-/media-chrome-4.16.1.tgz", + "integrity": "sha512-qtFlsy0lNDVCyVo//ZCAfRPKwgehfOYp6rThZzDUuZ5ypv41yqUfAxK+P9TOs+XSVWXATPTT2WRV0fbW0BH4vQ==", + "license": "MIT", + "dependencies": { + "ce-la-react": "^0.3.2" } }, "node_modules/playwright": { - "version": "1.46.1", - "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.46.1.tgz", - "integrity": "sha512-oPcr1yqoXLCkgKtD5eNUPLiN40rYEM39odNpIb6VE6S7/15gJmA1NzVv6zJYusV0e7tzvkU/utBFNa/Kpxmwng==", + "version": "1.58.0", + "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.58.0.tgz", + "integrity": "sha512-2SVA0sbPktiIY/MCOPX8e86ehA/e+tDNq+e5Y8qjKYti2Z/JG7xnronT/TXTIkKbYGWlCbuucZ6dziEgkoEjQQ==", + "license": "Apache-2.0", "dependencies": { - "playwright-core": "1.46.1" + "playwright-core": "1.58.0" }, "bin": { "playwright": "cli.js" @@ -8197,9 +10534,10 @@ } }, "node_modules/playwright-core": { - "version": "1.46.1", - "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.46.1.tgz", - "integrity": "sha512-h9LqIQaAv+CYvWzsZ+h3RsrqCStkBHlgo6/TJlFst3cOTlLghBQlJwPOZKQJTKNaD3QIB7aAVQ+gfWbN3NXB7A==", + "version": "1.58.0", + "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.58.0.tgz", + "integrity": "sha512-aaoB1RWrdNi3//rOeKuMiS65UCcgOVljU46At6eFcOFPFHWtd2weHRRow6z/n+Lec0Lvu0k9ZPKJSjPugikirw==", + "license": "Apache-2.0", "bin": { "playwright-core": "cli.js" }, @@ -8212,6 +10550,7 @@ "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", "hasInstallScript": true, + "license": "MIT", "optional": true, "os": [ "darwin" @@ -8220,23 +10559,84 @@ "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", - "integrity": "sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==", - "engines": { - "node": ">= 0.4" + "node_modules/points-on-curve": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/points-on-curve/-/points-on-curve-0.2.0.tgz", + "integrity": "sha512-0mYKnYYe9ZcqMCWhUjItv/oHjvgEsfKvnUTg8sAtnHr3GVy7rGkXCb6d5cSyqrWqL4k81b9CPg3urd+T7aop3A==", + "license": "MIT" + }, + "node_modules/points-on-path": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/points-on-path/-/points-on-path-0.2.1.tgz", + "integrity": "sha512-25ClnWWuw7JbWZcgqY/gJ4FQWadKxGWk+3kR/7kD0tCaDtPPMj7oHu2ToLaVhfpnHrZzYby2w6tUA0eOIuUg8g==", + "license": "MIT", + "dependencies": { + "path-data-parser": "0.1.0", + "points-on-curve": "0.2.0" } }, "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==" + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", + "license": "MIT" + }, + "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==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/postgres-bytea": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/postgres-bytea/-/postgres-bytea-1.0.1.tgz", + "integrity": "sha512-5+5HqXnsZPE65IJZSMkZtURARZelel2oXUEO8rH83VS/hxH5vv1uHquPg5wZs8yMAfdv971IU+kcPUczi7NVBQ==", + "license": "MIT", + "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==", + "license": "MIT", + "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==", + "license": "MIT", + "dependencies": { + "xtend": "^4.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/powershell-utils": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/powershell-utils/-/powershell-utils-0.1.0.tgz", + "integrity": "sha512-dM0jVuXJPsDN6DvRpea484tCUaMiXWjuCn++HGTqUWzGDjv5tZkEZldAJ/UMlqRYGFrD/etByo4/xOuC/snX2A==", + "license": "MIT", + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, "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==", + "license": "MIT", "dependencies": { "ansi-regex": "^5.0.1", "ansi-styles": "^5.0.0", @@ -8246,10 +10646,17 @@ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, + "node_modules/pretty-format/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==", + "license": "MIT" + }, "node_modules/pretty-ms": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/pretty-ms/-/pretty-ms-9.0.0.tgz", - "integrity": "sha512-E9e9HJ9R9NasGOgPaPE8VMeiPKAyWR5jcFpNnwIejslIhWqdqOrb2wShBsncMPUb+BcCd2OPYfh7p2W6oemTng==", + "version": "9.3.0", + "resolved": "https://registry.npmjs.org/pretty-ms/-/pretty-ms-9.3.0.tgz", + "integrity": "sha512-gjVS5hOP+M3wMm5nmNOucbIrqudzs9v/57bWRHQWLYklXqoXKrVfYW2W9+glfGsqtPgpiz5WwyEEB+ksXIx3gQ==", + "license": "MIT", "dependencies": { "parse-ms": "^4.0.0" }, @@ -8264,6 +10671,7 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/process-exists/-/process-exists-5.0.0.tgz", "integrity": "sha512-6QPRh5fyHD8MaXr4GYML8K/YY0Sq5dKHGIOrAKS3cYpHQdmygFCcijIu1dVoNKAZ0TWAMoeh8KDK9dF8auBkJA==", + "license": "MIT", "dependencies": { "ps-list": "^8.0.0" }, @@ -8274,25 +10682,43 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/process-exists/node_modules/ps-list": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/ps-list/-/ps-list-8.1.1.tgz", + "integrity": "sha512-OPS9kEJYVmiO48u/B9qneqhkMvgCxT+Tm28VCEJpheTpl8cJ0ffZRRNgS5mrQRTrX5yRTpaJ+hRDeefXYmmorQ==", + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/progress": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, "node_modules/prop-types": { "version": "15.8.1", "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", + "license": "MIT", "dependencies": { "loose-envify": "^1.4.0", "object-assign": "^4.1.1", "react-is": "^16.13.1" } }, - "node_modules/prop-types/node_modules/react-is": { - "version": "16.13.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" - }, "node_modules/property-information": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/property-information/-/property-information-6.5.0.tgz", - "integrity": "sha512-PgTgs/BlvHxOu8QuEN7wi5A0OmXaBcHpmCSTehcs6Uuu9IkDIEo13Hy7n898RHfrQ49vKCoGeWZSaAK01nwVig==", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/property-information/-/property-information-7.1.0.tgz", + "integrity": "sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ==", + "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" @@ -8302,6 +10728,7 @@ "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==", + "license": "MIT", "dependencies": { "forwarded": "0.2.0", "ipaddr.js": "1.9.1" @@ -8310,23 +10737,31 @@ "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==", + "license": "MIT" + }, "node_modules/ps-list": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/ps-list/-/ps-list-8.1.1.tgz", - "integrity": "sha512-OPS9kEJYVmiO48u/B9qneqhkMvgCxT+Tm28VCEJpheTpl8cJ0ffZRRNgS5mrQRTrX5yRTpaJ+hRDeefXYmmorQ==", + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/ps-list/-/ps-list-9.0.0.tgz", + "integrity": "sha512-lxMEoIL/BQlk2KunFzxwUPwMvjFH7x7cmvzSLsSHpyMXl9FFfLUlfKrYwFc4wx/ZaIxxuXC4n8rjQ1CX/tkXVQ==", + "license": "MIT", "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + "node": ">=20" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/qs": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", - "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "version": "6.14.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.0.tgz", + "integrity": "sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==", + "license": "BSD-3-Clause", "dependencies": { - "side-channel": "^1.0.4" + "side-channel": "^1.1.0" }, "engines": { "node": ">=0.6" @@ -8352,79 +10787,87 @@ "type": "consulting", "url": "https://feross.org/support" } - ] + ], + "license": "MIT" }, "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==", + "license": "MIT", "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==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-3.0.2.tgz", + "integrity": "sha512-K5zQjDllxWkf7Z5xJdV0/B0WTNqx6vxG70zJE4N0kBs4LovmEYWJzQGxC9bS9RAKu3bgM40lrd5zoLJ12MQ5BA==", + "license": "MIT", "dependencies": { - "bytes": "3.1.2", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" + "bytes": "~3.1.2", + "http-errors": "~2.0.1", + "iconv-lite": "~0.7.0", + "unpipe": "~1.0.0" }, "engines": { - "node": ">= 0.8" - } - }, - "node_modules/raw-body/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": ">= 0.10" } }, "node_modules/react": { - "version": "19.0.0-rc-f994737d14-20240522", - "resolved": "https://registry.npmjs.org/react/-/react-19.0.0-rc-f994737d14-20240522.tgz", - "integrity": "sha512-SeU2v5Xy6FotVhKz0pMS2gvYP7HlkF0qgTskj3JzA1vlxcb3dQjxlm9t0ZlJqcgoyI3VFAw7bomuDMdgy1nBuw==", + "version": "19.2.4", + "resolved": "https://registry.npmjs.org/react/-/react-19.2.4.tgz", + "integrity": "sha512-9nfp2hYpCwOjAN+8TZFGhtWEwgvWHXqESH8qT89AT/lWklpLON22Lc8pEtnpsZz7VmawabSU0gCjnj8aC0euHQ==", + "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/react-dom": { - "version": "19.0.0-rc-f994737d14-20240522", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.0.0-rc-f994737d14-20240522.tgz", - "integrity": "sha512-J4CsfTSptPKkhaPbaR6n/KohQiHZTrRZ8GL4H8rbAqN/Qpy69g2MIoLBr5/PUX21ye6JxC1ZRWJFna7Xdg1pdA==", + "version": "19.2.4", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.2.4.tgz", + "integrity": "sha512-AXJdLo8kgMbimY95O2aKQqsz2iWi9jMgKJhRBAxECE4IFxfcazB2LmzloIoibJI3C12IlY20+KFaLv+71bUJeQ==", + "license": "MIT", "dependencies": { - "scheduler": "0.25.0-rc-f994737d14-20240522" + "scheduler": "^0.27.0" }, "peerDependencies": { - "react": "19.0.0-rc-f994737d14-20240522" + "react": "^19.2.4" + } + }, + "node_modules/react-error-boundary": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/react-error-boundary/-/react-error-boundary-6.1.0.tgz", + "integrity": "sha512-02k9WQ/mUhdbXir0tC1NiMesGzRPaCsJEWU/4bcFrbY1YMZOtHShtZP6zw0SJrBWA/31H0KT9/FgdL8+sPKgHA==", + "license": "MIT", + "peerDependencies": { + "react": "^18.0.0 || ^19.0.0" } }, "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==" + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", + "license": "MIT" }, "node_modules/react-remove-scroll": { - "version": "2.5.7", - "resolved": "https://registry.npmjs.org/react-remove-scroll/-/react-remove-scroll-2.5.7.tgz", - "integrity": "sha512-FnrTWO4L7/Bhhf3CYBNArEG/yROV0tKmTv7/3h9QCFvH6sndeFf1wPqOcbFVu5VAulS5dV1wGT3GZZ/1GawqiA==", + "version": "2.7.2", + "resolved": "https://registry.npmjs.org/react-remove-scroll/-/react-remove-scroll-2.7.2.tgz", + "integrity": "sha512-Iqb9NjCCTt6Hf+vOdNIZGdTiH1QSqr27H/Ek9sv/a97gfueI/5h1s3yRi1nngzMUaOOToin5dI1dXKdXiF+u0Q==", + "license": "MIT", "dependencies": { - "react-remove-scroll-bar": "^2.3.4", - "react-style-singleton": "^2.2.1", + "react-remove-scroll-bar": "^2.3.7", + "react-style-singleton": "^2.2.3", "tslib": "^2.1.0", - "use-callback-ref": "^1.3.0", - "use-sidecar": "^1.1.2" + "use-callback-ref": "^1.3.3", + "use-sidecar": "^1.1.3" }, "engines": { "node": ">=10" }, "peerDependencies": { - "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0", - "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + "@types/react": "*", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" }, "peerDependenciesMeta": { "@types/react": { @@ -8433,19 +10876,20 @@ } }, "node_modules/react-remove-scroll-bar": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/react-remove-scroll-bar/-/react-remove-scroll-bar-2.3.6.tgz", - "integrity": "sha512-DtSYaao4mBmX+HDo5YWYdBWQwYIQQshUV/dVxFxK+KM26Wjwp1gZ6rv6OC3oujI6Bfu6Xyg3TwK533AQutsn/g==", + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/react-remove-scroll-bar/-/react-remove-scroll-bar-2.3.8.tgz", + "integrity": "sha512-9r+yi9+mgU33AKcj6IbT9oRCO78WriSj6t/cF8DWBZJ9aOGPOTEDvdUDz1FwKim7QXWwmHqtdHnRJfhAxEG46Q==", + "license": "MIT", "dependencies": { - "react-style-singleton": "^2.2.1", + "react-style-singleton": "^2.2.2", "tslib": "^2.0.0" }, "engines": { "node": ">=10" }, "peerDependencies": { - "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0", - "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + "@types/react": "*", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" }, "peerDependenciesMeta": { "@types/react": { @@ -8453,21 +10897,43 @@ } } }, + "node_modules/react-router": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-7.13.0.tgz", + "integrity": "sha512-PZgus8ETambRT17BUm/LL8lX3Of+oiLaPuVTRH3l1eLvSPpKO3AvhAEb5N7ihAFZQrYDqkvvWfFh9p0z9VsjLw==", + "license": "MIT", + "dependencies": { + "cookie": "^1.0.1", + "set-cookie-parser": "^2.6.0" + }, + "engines": { + "node": ">=20.0.0" + }, + "peerDependencies": { + "react": ">=18", + "react-dom": ">=18" + }, + "peerDependenciesMeta": { + "react-dom": { + "optional": true + } + } + }, "node_modules/react-style-singleton": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/react-style-singleton/-/react-style-singleton-2.2.1.tgz", - "integrity": "sha512-ZWj0fHEMyWkHzKYUr2Bs/4zU6XLmq9HsgBURm7g5pAVfyn49DgUiNgY2d4lXRlYSiCif9YBGpQleewkcqddc7g==", + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/react-style-singleton/-/react-style-singleton-2.2.3.tgz", + "integrity": "sha512-b6jSvxvVnyptAiLjbkWLE/lOnR4lfTtDAl+eUC7RZy+QQWc6wRzIV2CE6xBuMmDxc2qIihtDCZD5NPOFl7fRBQ==", + "license": "MIT", "dependencies": { "get-nonce": "^1.0.0", - "invariant": "^2.2.4", "tslib": "^2.0.0" }, "engines": { "node": ">=10" }, "peerDependencies": { - "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0", - "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + "@types/react": "*", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" }, "peerDependenciesMeta": { "@types/react": { @@ -8479,6 +10945,7 @@ "version": "3.6.0", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "license": "MIT", "dependencies": { "picomatch": "^2.2.1" }, @@ -8486,217 +10953,199 @@ "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/redent/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/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/rehype": { - "version": "13.0.1", - "resolved": "https://registry.npmjs.org/rehype/-/rehype-13.0.1.tgz", - "integrity": "sha512-AcSLS2mItY+0fYu9xKxOu1LhUZeBZZBx8//5HKzF+0XP+eP8+6a5MXn2+DW2kfXR6Dtp1FEXMVrjyKAcvcU8vg==", - "dependencies": { - "@types/hast": "^3.0.0", - "rehype-parse": "^9.0.0", - "rehype-stringify": "^10.0.0", - "unified": "^11.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/rehype-parse": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/rehype-parse/-/rehype-parse-9.0.0.tgz", - "integrity": "sha512-WG7nfvmWWkCR++KEkZevZb/uw41E8TsH4DsY9UxsTbIXCVGbAs4S+r8FrQ+OtH5EEQAs+5UxKC42VinkmpA1Yw==", + "node_modules/recma-build-jsx": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/recma-build-jsx/-/recma-build-jsx-1.0.0.tgz", + "integrity": "sha512-8GtdyqaBcDfva+GUKDr3nev3VpKAhup1+RvkMvUxURHpW7QyIvk9F5wz7Vzo06CEMSilw6uArgRqhpiUcWp8ew==", + "license": "MIT", "dependencies": { - "@types/hast": "^3.0.0", - "hast-util-from-html": "^2.0.0", - "unified": "^11.0.0" + "@types/estree": "^1.0.0", + "estree-util-build-jsx": "^3.0.0", + "vfile": "^6.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/unified" } }, - "node_modules/rehype-stringify": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/rehype-stringify/-/rehype-stringify-10.0.0.tgz", - "integrity": "sha512-1TX1i048LooI9QoecrXy7nGFFbFSufxVRAfc6Y9YMRAi56l+oB0zP51mLSV312uRuvVLPV1opSlJmslozR1XHQ==", + "node_modules/recma-jsx": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/recma-jsx/-/recma-jsx-1.0.1.tgz", + "integrity": "sha512-huSIy7VU2Z5OLv6oFLosQGGDqPqdO1iq6bWNAdhzMxSJP7RAso4fCZ1cKu8j9YHCZf3TPrq4dw3okhrylgcd7w==", + "license": "MIT", "dependencies": { - "@types/hast": "^3.0.0", - "hast-util-to-html": "^9.0.0", + "acorn-jsx": "^5.0.0", + "estree-util-to-js": "^2.0.0", + "recma-parse": "^1.0.0", + "recma-stringify": "^1.0.0", "unified": "^11.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/unified" + }, + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, - "node_modules/remark": { - "version": "15.0.1", - "resolved": "https://registry.npmjs.org/remark/-/remark-15.0.1.tgz", - "integrity": "sha512-Eht5w30ruCXgFmxVUSlNWQ9iiimq07URKeFS3hNc8cUWy1llX4KDWfyEDZRycMc+znsN9Ux5/tJ/BFdgdOwA3A==", + "node_modules/recma-parse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/recma-parse/-/recma-parse-1.0.0.tgz", + "integrity": "sha512-OYLsIGBB5Y5wjnSnQW6t3Xg7q3fQ7FWbw/vcXtORTnyaSFscOtABg+7Pnz6YZ6c27fG1/aN8CjfwoUEUIdwqWQ==", + "license": "MIT", "dependencies": { - "@types/mdast": "^4.0.0", - "remark-parse": "^11.0.0", - "remark-stringify": "^11.0.0", - "unified": "^11.0.0" + "@types/estree": "^1.0.0", + "esast-util-from-js": "^2.0.0", + "unified": "^11.0.0", + "vfile": "^6.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/unified" } }, - "node_modules/remark-autolink-headings": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/remark-autolink-headings/-/remark-autolink-headings-7.0.1.tgz", - "integrity": "sha512-a1BIwoJ0cSnX+sPp5u3AFULBFWHGYBt57Fo4a+7IlGiJOQxs8b7uYAE5Iu26Ocl7Y5cvinZy3FaGVruLCKg6vA==", + "node_modules/recma-stringify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/recma-stringify/-/recma-stringify-1.0.0.tgz", + "integrity": "sha512-cjwII1MdIIVloKvC9ErQ+OgAtwHBmcZ0Bg4ciz78FtbT8In39aAYbaA7zvxQ61xVMSPE8WxhLwLbhif4Js2C+g==", + "license": "MIT", "dependencies": { - "@types/hast": "^2.0.0", - "@types/mdast": "^3.0.0", - "extend": "^3.0.0", - "unified": "^10.0.0", - "unist-util-visit": "^4.0.0" + "@types/estree": "^1.0.0", + "estree-util-to-js": "^2.0.0", + "unified": "^11.0.0", + "vfile": "^6.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/unified" } }, - "node_modules/remark-autolink-headings/node_modules/@types/hast": { - "version": "2.3.10", - "resolved": "https://registry.npmjs.org/@types/hast/-/hast-2.3.10.tgz", - "integrity": "sha512-McWspRw8xx8J9HurkVBfYj0xKoE25tOFlHGdx4MJ5xORQrMGZNqJhVQWaIbm6Oyla5kYOXtDiopzKRJzEOkwJw==", + "node_modules/redent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz", + "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==", + "license": "MIT", "dependencies": { - "@types/unist": "^2" + "indent-string": "^4.0.0", + "strip-indent": "^3.0.0" + }, + "engines": { + "node": ">=8" } }, - "node_modules/remark-autolink-headings/node_modules/@types/mdast": { - "version": "3.0.15", - "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.15.tgz", - "integrity": "sha512-LnwD+mUEfxWMa1QpDraczIn6k0Ee3SMicuYSSzS6ZYl2gKS09EClnJYGd8Du6rfc5r/GZEk5o1mRb8TaTj03sQ==", + "node_modules/regex": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/regex/-/regex-6.1.0.tgz", + "integrity": "sha512-6VwtthbV4o/7+OaAF9I5L5V3llLEsoPyq9P1JVXkedTP33c7MfCG0/5NOPcSJn0TzXcG9YUrR0gQSWioew3LDg==", + "license": "MIT", "dependencies": { - "@types/unist": "^2" + "regex-utilities": "^2.3.0" } }, - "node_modules/remark-autolink-headings/node_modules/@types/unist": { - "version": "2.0.11", - "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.11.tgz", - "integrity": "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==" - }, - "node_modules/remark-autolink-headings/node_modules/unified": { - "version": "10.1.2", - "resolved": "https://registry.npmjs.org/unified/-/unified-10.1.2.tgz", - "integrity": "sha512-pUSWAi/RAnVy1Pif2kAoeWNBa3JVrx0MId2LASj8G+7AiHWoKZNTomq6LG326T68U7/e263X6fTdcXIy7XnF7Q==", + "node_modules/regex-recursion": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/regex-recursion/-/regex-recursion-6.0.2.tgz", + "integrity": "sha512-0YCaSCq2VRIebiaUviZNs0cBz1kg5kVS2UKUfNIx8YVs1cN3AV7NTctO5FOKBA+UT2BPJIWZauYHPqJODG50cg==", + "license": "MIT", "dependencies": { - "@types/unist": "^2.0.0", - "bail": "^2.0.0", - "extend": "^3.0.0", - "is-buffer": "^2.0.0", - "is-plain-obj": "^4.0.0", - "trough": "^2.0.0", - "vfile": "^5.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "regex-utilities": "^2.3.0" } }, - "node_modules/remark-autolink-headings/node_modules/unist-util-is": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-5.2.1.tgz", - "integrity": "sha512-u9njyyfEh43npf1M+yGKDGVPbY/JWEemg5nH05ncKPfi+kBbKBJoTdsogMu33uhytuLlv9y0O7GH7fEdwLdLQw==", + "node_modules/regex-utilities": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/regex-utilities/-/regex-utilities-2.3.0.tgz", + "integrity": "sha512-8VhliFJAWRaUiVvREIiW2NXXTmHs4vMNnSzuJVhscgmGav3g9VDxLrQndI3dZZVVdp0ZO/5v0xmX516/7M9cng==", + "license": "MIT" + }, + "node_modules/rehype": { + "version": "13.0.2", + "resolved": "https://registry.npmjs.org/rehype/-/rehype-13.0.2.tgz", + "integrity": "sha512-j31mdaRFrwFRUIlxGeuPXXKWQxet52RBQRvCmzl5eCefn/KGbomK5GMHNMsOJf55fgo3qw5tST5neDuarDYR2A==", + "license": "MIT", "dependencies": { - "@types/unist": "^2.0.0" + "@types/hast": "^3.0.0", + "rehype-parse": "^9.0.0", + "rehype-stringify": "^10.0.0", + "unified": "^11.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/unified" } }, - "node_modules/remark-autolink-headings/node_modules/unist-util-stringify-position": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-3.0.3.tgz", - "integrity": "sha512-k5GzIBZ/QatR8N5X2y+drfpWG8IDBzdnVj6OInRNWm1oXrzydiaAT2OQiA8DPRRZyAKb9b6I2a6PxYklZD0gKg==", + "node_modules/rehype-autolink-headings": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/rehype-autolink-headings/-/rehype-autolink-headings-7.1.0.tgz", + "integrity": "sha512-rItO/pSdvnvsP4QRB1pmPiNHUskikqtPojZKJPPPAVx9Hj8i8TwMBhofrrAYRhYOOBZH9tgmG5lPqDLuIWPWmw==", + "license": "MIT", "dependencies": { - "@types/unist": "^2.0.0" + "@types/hast": "^3.0.0", + "@ungap/structured-clone": "^1.0.0", + "hast-util-heading-rank": "^3.0.0", + "hast-util-is-element": "^3.0.0", + "unified": "^11.0.0", + "unist-util-visit": "^5.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/unified" } }, - "node_modules/remark-autolink-headings/node_modules/unist-util-visit": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-4.1.2.tgz", - "integrity": "sha512-MSd8OUGISqHdVvfY9TPhyK2VdUrPgxkUtWSuMHF6XAAFuL4LokseigBnZtPnJMu+FbynTkFNnFlyjxpVKujMRg==", + "node_modules/rehype-parse": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/rehype-parse/-/rehype-parse-9.0.1.tgz", + "integrity": "sha512-ksCzCD0Fgfh7trPDxr2rSylbwq9iYDkSn8TCDmEJ49ljEUBxDVCzCHv7QNzZOfODanX4+bWQ4WZqLCRWYLfhag==", + "license": "MIT", "dependencies": { - "@types/unist": "^2.0.0", - "unist-util-is": "^5.0.0", - "unist-util-visit-parents": "^5.1.1" + "@types/hast": "^3.0.0", + "hast-util-from-html": "^2.0.0", + "unified": "^11.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/unified" } }, - "node_modules/remark-autolink-headings/node_modules/unist-util-visit-parents": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-5.1.3.tgz", - "integrity": "sha512-x6+y8g7wWMyQhL1iZfhIPhDAs7Xwbn9nRosDXl7qoPTSCy0yNxnKc+hWokFifWQIDGi154rdUqKvbCa4+1kLhg==", + "node_modules/rehype-recma": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/rehype-recma/-/rehype-recma-1.0.0.tgz", + "integrity": "sha512-lqA4rGUf1JmacCNWWZx0Wv1dHqMwxzsDWYMTowuplHF3xH0N/MmrZ/G3BDZnzAkRmxDadujCjaKM2hqYdCBOGw==", + "license": "MIT", "dependencies": { - "@types/unist": "^2.0.0", - "unist-util-is": "^5.0.0" + "@types/estree": "^1.0.0", + "@types/hast": "^3.0.0", + "hast-util-to-estree": "^3.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/unified" } }, - "node_modules/remark-autolink-headings/node_modules/vfile": { - "version": "5.3.7", - "resolved": "https://registry.npmjs.org/vfile/-/vfile-5.3.7.tgz", - "integrity": "sha512-r7qlzkgErKjobAmyNIkkSpizsFPYiUPuJb5pNW1RB4JcYVZhs4lIbVqk8XPk033CV/1z8ss5pkax8SuhGpcG8g==", + "node_modules/rehype-stringify": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/rehype-stringify/-/rehype-stringify-10.0.1.tgz", + "integrity": "sha512-k9ecfXHmIPuFVI61B9DeLPN0qFHfawM6RsuX48hoqlaKSF61RskNjSm1lI8PhBEM0MRdLxVVm4WmTqJQccH9mA==", + "license": "MIT", "dependencies": { - "@types/unist": "^2.0.0", - "is-buffer": "^2.0.0", - "unist-util-stringify-position": "^3.0.0", - "vfile-message": "^3.0.0" + "@types/hast": "^3.0.0", + "hast-util-to-html": "^9.0.0", + "unified": "^11.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/unified" } }, - "node_modules/remark-autolink-headings/node_modules/vfile-message": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-3.1.4.tgz", - "integrity": "sha512-fa0Z6P8HUrQN4BZaX05SIVXic+7kE3b05PWAtPuYP9QLHsLKYR7/AlLW3NtOrpXRLeawpDLMsVkmk5DG0NXgWw==", + "node_modules/remark": { + "version": "15.0.1", + "resolved": "https://registry.npmjs.org/remark/-/remark-15.0.1.tgz", + "integrity": "sha512-Eht5w30ruCXgFmxVUSlNWQ9iiimq07URKeFS3hNc8cUWy1llX4KDWfyEDZRycMc+znsN9Ux5/tJ/BFdgdOwA3A==", + "license": "MIT", "dependencies": { - "@types/unist": "^2.0.0", - "unist-util-stringify-position": "^3.0.0" + "@types/mdast": "^4.0.0", + "remark-parse": "^11.0.0", + "remark-stringify": "^11.0.0", + "unified": "^11.0.0" }, "funding": { "type": "opencollective", @@ -8704,24 +11153,26 @@ } }, "node_modules/remark-emoji": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/remark-emoji/-/remark-emoji-4.0.1.tgz", - "integrity": "sha512-fHdvsTR1dHkWKev9eNyhTo4EFwbUvJ8ka9SgeWkMPYFX4WoI7ViVBms3PjlQYgw5TLvNQso3GUB/b/8t3yo+dg==", + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/remark-emoji/-/remark-emoji-5.0.2.tgz", + "integrity": "sha512-IyIqGELcyK5AVdLFafoiNww+Eaw/F+rGrNSXoKucjo95uL267zrddgxGM83GN1wFIb68pyDuAsY3m5t2Cav1pQ==", + "license": "MIT", "dependencies": { - "@types/mdast": "^4.0.2", + "@types/mdast": "^4.0.4", "emoticon": "^4.0.1", "mdast-util-find-and-replace": "^3.0.1", - "node-emoji": "^2.1.0", + "node-emoji": "^2.1.3", "unified": "^11.0.4" }, "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + "node": ">=18" } }, "node_modules/remark-frontmatter": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/remark-frontmatter/-/remark-frontmatter-5.0.0.tgz", "integrity": "sha512-XTFYvNASMe5iPN0719nPrdItC9aU0ssC4v14mH1BCi1u0n1gAocqcujWUrByftZTbLhRtiKRyjYTSIOcr69UVQ==", + "license": "MIT", "dependencies": { "@types/mdast": "^4.0.0", "mdast-util-frontmatter": "^2.0.0", @@ -8734,9 +11185,10 @@ } }, "node_modules/remark-gfm": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/remark-gfm/-/remark-gfm-4.0.0.tgz", - "integrity": "sha512-U92vJgBPkbw4Zfu/IiW2oTZLSL3Zpv+uI7My2eq8JxKgqraFdU8YUGicEJCEgSbeaG+QDFqIcwwfMTOEelPxuA==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/remark-gfm/-/remark-gfm-4.0.1.tgz", + "integrity": "sha512-1quofZ2RQ9EWdeN34S79+KExV1764+wCUGop5CPL1WGdD0ocPpu91lzPGbwWMECpEpd42kJGQwzRfyov9j4yNg==", + "license": "MIT", "dependencies": { "@types/mdast": "^4.0.0", "mdast-util-gfm": "^3.0.0", @@ -8751,9 +11203,10 @@ } }, "node_modules/remark-mdx": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/remark-mdx/-/remark-mdx-3.0.1.tgz", - "integrity": "sha512-3Pz3yPQ5Rht2pM5R+0J2MrGoBSrzf+tJG94N+t/ilfdh8YLyyKYtidAYwTveB20BoHAcwIopOUqhcmh2F7hGYA==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/remark-mdx/-/remark-mdx-3.1.1.tgz", + "integrity": "sha512-Pjj2IYlUY3+D8x00UJsIOg5BEvfMyeI+2uLPn9VO9Wg4MEtN/VTIq2NEJQfde9PnX15KgtHyl9S0BcTnWrIuWg==", + "license": "MIT", "dependencies": { "mdast-util-mdx": "^3.0.0", "micromark-extension-mdxjs": "^3.0.0" @@ -8767,6 +11220,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/remark-mdx-frontmatter/-/remark-mdx-frontmatter-4.0.0.tgz", "integrity": "sha512-PZzAiDGOEfv1Ua7exQ8S5kKxkD8CDaSb4nM+1Mprs6u8dyvQifakh+kCj6NovfGXW+bTvrhjaR3srzjS2qJHKg==", + "license": "MIT", "dependencies": { "@types/mdast": "^4.0.0", "estree-util-is-identifier-name": "^3.0.0", @@ -8783,6 +11237,7 @@ "version": "11.0.0", "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-11.0.0.tgz", "integrity": "sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA==", + "license": "MIT", "dependencies": { "@types/mdast": "^4.0.0", "mdast-util-from-markdown": "^2.0.0", @@ -8795,9 +11250,10 @@ } }, "node_modules/remark-rehype": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/remark-rehype/-/remark-rehype-11.1.0.tgz", - "integrity": "sha512-z3tJrAs2kIs1AqIIy6pzHmAHlF1hWQ+OdY4/hv+Wxe35EhyLKcajL33iUEn3ScxtFox9nUvRufR/Zre8Q08H/g==", + "version": "11.1.2", + "resolved": "https://registry.npmjs.org/remark-rehype/-/remark-rehype-11.1.2.tgz", + "integrity": "sha512-Dh7l57ianaEoIpzbp0PC9UKAdCSVklD8E5Rpw7ETfbTl3FqcOOgq5q2LVDhgGCkaBv7p24JXikPdvhhmHvKMsw==", + "license": "MIT", "dependencies": { "@types/hast": "^3.0.0", "@types/mdast": "^4.0.0", @@ -8814,6 +11270,7 @@ "version": "11.0.0", "resolved": "https://registry.npmjs.org/remark-stringify/-/remark-stringify-11.0.0.tgz", "integrity": "sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw==", + "license": "MIT", "dependencies": { "@types/mdast": "^4.0.0", "mdast-util-to-markdown": "^2.0.0", @@ -8825,69 +11282,276 @@ } }, "node_modules/remix-flat-routes": { - "version": "0.6.5", - "resolved": "https://registry.npmjs.org/remix-flat-routes/-/remix-flat-routes-0.6.5.tgz", - "integrity": "sha512-VvPak+LCxL4Fm6Kb/nqPLipB71k9p+GXpzRNPVxs9FmCeJ7hxVmQ3HQMpStzuRQyAh0PMkaX6mBiRlCRHTCYHw==", + "version": "0.8.5", + "resolved": "https://registry.npmjs.org/remix-flat-routes/-/remix-flat-routes-0.8.5.tgz", + "integrity": "sha512-30GcEpvwqFXCyTKiCTeqI3QSNyTg+f0qLGeIc95y6o3gaOEIhbC37qWpe8HrVEkdnj48xUyaUK03jm1zYFkhfA==", + "license": "MIT", "dependencies": { - "@remix-run/v1-route-convention": "^0.1.3", - "fs-extra": "^11.1.1", - "minimatch": "^5.1.0" + "fs-extra": "^11.2.0", + "minimatch": "^10.0.1" }, "bin": { - "migrate-flat-routes": "dist/cli.js" + "migrate-flat-routes": "dist/cli.cjs" }, - "peerDependencies": { - "@remix-run/dev": "^1.15.0 || ^2" + "engines": { + "node": ">=16.6.0" } }, "node_modules/remix-flat-routes/node_modules/minimatch": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", - "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "version": "10.1.1", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.1.1.tgz", + "integrity": "sha512-enIvLvRAFZYXJzkCYG5RKmPfrFArdLv+R+lbQ53BmIMLIry74bjKzX6iHAm8WYamJkhSSEabrWN5D97XnKObjQ==", + "license": "BlueOak-1.0.0", "dependencies": { - "brace-expansion": "^2.0.1" + "@isaacs/brace-expansion": "^5.0.0" }, "engines": { - "node": ">=10" + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/remix-utils": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/remix-utils/-/remix-utils-9.0.0.tgz", + "integrity": "sha512-xpDnw6hIjYbHR9/noE4lKNPRzfxvGai3XBQcjOjcwIwZVW9O1bdsnYAl+aqJ2fMXSQTNMjNuR8Cetn76HqwXCg==", + "funding": [ + "https://github.com/sponsors/sergiodxa" + ], + "license": "MIT", + "dependencies": { + "type-fest": "^4.41.0" + }, + "engines": { + "node": ">=20.0.0" + }, + "peerDependencies": { + "@edgefirst-dev/batcher": "^1.0.0", + "@edgefirst-dev/jwt": "^1.2.0", + "@edgefirst-dev/server-timing": "^0.0.1", + "@oslojs/crypto": "^1.0.1", + "@oslojs/encoding": "^1.1.0", + "@standard-schema/spec": "^1.0.0", + "intl-parse-accept-language": "^1.0.0", + "is-ip": "^5.0.1", + "react": "^18.0.0 || ^19.0.0", + "react-router": "^7.0.0" + }, + "peerDependenciesMeta": { + "@edgefirst-dev/batcher": { + "optional": true + }, + "@edgefirst-dev/jwt": { + "optional": true + }, + "@edgefirst-dev/server-timing": { + "optional": true + }, + "@oslojs/crypto": { + "optional": true + }, + "@oslojs/encoding": { + "optional": true + }, + "@standard-schema/spec": { + "optional": true + }, + "intl-parse-accept-language": { + "optional": true + }, + "is-ip": { + "optional": true + }, + "react": { + "optional": true + }, + "react-router": { + "optional": true + } + } + }, + "node_modules/remix-utils/node_modules/type-fest": { + "version": "4.41.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.41.0.tgz", + "integrity": "sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==", + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/remove-accents": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/remove-accents/-/remove-accents-0.5.0.tgz", + "integrity": "sha512-8g3/Otx1eJaVD12e31UbJj1YzdtVvzH85HV7t+9MJYk/u3XmkOUJ5Ys9wQrf9PCPK8+xn4ymzqYCiZl6QWKn+A==", + "license": "MIT" + }, "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==", + "license": "MIT", "engines": { "node": ">=0.10.0" } }, + "node_modules/require-in-the-middle": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/require-in-the-middle/-/require-in-the-middle-8.0.1.tgz", + "integrity": "sha512-QT7FVMXfWOYFbeRBF6nu+I6tr2Tf3u0q8RIEjNob/heKY/nh7drD/k7eeMFmSQgnTtCzLDcCu/XEnpW2wk4xCQ==", + "license": "MIT", + "dependencies": { + "debug": "^4.3.5", + "module-details-from-path": "^1.0.3" + }, + "engines": { + "node": ">=9.3.0 || >=8.10.0 <9.0.0" + } + }, "node_modules/resolve": { - "version": "1.22.8", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", - "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", + "version": "1.22.11", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.11.tgz", + "integrity": "sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ==", + "license": "MIT", "dependencies": { - "is-core-module": "^2.13.0", + "is-core-module": "^2.16.1", "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": "5.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-5.1.0.tgz", + "integrity": "sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==", + "license": "MIT", + "dependencies": { + "onetime": "^7.0.0", + "signal-exit": "^4.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/rettime": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/rettime/-/rettime-0.7.0.tgz", + "integrity": "sha512-LPRKoHnLKd/r3dVxcwO7vhCW+orkOGj9ViueosEBK6ie89CijnfRlhaDhHq/3Hxu4CkWQtxwlBG0mzTQY6uQjw==", + "license": "MIT" + }, "node_modules/reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", + "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", + "license": "MIT", "engines": { "iojs": ">=1.0.0", "node": ">=0.10.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==", + "node_modules/robust-predicates": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/robust-predicates/-/robust-predicates-3.0.2.tgz", + "integrity": "sha512-IXgzBWvWQwE6PrDI05OvmXUIruQTcoMDzRsOd5CDvHCVLcLHMTSYvOK5Cm46kWqlV3yAbuSpBZdJ5oP5OUoStg==", + "license": "Unlicense" + }, + "node_modules/roughjs": { + "version": "4.6.6", + "resolved": "https://registry.npmjs.org/roughjs/-/roughjs-4.6.6.tgz", + "integrity": "sha512-ZUz/69+SYpFN/g/lUlo2FXcIjRkSu3nDarreVdGGndHEBJ6cXPdKguS8JGxwj5HA5xIbVKSmLgr5b3AWxtRfvQ==", + "license": "MIT", + "dependencies": { + "hachure-fill": "^0.5.2", + "path-data-parser": "^0.1.0", + "points-on-curve": "^0.2.0", + "points-on-path": "^0.2.1" + } + }, + "node_modules/router": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/router/-/router-2.2.0.tgz", + "integrity": "sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==", + "license": "MIT", + "dependencies": { + "debug": "^4.4.0", + "depd": "^2.0.0", + "is-promise": "^4.0.0", + "parseurl": "^1.3.3", + "path-to-regexp": "^8.0.0" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/router/node_modules/path-to-regexp": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-8.3.0.tgz", + "integrity": "sha512-7jdwVIRtsP8MYpdXSwOS0YdD0Du+qOoF/AEPIt88PcCFrZCzx41oxku1jD88hZBwbNUIEfpqvuhjFaMAqMTWnA==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/run-applescript": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/run-applescript/-/run-applescript-7.1.0.tgz", + "integrity": "sha512-DPe5pVFaAsinSaV6QjQ6gdiedWDcRCbUuiQfQa2wmWV7+xC9bGulGI8+TdRmoFkAPaBXk8CrAbnlY2ISniJ47Q==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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" + } + ], + "license": "MIT", + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/rw": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/rw/-/rw-1.3.3.tgz", + "integrity": "sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ==", + "license": "BSD-3-Clause" + }, + "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", @@ -8902,49 +11566,47 @@ "url": "https://feross.org/support" } ], - "dependencies": { - "queue-microtask": "^1.2.2" - } - }, - "node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + "license": "MIT" }, "node_modules/safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "license": "MIT" }, "node_modules/satori": { - "version": "0.10.14", - "resolved": "https://registry.npmjs.org/satori/-/satori-0.10.14.tgz", - "integrity": "sha512-abovcqmwl97WKioxpkfuMeZmndB1TuDFY/R+FymrZyiGP+pMYomvgSzVPnbNMWHHESOPosVHGL352oFbdAnJcA==", + "version": "0.19.1", + "resolved": "https://registry.npmjs.org/satori/-/satori-0.19.1.tgz", + "integrity": "sha512-/XaT/JiWLfNlgjlQdde4wXB1/6F+FEze9c3OW2QIH0ywsfOrY57YOetgESWyOFHW3JfEQ6dJAo2U9Xwb7+DDAw==", + "license": "MPL-2.0", "dependencies": { "@shuding/opentype.js": "1.4.0-beta.0", "css-background-parser": "^0.1.0", "css-box-shadow": "1.0.0-3", + "css-gradient-parser": "^0.0.17", "css-to-react-native": "^3.0.0", - "emoji-regex": "^10.2.1", + "emoji-regex-xs": "^2.0.1", "escape-html": "^1.0.3", "linebreak": "^1.1.0", "parse-css-color": "^0.2.1", "postcss-value-parser": "^4.2.0", - "yoga-wasm-web": "^0.3.3" + "yoga-layout": "^3.2.1" }, "engines": { "node": ">=16" } }, "node_modules/scheduler": { - "version": "0.25.0-rc-f994737d14-20240522", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.25.0-rc-f994737d14-20240522.tgz", - "integrity": "sha512-qS+xGFF7AljP2APO2iJe8zESNsK20k25MACz+WGOXPybUsRdi1ssvaoF93im2nSX2q/XT3wKkjdz6RQfbmaxdw==" + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.27.0.tgz", + "integrity": "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==", + "license": "MIT" }, "node_modules/section-matter": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/section-matter/-/section-matter-1.0.0.tgz", "integrity": "sha512-vfD3pmTzGpufjScBh50YHKzEu2lxBWhVEHsNGoEXmCmn2hKGfeNLYMzCJpe8cD7gqX7TJluOVpBkAequ6dgMmA==", + "license": "MIT", "dependencies": { "extend-shallow": "^2.0.1", "kind-of": "^6.0.0" @@ -8954,85 +11616,71 @@ } }, "node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "version": "7.7.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", + "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", + "license": "ISC", "bin": { "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" } }, "node_modules/send": { - "version": "0.18.0", - "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", - "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/send/-/send-1.2.0.tgz", + "integrity": "sha512-uaW0WwXKpL9blXE2o0bRhoL2EGXIrZxQ2ZQ4mgcfoBxdFmQold+qWsD2jLrfZ0trjKL6vOw0j//eAwcALFjKSw==", + "license": "MIT", "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" + "debug": "^4.3.5", + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "etag": "^1.8.1", + "fresh": "^2.0.0", + "http-errors": "^2.0.0", + "mime-types": "^3.0.1", + "ms": "^2.1.3", + "on-finished": "^2.4.1", + "range-parser": "^1.2.1", + "statuses": "^2.0.1" }, "engines": { - "node": ">= 0.8.0" + "node": ">= 18" } }, - "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/serve-static": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", - "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-2.2.0.tgz", + "integrity": "sha512-61g9pCh0Vnh7IutZjtLGGpTA355+OPn2TyDv/6ivP2h/AdAVX9azsoxmg2/M6nZeQZNYBEwIcsne1mJd9oQItQ==", + "license": "MIT", "dependencies": { - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "parseurl": "~1.3.3", - "send": "0.18.0" + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "parseurl": "^1.3.3", + "send": "^1.2.0" }, "engines": { - "node": ">= 0.8.0" + "node": ">= 18" } }, "node_modules/set-cookie-parser": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-2.6.0.tgz", - "integrity": "sha512-RVnVQxTXuerk653XfuliOxBP81Sf0+qfQE73LIYKcyMYHG94AuH0kgrQpRDuTZnSmjpysHmzxJXKNfa6PjFhyQ==" - }, - "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" - } + "version": "2.7.2", + "resolved": "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-2.7.2.tgz", + "integrity": "sha512-oeM1lpU/UvhTxw+g3cIfxXHyJRc/uidd3yK1P242gzHds0udQBYzs3y8j4gCCW+ZJ7ad0yctld8RYO+bdurlvw==", + "license": "MIT" }, "node_modules/setprototypeof": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", - "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", + "license": "ISC" }, "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==", + "license": "MIT", "dependencies": { "shebang-regex": "^3.0.0" }, @@ -9044,36 +11692,103 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/shell-quote": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.1.tgz", - "integrity": "sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==", + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.3.tgz", + "integrity": "sha512-ObmnIF4hXNg1BqhnHmgbDETF8dLPCggZWBjkQfhZpbszZnYur5DUljTcCHii5LC3J5E0yeO/1LIMyH+UvHQgyw==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/shiki": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/shiki/-/shiki-1.14.1.tgz", - "integrity": "sha512-FujAN40NEejeXdzPt+3sZ3F2dx1U24BY2XTY01+MG8mbxCiA2XukXdcbyMyLAHJ/1AUUnQd1tZlvIjefWWEJeA==", + "version": "3.21.0", + "resolved": "https://registry.npmjs.org/shiki/-/shiki-3.21.0.tgz", + "integrity": "sha512-N65B/3bqL/TI2crrXr+4UivctrAGEjmsib5rPMMPpFp1xAx/w03v8WZ9RDDFYteXoEgY7qZ4HGgl5KBIu1153w==", + "license": "MIT", "dependencies": { - "@shikijs/core": "1.14.1", + "@shikijs/core": "3.21.0", + "@shikijs/engine-javascript": "3.21.0", + "@shikijs/engine-oniguruma": "3.21.0", + "@shikijs/langs": "3.21.0", + "@shikijs/themes": "3.21.0", + "@shikijs/types": "3.21.0", + "@shikijs/vscode-textmate": "^10.0.2", "@types/hast": "^3.0.4" } }, "node_modules/side-channel": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", - "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", + "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", + "license": "MIT", + "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==", + "license": "MIT", + "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==", + "license": "MIT", + "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==", + "license": "MIT", "dependencies": { - "call-bind": "^1.0.7", + "call-bound": "^1.0.2", "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.4", - "object-inspect": "^1.13.1" + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3", + "side-channel-map": "^1.0.1" }, "engines": { "node": ">= 0.4" @@ -9086,6 +11801,7 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "license": "ISC", "engines": { "node": ">=14" }, @@ -9097,6 +11813,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/skin-tone/-/skin-tone-2.0.0.tgz", "integrity": "sha512-kUMbT1oBJCpgrnKoSr0o6wPtvRWT9W9UKvGLwfJYO2WuahZRHOpEyL1ckyMGgMWh0UdpmaoFqKKD29WTomNEGA==", + "license": "MIT", "dependencies": { "unicode-emoji-modifier-base": "^1.0.0" }, @@ -9108,6 +11825,7 @@ "version": "5.1.0", "resolved": "https://registry.npmjs.org/slash/-/slash-5.1.0.tgz", "integrity": "sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg==", + "license": "MIT", "engines": { "node": ">=14.16" }, @@ -9116,26 +11834,29 @@ } }, "node_modules/sonner": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/sonner/-/sonner-1.5.0.tgz", - "integrity": "sha512-FBjhG/gnnbN6FY0jaNnqZOMmB73R+5IiyYAw8yBj7L54ER7HB3fOSE5OFiQiE2iXWxeXKvg6fIP4LtVppHEdJA==", + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/sonner/-/sonner-2.0.7.tgz", + "integrity": "sha512-W6ZN4p58k8aDKA4XPcx2hpIQXBRAgyiWVkYhT7CvK6D3iAu7xjvVyhQHg2/iaKJZ1XVJ4r7XuwGL+WGEK37i9w==", + "license": "MIT", "peerDependencies": { - "react": "^18.0.0", - "react-dom": "^18.0.0" + "react": "^18.0.0 || ^19.0.0 || ^19.0.0-rc", + "react-dom": "^18.0.0 || ^19.0.0 || ^19.0.0-rc" } }, "node_modules/source-map": { - "version": "0.7.4", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", - "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==", + "version": "0.7.6", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.6.tgz", + "integrity": "sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ==", + "license": "BSD-3-Clause", "engines": { - "node": ">= 8" + "node": ">= 12" } }, "node_modules/source-map-support": { "version": "0.5.21", "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "license": "MIT", "dependencies": { "buffer-from": "^1.0.0", "source-map": "^0.6.0" @@ -9145,6 +11866,7 @@ "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" } @@ -9153,15 +11875,17 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-2.0.2.tgz", "integrity": "sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==", + "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" } }, "node_modules/spin-delay": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/spin-delay/-/spin-delay-2.0.0.tgz", - "integrity": "sha512-uNQnIjJ3Ms5ojVUMJaUZrF2Gs2gsSrVExueYrh8/yGg+ecPj65aZ0QI6ln7dguw9Wpp+bVCqGeY2Q9bT4MCL/A==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/spin-delay/-/spin-delay-2.0.1.tgz", + "integrity": "sha512-ilggKXKqAMwk21PSYvxuF/KCnrsGFDrnO6mXa629mj8fvfo+dOQfubDViqsRjRX5U1jd3Xb8FTsV+m4Tg7YeUg==", + "license": "MIT", "peerDependencies": { "react": ">=17.0.1" } @@ -9169,37 +11893,47 @@ "node_modules/sprintf-js": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==" + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", + "license": "BSD-3-Clause" }, "node_modules/statuses": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", - "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz", + "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==", + "license": "MIT", "engines": { "node": ">= 0.8" } }, - "node_modules/stream-slice": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/stream-slice/-/stream-slice-0.1.2.tgz", - "integrity": "sha512-QzQxpoacatkreL6jsxnVb7X5R/pGw9OUv2qWTYWnmLpg4NdN31snPy/f3TdQE1ZUXaThRvj1Zw4/OGg0ZkaLMA==" + "node_modules/stdin-discarder": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/stdin-discarder/-/stdin-discarder-0.2.2.tgz", + "integrity": "sha512-UhDfHmA92YAlNnCfhmq0VeNL5bDbiZGg7sZ2IvPsXubGkiNa9EC+tUTsjBRsYUAz87btI6/1wf4XoVvQ3uRnmQ==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, "node_modules/strict-event-emitter": { "version": "0.5.1", "resolved": "https://registry.npmjs.org/strict-event-emitter/-/strict-event-emitter-0.5.1.tgz", - "integrity": "sha512-vMgjE/GGEPEFnhFub6pa4FmJBRBVOLpIII2hvCZ8Kzb7K0hlHo7mQv6xYrBvCL2LtAIBwFUK8wvuJgTVSQ5MFQ==" + "integrity": "sha512-vMgjE/GGEPEFnhFub6pa4FmJBRBVOLpIII2hvCZ8Kzb7K0hlHo7mQv6xYrBvCL2LtAIBwFUK8wvuJgTVSQ5MFQ==", + "license": "MIT" }, "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==", + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-8.1.0.tgz", + "integrity": "sha512-Kxl3KJGb/gxkaUMOjRsQ8IrXiGW75O4E3RPjFIINOVH8AMl2SQ/yWdTzWwF3FevIX9LcMAjJW+GRwAlAbTSXdg==", + "license": "MIT", "dependencies": { - "eastasianwidth": "^0.2.0", - "emoji-regex": "^9.2.2", - "strip-ansi": "^7.0.1" + "get-east-asian-width": "^1.3.0", + "strip-ansi": "^7.1.0" }, "engines": { - "node": ">=12" + "node": ">=20" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -9210,6 +11944,7 @@ "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "license": "MIT", "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", @@ -9219,15 +11954,11 @@ "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==", + "license": "MIT", "dependencies": { "ansi-regex": "^5.0.1" }, @@ -9235,20 +11966,17 @@ "node": ">=8" } }, - "node_modules/string-width/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/string.prototype.codepointat": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/string.prototype.codepointat/-/string.prototype.codepointat-0.2.1.tgz", - "integrity": "sha512-2cBVCj6I4IOvEnjgO/hWqXjqBGsY+zwPmHl12Srk9IXSZ56Jwwmy+66XO5Iut/oQVR7t5ihYdLB0GMa4alEUcg==" + "integrity": "sha512-2cBVCj6I4IOvEnjgO/hWqXjqBGsY+zwPmHl12Srk9IXSZ56Jwwmy+66XO5Iut/oQVR7t5ihYdLB0GMa4alEUcg==", + "license": "MIT" }, "node_modules/stringify-entities": { "version": "4.0.4", "resolved": "https://registry.npmjs.org/stringify-entities/-/stringify-entities-4.0.4.tgz", "integrity": "sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==", + "license": "MIT", "dependencies": { "character-entities-html4": "^2.0.0", "character-entities-legacy": "^3.0.0" @@ -9259,9 +11987,10 @@ } }, "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==", + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz", + "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==", + "license": "MIT", "dependencies": { "ansi-regex": "^6.0.1" }, @@ -9277,6 +12006,7 @@ "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "license": "MIT", "dependencies": { "ansi-regex": "^5.0.1" }, @@ -9285,9 +12015,10 @@ } }, "node_modules/strip-ansi/node_modules/ansi-regex": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "license": "MIT", "engines": { "node": ">=12" }, @@ -9299,6 +12030,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/strip-bom-string/-/strip-bom-string-1.0.0.tgz", "integrity": "sha512-uCC2VHvQRYu+lMh4My/sFNmF2klFymLX1wHJeXnbEJERpV/ZsVuonzerjfrGpIGF7LBVa1O7i9kjiWvJiFck8g==", + "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -9307,6 +12039,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-4.0.0.tgz", "integrity": "sha512-aulFJcD6YK8V1G7iRB5tigAP4TsHBZZrOV8pjV++zdUwmeV8uzbY7yn6h9MswN62adStNZFuCIx4haBnRuMDaw==", + "license": "MIT", "engines": { "node": ">=18" }, @@ -9318,6 +12051,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", + "license": "MIT", "dependencies": { "min-indent": "^1.0.0" }, @@ -9325,29 +12059,47 @@ "node": ">=8" } }, + "node_modules/style-to-js": { + "version": "1.1.21", + "resolved": "https://registry.npmjs.org/style-to-js/-/style-to-js-1.1.21.tgz", + "integrity": "sha512-RjQetxJrrUJLQPHbLku6U/ocGtzyjbJMP9lCNK7Ag0CNh690nSH8woqWH9u16nMjYBAok+i7JO1NP2pOy8IsPQ==", + "license": "MIT", + "dependencies": { + "style-to-object": "1.0.14" + } + }, "node_modules/style-to-object": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/style-to-object/-/style-to-object-0.4.4.tgz", - "integrity": "sha512-HYNoHZa2GorYNyqiCaBgsxvcJIn7OHq6inEga+E6Ke3m5JkoqpQbnFssk4jwe+K7AhGa2fcha4wSOf1Kn01dMg==", + "version": "1.0.14", + "resolved": "https://registry.npmjs.org/style-to-object/-/style-to-object-1.0.14.tgz", + "integrity": "sha512-LIN7rULI0jBscWQYaSswptyderlarFkjQ+t79nzty8tcIAceVomEVlLzH5VP4Cmsv6MtKhs7qaAiwlcp+Mgaxw==", + "license": "MIT", "dependencies": { - "inline-style-parser": "0.1.1" + "inline-style-parser": "0.2.7" } }, + "node_modules/stylis": { + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.3.6.tgz", + "integrity": "sha512-yQ3rwFWRfwNUY7H5vpU0wfdkNSnvnJinhF9830Swlaxl03zsOjCfmX0ugac+3LtK0lYSgwL/KXc8oYL3mG4YFQ==", + "license": "MIT" + }, "node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "license": "MIT", "dependencies": { - "has-flag": "^3.0.0" + "has-flag": "^4.0.0" }, "engines": { - "node": ">=4" + "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==", + "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -9355,15 +12107,33 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/tailwindcss-radix": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/tailwindcss-radix/-/tailwindcss-radix-3.0.3.tgz", - "integrity": "sha512-uueKWJIY98tU4Fip2FTL2eXBqX428e5HBwbu+8rqqJ9H3NuhkcAGS66wNHZjeix56f6nNBhkhMLpQeIrmVxH/w==" + "node_modules/tagged-tag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/tagged-tag/-/tagged-tag-1.0.0.tgz", + "integrity": "sha512-yEFYrVhod+hdNyx7g5Bnkkb0G6si8HJurOoOEgC8B/O0uXLHlaey/65KRv6cuWBNhBgHKAROVpc7QyYqE5gFng==", + "license": "MIT", + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/tailwind-merge": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/tailwind-merge/-/tailwind-merge-3.4.0.tgz", + "integrity": "sha512-uSaO4gnW+b3Y2aWoWfFpX62vn2sR3skfhbjsEnaBI81WD1wBLlHZe5sWf0AqjksNdYTbGBEd0UasQMT3SNV15g==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/dcastil" + } }, "node_modules/taskkill": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/taskkill/-/taskkill-5.0.0.tgz", "integrity": "sha512-+HRtZ40Vc+6YfCDWCeAsixwxJgMbPY4HHuTgzPYH3JXvqHWUlsCfy+ylXlAKhFNcuLp4xVeWeFBUhDk+7KYUvQ==", + "license": "MIT", "dependencies": { "execa": "^6.1.0" }, @@ -9378,6 +12148,7 @@ "version": "6.1.0", "resolved": "https://registry.npmjs.org/execa/-/execa-6.1.0.tgz", "integrity": "sha512-QVWlX2e50heYJcCPG0iWtf8r0xjEYfz/OYLGDYH+IyjWezzPNxz63qNFOu0l4YftGWuizFVZHHs8PrLU5p2IDA==", + "license": "MIT", "dependencies": { "cross-spawn": "^7.0.3", "get-stream": "^6.0.1", @@ -9400,6 +12171,7 @@ "version": "6.0.1", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "license": "MIT", "engines": { "node": ">=10" }, @@ -9411,6 +12183,7 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-3.0.1.tgz", "integrity": "sha512-rQLskxnM/5OCldHo+wNXbpVgDn5A17CUoKX+7Sokwaknlq7CdSnphy0W39GU8dw59XiCXmFXDg4fRuckQRKewQ==", + "license": "Apache-2.0", "engines": { "node": ">=12.20.0" } @@ -9419,6 +12192,22 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/taskkill/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==", + "license": "MIT", + "dependencies": { + "path-key": "^4.0.0" + }, "engines": { "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, @@ -9426,15 +12215,44 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/taskkill/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==", + "license": "MIT", + "dependencies": { + "mimic-fn": "^4.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/taskkill/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==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/taskkill/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==" + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "license": "ISC" }, "node_modules/taskkill/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==", + "license": "MIT", "engines": { "node": ">=12" }, @@ -9445,44 +12263,59 @@ "node_modules/tiny-inflate": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/tiny-inflate/-/tiny-inflate-1.0.3.tgz", - "integrity": "sha512-pkY1fj1cKHb2seWDy0B16HeWyczlJA9/WW3u3c4z/NiWDsO3DOU5D7nhTLE9CF0yXv/QZFY7sEJmj24dK+Rrqw==" + "integrity": "sha512-pkY1fj1cKHb2seWDy0B16HeWyczlJA9/WW3u3c4z/NiWDsO3DOU5D7nhTLE9CF0yXv/QZFY7sEJmj24dK+Rrqw==", + "license": "MIT" + }, + "node_modules/tinyexec": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.0.2.tgz", + "integrity": "sha512-W/KYk+NFhkmsYpuHq5JykngiOCnxeVL8v8dFnqxSD8qEEdRfXk1SDM6JzNqcERbcGYj9tMrDQBYV9cjgnunFIg==", + "license": "MIT", + "engines": { + "node": ">=18" + } }, "node_modules/tinypool": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-1.0.1.tgz", - "integrity": "sha512-URZYihUbRPcGv95En+sz6MfghfIc2OJ1sv/RmhWZLouPY0/8Vo80viwPvg3dlaS9fuq7fQMEfgRRK7BBZThBEA==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-1.1.1.tgz", + "integrity": "sha512-Zba82s87IFq9A9XmjiX5uZA/ARWDrB03OHlq+Vw1fSdt0I+4/Kutwy8BP4Y/y/aORMo61FQ0vIb5j44vSo5Pkg==", + "license": "MIT", "engines": { "node": "^18.0.0 || >=20.0.0" } }, "node_modules/tinyrainbow": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-1.2.0.tgz", - "integrity": "sha512-weEDEq7Z5eTHPDh4xjX789+fHfF+P8boiFB+0vbWzpbnbsEr/GRaohi/uMKxg8RZMXnl1ItAi/IUHWMsjDV7kQ==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-3.0.3.tgz", + "integrity": "sha512-PSkbLUoxOFRzJYjjxHJt9xro7D+iilgMX/C9lawzVuYiIdcihh9DXmVibBe8lmcFrRi/VzlPjBxbN7rH24q8/Q==", + "license": "MIT", "engines": { "node": ">=14.0.0" } }, - "node_modules/tinyspy": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/tinyspy/-/tinyspy-3.0.0.tgz", - "integrity": "sha512-q5nmENpTHgiPVd1cJDDc9cVoYN5x4vCvwT3FMilvKPKneCBZAxn2YWQjDF0UMcE9k0Cay1gBiDfTMU0g+mPMQA==", - "engines": { - "node": ">=14.0.0" + "node_modules/tldts": { + "version": "7.0.19", + "resolved": "https://registry.npmjs.org/tldts/-/tldts-7.0.19.tgz", + "integrity": "sha512-8PWx8tvC4jDB39BQw1m4x8y5MH1BcQ5xHeL2n7UVFulMPH/3Q0uiamahFJ3lXA0zO2SUyRXuVVbWSDmstlt9YA==", + "license": "MIT", + "dependencies": { + "tldts-core": "^7.0.19" + }, + "bin": { + "tldts": "bin/cli.js" } }, - "node_modules/to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", - "engines": { - "node": ">=4" - } + "node_modules/tldts-core": { + "version": "7.0.19", + "resolved": "https://registry.npmjs.org/tldts-core/-/tldts-core-7.0.19.tgz", + "integrity": "sha512-lJX2dEWx0SGH4O6p+7FPwYmJ/bu1JbcGJ8RLaG9b7liIgZ85itUVEPbMtWRVrde/0fnDPEPHW10ZsKW3kVsE9A==", + "license": "MIT" }, "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==", + "license": "MIT", "dependencies": { "is-number": "^7.0.0" }, @@ -9494,6 +12327,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "license": "MIT", "engines": { "node": ">=0.6" } @@ -9501,12 +12335,32 @@ "node_modules/toml": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/toml/-/toml-3.0.0.tgz", - "integrity": "sha512-y/mWCZinnvxjTKYhJ+pYxwD0mRLVvOtdS2Awbgxln6iEnt4rk0yBxeSBHkGJcPucRiG0e55mwWp+g/05rsrd6w==" + "integrity": "sha512-y/mWCZinnvxjTKYhJ+pYxwD0mRLVvOtdS2Awbgxln6iEnt4rk0yBxeSBHkGJcPucRiG0e55mwWp+g/05rsrd6w==", + "license": "MIT" + }, + "node_modules/tough-cookie": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-6.0.0.tgz", + "integrity": "sha512-kXuRi1mtaKMrsLUxz3sQYvVl37B0Ns6MzfrtV5DvJceE9bPyspOqk9xxv7XbZWcfLWbFmm997vl83qUWVJA64w==", + "license": "BSD-3-Clause", + "dependencies": { + "tldts": "^7.0.5" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", + "license": "MIT" }, "node_modules/trim-lines": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/trim-lines/-/trim-lines-3.0.1.tgz", "integrity": "sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==", + "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" @@ -9516,66 +12370,79 @@ "version": "2.2.0", "resolved": "https://registry.npmjs.org/trough/-/trough-2.2.0.tgz", "integrity": "sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==", + "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/tslib": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", - "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==" - }, - "node_modules/turbo-stream": { + "node_modules/ts-dedent": { "version": "2.2.0", - "resolved": "https://registry.npmjs.org/turbo-stream/-/turbo-stream-2.2.0.tgz", - "integrity": "sha512-FKFg7A0To1VU4CH9YmSMON5QphK0BXjSoiC7D9yMh+mEEbXLUP9qJ4hEt1qcjKtzncs1OpcnjZO8NgrlVbZH+g==" + "resolved": "https://registry.npmjs.org/ts-dedent/-/ts-dedent-2.2.0.tgz", + "integrity": "sha512-q5W7tVM71e2xjHZTlgfTDoPF/SmqKG5hddq9SzR49CH2hayqRKJtQ4mtRlSxKaJlR/+9rEM+mnBHf7I2/BQcpQ==", + "license": "MIT", + "engines": { + "node": ">=6.10" + } + }, + "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==", + "license": "0BSD" }, "node_modules/tween-functions": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/tween-functions/-/tween-functions-1.2.0.tgz", - "integrity": "sha512-PZBtLYcCLtEcjL14Fzb1gSxPBeL7nWvGhO5ZFPGqziCcr8uvHp0NDmdjBchp6KHL+tExcg0m3NISmKxhU394dA==" + "integrity": "sha512-PZBtLYcCLtEcjL14Fzb1gSxPBeL7nWvGhO5ZFPGqziCcr8uvHp0NDmdjBchp6KHL+tExcg0m3NISmKxhU394dA==", + "license": "BSD" }, "node_modules/type-fest": { - "version": "4.21.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.21.0.tgz", - "integrity": "sha512-ADn2w7hVPcK6w1I0uWnM//y1rLXZhzB9mr0a3OirzclKF1Wp6VzevUmzz/NRAWunOT6E8HrnpGY7xOfc6K57fA==", + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-5.4.1.tgz", + "integrity": "sha512-xygQcmneDyzsEuKZrFbRMne5HDqMs++aFzefrJTgEIKjQ3rekM+RPfFCVq2Gp1VIDqddoYeppCj4Pcb+RZW0GQ==", + "license": "(MIT OR CC0-1.0)", + "dependencies": { + "tagged-tag": "^1.0.0" + }, "engines": { - "node": ">=16" + "node": ">=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==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-2.0.1.tgz", + "integrity": "sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw==", + "license": "MIT", "dependencies": { - "media-typer": "0.3.0", - "mime-types": "~2.1.24" + "content-type": "^1.0.5", + "media-typer": "^1.1.0", + "mime-types": "^3.0.0" }, "engines": { "node": ">= 0.6" } }, - "node_modules/undici": { - "version": "6.19.2", - "resolved": "https://registry.npmjs.org/undici/-/undici-6.19.2.tgz", - "integrity": "sha512-JfjKqIauur3Q6biAtHJ564e3bWa8VvT+7cSiOJHFbX4Erv6CLGDpg8z+Fmg/1OI/47RA+GI2QZaF48SSaLvyBA==", - "engines": { - "node": ">=18.17" - } + "node_modules/ufo": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.6.1.tgz", + "integrity": "sha512-9a4/uxlTWJ4+a5i0ooc1rU7C7YOw3wT+UGqdeNNHWnOF9qcMBgLRS+4IYUqbczewFx4mLEig6gawh7X6mFlEkA==", + "license": "MIT" }, "node_modules/undici-types": { - "version": "5.26.5", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", - "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==" + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.16.0.tgz", + "integrity": "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==", + "license": "MIT" }, "node_modules/unicode-emoji-modifier-base": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/unicode-emoji-modifier-base/-/unicode-emoji-modifier-base-1.0.0.tgz", "integrity": "sha512-yLSH4py7oFH3oG/9K+XWrz1pSi3dfUrWEnInbxMfArOfc1+33BlGPQtLsOYwvdMy11AwUBetYuaRxSPqgkq+8g==", + "license": "MIT", "engines": { "node": ">=4" } @@ -9584,15 +12451,17 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/unicode-trie/-/unicode-trie-2.0.0.tgz", "integrity": "sha512-x7bc76x0bm4prf1VLg79uhAzKw8DVboClSN5VxJuQ+LKDOVEW9CdH+VY7SP+vX7xCYQqzzgQpFqz15zeLvAtZQ==", + "license": "MIT", "dependencies": { "pako": "^0.2.5", "tiny-inflate": "^1.0.0" } }, "node_modules/unicorn-magic": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/unicorn-magic/-/unicorn-magic-0.1.0.tgz", - "integrity": "sha512-lRfVq8fE8gz6QMBuDM6a+LO3IAzTi05H6gCVaUpir2E1Rwpo4ZUog45KpNXKC/Mn3Yb9UDuHumeFTo9iV/D9FQ==", + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/unicorn-magic/-/unicorn-magic-0.3.0.tgz", + "integrity": "sha512-+QBBXBCvifc56fsbuxZQ6Sic3wqqc3WWaqxs58gvJrcOuN83HGTCwz3oS5phzU9LthRNE9VrJCFCLUgHeeFnfA==", + "license": "MIT", "engines": { "node": ">=18" }, @@ -9604,6 +12473,7 @@ "version": "11.0.5", "resolved": "https://registry.npmjs.org/unified/-/unified-11.0.5.tgz", "integrity": "sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA==", + "license": "MIT", "dependencies": { "@types/unist": "^3.0.0", "bail": "^2.0.0", @@ -9619,9 +12489,10 @@ } }, "node_modules/unist-util-is": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-6.0.0.tgz", - "integrity": "sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-6.0.1.tgz", + "integrity": "sha512-LsiILbtBETkDz8I9p1dQ0uyRUWuaQzd/cuEeS1hoRSyW5E5XGmTzlwY1OrNzzakGowI9Dr/I8HVaw4hTtnxy8g==", + "license": "MIT", "dependencies": { "@types/unist": "^3.0.0" }, @@ -9634,6 +12505,7 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/unist-util-position/-/unist-util-position-5.0.0.tgz", "integrity": "sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==", + "license": "MIT", "dependencies": { "@types/unist": "^3.0.0" }, @@ -9646,6 +12518,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/unist-util-position-from-estree/-/unist-util-position-from-estree-2.0.0.tgz", "integrity": "sha512-KaFVRjoqLyF6YXCbVLNad/eS4+OfPQQn2yOd7zF/h5T/CSL2v8NpN6a5TPvtbXthAGw5nG+PuTtq+DdIZr+cRQ==", + "license": "MIT", "dependencies": { "@types/unist": "^3.0.0" }, @@ -9658,6 +12531,7 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/unist-util-remove-position/-/unist-util-remove-position-5.0.0.tgz", "integrity": "sha512-Hp5Kh3wLxv0PHj9m2yZhhLt58KzPtEYKQQ4yxfYFEO7EvHwzyDYnduhHnY1mDxoqr7VUwVuHXk9RXKIiYS1N8Q==", + "license": "MIT", "dependencies": { "@types/unist": "^3.0.0", "unist-util-visit": "^5.0.0" @@ -9671,6 +12545,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz", "integrity": "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==", + "license": "MIT", "dependencies": { "@types/unist": "^3.0.0" }, @@ -9680,9 +12555,10 @@ } }, "node_modules/unist-util-visit": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-5.0.0.tgz", - "integrity": "sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-5.1.0.tgz", + "integrity": "sha512-m+vIdyeCOpdr/QeQCu2EzxX/ohgS8KbnPDgFni4dQsfSCtpz8UqDyY5GjRru8PDKuYn7Fq19j1CQ+nJSsGKOzg==", + "license": "MIT", "dependencies": { "@types/unist": "^3.0.0", "unist-util-is": "^6.0.0", @@ -9694,9 +12570,10 @@ } }, "node_modules/unist-util-visit-parents": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-6.0.1.tgz", - "integrity": "sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw==", + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-6.0.2.tgz", + "integrity": "sha512-goh1s1TBrqSqukSc8wrjwWhL0hiJxgA8m4kFxGlQ+8FYQ3C/m11FcTs4YYem7V664AhHVvgoQLk890Ssdsr2IQ==", + "license": "MIT", "dependencies": { "@types/unist": "^3.0.0", "unist-util-is": "^6.0.0" @@ -9710,6 +12587,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "license": "MIT", "engines": { "node": ">= 10.0.0" } @@ -9718,14 +12596,36 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "license": "MIT", "engines": { "node": ">= 0.8" } }, + "node_modules/unplugin": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/unplugin/-/unplugin-1.0.1.tgz", + "integrity": "sha512-aqrHaVBWW1JVKBHmGo33T5TxeL0qWzfvjWokObHA9bYmN7eNDkwOxmLjhioHl9878qDFMAaT51XNroRyuz7WxA==", + "license": "MIT", + "dependencies": { + "acorn": "^8.8.1", + "chokidar": "^3.5.3", + "webpack-sources": "^3.2.3", + "webpack-virtual-modules": "^0.5.0" + } + }, + "node_modules/until-async": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/until-async/-/until-async-3.0.2.tgz", + "integrity": "sha512-IiSk4HlzAMqTUseHHe3VhIGyuFmN90zMTpD3Z3y8jeQbzLIq500MVM7Jq2vUAnTKAFPJrqwkzr6PoTcPhGcOiw==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/kettanaito" + } + }, "node_modules/update-browserslist-db": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.0.tgz", - "integrity": "sha512-EdRAaAyk2cUE1wOf2DkEhzxqOQvFOoRJFNS6NeyJ01Gp2beMRpBAINjM2iDXE3KCuKhwnvHIQCJm6ThL2Z+HzQ==", + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.2.tgz", + "integrity": "sha512-E85pfNzMQ9jpKkA7+TJAi4TJN+tBCuWh5rUcS/sv6cFi+1q9LYDwDI5dpUL0u/73EElyQ8d3TEaeW4sPedBqYA==", "funding": [ { "type": "opencollective", @@ -9740,9 +12640,10 @@ "url": "https://github.com/sponsors/ai" } ], + "license": "MIT", "dependencies": { - "escalade": "^3.1.2", - "picocolors": "^1.0.1" + "escalade": "^3.2.0", + "picocolors": "^1.1.1" }, "bin": { "update-browserslist-db": "cli.js" @@ -9752,9 +12653,10 @@ } }, "node_modules/use-callback-ref": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/use-callback-ref/-/use-callback-ref-1.3.2.tgz", - "integrity": "sha512-elOQwe6Q8gqZgDA8mrh44qRTQqpIHDcZ3hXTLjBe1i4ph8XpNJnO+aQf3NaG+lriLopI4HMx9VjQLfPQ6vhnoA==", + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/use-callback-ref/-/use-callback-ref-1.3.3.tgz", + "integrity": "sha512-jQL3lRnocaFtu3V00JToYz/4QkNWswxijDaCVNZRiRTO3HQDLsdu1ZtmIUvV4yPp+rvWm5j0y0TG/S61cuijTg==", + "license": "MIT", "dependencies": { "tslib": "^2.0.0" }, @@ -9762,8 +12664,8 @@ "node": ">=10" }, "peerDependencies": { - "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0", - "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + "@types/react": "*", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" }, "peerDependenciesMeta": { "@types/react": { @@ -9772,9 +12674,10 @@ } }, "node_modules/use-sidecar": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/use-sidecar/-/use-sidecar-1.1.2.tgz", - "integrity": "sha512-epTbsLuzZ7lPClpz2TyryBfztm7m+28DlEv2ZCQ3MDr5ssiwyOwGH/e5F9CkfWjJ1t4clvI58yF822/GUkjjhw==", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/use-sidecar/-/use-sidecar-1.1.3.tgz", + "integrity": "sha512-Fedw0aZvkhynoPYlA5WXrMCAMm+nSWdZt6lzJQ7Ok8S6Q+VsHmHpRWndVRJ8Be0ZbkfPc5LRYH+5XrzXcEeLRQ==", + "license": "MIT", "dependencies": { "detect-node-es": "^1.1.0", "tslib": "^2.0.0" @@ -9783,8 +12686,8 @@ "node": ">=10" }, "peerDependencies": { - "@types/react": "^16.9.0 || ^17.0.0 || ^18.0.0", - "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + "@types/react": "*", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" }, "peerDependenciesMeta": { "@types/react": { @@ -9792,26 +12695,6 @@ } } }, - "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/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", @@ -9820,6 +12703,7 @@ "https://github.com/sponsors/broofa", "https://github.com/sponsors/ctavan" ], + "license": "MIT", "bin": { "uuid": "dist/bin/uuid" } @@ -9828,17 +12712,18 @@ "version": "1.1.2", "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "license": "MIT", "engines": { "node": ">= 0.8" } }, "node_modules/vfile": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/vfile/-/vfile-6.0.2.tgz", - "integrity": "sha512-zND7NlS8rJYb/sPqkb13ZvbbUoExdbi4w3SfRrMq6R3FvnLQmmfpajJNITuuYm6AZ5uao9vy4BAos3EXBPf2rg==", + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/vfile/-/vfile-6.0.3.tgz", + "integrity": "sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==", + "license": "MIT", "dependencies": { "@types/unist": "^3.0.0", - "unist-util-stringify-position": "^4.0.0", "vfile-message": "^4.0.0" }, "funding": { @@ -9850,6 +12735,7 @@ "version": "5.0.3", "resolved": "https://registry.npmjs.org/vfile-location/-/vfile-location-5.0.3.tgz", "integrity": "sha512-5yXvWDEgqeiYiBe1lbxYF7UMAIm/IcopxMHrMQDq3nvKcjPKIhZklUKL+AE7J7uApI4kwe2snsK+eI6UTj9EHg==", + "license": "MIT", "dependencies": { "@types/unist": "^3.0.0", "vfile": "^6.0.0" @@ -9860,9 +12746,10 @@ } }, "node_modules/vfile-message": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-4.0.2.tgz", - "integrity": "sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-4.0.3.tgz", + "integrity": "sha512-QTHzsGd1EhbZs4AsQ20JX1rC3cOlt/IWJruk893DfLRr57lcnOeMaWG4K0JrRta4mIJZKth2Au3mM3u03/JWKw==", + "license": "MIT", "dependencies": { "@types/unist": "^3.0.0", "unist-util-stringify-position": "^4.0.0" @@ -9876,6 +12763,7 @@ "version": "3.0.3", "resolved": "https://registry.npmjs.org/vite-env-only/-/vite-env-only-3.0.3.tgz", "integrity": "sha512-iAb7cTXRrvFShaF1n+G8f6Yqq7sRJcxipNYNQQu0DN5N9P55vJMmLG5lNU5moYGpd+ZH1WhBHdkWi5WjrfImHg==", + "license": "MIT", "dependencies": { "@babel/core": "^7.23.7", "@babel/generator": "^7.23.6", @@ -9889,38 +12777,101 @@ "vite": "*" } }, - "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==", + "node_modules/vscode-jsonrpc": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/vscode-jsonrpc/-/vscode-jsonrpc-8.2.0.tgz", + "integrity": "sha512-C+r0eKJUIfiDIfwJhria30+TYWPtuHJXHtI7J0YlOmKAo7ogxP20T0zxB7HZQIFhIyvoBPwWskjxrvAtfjyZfA==", + "license": "MIT", + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/vscode-languageserver": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/vscode-languageserver/-/vscode-languageserver-9.0.1.tgz", + "integrity": "sha512-woByF3PDpkHFUreUa7Hos7+pUWdeWMXRd26+ZX2A8cFx6v/JPTtd4/uN0/jB6XQHYaOlHbio03NTHCqrgG5n7g==", + "license": "MIT", "dependencies": { - "util": "^0.12.3" + "vscode-languageserver-protocol": "3.17.5" }, - "optionalDependencies": { - "@zxing/text-encoding": "0.9.0" + "bin": { + "installServerIntoExtension": "bin/installServerIntoExtension" + } + }, + "node_modules/vscode-languageserver-protocol": { + "version": "3.17.5", + "resolved": "https://registry.npmjs.org/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.17.5.tgz", + "integrity": "sha512-mb1bvRJN8SVznADSGWM9u/b07H7Ecg0I3OgXDuLdn307rl/J3A9YD6/eYOssqhecL27hK1IPZAsaqh00i/Jljg==", + "license": "MIT", + "dependencies": { + "vscode-jsonrpc": "8.2.0", + "vscode-languageserver-types": "3.17.5" } }, + "node_modules/vscode-languageserver-textdocument": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/vscode-languageserver-textdocument/-/vscode-languageserver-textdocument-1.0.12.tgz", + "integrity": "sha512-cxWNPesCnQCcMPeenjKKsOCKQZ/L6Tv19DTRIGuLWe32lyzWhihGVJ/rcckZXJxfdKCFvRLS3fpBIsV/ZGX4zA==", + "license": "MIT" + }, + "node_modules/vscode-languageserver-types": { + "version": "3.17.5", + "resolved": "https://registry.npmjs.org/vscode-languageserver-types/-/vscode-languageserver-types-3.17.5.tgz", + "integrity": "sha512-Ld1VelNuX9pdF39h2Hgaeb5hEZM2Z3jUrrMgWQAu82jMtZp7p3vJT3BzToKtZI7NgQssZje5o0zryOrhQvzQAg==", + "license": "MIT" + }, + "node_modules/vscode-uri": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-3.0.8.tgz", + "integrity": "sha512-AyFQ0EVmsOZOlAnxoFOGOq1SQDWAB7C6aqMGS23svWAllfOaxbuFvcT8D1i8z3Gyn8fraVeZNNmN6e9bxxXkKw==", + "license": "MIT" + }, "node_modules/web-namespaces": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/web-namespaces/-/web-namespaces-2.0.1.tgz", "integrity": "sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==", + "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/web-streams-polyfill": { + "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==", + "license": "BSD-2-Clause" + }, + "node_modules/webpack-sources": { "version": "3.3.3", - "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.3.3.tgz", - "integrity": "sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.3.3.tgz", + "integrity": "sha512-yd1RBzSGanHkitROoPFd6qsrxt+oFhg/129YzheDGqeustzX0vTZJZsSsQjVQC4yzBQ56K55XU8gaNCtIzOnTg==", + "license": "MIT", "engines": { - "node": ">= 8" + "node": ">=10.13.0" + } + }, + "node_modules/webpack-virtual-modules": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/webpack-virtual-modules/-/webpack-virtual-modules-0.5.0.tgz", + "integrity": "sha512-kyDivFZ7ZM0BVOUteVbDFhlRt7Ah/CSPwJdi8hBpkK7QLumUqdLtVfm/PX/hkcnrvr0i77fO5+TjZ94Pe+C9iw==", + "license": "MIT" + }, + "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==", + "license": "MIT", + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" } }, "node_modules/which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "license": "ISC", "dependencies": { "isexe": "^2.0.0" }, @@ -9931,35 +12882,18 @@ "node": ">= 8" } }, - "node_modules/which-typed-array": { - "version": "1.1.15", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.15.tgz", - "integrity": "sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==", - "dependencies": { - "available-typed-arrays": "^1.0.7", - "call-bind": "^1.0.7", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-tostringtag": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "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==", + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.2.tgz", + "integrity": "sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww==", + "license": "MIT", "dependencies": { - "ansi-styles": "^6.1.0", - "string-width": "^5.0.1", - "strip-ansi": "^7.0.1" + "ansi-styles": "^6.2.1", + "string-width": "^7.0.0", + "strip-ansi": "^7.1.0" }, "engines": { - "node": ">=12" + "node": ">=18" }, "funding": { "url": "https://github.com/chalk/wrap-ansi?sponsor=1" @@ -9970,6 +12904,7 @@ "version": "7.0.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "license": "MIT", "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", @@ -9986,6 +12921,7 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "license": "MIT", "dependencies": { "color-convert": "^2.0.1" }, @@ -9996,26 +12932,11 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/wrap-ansi-cjs/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/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==", + "license": "MIT", "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", @@ -10029,6 +12950,7 @@ "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "license": "MIT", "dependencies": { "ansi-regex": "^5.0.1" }, @@ -10037,9 +12959,10 @@ } }, "node_modules/wrap-ansi/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==", + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", + "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", + "license": "MIT", "engines": { "node": ">=12" }, @@ -10047,10 +12970,40 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, + "node_modules/wrap-ansi/node_modules/emoji-regex": { + "version": "10.6.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.6.0.tgz", + "integrity": "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==", + "license": "MIT" + }, + "node_modules/wrap-ansi/node_modules/string-width": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", + "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", + "license": "MIT", + "dependencies": { + "emoji-regex": "^10.3.0", + "get-east-asian-width": "^1.0.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "license": "ISC" + }, "node_modules/ws": { - "version": "8.18.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.0.tgz", - "integrity": "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==", + "version": "8.19.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.19.0.tgz", + "integrity": "sha512-blAT2mjOEIi0ZzruJfIhb3nps74PRWTCz1IjglWEEpQl5XS/UNama6u2/rjFkDDouqr4L67ry+1aGIALViWjDg==", + "license": "MIT", "engines": { "node": ">=10.0.0" }, @@ -10067,88 +13020,127 @@ } } }, + "node_modules/wsl-utils": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/wsl-utils/-/wsl-utils-0.3.1.tgz", + "integrity": "sha512-g/eziiSUNBSsdDJtCLB8bdYEUMj4jR7AGeUo96p/3dTafgjHhpF4RiCFPiRILwjQoDXx5MqkBr4fwWtR3Ky4Wg==", + "license": "MIT", + "dependencies": { + "is-wsl": "^3.1.0", + "powershell-utils": "^0.1.0" + }, + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "license": "MIT", + "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==", + "license": "ISC", "engines": { "node": ">=10" } }, "node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "license": "ISC" }, "node_modules/yaml": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.5.0.tgz", - "integrity": "sha512-2wWLbGbYDiSqqIKoPjar3MPgB94ErzCtrNE1FdqGuaO0pi2JGjmE8aW8TDZwzU7vuxcGRdL/4gPQwQ7hD5AMSw==", + "version": "2.8.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.2.tgz", + "integrity": "sha512-mplynKqc1C2hTVYxd0PU2xQAc22TI1vShAYGksCCfxbn/dFwnHTNi1bvYsBTkhdUNtGIf5xNOg938rrSSYvS9A==", + "license": "ISC", "bin": { "yaml": "bin.mjs" }, "engines": { - "node": ">= 14" + "node": ">= 14.6" + }, + "funding": { + "url": "https://github.com/sponsors/eemeli" } }, "node_modules/yargs": { - "version": "17.7.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", - "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "version": "18.0.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-18.0.0.tgz", + "integrity": "sha512-4UEqdc2RYGHZc7Doyqkrqiln3p9X2DZVxaGbwhn2pi7MrRagKaOcIKe8L3OxYcbhXLgLFUS3zAYuQjKBQgmuNg==", + "license": "MIT", "dependencies": { - "cliui": "^8.0.1", + "cliui": "^9.0.1", "escalade": "^3.1.1", "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.3", + "string-width": "^7.2.0", "y18n": "^5.0.5", - "yargs-parser": "^21.1.1" + "yargs-parser": "^22.0.0" }, "engines": { - "node": ">=12" + "node": "^20.19.0 || ^22.12.0 || >=23" } }, "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==", + "version": "22.0.0", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-22.0.0.tgz", + "integrity": "sha512-rwu/ClNdSMpkSrUb+d6BRsSkLUq1fmfsY6TOpYzTwvwkg1/NRG85KBy3kq++A8LKQwX6lsu+aWad+2khvuXrqw==", + "license": "ISC", "engines": { - "node": ">=12" + "node": "^20.19.0 || ^22.12.0 || >=23" } }, "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==" + "version": "10.6.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.6.0.tgz", + "integrity": "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==", + "license": "MIT" }, "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==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", + "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", + "license": "MIT", "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" + "emoji-regex": "^10.3.0", + "get-east-asian-width": "^1.0.0", + "strip-ansi": "^7.1.0" }, "engines": { - "node": ">=8" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "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" - }, + "node_modules/yocto-queue": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.2.2.tgz", + "integrity": "sha512-4LCcse/U2MHZ63HAJVE+v71o7yOdIe4cZ70Wpf8D/IyjDKYQLV5GD46B+hSTjJsvV5PztjvHoU580EftxjDZFQ==", + "license": "MIT", "engines": { - "node": ">=8" + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/yoctocolors": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/yoctocolors/-/yoctocolors-2.1.1.tgz", - "integrity": "sha512-GQHQqAopRhwU8Kt1DDM8NjibDXHC8eoh1erhGAJPEyveY9qqVeXvVikNKrDz69sHowPMorbPUrH/mx8c50eiBQ==", + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yoctocolors/-/yoctocolors-2.1.2.tgz", + "integrity": "sha512-CzhO+pFNo8ajLM2d2IW/R93ipy99LWjtwblvC1RsoSUMZgyLbYFr221TnSNT7GjGdYui6P459mw9JH/g/zW2ug==", + "license": "MIT", "engines": { "node": ">=18" }, @@ -10157,9 +13149,10 @@ } }, "node_modules/yoctocolors-cjs": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/yoctocolors-cjs/-/yoctocolors-cjs-2.1.2.tgz", - "integrity": "sha512-cYVsTjKl8b+FrnidjibDWskAv7UKOfcwaVZdp/it9n1s9fU3IkgDbhdIRKCW4JDsAlECJY0ytoVPT3sK6kideA==", + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/yoctocolors-cjs/-/yoctocolors-cjs-2.1.3.tgz", + "integrity": "sha512-U/PBtDf35ff0D8X8D0jfdzHYEPFxAI7jJlxZXwCSez5M3190m+QobIfh+sWDWSHMCWWJN2AWamkegn6vr6YBTw==", + "license": "MIT", "engines": { "node": ">=18" }, @@ -10167,15 +13160,17 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/yoga-wasm-web": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/yoga-wasm-web/-/yoga-wasm-web-0.3.3.tgz", - "integrity": "sha512-N+d4UJSJbt/R3wqY7Coqs5pcV0aUj2j9IaQ3rNj9bVCLld8tTGKRa2USARjnvZJWVx1NDmQev8EknoczaOQDOA==" + "node_modules/yoga-layout": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/yoga-layout/-/yoga-layout-3.2.1.tgz", + "integrity": "sha512-0LPOt3AxKqMdFBZA3HBAt/t/8vIKq7VaQYbuA8WxCgung+p9TVyKRYdpvCb80HcdTN2NkbIKbhNwKUfm3tQywQ==", + "license": "MIT" }, "node_modules/zod": { - "version": "3.23.8", - "resolved": "https://registry.npmjs.org/zod/-/zod-3.23.8.tgz", - "integrity": "sha512-XBx9AXhXktjUqnepgTiE5flcKIYWi/rme0Eaj+5Y0lftuGBq+jyRu/md4WnuxqgP1ubdpNCsYEYPxrzVHD8d6g==", + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/zod/-/zod-4.3.6.tgz", + "integrity": "sha512-rftlrkhHZOcjDwkGlnUtZZkvaPHCsDATp4pGpuOOMDaTdDDXF91wuVDJoWoPsKX/3YPQ5fHuF3STjcYyKr+Qhg==", + "license": "MIT", "funding": { "url": "https://github.com/sponsors/colinhacks" } @@ -10184,6 +13179,7 @@ "version": "2.0.4", "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-2.0.4.tgz", "integrity": "sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==", + "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" diff --git a/epicshop/package.json b/epicshop/package.json index 06be31509..8c9a184a0 100644 --- a/epicshop/package.json +++ b/epicshop/package.json @@ -1,9 +1,14 @@ { "type": "module", "dependencies": { - "@epic-web/workshop-app": "^4.21.1", + "@epic-web/workshop-app": "^6.80.1", + "@epic-web/workshop-utils": "^6.80.1", "chokidar": "^3.6.0", - "execa": "^9.3.0", - "fs-extra": "^11.2.0" + "enquirer": "^2.4.1", + "epicshop": "^6.80.1", + "execa": "^9.6.1", + "fs-extra": "^11.2.0", + "match-sorter": "^8.2.0", + "p-limit": "^7.2.0" } } diff --git a/epicshop/setup-custom.js b/epicshop/setup-custom.js index 434bc2bab..405822761 100644 --- a/epicshop/setup-custom.js +++ b/epicshop/setup-custom.js @@ -3,12 +3,15 @@ import path from 'node:path' import { spawn } from 'child_process' import fsExtra from 'fs-extra' import { $ } from 'execa' +import { warm } from 'epicshop/warm' import { getApps, isProblemApp, setPlayground, } from '@epic-web/workshop-utils/apps.server' +await warm() + const allApps = await getApps() const uniqueApps = allApps.filter( (a, index) => allApps.findIndex(b => b.fullPath === a.fullPath) === index, diff --git a/epicshop/setup.js b/epicshop/setup.js deleted file mode 100644 index e97d64932..000000000 --- a/epicshop/setup.js +++ /dev/null @@ -1,55 +0,0 @@ -import { spawnSync } from 'child_process' - -const styles = { - // got these from playing around with what I found from: - // https://github.com/istanbuljs/istanbuljs/blob/0f328fd0896417ccb2085f4b7888dd8e167ba3fa/packages/istanbul-lib-report/lib/file-writer.js#L84-L96 - // they're the best I could find that works well for light or dark terminals - success: { open: '\u001b[32;1m', close: '\u001b[0m' }, - danger: { open: '\u001b[31;1m', close: '\u001b[0m' }, - info: { open: '\u001b[36;1m', close: '\u001b[0m' }, - subtitle: { open: '\u001b[2;1m', close: '\u001b[0m' }, -} - -function color(modifier, string) { - return styles[modifier].open + string + styles[modifier].close -} - -console.log(color('info', '▶️ Starting workshop setup...')) - -const output = spawnSync('npm --version', { shell: true }) - .stdout.toString() - .trim() -const outputParts = output.split('.') -const major = Number(outputParts[0]) -const minor = Number(outputParts[1]) -if (major < 8 || (major === 8 && minor < 16)) { - console.error( - color( - 'danger', - '🚨 npm version is ' + - output + - ' which is out of date. Please install npm@8.16.0 or greater', - ), - ) - throw new Error('npm version is out of date') -} - -const command = - 'npx --yes "https://gist.github.com/kentcdodds/bb452ffe53a5caa3600197e1d8005733" -q' -console.log( - color('subtitle', ' Running the following command: ' + command), -) - -const result = spawnSync(command, { stdio: 'inherit', shell: true }) - -if (result.status === 0) { - console.log(color('success', '✅ Workshop setup complete...')) -} else { - process.exit(result.status) -} - -/* -eslint - "no-undef": "off", - "vars-on-top": "off", -*/ diff --git a/epicshop/test.js b/epicshop/test.js new file mode 100644 index 000000000..a75073a86 --- /dev/null +++ b/epicshop/test.js @@ -0,0 +1,283 @@ +import path from 'node:path' +import { performance } from 'perf_hooks' +import { fileURLToPath } from 'url' +import { + getApps, + getAppDisplayName, +} from '@epic-web/workshop-utils/apps.server' +import enquirer from 'enquirer' +import { execa } from 'execa' +import { matchSorter } from 'match-sorter' +import pLimit from 'p-limit' + +const { prompt } = enquirer + +const __dirname = path.dirname(fileURLToPath(import.meta.url)) + +function captureOutput() { + const output = [] + return { + write: (chunk, streamType) => { + output.push({ chunk: chunk.toString(), streamType }) + }, + replay: () => { + for (const { chunk, streamType } of output) { + if (streamType === 'stderr') { + process.stderr.write(chunk) + } else { + process.stdout.write(chunk) + } + } + }, + hasOutput: () => output.length > 0, + } +} + +function printTestSummary(results) { + const label = '--- Test Summary ---' + console.log(`\n${label}`) + for (const [appPath, { result, duration }] of results) { + let emoji + switch (result) { + case 'Passed': + emoji = '✅' + break + case 'Failed': + emoji = '❌' + break + case 'Error': + emoji = '💥' + break + case 'Incomplete': + emoji = '⏳' + break + default: + emoji = '❓' + } + console.log(`${emoji} ${appPath} (${duration.toFixed(2)}s)`) + } + console.log(`${'-'.repeat(label.length)}\n`) +} + +async function main() { + const allApps = await getApps() + const allAppsWithTests = allApps.filter((app) => app.test?.type === 'script') + + if (allAppsWithTests.length === 0) { + console.error( + '❌ No apps with tests were found. Ensure your apps have a test script defined in the package.json. Exiting.', + ) + process.exit(1) + } + + let selectedApps + let additionalArgs = [] + + // Parse command-line arguments + const argIndex = process.argv.indexOf('--') + if (argIndex !== -1) { + additionalArgs = process.argv.slice(argIndex + 1) + process.argv = process.argv.slice(0, argIndex) + } + + if (process.argv[2]) { + const patterns = process.argv[2].toLowerCase().split(',') + selectedApps = allAppsWithTests.filter((app) => { + const { exerciseNumber, stepNumber, type } = app + + return patterns.some((pattern) => { + let [patternExercise = '*', patternStep = '*', patternType = '*'] = + pattern.split('.') + + patternExercise ||= '*' + patternStep ||= '*' + patternType ||= '*' + + return ( + (patternExercise === '*' || + exerciseNumber === Number(patternExercise)) && + (patternStep === '*' || stepNumber === Number(patternStep)) && + (patternType === '*' || type.includes(patternType)) + ) + }) + }) + } else { + const displayNameMap = new Map( + allAppsWithTests.map((app) => [ + getAppDisplayName(app, allAppsWithTests), + app, + ]), + ) + const choices = displayNameMap.keys() + + const response = await prompt({ + type: 'autocomplete', + name: 'appDisplayNames', + message: 'Select apps to test:', + choices: ['All', ...choices], + multiple: true, + suggest: (input, choices) => { + return matchSorter(choices, input, { keys: ['name'] }) + }, + }) + + selectedApps = response.appDisplayNames.includes('All') + ? allAppsWithTests + : response.appDisplayNames.map((appDisplayName) => + displayNameMap.get(appDisplayName), + ) + + // Update this block to use process.argv + const appPattern = + selectedApps.length === allAppsWithTests.length + ? '*' + : selectedApps + .map((app) => `${app.exerciseNumber}.${app.stepNumber}.${app.type}`) + .join(',') + const additionalArgsString = + additionalArgs.length > 0 ? ` -- ${additionalArgs.join(' ')}` : '' + console.log(`\nℹ️ To skip the prompt next time, use this command:`) + console.log(`npm test -- ${appPattern}${additionalArgsString}\n`) + } + + if (selectedApps.length === 0) { + console.log('⚠️ No apps selected. Exiting.') + return + } + + if (selectedApps.length === 1) { + const app = selectedApps[0] + console.log(`🚀 Running tests for ${app.relativePath}\n\n`) + const startTime = performance.now() + try { + await execa('npm', ['run', 'test', '--silent', '--', ...additionalArgs], { + cwd: app.fullPath, + stdio: 'inherit', + env: { + ...process.env, + PORT: app.dev.portNumber, + }, + }) + const duration = (performance.now() - startTime) / 1000 + console.log( + `✅ Finished tests for ${app.relativePath} (${duration.toFixed(2)}s)`, + ) + } catch { + const duration = (performance.now() - startTime) / 1000 + console.error( + `❌ Tests failed for ${app.relativePath} (${duration.toFixed(2)}s)`, + ) + process.exit(1) + } + } else { + const limit = pLimit(1) + let hasFailures = false + const runningProcesses = new Map() + let isShuttingDown = false + const results = new Map() + + const shutdownHandler = () => { + if (isShuttingDown) return + isShuttingDown = true + console.log('\nGracefully shutting down. Please wait...') + console.log('Outputting results of running tests:') + for (const [app, output] of runningProcesses.entries()) { + if (output.hasOutput()) { + console.log(`\nPartial results for ${app.relativePath}:\n\n`) + output.replay() + console.log('\n\n') + } else { + console.log(`ℹ️ No output captured for ${app.relativePath}`) + } + // Set result for incomplete tests + if (!results.has(app.relativePath)) { + results.set(app.relativePath, 'Incomplete') + } + } + printTestSummary(results) + // Allow some time for output to be written before exiting + setTimeout(() => process.exit(1), 100) + } + + process.on('SIGINT', shutdownHandler) + process.on('SIGTERM', shutdownHandler) + + const tasks = selectedApps.map((app) => + limit(async () => { + if (isShuttingDown) return + console.log(`🚀 Starting tests for ${app.relativePath}`) + const output = captureOutput() + runningProcesses.set(app, output) + const startTime = performance.now() + try { + const subprocess = execa( + 'npm', + ['run', 'test', '--silent', '--', ...additionalArgs], + { + cwd: path.join(__dirname, '..', app.relativePath), + reject: false, + env: { + ...process.env, + PORT: app.dev.portNumber, + }, + }, + ) + + subprocess.stdout.on('data', (chunk) => output.write(chunk, 'stdout')) + subprocess.stderr.on('data', (chunk) => output.write(chunk, 'stderr')) + + const { exitCode } = await subprocess + const duration = (performance.now() - startTime) / 1000 + + runningProcesses.delete(app) + + if (exitCode !== 0) { + hasFailures = true + console.error( + `\n❌ Tests failed for ${app.relativePath} (${duration.toFixed(2)}s):\n\n`, + ) + output.replay() + console.log('\n\n') + results.set(app.relativePath, { result: 'Failed', duration }) + // Set result for incomplete tests + if (!results.has(app.relativePath)) { + results.set(app.relativePath, 'Incomplete') + } + } else { + console.log( + `✅ Finished tests for ${app.relativePath} (${duration.toFixed(2)}s)`, + ) + results.set(app.relativePath, { result: 'Passed', duration }) + } + } catch (error) { + const duration = (performance.now() - startTime) / 1000 + runningProcesses.delete(app) + hasFailures = true + console.error( + `\n❌ An error occurred while running tests for ${app.relativePath} (${duration.toFixed(2)}s):\n\n`, + ) + console.error(error.message) + output.replay() + console.log('\n\n') + results.set(app.relativePath, { result: 'Error', duration }) + } + }), + ) + + await Promise.all(tasks) + + // Print summary output + printTestSummary(results) + + if (hasFailures) { + process.exit(1) + } + } +} + +main().catch((error) => { + if (error) { + console.error('❌ An error occurred:', error) + } + setTimeout(() => process.exit(1), 100) +}) diff --git a/epicshop/update-deps.sh b/epicshop/update-deps.sh index 16d534582..a5cc17d11 100755 --- a/epicshop/update-deps.sh +++ b/epicshop/update-deps.sh @@ -1,8 +1,8 @@ -npx npm-check-updates --dep prod,dev --upgrade --workspaces --root --reject eslint,@conform-to/react,@conform-to/zod +npx npm-check-updates --dep prod,dev --upgrade --workspaces --root --reject eslint,@conform-to/react,@conform-to/zod,remix-auth-github,@remix-run/react,@remix-run/node,@remix-run/express,@remix-run/serve,@remix-run/css-bundle cd epicshop && npx npm-check-updates --dep prod,dev --upgrade --root cd .. rm -rf node_modules package-lock.json ./epicshop/package-lock.json ./epicshop/node_modules ./exercises/**/node_modules npm install npm run setup npm run typecheck -npm run lint --fix +npm run lint -- --fix diff --git a/exercises/01.e2e/01.problem.playwright/app/epicshop.tsx b/exercises/01.e2e/01.problem.playwright/app/epicshop.tsx deleted file mode 100644 index 96c5597cb..000000000 --- a/exercises/01.e2e/01.problem.playwright/app/epicshop.tsx +++ /dev/null @@ -1,9 +0,0 @@ -// Ignore this file please -import { EpicShopIFrameSync } from '@epic-web/workshop-utils/iframe-sync' -import { useNavigate } from '@remix-run/react' -import * as React from 'react' - -export function EpicShop() { - const navigate = useNavigate() - return -} diff --git a/exercises/01.e2e/01.problem.playwright/app/root.tsx b/exercises/01.e2e/01.problem.playwright/app/root.tsx index 3b2064a1a..fa7f41981 100644 --- a/exercises/01.e2e/01.problem.playwright/app/root.tsx +++ b/exercises/01.e2e/01.problem.playwright/app/root.tsx @@ -34,7 +34,6 @@ import { SearchBar } from './components/search-bar.tsx' import { Spacer } from './components/spacer.tsx' import { Button } from './components/ui/button.tsx' import { Icon } from './components/ui/icon.tsx' -import { EpicShop } from './epicshop.tsx' import fontStylestylesheetUrl from './styles/font.css' import tailwindStylesheetUrl from './styles/tailwind.css' import { getUserId } from './utils/auth.server.ts' @@ -159,7 +158,6 @@ function Document({ - diff --git a/exercises/01.e2e/01.problem.playwright/app/routes/resources+/note-images.$imageId.tsx b/exercises/01.e2e/01.problem.playwright/app/routes/resources+/note-images.$imageId.tsx index 417545a3e..865878a92 100644 --- a/exercises/01.e2e/01.problem.playwright/app/routes/resources+/note-images.$imageId.tsx +++ b/exercises/01.e2e/01.problem.playwright/app/routes/resources+/note-images.$imageId.tsx @@ -14,7 +14,7 @@ export async function loader({ params }: LoaderFunctionArgs) { return new Response(image.blob, { headers: { 'content-type': image.contentType, - 'content-length': Buffer.byteLength(image.blob).toString(), + 'content-length': image.blob.length.toString(), 'content-disposition': `inline; filename="${params.imageId}"`, 'cache-control': 'public, max-age=31536000, immutable', }, diff --git a/exercises/01.e2e/01.problem.playwright/app/routes/resources+/user-images.$imageId.tsx b/exercises/01.e2e/01.problem.playwright/app/routes/resources+/user-images.$imageId.tsx index c5a66b146..2de45198e 100644 --- a/exercises/01.e2e/01.problem.playwright/app/routes/resources+/user-images.$imageId.tsx +++ b/exercises/01.e2e/01.problem.playwright/app/routes/resources+/user-images.$imageId.tsx @@ -14,7 +14,7 @@ export async function loader({ params }: LoaderFunctionArgs) { return new Response(image.blob, { headers: { 'content-type': image.contentType, - 'content-length': Buffer.byteLength(image.blob).toString(), + 'content-length': image.blob.length.toString(), 'content-disposition': `inline; filename="${params.imageId}"`, 'cache-control': 'public, max-age=31536000, immutable', }, diff --git a/exercises/01.e2e/01.problem.playwright/app/routes/settings+/profile.photo.tsx b/exercises/01.e2e/01.problem.playwright/app/routes/settings+/profile.photo.tsx index f452baf9a..36e397f0b 100644 --- a/exercises/01.e2e/01.problem.playwright/app/routes/settings+/profile.photo.tsx +++ b/exercises/01.e2e/01.problem.playwright/app/routes/settings+/profile.photo.tsx @@ -76,7 +76,7 @@ export async function action({ request }: ActionFunctionArgs) { return { image: { contentType: data.photoFile.type, - blob: Buffer.from(await data.photoFile.arrayBuffer()), + blob: new Uint8Array(await data.photoFile.arrayBuffer()), }, } }), diff --git a/exercises/01.e2e/01.problem.playwright/app/routes/users+/$username_+/__note-editor.tsx b/exercises/01.e2e/01.problem.playwright/app/routes/users+/$username_+/__note-editor.tsx index 714fa7baf..7c8ee2109 100644 --- a/exercises/01.e2e/01.problem.playwright/app/routes/users+/$username_+/__note-editor.tsx +++ b/exercises/01.e2e/01.problem.playwright/app/routes/users+/$username_+/__note-editor.tsx @@ -96,7 +96,7 @@ export async function action({ request, params }: ActionFunctionArgs) { id: i.id, altText: i.altText, contentType: i.file.type, - blob: Buffer.from(await i.file.arrayBuffer()), + blob: new Uint8Array(await i.file.arrayBuffer()), } } else { return { id: i.id, altText: i.altText } @@ -111,7 +111,7 @@ export async function action({ request, params }: ActionFunctionArgs) { return { altText: image.altText, contentType: image.file.type, - blob: Buffer.from(await image.file.arrayBuffer()), + blob: new Uint8Array(await image.file.arrayBuffer()), } }), ), diff --git a/exercises/01.e2e/01.problem.playwright/app/utils/misc.tsx b/exercises/01.e2e/01.problem.playwright/app/utils/misc.tsx index 8879f6b41..a553484db 100644 --- a/exercises/01.e2e/01.problem.playwright/app/utils/misc.tsx +++ b/exercises/01.e2e/01.problem.playwright/app/utils/misc.tsx @@ -303,7 +303,7 @@ export async function downloadFile(url: string, retries: number = 0) { throw new Error(`Failed to fetch image with status ${response.status}`) } const contentType = response.headers.get('content-type') ?? 'image/jpg' - const blob = Buffer.from(await response.arrayBuffer()) + const blob = new Uint8Array(await response.arrayBuffer()) return { contentType, blob } } catch (e) { if (retries > MAX_RETRIES) throw e diff --git a/exercises/01.e2e/01.problem.playwright/index.js b/exercises/01.e2e/01.problem.playwright/index.js index 8ba83ba70..e8728a002 100644 --- a/exercises/01.e2e/01.problem.playwright/index.js +++ b/exercises/01.e2e/01.problem.playwright/index.js @@ -1,11 +1,8 @@ import 'dotenv/config' import 'source-map-support/register.js' -import { installGlobals } from '@remix-run/node' import chalk from 'chalk' import closeWithGrace from 'close-with-grace' -installGlobals() - if ( process.env.NODE_ENV !== 'production' || process.env.PLAYWRIGHT_TEST_BASE_URL diff --git a/exercises/01.e2e/01.problem.playwright/package.json b/exercises/01.e2e/01.problem.playwright/package.json index 205435e93..1f9a90128 100644 --- a/exercises/01.e2e/01.problem.playwright/package.json +++ b/exercises/01.e2e/01.problem.playwright/package.json @@ -30,9 +30,8 @@ "@conform-to/zod": "^0.9.0", "@epic-web/remember": "^1.1.0", "@epic-web/totp": "^1.1.2", - "@epic-web/workshop-utils": "^4.21.1", "@paralleldrive/cuid2": "^2.2.2", - "@prisma/client": "^5.16.2", + "@prisma/client": "^6.19.1", "@radix-ui/react-checkbox": "^1.1.1", "@radix-ui/react-dropdown-menu": "^2.1.1", "@radix-ui/react-label": "^2.1.0", @@ -59,13 +58,13 @@ "glob": "^11.0.0", "isbot": "^5.1.12", "morgan": "^1.10.0", - "prisma": "^5.16.2", + "prisma": "^6.19.1", "qrcode": "^1.5.3", "react": "^18.3.1", "react-dom": "^18.3.1", "remix-auth": "^3.7.0", "remix-auth-form": "^1.5.0", - "remix-auth-github": "^1.7.0", + "remix-auth-github": "1.7.0", "remix-utils": "^7.6.0", "sonner": "^1.5.0", "source-map-support": "^0.5.21", @@ -111,7 +110,7 @@ "execa": "^9.3.0", "fs-extra": "^11.2.0", "jsdom": "^24.1.0", - "msw": "^2.3.1", + "msw": "^2.12.4", "node-html-parser": "^6.1.13", "npm-run-all": "^4.1.5", "prettier": "^3.3.2", diff --git a/exercises/01.e2e/01.problem.playwright/tests/db-utils.ts b/exercises/01.e2e/01.problem.playwright/tests/db-utils.ts index 8f5062e16..2e1e23550 100644 --- a/exercises/01.e2e/01.problem.playwright/tests/db-utils.ts +++ b/exercises/01.e2e/01.problem.playwright/tests/db-utils.ts @@ -67,7 +67,7 @@ export async function getNoteImages() { }), img({ altText: - 'an office full of laptops and other office equipment that look like it was abandond in a rush out of the building in an emergency years ago.', + 'an office full of laptops and other office equipment that look like it was abandoned in a rush out of the building in an emergency years ago.', filepath: './tests/fixtures/images/notes/6.png', }), img({ @@ -110,6 +110,6 @@ export async function img({ return { altText, contentType: filepath.endsWith('.png') ? 'image/png' : 'image/jpeg', - blob: await fs.promises.readFile(filepath), + blob: new Uint8Array(await fs.promises.readFile(filepath)), } } diff --git a/exercises/01.e2e/01.solution.playwright/app/epicshop.tsx b/exercises/01.e2e/01.solution.playwright/app/epicshop.tsx deleted file mode 100644 index 96c5597cb..000000000 --- a/exercises/01.e2e/01.solution.playwright/app/epicshop.tsx +++ /dev/null @@ -1,9 +0,0 @@ -// Ignore this file please -import { EpicShopIFrameSync } from '@epic-web/workshop-utils/iframe-sync' -import { useNavigate } from '@remix-run/react' -import * as React from 'react' - -export function EpicShop() { - const navigate = useNavigate() - return -} diff --git a/exercises/01.e2e/01.solution.playwright/app/root.tsx b/exercises/01.e2e/01.solution.playwright/app/root.tsx index 3b2064a1a..fa7f41981 100644 --- a/exercises/01.e2e/01.solution.playwright/app/root.tsx +++ b/exercises/01.e2e/01.solution.playwright/app/root.tsx @@ -34,7 +34,6 @@ import { SearchBar } from './components/search-bar.tsx' import { Spacer } from './components/spacer.tsx' import { Button } from './components/ui/button.tsx' import { Icon } from './components/ui/icon.tsx' -import { EpicShop } from './epicshop.tsx' import fontStylestylesheetUrl from './styles/font.css' import tailwindStylesheetUrl from './styles/tailwind.css' import { getUserId } from './utils/auth.server.ts' @@ -159,7 +158,6 @@ function Document({ - diff --git a/exercises/01.e2e/01.solution.playwright/app/routes/resources+/note-images.$imageId.tsx b/exercises/01.e2e/01.solution.playwright/app/routes/resources+/note-images.$imageId.tsx index 417545a3e..865878a92 100644 --- a/exercises/01.e2e/01.solution.playwright/app/routes/resources+/note-images.$imageId.tsx +++ b/exercises/01.e2e/01.solution.playwright/app/routes/resources+/note-images.$imageId.tsx @@ -14,7 +14,7 @@ export async function loader({ params }: LoaderFunctionArgs) { return new Response(image.blob, { headers: { 'content-type': image.contentType, - 'content-length': Buffer.byteLength(image.blob).toString(), + 'content-length': image.blob.length.toString(), 'content-disposition': `inline; filename="${params.imageId}"`, 'cache-control': 'public, max-age=31536000, immutable', }, diff --git a/exercises/01.e2e/01.solution.playwright/app/routes/resources+/user-images.$imageId.tsx b/exercises/01.e2e/01.solution.playwright/app/routes/resources+/user-images.$imageId.tsx index c5a66b146..2de45198e 100644 --- a/exercises/01.e2e/01.solution.playwright/app/routes/resources+/user-images.$imageId.tsx +++ b/exercises/01.e2e/01.solution.playwright/app/routes/resources+/user-images.$imageId.tsx @@ -14,7 +14,7 @@ export async function loader({ params }: LoaderFunctionArgs) { return new Response(image.blob, { headers: { 'content-type': image.contentType, - 'content-length': Buffer.byteLength(image.blob).toString(), + 'content-length': image.blob.length.toString(), 'content-disposition': `inline; filename="${params.imageId}"`, 'cache-control': 'public, max-age=31536000, immutable', }, diff --git a/exercises/01.e2e/01.solution.playwright/app/routes/settings+/profile.photo.tsx b/exercises/01.e2e/01.solution.playwright/app/routes/settings+/profile.photo.tsx index f452baf9a..36e397f0b 100644 --- a/exercises/01.e2e/01.solution.playwright/app/routes/settings+/profile.photo.tsx +++ b/exercises/01.e2e/01.solution.playwright/app/routes/settings+/profile.photo.tsx @@ -76,7 +76,7 @@ export async function action({ request }: ActionFunctionArgs) { return { image: { contentType: data.photoFile.type, - blob: Buffer.from(await data.photoFile.arrayBuffer()), + blob: new Uint8Array(await data.photoFile.arrayBuffer()), }, } }), diff --git a/exercises/01.e2e/01.solution.playwright/app/routes/users+/$username_+/__note-editor.tsx b/exercises/01.e2e/01.solution.playwright/app/routes/users+/$username_+/__note-editor.tsx index 714fa7baf..7c8ee2109 100644 --- a/exercises/01.e2e/01.solution.playwright/app/routes/users+/$username_+/__note-editor.tsx +++ b/exercises/01.e2e/01.solution.playwright/app/routes/users+/$username_+/__note-editor.tsx @@ -96,7 +96,7 @@ export async function action({ request, params }: ActionFunctionArgs) { id: i.id, altText: i.altText, contentType: i.file.type, - blob: Buffer.from(await i.file.arrayBuffer()), + blob: new Uint8Array(await i.file.arrayBuffer()), } } else { return { id: i.id, altText: i.altText } @@ -111,7 +111,7 @@ export async function action({ request, params }: ActionFunctionArgs) { return { altText: image.altText, contentType: image.file.type, - blob: Buffer.from(await image.file.arrayBuffer()), + blob: new Uint8Array(await image.file.arrayBuffer()), } }), ), diff --git a/exercises/01.e2e/01.solution.playwright/app/utils/misc.tsx b/exercises/01.e2e/01.solution.playwright/app/utils/misc.tsx index 8879f6b41..a553484db 100644 --- a/exercises/01.e2e/01.solution.playwright/app/utils/misc.tsx +++ b/exercises/01.e2e/01.solution.playwright/app/utils/misc.tsx @@ -303,7 +303,7 @@ export async function downloadFile(url: string, retries: number = 0) { throw new Error(`Failed to fetch image with status ${response.status}`) } const contentType = response.headers.get('content-type') ?? 'image/jpg' - const blob = Buffer.from(await response.arrayBuffer()) + const blob = new Uint8Array(await response.arrayBuffer()) return { contentType, blob } } catch (e) { if (retries > MAX_RETRIES) throw e diff --git a/exercises/01.e2e/01.solution.playwright/index.js b/exercises/01.e2e/01.solution.playwright/index.js index 8ba83ba70..e8728a002 100644 --- a/exercises/01.e2e/01.solution.playwright/index.js +++ b/exercises/01.e2e/01.solution.playwright/index.js @@ -1,11 +1,8 @@ import 'dotenv/config' import 'source-map-support/register.js' -import { installGlobals } from '@remix-run/node' import chalk from 'chalk' import closeWithGrace from 'close-with-grace' -installGlobals() - if ( process.env.NODE_ENV !== 'production' || process.env.PLAYWRIGHT_TEST_BASE_URL diff --git a/exercises/01.e2e/01.solution.playwright/package.json b/exercises/01.e2e/01.solution.playwright/package.json index ac5bb9eee..2c4f4d596 100644 --- a/exercises/01.e2e/01.solution.playwright/package.json +++ b/exercises/01.e2e/01.solution.playwright/package.json @@ -30,9 +30,8 @@ "@conform-to/zod": "^0.9.0", "@epic-web/remember": "^1.1.0", "@epic-web/totp": "^1.1.2", - "@epic-web/workshop-utils": "^4.21.1", "@paralleldrive/cuid2": "^2.2.2", - "@prisma/client": "^5.16.2", + "@prisma/client": "^6.19.1", "@radix-ui/react-checkbox": "^1.1.1", "@radix-ui/react-dropdown-menu": "^2.1.1", "@radix-ui/react-label": "^2.1.0", @@ -59,13 +58,13 @@ "glob": "^11.0.0", "isbot": "^5.1.12", "morgan": "^1.10.0", - "prisma": "^5.16.2", + "prisma": "^6.19.1", "qrcode": "^1.5.3", "react": "^18.3.1", "react-dom": "^18.3.1", "remix-auth": "^3.7.0", "remix-auth-form": "^1.5.0", - "remix-auth-github": "^1.7.0", + "remix-auth-github": "1.7.0", "remix-utils": "^7.6.0", "sonner": "^1.5.0", "source-map-support": "^0.5.21", @@ -111,7 +110,7 @@ "execa": "^9.3.0", "fs-extra": "^11.2.0", "jsdom": "^24.1.0", - "msw": "^2.3.1", + "msw": "^2.12.4", "node-html-parser": "^6.1.13", "npm-run-all": "^4.1.5", "prettier": "^3.3.2", diff --git a/exercises/01.e2e/01.solution.playwright/tests/db-utils.ts b/exercises/01.e2e/01.solution.playwright/tests/db-utils.ts index 8f5062e16..2e1e23550 100644 --- a/exercises/01.e2e/01.solution.playwright/tests/db-utils.ts +++ b/exercises/01.e2e/01.solution.playwright/tests/db-utils.ts @@ -67,7 +67,7 @@ export async function getNoteImages() { }), img({ altText: - 'an office full of laptops and other office equipment that look like it was abandond in a rush out of the building in an emergency years ago.', + 'an office full of laptops and other office equipment that look like it was abandoned in a rush out of the building in an emergency years ago.', filepath: './tests/fixtures/images/notes/6.png', }), img({ @@ -110,6 +110,6 @@ export async function img({ return { altText, contentType: filepath.endsWith('.png') ? 'image/png' : 'image/jpeg', - blob: await fs.promises.readFile(filepath), + blob: new Uint8Array(await fs.promises.readFile(filepath)), } } diff --git a/exercises/01.e2e/02.problem.insert-user/app/epicshop.tsx b/exercises/01.e2e/02.problem.insert-user/app/epicshop.tsx deleted file mode 100644 index 96c5597cb..000000000 --- a/exercises/01.e2e/02.problem.insert-user/app/epicshop.tsx +++ /dev/null @@ -1,9 +0,0 @@ -// Ignore this file please -import { EpicShopIFrameSync } from '@epic-web/workshop-utils/iframe-sync' -import { useNavigate } from '@remix-run/react' -import * as React from 'react' - -export function EpicShop() { - const navigate = useNavigate() - return -} diff --git a/exercises/01.e2e/02.problem.insert-user/app/root.tsx b/exercises/01.e2e/02.problem.insert-user/app/root.tsx index 3b2064a1a..fa7f41981 100644 --- a/exercises/01.e2e/02.problem.insert-user/app/root.tsx +++ b/exercises/01.e2e/02.problem.insert-user/app/root.tsx @@ -34,7 +34,6 @@ import { SearchBar } from './components/search-bar.tsx' import { Spacer } from './components/spacer.tsx' import { Button } from './components/ui/button.tsx' import { Icon } from './components/ui/icon.tsx' -import { EpicShop } from './epicshop.tsx' import fontStylestylesheetUrl from './styles/font.css' import tailwindStylesheetUrl from './styles/tailwind.css' import { getUserId } from './utils/auth.server.ts' @@ -159,7 +158,6 @@ function Document({ - diff --git a/exercises/01.e2e/02.problem.insert-user/app/routes/resources+/note-images.$imageId.tsx b/exercises/01.e2e/02.problem.insert-user/app/routes/resources+/note-images.$imageId.tsx index 417545a3e..865878a92 100644 --- a/exercises/01.e2e/02.problem.insert-user/app/routes/resources+/note-images.$imageId.tsx +++ b/exercises/01.e2e/02.problem.insert-user/app/routes/resources+/note-images.$imageId.tsx @@ -14,7 +14,7 @@ export async function loader({ params }: LoaderFunctionArgs) { return new Response(image.blob, { headers: { 'content-type': image.contentType, - 'content-length': Buffer.byteLength(image.blob).toString(), + 'content-length': image.blob.length.toString(), 'content-disposition': `inline; filename="${params.imageId}"`, 'cache-control': 'public, max-age=31536000, immutable', }, diff --git a/exercises/01.e2e/02.problem.insert-user/app/routes/resources+/user-images.$imageId.tsx b/exercises/01.e2e/02.problem.insert-user/app/routes/resources+/user-images.$imageId.tsx index c5a66b146..2de45198e 100644 --- a/exercises/01.e2e/02.problem.insert-user/app/routes/resources+/user-images.$imageId.tsx +++ b/exercises/01.e2e/02.problem.insert-user/app/routes/resources+/user-images.$imageId.tsx @@ -14,7 +14,7 @@ export async function loader({ params }: LoaderFunctionArgs) { return new Response(image.blob, { headers: { 'content-type': image.contentType, - 'content-length': Buffer.byteLength(image.blob).toString(), + 'content-length': image.blob.length.toString(), 'content-disposition': `inline; filename="${params.imageId}"`, 'cache-control': 'public, max-age=31536000, immutable', }, diff --git a/exercises/01.e2e/02.problem.insert-user/app/routes/settings+/profile.photo.tsx b/exercises/01.e2e/02.problem.insert-user/app/routes/settings+/profile.photo.tsx index f452baf9a..36e397f0b 100644 --- a/exercises/01.e2e/02.problem.insert-user/app/routes/settings+/profile.photo.tsx +++ b/exercises/01.e2e/02.problem.insert-user/app/routes/settings+/profile.photo.tsx @@ -76,7 +76,7 @@ export async function action({ request }: ActionFunctionArgs) { return { image: { contentType: data.photoFile.type, - blob: Buffer.from(await data.photoFile.arrayBuffer()), + blob: new Uint8Array(await data.photoFile.arrayBuffer()), }, } }), diff --git a/exercises/01.e2e/02.problem.insert-user/app/routes/users+/$username_+/__note-editor.tsx b/exercises/01.e2e/02.problem.insert-user/app/routes/users+/$username_+/__note-editor.tsx index 714fa7baf..7c8ee2109 100644 --- a/exercises/01.e2e/02.problem.insert-user/app/routes/users+/$username_+/__note-editor.tsx +++ b/exercises/01.e2e/02.problem.insert-user/app/routes/users+/$username_+/__note-editor.tsx @@ -96,7 +96,7 @@ export async function action({ request, params }: ActionFunctionArgs) { id: i.id, altText: i.altText, contentType: i.file.type, - blob: Buffer.from(await i.file.arrayBuffer()), + blob: new Uint8Array(await i.file.arrayBuffer()), } } else { return { id: i.id, altText: i.altText } @@ -111,7 +111,7 @@ export async function action({ request, params }: ActionFunctionArgs) { return { altText: image.altText, contentType: image.file.type, - blob: Buffer.from(await image.file.arrayBuffer()), + blob: new Uint8Array(await image.file.arrayBuffer()), } }), ), diff --git a/exercises/01.e2e/02.problem.insert-user/app/utils/misc.tsx b/exercises/01.e2e/02.problem.insert-user/app/utils/misc.tsx index 8879f6b41..a553484db 100644 --- a/exercises/01.e2e/02.problem.insert-user/app/utils/misc.tsx +++ b/exercises/01.e2e/02.problem.insert-user/app/utils/misc.tsx @@ -303,7 +303,7 @@ export async function downloadFile(url: string, retries: number = 0) { throw new Error(`Failed to fetch image with status ${response.status}`) } const contentType = response.headers.get('content-type') ?? 'image/jpg' - const blob = Buffer.from(await response.arrayBuffer()) + const blob = new Uint8Array(await response.arrayBuffer()) return { contentType, blob } } catch (e) { if (retries > MAX_RETRIES) throw e diff --git a/exercises/01.e2e/02.problem.insert-user/index.js b/exercises/01.e2e/02.problem.insert-user/index.js index 8ba83ba70..e8728a002 100644 --- a/exercises/01.e2e/02.problem.insert-user/index.js +++ b/exercises/01.e2e/02.problem.insert-user/index.js @@ -1,11 +1,8 @@ import 'dotenv/config' import 'source-map-support/register.js' -import { installGlobals } from '@remix-run/node' import chalk from 'chalk' import closeWithGrace from 'close-with-grace' -installGlobals() - if ( process.env.NODE_ENV !== 'production' || process.env.PLAYWRIGHT_TEST_BASE_URL diff --git a/exercises/01.e2e/02.problem.insert-user/package.json b/exercises/01.e2e/02.problem.insert-user/package.json index ee3242743..5fa2230ff 100644 --- a/exercises/01.e2e/02.problem.insert-user/package.json +++ b/exercises/01.e2e/02.problem.insert-user/package.json @@ -30,9 +30,8 @@ "@conform-to/zod": "^0.9.0", "@epic-web/remember": "^1.1.0", "@epic-web/totp": "^1.1.2", - "@epic-web/workshop-utils": "^4.21.1", "@paralleldrive/cuid2": "^2.2.2", - "@prisma/client": "^5.16.2", + "@prisma/client": "^6.19.1", "@radix-ui/react-checkbox": "^1.1.1", "@radix-ui/react-dropdown-menu": "^2.1.1", "@radix-ui/react-label": "^2.1.0", @@ -59,13 +58,13 @@ "glob": "^11.0.0", "isbot": "^5.1.12", "morgan": "^1.10.0", - "prisma": "^5.16.2", + "prisma": "^6.19.1", "qrcode": "^1.5.3", "react": "^18.3.1", "react-dom": "^18.3.1", "remix-auth": "^3.7.0", "remix-auth-form": "^1.5.0", - "remix-auth-github": "^1.7.0", + "remix-auth-github": "1.7.0", "remix-utils": "^7.6.0", "sonner": "^1.5.0", "source-map-support": "^0.5.21", @@ -111,7 +110,7 @@ "execa": "^9.3.0", "fs-extra": "^11.2.0", "jsdom": "^24.1.0", - "msw": "^2.3.1", + "msw": "^2.12.4", "node-html-parser": "^6.1.13", "npm-run-all": "^4.1.5", "prettier": "^3.3.2", diff --git a/exercises/01.e2e/02.problem.insert-user/tests/db-utils.ts b/exercises/01.e2e/02.problem.insert-user/tests/db-utils.ts index 8f5062e16..2e1e23550 100644 --- a/exercises/01.e2e/02.problem.insert-user/tests/db-utils.ts +++ b/exercises/01.e2e/02.problem.insert-user/tests/db-utils.ts @@ -67,7 +67,7 @@ export async function getNoteImages() { }), img({ altText: - 'an office full of laptops and other office equipment that look like it was abandond in a rush out of the building in an emergency years ago.', + 'an office full of laptops and other office equipment that look like it was abandoned in a rush out of the building in an emergency years ago.', filepath: './tests/fixtures/images/notes/6.png', }), img({ @@ -110,6 +110,6 @@ export async function img({ return { altText, contentType: filepath.endsWith('.png') ? 'image/png' : 'image/jpeg', - blob: await fs.promises.readFile(filepath), + blob: new Uint8Array(await fs.promises.readFile(filepath)), } } diff --git a/exercises/01.e2e/02.solution.insert-user/app/epicshop.tsx b/exercises/01.e2e/02.solution.insert-user/app/epicshop.tsx deleted file mode 100644 index 96c5597cb..000000000 --- a/exercises/01.e2e/02.solution.insert-user/app/epicshop.tsx +++ /dev/null @@ -1,9 +0,0 @@ -// Ignore this file please -import { EpicShopIFrameSync } from '@epic-web/workshop-utils/iframe-sync' -import { useNavigate } from '@remix-run/react' -import * as React from 'react' - -export function EpicShop() { - const navigate = useNavigate() - return -} diff --git a/exercises/01.e2e/02.solution.insert-user/app/root.tsx b/exercises/01.e2e/02.solution.insert-user/app/root.tsx index 3b2064a1a..fa7f41981 100644 --- a/exercises/01.e2e/02.solution.insert-user/app/root.tsx +++ b/exercises/01.e2e/02.solution.insert-user/app/root.tsx @@ -34,7 +34,6 @@ import { SearchBar } from './components/search-bar.tsx' import { Spacer } from './components/spacer.tsx' import { Button } from './components/ui/button.tsx' import { Icon } from './components/ui/icon.tsx' -import { EpicShop } from './epicshop.tsx' import fontStylestylesheetUrl from './styles/font.css' import tailwindStylesheetUrl from './styles/tailwind.css' import { getUserId } from './utils/auth.server.ts' @@ -159,7 +158,6 @@ function Document({ - diff --git a/exercises/01.e2e/02.solution.insert-user/app/routes/resources+/note-images.$imageId.tsx b/exercises/01.e2e/02.solution.insert-user/app/routes/resources+/note-images.$imageId.tsx index 417545a3e..865878a92 100644 --- a/exercises/01.e2e/02.solution.insert-user/app/routes/resources+/note-images.$imageId.tsx +++ b/exercises/01.e2e/02.solution.insert-user/app/routes/resources+/note-images.$imageId.tsx @@ -14,7 +14,7 @@ export async function loader({ params }: LoaderFunctionArgs) { return new Response(image.blob, { headers: { 'content-type': image.contentType, - 'content-length': Buffer.byteLength(image.blob).toString(), + 'content-length': image.blob.length.toString(), 'content-disposition': `inline; filename="${params.imageId}"`, 'cache-control': 'public, max-age=31536000, immutable', }, diff --git a/exercises/01.e2e/02.solution.insert-user/app/routes/resources+/user-images.$imageId.tsx b/exercises/01.e2e/02.solution.insert-user/app/routes/resources+/user-images.$imageId.tsx index c5a66b146..2de45198e 100644 --- a/exercises/01.e2e/02.solution.insert-user/app/routes/resources+/user-images.$imageId.tsx +++ b/exercises/01.e2e/02.solution.insert-user/app/routes/resources+/user-images.$imageId.tsx @@ -14,7 +14,7 @@ export async function loader({ params }: LoaderFunctionArgs) { return new Response(image.blob, { headers: { 'content-type': image.contentType, - 'content-length': Buffer.byteLength(image.blob).toString(), + 'content-length': image.blob.length.toString(), 'content-disposition': `inline; filename="${params.imageId}"`, 'cache-control': 'public, max-age=31536000, immutable', }, diff --git a/exercises/01.e2e/02.solution.insert-user/app/routes/settings+/profile.photo.tsx b/exercises/01.e2e/02.solution.insert-user/app/routes/settings+/profile.photo.tsx index f452baf9a..36e397f0b 100644 --- a/exercises/01.e2e/02.solution.insert-user/app/routes/settings+/profile.photo.tsx +++ b/exercises/01.e2e/02.solution.insert-user/app/routes/settings+/profile.photo.tsx @@ -76,7 +76,7 @@ export async function action({ request }: ActionFunctionArgs) { return { image: { contentType: data.photoFile.type, - blob: Buffer.from(await data.photoFile.arrayBuffer()), + blob: new Uint8Array(await data.photoFile.arrayBuffer()), }, } }), diff --git a/exercises/01.e2e/02.solution.insert-user/app/routes/users+/$username_+/__note-editor.tsx b/exercises/01.e2e/02.solution.insert-user/app/routes/users+/$username_+/__note-editor.tsx index 714fa7baf..7c8ee2109 100644 --- a/exercises/01.e2e/02.solution.insert-user/app/routes/users+/$username_+/__note-editor.tsx +++ b/exercises/01.e2e/02.solution.insert-user/app/routes/users+/$username_+/__note-editor.tsx @@ -96,7 +96,7 @@ export async function action({ request, params }: ActionFunctionArgs) { id: i.id, altText: i.altText, contentType: i.file.type, - blob: Buffer.from(await i.file.arrayBuffer()), + blob: new Uint8Array(await i.file.arrayBuffer()), } } else { return { id: i.id, altText: i.altText } @@ -111,7 +111,7 @@ export async function action({ request, params }: ActionFunctionArgs) { return { altText: image.altText, contentType: image.file.type, - blob: Buffer.from(await image.file.arrayBuffer()), + blob: new Uint8Array(await image.file.arrayBuffer()), } }), ), diff --git a/exercises/01.e2e/02.solution.insert-user/app/utils/misc.tsx b/exercises/01.e2e/02.solution.insert-user/app/utils/misc.tsx index 8879f6b41..a553484db 100644 --- a/exercises/01.e2e/02.solution.insert-user/app/utils/misc.tsx +++ b/exercises/01.e2e/02.solution.insert-user/app/utils/misc.tsx @@ -303,7 +303,7 @@ export async function downloadFile(url: string, retries: number = 0) { throw new Error(`Failed to fetch image with status ${response.status}`) } const contentType = response.headers.get('content-type') ?? 'image/jpg' - const blob = Buffer.from(await response.arrayBuffer()) + const blob = new Uint8Array(await response.arrayBuffer()) return { contentType, blob } } catch (e) { if (retries > MAX_RETRIES) throw e diff --git a/exercises/01.e2e/02.solution.insert-user/index.js b/exercises/01.e2e/02.solution.insert-user/index.js index 8ba83ba70..e8728a002 100644 --- a/exercises/01.e2e/02.solution.insert-user/index.js +++ b/exercises/01.e2e/02.solution.insert-user/index.js @@ -1,11 +1,8 @@ import 'dotenv/config' import 'source-map-support/register.js' -import { installGlobals } from '@remix-run/node' import chalk from 'chalk' import closeWithGrace from 'close-with-grace' -installGlobals() - if ( process.env.NODE_ENV !== 'production' || process.env.PLAYWRIGHT_TEST_BASE_URL diff --git a/exercises/01.e2e/02.solution.insert-user/package.json b/exercises/01.e2e/02.solution.insert-user/package.json index 18f8d6a8f..f7f147c17 100644 --- a/exercises/01.e2e/02.solution.insert-user/package.json +++ b/exercises/01.e2e/02.solution.insert-user/package.json @@ -30,9 +30,8 @@ "@conform-to/zod": "^0.9.0", "@epic-web/remember": "^1.1.0", "@epic-web/totp": "^1.1.2", - "@epic-web/workshop-utils": "^4.21.1", "@paralleldrive/cuid2": "^2.2.2", - "@prisma/client": "^5.16.2", + "@prisma/client": "^6.19.1", "@radix-ui/react-checkbox": "^1.1.1", "@radix-ui/react-dropdown-menu": "^2.1.1", "@radix-ui/react-label": "^2.1.0", @@ -59,13 +58,13 @@ "glob": "^11.0.0", "isbot": "^5.1.12", "morgan": "^1.10.0", - "prisma": "^5.16.2", + "prisma": "^6.19.1", "qrcode": "^1.5.3", "react": "^18.3.1", "react-dom": "^18.3.1", "remix-auth": "^3.7.0", "remix-auth-form": "^1.5.0", - "remix-auth-github": "^1.7.0", + "remix-auth-github": "1.7.0", "remix-utils": "^7.6.0", "sonner": "^1.5.0", "source-map-support": "^0.5.21", @@ -111,7 +110,7 @@ "execa": "^9.3.0", "fs-extra": "^11.2.0", "jsdom": "^24.1.0", - "msw": "^2.3.1", + "msw": "^2.12.4", "node-html-parser": "^6.1.13", "npm-run-all": "^4.1.5", "prettier": "^3.3.2", diff --git a/exercises/01.e2e/02.solution.insert-user/tests/db-utils.ts b/exercises/01.e2e/02.solution.insert-user/tests/db-utils.ts index 8f5062e16..2e1e23550 100644 --- a/exercises/01.e2e/02.solution.insert-user/tests/db-utils.ts +++ b/exercises/01.e2e/02.solution.insert-user/tests/db-utils.ts @@ -67,7 +67,7 @@ export async function getNoteImages() { }), img({ altText: - 'an office full of laptops and other office equipment that look like it was abandond in a rush out of the building in an emergency years ago.', + 'an office full of laptops and other office equipment that look like it was abandoned in a rush out of the building in an emergency years ago.', filepath: './tests/fixtures/images/notes/6.png', }), img({ @@ -110,6 +110,6 @@ export async function img({ return { altText, contentType: filepath.endsWith('.png') ? 'image/png' : 'image/jpeg', - blob: await fs.promises.readFile(filepath), + blob: new Uint8Array(await fs.promises.readFile(filepath)), } } diff --git a/exercises/01.e2e/03.problem.cleanup/app/epicshop.tsx b/exercises/01.e2e/03.problem.cleanup/app/epicshop.tsx deleted file mode 100644 index 96c5597cb..000000000 --- a/exercises/01.e2e/03.problem.cleanup/app/epicshop.tsx +++ /dev/null @@ -1,9 +0,0 @@ -// Ignore this file please -import { EpicShopIFrameSync } from '@epic-web/workshop-utils/iframe-sync' -import { useNavigate } from '@remix-run/react' -import * as React from 'react' - -export function EpicShop() { - const navigate = useNavigate() - return -} diff --git a/exercises/01.e2e/03.problem.cleanup/app/root.tsx b/exercises/01.e2e/03.problem.cleanup/app/root.tsx index 3b2064a1a..fa7f41981 100644 --- a/exercises/01.e2e/03.problem.cleanup/app/root.tsx +++ b/exercises/01.e2e/03.problem.cleanup/app/root.tsx @@ -34,7 +34,6 @@ import { SearchBar } from './components/search-bar.tsx' import { Spacer } from './components/spacer.tsx' import { Button } from './components/ui/button.tsx' import { Icon } from './components/ui/icon.tsx' -import { EpicShop } from './epicshop.tsx' import fontStylestylesheetUrl from './styles/font.css' import tailwindStylesheetUrl from './styles/tailwind.css' import { getUserId } from './utils/auth.server.ts' @@ -159,7 +158,6 @@ function Document({ - diff --git a/exercises/01.e2e/03.problem.cleanup/app/routes/resources+/note-images.$imageId.tsx b/exercises/01.e2e/03.problem.cleanup/app/routes/resources+/note-images.$imageId.tsx index 417545a3e..865878a92 100644 --- a/exercises/01.e2e/03.problem.cleanup/app/routes/resources+/note-images.$imageId.tsx +++ b/exercises/01.e2e/03.problem.cleanup/app/routes/resources+/note-images.$imageId.tsx @@ -14,7 +14,7 @@ export async function loader({ params }: LoaderFunctionArgs) { return new Response(image.blob, { headers: { 'content-type': image.contentType, - 'content-length': Buffer.byteLength(image.blob).toString(), + 'content-length': image.blob.length.toString(), 'content-disposition': `inline; filename="${params.imageId}"`, 'cache-control': 'public, max-age=31536000, immutable', }, diff --git a/exercises/01.e2e/03.problem.cleanup/app/routes/resources+/user-images.$imageId.tsx b/exercises/01.e2e/03.problem.cleanup/app/routes/resources+/user-images.$imageId.tsx index c5a66b146..2de45198e 100644 --- a/exercises/01.e2e/03.problem.cleanup/app/routes/resources+/user-images.$imageId.tsx +++ b/exercises/01.e2e/03.problem.cleanup/app/routes/resources+/user-images.$imageId.tsx @@ -14,7 +14,7 @@ export async function loader({ params }: LoaderFunctionArgs) { return new Response(image.blob, { headers: { 'content-type': image.contentType, - 'content-length': Buffer.byteLength(image.blob).toString(), + 'content-length': image.blob.length.toString(), 'content-disposition': `inline; filename="${params.imageId}"`, 'cache-control': 'public, max-age=31536000, immutable', }, diff --git a/exercises/01.e2e/03.problem.cleanup/app/routes/settings+/profile.photo.tsx b/exercises/01.e2e/03.problem.cleanup/app/routes/settings+/profile.photo.tsx index f452baf9a..36e397f0b 100644 --- a/exercises/01.e2e/03.problem.cleanup/app/routes/settings+/profile.photo.tsx +++ b/exercises/01.e2e/03.problem.cleanup/app/routes/settings+/profile.photo.tsx @@ -76,7 +76,7 @@ export async function action({ request }: ActionFunctionArgs) { return { image: { contentType: data.photoFile.type, - blob: Buffer.from(await data.photoFile.arrayBuffer()), + blob: new Uint8Array(await data.photoFile.arrayBuffer()), }, } }), diff --git a/exercises/01.e2e/03.problem.cleanup/app/routes/users+/$username_+/__note-editor.tsx b/exercises/01.e2e/03.problem.cleanup/app/routes/users+/$username_+/__note-editor.tsx index 714fa7baf..7c8ee2109 100644 --- a/exercises/01.e2e/03.problem.cleanup/app/routes/users+/$username_+/__note-editor.tsx +++ b/exercises/01.e2e/03.problem.cleanup/app/routes/users+/$username_+/__note-editor.tsx @@ -96,7 +96,7 @@ export async function action({ request, params }: ActionFunctionArgs) { id: i.id, altText: i.altText, contentType: i.file.type, - blob: Buffer.from(await i.file.arrayBuffer()), + blob: new Uint8Array(await i.file.arrayBuffer()), } } else { return { id: i.id, altText: i.altText } @@ -111,7 +111,7 @@ export async function action({ request, params }: ActionFunctionArgs) { return { altText: image.altText, contentType: image.file.type, - blob: Buffer.from(await image.file.arrayBuffer()), + blob: new Uint8Array(await image.file.arrayBuffer()), } }), ), diff --git a/exercises/01.e2e/03.problem.cleanup/app/utils/misc.tsx b/exercises/01.e2e/03.problem.cleanup/app/utils/misc.tsx index 8879f6b41..a553484db 100644 --- a/exercises/01.e2e/03.problem.cleanup/app/utils/misc.tsx +++ b/exercises/01.e2e/03.problem.cleanup/app/utils/misc.tsx @@ -303,7 +303,7 @@ export async function downloadFile(url: string, retries: number = 0) { throw new Error(`Failed to fetch image with status ${response.status}`) } const contentType = response.headers.get('content-type') ?? 'image/jpg' - const blob = Buffer.from(await response.arrayBuffer()) + const blob = new Uint8Array(await response.arrayBuffer()) return { contentType, blob } } catch (e) { if (retries > MAX_RETRIES) throw e diff --git a/exercises/01.e2e/03.problem.cleanup/index.js b/exercises/01.e2e/03.problem.cleanup/index.js index 8ba83ba70..e8728a002 100644 --- a/exercises/01.e2e/03.problem.cleanup/index.js +++ b/exercises/01.e2e/03.problem.cleanup/index.js @@ -1,11 +1,8 @@ import 'dotenv/config' import 'source-map-support/register.js' -import { installGlobals } from '@remix-run/node' import chalk from 'chalk' import closeWithGrace from 'close-with-grace' -installGlobals() - if ( process.env.NODE_ENV !== 'production' || process.env.PLAYWRIGHT_TEST_BASE_URL diff --git a/exercises/01.e2e/03.problem.cleanup/package.json b/exercises/01.e2e/03.problem.cleanup/package.json index 05433ae7c..f866a8576 100644 --- a/exercises/01.e2e/03.problem.cleanup/package.json +++ b/exercises/01.e2e/03.problem.cleanup/package.json @@ -30,9 +30,8 @@ "@conform-to/zod": "^0.9.0", "@epic-web/remember": "^1.1.0", "@epic-web/totp": "^1.1.2", - "@epic-web/workshop-utils": "^4.21.1", "@paralleldrive/cuid2": "^2.2.2", - "@prisma/client": "^5.16.2", + "@prisma/client": "^6.19.1", "@radix-ui/react-checkbox": "^1.1.1", "@radix-ui/react-dropdown-menu": "^2.1.1", "@radix-ui/react-label": "^2.1.0", @@ -59,13 +58,13 @@ "glob": "^11.0.0", "isbot": "^5.1.12", "morgan": "^1.10.0", - "prisma": "^5.16.2", + "prisma": "^6.19.1", "qrcode": "^1.5.3", "react": "^18.3.1", "react-dom": "^18.3.1", "remix-auth": "^3.7.0", "remix-auth-form": "^1.5.0", - "remix-auth-github": "^1.7.0", + "remix-auth-github": "1.7.0", "remix-utils": "^7.6.0", "sonner": "^1.5.0", "source-map-support": "^0.5.21", @@ -111,7 +110,7 @@ "execa": "^9.3.0", "fs-extra": "^11.2.0", "jsdom": "^24.1.0", - "msw": "^2.3.1", + "msw": "^2.12.4", "node-html-parser": "^6.1.13", "npm-run-all": "^4.1.5", "prettier": "^3.3.2", diff --git a/exercises/01.e2e/03.problem.cleanup/tests/db-utils.ts b/exercises/01.e2e/03.problem.cleanup/tests/db-utils.ts index 8f5062e16..2e1e23550 100644 --- a/exercises/01.e2e/03.problem.cleanup/tests/db-utils.ts +++ b/exercises/01.e2e/03.problem.cleanup/tests/db-utils.ts @@ -67,7 +67,7 @@ export async function getNoteImages() { }), img({ altText: - 'an office full of laptops and other office equipment that look like it was abandond in a rush out of the building in an emergency years ago.', + 'an office full of laptops and other office equipment that look like it was abandoned in a rush out of the building in an emergency years ago.', filepath: './tests/fixtures/images/notes/6.png', }), img({ @@ -110,6 +110,6 @@ export async function img({ return { altText, contentType: filepath.endsWith('.png') ? 'image/png' : 'image/jpeg', - blob: await fs.promises.readFile(filepath), + blob: new Uint8Array(await fs.promises.readFile(filepath)), } } diff --git a/exercises/01.e2e/03.solution.cleanup/app/epicshop.tsx b/exercises/01.e2e/03.solution.cleanup/app/epicshop.tsx deleted file mode 100644 index 96c5597cb..000000000 --- a/exercises/01.e2e/03.solution.cleanup/app/epicshop.tsx +++ /dev/null @@ -1,9 +0,0 @@ -// Ignore this file please -import { EpicShopIFrameSync } from '@epic-web/workshop-utils/iframe-sync' -import { useNavigate } from '@remix-run/react' -import * as React from 'react' - -export function EpicShop() { - const navigate = useNavigate() - return -} diff --git a/exercises/01.e2e/03.solution.cleanup/app/root.tsx b/exercises/01.e2e/03.solution.cleanup/app/root.tsx index 3b2064a1a..fa7f41981 100644 --- a/exercises/01.e2e/03.solution.cleanup/app/root.tsx +++ b/exercises/01.e2e/03.solution.cleanup/app/root.tsx @@ -34,7 +34,6 @@ import { SearchBar } from './components/search-bar.tsx' import { Spacer } from './components/spacer.tsx' import { Button } from './components/ui/button.tsx' import { Icon } from './components/ui/icon.tsx' -import { EpicShop } from './epicshop.tsx' import fontStylestylesheetUrl from './styles/font.css' import tailwindStylesheetUrl from './styles/tailwind.css' import { getUserId } from './utils/auth.server.ts' @@ -159,7 +158,6 @@ function Document({ - diff --git a/exercises/01.e2e/03.solution.cleanup/app/routes/resources+/note-images.$imageId.tsx b/exercises/01.e2e/03.solution.cleanup/app/routes/resources+/note-images.$imageId.tsx index 417545a3e..865878a92 100644 --- a/exercises/01.e2e/03.solution.cleanup/app/routes/resources+/note-images.$imageId.tsx +++ b/exercises/01.e2e/03.solution.cleanup/app/routes/resources+/note-images.$imageId.tsx @@ -14,7 +14,7 @@ export async function loader({ params }: LoaderFunctionArgs) { return new Response(image.blob, { headers: { 'content-type': image.contentType, - 'content-length': Buffer.byteLength(image.blob).toString(), + 'content-length': image.blob.length.toString(), 'content-disposition': `inline; filename="${params.imageId}"`, 'cache-control': 'public, max-age=31536000, immutable', }, diff --git a/exercises/01.e2e/03.solution.cleanup/app/routes/resources+/user-images.$imageId.tsx b/exercises/01.e2e/03.solution.cleanup/app/routes/resources+/user-images.$imageId.tsx index c5a66b146..2de45198e 100644 --- a/exercises/01.e2e/03.solution.cleanup/app/routes/resources+/user-images.$imageId.tsx +++ b/exercises/01.e2e/03.solution.cleanup/app/routes/resources+/user-images.$imageId.tsx @@ -14,7 +14,7 @@ export async function loader({ params }: LoaderFunctionArgs) { return new Response(image.blob, { headers: { 'content-type': image.contentType, - 'content-length': Buffer.byteLength(image.blob).toString(), + 'content-length': image.blob.length.toString(), 'content-disposition': `inline; filename="${params.imageId}"`, 'cache-control': 'public, max-age=31536000, immutable', }, diff --git a/exercises/01.e2e/03.solution.cleanup/app/routes/settings+/profile.photo.tsx b/exercises/01.e2e/03.solution.cleanup/app/routes/settings+/profile.photo.tsx index f452baf9a..36e397f0b 100644 --- a/exercises/01.e2e/03.solution.cleanup/app/routes/settings+/profile.photo.tsx +++ b/exercises/01.e2e/03.solution.cleanup/app/routes/settings+/profile.photo.tsx @@ -76,7 +76,7 @@ export async function action({ request }: ActionFunctionArgs) { return { image: { contentType: data.photoFile.type, - blob: Buffer.from(await data.photoFile.arrayBuffer()), + blob: new Uint8Array(await data.photoFile.arrayBuffer()), }, } }), diff --git a/exercises/01.e2e/03.solution.cleanup/app/routes/users+/$username_+/__note-editor.tsx b/exercises/01.e2e/03.solution.cleanup/app/routes/users+/$username_+/__note-editor.tsx index 714fa7baf..7c8ee2109 100644 --- a/exercises/01.e2e/03.solution.cleanup/app/routes/users+/$username_+/__note-editor.tsx +++ b/exercises/01.e2e/03.solution.cleanup/app/routes/users+/$username_+/__note-editor.tsx @@ -96,7 +96,7 @@ export async function action({ request, params }: ActionFunctionArgs) { id: i.id, altText: i.altText, contentType: i.file.type, - blob: Buffer.from(await i.file.arrayBuffer()), + blob: new Uint8Array(await i.file.arrayBuffer()), } } else { return { id: i.id, altText: i.altText } @@ -111,7 +111,7 @@ export async function action({ request, params }: ActionFunctionArgs) { return { altText: image.altText, contentType: image.file.type, - blob: Buffer.from(await image.file.arrayBuffer()), + blob: new Uint8Array(await image.file.arrayBuffer()), } }), ), diff --git a/exercises/01.e2e/03.solution.cleanup/app/utils/misc.tsx b/exercises/01.e2e/03.solution.cleanup/app/utils/misc.tsx index 8879f6b41..a553484db 100644 --- a/exercises/01.e2e/03.solution.cleanup/app/utils/misc.tsx +++ b/exercises/01.e2e/03.solution.cleanup/app/utils/misc.tsx @@ -303,7 +303,7 @@ export async function downloadFile(url: string, retries: number = 0) { throw new Error(`Failed to fetch image with status ${response.status}`) } const contentType = response.headers.get('content-type') ?? 'image/jpg' - const blob = Buffer.from(await response.arrayBuffer()) + const blob = new Uint8Array(await response.arrayBuffer()) return { contentType, blob } } catch (e) { if (retries > MAX_RETRIES) throw e diff --git a/exercises/01.e2e/03.solution.cleanup/index.js b/exercises/01.e2e/03.solution.cleanup/index.js index 8ba83ba70..e8728a002 100644 --- a/exercises/01.e2e/03.solution.cleanup/index.js +++ b/exercises/01.e2e/03.solution.cleanup/index.js @@ -1,11 +1,8 @@ import 'dotenv/config' import 'source-map-support/register.js' -import { installGlobals } from '@remix-run/node' import chalk from 'chalk' import closeWithGrace from 'close-with-grace' -installGlobals() - if ( process.env.NODE_ENV !== 'production' || process.env.PLAYWRIGHT_TEST_BASE_URL diff --git a/exercises/01.e2e/03.solution.cleanup/package.json b/exercises/01.e2e/03.solution.cleanup/package.json index e501858b0..8e134667d 100644 --- a/exercises/01.e2e/03.solution.cleanup/package.json +++ b/exercises/01.e2e/03.solution.cleanup/package.json @@ -30,9 +30,8 @@ "@conform-to/zod": "^0.9.0", "@epic-web/remember": "^1.1.0", "@epic-web/totp": "^1.1.2", - "@epic-web/workshop-utils": "^4.21.1", "@paralleldrive/cuid2": "^2.2.2", - "@prisma/client": "^5.16.2", + "@prisma/client": "^6.19.1", "@radix-ui/react-checkbox": "^1.1.1", "@radix-ui/react-dropdown-menu": "^2.1.1", "@radix-ui/react-label": "^2.1.0", @@ -59,13 +58,13 @@ "glob": "^11.0.0", "isbot": "^5.1.12", "morgan": "^1.10.0", - "prisma": "^5.16.2", + "prisma": "^6.19.1", "qrcode": "^1.5.3", "react": "^18.3.1", "react-dom": "^18.3.1", "remix-auth": "^3.7.0", "remix-auth-form": "^1.5.0", - "remix-auth-github": "^1.7.0", + "remix-auth-github": "1.7.0", "remix-utils": "^7.6.0", "sonner": "^1.5.0", "source-map-support": "^0.5.21", @@ -111,7 +110,7 @@ "execa": "^9.3.0", "fs-extra": "^11.2.0", "jsdom": "^24.1.0", - "msw": "^2.3.1", + "msw": "^2.12.4", "node-html-parser": "^6.1.13", "npm-run-all": "^4.1.5", "prettier": "^3.3.2", diff --git a/exercises/01.e2e/03.solution.cleanup/tests/db-utils.ts b/exercises/01.e2e/03.solution.cleanup/tests/db-utils.ts index 8f5062e16..2e1e23550 100644 --- a/exercises/01.e2e/03.solution.cleanup/tests/db-utils.ts +++ b/exercises/01.e2e/03.solution.cleanup/tests/db-utils.ts @@ -67,7 +67,7 @@ export async function getNoteImages() { }), img({ altText: - 'an office full of laptops and other office equipment that look like it was abandond in a rush out of the building in an emergency years ago.', + 'an office full of laptops and other office equipment that look like it was abandoned in a rush out of the building in an emergency years ago.', filepath: './tests/fixtures/images/notes/6.png', }), img({ @@ -110,6 +110,6 @@ export async function img({ return { altText, contentType: filepath.endsWith('.png') ? 'image/png' : 'image/jpeg', - blob: await fs.promises.readFile(filepath), + blob: new Uint8Array(await fs.promises.readFile(filepath)), } } diff --git a/exercises/01.e2e/04.problem.fixtures/app/epicshop.tsx b/exercises/01.e2e/04.problem.fixtures/app/epicshop.tsx deleted file mode 100644 index 96c5597cb..000000000 --- a/exercises/01.e2e/04.problem.fixtures/app/epicshop.tsx +++ /dev/null @@ -1,9 +0,0 @@ -// Ignore this file please -import { EpicShopIFrameSync } from '@epic-web/workshop-utils/iframe-sync' -import { useNavigate } from '@remix-run/react' -import * as React from 'react' - -export function EpicShop() { - const navigate = useNavigate() - return -} diff --git a/exercises/01.e2e/04.problem.fixtures/app/root.tsx b/exercises/01.e2e/04.problem.fixtures/app/root.tsx index 3b2064a1a..fa7f41981 100644 --- a/exercises/01.e2e/04.problem.fixtures/app/root.tsx +++ b/exercises/01.e2e/04.problem.fixtures/app/root.tsx @@ -34,7 +34,6 @@ import { SearchBar } from './components/search-bar.tsx' import { Spacer } from './components/spacer.tsx' import { Button } from './components/ui/button.tsx' import { Icon } from './components/ui/icon.tsx' -import { EpicShop } from './epicshop.tsx' import fontStylestylesheetUrl from './styles/font.css' import tailwindStylesheetUrl from './styles/tailwind.css' import { getUserId } from './utils/auth.server.ts' @@ -159,7 +158,6 @@ function Document({ - diff --git a/exercises/01.e2e/04.problem.fixtures/app/routes/resources+/note-images.$imageId.tsx b/exercises/01.e2e/04.problem.fixtures/app/routes/resources+/note-images.$imageId.tsx index 417545a3e..865878a92 100644 --- a/exercises/01.e2e/04.problem.fixtures/app/routes/resources+/note-images.$imageId.tsx +++ b/exercises/01.e2e/04.problem.fixtures/app/routes/resources+/note-images.$imageId.tsx @@ -14,7 +14,7 @@ export async function loader({ params }: LoaderFunctionArgs) { return new Response(image.blob, { headers: { 'content-type': image.contentType, - 'content-length': Buffer.byteLength(image.blob).toString(), + 'content-length': image.blob.length.toString(), 'content-disposition': `inline; filename="${params.imageId}"`, 'cache-control': 'public, max-age=31536000, immutable', }, diff --git a/exercises/01.e2e/04.problem.fixtures/app/routes/resources+/user-images.$imageId.tsx b/exercises/01.e2e/04.problem.fixtures/app/routes/resources+/user-images.$imageId.tsx index c5a66b146..2de45198e 100644 --- a/exercises/01.e2e/04.problem.fixtures/app/routes/resources+/user-images.$imageId.tsx +++ b/exercises/01.e2e/04.problem.fixtures/app/routes/resources+/user-images.$imageId.tsx @@ -14,7 +14,7 @@ export async function loader({ params }: LoaderFunctionArgs) { return new Response(image.blob, { headers: { 'content-type': image.contentType, - 'content-length': Buffer.byteLength(image.blob).toString(), + 'content-length': image.blob.length.toString(), 'content-disposition': `inline; filename="${params.imageId}"`, 'cache-control': 'public, max-age=31536000, immutable', }, diff --git a/exercises/01.e2e/04.problem.fixtures/app/routes/settings+/profile.photo.tsx b/exercises/01.e2e/04.problem.fixtures/app/routes/settings+/profile.photo.tsx index f452baf9a..36e397f0b 100644 --- a/exercises/01.e2e/04.problem.fixtures/app/routes/settings+/profile.photo.tsx +++ b/exercises/01.e2e/04.problem.fixtures/app/routes/settings+/profile.photo.tsx @@ -76,7 +76,7 @@ export async function action({ request }: ActionFunctionArgs) { return { image: { contentType: data.photoFile.type, - blob: Buffer.from(await data.photoFile.arrayBuffer()), + blob: new Uint8Array(await data.photoFile.arrayBuffer()), }, } }), diff --git a/exercises/01.e2e/04.problem.fixtures/app/routes/users+/$username_+/__note-editor.tsx b/exercises/01.e2e/04.problem.fixtures/app/routes/users+/$username_+/__note-editor.tsx index 714fa7baf..7c8ee2109 100644 --- a/exercises/01.e2e/04.problem.fixtures/app/routes/users+/$username_+/__note-editor.tsx +++ b/exercises/01.e2e/04.problem.fixtures/app/routes/users+/$username_+/__note-editor.tsx @@ -96,7 +96,7 @@ export async function action({ request, params }: ActionFunctionArgs) { id: i.id, altText: i.altText, contentType: i.file.type, - blob: Buffer.from(await i.file.arrayBuffer()), + blob: new Uint8Array(await i.file.arrayBuffer()), } } else { return { id: i.id, altText: i.altText } @@ -111,7 +111,7 @@ export async function action({ request, params }: ActionFunctionArgs) { return { altText: image.altText, contentType: image.file.type, - blob: Buffer.from(await image.file.arrayBuffer()), + blob: new Uint8Array(await image.file.arrayBuffer()), } }), ), diff --git a/exercises/01.e2e/04.problem.fixtures/app/utils/misc.tsx b/exercises/01.e2e/04.problem.fixtures/app/utils/misc.tsx index 8879f6b41..a553484db 100644 --- a/exercises/01.e2e/04.problem.fixtures/app/utils/misc.tsx +++ b/exercises/01.e2e/04.problem.fixtures/app/utils/misc.tsx @@ -303,7 +303,7 @@ export async function downloadFile(url: string, retries: number = 0) { throw new Error(`Failed to fetch image with status ${response.status}`) } const contentType = response.headers.get('content-type') ?? 'image/jpg' - const blob = Buffer.from(await response.arrayBuffer()) + const blob = new Uint8Array(await response.arrayBuffer()) return { contentType, blob } } catch (e) { if (retries > MAX_RETRIES) throw e diff --git a/exercises/01.e2e/04.problem.fixtures/index.js b/exercises/01.e2e/04.problem.fixtures/index.js index 8ba83ba70..e8728a002 100644 --- a/exercises/01.e2e/04.problem.fixtures/index.js +++ b/exercises/01.e2e/04.problem.fixtures/index.js @@ -1,11 +1,8 @@ import 'dotenv/config' import 'source-map-support/register.js' -import { installGlobals } from '@remix-run/node' import chalk from 'chalk' import closeWithGrace from 'close-with-grace' -installGlobals() - if ( process.env.NODE_ENV !== 'production' || process.env.PLAYWRIGHT_TEST_BASE_URL diff --git a/exercises/01.e2e/04.problem.fixtures/package.json b/exercises/01.e2e/04.problem.fixtures/package.json index 693ef7670..d1faa40da 100644 --- a/exercises/01.e2e/04.problem.fixtures/package.json +++ b/exercises/01.e2e/04.problem.fixtures/package.json @@ -30,9 +30,8 @@ "@conform-to/zod": "^0.9.0", "@epic-web/remember": "^1.1.0", "@epic-web/totp": "^1.1.2", - "@epic-web/workshop-utils": "^4.21.1", "@paralleldrive/cuid2": "^2.2.2", - "@prisma/client": "^5.16.2", + "@prisma/client": "^6.19.1", "@radix-ui/react-checkbox": "^1.1.1", "@radix-ui/react-dropdown-menu": "^2.1.1", "@radix-ui/react-label": "^2.1.0", @@ -59,13 +58,13 @@ "glob": "^11.0.0", "isbot": "^5.1.12", "morgan": "^1.10.0", - "prisma": "^5.16.2", + "prisma": "^6.19.1", "qrcode": "^1.5.3", "react": "^18.3.1", "react-dom": "^18.3.1", "remix-auth": "^3.7.0", "remix-auth-form": "^1.5.0", - "remix-auth-github": "^1.7.0", + "remix-auth-github": "1.7.0", "remix-utils": "^7.6.0", "sonner": "^1.5.0", "source-map-support": "^0.5.21", @@ -111,7 +110,7 @@ "execa": "^9.3.0", "fs-extra": "^11.2.0", "jsdom": "^24.1.0", - "msw": "^2.3.1", + "msw": "^2.12.4", "node-html-parser": "^6.1.13", "npm-run-all": "^4.1.5", "prettier": "^3.3.2", diff --git a/exercises/01.e2e/04.problem.fixtures/tests/db-utils.ts b/exercises/01.e2e/04.problem.fixtures/tests/db-utils.ts index 8f5062e16..2e1e23550 100644 --- a/exercises/01.e2e/04.problem.fixtures/tests/db-utils.ts +++ b/exercises/01.e2e/04.problem.fixtures/tests/db-utils.ts @@ -67,7 +67,7 @@ export async function getNoteImages() { }), img({ altText: - 'an office full of laptops and other office equipment that look like it was abandond in a rush out of the building in an emergency years ago.', + 'an office full of laptops and other office equipment that look like it was abandoned in a rush out of the building in an emergency years ago.', filepath: './tests/fixtures/images/notes/6.png', }), img({ @@ -110,6 +110,6 @@ export async function img({ return { altText, contentType: filepath.endsWith('.png') ? 'image/png' : 'image/jpeg', - blob: await fs.promises.readFile(filepath), + blob: new Uint8Array(await fs.promises.readFile(filepath)), } } diff --git a/exercises/01.e2e/04.solution.fixtures/app/epicshop.tsx b/exercises/01.e2e/04.solution.fixtures/app/epicshop.tsx deleted file mode 100644 index 96c5597cb..000000000 --- a/exercises/01.e2e/04.solution.fixtures/app/epicshop.tsx +++ /dev/null @@ -1,9 +0,0 @@ -// Ignore this file please -import { EpicShopIFrameSync } from '@epic-web/workshop-utils/iframe-sync' -import { useNavigate } from '@remix-run/react' -import * as React from 'react' - -export function EpicShop() { - const navigate = useNavigate() - return -} diff --git a/exercises/01.e2e/04.solution.fixtures/app/root.tsx b/exercises/01.e2e/04.solution.fixtures/app/root.tsx index 3b2064a1a..fa7f41981 100644 --- a/exercises/01.e2e/04.solution.fixtures/app/root.tsx +++ b/exercises/01.e2e/04.solution.fixtures/app/root.tsx @@ -34,7 +34,6 @@ import { SearchBar } from './components/search-bar.tsx' import { Spacer } from './components/spacer.tsx' import { Button } from './components/ui/button.tsx' import { Icon } from './components/ui/icon.tsx' -import { EpicShop } from './epicshop.tsx' import fontStylestylesheetUrl from './styles/font.css' import tailwindStylesheetUrl from './styles/tailwind.css' import { getUserId } from './utils/auth.server.ts' @@ -159,7 +158,6 @@ function Document({ - diff --git a/exercises/01.e2e/04.solution.fixtures/app/routes/resources+/note-images.$imageId.tsx b/exercises/01.e2e/04.solution.fixtures/app/routes/resources+/note-images.$imageId.tsx index 417545a3e..865878a92 100644 --- a/exercises/01.e2e/04.solution.fixtures/app/routes/resources+/note-images.$imageId.tsx +++ b/exercises/01.e2e/04.solution.fixtures/app/routes/resources+/note-images.$imageId.tsx @@ -14,7 +14,7 @@ export async function loader({ params }: LoaderFunctionArgs) { return new Response(image.blob, { headers: { 'content-type': image.contentType, - 'content-length': Buffer.byteLength(image.blob).toString(), + 'content-length': image.blob.length.toString(), 'content-disposition': `inline; filename="${params.imageId}"`, 'cache-control': 'public, max-age=31536000, immutable', }, diff --git a/exercises/01.e2e/04.solution.fixtures/app/routes/resources+/user-images.$imageId.tsx b/exercises/01.e2e/04.solution.fixtures/app/routes/resources+/user-images.$imageId.tsx index c5a66b146..2de45198e 100644 --- a/exercises/01.e2e/04.solution.fixtures/app/routes/resources+/user-images.$imageId.tsx +++ b/exercises/01.e2e/04.solution.fixtures/app/routes/resources+/user-images.$imageId.tsx @@ -14,7 +14,7 @@ export async function loader({ params }: LoaderFunctionArgs) { return new Response(image.blob, { headers: { 'content-type': image.contentType, - 'content-length': Buffer.byteLength(image.blob).toString(), + 'content-length': image.blob.length.toString(), 'content-disposition': `inline; filename="${params.imageId}"`, 'cache-control': 'public, max-age=31536000, immutable', }, diff --git a/exercises/01.e2e/04.solution.fixtures/app/routes/settings+/profile.photo.tsx b/exercises/01.e2e/04.solution.fixtures/app/routes/settings+/profile.photo.tsx index f452baf9a..36e397f0b 100644 --- a/exercises/01.e2e/04.solution.fixtures/app/routes/settings+/profile.photo.tsx +++ b/exercises/01.e2e/04.solution.fixtures/app/routes/settings+/profile.photo.tsx @@ -76,7 +76,7 @@ export async function action({ request }: ActionFunctionArgs) { return { image: { contentType: data.photoFile.type, - blob: Buffer.from(await data.photoFile.arrayBuffer()), + blob: new Uint8Array(await data.photoFile.arrayBuffer()), }, } }), diff --git a/exercises/01.e2e/04.solution.fixtures/app/routes/users+/$username_+/__note-editor.tsx b/exercises/01.e2e/04.solution.fixtures/app/routes/users+/$username_+/__note-editor.tsx index 714fa7baf..7c8ee2109 100644 --- a/exercises/01.e2e/04.solution.fixtures/app/routes/users+/$username_+/__note-editor.tsx +++ b/exercises/01.e2e/04.solution.fixtures/app/routes/users+/$username_+/__note-editor.tsx @@ -96,7 +96,7 @@ export async function action({ request, params }: ActionFunctionArgs) { id: i.id, altText: i.altText, contentType: i.file.type, - blob: Buffer.from(await i.file.arrayBuffer()), + blob: new Uint8Array(await i.file.arrayBuffer()), } } else { return { id: i.id, altText: i.altText } @@ -111,7 +111,7 @@ export async function action({ request, params }: ActionFunctionArgs) { return { altText: image.altText, contentType: image.file.type, - blob: Buffer.from(await image.file.arrayBuffer()), + blob: new Uint8Array(await image.file.arrayBuffer()), } }), ), diff --git a/exercises/01.e2e/04.solution.fixtures/app/utils/misc.tsx b/exercises/01.e2e/04.solution.fixtures/app/utils/misc.tsx index 8879f6b41..a553484db 100644 --- a/exercises/01.e2e/04.solution.fixtures/app/utils/misc.tsx +++ b/exercises/01.e2e/04.solution.fixtures/app/utils/misc.tsx @@ -303,7 +303,7 @@ export async function downloadFile(url: string, retries: number = 0) { throw new Error(`Failed to fetch image with status ${response.status}`) } const contentType = response.headers.get('content-type') ?? 'image/jpg' - const blob = Buffer.from(await response.arrayBuffer()) + const blob = new Uint8Array(await response.arrayBuffer()) return { contentType, blob } } catch (e) { if (retries > MAX_RETRIES) throw e diff --git a/exercises/01.e2e/04.solution.fixtures/index.js b/exercises/01.e2e/04.solution.fixtures/index.js index 8ba83ba70..e8728a002 100644 --- a/exercises/01.e2e/04.solution.fixtures/index.js +++ b/exercises/01.e2e/04.solution.fixtures/index.js @@ -1,11 +1,8 @@ import 'dotenv/config' import 'source-map-support/register.js' -import { installGlobals } from '@remix-run/node' import chalk from 'chalk' import closeWithGrace from 'close-with-grace' -installGlobals() - if ( process.env.NODE_ENV !== 'production' || process.env.PLAYWRIGHT_TEST_BASE_URL diff --git a/exercises/01.e2e/04.solution.fixtures/package.json b/exercises/01.e2e/04.solution.fixtures/package.json index 125426c7b..6ba4b3199 100644 --- a/exercises/01.e2e/04.solution.fixtures/package.json +++ b/exercises/01.e2e/04.solution.fixtures/package.json @@ -30,9 +30,8 @@ "@conform-to/zod": "^0.9.0", "@epic-web/remember": "^1.1.0", "@epic-web/totp": "^1.1.2", - "@epic-web/workshop-utils": "^4.21.1", "@paralleldrive/cuid2": "^2.2.2", - "@prisma/client": "^5.16.2", + "@prisma/client": "^6.19.1", "@radix-ui/react-checkbox": "^1.1.1", "@radix-ui/react-dropdown-menu": "^2.1.1", "@radix-ui/react-label": "^2.1.0", @@ -59,13 +58,13 @@ "glob": "^11.0.0", "isbot": "^5.1.12", "morgan": "^1.10.0", - "prisma": "^5.16.2", + "prisma": "^6.19.1", "qrcode": "^1.5.3", "react": "^18.3.1", "react-dom": "^18.3.1", "remix-auth": "^3.7.0", "remix-auth-form": "^1.5.0", - "remix-auth-github": "^1.7.0", + "remix-auth-github": "1.7.0", "remix-utils": "^7.6.0", "sonner": "^1.5.0", "source-map-support": "^0.5.21", @@ -111,7 +110,7 @@ "execa": "^9.3.0", "fs-extra": "^11.2.0", "jsdom": "^24.1.0", - "msw": "^2.3.1", + "msw": "^2.12.4", "node-html-parser": "^6.1.13", "npm-run-all": "^4.1.5", "prettier": "^3.3.2", diff --git a/exercises/01.e2e/04.solution.fixtures/tests/db-utils.ts b/exercises/01.e2e/04.solution.fixtures/tests/db-utils.ts index 8f5062e16..2e1e23550 100644 --- a/exercises/01.e2e/04.solution.fixtures/tests/db-utils.ts +++ b/exercises/01.e2e/04.solution.fixtures/tests/db-utils.ts @@ -67,7 +67,7 @@ export async function getNoteImages() { }), img({ altText: - 'an office full of laptops and other office equipment that look like it was abandond in a rush out of the building in an emergency years ago.', + 'an office full of laptops and other office equipment that look like it was abandoned in a rush out of the building in an emergency years ago.', filepath: './tests/fixtures/images/notes/6.png', }), img({ @@ -110,6 +110,6 @@ export async function img({ return { altText, contentType: filepath.endsWith('.png') ? 'image/png' : 'image/jpeg', - blob: await fs.promises.readFile(filepath), + blob: new Uint8Array(await fs.promises.readFile(filepath)), } } diff --git a/exercises/02.e2e-mocking/01.problem.write-email/app/epicshop.tsx b/exercises/02.e2e-mocking/01.problem.write-email/app/epicshop.tsx deleted file mode 100644 index 96c5597cb..000000000 --- a/exercises/02.e2e-mocking/01.problem.write-email/app/epicshop.tsx +++ /dev/null @@ -1,9 +0,0 @@ -// Ignore this file please -import { EpicShopIFrameSync } from '@epic-web/workshop-utils/iframe-sync' -import { useNavigate } from '@remix-run/react' -import * as React from 'react' - -export function EpicShop() { - const navigate = useNavigate() - return -} diff --git a/exercises/02.e2e-mocking/01.problem.write-email/app/root.tsx b/exercises/02.e2e-mocking/01.problem.write-email/app/root.tsx index 3b2064a1a..fa7f41981 100644 --- a/exercises/02.e2e-mocking/01.problem.write-email/app/root.tsx +++ b/exercises/02.e2e-mocking/01.problem.write-email/app/root.tsx @@ -34,7 +34,6 @@ import { SearchBar } from './components/search-bar.tsx' import { Spacer } from './components/spacer.tsx' import { Button } from './components/ui/button.tsx' import { Icon } from './components/ui/icon.tsx' -import { EpicShop } from './epicshop.tsx' import fontStylestylesheetUrl from './styles/font.css' import tailwindStylesheetUrl from './styles/tailwind.css' import { getUserId } from './utils/auth.server.ts' @@ -159,7 +158,6 @@ function Document({ - diff --git a/exercises/02.e2e-mocking/01.problem.write-email/app/routes/resources+/note-images.$imageId.tsx b/exercises/02.e2e-mocking/01.problem.write-email/app/routes/resources+/note-images.$imageId.tsx index 417545a3e..865878a92 100644 --- a/exercises/02.e2e-mocking/01.problem.write-email/app/routes/resources+/note-images.$imageId.tsx +++ b/exercises/02.e2e-mocking/01.problem.write-email/app/routes/resources+/note-images.$imageId.tsx @@ -14,7 +14,7 @@ export async function loader({ params }: LoaderFunctionArgs) { return new Response(image.blob, { headers: { 'content-type': image.contentType, - 'content-length': Buffer.byteLength(image.blob).toString(), + 'content-length': image.blob.length.toString(), 'content-disposition': `inline; filename="${params.imageId}"`, 'cache-control': 'public, max-age=31536000, immutable', }, diff --git a/exercises/02.e2e-mocking/01.problem.write-email/app/routes/resources+/user-images.$imageId.tsx b/exercises/02.e2e-mocking/01.problem.write-email/app/routes/resources+/user-images.$imageId.tsx index c5a66b146..2de45198e 100644 --- a/exercises/02.e2e-mocking/01.problem.write-email/app/routes/resources+/user-images.$imageId.tsx +++ b/exercises/02.e2e-mocking/01.problem.write-email/app/routes/resources+/user-images.$imageId.tsx @@ -14,7 +14,7 @@ export async function loader({ params }: LoaderFunctionArgs) { return new Response(image.blob, { headers: { 'content-type': image.contentType, - 'content-length': Buffer.byteLength(image.blob).toString(), + 'content-length': image.blob.length.toString(), 'content-disposition': `inline; filename="${params.imageId}"`, 'cache-control': 'public, max-age=31536000, immutable', }, diff --git a/exercises/02.e2e-mocking/01.problem.write-email/app/routes/settings+/profile.photo.tsx b/exercises/02.e2e-mocking/01.problem.write-email/app/routes/settings+/profile.photo.tsx index f452baf9a..36e397f0b 100644 --- a/exercises/02.e2e-mocking/01.problem.write-email/app/routes/settings+/profile.photo.tsx +++ b/exercises/02.e2e-mocking/01.problem.write-email/app/routes/settings+/profile.photo.tsx @@ -76,7 +76,7 @@ export async function action({ request }: ActionFunctionArgs) { return { image: { contentType: data.photoFile.type, - blob: Buffer.from(await data.photoFile.arrayBuffer()), + blob: new Uint8Array(await data.photoFile.arrayBuffer()), }, } }), diff --git a/exercises/02.e2e-mocking/01.problem.write-email/app/routes/users+/$username_+/__note-editor.tsx b/exercises/02.e2e-mocking/01.problem.write-email/app/routes/users+/$username_+/__note-editor.tsx index 714fa7baf..7c8ee2109 100644 --- a/exercises/02.e2e-mocking/01.problem.write-email/app/routes/users+/$username_+/__note-editor.tsx +++ b/exercises/02.e2e-mocking/01.problem.write-email/app/routes/users+/$username_+/__note-editor.tsx @@ -96,7 +96,7 @@ export async function action({ request, params }: ActionFunctionArgs) { id: i.id, altText: i.altText, contentType: i.file.type, - blob: Buffer.from(await i.file.arrayBuffer()), + blob: new Uint8Array(await i.file.arrayBuffer()), } } else { return { id: i.id, altText: i.altText } @@ -111,7 +111,7 @@ export async function action({ request, params }: ActionFunctionArgs) { return { altText: image.altText, contentType: image.file.type, - blob: Buffer.from(await image.file.arrayBuffer()), + blob: new Uint8Array(await image.file.arrayBuffer()), } }), ), diff --git a/exercises/02.e2e-mocking/01.problem.write-email/app/utils/misc.tsx b/exercises/02.e2e-mocking/01.problem.write-email/app/utils/misc.tsx index 8879f6b41..a553484db 100644 --- a/exercises/02.e2e-mocking/01.problem.write-email/app/utils/misc.tsx +++ b/exercises/02.e2e-mocking/01.problem.write-email/app/utils/misc.tsx @@ -303,7 +303,7 @@ export async function downloadFile(url: string, retries: number = 0) { throw new Error(`Failed to fetch image with status ${response.status}`) } const contentType = response.headers.get('content-type') ?? 'image/jpg' - const blob = Buffer.from(await response.arrayBuffer()) + const blob = new Uint8Array(await response.arrayBuffer()) return { contentType, blob } } catch (e) { if (retries > MAX_RETRIES) throw e diff --git a/exercises/02.e2e-mocking/01.problem.write-email/index.js b/exercises/02.e2e-mocking/01.problem.write-email/index.js index 8ba83ba70..e8728a002 100644 --- a/exercises/02.e2e-mocking/01.problem.write-email/index.js +++ b/exercises/02.e2e-mocking/01.problem.write-email/index.js @@ -1,11 +1,8 @@ import 'dotenv/config' import 'source-map-support/register.js' -import { installGlobals } from '@remix-run/node' import chalk from 'chalk' import closeWithGrace from 'close-with-grace' -installGlobals() - if ( process.env.NODE_ENV !== 'production' || process.env.PLAYWRIGHT_TEST_BASE_URL diff --git a/exercises/02.e2e-mocking/01.problem.write-email/package.json b/exercises/02.e2e-mocking/01.problem.write-email/package.json index ddcd7dfe3..a6ceca021 100644 --- a/exercises/02.e2e-mocking/01.problem.write-email/package.json +++ b/exercises/02.e2e-mocking/01.problem.write-email/package.json @@ -30,9 +30,8 @@ "@conform-to/zod": "^0.9.0", "@epic-web/remember": "^1.1.0", "@epic-web/totp": "^1.1.2", - "@epic-web/workshop-utils": "^4.21.1", "@paralleldrive/cuid2": "^2.2.2", - "@prisma/client": "^5.16.2", + "@prisma/client": "^6.19.1", "@radix-ui/react-checkbox": "^1.1.1", "@radix-ui/react-dropdown-menu": "^2.1.1", "@radix-ui/react-label": "^2.1.0", @@ -59,13 +58,13 @@ "glob": "^11.0.0", "isbot": "^5.1.12", "morgan": "^1.10.0", - "prisma": "^5.16.2", + "prisma": "^6.19.1", "qrcode": "^1.5.3", "react": "^18.3.1", "react-dom": "^18.3.1", "remix-auth": "^3.7.0", "remix-auth-form": "^1.5.0", - "remix-auth-github": "^1.7.0", + "remix-auth-github": "1.7.0", "remix-utils": "^7.6.0", "sonner": "^1.5.0", "source-map-support": "^0.5.21", @@ -111,7 +110,7 @@ "execa": "^9.3.0", "fs-extra": "^11.2.0", "jsdom": "^24.1.0", - "msw": "^2.3.1", + "msw": "^2.12.4", "node-html-parser": "^6.1.13", "npm-run-all": "^4.1.5", "prettier": "^3.3.2", diff --git a/exercises/02.e2e-mocking/01.problem.write-email/tests/db-utils.ts b/exercises/02.e2e-mocking/01.problem.write-email/tests/db-utils.ts index 8f5062e16..2e1e23550 100644 --- a/exercises/02.e2e-mocking/01.problem.write-email/tests/db-utils.ts +++ b/exercises/02.e2e-mocking/01.problem.write-email/tests/db-utils.ts @@ -67,7 +67,7 @@ export async function getNoteImages() { }), img({ altText: - 'an office full of laptops and other office equipment that look like it was abandond in a rush out of the building in an emergency years ago.', + 'an office full of laptops and other office equipment that look like it was abandoned in a rush out of the building in an emergency years ago.', filepath: './tests/fixtures/images/notes/6.png', }), img({ @@ -110,6 +110,6 @@ export async function img({ return { altText, contentType: filepath.endsWith('.png') ? 'image/png' : 'image/jpeg', - blob: await fs.promises.readFile(filepath), + blob: new Uint8Array(await fs.promises.readFile(filepath)), } } diff --git a/exercises/02.e2e-mocking/01.problem.write-email/tests/e2e/onboarding.test.ts b/exercises/02.e2e-mocking/01.problem.write-email/tests/e2e/onboarding.test.ts index e507c65de..93970350a 100644 --- a/exercises/02.e2e-mocking/01.problem.write-email/tests/e2e/onboarding.test.ts +++ b/exercises/02.e2e-mocking/01.problem.write-email/tests/e2e/onboarding.test.ts @@ -48,9 +48,7 @@ test('onboarding with link', async ({ page, getOnboardingData }) => { await page.getByRole('textbox', { name: /email/i }).fill(onboardingData.email) await page.getByRole('button', { name: /submit/i }).click() - await expect( - page.getByRole('button', { name: /submit/i, disabled: true }), - ).toBeVisible() + await expect(page.getByText(/check your email/i)).toBeVisible() // we'll fix this soon. diff --git a/exercises/02.e2e-mocking/01.solution.write-email/app/epicshop.tsx b/exercises/02.e2e-mocking/01.solution.write-email/app/epicshop.tsx deleted file mode 100644 index 96c5597cb..000000000 --- a/exercises/02.e2e-mocking/01.solution.write-email/app/epicshop.tsx +++ /dev/null @@ -1,9 +0,0 @@ -// Ignore this file please -import { EpicShopIFrameSync } from '@epic-web/workshop-utils/iframe-sync' -import { useNavigate } from '@remix-run/react' -import * as React from 'react' - -export function EpicShop() { - const navigate = useNavigate() - return -} diff --git a/exercises/02.e2e-mocking/01.solution.write-email/app/root.tsx b/exercises/02.e2e-mocking/01.solution.write-email/app/root.tsx index 3b2064a1a..fa7f41981 100644 --- a/exercises/02.e2e-mocking/01.solution.write-email/app/root.tsx +++ b/exercises/02.e2e-mocking/01.solution.write-email/app/root.tsx @@ -34,7 +34,6 @@ import { SearchBar } from './components/search-bar.tsx' import { Spacer } from './components/spacer.tsx' import { Button } from './components/ui/button.tsx' import { Icon } from './components/ui/icon.tsx' -import { EpicShop } from './epicshop.tsx' import fontStylestylesheetUrl from './styles/font.css' import tailwindStylesheetUrl from './styles/tailwind.css' import { getUserId } from './utils/auth.server.ts' @@ -159,7 +158,6 @@ function Document({ - diff --git a/exercises/02.e2e-mocking/01.solution.write-email/app/routes/resources+/note-images.$imageId.tsx b/exercises/02.e2e-mocking/01.solution.write-email/app/routes/resources+/note-images.$imageId.tsx index 417545a3e..865878a92 100644 --- a/exercises/02.e2e-mocking/01.solution.write-email/app/routes/resources+/note-images.$imageId.tsx +++ b/exercises/02.e2e-mocking/01.solution.write-email/app/routes/resources+/note-images.$imageId.tsx @@ -14,7 +14,7 @@ export async function loader({ params }: LoaderFunctionArgs) { return new Response(image.blob, { headers: { 'content-type': image.contentType, - 'content-length': Buffer.byteLength(image.blob).toString(), + 'content-length': image.blob.length.toString(), 'content-disposition': `inline; filename="${params.imageId}"`, 'cache-control': 'public, max-age=31536000, immutable', }, diff --git a/exercises/02.e2e-mocking/01.solution.write-email/app/routes/resources+/user-images.$imageId.tsx b/exercises/02.e2e-mocking/01.solution.write-email/app/routes/resources+/user-images.$imageId.tsx index c5a66b146..2de45198e 100644 --- a/exercises/02.e2e-mocking/01.solution.write-email/app/routes/resources+/user-images.$imageId.tsx +++ b/exercises/02.e2e-mocking/01.solution.write-email/app/routes/resources+/user-images.$imageId.tsx @@ -14,7 +14,7 @@ export async function loader({ params }: LoaderFunctionArgs) { return new Response(image.blob, { headers: { 'content-type': image.contentType, - 'content-length': Buffer.byteLength(image.blob).toString(), + 'content-length': image.blob.length.toString(), 'content-disposition': `inline; filename="${params.imageId}"`, 'cache-control': 'public, max-age=31536000, immutable', }, diff --git a/exercises/02.e2e-mocking/01.solution.write-email/app/routes/settings+/profile.photo.tsx b/exercises/02.e2e-mocking/01.solution.write-email/app/routes/settings+/profile.photo.tsx index f452baf9a..36e397f0b 100644 --- a/exercises/02.e2e-mocking/01.solution.write-email/app/routes/settings+/profile.photo.tsx +++ b/exercises/02.e2e-mocking/01.solution.write-email/app/routes/settings+/profile.photo.tsx @@ -76,7 +76,7 @@ export async function action({ request }: ActionFunctionArgs) { return { image: { contentType: data.photoFile.type, - blob: Buffer.from(await data.photoFile.arrayBuffer()), + blob: new Uint8Array(await data.photoFile.arrayBuffer()), }, } }), diff --git a/exercises/02.e2e-mocking/01.solution.write-email/app/routes/users+/$username_+/__note-editor.tsx b/exercises/02.e2e-mocking/01.solution.write-email/app/routes/users+/$username_+/__note-editor.tsx index 714fa7baf..7c8ee2109 100644 --- a/exercises/02.e2e-mocking/01.solution.write-email/app/routes/users+/$username_+/__note-editor.tsx +++ b/exercises/02.e2e-mocking/01.solution.write-email/app/routes/users+/$username_+/__note-editor.tsx @@ -96,7 +96,7 @@ export async function action({ request, params }: ActionFunctionArgs) { id: i.id, altText: i.altText, contentType: i.file.type, - blob: Buffer.from(await i.file.arrayBuffer()), + blob: new Uint8Array(await i.file.arrayBuffer()), } } else { return { id: i.id, altText: i.altText } @@ -111,7 +111,7 @@ export async function action({ request, params }: ActionFunctionArgs) { return { altText: image.altText, contentType: image.file.type, - blob: Buffer.from(await image.file.arrayBuffer()), + blob: new Uint8Array(await image.file.arrayBuffer()), } }), ), diff --git a/exercises/02.e2e-mocking/01.solution.write-email/app/utils/misc.tsx b/exercises/02.e2e-mocking/01.solution.write-email/app/utils/misc.tsx index 8879f6b41..a553484db 100644 --- a/exercises/02.e2e-mocking/01.solution.write-email/app/utils/misc.tsx +++ b/exercises/02.e2e-mocking/01.solution.write-email/app/utils/misc.tsx @@ -303,7 +303,7 @@ export async function downloadFile(url: string, retries: number = 0) { throw new Error(`Failed to fetch image with status ${response.status}`) } const contentType = response.headers.get('content-type') ?? 'image/jpg' - const blob = Buffer.from(await response.arrayBuffer()) + const blob = new Uint8Array(await response.arrayBuffer()) return { contentType, blob } } catch (e) { if (retries > MAX_RETRIES) throw e diff --git a/exercises/02.e2e-mocking/01.solution.write-email/index.js b/exercises/02.e2e-mocking/01.solution.write-email/index.js index 8ba83ba70..e8728a002 100644 --- a/exercises/02.e2e-mocking/01.solution.write-email/index.js +++ b/exercises/02.e2e-mocking/01.solution.write-email/index.js @@ -1,11 +1,8 @@ import 'dotenv/config' import 'source-map-support/register.js' -import { installGlobals } from '@remix-run/node' import chalk from 'chalk' import closeWithGrace from 'close-with-grace' -installGlobals() - if ( process.env.NODE_ENV !== 'production' || process.env.PLAYWRIGHT_TEST_BASE_URL diff --git a/exercises/02.e2e-mocking/01.solution.write-email/package.json b/exercises/02.e2e-mocking/01.solution.write-email/package.json index 08364f8ed..311d4550a 100644 --- a/exercises/02.e2e-mocking/01.solution.write-email/package.json +++ b/exercises/02.e2e-mocking/01.solution.write-email/package.json @@ -30,9 +30,8 @@ "@conform-to/zod": "^0.9.0", "@epic-web/remember": "^1.1.0", "@epic-web/totp": "^1.1.2", - "@epic-web/workshop-utils": "^4.21.1", "@paralleldrive/cuid2": "^2.2.2", - "@prisma/client": "^5.16.2", + "@prisma/client": "^6.19.1", "@radix-ui/react-checkbox": "^1.1.1", "@radix-ui/react-dropdown-menu": "^2.1.1", "@radix-ui/react-label": "^2.1.0", @@ -59,13 +58,13 @@ "glob": "^11.0.0", "isbot": "^5.1.12", "morgan": "^1.10.0", - "prisma": "^5.16.2", + "prisma": "^6.19.1", "qrcode": "^1.5.3", "react": "^18.3.1", "react-dom": "^18.3.1", "remix-auth": "^3.7.0", "remix-auth-form": "^1.5.0", - "remix-auth-github": "^1.7.0", + "remix-auth-github": "1.7.0", "remix-utils": "^7.6.0", "sonner": "^1.5.0", "source-map-support": "^0.5.21", @@ -111,7 +110,7 @@ "execa": "^9.3.0", "fs-extra": "^11.2.0", "jsdom": "^24.1.0", - "msw": "^2.3.1", + "msw": "^2.12.4", "node-html-parser": "^6.1.13", "npm-run-all": "^4.1.5", "prettier": "^3.3.2", diff --git a/exercises/02.e2e-mocking/01.solution.write-email/tests/db-utils.ts b/exercises/02.e2e-mocking/01.solution.write-email/tests/db-utils.ts index 8f5062e16..2e1e23550 100644 --- a/exercises/02.e2e-mocking/01.solution.write-email/tests/db-utils.ts +++ b/exercises/02.e2e-mocking/01.solution.write-email/tests/db-utils.ts @@ -67,7 +67,7 @@ export async function getNoteImages() { }), img({ altText: - 'an office full of laptops and other office equipment that look like it was abandond in a rush out of the building in an emergency years ago.', + 'an office full of laptops and other office equipment that look like it was abandoned in a rush out of the building in an emergency years ago.', filepath: './tests/fixtures/images/notes/6.png', }), img({ @@ -110,6 +110,6 @@ export async function img({ return { altText, contentType: filepath.endsWith('.png') ? 'image/png' : 'image/jpeg', - blob: await fs.promises.readFile(filepath), + blob: new Uint8Array(await fs.promises.readFile(filepath)), } } diff --git a/exercises/02.e2e-mocking/01.solution.write-email/tests/e2e/onboarding.test.ts b/exercises/02.e2e-mocking/01.solution.write-email/tests/e2e/onboarding.test.ts index e507c65de..93970350a 100644 --- a/exercises/02.e2e-mocking/01.solution.write-email/tests/e2e/onboarding.test.ts +++ b/exercises/02.e2e-mocking/01.solution.write-email/tests/e2e/onboarding.test.ts @@ -48,9 +48,7 @@ test('onboarding with link', async ({ page, getOnboardingData }) => { await page.getByRole('textbox', { name: /email/i }).fill(onboardingData.email) await page.getByRole('button', { name: /submit/i }).click() - await expect( - page.getByRole('button', { name: /submit/i, disabled: true }), - ).toBeVisible() + await expect(page.getByText(/check your email/i)).toBeVisible() // we'll fix this soon. diff --git a/exercises/02.e2e-mocking/02.problem.read-email/app/epicshop.tsx b/exercises/02.e2e-mocking/02.problem.read-email/app/epicshop.tsx deleted file mode 100644 index 96c5597cb..000000000 --- a/exercises/02.e2e-mocking/02.problem.read-email/app/epicshop.tsx +++ /dev/null @@ -1,9 +0,0 @@ -// Ignore this file please -import { EpicShopIFrameSync } from '@epic-web/workshop-utils/iframe-sync' -import { useNavigate } from '@remix-run/react' -import * as React from 'react' - -export function EpicShop() { - const navigate = useNavigate() - return -} diff --git a/exercises/02.e2e-mocking/02.problem.read-email/app/root.tsx b/exercises/02.e2e-mocking/02.problem.read-email/app/root.tsx index 3b2064a1a..fa7f41981 100644 --- a/exercises/02.e2e-mocking/02.problem.read-email/app/root.tsx +++ b/exercises/02.e2e-mocking/02.problem.read-email/app/root.tsx @@ -34,7 +34,6 @@ import { SearchBar } from './components/search-bar.tsx' import { Spacer } from './components/spacer.tsx' import { Button } from './components/ui/button.tsx' import { Icon } from './components/ui/icon.tsx' -import { EpicShop } from './epicshop.tsx' import fontStylestylesheetUrl from './styles/font.css' import tailwindStylesheetUrl from './styles/tailwind.css' import { getUserId } from './utils/auth.server.ts' @@ -159,7 +158,6 @@ function Document({ - diff --git a/exercises/02.e2e-mocking/02.problem.read-email/app/routes/resources+/note-images.$imageId.tsx b/exercises/02.e2e-mocking/02.problem.read-email/app/routes/resources+/note-images.$imageId.tsx index 417545a3e..865878a92 100644 --- a/exercises/02.e2e-mocking/02.problem.read-email/app/routes/resources+/note-images.$imageId.tsx +++ b/exercises/02.e2e-mocking/02.problem.read-email/app/routes/resources+/note-images.$imageId.tsx @@ -14,7 +14,7 @@ export async function loader({ params }: LoaderFunctionArgs) { return new Response(image.blob, { headers: { 'content-type': image.contentType, - 'content-length': Buffer.byteLength(image.blob).toString(), + 'content-length': image.blob.length.toString(), 'content-disposition': `inline; filename="${params.imageId}"`, 'cache-control': 'public, max-age=31536000, immutable', }, diff --git a/exercises/02.e2e-mocking/02.problem.read-email/app/routes/resources+/user-images.$imageId.tsx b/exercises/02.e2e-mocking/02.problem.read-email/app/routes/resources+/user-images.$imageId.tsx index c5a66b146..2de45198e 100644 --- a/exercises/02.e2e-mocking/02.problem.read-email/app/routes/resources+/user-images.$imageId.tsx +++ b/exercises/02.e2e-mocking/02.problem.read-email/app/routes/resources+/user-images.$imageId.tsx @@ -14,7 +14,7 @@ export async function loader({ params }: LoaderFunctionArgs) { return new Response(image.blob, { headers: { 'content-type': image.contentType, - 'content-length': Buffer.byteLength(image.blob).toString(), + 'content-length': image.blob.length.toString(), 'content-disposition': `inline; filename="${params.imageId}"`, 'cache-control': 'public, max-age=31536000, immutable', }, diff --git a/exercises/02.e2e-mocking/02.problem.read-email/app/routes/settings+/profile.photo.tsx b/exercises/02.e2e-mocking/02.problem.read-email/app/routes/settings+/profile.photo.tsx index f452baf9a..36e397f0b 100644 --- a/exercises/02.e2e-mocking/02.problem.read-email/app/routes/settings+/profile.photo.tsx +++ b/exercises/02.e2e-mocking/02.problem.read-email/app/routes/settings+/profile.photo.tsx @@ -76,7 +76,7 @@ export async function action({ request }: ActionFunctionArgs) { return { image: { contentType: data.photoFile.type, - blob: Buffer.from(await data.photoFile.arrayBuffer()), + blob: new Uint8Array(await data.photoFile.arrayBuffer()), }, } }), diff --git a/exercises/02.e2e-mocking/02.problem.read-email/app/routes/users+/$username_+/__note-editor.tsx b/exercises/02.e2e-mocking/02.problem.read-email/app/routes/users+/$username_+/__note-editor.tsx index 714fa7baf..7c8ee2109 100644 --- a/exercises/02.e2e-mocking/02.problem.read-email/app/routes/users+/$username_+/__note-editor.tsx +++ b/exercises/02.e2e-mocking/02.problem.read-email/app/routes/users+/$username_+/__note-editor.tsx @@ -96,7 +96,7 @@ export async function action({ request, params }: ActionFunctionArgs) { id: i.id, altText: i.altText, contentType: i.file.type, - blob: Buffer.from(await i.file.arrayBuffer()), + blob: new Uint8Array(await i.file.arrayBuffer()), } } else { return { id: i.id, altText: i.altText } @@ -111,7 +111,7 @@ export async function action({ request, params }: ActionFunctionArgs) { return { altText: image.altText, contentType: image.file.type, - blob: Buffer.from(await image.file.arrayBuffer()), + blob: new Uint8Array(await image.file.arrayBuffer()), } }), ), diff --git a/exercises/02.e2e-mocking/02.problem.read-email/app/utils/misc.tsx b/exercises/02.e2e-mocking/02.problem.read-email/app/utils/misc.tsx index 8879f6b41..a553484db 100644 --- a/exercises/02.e2e-mocking/02.problem.read-email/app/utils/misc.tsx +++ b/exercises/02.e2e-mocking/02.problem.read-email/app/utils/misc.tsx @@ -303,7 +303,7 @@ export async function downloadFile(url: string, retries: number = 0) { throw new Error(`Failed to fetch image with status ${response.status}`) } const contentType = response.headers.get('content-type') ?? 'image/jpg' - const blob = Buffer.from(await response.arrayBuffer()) + const blob = new Uint8Array(await response.arrayBuffer()) return { contentType, blob } } catch (e) { if (retries > MAX_RETRIES) throw e diff --git a/exercises/02.e2e-mocking/02.problem.read-email/index.js b/exercises/02.e2e-mocking/02.problem.read-email/index.js index 8ba83ba70..e8728a002 100644 --- a/exercises/02.e2e-mocking/02.problem.read-email/index.js +++ b/exercises/02.e2e-mocking/02.problem.read-email/index.js @@ -1,11 +1,8 @@ import 'dotenv/config' import 'source-map-support/register.js' -import { installGlobals } from '@remix-run/node' import chalk from 'chalk' import closeWithGrace from 'close-with-grace' -installGlobals() - if ( process.env.NODE_ENV !== 'production' || process.env.PLAYWRIGHT_TEST_BASE_URL diff --git a/exercises/02.e2e-mocking/02.problem.read-email/package.json b/exercises/02.e2e-mocking/02.problem.read-email/package.json index c2488c5db..68b61feca 100644 --- a/exercises/02.e2e-mocking/02.problem.read-email/package.json +++ b/exercises/02.e2e-mocking/02.problem.read-email/package.json @@ -30,9 +30,8 @@ "@conform-to/zod": "^0.9.0", "@epic-web/remember": "^1.1.0", "@epic-web/totp": "^1.1.2", - "@epic-web/workshop-utils": "^4.21.1", "@paralleldrive/cuid2": "^2.2.2", - "@prisma/client": "^5.16.2", + "@prisma/client": "^6.19.1", "@radix-ui/react-checkbox": "^1.1.1", "@radix-ui/react-dropdown-menu": "^2.1.1", "@radix-ui/react-label": "^2.1.0", @@ -59,13 +58,13 @@ "glob": "^11.0.0", "isbot": "^5.1.12", "morgan": "^1.10.0", - "prisma": "^5.16.2", + "prisma": "^6.19.1", "qrcode": "^1.5.3", "react": "^18.3.1", "react-dom": "^18.3.1", "remix-auth": "^3.7.0", "remix-auth-form": "^1.5.0", - "remix-auth-github": "^1.7.0", + "remix-auth-github": "1.7.0", "remix-utils": "^7.6.0", "sonner": "^1.5.0", "source-map-support": "^0.5.21", @@ -111,7 +110,7 @@ "execa": "^9.3.0", "fs-extra": "^11.2.0", "jsdom": "^24.1.0", - "msw": "^2.3.1", + "msw": "^2.12.4", "node-html-parser": "^6.1.13", "npm-run-all": "^4.1.5", "prettier": "^3.3.2", diff --git a/exercises/02.e2e-mocking/02.problem.read-email/tests/db-utils.ts b/exercises/02.e2e-mocking/02.problem.read-email/tests/db-utils.ts index 8f5062e16..2e1e23550 100644 --- a/exercises/02.e2e-mocking/02.problem.read-email/tests/db-utils.ts +++ b/exercises/02.e2e-mocking/02.problem.read-email/tests/db-utils.ts @@ -67,7 +67,7 @@ export async function getNoteImages() { }), img({ altText: - 'an office full of laptops and other office equipment that look like it was abandond in a rush out of the building in an emergency years ago.', + 'an office full of laptops and other office equipment that look like it was abandoned in a rush out of the building in an emergency years ago.', filepath: './tests/fixtures/images/notes/6.png', }), img({ @@ -110,6 +110,6 @@ export async function img({ return { altText, contentType: filepath.endsWith('.png') ? 'image/png' : 'image/jpeg', - blob: await fs.promises.readFile(filepath), + blob: new Uint8Array(await fs.promises.readFile(filepath)), } } diff --git a/exercises/02.e2e-mocking/02.problem.read-email/tests/e2e/onboarding.test.ts b/exercises/02.e2e-mocking/02.problem.read-email/tests/e2e/onboarding.test.ts index 109395b8e..3ea426a6b 100644 --- a/exercises/02.e2e-mocking/02.problem.read-email/tests/e2e/onboarding.test.ts +++ b/exercises/02.e2e-mocking/02.problem.read-email/tests/e2e/onboarding.test.ts @@ -48,9 +48,7 @@ test('onboarding with link', async ({ page, getOnboardingData }) => { await page.getByRole('textbox', { name: /email/i }).fill(onboardingData.email) await page.getByRole('button', { name: /submit/i }).click() - await expect( - page.getByRole('button', { name: /submit/i, disabled: true }), - ).toBeVisible() + await expect(page.getByText(/check your email/i)).toBeVisible() const email = (await waitFor(() => { diff --git a/exercises/02.e2e-mocking/02.solution.read-email/app/epicshop.tsx b/exercises/02.e2e-mocking/02.solution.read-email/app/epicshop.tsx deleted file mode 100644 index 96c5597cb..000000000 --- a/exercises/02.e2e-mocking/02.solution.read-email/app/epicshop.tsx +++ /dev/null @@ -1,9 +0,0 @@ -// Ignore this file please -import { EpicShopIFrameSync } from '@epic-web/workshop-utils/iframe-sync' -import { useNavigate } from '@remix-run/react' -import * as React from 'react' - -export function EpicShop() { - const navigate = useNavigate() - return -} diff --git a/exercises/02.e2e-mocking/02.solution.read-email/app/root.tsx b/exercises/02.e2e-mocking/02.solution.read-email/app/root.tsx index 3b2064a1a..fa7f41981 100644 --- a/exercises/02.e2e-mocking/02.solution.read-email/app/root.tsx +++ b/exercises/02.e2e-mocking/02.solution.read-email/app/root.tsx @@ -34,7 +34,6 @@ import { SearchBar } from './components/search-bar.tsx' import { Spacer } from './components/spacer.tsx' import { Button } from './components/ui/button.tsx' import { Icon } from './components/ui/icon.tsx' -import { EpicShop } from './epicshop.tsx' import fontStylestylesheetUrl from './styles/font.css' import tailwindStylesheetUrl from './styles/tailwind.css' import { getUserId } from './utils/auth.server.ts' @@ -159,7 +158,6 @@ function Document({ - diff --git a/exercises/02.e2e-mocking/02.solution.read-email/app/routes/resources+/note-images.$imageId.tsx b/exercises/02.e2e-mocking/02.solution.read-email/app/routes/resources+/note-images.$imageId.tsx index 417545a3e..865878a92 100644 --- a/exercises/02.e2e-mocking/02.solution.read-email/app/routes/resources+/note-images.$imageId.tsx +++ b/exercises/02.e2e-mocking/02.solution.read-email/app/routes/resources+/note-images.$imageId.tsx @@ -14,7 +14,7 @@ export async function loader({ params }: LoaderFunctionArgs) { return new Response(image.blob, { headers: { 'content-type': image.contentType, - 'content-length': Buffer.byteLength(image.blob).toString(), + 'content-length': image.blob.length.toString(), 'content-disposition': `inline; filename="${params.imageId}"`, 'cache-control': 'public, max-age=31536000, immutable', }, diff --git a/exercises/02.e2e-mocking/02.solution.read-email/app/routes/resources+/user-images.$imageId.tsx b/exercises/02.e2e-mocking/02.solution.read-email/app/routes/resources+/user-images.$imageId.tsx index c5a66b146..2de45198e 100644 --- a/exercises/02.e2e-mocking/02.solution.read-email/app/routes/resources+/user-images.$imageId.tsx +++ b/exercises/02.e2e-mocking/02.solution.read-email/app/routes/resources+/user-images.$imageId.tsx @@ -14,7 +14,7 @@ export async function loader({ params }: LoaderFunctionArgs) { return new Response(image.blob, { headers: { 'content-type': image.contentType, - 'content-length': Buffer.byteLength(image.blob).toString(), + 'content-length': image.blob.length.toString(), 'content-disposition': `inline; filename="${params.imageId}"`, 'cache-control': 'public, max-age=31536000, immutable', }, diff --git a/exercises/02.e2e-mocking/02.solution.read-email/app/routes/settings+/profile.photo.tsx b/exercises/02.e2e-mocking/02.solution.read-email/app/routes/settings+/profile.photo.tsx index f452baf9a..36e397f0b 100644 --- a/exercises/02.e2e-mocking/02.solution.read-email/app/routes/settings+/profile.photo.tsx +++ b/exercises/02.e2e-mocking/02.solution.read-email/app/routes/settings+/profile.photo.tsx @@ -76,7 +76,7 @@ export async function action({ request }: ActionFunctionArgs) { return { image: { contentType: data.photoFile.type, - blob: Buffer.from(await data.photoFile.arrayBuffer()), + blob: new Uint8Array(await data.photoFile.arrayBuffer()), }, } }), diff --git a/exercises/02.e2e-mocking/02.solution.read-email/app/routes/users+/$username_+/__note-editor.tsx b/exercises/02.e2e-mocking/02.solution.read-email/app/routes/users+/$username_+/__note-editor.tsx index 714fa7baf..7c8ee2109 100644 --- a/exercises/02.e2e-mocking/02.solution.read-email/app/routes/users+/$username_+/__note-editor.tsx +++ b/exercises/02.e2e-mocking/02.solution.read-email/app/routes/users+/$username_+/__note-editor.tsx @@ -96,7 +96,7 @@ export async function action({ request, params }: ActionFunctionArgs) { id: i.id, altText: i.altText, contentType: i.file.type, - blob: Buffer.from(await i.file.arrayBuffer()), + blob: new Uint8Array(await i.file.arrayBuffer()), } } else { return { id: i.id, altText: i.altText } @@ -111,7 +111,7 @@ export async function action({ request, params }: ActionFunctionArgs) { return { altText: image.altText, contentType: image.file.type, - blob: Buffer.from(await image.file.arrayBuffer()), + blob: new Uint8Array(await image.file.arrayBuffer()), } }), ), diff --git a/exercises/02.e2e-mocking/02.solution.read-email/app/utils/misc.tsx b/exercises/02.e2e-mocking/02.solution.read-email/app/utils/misc.tsx index 8879f6b41..a553484db 100644 --- a/exercises/02.e2e-mocking/02.solution.read-email/app/utils/misc.tsx +++ b/exercises/02.e2e-mocking/02.solution.read-email/app/utils/misc.tsx @@ -303,7 +303,7 @@ export async function downloadFile(url: string, retries: number = 0) { throw new Error(`Failed to fetch image with status ${response.status}`) } const contentType = response.headers.get('content-type') ?? 'image/jpg' - const blob = Buffer.from(await response.arrayBuffer()) + const blob = new Uint8Array(await response.arrayBuffer()) return { contentType, blob } } catch (e) { if (retries > MAX_RETRIES) throw e diff --git a/exercises/02.e2e-mocking/02.solution.read-email/index.js b/exercises/02.e2e-mocking/02.solution.read-email/index.js index 8ba83ba70..e8728a002 100644 --- a/exercises/02.e2e-mocking/02.solution.read-email/index.js +++ b/exercises/02.e2e-mocking/02.solution.read-email/index.js @@ -1,11 +1,8 @@ import 'dotenv/config' import 'source-map-support/register.js' -import { installGlobals } from '@remix-run/node' import chalk from 'chalk' import closeWithGrace from 'close-with-grace' -installGlobals() - if ( process.env.NODE_ENV !== 'production' || process.env.PLAYWRIGHT_TEST_BASE_URL diff --git a/exercises/02.e2e-mocking/02.solution.read-email/package.json b/exercises/02.e2e-mocking/02.solution.read-email/package.json index 7cf782cd5..232409d8e 100644 --- a/exercises/02.e2e-mocking/02.solution.read-email/package.json +++ b/exercises/02.e2e-mocking/02.solution.read-email/package.json @@ -30,9 +30,8 @@ "@conform-to/zod": "^0.9.0", "@epic-web/remember": "^1.1.0", "@epic-web/totp": "^1.1.2", - "@epic-web/workshop-utils": "^4.21.1", "@paralleldrive/cuid2": "^2.2.2", - "@prisma/client": "^5.16.2", + "@prisma/client": "^6.19.1", "@radix-ui/react-checkbox": "^1.1.1", "@radix-ui/react-dropdown-menu": "^2.1.1", "@radix-ui/react-label": "^2.1.0", @@ -59,13 +58,13 @@ "glob": "^11.0.0", "isbot": "^5.1.12", "morgan": "^1.10.0", - "prisma": "^5.16.2", + "prisma": "^6.19.1", "qrcode": "^1.5.3", "react": "^18.3.1", "react-dom": "^18.3.1", "remix-auth": "^3.7.0", "remix-auth-form": "^1.5.0", - "remix-auth-github": "^1.7.0", + "remix-auth-github": "1.7.0", "remix-utils": "^7.6.0", "sonner": "^1.5.0", "source-map-support": "^0.5.21", @@ -111,7 +110,7 @@ "execa": "^9.3.0", "fs-extra": "^11.2.0", "jsdom": "^24.1.0", - "msw": "^2.3.1", + "msw": "^2.12.4", "node-html-parser": "^6.1.13", "npm-run-all": "^4.1.5", "prettier": "^3.3.2", diff --git a/exercises/02.e2e-mocking/02.solution.read-email/tests/db-utils.ts b/exercises/02.e2e-mocking/02.solution.read-email/tests/db-utils.ts index 8f5062e16..2e1e23550 100644 --- a/exercises/02.e2e-mocking/02.solution.read-email/tests/db-utils.ts +++ b/exercises/02.e2e-mocking/02.solution.read-email/tests/db-utils.ts @@ -67,7 +67,7 @@ export async function getNoteImages() { }), img({ altText: - 'an office full of laptops and other office equipment that look like it was abandond in a rush out of the building in an emergency years ago.', + 'an office full of laptops and other office equipment that look like it was abandoned in a rush out of the building in an emergency years ago.', filepath: './tests/fixtures/images/notes/6.png', }), img({ @@ -110,6 +110,6 @@ export async function img({ return { altText, contentType: filepath.endsWith('.png') ? 'image/png' : 'image/jpeg', - blob: await fs.promises.readFile(filepath), + blob: new Uint8Array(await fs.promises.readFile(filepath)), } } diff --git a/exercises/02.e2e-mocking/02.solution.read-email/tests/e2e/onboarding.test.ts b/exercises/02.e2e-mocking/02.solution.read-email/tests/e2e/onboarding.test.ts index f93b3a467..9f75c07f2 100644 --- a/exercises/02.e2e-mocking/02.solution.read-email/tests/e2e/onboarding.test.ts +++ b/exercises/02.e2e-mocking/02.solution.read-email/tests/e2e/onboarding.test.ts @@ -49,9 +49,7 @@ test('onboarding with link', async ({ page, getOnboardingData }) => { await page.getByRole('textbox', { name: /email/i }).fill(onboardingData.email) await page.getByRole('button', { name: /submit/i }).click() - await expect( - page.getByRole('button', { name: /submit/i, disabled: true }), - ).toBeVisible() + await expect(page.getByText(/check your email/i)).toBeVisible() const email = await waitFor(() => requireEmail(onboardingData.email)) diff --git a/exercises/03.authenticated-e2e/01.problem.login/app/epicshop.tsx b/exercises/03.authenticated-e2e/01.problem.login/app/epicshop.tsx deleted file mode 100644 index 96c5597cb..000000000 --- a/exercises/03.authenticated-e2e/01.problem.login/app/epicshop.tsx +++ /dev/null @@ -1,9 +0,0 @@ -// Ignore this file please -import { EpicShopIFrameSync } from '@epic-web/workshop-utils/iframe-sync' -import { useNavigate } from '@remix-run/react' -import * as React from 'react' - -export function EpicShop() { - const navigate = useNavigate() - return -} diff --git a/exercises/03.authenticated-e2e/01.problem.login/app/root.tsx b/exercises/03.authenticated-e2e/01.problem.login/app/root.tsx index 3b2064a1a..fa7f41981 100644 --- a/exercises/03.authenticated-e2e/01.problem.login/app/root.tsx +++ b/exercises/03.authenticated-e2e/01.problem.login/app/root.tsx @@ -34,7 +34,6 @@ import { SearchBar } from './components/search-bar.tsx' import { Spacer } from './components/spacer.tsx' import { Button } from './components/ui/button.tsx' import { Icon } from './components/ui/icon.tsx' -import { EpicShop } from './epicshop.tsx' import fontStylestylesheetUrl from './styles/font.css' import tailwindStylesheetUrl from './styles/tailwind.css' import { getUserId } from './utils/auth.server.ts' @@ -159,7 +158,6 @@ function Document({ - diff --git a/exercises/03.authenticated-e2e/01.problem.login/app/routes/resources+/note-images.$imageId.tsx b/exercises/03.authenticated-e2e/01.problem.login/app/routes/resources+/note-images.$imageId.tsx index 417545a3e..865878a92 100644 --- a/exercises/03.authenticated-e2e/01.problem.login/app/routes/resources+/note-images.$imageId.tsx +++ b/exercises/03.authenticated-e2e/01.problem.login/app/routes/resources+/note-images.$imageId.tsx @@ -14,7 +14,7 @@ export async function loader({ params }: LoaderFunctionArgs) { return new Response(image.blob, { headers: { 'content-type': image.contentType, - 'content-length': Buffer.byteLength(image.blob).toString(), + 'content-length': image.blob.length.toString(), 'content-disposition': `inline; filename="${params.imageId}"`, 'cache-control': 'public, max-age=31536000, immutable', }, diff --git a/exercises/03.authenticated-e2e/01.problem.login/app/routes/resources+/user-images.$imageId.tsx b/exercises/03.authenticated-e2e/01.problem.login/app/routes/resources+/user-images.$imageId.tsx index c5a66b146..2de45198e 100644 --- a/exercises/03.authenticated-e2e/01.problem.login/app/routes/resources+/user-images.$imageId.tsx +++ b/exercises/03.authenticated-e2e/01.problem.login/app/routes/resources+/user-images.$imageId.tsx @@ -14,7 +14,7 @@ export async function loader({ params }: LoaderFunctionArgs) { return new Response(image.blob, { headers: { 'content-type': image.contentType, - 'content-length': Buffer.byteLength(image.blob).toString(), + 'content-length': image.blob.length.toString(), 'content-disposition': `inline; filename="${params.imageId}"`, 'cache-control': 'public, max-age=31536000, immutable', }, diff --git a/exercises/03.authenticated-e2e/01.problem.login/app/routes/settings+/profile.photo.tsx b/exercises/03.authenticated-e2e/01.problem.login/app/routes/settings+/profile.photo.tsx index f452baf9a..36e397f0b 100644 --- a/exercises/03.authenticated-e2e/01.problem.login/app/routes/settings+/profile.photo.tsx +++ b/exercises/03.authenticated-e2e/01.problem.login/app/routes/settings+/profile.photo.tsx @@ -76,7 +76,7 @@ export async function action({ request }: ActionFunctionArgs) { return { image: { contentType: data.photoFile.type, - blob: Buffer.from(await data.photoFile.arrayBuffer()), + blob: new Uint8Array(await data.photoFile.arrayBuffer()), }, } }), diff --git a/exercises/03.authenticated-e2e/01.problem.login/app/routes/users+/$username_+/__note-editor.tsx b/exercises/03.authenticated-e2e/01.problem.login/app/routes/users+/$username_+/__note-editor.tsx index 714fa7baf..7c8ee2109 100644 --- a/exercises/03.authenticated-e2e/01.problem.login/app/routes/users+/$username_+/__note-editor.tsx +++ b/exercises/03.authenticated-e2e/01.problem.login/app/routes/users+/$username_+/__note-editor.tsx @@ -96,7 +96,7 @@ export async function action({ request, params }: ActionFunctionArgs) { id: i.id, altText: i.altText, contentType: i.file.type, - blob: Buffer.from(await i.file.arrayBuffer()), + blob: new Uint8Array(await i.file.arrayBuffer()), } } else { return { id: i.id, altText: i.altText } @@ -111,7 +111,7 @@ export async function action({ request, params }: ActionFunctionArgs) { return { altText: image.altText, contentType: image.file.type, - blob: Buffer.from(await image.file.arrayBuffer()), + blob: new Uint8Array(await image.file.arrayBuffer()), } }), ), diff --git a/exercises/03.authenticated-e2e/01.problem.login/app/utils/misc.tsx b/exercises/03.authenticated-e2e/01.problem.login/app/utils/misc.tsx index 8879f6b41..a553484db 100644 --- a/exercises/03.authenticated-e2e/01.problem.login/app/utils/misc.tsx +++ b/exercises/03.authenticated-e2e/01.problem.login/app/utils/misc.tsx @@ -303,7 +303,7 @@ export async function downloadFile(url: string, retries: number = 0) { throw new Error(`Failed to fetch image with status ${response.status}`) } const contentType = response.headers.get('content-type') ?? 'image/jpg' - const blob = Buffer.from(await response.arrayBuffer()) + const blob = new Uint8Array(await response.arrayBuffer()) return { contentType, blob } } catch (e) { if (retries > MAX_RETRIES) throw e diff --git a/exercises/03.authenticated-e2e/01.problem.login/index.js b/exercises/03.authenticated-e2e/01.problem.login/index.js index 8ba83ba70..e8728a002 100644 --- a/exercises/03.authenticated-e2e/01.problem.login/index.js +++ b/exercises/03.authenticated-e2e/01.problem.login/index.js @@ -1,11 +1,8 @@ import 'dotenv/config' import 'source-map-support/register.js' -import { installGlobals } from '@remix-run/node' import chalk from 'chalk' import closeWithGrace from 'close-with-grace' -installGlobals() - if ( process.env.NODE_ENV !== 'production' || process.env.PLAYWRIGHT_TEST_BASE_URL diff --git a/exercises/03.authenticated-e2e/01.problem.login/package.json b/exercises/03.authenticated-e2e/01.problem.login/package.json index 01af2c79f..0de726899 100644 --- a/exercises/03.authenticated-e2e/01.problem.login/package.json +++ b/exercises/03.authenticated-e2e/01.problem.login/package.json @@ -30,9 +30,8 @@ "@conform-to/zod": "^0.9.0", "@epic-web/remember": "^1.1.0", "@epic-web/totp": "^1.1.2", - "@epic-web/workshop-utils": "^4.21.1", "@paralleldrive/cuid2": "^2.2.2", - "@prisma/client": "^5.16.2", + "@prisma/client": "^6.19.1", "@radix-ui/react-checkbox": "^1.1.1", "@radix-ui/react-dropdown-menu": "^2.1.1", "@radix-ui/react-label": "^2.1.0", @@ -59,13 +58,13 @@ "glob": "^11.0.0", "isbot": "^5.1.12", "morgan": "^1.10.0", - "prisma": "^5.16.2", + "prisma": "^6.19.1", "qrcode": "^1.5.3", "react": "^18.3.1", "react-dom": "^18.3.1", "remix-auth": "^3.7.0", "remix-auth-form": "^1.5.0", - "remix-auth-github": "^1.7.0", + "remix-auth-github": "1.7.0", "remix-utils": "^7.6.0", "sonner": "^1.5.0", "source-map-support": "^0.5.21", @@ -111,7 +110,7 @@ "execa": "^9.3.0", "fs-extra": "^11.2.0", "jsdom": "^24.1.0", - "msw": "^2.3.1", + "msw": "^2.12.4", "node-html-parser": "^6.1.13", "npm-run-all": "^4.1.5", "prettier": "^3.3.2", diff --git a/exercises/03.authenticated-e2e/01.problem.login/tests/db-utils.ts b/exercises/03.authenticated-e2e/01.problem.login/tests/db-utils.ts index 8f5062e16..2e1e23550 100644 --- a/exercises/03.authenticated-e2e/01.problem.login/tests/db-utils.ts +++ b/exercises/03.authenticated-e2e/01.problem.login/tests/db-utils.ts @@ -67,7 +67,7 @@ export async function getNoteImages() { }), img({ altText: - 'an office full of laptops and other office equipment that look like it was abandond in a rush out of the building in an emergency years ago.', + 'an office full of laptops and other office equipment that look like it was abandoned in a rush out of the building in an emergency years ago.', filepath: './tests/fixtures/images/notes/6.png', }), img({ @@ -110,6 +110,6 @@ export async function img({ return { altText, contentType: filepath.endsWith('.png') ? 'image/png' : 'image/jpeg', - blob: await fs.promises.readFile(filepath), + blob: new Uint8Array(await fs.promises.readFile(filepath)), } } diff --git a/exercises/03.authenticated-e2e/01.problem.login/tests/e2e/onboarding.test.ts b/exercises/03.authenticated-e2e/01.problem.login/tests/e2e/onboarding.test.ts index 2231096c4..f61f0b9c8 100644 --- a/exercises/03.authenticated-e2e/01.problem.login/tests/e2e/onboarding.test.ts +++ b/exercises/03.authenticated-e2e/01.problem.login/tests/e2e/onboarding.test.ts @@ -49,9 +49,7 @@ test('onboarding with link', async ({ page, getOnboardingData }) => { await page.getByRole('textbox', { name: /email/i }).fill(onboardingData.email) await page.getByRole('button', { name: /submit/i }).click() - await expect( - page.getByRole('button', { name: /submit/i, disabled: true }), - ).toBeVisible() + await expect(page.getByText(/check your email/i)).toBeVisible() const email = await waitFor(() => requireEmail(onboardingData.email)) diff --git a/exercises/03.authenticated-e2e/01.solution.login/app/epicshop.tsx b/exercises/03.authenticated-e2e/01.solution.login/app/epicshop.tsx deleted file mode 100644 index 96c5597cb..000000000 --- a/exercises/03.authenticated-e2e/01.solution.login/app/epicshop.tsx +++ /dev/null @@ -1,9 +0,0 @@ -// Ignore this file please -import { EpicShopIFrameSync } from '@epic-web/workshop-utils/iframe-sync' -import { useNavigate } from '@remix-run/react' -import * as React from 'react' - -export function EpicShop() { - const navigate = useNavigate() - return -} diff --git a/exercises/03.authenticated-e2e/01.solution.login/app/root.tsx b/exercises/03.authenticated-e2e/01.solution.login/app/root.tsx index 3b2064a1a..fa7f41981 100644 --- a/exercises/03.authenticated-e2e/01.solution.login/app/root.tsx +++ b/exercises/03.authenticated-e2e/01.solution.login/app/root.tsx @@ -34,7 +34,6 @@ import { SearchBar } from './components/search-bar.tsx' import { Spacer } from './components/spacer.tsx' import { Button } from './components/ui/button.tsx' import { Icon } from './components/ui/icon.tsx' -import { EpicShop } from './epicshop.tsx' import fontStylestylesheetUrl from './styles/font.css' import tailwindStylesheetUrl from './styles/tailwind.css' import { getUserId } from './utils/auth.server.ts' @@ -159,7 +158,6 @@ function Document({ - diff --git a/exercises/03.authenticated-e2e/01.solution.login/app/routes/resources+/note-images.$imageId.tsx b/exercises/03.authenticated-e2e/01.solution.login/app/routes/resources+/note-images.$imageId.tsx index 417545a3e..865878a92 100644 --- a/exercises/03.authenticated-e2e/01.solution.login/app/routes/resources+/note-images.$imageId.tsx +++ b/exercises/03.authenticated-e2e/01.solution.login/app/routes/resources+/note-images.$imageId.tsx @@ -14,7 +14,7 @@ export async function loader({ params }: LoaderFunctionArgs) { return new Response(image.blob, { headers: { 'content-type': image.contentType, - 'content-length': Buffer.byteLength(image.blob).toString(), + 'content-length': image.blob.length.toString(), 'content-disposition': `inline; filename="${params.imageId}"`, 'cache-control': 'public, max-age=31536000, immutable', }, diff --git a/exercises/03.authenticated-e2e/01.solution.login/app/routes/resources+/user-images.$imageId.tsx b/exercises/03.authenticated-e2e/01.solution.login/app/routes/resources+/user-images.$imageId.tsx index c5a66b146..2de45198e 100644 --- a/exercises/03.authenticated-e2e/01.solution.login/app/routes/resources+/user-images.$imageId.tsx +++ b/exercises/03.authenticated-e2e/01.solution.login/app/routes/resources+/user-images.$imageId.tsx @@ -14,7 +14,7 @@ export async function loader({ params }: LoaderFunctionArgs) { return new Response(image.blob, { headers: { 'content-type': image.contentType, - 'content-length': Buffer.byteLength(image.blob).toString(), + 'content-length': image.blob.length.toString(), 'content-disposition': `inline; filename="${params.imageId}"`, 'cache-control': 'public, max-age=31536000, immutable', }, diff --git a/exercises/03.authenticated-e2e/01.solution.login/app/routes/settings+/profile.photo.tsx b/exercises/03.authenticated-e2e/01.solution.login/app/routes/settings+/profile.photo.tsx index f452baf9a..36e397f0b 100644 --- a/exercises/03.authenticated-e2e/01.solution.login/app/routes/settings+/profile.photo.tsx +++ b/exercises/03.authenticated-e2e/01.solution.login/app/routes/settings+/profile.photo.tsx @@ -76,7 +76,7 @@ export async function action({ request }: ActionFunctionArgs) { return { image: { contentType: data.photoFile.type, - blob: Buffer.from(await data.photoFile.arrayBuffer()), + blob: new Uint8Array(await data.photoFile.arrayBuffer()), }, } }), diff --git a/exercises/03.authenticated-e2e/01.solution.login/app/routes/users+/$username_+/__note-editor.tsx b/exercises/03.authenticated-e2e/01.solution.login/app/routes/users+/$username_+/__note-editor.tsx index 714fa7baf..7c8ee2109 100644 --- a/exercises/03.authenticated-e2e/01.solution.login/app/routes/users+/$username_+/__note-editor.tsx +++ b/exercises/03.authenticated-e2e/01.solution.login/app/routes/users+/$username_+/__note-editor.tsx @@ -96,7 +96,7 @@ export async function action({ request, params }: ActionFunctionArgs) { id: i.id, altText: i.altText, contentType: i.file.type, - blob: Buffer.from(await i.file.arrayBuffer()), + blob: new Uint8Array(await i.file.arrayBuffer()), } } else { return { id: i.id, altText: i.altText } @@ -111,7 +111,7 @@ export async function action({ request, params }: ActionFunctionArgs) { return { altText: image.altText, contentType: image.file.type, - blob: Buffer.from(await image.file.arrayBuffer()), + blob: new Uint8Array(await image.file.arrayBuffer()), } }), ), diff --git a/exercises/03.authenticated-e2e/01.solution.login/app/utils/misc.tsx b/exercises/03.authenticated-e2e/01.solution.login/app/utils/misc.tsx index 8879f6b41..a553484db 100644 --- a/exercises/03.authenticated-e2e/01.solution.login/app/utils/misc.tsx +++ b/exercises/03.authenticated-e2e/01.solution.login/app/utils/misc.tsx @@ -303,7 +303,7 @@ export async function downloadFile(url: string, retries: number = 0) { throw new Error(`Failed to fetch image with status ${response.status}`) } const contentType = response.headers.get('content-type') ?? 'image/jpg' - const blob = Buffer.from(await response.arrayBuffer()) + const blob = new Uint8Array(await response.arrayBuffer()) return { contentType, blob } } catch (e) { if (retries > MAX_RETRIES) throw e diff --git a/exercises/03.authenticated-e2e/01.solution.login/index.js b/exercises/03.authenticated-e2e/01.solution.login/index.js index 8ba83ba70..e8728a002 100644 --- a/exercises/03.authenticated-e2e/01.solution.login/index.js +++ b/exercises/03.authenticated-e2e/01.solution.login/index.js @@ -1,11 +1,8 @@ import 'dotenv/config' import 'source-map-support/register.js' -import { installGlobals } from '@remix-run/node' import chalk from 'chalk' import closeWithGrace from 'close-with-grace' -installGlobals() - if ( process.env.NODE_ENV !== 'production' || process.env.PLAYWRIGHT_TEST_BASE_URL diff --git a/exercises/03.authenticated-e2e/01.solution.login/package.json b/exercises/03.authenticated-e2e/01.solution.login/package.json index d41d5ebd8..420031193 100644 --- a/exercises/03.authenticated-e2e/01.solution.login/package.json +++ b/exercises/03.authenticated-e2e/01.solution.login/package.json @@ -30,9 +30,8 @@ "@conform-to/zod": "^0.9.0", "@epic-web/remember": "^1.1.0", "@epic-web/totp": "^1.1.2", - "@epic-web/workshop-utils": "^4.21.1", "@paralleldrive/cuid2": "^2.2.2", - "@prisma/client": "^5.16.2", + "@prisma/client": "^6.19.1", "@radix-ui/react-checkbox": "^1.1.1", "@radix-ui/react-dropdown-menu": "^2.1.1", "@radix-ui/react-label": "^2.1.0", @@ -59,13 +58,13 @@ "glob": "^11.0.0", "isbot": "^5.1.12", "morgan": "^1.10.0", - "prisma": "^5.16.2", + "prisma": "^6.19.1", "qrcode": "^1.5.3", "react": "^18.3.1", "react-dom": "^18.3.1", "remix-auth": "^3.7.0", "remix-auth-form": "^1.5.0", - "remix-auth-github": "^1.7.0", + "remix-auth-github": "1.7.0", "remix-utils": "^7.6.0", "sonner": "^1.5.0", "source-map-support": "^0.5.21", @@ -111,7 +110,7 @@ "execa": "^9.3.0", "fs-extra": "^11.2.0", "jsdom": "^24.1.0", - "msw": "^2.3.1", + "msw": "^2.12.4", "node-html-parser": "^6.1.13", "npm-run-all": "^4.1.5", "prettier": "^3.3.2", diff --git a/exercises/03.authenticated-e2e/01.solution.login/tests/db-utils.ts b/exercises/03.authenticated-e2e/01.solution.login/tests/db-utils.ts index 8f5062e16..2e1e23550 100644 --- a/exercises/03.authenticated-e2e/01.solution.login/tests/db-utils.ts +++ b/exercises/03.authenticated-e2e/01.solution.login/tests/db-utils.ts @@ -67,7 +67,7 @@ export async function getNoteImages() { }), img({ altText: - 'an office full of laptops and other office equipment that look like it was abandond in a rush out of the building in an emergency years ago.', + 'an office full of laptops and other office equipment that look like it was abandoned in a rush out of the building in an emergency years ago.', filepath: './tests/fixtures/images/notes/6.png', }), img({ @@ -110,6 +110,6 @@ export async function img({ return { altText, contentType: filepath.endsWith('.png') ? 'image/png' : 'image/jpeg', - blob: await fs.promises.readFile(filepath), + blob: new Uint8Array(await fs.promises.readFile(filepath)), } } diff --git a/exercises/03.authenticated-e2e/01.solution.login/tests/e2e/onboarding.test.ts b/exercises/03.authenticated-e2e/01.solution.login/tests/e2e/onboarding.test.ts index 2231096c4..f61f0b9c8 100644 --- a/exercises/03.authenticated-e2e/01.solution.login/tests/e2e/onboarding.test.ts +++ b/exercises/03.authenticated-e2e/01.solution.login/tests/e2e/onboarding.test.ts @@ -49,9 +49,7 @@ test('onboarding with link', async ({ page, getOnboardingData }) => { await page.getByRole('textbox', { name: /email/i }).fill(onboardingData.email) await page.getByRole('button', { name: /submit/i }).click() - await expect( - page.getByRole('button', { name: /submit/i, disabled: true }), - ).toBeVisible() + await expect(page.getByText(/check your email/i)).toBeVisible() const email = await waitFor(() => requireEmail(onboardingData.email)) diff --git a/exercises/04.unit-test/01.problem.init/app/epicshop.tsx b/exercises/04.unit-test/01.problem.init/app/epicshop.tsx deleted file mode 100644 index 96c5597cb..000000000 --- a/exercises/04.unit-test/01.problem.init/app/epicshop.tsx +++ /dev/null @@ -1,9 +0,0 @@ -// Ignore this file please -import { EpicShopIFrameSync } from '@epic-web/workshop-utils/iframe-sync' -import { useNavigate } from '@remix-run/react' -import * as React from 'react' - -export function EpicShop() { - const navigate = useNavigate() - return -} diff --git a/exercises/04.unit-test/01.problem.init/app/root.tsx b/exercises/04.unit-test/01.problem.init/app/root.tsx index 3b2064a1a..fa7f41981 100644 --- a/exercises/04.unit-test/01.problem.init/app/root.tsx +++ b/exercises/04.unit-test/01.problem.init/app/root.tsx @@ -34,7 +34,6 @@ import { SearchBar } from './components/search-bar.tsx' import { Spacer } from './components/spacer.tsx' import { Button } from './components/ui/button.tsx' import { Icon } from './components/ui/icon.tsx' -import { EpicShop } from './epicshop.tsx' import fontStylestylesheetUrl from './styles/font.css' import tailwindStylesheetUrl from './styles/tailwind.css' import { getUserId } from './utils/auth.server.ts' @@ -159,7 +158,6 @@ function Document({ - diff --git a/exercises/04.unit-test/01.problem.init/app/routes/resources+/note-images.$imageId.tsx b/exercises/04.unit-test/01.problem.init/app/routes/resources+/note-images.$imageId.tsx index 417545a3e..865878a92 100644 --- a/exercises/04.unit-test/01.problem.init/app/routes/resources+/note-images.$imageId.tsx +++ b/exercises/04.unit-test/01.problem.init/app/routes/resources+/note-images.$imageId.tsx @@ -14,7 +14,7 @@ export async function loader({ params }: LoaderFunctionArgs) { return new Response(image.blob, { headers: { 'content-type': image.contentType, - 'content-length': Buffer.byteLength(image.blob).toString(), + 'content-length': image.blob.length.toString(), 'content-disposition': `inline; filename="${params.imageId}"`, 'cache-control': 'public, max-age=31536000, immutable', }, diff --git a/exercises/04.unit-test/01.problem.init/app/routes/resources+/user-images.$imageId.tsx b/exercises/04.unit-test/01.problem.init/app/routes/resources+/user-images.$imageId.tsx index c5a66b146..2de45198e 100644 --- a/exercises/04.unit-test/01.problem.init/app/routes/resources+/user-images.$imageId.tsx +++ b/exercises/04.unit-test/01.problem.init/app/routes/resources+/user-images.$imageId.tsx @@ -14,7 +14,7 @@ export async function loader({ params }: LoaderFunctionArgs) { return new Response(image.blob, { headers: { 'content-type': image.contentType, - 'content-length': Buffer.byteLength(image.blob).toString(), + 'content-length': image.blob.length.toString(), 'content-disposition': `inline; filename="${params.imageId}"`, 'cache-control': 'public, max-age=31536000, immutable', }, diff --git a/exercises/04.unit-test/01.problem.init/app/routes/settings+/profile.photo.tsx b/exercises/04.unit-test/01.problem.init/app/routes/settings+/profile.photo.tsx index f452baf9a..36e397f0b 100644 --- a/exercises/04.unit-test/01.problem.init/app/routes/settings+/profile.photo.tsx +++ b/exercises/04.unit-test/01.problem.init/app/routes/settings+/profile.photo.tsx @@ -76,7 +76,7 @@ export async function action({ request }: ActionFunctionArgs) { return { image: { contentType: data.photoFile.type, - blob: Buffer.from(await data.photoFile.arrayBuffer()), + blob: new Uint8Array(await data.photoFile.arrayBuffer()), }, } }), diff --git a/exercises/04.unit-test/01.problem.init/app/routes/users+/$username_+/__note-editor.tsx b/exercises/04.unit-test/01.problem.init/app/routes/users+/$username_+/__note-editor.tsx index 714fa7baf..7c8ee2109 100644 --- a/exercises/04.unit-test/01.problem.init/app/routes/users+/$username_+/__note-editor.tsx +++ b/exercises/04.unit-test/01.problem.init/app/routes/users+/$username_+/__note-editor.tsx @@ -96,7 +96,7 @@ export async function action({ request, params }: ActionFunctionArgs) { id: i.id, altText: i.altText, contentType: i.file.type, - blob: Buffer.from(await i.file.arrayBuffer()), + blob: new Uint8Array(await i.file.arrayBuffer()), } } else { return { id: i.id, altText: i.altText } @@ -111,7 +111,7 @@ export async function action({ request, params }: ActionFunctionArgs) { return { altText: image.altText, contentType: image.file.type, - blob: Buffer.from(await image.file.arrayBuffer()), + blob: new Uint8Array(await image.file.arrayBuffer()), } }), ), diff --git a/exercises/04.unit-test/01.problem.init/app/utils/misc.tsx b/exercises/04.unit-test/01.problem.init/app/utils/misc.tsx index 8879f6b41..a553484db 100644 --- a/exercises/04.unit-test/01.problem.init/app/utils/misc.tsx +++ b/exercises/04.unit-test/01.problem.init/app/utils/misc.tsx @@ -303,7 +303,7 @@ export async function downloadFile(url: string, retries: number = 0) { throw new Error(`Failed to fetch image with status ${response.status}`) } const contentType = response.headers.get('content-type') ?? 'image/jpg' - const blob = Buffer.from(await response.arrayBuffer()) + const blob = new Uint8Array(await response.arrayBuffer()) return { contentType, blob } } catch (e) { if (retries > MAX_RETRIES) throw e diff --git a/exercises/04.unit-test/01.problem.init/index.js b/exercises/04.unit-test/01.problem.init/index.js index 8ba83ba70..e8728a002 100644 --- a/exercises/04.unit-test/01.problem.init/index.js +++ b/exercises/04.unit-test/01.problem.init/index.js @@ -1,11 +1,8 @@ import 'dotenv/config' import 'source-map-support/register.js' -import { installGlobals } from '@remix-run/node' import chalk from 'chalk' import closeWithGrace from 'close-with-grace' -installGlobals() - if ( process.env.NODE_ENV !== 'production' || process.env.PLAYWRIGHT_TEST_BASE_URL diff --git a/exercises/04.unit-test/01.problem.init/package.json b/exercises/04.unit-test/01.problem.init/package.json index 42743a370..492d4bf21 100644 --- a/exercises/04.unit-test/01.problem.init/package.json +++ b/exercises/04.unit-test/01.problem.init/package.json @@ -30,9 +30,8 @@ "@conform-to/zod": "^0.9.0", "@epic-web/remember": "^1.1.0", "@epic-web/totp": "^1.1.2", - "@epic-web/workshop-utils": "^4.21.1", "@paralleldrive/cuid2": "^2.2.2", - "@prisma/client": "^5.16.2", + "@prisma/client": "^6.19.1", "@radix-ui/react-checkbox": "^1.1.1", "@radix-ui/react-dropdown-menu": "^2.1.1", "@radix-ui/react-label": "^2.1.0", @@ -59,13 +58,13 @@ "glob": "^11.0.0", "isbot": "^5.1.12", "morgan": "^1.10.0", - "prisma": "^5.16.2", + "prisma": "^6.19.1", "qrcode": "^1.5.3", "react": "^18.3.1", "react-dom": "^18.3.1", "remix-auth": "^3.7.0", "remix-auth-form": "^1.5.0", - "remix-auth-github": "^1.7.0", + "remix-auth-github": "1.7.0", "remix-utils": "^7.6.0", "sonner": "^1.5.0", "source-map-support": "^0.5.21", @@ -111,7 +110,7 @@ "execa": "^9.3.0", "fs-extra": "^11.2.0", "jsdom": "^24.1.0", - "msw": "^2.3.1", + "msw": "^2.12.4", "node-html-parser": "^6.1.13", "npm-run-all": "^4.1.5", "prettier": "^3.3.2", diff --git a/exercises/04.unit-test/01.problem.init/tests/db-utils.ts b/exercises/04.unit-test/01.problem.init/tests/db-utils.ts index 8f5062e16..2e1e23550 100644 --- a/exercises/04.unit-test/01.problem.init/tests/db-utils.ts +++ b/exercises/04.unit-test/01.problem.init/tests/db-utils.ts @@ -67,7 +67,7 @@ export async function getNoteImages() { }), img({ altText: - 'an office full of laptops and other office equipment that look like it was abandond in a rush out of the building in an emergency years ago.', + 'an office full of laptops and other office equipment that look like it was abandoned in a rush out of the building in an emergency years ago.', filepath: './tests/fixtures/images/notes/6.png', }), img({ @@ -110,6 +110,6 @@ export async function img({ return { altText, contentType: filepath.endsWith('.png') ? 'image/png' : 'image/jpeg', - blob: await fs.promises.readFile(filepath), + blob: new Uint8Array(await fs.promises.readFile(filepath)), } } diff --git a/exercises/04.unit-test/01.problem.init/tests/e2e/onboarding.test.ts b/exercises/04.unit-test/01.problem.init/tests/e2e/onboarding.test.ts index cd39afab3..88303b8c0 100644 --- a/exercises/04.unit-test/01.problem.init/tests/e2e/onboarding.test.ts +++ b/exercises/04.unit-test/01.problem.init/tests/e2e/onboarding.test.ts @@ -49,9 +49,7 @@ test('onboarding with link', async ({ page, getOnboardingData }) => { await page.getByRole('textbox', { name: /email/i }).fill(onboardingData.email) await page.getByRole('button', { name: /submit/i }).click() - await expect( - page.getByRole('button', { name: /submit/i, disabled: true }), - ).toBeVisible() + await expect(page.getByText(/check your email/i)).toBeVisible() const email = await waitFor(() => requireEmail(onboardingData.email)) diff --git a/exercises/04.unit-test/01.solution.init/app/epicshop.tsx b/exercises/04.unit-test/01.solution.init/app/epicshop.tsx deleted file mode 100644 index 96c5597cb..000000000 --- a/exercises/04.unit-test/01.solution.init/app/epicshop.tsx +++ /dev/null @@ -1,9 +0,0 @@ -// Ignore this file please -import { EpicShopIFrameSync } from '@epic-web/workshop-utils/iframe-sync' -import { useNavigate } from '@remix-run/react' -import * as React from 'react' - -export function EpicShop() { - const navigate = useNavigate() - return -} diff --git a/exercises/04.unit-test/01.solution.init/app/root.tsx b/exercises/04.unit-test/01.solution.init/app/root.tsx index 3b2064a1a..fa7f41981 100644 --- a/exercises/04.unit-test/01.solution.init/app/root.tsx +++ b/exercises/04.unit-test/01.solution.init/app/root.tsx @@ -34,7 +34,6 @@ import { SearchBar } from './components/search-bar.tsx' import { Spacer } from './components/spacer.tsx' import { Button } from './components/ui/button.tsx' import { Icon } from './components/ui/icon.tsx' -import { EpicShop } from './epicshop.tsx' import fontStylestylesheetUrl from './styles/font.css' import tailwindStylesheetUrl from './styles/tailwind.css' import { getUserId } from './utils/auth.server.ts' @@ -159,7 +158,6 @@ function Document({ - diff --git a/exercises/04.unit-test/01.solution.init/app/routes/resources+/note-images.$imageId.tsx b/exercises/04.unit-test/01.solution.init/app/routes/resources+/note-images.$imageId.tsx index 417545a3e..865878a92 100644 --- a/exercises/04.unit-test/01.solution.init/app/routes/resources+/note-images.$imageId.tsx +++ b/exercises/04.unit-test/01.solution.init/app/routes/resources+/note-images.$imageId.tsx @@ -14,7 +14,7 @@ export async function loader({ params }: LoaderFunctionArgs) { return new Response(image.blob, { headers: { 'content-type': image.contentType, - 'content-length': Buffer.byteLength(image.blob).toString(), + 'content-length': image.blob.length.toString(), 'content-disposition': `inline; filename="${params.imageId}"`, 'cache-control': 'public, max-age=31536000, immutable', }, diff --git a/exercises/04.unit-test/01.solution.init/app/routes/resources+/user-images.$imageId.tsx b/exercises/04.unit-test/01.solution.init/app/routes/resources+/user-images.$imageId.tsx index c5a66b146..2de45198e 100644 --- a/exercises/04.unit-test/01.solution.init/app/routes/resources+/user-images.$imageId.tsx +++ b/exercises/04.unit-test/01.solution.init/app/routes/resources+/user-images.$imageId.tsx @@ -14,7 +14,7 @@ export async function loader({ params }: LoaderFunctionArgs) { return new Response(image.blob, { headers: { 'content-type': image.contentType, - 'content-length': Buffer.byteLength(image.blob).toString(), + 'content-length': image.blob.length.toString(), 'content-disposition': `inline; filename="${params.imageId}"`, 'cache-control': 'public, max-age=31536000, immutable', }, diff --git a/exercises/04.unit-test/01.solution.init/app/routes/settings+/profile.photo.tsx b/exercises/04.unit-test/01.solution.init/app/routes/settings+/profile.photo.tsx index f452baf9a..36e397f0b 100644 --- a/exercises/04.unit-test/01.solution.init/app/routes/settings+/profile.photo.tsx +++ b/exercises/04.unit-test/01.solution.init/app/routes/settings+/profile.photo.tsx @@ -76,7 +76,7 @@ export async function action({ request }: ActionFunctionArgs) { return { image: { contentType: data.photoFile.type, - blob: Buffer.from(await data.photoFile.arrayBuffer()), + blob: new Uint8Array(await data.photoFile.arrayBuffer()), }, } }), diff --git a/exercises/04.unit-test/01.solution.init/app/routes/users+/$username_+/__note-editor.tsx b/exercises/04.unit-test/01.solution.init/app/routes/users+/$username_+/__note-editor.tsx index 714fa7baf..7c8ee2109 100644 --- a/exercises/04.unit-test/01.solution.init/app/routes/users+/$username_+/__note-editor.tsx +++ b/exercises/04.unit-test/01.solution.init/app/routes/users+/$username_+/__note-editor.tsx @@ -96,7 +96,7 @@ export async function action({ request, params }: ActionFunctionArgs) { id: i.id, altText: i.altText, contentType: i.file.type, - blob: Buffer.from(await i.file.arrayBuffer()), + blob: new Uint8Array(await i.file.arrayBuffer()), } } else { return { id: i.id, altText: i.altText } @@ -111,7 +111,7 @@ export async function action({ request, params }: ActionFunctionArgs) { return { altText: image.altText, contentType: image.file.type, - blob: Buffer.from(await image.file.arrayBuffer()), + blob: new Uint8Array(await image.file.arrayBuffer()), } }), ), diff --git a/exercises/04.unit-test/01.solution.init/app/utils/misc.tsx b/exercises/04.unit-test/01.solution.init/app/utils/misc.tsx index 8879f6b41..a553484db 100644 --- a/exercises/04.unit-test/01.solution.init/app/utils/misc.tsx +++ b/exercises/04.unit-test/01.solution.init/app/utils/misc.tsx @@ -303,7 +303,7 @@ export async function downloadFile(url: string, retries: number = 0) { throw new Error(`Failed to fetch image with status ${response.status}`) } const contentType = response.headers.get('content-type') ?? 'image/jpg' - const blob = Buffer.from(await response.arrayBuffer()) + const blob = new Uint8Array(await response.arrayBuffer()) return { contentType, blob } } catch (e) { if (retries > MAX_RETRIES) throw e diff --git a/exercises/04.unit-test/01.solution.init/index.js b/exercises/04.unit-test/01.solution.init/index.js index 8ba83ba70..e8728a002 100644 --- a/exercises/04.unit-test/01.solution.init/index.js +++ b/exercises/04.unit-test/01.solution.init/index.js @@ -1,11 +1,8 @@ import 'dotenv/config' import 'source-map-support/register.js' -import { installGlobals } from '@remix-run/node' import chalk from 'chalk' import closeWithGrace from 'close-with-grace' -installGlobals() - if ( process.env.NODE_ENV !== 'production' || process.env.PLAYWRIGHT_TEST_BASE_URL diff --git a/exercises/04.unit-test/01.solution.init/package.json b/exercises/04.unit-test/01.solution.init/package.json index 0266570d5..170efa999 100644 --- a/exercises/04.unit-test/01.solution.init/package.json +++ b/exercises/04.unit-test/01.solution.init/package.json @@ -30,9 +30,8 @@ "@conform-to/zod": "^0.9.0", "@epic-web/remember": "^1.1.0", "@epic-web/totp": "^1.1.2", - "@epic-web/workshop-utils": "^4.21.1", "@paralleldrive/cuid2": "^2.2.2", - "@prisma/client": "^5.16.2", + "@prisma/client": "^6.19.1", "@radix-ui/react-checkbox": "^1.1.1", "@radix-ui/react-dropdown-menu": "^2.1.1", "@radix-ui/react-label": "^2.1.0", @@ -59,13 +58,13 @@ "glob": "^11.0.0", "isbot": "^5.1.12", "morgan": "^1.10.0", - "prisma": "^5.16.2", + "prisma": "^6.19.1", "qrcode": "^1.5.3", "react": "^18.3.1", "react-dom": "^18.3.1", "remix-auth": "^3.7.0", "remix-auth-form": "^1.5.0", - "remix-auth-github": "^1.7.0", + "remix-auth-github": "1.7.0", "remix-utils": "^7.6.0", "sonner": "^1.5.0", "source-map-support": "^0.5.21", @@ -111,7 +110,7 @@ "execa": "^9.3.0", "fs-extra": "^11.2.0", "jsdom": "^24.1.0", - "msw": "^2.3.1", + "msw": "^2.12.4", "node-html-parser": "^6.1.13", "npm-run-all": "^4.1.5", "prettier": "^3.3.2", diff --git a/exercises/04.unit-test/01.solution.init/tests/db-utils.ts b/exercises/04.unit-test/01.solution.init/tests/db-utils.ts index 8f5062e16..2e1e23550 100644 --- a/exercises/04.unit-test/01.solution.init/tests/db-utils.ts +++ b/exercises/04.unit-test/01.solution.init/tests/db-utils.ts @@ -67,7 +67,7 @@ export async function getNoteImages() { }), img({ altText: - 'an office full of laptops and other office equipment that look like it was abandond in a rush out of the building in an emergency years ago.', + 'an office full of laptops and other office equipment that look like it was abandoned in a rush out of the building in an emergency years ago.', filepath: './tests/fixtures/images/notes/6.png', }), img({ @@ -110,6 +110,6 @@ export async function img({ return { altText, contentType: filepath.endsWith('.png') ? 'image/png' : 'image/jpeg', - blob: await fs.promises.readFile(filepath), + blob: new Uint8Array(await fs.promises.readFile(filepath)), } } diff --git a/exercises/04.unit-test/01.solution.init/tests/e2e/onboarding.test.ts b/exercises/04.unit-test/01.solution.init/tests/e2e/onboarding.test.ts index cd39afab3..88303b8c0 100644 --- a/exercises/04.unit-test/01.solution.init/tests/e2e/onboarding.test.ts +++ b/exercises/04.unit-test/01.solution.init/tests/e2e/onboarding.test.ts @@ -49,9 +49,7 @@ test('onboarding with link', async ({ page, getOnboardingData }) => { await page.getByRole('textbox', { name: /email/i }).fill(onboardingData.email) await page.getByRole('button', { name: /submit/i }).click() - await expect( - page.getByRole('button', { name: /submit/i, disabled: true }), - ).toBeVisible() + await expect(page.getByText(/check your email/i)).toBeVisible() const email = await waitFor(() => requireEmail(onboardingData.email)) diff --git a/exercises/04.unit-test/02.problem.spies/app/epicshop.tsx b/exercises/04.unit-test/02.problem.spies/app/epicshop.tsx deleted file mode 100644 index 96c5597cb..000000000 --- a/exercises/04.unit-test/02.problem.spies/app/epicshop.tsx +++ /dev/null @@ -1,9 +0,0 @@ -// Ignore this file please -import { EpicShopIFrameSync } from '@epic-web/workshop-utils/iframe-sync' -import { useNavigate } from '@remix-run/react' -import * as React from 'react' - -export function EpicShop() { - const navigate = useNavigate() - return -} diff --git a/exercises/04.unit-test/02.problem.spies/app/root.tsx b/exercises/04.unit-test/02.problem.spies/app/root.tsx index 3b2064a1a..fa7f41981 100644 --- a/exercises/04.unit-test/02.problem.spies/app/root.tsx +++ b/exercises/04.unit-test/02.problem.spies/app/root.tsx @@ -34,7 +34,6 @@ import { SearchBar } from './components/search-bar.tsx' import { Spacer } from './components/spacer.tsx' import { Button } from './components/ui/button.tsx' import { Icon } from './components/ui/icon.tsx' -import { EpicShop } from './epicshop.tsx' import fontStylestylesheetUrl from './styles/font.css' import tailwindStylesheetUrl from './styles/tailwind.css' import { getUserId } from './utils/auth.server.ts' @@ -159,7 +158,6 @@ function Document({ - diff --git a/exercises/04.unit-test/02.problem.spies/app/routes/resources+/note-images.$imageId.tsx b/exercises/04.unit-test/02.problem.spies/app/routes/resources+/note-images.$imageId.tsx index 417545a3e..865878a92 100644 --- a/exercises/04.unit-test/02.problem.spies/app/routes/resources+/note-images.$imageId.tsx +++ b/exercises/04.unit-test/02.problem.spies/app/routes/resources+/note-images.$imageId.tsx @@ -14,7 +14,7 @@ export async function loader({ params }: LoaderFunctionArgs) { return new Response(image.blob, { headers: { 'content-type': image.contentType, - 'content-length': Buffer.byteLength(image.blob).toString(), + 'content-length': image.blob.length.toString(), 'content-disposition': `inline; filename="${params.imageId}"`, 'cache-control': 'public, max-age=31536000, immutable', }, diff --git a/exercises/04.unit-test/02.problem.spies/app/routes/resources+/user-images.$imageId.tsx b/exercises/04.unit-test/02.problem.spies/app/routes/resources+/user-images.$imageId.tsx index c5a66b146..2de45198e 100644 --- a/exercises/04.unit-test/02.problem.spies/app/routes/resources+/user-images.$imageId.tsx +++ b/exercises/04.unit-test/02.problem.spies/app/routes/resources+/user-images.$imageId.tsx @@ -14,7 +14,7 @@ export async function loader({ params }: LoaderFunctionArgs) { return new Response(image.blob, { headers: { 'content-type': image.contentType, - 'content-length': Buffer.byteLength(image.blob).toString(), + 'content-length': image.blob.length.toString(), 'content-disposition': `inline; filename="${params.imageId}"`, 'cache-control': 'public, max-age=31536000, immutable', }, diff --git a/exercises/04.unit-test/02.problem.spies/app/routes/settings+/profile.photo.tsx b/exercises/04.unit-test/02.problem.spies/app/routes/settings+/profile.photo.tsx index f452baf9a..36e397f0b 100644 --- a/exercises/04.unit-test/02.problem.spies/app/routes/settings+/profile.photo.tsx +++ b/exercises/04.unit-test/02.problem.spies/app/routes/settings+/profile.photo.tsx @@ -76,7 +76,7 @@ export async function action({ request }: ActionFunctionArgs) { return { image: { contentType: data.photoFile.type, - blob: Buffer.from(await data.photoFile.arrayBuffer()), + blob: new Uint8Array(await data.photoFile.arrayBuffer()), }, } }), diff --git a/exercises/04.unit-test/02.problem.spies/app/routes/users+/$username_+/__note-editor.tsx b/exercises/04.unit-test/02.problem.spies/app/routes/users+/$username_+/__note-editor.tsx index 714fa7baf..7c8ee2109 100644 --- a/exercises/04.unit-test/02.problem.spies/app/routes/users+/$username_+/__note-editor.tsx +++ b/exercises/04.unit-test/02.problem.spies/app/routes/users+/$username_+/__note-editor.tsx @@ -96,7 +96,7 @@ export async function action({ request, params }: ActionFunctionArgs) { id: i.id, altText: i.altText, contentType: i.file.type, - blob: Buffer.from(await i.file.arrayBuffer()), + blob: new Uint8Array(await i.file.arrayBuffer()), } } else { return { id: i.id, altText: i.altText } @@ -111,7 +111,7 @@ export async function action({ request, params }: ActionFunctionArgs) { return { altText: image.altText, contentType: image.file.type, - blob: Buffer.from(await image.file.arrayBuffer()), + blob: new Uint8Array(await image.file.arrayBuffer()), } }), ), diff --git a/exercises/04.unit-test/02.problem.spies/app/utils/misc.tsx b/exercises/04.unit-test/02.problem.spies/app/utils/misc.tsx index 8879f6b41..a553484db 100644 --- a/exercises/04.unit-test/02.problem.spies/app/utils/misc.tsx +++ b/exercises/04.unit-test/02.problem.spies/app/utils/misc.tsx @@ -303,7 +303,7 @@ export async function downloadFile(url: string, retries: number = 0) { throw new Error(`Failed to fetch image with status ${response.status}`) } const contentType = response.headers.get('content-type') ?? 'image/jpg' - const blob = Buffer.from(await response.arrayBuffer()) + const blob = new Uint8Array(await response.arrayBuffer()) return { contentType, blob } } catch (e) { if (retries > MAX_RETRIES) throw e diff --git a/exercises/04.unit-test/02.problem.spies/index.js b/exercises/04.unit-test/02.problem.spies/index.js index 8ba83ba70..e8728a002 100644 --- a/exercises/04.unit-test/02.problem.spies/index.js +++ b/exercises/04.unit-test/02.problem.spies/index.js @@ -1,11 +1,8 @@ import 'dotenv/config' import 'source-map-support/register.js' -import { installGlobals } from '@remix-run/node' import chalk from 'chalk' import closeWithGrace from 'close-with-grace' -installGlobals() - if ( process.env.NODE_ENV !== 'production' || process.env.PLAYWRIGHT_TEST_BASE_URL diff --git a/exercises/04.unit-test/02.problem.spies/package.json b/exercises/04.unit-test/02.problem.spies/package.json index cb2303c79..ef0347a7e 100644 --- a/exercises/04.unit-test/02.problem.spies/package.json +++ b/exercises/04.unit-test/02.problem.spies/package.json @@ -30,9 +30,8 @@ "@conform-to/zod": "^0.9.0", "@epic-web/remember": "^1.1.0", "@epic-web/totp": "^1.1.2", - "@epic-web/workshop-utils": "^4.21.1", "@paralleldrive/cuid2": "^2.2.2", - "@prisma/client": "^5.16.2", + "@prisma/client": "^6.19.1", "@radix-ui/react-checkbox": "^1.1.1", "@radix-ui/react-dropdown-menu": "^2.1.1", "@radix-ui/react-label": "^2.1.0", @@ -59,13 +58,13 @@ "glob": "^11.0.0", "isbot": "^5.1.12", "morgan": "^1.10.0", - "prisma": "^5.16.2", + "prisma": "^6.19.1", "qrcode": "^1.5.3", "react": "^18.3.1", "react-dom": "^18.3.1", "remix-auth": "^3.7.0", "remix-auth-form": "^1.5.0", - "remix-auth-github": "^1.7.0", + "remix-auth-github": "1.7.0", "remix-utils": "^7.6.0", "sonner": "^1.5.0", "source-map-support": "^0.5.21", @@ -111,7 +110,7 @@ "execa": "^9.3.0", "fs-extra": "^11.2.0", "jsdom": "^24.1.0", - "msw": "^2.3.1", + "msw": "^2.12.4", "node-html-parser": "^6.1.13", "npm-run-all": "^4.1.5", "prettier": "^3.3.2", diff --git a/exercises/04.unit-test/02.problem.spies/tests/db-utils.ts b/exercises/04.unit-test/02.problem.spies/tests/db-utils.ts index 8f5062e16..2e1e23550 100644 --- a/exercises/04.unit-test/02.problem.spies/tests/db-utils.ts +++ b/exercises/04.unit-test/02.problem.spies/tests/db-utils.ts @@ -67,7 +67,7 @@ export async function getNoteImages() { }), img({ altText: - 'an office full of laptops and other office equipment that look like it was abandond in a rush out of the building in an emergency years ago.', + 'an office full of laptops and other office equipment that look like it was abandoned in a rush out of the building in an emergency years ago.', filepath: './tests/fixtures/images/notes/6.png', }), img({ @@ -110,6 +110,6 @@ export async function img({ return { altText, contentType: filepath.endsWith('.png') ? 'image/png' : 'image/jpeg', - blob: await fs.promises.readFile(filepath), + blob: new Uint8Array(await fs.promises.readFile(filepath)), } } diff --git a/exercises/04.unit-test/02.problem.spies/tests/e2e/onboarding.test.ts b/exercises/04.unit-test/02.problem.spies/tests/e2e/onboarding.test.ts index cd39afab3..88303b8c0 100644 --- a/exercises/04.unit-test/02.problem.spies/tests/e2e/onboarding.test.ts +++ b/exercises/04.unit-test/02.problem.spies/tests/e2e/onboarding.test.ts @@ -49,9 +49,7 @@ test('onboarding with link', async ({ page, getOnboardingData }) => { await page.getByRole('textbox', { name: /email/i }).fill(onboardingData.email) await page.getByRole('button', { name: /submit/i }).click() - await expect( - page.getByRole('button', { name: /submit/i, disabled: true }), - ).toBeVisible() + await expect(page.getByText(/check your email/i)).toBeVisible() const email = await waitFor(() => requireEmail(onboardingData.email)) diff --git a/exercises/04.unit-test/02.solution.spies/app/epicshop.tsx b/exercises/04.unit-test/02.solution.spies/app/epicshop.tsx deleted file mode 100644 index 96c5597cb..000000000 --- a/exercises/04.unit-test/02.solution.spies/app/epicshop.tsx +++ /dev/null @@ -1,9 +0,0 @@ -// Ignore this file please -import { EpicShopIFrameSync } from '@epic-web/workshop-utils/iframe-sync' -import { useNavigate } from '@remix-run/react' -import * as React from 'react' - -export function EpicShop() { - const navigate = useNavigate() - return -} diff --git a/exercises/04.unit-test/02.solution.spies/app/root.tsx b/exercises/04.unit-test/02.solution.spies/app/root.tsx index 3b2064a1a..fa7f41981 100644 --- a/exercises/04.unit-test/02.solution.spies/app/root.tsx +++ b/exercises/04.unit-test/02.solution.spies/app/root.tsx @@ -34,7 +34,6 @@ import { SearchBar } from './components/search-bar.tsx' import { Spacer } from './components/spacer.tsx' import { Button } from './components/ui/button.tsx' import { Icon } from './components/ui/icon.tsx' -import { EpicShop } from './epicshop.tsx' import fontStylestylesheetUrl from './styles/font.css' import tailwindStylesheetUrl from './styles/tailwind.css' import { getUserId } from './utils/auth.server.ts' @@ -159,7 +158,6 @@ function Document({ - diff --git a/exercises/04.unit-test/02.solution.spies/app/routes/resources+/note-images.$imageId.tsx b/exercises/04.unit-test/02.solution.spies/app/routes/resources+/note-images.$imageId.tsx index 417545a3e..865878a92 100644 --- a/exercises/04.unit-test/02.solution.spies/app/routes/resources+/note-images.$imageId.tsx +++ b/exercises/04.unit-test/02.solution.spies/app/routes/resources+/note-images.$imageId.tsx @@ -14,7 +14,7 @@ export async function loader({ params }: LoaderFunctionArgs) { return new Response(image.blob, { headers: { 'content-type': image.contentType, - 'content-length': Buffer.byteLength(image.blob).toString(), + 'content-length': image.blob.length.toString(), 'content-disposition': `inline; filename="${params.imageId}"`, 'cache-control': 'public, max-age=31536000, immutable', }, diff --git a/exercises/04.unit-test/02.solution.spies/app/routes/resources+/user-images.$imageId.tsx b/exercises/04.unit-test/02.solution.spies/app/routes/resources+/user-images.$imageId.tsx index c5a66b146..2de45198e 100644 --- a/exercises/04.unit-test/02.solution.spies/app/routes/resources+/user-images.$imageId.tsx +++ b/exercises/04.unit-test/02.solution.spies/app/routes/resources+/user-images.$imageId.tsx @@ -14,7 +14,7 @@ export async function loader({ params }: LoaderFunctionArgs) { return new Response(image.blob, { headers: { 'content-type': image.contentType, - 'content-length': Buffer.byteLength(image.blob).toString(), + 'content-length': image.blob.length.toString(), 'content-disposition': `inline; filename="${params.imageId}"`, 'cache-control': 'public, max-age=31536000, immutable', }, diff --git a/exercises/04.unit-test/02.solution.spies/app/routes/settings+/profile.photo.tsx b/exercises/04.unit-test/02.solution.spies/app/routes/settings+/profile.photo.tsx index f452baf9a..36e397f0b 100644 --- a/exercises/04.unit-test/02.solution.spies/app/routes/settings+/profile.photo.tsx +++ b/exercises/04.unit-test/02.solution.spies/app/routes/settings+/profile.photo.tsx @@ -76,7 +76,7 @@ export async function action({ request }: ActionFunctionArgs) { return { image: { contentType: data.photoFile.type, - blob: Buffer.from(await data.photoFile.arrayBuffer()), + blob: new Uint8Array(await data.photoFile.arrayBuffer()), }, } }), diff --git a/exercises/04.unit-test/02.solution.spies/app/routes/users+/$username_+/__note-editor.tsx b/exercises/04.unit-test/02.solution.spies/app/routes/users+/$username_+/__note-editor.tsx index 714fa7baf..7c8ee2109 100644 --- a/exercises/04.unit-test/02.solution.spies/app/routes/users+/$username_+/__note-editor.tsx +++ b/exercises/04.unit-test/02.solution.spies/app/routes/users+/$username_+/__note-editor.tsx @@ -96,7 +96,7 @@ export async function action({ request, params }: ActionFunctionArgs) { id: i.id, altText: i.altText, contentType: i.file.type, - blob: Buffer.from(await i.file.arrayBuffer()), + blob: new Uint8Array(await i.file.arrayBuffer()), } } else { return { id: i.id, altText: i.altText } @@ -111,7 +111,7 @@ export async function action({ request, params }: ActionFunctionArgs) { return { altText: image.altText, contentType: image.file.type, - blob: Buffer.from(await image.file.arrayBuffer()), + blob: new Uint8Array(await image.file.arrayBuffer()), } }), ), diff --git a/exercises/04.unit-test/02.solution.spies/app/utils/misc.tsx b/exercises/04.unit-test/02.solution.spies/app/utils/misc.tsx index 8879f6b41..a553484db 100644 --- a/exercises/04.unit-test/02.solution.spies/app/utils/misc.tsx +++ b/exercises/04.unit-test/02.solution.spies/app/utils/misc.tsx @@ -303,7 +303,7 @@ export async function downloadFile(url: string, retries: number = 0) { throw new Error(`Failed to fetch image with status ${response.status}`) } const contentType = response.headers.get('content-type') ?? 'image/jpg' - const blob = Buffer.from(await response.arrayBuffer()) + const blob = new Uint8Array(await response.arrayBuffer()) return { contentType, blob } } catch (e) { if (retries > MAX_RETRIES) throw e diff --git a/exercises/04.unit-test/02.solution.spies/index.js b/exercises/04.unit-test/02.solution.spies/index.js index 8ba83ba70..e8728a002 100644 --- a/exercises/04.unit-test/02.solution.spies/index.js +++ b/exercises/04.unit-test/02.solution.spies/index.js @@ -1,11 +1,8 @@ import 'dotenv/config' import 'source-map-support/register.js' -import { installGlobals } from '@remix-run/node' import chalk from 'chalk' import closeWithGrace from 'close-with-grace' -installGlobals() - if ( process.env.NODE_ENV !== 'production' || process.env.PLAYWRIGHT_TEST_BASE_URL diff --git a/exercises/04.unit-test/02.solution.spies/package.json b/exercises/04.unit-test/02.solution.spies/package.json index e3b93248b..a6744db08 100644 --- a/exercises/04.unit-test/02.solution.spies/package.json +++ b/exercises/04.unit-test/02.solution.spies/package.json @@ -30,9 +30,8 @@ "@conform-to/zod": "^0.9.0", "@epic-web/remember": "^1.1.0", "@epic-web/totp": "^1.1.2", - "@epic-web/workshop-utils": "^4.21.1", "@paralleldrive/cuid2": "^2.2.2", - "@prisma/client": "^5.16.2", + "@prisma/client": "^6.19.1", "@radix-ui/react-checkbox": "^1.1.1", "@radix-ui/react-dropdown-menu": "^2.1.1", "@radix-ui/react-label": "^2.1.0", @@ -59,13 +58,13 @@ "glob": "^11.0.0", "isbot": "^5.1.12", "morgan": "^1.10.0", - "prisma": "^5.16.2", + "prisma": "^6.19.1", "qrcode": "^1.5.3", "react": "^18.3.1", "react-dom": "^18.3.1", "remix-auth": "^3.7.0", "remix-auth-form": "^1.5.0", - "remix-auth-github": "^1.7.0", + "remix-auth-github": "1.7.0", "remix-utils": "^7.6.0", "sonner": "^1.5.0", "source-map-support": "^0.5.21", @@ -111,7 +110,7 @@ "execa": "^9.3.0", "fs-extra": "^11.2.0", "jsdom": "^24.1.0", - "msw": "^2.3.1", + "msw": "^2.12.4", "node-html-parser": "^6.1.13", "npm-run-all": "^4.1.5", "prettier": "^3.3.2", diff --git a/exercises/04.unit-test/02.solution.spies/tests/db-utils.ts b/exercises/04.unit-test/02.solution.spies/tests/db-utils.ts index 8f5062e16..2e1e23550 100644 --- a/exercises/04.unit-test/02.solution.spies/tests/db-utils.ts +++ b/exercises/04.unit-test/02.solution.spies/tests/db-utils.ts @@ -67,7 +67,7 @@ export async function getNoteImages() { }), img({ altText: - 'an office full of laptops and other office equipment that look like it was abandond in a rush out of the building in an emergency years ago.', + 'an office full of laptops and other office equipment that look like it was abandoned in a rush out of the building in an emergency years ago.', filepath: './tests/fixtures/images/notes/6.png', }), img({ @@ -110,6 +110,6 @@ export async function img({ return { altText, contentType: filepath.endsWith('.png') ? 'image/png' : 'image/jpeg', - blob: await fs.promises.readFile(filepath), + blob: new Uint8Array(await fs.promises.readFile(filepath)), } } diff --git a/exercises/04.unit-test/02.solution.spies/tests/e2e/onboarding.test.ts b/exercises/04.unit-test/02.solution.spies/tests/e2e/onboarding.test.ts index cd39afab3..88303b8c0 100644 --- a/exercises/04.unit-test/02.solution.spies/tests/e2e/onboarding.test.ts +++ b/exercises/04.unit-test/02.solution.spies/tests/e2e/onboarding.test.ts @@ -49,9 +49,7 @@ test('onboarding with link', async ({ page, getOnboardingData }) => { await page.getByRole('textbox', { name: /email/i }).fill(onboardingData.email) await page.getByRole('button', { name: /submit/i }).click() - await expect( - page.getByRole('button', { name: /submit/i, disabled: true }), - ).toBeVisible() + await expect(page.getByText(/check your email/i)).toBeVisible() const email = await waitFor(() => requireEmail(onboardingData.email)) diff --git a/exercises/04.unit-test/03.problem.hooks/app/epicshop.tsx b/exercises/04.unit-test/03.problem.hooks/app/epicshop.tsx deleted file mode 100644 index 96c5597cb..000000000 --- a/exercises/04.unit-test/03.problem.hooks/app/epicshop.tsx +++ /dev/null @@ -1,9 +0,0 @@ -// Ignore this file please -import { EpicShopIFrameSync } from '@epic-web/workshop-utils/iframe-sync' -import { useNavigate } from '@remix-run/react' -import * as React from 'react' - -export function EpicShop() { - const navigate = useNavigate() - return -} diff --git a/exercises/04.unit-test/03.problem.hooks/app/root.tsx b/exercises/04.unit-test/03.problem.hooks/app/root.tsx index 3b2064a1a..fa7f41981 100644 --- a/exercises/04.unit-test/03.problem.hooks/app/root.tsx +++ b/exercises/04.unit-test/03.problem.hooks/app/root.tsx @@ -34,7 +34,6 @@ import { SearchBar } from './components/search-bar.tsx' import { Spacer } from './components/spacer.tsx' import { Button } from './components/ui/button.tsx' import { Icon } from './components/ui/icon.tsx' -import { EpicShop } from './epicshop.tsx' import fontStylestylesheetUrl from './styles/font.css' import tailwindStylesheetUrl from './styles/tailwind.css' import { getUserId } from './utils/auth.server.ts' @@ -159,7 +158,6 @@ function Document({ - diff --git a/exercises/04.unit-test/03.problem.hooks/app/routes/resources+/note-images.$imageId.tsx b/exercises/04.unit-test/03.problem.hooks/app/routes/resources+/note-images.$imageId.tsx index 417545a3e..865878a92 100644 --- a/exercises/04.unit-test/03.problem.hooks/app/routes/resources+/note-images.$imageId.tsx +++ b/exercises/04.unit-test/03.problem.hooks/app/routes/resources+/note-images.$imageId.tsx @@ -14,7 +14,7 @@ export async function loader({ params }: LoaderFunctionArgs) { return new Response(image.blob, { headers: { 'content-type': image.contentType, - 'content-length': Buffer.byteLength(image.blob).toString(), + 'content-length': image.blob.length.toString(), 'content-disposition': `inline; filename="${params.imageId}"`, 'cache-control': 'public, max-age=31536000, immutable', }, diff --git a/exercises/04.unit-test/03.problem.hooks/app/routes/resources+/user-images.$imageId.tsx b/exercises/04.unit-test/03.problem.hooks/app/routes/resources+/user-images.$imageId.tsx index c5a66b146..2de45198e 100644 --- a/exercises/04.unit-test/03.problem.hooks/app/routes/resources+/user-images.$imageId.tsx +++ b/exercises/04.unit-test/03.problem.hooks/app/routes/resources+/user-images.$imageId.tsx @@ -14,7 +14,7 @@ export async function loader({ params }: LoaderFunctionArgs) { return new Response(image.blob, { headers: { 'content-type': image.contentType, - 'content-length': Buffer.byteLength(image.blob).toString(), + 'content-length': image.blob.length.toString(), 'content-disposition': `inline; filename="${params.imageId}"`, 'cache-control': 'public, max-age=31536000, immutable', }, diff --git a/exercises/04.unit-test/03.problem.hooks/app/routes/settings+/profile.photo.tsx b/exercises/04.unit-test/03.problem.hooks/app/routes/settings+/profile.photo.tsx index f452baf9a..36e397f0b 100644 --- a/exercises/04.unit-test/03.problem.hooks/app/routes/settings+/profile.photo.tsx +++ b/exercises/04.unit-test/03.problem.hooks/app/routes/settings+/profile.photo.tsx @@ -76,7 +76,7 @@ export async function action({ request }: ActionFunctionArgs) { return { image: { contentType: data.photoFile.type, - blob: Buffer.from(await data.photoFile.arrayBuffer()), + blob: new Uint8Array(await data.photoFile.arrayBuffer()), }, } }), diff --git a/exercises/04.unit-test/03.problem.hooks/app/routes/users+/$username_+/__note-editor.tsx b/exercises/04.unit-test/03.problem.hooks/app/routes/users+/$username_+/__note-editor.tsx index 714fa7baf..7c8ee2109 100644 --- a/exercises/04.unit-test/03.problem.hooks/app/routes/users+/$username_+/__note-editor.tsx +++ b/exercises/04.unit-test/03.problem.hooks/app/routes/users+/$username_+/__note-editor.tsx @@ -96,7 +96,7 @@ export async function action({ request, params }: ActionFunctionArgs) { id: i.id, altText: i.altText, contentType: i.file.type, - blob: Buffer.from(await i.file.arrayBuffer()), + blob: new Uint8Array(await i.file.arrayBuffer()), } } else { return { id: i.id, altText: i.altText } @@ -111,7 +111,7 @@ export async function action({ request, params }: ActionFunctionArgs) { return { altText: image.altText, contentType: image.file.type, - blob: Buffer.from(await image.file.arrayBuffer()), + blob: new Uint8Array(await image.file.arrayBuffer()), } }), ), diff --git a/exercises/04.unit-test/03.problem.hooks/app/utils/misc.tsx b/exercises/04.unit-test/03.problem.hooks/app/utils/misc.tsx index 8879f6b41..a553484db 100644 --- a/exercises/04.unit-test/03.problem.hooks/app/utils/misc.tsx +++ b/exercises/04.unit-test/03.problem.hooks/app/utils/misc.tsx @@ -303,7 +303,7 @@ export async function downloadFile(url: string, retries: number = 0) { throw new Error(`Failed to fetch image with status ${response.status}`) } const contentType = response.headers.get('content-type') ?? 'image/jpg' - const blob = Buffer.from(await response.arrayBuffer()) + const blob = new Uint8Array(await response.arrayBuffer()) return { contentType, blob } } catch (e) { if (retries > MAX_RETRIES) throw e diff --git a/exercises/04.unit-test/03.problem.hooks/index.js b/exercises/04.unit-test/03.problem.hooks/index.js index 8ba83ba70..e8728a002 100644 --- a/exercises/04.unit-test/03.problem.hooks/index.js +++ b/exercises/04.unit-test/03.problem.hooks/index.js @@ -1,11 +1,8 @@ import 'dotenv/config' import 'source-map-support/register.js' -import { installGlobals } from '@remix-run/node' import chalk from 'chalk' import closeWithGrace from 'close-with-grace' -installGlobals() - if ( process.env.NODE_ENV !== 'production' || process.env.PLAYWRIGHT_TEST_BASE_URL diff --git a/exercises/04.unit-test/03.problem.hooks/package.json b/exercises/04.unit-test/03.problem.hooks/package.json index da88c6c86..325237ba2 100644 --- a/exercises/04.unit-test/03.problem.hooks/package.json +++ b/exercises/04.unit-test/03.problem.hooks/package.json @@ -30,9 +30,8 @@ "@conform-to/zod": "^0.9.0", "@epic-web/remember": "^1.1.0", "@epic-web/totp": "^1.1.2", - "@epic-web/workshop-utils": "^4.21.1", "@paralleldrive/cuid2": "^2.2.2", - "@prisma/client": "^5.16.2", + "@prisma/client": "^6.19.1", "@radix-ui/react-checkbox": "^1.1.1", "@radix-ui/react-dropdown-menu": "^2.1.1", "@radix-ui/react-label": "^2.1.0", @@ -59,13 +58,13 @@ "glob": "^11.0.0", "isbot": "^5.1.12", "morgan": "^1.10.0", - "prisma": "^5.16.2", + "prisma": "^6.19.1", "qrcode": "^1.5.3", "react": "^18.3.1", "react-dom": "^18.3.1", "remix-auth": "^3.7.0", "remix-auth-form": "^1.5.0", - "remix-auth-github": "^1.7.0", + "remix-auth-github": "1.7.0", "remix-utils": "^7.6.0", "sonner": "^1.5.0", "source-map-support": "^0.5.21", @@ -111,7 +110,7 @@ "execa": "^9.3.0", "fs-extra": "^11.2.0", "jsdom": "^24.1.0", - "msw": "^2.3.1", + "msw": "^2.12.4", "node-html-parser": "^6.1.13", "npm-run-all": "^4.1.5", "prettier": "^3.3.2", diff --git a/exercises/04.unit-test/03.problem.hooks/tests/db-utils.ts b/exercises/04.unit-test/03.problem.hooks/tests/db-utils.ts index 8f5062e16..2e1e23550 100644 --- a/exercises/04.unit-test/03.problem.hooks/tests/db-utils.ts +++ b/exercises/04.unit-test/03.problem.hooks/tests/db-utils.ts @@ -67,7 +67,7 @@ export async function getNoteImages() { }), img({ altText: - 'an office full of laptops and other office equipment that look like it was abandond in a rush out of the building in an emergency years ago.', + 'an office full of laptops and other office equipment that look like it was abandoned in a rush out of the building in an emergency years ago.', filepath: './tests/fixtures/images/notes/6.png', }), img({ @@ -110,6 +110,6 @@ export async function img({ return { altText, contentType: filepath.endsWith('.png') ? 'image/png' : 'image/jpeg', - blob: await fs.promises.readFile(filepath), + blob: new Uint8Array(await fs.promises.readFile(filepath)), } } diff --git a/exercises/04.unit-test/03.problem.hooks/tests/e2e/onboarding.test.ts b/exercises/04.unit-test/03.problem.hooks/tests/e2e/onboarding.test.ts index cd39afab3..88303b8c0 100644 --- a/exercises/04.unit-test/03.problem.hooks/tests/e2e/onboarding.test.ts +++ b/exercises/04.unit-test/03.problem.hooks/tests/e2e/onboarding.test.ts @@ -49,9 +49,7 @@ test('onboarding with link', async ({ page, getOnboardingData }) => { await page.getByRole('textbox', { name: /email/i }).fill(onboardingData.email) await page.getByRole('button', { name: /submit/i }).click() - await expect( - page.getByRole('button', { name: /submit/i, disabled: true }), - ).toBeVisible() + await expect(page.getByText(/check your email/i)).toBeVisible() const email = await waitFor(() => requireEmail(onboardingData.email)) diff --git a/exercises/04.unit-test/03.solution.hooks/app/epicshop.tsx b/exercises/04.unit-test/03.solution.hooks/app/epicshop.tsx deleted file mode 100644 index 96c5597cb..000000000 --- a/exercises/04.unit-test/03.solution.hooks/app/epicshop.tsx +++ /dev/null @@ -1,9 +0,0 @@ -// Ignore this file please -import { EpicShopIFrameSync } from '@epic-web/workshop-utils/iframe-sync' -import { useNavigate } from '@remix-run/react' -import * as React from 'react' - -export function EpicShop() { - const navigate = useNavigate() - return -} diff --git a/exercises/04.unit-test/03.solution.hooks/app/root.tsx b/exercises/04.unit-test/03.solution.hooks/app/root.tsx index 3b2064a1a..fa7f41981 100644 --- a/exercises/04.unit-test/03.solution.hooks/app/root.tsx +++ b/exercises/04.unit-test/03.solution.hooks/app/root.tsx @@ -34,7 +34,6 @@ import { SearchBar } from './components/search-bar.tsx' import { Spacer } from './components/spacer.tsx' import { Button } from './components/ui/button.tsx' import { Icon } from './components/ui/icon.tsx' -import { EpicShop } from './epicshop.tsx' import fontStylestylesheetUrl from './styles/font.css' import tailwindStylesheetUrl from './styles/tailwind.css' import { getUserId } from './utils/auth.server.ts' @@ -159,7 +158,6 @@ function Document({ - diff --git a/exercises/04.unit-test/03.solution.hooks/app/routes/resources+/note-images.$imageId.tsx b/exercises/04.unit-test/03.solution.hooks/app/routes/resources+/note-images.$imageId.tsx index 417545a3e..865878a92 100644 --- a/exercises/04.unit-test/03.solution.hooks/app/routes/resources+/note-images.$imageId.tsx +++ b/exercises/04.unit-test/03.solution.hooks/app/routes/resources+/note-images.$imageId.tsx @@ -14,7 +14,7 @@ export async function loader({ params }: LoaderFunctionArgs) { return new Response(image.blob, { headers: { 'content-type': image.contentType, - 'content-length': Buffer.byteLength(image.blob).toString(), + 'content-length': image.blob.length.toString(), 'content-disposition': `inline; filename="${params.imageId}"`, 'cache-control': 'public, max-age=31536000, immutable', }, diff --git a/exercises/04.unit-test/03.solution.hooks/app/routes/resources+/user-images.$imageId.tsx b/exercises/04.unit-test/03.solution.hooks/app/routes/resources+/user-images.$imageId.tsx index c5a66b146..2de45198e 100644 --- a/exercises/04.unit-test/03.solution.hooks/app/routes/resources+/user-images.$imageId.tsx +++ b/exercises/04.unit-test/03.solution.hooks/app/routes/resources+/user-images.$imageId.tsx @@ -14,7 +14,7 @@ export async function loader({ params }: LoaderFunctionArgs) { return new Response(image.blob, { headers: { 'content-type': image.contentType, - 'content-length': Buffer.byteLength(image.blob).toString(), + 'content-length': image.blob.length.toString(), 'content-disposition': `inline; filename="${params.imageId}"`, 'cache-control': 'public, max-age=31536000, immutable', }, diff --git a/exercises/04.unit-test/03.solution.hooks/app/routes/settings+/profile.photo.tsx b/exercises/04.unit-test/03.solution.hooks/app/routes/settings+/profile.photo.tsx index f452baf9a..36e397f0b 100644 --- a/exercises/04.unit-test/03.solution.hooks/app/routes/settings+/profile.photo.tsx +++ b/exercises/04.unit-test/03.solution.hooks/app/routes/settings+/profile.photo.tsx @@ -76,7 +76,7 @@ export async function action({ request }: ActionFunctionArgs) { return { image: { contentType: data.photoFile.type, - blob: Buffer.from(await data.photoFile.arrayBuffer()), + blob: new Uint8Array(await data.photoFile.arrayBuffer()), }, } }), diff --git a/exercises/04.unit-test/03.solution.hooks/app/routes/users+/$username_+/__note-editor.tsx b/exercises/04.unit-test/03.solution.hooks/app/routes/users+/$username_+/__note-editor.tsx index 714fa7baf..7c8ee2109 100644 --- a/exercises/04.unit-test/03.solution.hooks/app/routes/users+/$username_+/__note-editor.tsx +++ b/exercises/04.unit-test/03.solution.hooks/app/routes/users+/$username_+/__note-editor.tsx @@ -96,7 +96,7 @@ export async function action({ request, params }: ActionFunctionArgs) { id: i.id, altText: i.altText, contentType: i.file.type, - blob: Buffer.from(await i.file.arrayBuffer()), + blob: new Uint8Array(await i.file.arrayBuffer()), } } else { return { id: i.id, altText: i.altText } @@ -111,7 +111,7 @@ export async function action({ request, params }: ActionFunctionArgs) { return { altText: image.altText, contentType: image.file.type, - blob: Buffer.from(await image.file.arrayBuffer()), + blob: new Uint8Array(await image.file.arrayBuffer()), } }), ), diff --git a/exercises/04.unit-test/03.solution.hooks/app/utils/misc.tsx b/exercises/04.unit-test/03.solution.hooks/app/utils/misc.tsx index 8879f6b41..a553484db 100644 --- a/exercises/04.unit-test/03.solution.hooks/app/utils/misc.tsx +++ b/exercises/04.unit-test/03.solution.hooks/app/utils/misc.tsx @@ -303,7 +303,7 @@ export async function downloadFile(url: string, retries: number = 0) { throw new Error(`Failed to fetch image with status ${response.status}`) } const contentType = response.headers.get('content-type') ?? 'image/jpg' - const blob = Buffer.from(await response.arrayBuffer()) + const blob = new Uint8Array(await response.arrayBuffer()) return { contentType, blob } } catch (e) { if (retries > MAX_RETRIES) throw e diff --git a/exercises/04.unit-test/03.solution.hooks/index.js b/exercises/04.unit-test/03.solution.hooks/index.js index 8ba83ba70..e8728a002 100644 --- a/exercises/04.unit-test/03.solution.hooks/index.js +++ b/exercises/04.unit-test/03.solution.hooks/index.js @@ -1,11 +1,8 @@ import 'dotenv/config' import 'source-map-support/register.js' -import { installGlobals } from '@remix-run/node' import chalk from 'chalk' import closeWithGrace from 'close-with-grace' -installGlobals() - if ( process.env.NODE_ENV !== 'production' || process.env.PLAYWRIGHT_TEST_BASE_URL diff --git a/exercises/04.unit-test/03.solution.hooks/package.json b/exercises/04.unit-test/03.solution.hooks/package.json index 3c5636b1a..dfa7c57fe 100644 --- a/exercises/04.unit-test/03.solution.hooks/package.json +++ b/exercises/04.unit-test/03.solution.hooks/package.json @@ -30,9 +30,8 @@ "@conform-to/zod": "^0.9.0", "@epic-web/remember": "^1.1.0", "@epic-web/totp": "^1.1.2", - "@epic-web/workshop-utils": "^4.21.1", "@paralleldrive/cuid2": "^2.2.2", - "@prisma/client": "^5.16.2", + "@prisma/client": "^6.19.1", "@radix-ui/react-checkbox": "^1.1.1", "@radix-ui/react-dropdown-menu": "^2.1.1", "@radix-ui/react-label": "^2.1.0", @@ -59,13 +58,13 @@ "glob": "^11.0.0", "isbot": "^5.1.12", "morgan": "^1.10.0", - "prisma": "^5.16.2", + "prisma": "^6.19.1", "qrcode": "^1.5.3", "react": "^18.3.1", "react-dom": "^18.3.1", "remix-auth": "^3.7.0", "remix-auth-form": "^1.5.0", - "remix-auth-github": "^1.7.0", + "remix-auth-github": "1.7.0", "remix-utils": "^7.6.0", "sonner": "^1.5.0", "source-map-support": "^0.5.21", @@ -111,7 +110,7 @@ "execa": "^9.3.0", "fs-extra": "^11.2.0", "jsdom": "^24.1.0", - "msw": "^2.3.1", + "msw": "^2.12.4", "node-html-parser": "^6.1.13", "npm-run-all": "^4.1.5", "prettier": "^3.3.2", diff --git a/exercises/04.unit-test/03.solution.hooks/tests/db-utils.ts b/exercises/04.unit-test/03.solution.hooks/tests/db-utils.ts index 8f5062e16..2e1e23550 100644 --- a/exercises/04.unit-test/03.solution.hooks/tests/db-utils.ts +++ b/exercises/04.unit-test/03.solution.hooks/tests/db-utils.ts @@ -67,7 +67,7 @@ export async function getNoteImages() { }), img({ altText: - 'an office full of laptops and other office equipment that look like it was abandond in a rush out of the building in an emergency years ago.', + 'an office full of laptops and other office equipment that look like it was abandoned in a rush out of the building in an emergency years ago.', filepath: './tests/fixtures/images/notes/6.png', }), img({ @@ -110,6 +110,6 @@ export async function img({ return { altText, contentType: filepath.endsWith('.png') ? 'image/png' : 'image/jpeg', - blob: await fs.promises.readFile(filepath), + blob: new Uint8Array(await fs.promises.readFile(filepath)), } } diff --git a/exercises/04.unit-test/03.solution.hooks/tests/e2e/onboarding.test.ts b/exercises/04.unit-test/03.solution.hooks/tests/e2e/onboarding.test.ts index cd39afab3..88303b8c0 100644 --- a/exercises/04.unit-test/03.solution.hooks/tests/e2e/onboarding.test.ts +++ b/exercises/04.unit-test/03.solution.hooks/tests/e2e/onboarding.test.ts @@ -49,9 +49,7 @@ test('onboarding with link', async ({ page, getOnboardingData }) => { await page.getByRole('textbox', { name: /email/i }).fill(onboardingData.email) await page.getByRole('button', { name: /submit/i }).click() - await expect( - page.getByRole('button', { name: /submit/i, disabled: true }), - ).toBeVisible() + await expect(page.getByText(/check your email/i)).toBeVisible() const email = await waitFor(() => requireEmail(onboardingData.email)) diff --git a/exercises/04.unit-test/04.problem.setup/README.mdx b/exercises/04.unit-test/04.problem.setup/README.mdx index 7d5aab258..c4e123124 100644 --- a/exercises/04.unit-test/04.problem.setup/README.mdx +++ b/exercises/04.unit-test/04.problem.setup/README.mdx @@ -13,10 +13,6 @@ we should be simulating. Here's some of that setup code: ```ts import 'dotenv/config' import '#app/utils/env.server.ts' - -import { installGlobals } from '@remix-run/node' - -installGlobals() ``` You'll find similar setup in our . So we @@ -27,6 +23,14 @@ better to use [the vitest `setupFiles` config](https://vitest.dev/config/#setupfiles) because it's just much more convenient this way. + + At the time of the original recording, our setup code also included + `installGlobals` from `@remix-run/node`. This would set up things like + `Headers`, `fetch`, etc. In modern Node.js, we no longer need these globals + installed because they are now built in. The exercise content has been updated + to reflect this change. + + Additionally, because we want our `console.error` code to be handled the same in every one our tests, we can move our console error stuff to our setup file as well. diff --git a/exercises/04.unit-test/04.problem.setup/app/epicshop.tsx b/exercises/04.unit-test/04.problem.setup/app/epicshop.tsx deleted file mode 100644 index 96c5597cb..000000000 --- a/exercises/04.unit-test/04.problem.setup/app/epicshop.tsx +++ /dev/null @@ -1,9 +0,0 @@ -// Ignore this file please -import { EpicShopIFrameSync } from '@epic-web/workshop-utils/iframe-sync' -import { useNavigate } from '@remix-run/react' -import * as React from 'react' - -export function EpicShop() { - const navigate = useNavigate() - return -} diff --git a/exercises/04.unit-test/04.problem.setup/app/root.tsx b/exercises/04.unit-test/04.problem.setup/app/root.tsx index 3b2064a1a..fa7f41981 100644 --- a/exercises/04.unit-test/04.problem.setup/app/root.tsx +++ b/exercises/04.unit-test/04.problem.setup/app/root.tsx @@ -34,7 +34,6 @@ import { SearchBar } from './components/search-bar.tsx' import { Spacer } from './components/spacer.tsx' import { Button } from './components/ui/button.tsx' import { Icon } from './components/ui/icon.tsx' -import { EpicShop } from './epicshop.tsx' import fontStylestylesheetUrl from './styles/font.css' import tailwindStylesheetUrl from './styles/tailwind.css' import { getUserId } from './utils/auth.server.ts' @@ -159,7 +158,6 @@ function Document({ - diff --git a/exercises/04.unit-test/04.problem.setup/app/routes/resources+/note-images.$imageId.tsx b/exercises/04.unit-test/04.problem.setup/app/routes/resources+/note-images.$imageId.tsx index 417545a3e..865878a92 100644 --- a/exercises/04.unit-test/04.problem.setup/app/routes/resources+/note-images.$imageId.tsx +++ b/exercises/04.unit-test/04.problem.setup/app/routes/resources+/note-images.$imageId.tsx @@ -14,7 +14,7 @@ export async function loader({ params }: LoaderFunctionArgs) { return new Response(image.blob, { headers: { 'content-type': image.contentType, - 'content-length': Buffer.byteLength(image.blob).toString(), + 'content-length': image.blob.length.toString(), 'content-disposition': `inline; filename="${params.imageId}"`, 'cache-control': 'public, max-age=31536000, immutable', }, diff --git a/exercises/04.unit-test/04.problem.setup/app/routes/resources+/user-images.$imageId.tsx b/exercises/04.unit-test/04.problem.setup/app/routes/resources+/user-images.$imageId.tsx index c5a66b146..2de45198e 100644 --- a/exercises/04.unit-test/04.problem.setup/app/routes/resources+/user-images.$imageId.tsx +++ b/exercises/04.unit-test/04.problem.setup/app/routes/resources+/user-images.$imageId.tsx @@ -14,7 +14,7 @@ export async function loader({ params }: LoaderFunctionArgs) { return new Response(image.blob, { headers: { 'content-type': image.contentType, - 'content-length': Buffer.byteLength(image.blob).toString(), + 'content-length': image.blob.length.toString(), 'content-disposition': `inline; filename="${params.imageId}"`, 'cache-control': 'public, max-age=31536000, immutable', }, diff --git a/exercises/04.unit-test/04.problem.setup/app/routes/settings+/profile.photo.tsx b/exercises/04.unit-test/04.problem.setup/app/routes/settings+/profile.photo.tsx index f452baf9a..36e397f0b 100644 --- a/exercises/04.unit-test/04.problem.setup/app/routes/settings+/profile.photo.tsx +++ b/exercises/04.unit-test/04.problem.setup/app/routes/settings+/profile.photo.tsx @@ -76,7 +76,7 @@ export async function action({ request }: ActionFunctionArgs) { return { image: { contentType: data.photoFile.type, - blob: Buffer.from(await data.photoFile.arrayBuffer()), + blob: new Uint8Array(await data.photoFile.arrayBuffer()), }, } }), diff --git a/exercises/04.unit-test/04.problem.setup/app/routes/users+/$username_+/__note-editor.tsx b/exercises/04.unit-test/04.problem.setup/app/routes/users+/$username_+/__note-editor.tsx index 714fa7baf..7c8ee2109 100644 --- a/exercises/04.unit-test/04.problem.setup/app/routes/users+/$username_+/__note-editor.tsx +++ b/exercises/04.unit-test/04.problem.setup/app/routes/users+/$username_+/__note-editor.tsx @@ -96,7 +96,7 @@ export async function action({ request, params }: ActionFunctionArgs) { id: i.id, altText: i.altText, contentType: i.file.type, - blob: Buffer.from(await i.file.arrayBuffer()), + blob: new Uint8Array(await i.file.arrayBuffer()), } } else { return { id: i.id, altText: i.altText } @@ -111,7 +111,7 @@ export async function action({ request, params }: ActionFunctionArgs) { return { altText: image.altText, contentType: image.file.type, - blob: Buffer.from(await image.file.arrayBuffer()), + blob: new Uint8Array(await image.file.arrayBuffer()), } }), ), diff --git a/exercises/04.unit-test/04.problem.setup/app/utils/misc.tsx b/exercises/04.unit-test/04.problem.setup/app/utils/misc.tsx index 8879f6b41..a553484db 100644 --- a/exercises/04.unit-test/04.problem.setup/app/utils/misc.tsx +++ b/exercises/04.unit-test/04.problem.setup/app/utils/misc.tsx @@ -303,7 +303,7 @@ export async function downloadFile(url: string, retries: number = 0) { throw new Error(`Failed to fetch image with status ${response.status}`) } const contentType = response.headers.get('content-type') ?? 'image/jpg' - const blob = Buffer.from(await response.arrayBuffer()) + const blob = new Uint8Array(await response.arrayBuffer()) return { contentType, blob } } catch (e) { if (retries > MAX_RETRIES) throw e diff --git a/exercises/04.unit-test/04.problem.setup/index.js b/exercises/04.unit-test/04.problem.setup/index.js index 8ba83ba70..e8728a002 100644 --- a/exercises/04.unit-test/04.problem.setup/index.js +++ b/exercises/04.unit-test/04.problem.setup/index.js @@ -1,11 +1,8 @@ import 'dotenv/config' import 'source-map-support/register.js' -import { installGlobals } from '@remix-run/node' import chalk from 'chalk' import closeWithGrace from 'close-with-grace' -installGlobals() - if ( process.env.NODE_ENV !== 'production' || process.env.PLAYWRIGHT_TEST_BASE_URL diff --git a/exercises/04.unit-test/04.problem.setup/package.json b/exercises/04.unit-test/04.problem.setup/package.json index b52ba03dc..50de9e366 100644 --- a/exercises/04.unit-test/04.problem.setup/package.json +++ b/exercises/04.unit-test/04.problem.setup/package.json @@ -30,9 +30,8 @@ "@conform-to/zod": "^0.9.0", "@epic-web/remember": "^1.1.0", "@epic-web/totp": "^1.1.2", - "@epic-web/workshop-utils": "^4.21.1", "@paralleldrive/cuid2": "^2.2.2", - "@prisma/client": "^5.16.2", + "@prisma/client": "^6.19.1", "@radix-ui/react-checkbox": "^1.1.1", "@radix-ui/react-dropdown-menu": "^2.1.1", "@radix-ui/react-label": "^2.1.0", @@ -59,13 +58,13 @@ "glob": "^11.0.0", "isbot": "^5.1.12", "morgan": "^1.10.0", - "prisma": "^5.16.2", + "prisma": "^6.19.1", "qrcode": "^1.5.3", "react": "^18.3.1", "react-dom": "^18.3.1", "remix-auth": "^3.7.0", "remix-auth-form": "^1.5.0", - "remix-auth-github": "^1.7.0", + "remix-auth-github": "1.7.0", "remix-utils": "^7.6.0", "sonner": "^1.5.0", "source-map-support": "^0.5.21", @@ -111,7 +110,7 @@ "execa": "^9.3.0", "fs-extra": "^11.2.0", "jsdom": "^24.1.0", - "msw": "^2.3.1", + "msw": "^2.12.4", "node-html-parser": "^6.1.13", "npm-run-all": "^4.1.5", "prettier": "^3.3.2", diff --git a/exercises/04.unit-test/04.problem.setup/tests/db-utils.ts b/exercises/04.unit-test/04.problem.setup/tests/db-utils.ts index 8f5062e16..2e1e23550 100644 --- a/exercises/04.unit-test/04.problem.setup/tests/db-utils.ts +++ b/exercises/04.unit-test/04.problem.setup/tests/db-utils.ts @@ -67,7 +67,7 @@ export async function getNoteImages() { }), img({ altText: - 'an office full of laptops and other office equipment that look like it was abandond in a rush out of the building in an emergency years ago.', + 'an office full of laptops and other office equipment that look like it was abandoned in a rush out of the building in an emergency years ago.', filepath: './tests/fixtures/images/notes/6.png', }), img({ @@ -110,6 +110,6 @@ export async function img({ return { altText, contentType: filepath.endsWith('.png') ? 'image/png' : 'image/jpeg', - blob: await fs.promises.readFile(filepath), + blob: new Uint8Array(await fs.promises.readFile(filepath)), } } diff --git a/exercises/04.unit-test/04.problem.setup/tests/e2e/onboarding.test.ts b/exercises/04.unit-test/04.problem.setup/tests/e2e/onboarding.test.ts index cd39afab3..88303b8c0 100644 --- a/exercises/04.unit-test/04.problem.setup/tests/e2e/onboarding.test.ts +++ b/exercises/04.unit-test/04.problem.setup/tests/e2e/onboarding.test.ts @@ -49,9 +49,7 @@ test('onboarding with link', async ({ page, getOnboardingData }) => { await page.getByRole('textbox', { name: /email/i }).fill(onboardingData.email) await page.getByRole('button', { name: /submit/i }).click() - await expect( - page.getByRole('button', { name: /submit/i, disabled: true }), - ).toBeVisible() + await expect(page.getByText(/check your email/i)).toBeVisible() const email = await waitFor(() => requireEmail(onboardingData.email)) diff --git a/exercises/04.unit-test/04.solution.setup/app/epicshop.tsx b/exercises/04.unit-test/04.solution.setup/app/epicshop.tsx deleted file mode 100644 index 96c5597cb..000000000 --- a/exercises/04.unit-test/04.solution.setup/app/epicshop.tsx +++ /dev/null @@ -1,9 +0,0 @@ -// Ignore this file please -import { EpicShopIFrameSync } from '@epic-web/workshop-utils/iframe-sync' -import { useNavigate } from '@remix-run/react' -import * as React from 'react' - -export function EpicShop() { - const navigate = useNavigate() - return -} diff --git a/exercises/04.unit-test/04.solution.setup/app/root.tsx b/exercises/04.unit-test/04.solution.setup/app/root.tsx index 3b2064a1a..fa7f41981 100644 --- a/exercises/04.unit-test/04.solution.setup/app/root.tsx +++ b/exercises/04.unit-test/04.solution.setup/app/root.tsx @@ -34,7 +34,6 @@ import { SearchBar } from './components/search-bar.tsx' import { Spacer } from './components/spacer.tsx' import { Button } from './components/ui/button.tsx' import { Icon } from './components/ui/icon.tsx' -import { EpicShop } from './epicshop.tsx' import fontStylestylesheetUrl from './styles/font.css' import tailwindStylesheetUrl from './styles/tailwind.css' import { getUserId } from './utils/auth.server.ts' @@ -159,7 +158,6 @@ function Document({ - diff --git a/exercises/04.unit-test/04.solution.setup/app/routes/resources+/note-images.$imageId.tsx b/exercises/04.unit-test/04.solution.setup/app/routes/resources+/note-images.$imageId.tsx index 417545a3e..865878a92 100644 --- a/exercises/04.unit-test/04.solution.setup/app/routes/resources+/note-images.$imageId.tsx +++ b/exercises/04.unit-test/04.solution.setup/app/routes/resources+/note-images.$imageId.tsx @@ -14,7 +14,7 @@ export async function loader({ params }: LoaderFunctionArgs) { return new Response(image.blob, { headers: { 'content-type': image.contentType, - 'content-length': Buffer.byteLength(image.blob).toString(), + 'content-length': image.blob.length.toString(), 'content-disposition': `inline; filename="${params.imageId}"`, 'cache-control': 'public, max-age=31536000, immutable', }, diff --git a/exercises/04.unit-test/04.solution.setup/app/routes/resources+/user-images.$imageId.tsx b/exercises/04.unit-test/04.solution.setup/app/routes/resources+/user-images.$imageId.tsx index c5a66b146..2de45198e 100644 --- a/exercises/04.unit-test/04.solution.setup/app/routes/resources+/user-images.$imageId.tsx +++ b/exercises/04.unit-test/04.solution.setup/app/routes/resources+/user-images.$imageId.tsx @@ -14,7 +14,7 @@ export async function loader({ params }: LoaderFunctionArgs) { return new Response(image.blob, { headers: { 'content-type': image.contentType, - 'content-length': Buffer.byteLength(image.blob).toString(), + 'content-length': image.blob.length.toString(), 'content-disposition': `inline; filename="${params.imageId}"`, 'cache-control': 'public, max-age=31536000, immutable', }, diff --git a/exercises/04.unit-test/04.solution.setup/app/routes/settings+/profile.photo.tsx b/exercises/04.unit-test/04.solution.setup/app/routes/settings+/profile.photo.tsx index f452baf9a..36e397f0b 100644 --- a/exercises/04.unit-test/04.solution.setup/app/routes/settings+/profile.photo.tsx +++ b/exercises/04.unit-test/04.solution.setup/app/routes/settings+/profile.photo.tsx @@ -76,7 +76,7 @@ export async function action({ request }: ActionFunctionArgs) { return { image: { contentType: data.photoFile.type, - blob: Buffer.from(await data.photoFile.arrayBuffer()), + blob: new Uint8Array(await data.photoFile.arrayBuffer()), }, } }), diff --git a/exercises/04.unit-test/04.solution.setup/app/routes/users+/$username_+/__note-editor.tsx b/exercises/04.unit-test/04.solution.setup/app/routes/users+/$username_+/__note-editor.tsx index 714fa7baf..7c8ee2109 100644 --- a/exercises/04.unit-test/04.solution.setup/app/routes/users+/$username_+/__note-editor.tsx +++ b/exercises/04.unit-test/04.solution.setup/app/routes/users+/$username_+/__note-editor.tsx @@ -96,7 +96,7 @@ export async function action({ request, params }: ActionFunctionArgs) { id: i.id, altText: i.altText, contentType: i.file.type, - blob: Buffer.from(await i.file.arrayBuffer()), + blob: new Uint8Array(await i.file.arrayBuffer()), } } else { return { id: i.id, altText: i.altText } @@ -111,7 +111,7 @@ export async function action({ request, params }: ActionFunctionArgs) { return { altText: image.altText, contentType: image.file.type, - blob: Buffer.from(await image.file.arrayBuffer()), + blob: new Uint8Array(await image.file.arrayBuffer()), } }), ), diff --git a/exercises/04.unit-test/04.solution.setup/app/utils/misc.tsx b/exercises/04.unit-test/04.solution.setup/app/utils/misc.tsx index 8879f6b41..a553484db 100644 --- a/exercises/04.unit-test/04.solution.setup/app/utils/misc.tsx +++ b/exercises/04.unit-test/04.solution.setup/app/utils/misc.tsx @@ -303,7 +303,7 @@ export async function downloadFile(url: string, retries: number = 0) { throw new Error(`Failed to fetch image with status ${response.status}`) } const contentType = response.headers.get('content-type') ?? 'image/jpg' - const blob = Buffer.from(await response.arrayBuffer()) + const blob = new Uint8Array(await response.arrayBuffer()) return { contentType, blob } } catch (e) { if (retries > MAX_RETRIES) throw e diff --git a/exercises/04.unit-test/04.solution.setup/index.js b/exercises/04.unit-test/04.solution.setup/index.js index 8ba83ba70..e8728a002 100644 --- a/exercises/04.unit-test/04.solution.setup/index.js +++ b/exercises/04.unit-test/04.solution.setup/index.js @@ -1,11 +1,8 @@ import 'dotenv/config' import 'source-map-support/register.js' -import { installGlobals } from '@remix-run/node' import chalk from 'chalk' import closeWithGrace from 'close-with-grace' -installGlobals() - if ( process.env.NODE_ENV !== 'production' || process.env.PLAYWRIGHT_TEST_BASE_URL diff --git a/exercises/04.unit-test/04.solution.setup/package.json b/exercises/04.unit-test/04.solution.setup/package.json index d69e93bbf..f21ee91f3 100644 --- a/exercises/04.unit-test/04.solution.setup/package.json +++ b/exercises/04.unit-test/04.solution.setup/package.json @@ -30,9 +30,8 @@ "@conform-to/zod": "^0.9.0", "@epic-web/remember": "^1.1.0", "@epic-web/totp": "^1.1.2", - "@epic-web/workshop-utils": "^4.21.1", "@paralleldrive/cuid2": "^2.2.2", - "@prisma/client": "^5.16.2", + "@prisma/client": "^6.19.1", "@radix-ui/react-checkbox": "^1.1.1", "@radix-ui/react-dropdown-menu": "^2.1.1", "@radix-ui/react-label": "^2.1.0", @@ -59,13 +58,13 @@ "glob": "^11.0.0", "isbot": "^5.1.12", "morgan": "^1.10.0", - "prisma": "^5.16.2", + "prisma": "^6.19.1", "qrcode": "^1.5.3", "react": "^18.3.1", "react-dom": "^18.3.1", "remix-auth": "^3.7.0", "remix-auth-form": "^1.5.0", - "remix-auth-github": "^1.7.0", + "remix-auth-github": "1.7.0", "remix-utils": "^7.6.0", "sonner": "^1.5.0", "source-map-support": "^0.5.21", @@ -111,7 +110,7 @@ "execa": "^9.3.0", "fs-extra": "^11.2.0", "jsdom": "^24.1.0", - "msw": "^2.3.1", + "msw": "^2.12.4", "node-html-parser": "^6.1.13", "npm-run-all": "^4.1.5", "prettier": "^3.3.2", diff --git a/exercises/04.unit-test/04.solution.setup/tests/db-utils.ts b/exercises/04.unit-test/04.solution.setup/tests/db-utils.ts index 8f5062e16..2e1e23550 100644 --- a/exercises/04.unit-test/04.solution.setup/tests/db-utils.ts +++ b/exercises/04.unit-test/04.solution.setup/tests/db-utils.ts @@ -67,7 +67,7 @@ export async function getNoteImages() { }), img({ altText: - 'an office full of laptops and other office equipment that look like it was abandond in a rush out of the building in an emergency years ago.', + 'an office full of laptops and other office equipment that look like it was abandoned in a rush out of the building in an emergency years ago.', filepath: './tests/fixtures/images/notes/6.png', }), img({ @@ -110,6 +110,6 @@ export async function img({ return { altText, contentType: filepath.endsWith('.png') ? 'image/png' : 'image/jpeg', - blob: await fs.promises.readFile(filepath), + blob: new Uint8Array(await fs.promises.readFile(filepath)), } } diff --git a/exercises/04.unit-test/04.solution.setup/tests/e2e/onboarding.test.ts b/exercises/04.unit-test/04.solution.setup/tests/e2e/onboarding.test.ts index cd39afab3..88303b8c0 100644 --- a/exercises/04.unit-test/04.solution.setup/tests/e2e/onboarding.test.ts +++ b/exercises/04.unit-test/04.solution.setup/tests/e2e/onboarding.test.ts @@ -49,9 +49,7 @@ test('onboarding with link', async ({ page, getOnboardingData }) => { await page.getByRole('textbox', { name: /email/i }).fill(onboardingData.email) await page.getByRole('button', { name: /submit/i }).click() - await expect( - page.getByRole('button', { name: /submit/i, disabled: true }), - ).toBeVisible() + await expect(page.getByText(/check your email/i)).toBeVisible() const email = await waitFor(() => requireEmail(onboardingData.email)) diff --git a/exercises/04.unit-test/04.solution.setup/tests/setup/setup-test-env.ts b/exercises/04.unit-test/04.solution.setup/tests/setup/setup-test-env.ts index 188edb038..aabedd8ab 100644 --- a/exercises/04.unit-test/04.solution.setup/tests/setup/setup-test-env.ts +++ b/exercises/04.unit-test/04.solution.setup/tests/setup/setup-test-env.ts @@ -1,10 +1,7 @@ import 'dotenv/config' import '#app/utils/env.server.ts' -import { installGlobals } from '@remix-run/node' import { beforeEach, vi, type MockInstance } from 'vitest' -installGlobals() - export let consoleError: MockInstance beforeEach(() => { diff --git a/exercises/05.component-test/01.problem.init/app/epicshop.tsx b/exercises/05.component-test/01.problem.init/app/epicshop.tsx deleted file mode 100644 index 96c5597cb..000000000 --- a/exercises/05.component-test/01.problem.init/app/epicshop.tsx +++ /dev/null @@ -1,9 +0,0 @@ -// Ignore this file please -import { EpicShopIFrameSync } from '@epic-web/workshop-utils/iframe-sync' -import { useNavigate } from '@remix-run/react' -import * as React from 'react' - -export function EpicShop() { - const navigate = useNavigate() - return -} diff --git a/exercises/05.component-test/01.problem.init/app/root.tsx b/exercises/05.component-test/01.problem.init/app/root.tsx index 3b2064a1a..fa7f41981 100644 --- a/exercises/05.component-test/01.problem.init/app/root.tsx +++ b/exercises/05.component-test/01.problem.init/app/root.tsx @@ -34,7 +34,6 @@ import { SearchBar } from './components/search-bar.tsx' import { Spacer } from './components/spacer.tsx' import { Button } from './components/ui/button.tsx' import { Icon } from './components/ui/icon.tsx' -import { EpicShop } from './epicshop.tsx' import fontStylestylesheetUrl from './styles/font.css' import tailwindStylesheetUrl from './styles/tailwind.css' import { getUserId } from './utils/auth.server.ts' @@ -159,7 +158,6 @@ function Document({ - diff --git a/exercises/05.component-test/01.problem.init/app/routes/resources+/note-images.$imageId.tsx b/exercises/05.component-test/01.problem.init/app/routes/resources+/note-images.$imageId.tsx index 417545a3e..865878a92 100644 --- a/exercises/05.component-test/01.problem.init/app/routes/resources+/note-images.$imageId.tsx +++ b/exercises/05.component-test/01.problem.init/app/routes/resources+/note-images.$imageId.tsx @@ -14,7 +14,7 @@ export async function loader({ params }: LoaderFunctionArgs) { return new Response(image.blob, { headers: { 'content-type': image.contentType, - 'content-length': Buffer.byteLength(image.blob).toString(), + 'content-length': image.blob.length.toString(), 'content-disposition': `inline; filename="${params.imageId}"`, 'cache-control': 'public, max-age=31536000, immutable', }, diff --git a/exercises/05.component-test/01.problem.init/app/routes/resources+/user-images.$imageId.tsx b/exercises/05.component-test/01.problem.init/app/routes/resources+/user-images.$imageId.tsx index c5a66b146..2de45198e 100644 --- a/exercises/05.component-test/01.problem.init/app/routes/resources+/user-images.$imageId.tsx +++ b/exercises/05.component-test/01.problem.init/app/routes/resources+/user-images.$imageId.tsx @@ -14,7 +14,7 @@ export async function loader({ params }: LoaderFunctionArgs) { return new Response(image.blob, { headers: { 'content-type': image.contentType, - 'content-length': Buffer.byteLength(image.blob).toString(), + 'content-length': image.blob.length.toString(), 'content-disposition': `inline; filename="${params.imageId}"`, 'cache-control': 'public, max-age=31536000, immutable', }, diff --git a/exercises/05.component-test/01.problem.init/app/routes/settings+/profile.photo.tsx b/exercises/05.component-test/01.problem.init/app/routes/settings+/profile.photo.tsx index f452baf9a..36e397f0b 100644 --- a/exercises/05.component-test/01.problem.init/app/routes/settings+/profile.photo.tsx +++ b/exercises/05.component-test/01.problem.init/app/routes/settings+/profile.photo.tsx @@ -76,7 +76,7 @@ export async function action({ request }: ActionFunctionArgs) { return { image: { contentType: data.photoFile.type, - blob: Buffer.from(await data.photoFile.arrayBuffer()), + blob: new Uint8Array(await data.photoFile.arrayBuffer()), }, } }), diff --git a/exercises/05.component-test/01.problem.init/app/routes/users+/$username_+/__note-editor.tsx b/exercises/05.component-test/01.problem.init/app/routes/users+/$username_+/__note-editor.tsx index 714fa7baf..7c8ee2109 100644 --- a/exercises/05.component-test/01.problem.init/app/routes/users+/$username_+/__note-editor.tsx +++ b/exercises/05.component-test/01.problem.init/app/routes/users+/$username_+/__note-editor.tsx @@ -96,7 +96,7 @@ export async function action({ request, params }: ActionFunctionArgs) { id: i.id, altText: i.altText, contentType: i.file.type, - blob: Buffer.from(await i.file.arrayBuffer()), + blob: new Uint8Array(await i.file.arrayBuffer()), } } else { return { id: i.id, altText: i.altText } @@ -111,7 +111,7 @@ export async function action({ request, params }: ActionFunctionArgs) { return { altText: image.altText, contentType: image.file.type, - blob: Buffer.from(await image.file.arrayBuffer()), + blob: new Uint8Array(await image.file.arrayBuffer()), } }), ), diff --git a/exercises/05.component-test/01.problem.init/app/utils/misc.tsx b/exercises/05.component-test/01.problem.init/app/utils/misc.tsx index 8879f6b41..a553484db 100644 --- a/exercises/05.component-test/01.problem.init/app/utils/misc.tsx +++ b/exercises/05.component-test/01.problem.init/app/utils/misc.tsx @@ -303,7 +303,7 @@ export async function downloadFile(url: string, retries: number = 0) { throw new Error(`Failed to fetch image with status ${response.status}`) } const contentType = response.headers.get('content-type') ?? 'image/jpg' - const blob = Buffer.from(await response.arrayBuffer()) + const blob = new Uint8Array(await response.arrayBuffer()) return { contentType, blob } } catch (e) { if (retries > MAX_RETRIES) throw e diff --git a/exercises/05.component-test/01.problem.init/index.js b/exercises/05.component-test/01.problem.init/index.js index 8ba83ba70..e8728a002 100644 --- a/exercises/05.component-test/01.problem.init/index.js +++ b/exercises/05.component-test/01.problem.init/index.js @@ -1,11 +1,8 @@ import 'dotenv/config' import 'source-map-support/register.js' -import { installGlobals } from '@remix-run/node' import chalk from 'chalk' import closeWithGrace from 'close-with-grace' -installGlobals() - if ( process.env.NODE_ENV !== 'production' || process.env.PLAYWRIGHT_TEST_BASE_URL diff --git a/exercises/05.component-test/01.problem.init/package.json b/exercises/05.component-test/01.problem.init/package.json index f943e4aa8..1573f4c58 100644 --- a/exercises/05.component-test/01.problem.init/package.json +++ b/exercises/05.component-test/01.problem.init/package.json @@ -30,9 +30,8 @@ "@conform-to/zod": "^0.9.0", "@epic-web/remember": "^1.1.0", "@epic-web/totp": "^1.1.2", - "@epic-web/workshop-utils": "^4.21.1", "@paralleldrive/cuid2": "^2.2.2", - "@prisma/client": "^5.16.2", + "@prisma/client": "^6.19.1", "@radix-ui/react-checkbox": "^1.1.1", "@radix-ui/react-dropdown-menu": "^2.1.1", "@radix-ui/react-label": "^2.1.0", @@ -59,13 +58,13 @@ "glob": "^11.0.0", "isbot": "^5.1.12", "morgan": "^1.10.0", - "prisma": "^5.16.2", + "prisma": "^6.19.1", "qrcode": "^1.5.3", "react": "^18.3.1", "react-dom": "^18.3.1", "remix-auth": "^3.7.0", "remix-auth-form": "^1.5.0", - "remix-auth-github": "^1.7.0", + "remix-auth-github": "1.7.0", "remix-utils": "^7.6.0", "sonner": "^1.5.0", "source-map-support": "^0.5.21", @@ -111,7 +110,7 @@ "execa": "^9.3.0", "fs-extra": "^11.2.0", "jsdom": "^24.1.0", - "msw": "^2.3.1", + "msw": "^2.12.4", "node-html-parser": "^6.1.13", "npm-run-all": "^4.1.5", "prettier": "^3.3.2", diff --git a/exercises/05.component-test/01.problem.init/tests/db-utils.ts b/exercises/05.component-test/01.problem.init/tests/db-utils.ts index 8f5062e16..2e1e23550 100644 --- a/exercises/05.component-test/01.problem.init/tests/db-utils.ts +++ b/exercises/05.component-test/01.problem.init/tests/db-utils.ts @@ -67,7 +67,7 @@ export async function getNoteImages() { }), img({ altText: - 'an office full of laptops and other office equipment that look like it was abandond in a rush out of the building in an emergency years ago.', + 'an office full of laptops and other office equipment that look like it was abandoned in a rush out of the building in an emergency years ago.', filepath: './tests/fixtures/images/notes/6.png', }), img({ @@ -110,6 +110,6 @@ export async function img({ return { altText, contentType: filepath.endsWith('.png') ? 'image/png' : 'image/jpeg', - blob: await fs.promises.readFile(filepath), + blob: new Uint8Array(await fs.promises.readFile(filepath)), } } diff --git a/exercises/05.component-test/01.problem.init/tests/e2e/onboarding.test.ts b/exercises/05.component-test/01.problem.init/tests/e2e/onboarding.test.ts index cd39afab3..88303b8c0 100644 --- a/exercises/05.component-test/01.problem.init/tests/e2e/onboarding.test.ts +++ b/exercises/05.component-test/01.problem.init/tests/e2e/onboarding.test.ts @@ -49,9 +49,7 @@ test('onboarding with link', async ({ page, getOnboardingData }) => { await page.getByRole('textbox', { name: /email/i }).fill(onboardingData.email) await page.getByRole('button', { name: /submit/i }).click() - await expect( - page.getByRole('button', { name: /submit/i, disabled: true }), - ).toBeVisible() + await expect(page.getByText(/check your email/i)).toBeVisible() const email = await waitFor(() => requireEmail(onboardingData.email)) diff --git a/exercises/05.component-test/01.problem.init/tests/setup/setup-test-env.ts b/exercises/05.component-test/01.problem.init/tests/setup/setup-test-env.ts index 4ec4aa677..c4992516d 100644 --- a/exercises/05.component-test/01.problem.init/tests/setup/setup-test-env.ts +++ b/exercises/05.component-test/01.problem.init/tests/setup/setup-test-env.ts @@ -1,11 +1,8 @@ import 'dotenv/config' import '#app/utils/env.server.ts' import '@testing-library/jest-dom/vitest' -import { installGlobals } from '@remix-run/node' import { beforeEach, vi, type MockInstance } from 'vitest' -installGlobals() - export let consoleError: MockInstance beforeEach(() => { diff --git a/exercises/05.component-test/01.solution.init/app/epicshop.tsx b/exercises/05.component-test/01.solution.init/app/epicshop.tsx deleted file mode 100644 index 96c5597cb..000000000 --- a/exercises/05.component-test/01.solution.init/app/epicshop.tsx +++ /dev/null @@ -1,9 +0,0 @@ -// Ignore this file please -import { EpicShopIFrameSync } from '@epic-web/workshop-utils/iframe-sync' -import { useNavigate } from '@remix-run/react' -import * as React from 'react' - -export function EpicShop() { - const navigate = useNavigate() - return -} diff --git a/exercises/05.component-test/01.solution.init/app/root.tsx b/exercises/05.component-test/01.solution.init/app/root.tsx index 3b2064a1a..fa7f41981 100644 --- a/exercises/05.component-test/01.solution.init/app/root.tsx +++ b/exercises/05.component-test/01.solution.init/app/root.tsx @@ -34,7 +34,6 @@ import { SearchBar } from './components/search-bar.tsx' import { Spacer } from './components/spacer.tsx' import { Button } from './components/ui/button.tsx' import { Icon } from './components/ui/icon.tsx' -import { EpicShop } from './epicshop.tsx' import fontStylestylesheetUrl from './styles/font.css' import tailwindStylesheetUrl from './styles/tailwind.css' import { getUserId } from './utils/auth.server.ts' @@ -159,7 +158,6 @@ function Document({ - diff --git a/exercises/05.component-test/01.solution.init/app/routes/resources+/note-images.$imageId.tsx b/exercises/05.component-test/01.solution.init/app/routes/resources+/note-images.$imageId.tsx index 417545a3e..865878a92 100644 --- a/exercises/05.component-test/01.solution.init/app/routes/resources+/note-images.$imageId.tsx +++ b/exercises/05.component-test/01.solution.init/app/routes/resources+/note-images.$imageId.tsx @@ -14,7 +14,7 @@ export async function loader({ params }: LoaderFunctionArgs) { return new Response(image.blob, { headers: { 'content-type': image.contentType, - 'content-length': Buffer.byteLength(image.blob).toString(), + 'content-length': image.blob.length.toString(), 'content-disposition': `inline; filename="${params.imageId}"`, 'cache-control': 'public, max-age=31536000, immutable', }, diff --git a/exercises/05.component-test/01.solution.init/app/routes/resources+/user-images.$imageId.tsx b/exercises/05.component-test/01.solution.init/app/routes/resources+/user-images.$imageId.tsx index c5a66b146..2de45198e 100644 --- a/exercises/05.component-test/01.solution.init/app/routes/resources+/user-images.$imageId.tsx +++ b/exercises/05.component-test/01.solution.init/app/routes/resources+/user-images.$imageId.tsx @@ -14,7 +14,7 @@ export async function loader({ params }: LoaderFunctionArgs) { return new Response(image.blob, { headers: { 'content-type': image.contentType, - 'content-length': Buffer.byteLength(image.blob).toString(), + 'content-length': image.blob.length.toString(), 'content-disposition': `inline; filename="${params.imageId}"`, 'cache-control': 'public, max-age=31536000, immutable', }, diff --git a/exercises/05.component-test/01.solution.init/app/routes/settings+/profile.photo.tsx b/exercises/05.component-test/01.solution.init/app/routes/settings+/profile.photo.tsx index f452baf9a..36e397f0b 100644 --- a/exercises/05.component-test/01.solution.init/app/routes/settings+/profile.photo.tsx +++ b/exercises/05.component-test/01.solution.init/app/routes/settings+/profile.photo.tsx @@ -76,7 +76,7 @@ export async function action({ request }: ActionFunctionArgs) { return { image: { contentType: data.photoFile.type, - blob: Buffer.from(await data.photoFile.arrayBuffer()), + blob: new Uint8Array(await data.photoFile.arrayBuffer()), }, } }), diff --git a/exercises/05.component-test/01.solution.init/app/routes/users+/$username_+/__note-editor.tsx b/exercises/05.component-test/01.solution.init/app/routes/users+/$username_+/__note-editor.tsx index 714fa7baf..7c8ee2109 100644 --- a/exercises/05.component-test/01.solution.init/app/routes/users+/$username_+/__note-editor.tsx +++ b/exercises/05.component-test/01.solution.init/app/routes/users+/$username_+/__note-editor.tsx @@ -96,7 +96,7 @@ export async function action({ request, params }: ActionFunctionArgs) { id: i.id, altText: i.altText, contentType: i.file.type, - blob: Buffer.from(await i.file.arrayBuffer()), + blob: new Uint8Array(await i.file.arrayBuffer()), } } else { return { id: i.id, altText: i.altText } @@ -111,7 +111,7 @@ export async function action({ request, params }: ActionFunctionArgs) { return { altText: image.altText, contentType: image.file.type, - blob: Buffer.from(await image.file.arrayBuffer()), + blob: new Uint8Array(await image.file.arrayBuffer()), } }), ), diff --git a/exercises/05.component-test/01.solution.init/app/utils/misc.tsx b/exercises/05.component-test/01.solution.init/app/utils/misc.tsx index 8879f6b41..a553484db 100644 --- a/exercises/05.component-test/01.solution.init/app/utils/misc.tsx +++ b/exercises/05.component-test/01.solution.init/app/utils/misc.tsx @@ -303,7 +303,7 @@ export async function downloadFile(url: string, retries: number = 0) { throw new Error(`Failed to fetch image with status ${response.status}`) } const contentType = response.headers.get('content-type') ?? 'image/jpg' - const blob = Buffer.from(await response.arrayBuffer()) + const blob = new Uint8Array(await response.arrayBuffer()) return { contentType, blob } } catch (e) { if (retries > MAX_RETRIES) throw e diff --git a/exercises/05.component-test/01.solution.init/index.js b/exercises/05.component-test/01.solution.init/index.js index 8ba83ba70..e8728a002 100644 --- a/exercises/05.component-test/01.solution.init/index.js +++ b/exercises/05.component-test/01.solution.init/index.js @@ -1,11 +1,8 @@ import 'dotenv/config' import 'source-map-support/register.js' -import { installGlobals } from '@remix-run/node' import chalk from 'chalk' import closeWithGrace from 'close-with-grace' -installGlobals() - if ( process.env.NODE_ENV !== 'production' || process.env.PLAYWRIGHT_TEST_BASE_URL diff --git a/exercises/05.component-test/01.solution.init/package.json b/exercises/05.component-test/01.solution.init/package.json index 210b9c552..0422d61e6 100644 --- a/exercises/05.component-test/01.solution.init/package.json +++ b/exercises/05.component-test/01.solution.init/package.json @@ -30,9 +30,8 @@ "@conform-to/zod": "^0.9.0", "@epic-web/remember": "^1.1.0", "@epic-web/totp": "^1.1.2", - "@epic-web/workshop-utils": "^4.21.1", "@paralleldrive/cuid2": "^2.2.2", - "@prisma/client": "^5.16.2", + "@prisma/client": "^6.19.1", "@radix-ui/react-checkbox": "^1.1.1", "@radix-ui/react-dropdown-menu": "^2.1.1", "@radix-ui/react-label": "^2.1.0", @@ -59,13 +58,13 @@ "glob": "^11.0.0", "isbot": "^5.1.12", "morgan": "^1.10.0", - "prisma": "^5.16.2", + "prisma": "^6.19.1", "qrcode": "^1.5.3", "react": "^18.3.1", "react-dom": "^18.3.1", "remix-auth": "^3.7.0", "remix-auth-form": "^1.5.0", - "remix-auth-github": "^1.7.0", + "remix-auth-github": "1.7.0", "remix-utils": "^7.6.0", "sonner": "^1.5.0", "source-map-support": "^0.5.21", @@ -111,7 +110,7 @@ "execa": "^9.3.0", "fs-extra": "^11.2.0", "jsdom": "^24.1.0", - "msw": "^2.3.1", + "msw": "^2.12.4", "node-html-parser": "^6.1.13", "npm-run-all": "^4.1.5", "prettier": "^3.3.2", diff --git a/exercises/05.component-test/01.solution.init/tests/db-utils.ts b/exercises/05.component-test/01.solution.init/tests/db-utils.ts index 8f5062e16..2e1e23550 100644 --- a/exercises/05.component-test/01.solution.init/tests/db-utils.ts +++ b/exercises/05.component-test/01.solution.init/tests/db-utils.ts @@ -67,7 +67,7 @@ export async function getNoteImages() { }), img({ altText: - 'an office full of laptops and other office equipment that look like it was abandond in a rush out of the building in an emergency years ago.', + 'an office full of laptops and other office equipment that look like it was abandoned in a rush out of the building in an emergency years ago.', filepath: './tests/fixtures/images/notes/6.png', }), img({ @@ -110,6 +110,6 @@ export async function img({ return { altText, contentType: filepath.endsWith('.png') ? 'image/png' : 'image/jpeg', - blob: await fs.promises.readFile(filepath), + blob: new Uint8Array(await fs.promises.readFile(filepath)), } } diff --git a/exercises/05.component-test/01.solution.init/tests/e2e/onboarding.test.ts b/exercises/05.component-test/01.solution.init/tests/e2e/onboarding.test.ts index cd39afab3..88303b8c0 100644 --- a/exercises/05.component-test/01.solution.init/tests/e2e/onboarding.test.ts +++ b/exercises/05.component-test/01.solution.init/tests/e2e/onboarding.test.ts @@ -49,9 +49,7 @@ test('onboarding with link', async ({ page, getOnboardingData }) => { await page.getByRole('textbox', { name: /email/i }).fill(onboardingData.email) await page.getByRole('button', { name: /submit/i }).click() - await expect( - page.getByRole('button', { name: /submit/i, disabled: true }), - ).toBeVisible() + await expect(page.getByText(/check your email/i)).toBeVisible() const email = await waitFor(() => requireEmail(onboardingData.email)) diff --git a/exercises/05.component-test/01.solution.init/tests/setup/setup-test-env.ts b/exercises/05.component-test/01.solution.init/tests/setup/setup-test-env.ts index 4ec4aa677..c4992516d 100644 --- a/exercises/05.component-test/01.solution.init/tests/setup/setup-test-env.ts +++ b/exercises/05.component-test/01.solution.init/tests/setup/setup-test-env.ts @@ -1,11 +1,8 @@ import 'dotenv/config' import '#app/utils/env.server.ts' import '@testing-library/jest-dom/vitest' -import { installGlobals } from '@remix-run/node' import { beforeEach, vi, type MockInstance } from 'vitest' -installGlobals() - export let consoleError: MockInstance beforeEach(() => { diff --git a/exercises/05.component-test/02.problem.cleanup/app/epicshop.tsx b/exercises/05.component-test/02.problem.cleanup/app/epicshop.tsx deleted file mode 100644 index 96c5597cb..000000000 --- a/exercises/05.component-test/02.problem.cleanup/app/epicshop.tsx +++ /dev/null @@ -1,9 +0,0 @@ -// Ignore this file please -import { EpicShopIFrameSync } from '@epic-web/workshop-utils/iframe-sync' -import { useNavigate } from '@remix-run/react' -import * as React from 'react' - -export function EpicShop() { - const navigate = useNavigate() - return -} diff --git a/exercises/05.component-test/02.problem.cleanup/app/root.tsx b/exercises/05.component-test/02.problem.cleanup/app/root.tsx index 3b2064a1a..fa7f41981 100644 --- a/exercises/05.component-test/02.problem.cleanup/app/root.tsx +++ b/exercises/05.component-test/02.problem.cleanup/app/root.tsx @@ -34,7 +34,6 @@ import { SearchBar } from './components/search-bar.tsx' import { Spacer } from './components/spacer.tsx' import { Button } from './components/ui/button.tsx' import { Icon } from './components/ui/icon.tsx' -import { EpicShop } from './epicshop.tsx' import fontStylestylesheetUrl from './styles/font.css' import tailwindStylesheetUrl from './styles/tailwind.css' import { getUserId } from './utils/auth.server.ts' @@ -159,7 +158,6 @@ function Document({ - diff --git a/exercises/05.component-test/02.problem.cleanup/app/routes/resources+/note-images.$imageId.tsx b/exercises/05.component-test/02.problem.cleanup/app/routes/resources+/note-images.$imageId.tsx index 417545a3e..865878a92 100644 --- a/exercises/05.component-test/02.problem.cleanup/app/routes/resources+/note-images.$imageId.tsx +++ b/exercises/05.component-test/02.problem.cleanup/app/routes/resources+/note-images.$imageId.tsx @@ -14,7 +14,7 @@ export async function loader({ params }: LoaderFunctionArgs) { return new Response(image.blob, { headers: { 'content-type': image.contentType, - 'content-length': Buffer.byteLength(image.blob).toString(), + 'content-length': image.blob.length.toString(), 'content-disposition': `inline; filename="${params.imageId}"`, 'cache-control': 'public, max-age=31536000, immutable', }, diff --git a/exercises/05.component-test/02.problem.cleanup/app/routes/resources+/user-images.$imageId.tsx b/exercises/05.component-test/02.problem.cleanup/app/routes/resources+/user-images.$imageId.tsx index c5a66b146..2de45198e 100644 --- a/exercises/05.component-test/02.problem.cleanup/app/routes/resources+/user-images.$imageId.tsx +++ b/exercises/05.component-test/02.problem.cleanup/app/routes/resources+/user-images.$imageId.tsx @@ -14,7 +14,7 @@ export async function loader({ params }: LoaderFunctionArgs) { return new Response(image.blob, { headers: { 'content-type': image.contentType, - 'content-length': Buffer.byteLength(image.blob).toString(), + 'content-length': image.blob.length.toString(), 'content-disposition': `inline; filename="${params.imageId}"`, 'cache-control': 'public, max-age=31536000, immutable', }, diff --git a/exercises/05.component-test/02.problem.cleanup/app/routes/settings+/profile.photo.tsx b/exercises/05.component-test/02.problem.cleanup/app/routes/settings+/profile.photo.tsx index f452baf9a..36e397f0b 100644 --- a/exercises/05.component-test/02.problem.cleanup/app/routes/settings+/profile.photo.tsx +++ b/exercises/05.component-test/02.problem.cleanup/app/routes/settings+/profile.photo.tsx @@ -76,7 +76,7 @@ export async function action({ request }: ActionFunctionArgs) { return { image: { contentType: data.photoFile.type, - blob: Buffer.from(await data.photoFile.arrayBuffer()), + blob: new Uint8Array(await data.photoFile.arrayBuffer()), }, } }), diff --git a/exercises/05.component-test/02.problem.cleanup/app/routes/users+/$username_+/__note-editor.tsx b/exercises/05.component-test/02.problem.cleanup/app/routes/users+/$username_+/__note-editor.tsx index 714fa7baf..7c8ee2109 100644 --- a/exercises/05.component-test/02.problem.cleanup/app/routes/users+/$username_+/__note-editor.tsx +++ b/exercises/05.component-test/02.problem.cleanup/app/routes/users+/$username_+/__note-editor.tsx @@ -96,7 +96,7 @@ export async function action({ request, params }: ActionFunctionArgs) { id: i.id, altText: i.altText, contentType: i.file.type, - blob: Buffer.from(await i.file.arrayBuffer()), + blob: new Uint8Array(await i.file.arrayBuffer()), } } else { return { id: i.id, altText: i.altText } @@ -111,7 +111,7 @@ export async function action({ request, params }: ActionFunctionArgs) { return { altText: image.altText, contentType: image.file.type, - blob: Buffer.from(await image.file.arrayBuffer()), + blob: new Uint8Array(await image.file.arrayBuffer()), } }), ), diff --git a/exercises/05.component-test/02.problem.cleanup/app/utils/misc.tsx b/exercises/05.component-test/02.problem.cleanup/app/utils/misc.tsx index 8879f6b41..a553484db 100644 --- a/exercises/05.component-test/02.problem.cleanup/app/utils/misc.tsx +++ b/exercises/05.component-test/02.problem.cleanup/app/utils/misc.tsx @@ -303,7 +303,7 @@ export async function downloadFile(url: string, retries: number = 0) { throw new Error(`Failed to fetch image with status ${response.status}`) } const contentType = response.headers.get('content-type') ?? 'image/jpg' - const blob = Buffer.from(await response.arrayBuffer()) + const blob = new Uint8Array(await response.arrayBuffer()) return { contentType, blob } } catch (e) { if (retries > MAX_RETRIES) throw e diff --git a/exercises/05.component-test/02.problem.cleanup/index.js b/exercises/05.component-test/02.problem.cleanup/index.js index 8ba83ba70..e8728a002 100644 --- a/exercises/05.component-test/02.problem.cleanup/index.js +++ b/exercises/05.component-test/02.problem.cleanup/index.js @@ -1,11 +1,8 @@ import 'dotenv/config' import 'source-map-support/register.js' -import { installGlobals } from '@remix-run/node' import chalk from 'chalk' import closeWithGrace from 'close-with-grace' -installGlobals() - if ( process.env.NODE_ENV !== 'production' || process.env.PLAYWRIGHT_TEST_BASE_URL diff --git a/exercises/05.component-test/02.problem.cleanup/package.json b/exercises/05.component-test/02.problem.cleanup/package.json index 40fa4ff9a..39319936f 100644 --- a/exercises/05.component-test/02.problem.cleanup/package.json +++ b/exercises/05.component-test/02.problem.cleanup/package.json @@ -30,9 +30,8 @@ "@conform-to/zod": "^0.9.0", "@epic-web/remember": "^1.1.0", "@epic-web/totp": "^1.1.2", - "@epic-web/workshop-utils": "^4.21.1", "@paralleldrive/cuid2": "^2.2.2", - "@prisma/client": "^5.16.2", + "@prisma/client": "^6.19.1", "@radix-ui/react-checkbox": "^1.1.1", "@radix-ui/react-dropdown-menu": "^2.1.1", "@radix-ui/react-label": "^2.1.0", @@ -59,13 +58,13 @@ "glob": "^11.0.0", "isbot": "^5.1.12", "morgan": "^1.10.0", - "prisma": "^5.16.2", + "prisma": "^6.19.1", "qrcode": "^1.5.3", "react": "^18.3.1", "react-dom": "^18.3.1", "remix-auth": "^3.7.0", "remix-auth-form": "^1.5.0", - "remix-auth-github": "^1.7.0", + "remix-auth-github": "1.7.0", "remix-utils": "^7.6.0", "sonner": "^1.5.0", "source-map-support": "^0.5.21", @@ -111,7 +110,7 @@ "execa": "^9.3.0", "fs-extra": "^11.2.0", "jsdom": "^24.1.0", - "msw": "^2.3.1", + "msw": "^2.12.4", "node-html-parser": "^6.1.13", "npm-run-all": "^4.1.5", "prettier": "^3.3.2", diff --git a/exercises/05.component-test/02.problem.cleanup/tests/db-utils.ts b/exercises/05.component-test/02.problem.cleanup/tests/db-utils.ts index 8f5062e16..2e1e23550 100644 --- a/exercises/05.component-test/02.problem.cleanup/tests/db-utils.ts +++ b/exercises/05.component-test/02.problem.cleanup/tests/db-utils.ts @@ -67,7 +67,7 @@ export async function getNoteImages() { }), img({ altText: - 'an office full of laptops and other office equipment that look like it was abandond in a rush out of the building in an emergency years ago.', + 'an office full of laptops and other office equipment that look like it was abandoned in a rush out of the building in an emergency years ago.', filepath: './tests/fixtures/images/notes/6.png', }), img({ @@ -110,6 +110,6 @@ export async function img({ return { altText, contentType: filepath.endsWith('.png') ? 'image/png' : 'image/jpeg', - blob: await fs.promises.readFile(filepath), + blob: new Uint8Array(await fs.promises.readFile(filepath)), } } diff --git a/exercises/05.component-test/02.problem.cleanup/tests/e2e/onboarding.test.ts b/exercises/05.component-test/02.problem.cleanup/tests/e2e/onboarding.test.ts index cd39afab3..88303b8c0 100644 --- a/exercises/05.component-test/02.problem.cleanup/tests/e2e/onboarding.test.ts +++ b/exercises/05.component-test/02.problem.cleanup/tests/e2e/onboarding.test.ts @@ -49,9 +49,7 @@ test('onboarding with link', async ({ page, getOnboardingData }) => { await page.getByRole('textbox', { name: /email/i }).fill(onboardingData.email) await page.getByRole('button', { name: /submit/i }).click() - await expect( - page.getByRole('button', { name: /submit/i, disabled: true }), - ).toBeVisible() + await expect(page.getByText(/check your email/i)).toBeVisible() const email = await waitFor(() => requireEmail(onboardingData.email)) diff --git a/exercises/05.component-test/02.problem.cleanup/tests/setup/setup-test-env.ts b/exercises/05.component-test/02.problem.cleanup/tests/setup/setup-test-env.ts index 4ec4aa677..c4992516d 100644 --- a/exercises/05.component-test/02.problem.cleanup/tests/setup/setup-test-env.ts +++ b/exercises/05.component-test/02.problem.cleanup/tests/setup/setup-test-env.ts @@ -1,11 +1,8 @@ import 'dotenv/config' import '#app/utils/env.server.ts' import '@testing-library/jest-dom/vitest' -import { installGlobals } from '@remix-run/node' import { beforeEach, vi, type MockInstance } from 'vitest' -installGlobals() - export let consoleError: MockInstance beforeEach(() => { diff --git a/exercises/05.component-test/02.solution.cleanup/app/epicshop.tsx b/exercises/05.component-test/02.solution.cleanup/app/epicshop.tsx deleted file mode 100644 index 96c5597cb..000000000 --- a/exercises/05.component-test/02.solution.cleanup/app/epicshop.tsx +++ /dev/null @@ -1,9 +0,0 @@ -// Ignore this file please -import { EpicShopIFrameSync } from '@epic-web/workshop-utils/iframe-sync' -import { useNavigate } from '@remix-run/react' -import * as React from 'react' - -export function EpicShop() { - const navigate = useNavigate() - return -} diff --git a/exercises/05.component-test/02.solution.cleanup/app/root.tsx b/exercises/05.component-test/02.solution.cleanup/app/root.tsx index 3b2064a1a..fa7f41981 100644 --- a/exercises/05.component-test/02.solution.cleanup/app/root.tsx +++ b/exercises/05.component-test/02.solution.cleanup/app/root.tsx @@ -34,7 +34,6 @@ import { SearchBar } from './components/search-bar.tsx' import { Spacer } from './components/spacer.tsx' import { Button } from './components/ui/button.tsx' import { Icon } from './components/ui/icon.tsx' -import { EpicShop } from './epicshop.tsx' import fontStylestylesheetUrl from './styles/font.css' import tailwindStylesheetUrl from './styles/tailwind.css' import { getUserId } from './utils/auth.server.ts' @@ -159,7 +158,6 @@ function Document({ - diff --git a/exercises/05.component-test/02.solution.cleanup/app/routes/resources+/note-images.$imageId.tsx b/exercises/05.component-test/02.solution.cleanup/app/routes/resources+/note-images.$imageId.tsx index 417545a3e..865878a92 100644 --- a/exercises/05.component-test/02.solution.cleanup/app/routes/resources+/note-images.$imageId.tsx +++ b/exercises/05.component-test/02.solution.cleanup/app/routes/resources+/note-images.$imageId.tsx @@ -14,7 +14,7 @@ export async function loader({ params }: LoaderFunctionArgs) { return new Response(image.blob, { headers: { 'content-type': image.contentType, - 'content-length': Buffer.byteLength(image.blob).toString(), + 'content-length': image.blob.length.toString(), 'content-disposition': `inline; filename="${params.imageId}"`, 'cache-control': 'public, max-age=31536000, immutable', }, diff --git a/exercises/05.component-test/02.solution.cleanup/app/routes/resources+/user-images.$imageId.tsx b/exercises/05.component-test/02.solution.cleanup/app/routes/resources+/user-images.$imageId.tsx index c5a66b146..2de45198e 100644 --- a/exercises/05.component-test/02.solution.cleanup/app/routes/resources+/user-images.$imageId.tsx +++ b/exercises/05.component-test/02.solution.cleanup/app/routes/resources+/user-images.$imageId.tsx @@ -14,7 +14,7 @@ export async function loader({ params }: LoaderFunctionArgs) { return new Response(image.blob, { headers: { 'content-type': image.contentType, - 'content-length': Buffer.byteLength(image.blob).toString(), + 'content-length': image.blob.length.toString(), 'content-disposition': `inline; filename="${params.imageId}"`, 'cache-control': 'public, max-age=31536000, immutable', }, diff --git a/exercises/05.component-test/02.solution.cleanup/app/routes/settings+/profile.photo.tsx b/exercises/05.component-test/02.solution.cleanup/app/routes/settings+/profile.photo.tsx index f452baf9a..36e397f0b 100644 --- a/exercises/05.component-test/02.solution.cleanup/app/routes/settings+/profile.photo.tsx +++ b/exercises/05.component-test/02.solution.cleanup/app/routes/settings+/profile.photo.tsx @@ -76,7 +76,7 @@ export async function action({ request }: ActionFunctionArgs) { return { image: { contentType: data.photoFile.type, - blob: Buffer.from(await data.photoFile.arrayBuffer()), + blob: new Uint8Array(await data.photoFile.arrayBuffer()), }, } }), diff --git a/exercises/05.component-test/02.solution.cleanup/app/routes/users+/$username_+/__note-editor.tsx b/exercises/05.component-test/02.solution.cleanup/app/routes/users+/$username_+/__note-editor.tsx index 714fa7baf..7c8ee2109 100644 --- a/exercises/05.component-test/02.solution.cleanup/app/routes/users+/$username_+/__note-editor.tsx +++ b/exercises/05.component-test/02.solution.cleanup/app/routes/users+/$username_+/__note-editor.tsx @@ -96,7 +96,7 @@ export async function action({ request, params }: ActionFunctionArgs) { id: i.id, altText: i.altText, contentType: i.file.type, - blob: Buffer.from(await i.file.arrayBuffer()), + blob: new Uint8Array(await i.file.arrayBuffer()), } } else { return { id: i.id, altText: i.altText } @@ -111,7 +111,7 @@ export async function action({ request, params }: ActionFunctionArgs) { return { altText: image.altText, contentType: image.file.type, - blob: Buffer.from(await image.file.arrayBuffer()), + blob: new Uint8Array(await image.file.arrayBuffer()), } }), ), diff --git a/exercises/05.component-test/02.solution.cleanup/app/utils/misc.tsx b/exercises/05.component-test/02.solution.cleanup/app/utils/misc.tsx index 8879f6b41..a553484db 100644 --- a/exercises/05.component-test/02.solution.cleanup/app/utils/misc.tsx +++ b/exercises/05.component-test/02.solution.cleanup/app/utils/misc.tsx @@ -303,7 +303,7 @@ export async function downloadFile(url: string, retries: number = 0) { throw new Error(`Failed to fetch image with status ${response.status}`) } const contentType = response.headers.get('content-type') ?? 'image/jpg' - const blob = Buffer.from(await response.arrayBuffer()) + const blob = new Uint8Array(await response.arrayBuffer()) return { contentType, blob } } catch (e) { if (retries > MAX_RETRIES) throw e diff --git a/exercises/05.component-test/02.solution.cleanup/index.js b/exercises/05.component-test/02.solution.cleanup/index.js index 8ba83ba70..e8728a002 100644 --- a/exercises/05.component-test/02.solution.cleanup/index.js +++ b/exercises/05.component-test/02.solution.cleanup/index.js @@ -1,11 +1,8 @@ import 'dotenv/config' import 'source-map-support/register.js' -import { installGlobals } from '@remix-run/node' import chalk from 'chalk' import closeWithGrace from 'close-with-grace' -installGlobals() - if ( process.env.NODE_ENV !== 'production' || process.env.PLAYWRIGHT_TEST_BASE_URL diff --git a/exercises/05.component-test/02.solution.cleanup/package.json b/exercises/05.component-test/02.solution.cleanup/package.json index 3dde72d66..8bec751d9 100644 --- a/exercises/05.component-test/02.solution.cleanup/package.json +++ b/exercises/05.component-test/02.solution.cleanup/package.json @@ -30,9 +30,8 @@ "@conform-to/zod": "^0.9.0", "@epic-web/remember": "^1.1.0", "@epic-web/totp": "^1.1.2", - "@epic-web/workshop-utils": "^4.21.1", "@paralleldrive/cuid2": "^2.2.2", - "@prisma/client": "^5.16.2", + "@prisma/client": "^6.19.1", "@radix-ui/react-checkbox": "^1.1.1", "@radix-ui/react-dropdown-menu": "^2.1.1", "@radix-ui/react-label": "^2.1.0", @@ -59,13 +58,13 @@ "glob": "^11.0.0", "isbot": "^5.1.12", "morgan": "^1.10.0", - "prisma": "^5.16.2", + "prisma": "^6.19.1", "qrcode": "^1.5.3", "react": "^18.3.1", "react-dom": "^18.3.1", "remix-auth": "^3.7.0", "remix-auth-form": "^1.5.0", - "remix-auth-github": "^1.7.0", + "remix-auth-github": "1.7.0", "remix-utils": "^7.6.0", "sonner": "^1.5.0", "source-map-support": "^0.5.21", @@ -111,7 +110,7 @@ "execa": "^9.3.0", "fs-extra": "^11.2.0", "jsdom": "^24.1.0", - "msw": "^2.3.1", + "msw": "^2.12.4", "node-html-parser": "^6.1.13", "npm-run-all": "^4.1.5", "prettier": "^3.3.2", diff --git a/exercises/05.component-test/02.solution.cleanup/tests/db-utils.ts b/exercises/05.component-test/02.solution.cleanup/tests/db-utils.ts index 8f5062e16..2e1e23550 100644 --- a/exercises/05.component-test/02.solution.cleanup/tests/db-utils.ts +++ b/exercises/05.component-test/02.solution.cleanup/tests/db-utils.ts @@ -67,7 +67,7 @@ export async function getNoteImages() { }), img({ altText: - 'an office full of laptops and other office equipment that look like it was abandond in a rush out of the building in an emergency years ago.', + 'an office full of laptops and other office equipment that look like it was abandoned in a rush out of the building in an emergency years ago.', filepath: './tests/fixtures/images/notes/6.png', }), img({ @@ -110,6 +110,6 @@ export async function img({ return { altText, contentType: filepath.endsWith('.png') ? 'image/png' : 'image/jpeg', - blob: await fs.promises.readFile(filepath), + blob: new Uint8Array(await fs.promises.readFile(filepath)), } } diff --git a/exercises/05.component-test/02.solution.cleanup/tests/e2e/onboarding.test.ts b/exercises/05.component-test/02.solution.cleanup/tests/e2e/onboarding.test.ts index cd39afab3..88303b8c0 100644 --- a/exercises/05.component-test/02.solution.cleanup/tests/e2e/onboarding.test.ts +++ b/exercises/05.component-test/02.solution.cleanup/tests/e2e/onboarding.test.ts @@ -49,9 +49,7 @@ test('onboarding with link', async ({ page, getOnboardingData }) => { await page.getByRole('textbox', { name: /email/i }).fill(onboardingData.email) await page.getByRole('button', { name: /submit/i }).click() - await expect( - page.getByRole('button', { name: /submit/i, disabled: true }), - ).toBeVisible() + await expect(page.getByText(/check your email/i)).toBeVisible() const email = await waitFor(() => requireEmail(onboardingData.email)) diff --git a/exercises/05.component-test/02.solution.cleanup/tests/setup/setup-test-env.ts b/exercises/05.component-test/02.solution.cleanup/tests/setup/setup-test-env.ts index 4ec4aa677..c4992516d 100644 --- a/exercises/05.component-test/02.solution.cleanup/tests/setup/setup-test-env.ts +++ b/exercises/05.component-test/02.solution.cleanup/tests/setup/setup-test-env.ts @@ -1,11 +1,8 @@ import 'dotenv/config' import '#app/utils/env.server.ts' import '@testing-library/jest-dom/vitest' -import { installGlobals } from '@remix-run/node' import { beforeEach, vi, type MockInstance } from 'vitest' -installGlobals() - export let consoleError: MockInstance beforeEach(() => { diff --git a/exercises/06.hooks/01.problem.render-hook/app/epicshop.tsx b/exercises/06.hooks/01.problem.render-hook/app/epicshop.tsx deleted file mode 100644 index 96c5597cb..000000000 --- a/exercises/06.hooks/01.problem.render-hook/app/epicshop.tsx +++ /dev/null @@ -1,9 +0,0 @@ -// Ignore this file please -import { EpicShopIFrameSync } from '@epic-web/workshop-utils/iframe-sync' -import { useNavigate } from '@remix-run/react' -import * as React from 'react' - -export function EpicShop() { - const navigate = useNavigate() - return -} diff --git a/exercises/06.hooks/01.problem.render-hook/app/root.tsx b/exercises/06.hooks/01.problem.render-hook/app/root.tsx index 3b2064a1a..fa7f41981 100644 --- a/exercises/06.hooks/01.problem.render-hook/app/root.tsx +++ b/exercises/06.hooks/01.problem.render-hook/app/root.tsx @@ -34,7 +34,6 @@ import { SearchBar } from './components/search-bar.tsx' import { Spacer } from './components/spacer.tsx' import { Button } from './components/ui/button.tsx' import { Icon } from './components/ui/icon.tsx' -import { EpicShop } from './epicshop.tsx' import fontStylestylesheetUrl from './styles/font.css' import tailwindStylesheetUrl from './styles/tailwind.css' import { getUserId } from './utils/auth.server.ts' @@ -159,7 +158,6 @@ function Document({ - diff --git a/exercises/06.hooks/01.problem.render-hook/app/routes/resources+/note-images.$imageId.tsx b/exercises/06.hooks/01.problem.render-hook/app/routes/resources+/note-images.$imageId.tsx index 417545a3e..865878a92 100644 --- a/exercises/06.hooks/01.problem.render-hook/app/routes/resources+/note-images.$imageId.tsx +++ b/exercises/06.hooks/01.problem.render-hook/app/routes/resources+/note-images.$imageId.tsx @@ -14,7 +14,7 @@ export async function loader({ params }: LoaderFunctionArgs) { return new Response(image.blob, { headers: { 'content-type': image.contentType, - 'content-length': Buffer.byteLength(image.blob).toString(), + 'content-length': image.blob.length.toString(), 'content-disposition': `inline; filename="${params.imageId}"`, 'cache-control': 'public, max-age=31536000, immutable', }, diff --git a/exercises/06.hooks/01.problem.render-hook/app/routes/resources+/user-images.$imageId.tsx b/exercises/06.hooks/01.problem.render-hook/app/routes/resources+/user-images.$imageId.tsx index c5a66b146..2de45198e 100644 --- a/exercises/06.hooks/01.problem.render-hook/app/routes/resources+/user-images.$imageId.tsx +++ b/exercises/06.hooks/01.problem.render-hook/app/routes/resources+/user-images.$imageId.tsx @@ -14,7 +14,7 @@ export async function loader({ params }: LoaderFunctionArgs) { return new Response(image.blob, { headers: { 'content-type': image.contentType, - 'content-length': Buffer.byteLength(image.blob).toString(), + 'content-length': image.blob.length.toString(), 'content-disposition': `inline; filename="${params.imageId}"`, 'cache-control': 'public, max-age=31536000, immutable', }, diff --git a/exercises/06.hooks/01.problem.render-hook/app/routes/settings+/profile.photo.tsx b/exercises/06.hooks/01.problem.render-hook/app/routes/settings+/profile.photo.tsx index f452baf9a..36e397f0b 100644 --- a/exercises/06.hooks/01.problem.render-hook/app/routes/settings+/profile.photo.tsx +++ b/exercises/06.hooks/01.problem.render-hook/app/routes/settings+/profile.photo.tsx @@ -76,7 +76,7 @@ export async function action({ request }: ActionFunctionArgs) { return { image: { contentType: data.photoFile.type, - blob: Buffer.from(await data.photoFile.arrayBuffer()), + blob: new Uint8Array(await data.photoFile.arrayBuffer()), }, } }), diff --git a/exercises/06.hooks/01.problem.render-hook/app/routes/users+/$username_+/__note-editor.tsx b/exercises/06.hooks/01.problem.render-hook/app/routes/users+/$username_+/__note-editor.tsx index 714fa7baf..7c8ee2109 100644 --- a/exercises/06.hooks/01.problem.render-hook/app/routes/users+/$username_+/__note-editor.tsx +++ b/exercises/06.hooks/01.problem.render-hook/app/routes/users+/$username_+/__note-editor.tsx @@ -96,7 +96,7 @@ export async function action({ request, params }: ActionFunctionArgs) { id: i.id, altText: i.altText, contentType: i.file.type, - blob: Buffer.from(await i.file.arrayBuffer()), + blob: new Uint8Array(await i.file.arrayBuffer()), } } else { return { id: i.id, altText: i.altText } @@ -111,7 +111,7 @@ export async function action({ request, params }: ActionFunctionArgs) { return { altText: image.altText, contentType: image.file.type, - blob: Buffer.from(await image.file.arrayBuffer()), + blob: new Uint8Array(await image.file.arrayBuffer()), } }), ), diff --git a/exercises/06.hooks/01.problem.render-hook/app/utils/misc.tsx b/exercises/06.hooks/01.problem.render-hook/app/utils/misc.tsx index 8879f6b41..a553484db 100644 --- a/exercises/06.hooks/01.problem.render-hook/app/utils/misc.tsx +++ b/exercises/06.hooks/01.problem.render-hook/app/utils/misc.tsx @@ -303,7 +303,7 @@ export async function downloadFile(url: string, retries: number = 0) { throw new Error(`Failed to fetch image with status ${response.status}`) } const contentType = response.headers.get('content-type') ?? 'image/jpg' - const blob = Buffer.from(await response.arrayBuffer()) + const blob = new Uint8Array(await response.arrayBuffer()) return { contentType, blob } } catch (e) { if (retries > MAX_RETRIES) throw e diff --git a/exercises/06.hooks/01.problem.render-hook/index.js b/exercises/06.hooks/01.problem.render-hook/index.js index 8ba83ba70..e8728a002 100644 --- a/exercises/06.hooks/01.problem.render-hook/index.js +++ b/exercises/06.hooks/01.problem.render-hook/index.js @@ -1,11 +1,8 @@ import 'dotenv/config' import 'source-map-support/register.js' -import { installGlobals } from '@remix-run/node' import chalk from 'chalk' import closeWithGrace from 'close-with-grace' -installGlobals() - if ( process.env.NODE_ENV !== 'production' || process.env.PLAYWRIGHT_TEST_BASE_URL diff --git a/exercises/06.hooks/01.problem.render-hook/package.json b/exercises/06.hooks/01.problem.render-hook/package.json index aedc4354c..b26c02ced 100644 --- a/exercises/06.hooks/01.problem.render-hook/package.json +++ b/exercises/06.hooks/01.problem.render-hook/package.json @@ -30,9 +30,8 @@ "@conform-to/zod": "^0.9.0", "@epic-web/remember": "^1.1.0", "@epic-web/totp": "^1.1.2", - "@epic-web/workshop-utils": "^4.21.1", "@paralleldrive/cuid2": "^2.2.2", - "@prisma/client": "^5.16.2", + "@prisma/client": "^6.19.1", "@radix-ui/react-checkbox": "^1.1.1", "@radix-ui/react-dropdown-menu": "^2.1.1", "@radix-ui/react-label": "^2.1.0", @@ -59,13 +58,13 @@ "glob": "^11.0.0", "isbot": "^5.1.12", "morgan": "^1.10.0", - "prisma": "^5.16.2", + "prisma": "^6.19.1", "qrcode": "^1.5.3", "react": "^18.3.1", "react-dom": "^18.3.1", "remix-auth": "^3.7.0", "remix-auth-form": "^1.5.0", - "remix-auth-github": "^1.7.0", + "remix-auth-github": "1.7.0", "remix-utils": "^7.6.0", "sonner": "^1.5.0", "source-map-support": "^0.5.21", @@ -111,7 +110,7 @@ "execa": "^9.3.0", "fs-extra": "^11.2.0", "jsdom": "^24.1.0", - "msw": "^2.3.1", + "msw": "^2.12.4", "node-html-parser": "^6.1.13", "npm-run-all": "^4.1.5", "prettier": "^3.3.2", diff --git a/exercises/06.hooks/01.problem.render-hook/tests/db-utils.ts b/exercises/06.hooks/01.problem.render-hook/tests/db-utils.ts index 8f5062e16..2e1e23550 100644 --- a/exercises/06.hooks/01.problem.render-hook/tests/db-utils.ts +++ b/exercises/06.hooks/01.problem.render-hook/tests/db-utils.ts @@ -67,7 +67,7 @@ export async function getNoteImages() { }), img({ altText: - 'an office full of laptops and other office equipment that look like it was abandond in a rush out of the building in an emergency years ago.', + 'an office full of laptops and other office equipment that look like it was abandoned in a rush out of the building in an emergency years ago.', filepath: './tests/fixtures/images/notes/6.png', }), img({ @@ -110,6 +110,6 @@ export async function img({ return { altText, contentType: filepath.endsWith('.png') ? 'image/png' : 'image/jpeg', - blob: await fs.promises.readFile(filepath), + blob: new Uint8Array(await fs.promises.readFile(filepath)), } } diff --git a/exercises/06.hooks/01.problem.render-hook/tests/e2e/onboarding.test.ts b/exercises/06.hooks/01.problem.render-hook/tests/e2e/onboarding.test.ts index cd39afab3..88303b8c0 100644 --- a/exercises/06.hooks/01.problem.render-hook/tests/e2e/onboarding.test.ts +++ b/exercises/06.hooks/01.problem.render-hook/tests/e2e/onboarding.test.ts @@ -49,9 +49,7 @@ test('onboarding with link', async ({ page, getOnboardingData }) => { await page.getByRole('textbox', { name: /email/i }).fill(onboardingData.email) await page.getByRole('button', { name: /submit/i }).click() - await expect( - page.getByRole('button', { name: /submit/i, disabled: true }), - ).toBeVisible() + await expect(page.getByText(/check your email/i)).toBeVisible() const email = await waitFor(() => requireEmail(onboardingData.email)) diff --git a/exercises/06.hooks/01.problem.render-hook/tests/setup/setup-test-env.ts b/exercises/06.hooks/01.problem.render-hook/tests/setup/setup-test-env.ts index 477331463..f41c41463 100644 --- a/exercises/06.hooks/01.problem.render-hook/tests/setup/setup-test-env.ts +++ b/exercises/06.hooks/01.problem.render-hook/tests/setup/setup-test-env.ts @@ -1,12 +1,9 @@ import 'dotenv/config' import '#app/utils/env.server.ts' import '@testing-library/jest-dom/vitest' -import { installGlobals } from '@remix-run/node' import { cleanup } from '@testing-library/react' import { afterEach, beforeEach, vi, type MockInstance } from 'vitest' -installGlobals() - afterEach(() => cleanup()) export let consoleError: MockInstance diff --git a/exercises/06.hooks/01.solution.render-hook/app/epicshop.tsx b/exercises/06.hooks/01.solution.render-hook/app/epicshop.tsx deleted file mode 100644 index 96c5597cb..000000000 --- a/exercises/06.hooks/01.solution.render-hook/app/epicshop.tsx +++ /dev/null @@ -1,9 +0,0 @@ -// Ignore this file please -import { EpicShopIFrameSync } from '@epic-web/workshop-utils/iframe-sync' -import { useNavigate } from '@remix-run/react' -import * as React from 'react' - -export function EpicShop() { - const navigate = useNavigate() - return -} diff --git a/exercises/06.hooks/01.solution.render-hook/app/root.tsx b/exercises/06.hooks/01.solution.render-hook/app/root.tsx index 3b2064a1a..fa7f41981 100644 --- a/exercises/06.hooks/01.solution.render-hook/app/root.tsx +++ b/exercises/06.hooks/01.solution.render-hook/app/root.tsx @@ -34,7 +34,6 @@ import { SearchBar } from './components/search-bar.tsx' import { Spacer } from './components/spacer.tsx' import { Button } from './components/ui/button.tsx' import { Icon } from './components/ui/icon.tsx' -import { EpicShop } from './epicshop.tsx' import fontStylestylesheetUrl from './styles/font.css' import tailwindStylesheetUrl from './styles/tailwind.css' import { getUserId } from './utils/auth.server.ts' @@ -159,7 +158,6 @@ function Document({ - diff --git a/exercises/06.hooks/01.solution.render-hook/app/routes/resources+/note-images.$imageId.tsx b/exercises/06.hooks/01.solution.render-hook/app/routes/resources+/note-images.$imageId.tsx index 417545a3e..865878a92 100644 --- a/exercises/06.hooks/01.solution.render-hook/app/routes/resources+/note-images.$imageId.tsx +++ b/exercises/06.hooks/01.solution.render-hook/app/routes/resources+/note-images.$imageId.tsx @@ -14,7 +14,7 @@ export async function loader({ params }: LoaderFunctionArgs) { return new Response(image.blob, { headers: { 'content-type': image.contentType, - 'content-length': Buffer.byteLength(image.blob).toString(), + 'content-length': image.blob.length.toString(), 'content-disposition': `inline; filename="${params.imageId}"`, 'cache-control': 'public, max-age=31536000, immutable', }, diff --git a/exercises/06.hooks/01.solution.render-hook/app/routes/resources+/user-images.$imageId.tsx b/exercises/06.hooks/01.solution.render-hook/app/routes/resources+/user-images.$imageId.tsx index c5a66b146..2de45198e 100644 --- a/exercises/06.hooks/01.solution.render-hook/app/routes/resources+/user-images.$imageId.tsx +++ b/exercises/06.hooks/01.solution.render-hook/app/routes/resources+/user-images.$imageId.tsx @@ -14,7 +14,7 @@ export async function loader({ params }: LoaderFunctionArgs) { return new Response(image.blob, { headers: { 'content-type': image.contentType, - 'content-length': Buffer.byteLength(image.blob).toString(), + 'content-length': image.blob.length.toString(), 'content-disposition': `inline; filename="${params.imageId}"`, 'cache-control': 'public, max-age=31536000, immutable', }, diff --git a/exercises/06.hooks/01.solution.render-hook/app/routes/settings+/profile.photo.tsx b/exercises/06.hooks/01.solution.render-hook/app/routes/settings+/profile.photo.tsx index f452baf9a..36e397f0b 100644 --- a/exercises/06.hooks/01.solution.render-hook/app/routes/settings+/profile.photo.tsx +++ b/exercises/06.hooks/01.solution.render-hook/app/routes/settings+/profile.photo.tsx @@ -76,7 +76,7 @@ export async function action({ request }: ActionFunctionArgs) { return { image: { contentType: data.photoFile.type, - blob: Buffer.from(await data.photoFile.arrayBuffer()), + blob: new Uint8Array(await data.photoFile.arrayBuffer()), }, } }), diff --git a/exercises/06.hooks/01.solution.render-hook/app/routes/users+/$username_+/__note-editor.tsx b/exercises/06.hooks/01.solution.render-hook/app/routes/users+/$username_+/__note-editor.tsx index 714fa7baf..7c8ee2109 100644 --- a/exercises/06.hooks/01.solution.render-hook/app/routes/users+/$username_+/__note-editor.tsx +++ b/exercises/06.hooks/01.solution.render-hook/app/routes/users+/$username_+/__note-editor.tsx @@ -96,7 +96,7 @@ export async function action({ request, params }: ActionFunctionArgs) { id: i.id, altText: i.altText, contentType: i.file.type, - blob: Buffer.from(await i.file.arrayBuffer()), + blob: new Uint8Array(await i.file.arrayBuffer()), } } else { return { id: i.id, altText: i.altText } @@ -111,7 +111,7 @@ export async function action({ request, params }: ActionFunctionArgs) { return { altText: image.altText, contentType: image.file.type, - blob: Buffer.from(await image.file.arrayBuffer()), + blob: new Uint8Array(await image.file.arrayBuffer()), } }), ), diff --git a/exercises/06.hooks/01.solution.render-hook/app/utils/misc.tsx b/exercises/06.hooks/01.solution.render-hook/app/utils/misc.tsx index 8879f6b41..a553484db 100644 --- a/exercises/06.hooks/01.solution.render-hook/app/utils/misc.tsx +++ b/exercises/06.hooks/01.solution.render-hook/app/utils/misc.tsx @@ -303,7 +303,7 @@ export async function downloadFile(url: string, retries: number = 0) { throw new Error(`Failed to fetch image with status ${response.status}`) } const contentType = response.headers.get('content-type') ?? 'image/jpg' - const blob = Buffer.from(await response.arrayBuffer()) + const blob = new Uint8Array(await response.arrayBuffer()) return { contentType, blob } } catch (e) { if (retries > MAX_RETRIES) throw e diff --git a/exercises/06.hooks/01.solution.render-hook/index.js b/exercises/06.hooks/01.solution.render-hook/index.js index 8ba83ba70..e8728a002 100644 --- a/exercises/06.hooks/01.solution.render-hook/index.js +++ b/exercises/06.hooks/01.solution.render-hook/index.js @@ -1,11 +1,8 @@ import 'dotenv/config' import 'source-map-support/register.js' -import { installGlobals } from '@remix-run/node' import chalk from 'chalk' import closeWithGrace from 'close-with-grace' -installGlobals() - if ( process.env.NODE_ENV !== 'production' || process.env.PLAYWRIGHT_TEST_BASE_URL diff --git a/exercises/06.hooks/01.solution.render-hook/package.json b/exercises/06.hooks/01.solution.render-hook/package.json index 5d7e1e339..c7df1aeb7 100644 --- a/exercises/06.hooks/01.solution.render-hook/package.json +++ b/exercises/06.hooks/01.solution.render-hook/package.json @@ -30,9 +30,8 @@ "@conform-to/zod": "^0.9.0", "@epic-web/remember": "^1.1.0", "@epic-web/totp": "^1.1.2", - "@epic-web/workshop-utils": "^4.21.1", "@paralleldrive/cuid2": "^2.2.2", - "@prisma/client": "^5.16.2", + "@prisma/client": "^6.19.1", "@radix-ui/react-checkbox": "^1.1.1", "@radix-ui/react-dropdown-menu": "^2.1.1", "@radix-ui/react-label": "^2.1.0", @@ -59,13 +58,13 @@ "glob": "^11.0.0", "isbot": "^5.1.12", "morgan": "^1.10.0", - "prisma": "^5.16.2", + "prisma": "^6.19.1", "qrcode": "^1.5.3", "react": "^18.3.1", "react-dom": "^18.3.1", "remix-auth": "^3.7.0", "remix-auth-form": "^1.5.0", - "remix-auth-github": "^1.7.0", + "remix-auth-github": "1.7.0", "remix-utils": "^7.6.0", "sonner": "^1.5.0", "source-map-support": "^0.5.21", @@ -111,7 +110,7 @@ "execa": "^9.3.0", "fs-extra": "^11.2.0", "jsdom": "^24.1.0", - "msw": "^2.3.1", + "msw": "^2.12.4", "node-html-parser": "^6.1.13", "npm-run-all": "^4.1.5", "prettier": "^3.3.2", diff --git a/exercises/06.hooks/01.solution.render-hook/tests/db-utils.ts b/exercises/06.hooks/01.solution.render-hook/tests/db-utils.ts index 8f5062e16..2e1e23550 100644 --- a/exercises/06.hooks/01.solution.render-hook/tests/db-utils.ts +++ b/exercises/06.hooks/01.solution.render-hook/tests/db-utils.ts @@ -67,7 +67,7 @@ export async function getNoteImages() { }), img({ altText: - 'an office full of laptops and other office equipment that look like it was abandond in a rush out of the building in an emergency years ago.', + 'an office full of laptops and other office equipment that look like it was abandoned in a rush out of the building in an emergency years ago.', filepath: './tests/fixtures/images/notes/6.png', }), img({ @@ -110,6 +110,6 @@ export async function img({ return { altText, contentType: filepath.endsWith('.png') ? 'image/png' : 'image/jpeg', - blob: await fs.promises.readFile(filepath), + blob: new Uint8Array(await fs.promises.readFile(filepath)), } } diff --git a/exercises/06.hooks/01.solution.render-hook/tests/e2e/onboarding.test.ts b/exercises/06.hooks/01.solution.render-hook/tests/e2e/onboarding.test.ts index cd39afab3..88303b8c0 100644 --- a/exercises/06.hooks/01.solution.render-hook/tests/e2e/onboarding.test.ts +++ b/exercises/06.hooks/01.solution.render-hook/tests/e2e/onboarding.test.ts @@ -49,9 +49,7 @@ test('onboarding with link', async ({ page, getOnboardingData }) => { await page.getByRole('textbox', { name: /email/i }).fill(onboardingData.email) await page.getByRole('button', { name: /submit/i }).click() - await expect( - page.getByRole('button', { name: /submit/i, disabled: true }), - ).toBeVisible() + await expect(page.getByText(/check your email/i)).toBeVisible() const email = await waitFor(() => requireEmail(onboardingData.email)) diff --git a/exercises/06.hooks/01.solution.render-hook/tests/setup/setup-test-env.ts b/exercises/06.hooks/01.solution.render-hook/tests/setup/setup-test-env.ts index 477331463..f41c41463 100644 --- a/exercises/06.hooks/01.solution.render-hook/tests/setup/setup-test-env.ts +++ b/exercises/06.hooks/01.solution.render-hook/tests/setup/setup-test-env.ts @@ -1,12 +1,9 @@ import 'dotenv/config' import '#app/utils/env.server.ts' import '@testing-library/jest-dom/vitest' -import { installGlobals } from '@remix-run/node' import { cleanup } from '@testing-library/react' import { afterEach, beforeEach, vi, type MockInstance } from 'vitest' -installGlobals() - afterEach(() => cleanup()) export let consoleError: MockInstance diff --git a/exercises/06.hooks/02.problem.test-component/app/epicshop.tsx b/exercises/06.hooks/02.problem.test-component/app/epicshop.tsx deleted file mode 100644 index 96c5597cb..000000000 --- a/exercises/06.hooks/02.problem.test-component/app/epicshop.tsx +++ /dev/null @@ -1,9 +0,0 @@ -// Ignore this file please -import { EpicShopIFrameSync } from '@epic-web/workshop-utils/iframe-sync' -import { useNavigate } from '@remix-run/react' -import * as React from 'react' - -export function EpicShop() { - const navigate = useNavigate() - return -} diff --git a/exercises/06.hooks/02.problem.test-component/app/root.tsx b/exercises/06.hooks/02.problem.test-component/app/root.tsx index 3b2064a1a..fa7f41981 100644 --- a/exercises/06.hooks/02.problem.test-component/app/root.tsx +++ b/exercises/06.hooks/02.problem.test-component/app/root.tsx @@ -34,7 +34,6 @@ import { SearchBar } from './components/search-bar.tsx' import { Spacer } from './components/spacer.tsx' import { Button } from './components/ui/button.tsx' import { Icon } from './components/ui/icon.tsx' -import { EpicShop } from './epicshop.tsx' import fontStylestylesheetUrl from './styles/font.css' import tailwindStylesheetUrl from './styles/tailwind.css' import { getUserId } from './utils/auth.server.ts' @@ -159,7 +158,6 @@ function Document({ - diff --git a/exercises/06.hooks/02.problem.test-component/app/routes/resources+/note-images.$imageId.tsx b/exercises/06.hooks/02.problem.test-component/app/routes/resources+/note-images.$imageId.tsx index 417545a3e..865878a92 100644 --- a/exercises/06.hooks/02.problem.test-component/app/routes/resources+/note-images.$imageId.tsx +++ b/exercises/06.hooks/02.problem.test-component/app/routes/resources+/note-images.$imageId.tsx @@ -14,7 +14,7 @@ export async function loader({ params }: LoaderFunctionArgs) { return new Response(image.blob, { headers: { 'content-type': image.contentType, - 'content-length': Buffer.byteLength(image.blob).toString(), + 'content-length': image.blob.length.toString(), 'content-disposition': `inline; filename="${params.imageId}"`, 'cache-control': 'public, max-age=31536000, immutable', }, diff --git a/exercises/06.hooks/02.problem.test-component/app/routes/resources+/user-images.$imageId.tsx b/exercises/06.hooks/02.problem.test-component/app/routes/resources+/user-images.$imageId.tsx index c5a66b146..2de45198e 100644 --- a/exercises/06.hooks/02.problem.test-component/app/routes/resources+/user-images.$imageId.tsx +++ b/exercises/06.hooks/02.problem.test-component/app/routes/resources+/user-images.$imageId.tsx @@ -14,7 +14,7 @@ export async function loader({ params }: LoaderFunctionArgs) { return new Response(image.blob, { headers: { 'content-type': image.contentType, - 'content-length': Buffer.byteLength(image.blob).toString(), + 'content-length': image.blob.length.toString(), 'content-disposition': `inline; filename="${params.imageId}"`, 'cache-control': 'public, max-age=31536000, immutable', }, diff --git a/exercises/06.hooks/02.problem.test-component/app/routes/settings+/profile.photo.tsx b/exercises/06.hooks/02.problem.test-component/app/routes/settings+/profile.photo.tsx index f452baf9a..36e397f0b 100644 --- a/exercises/06.hooks/02.problem.test-component/app/routes/settings+/profile.photo.tsx +++ b/exercises/06.hooks/02.problem.test-component/app/routes/settings+/profile.photo.tsx @@ -76,7 +76,7 @@ export async function action({ request }: ActionFunctionArgs) { return { image: { contentType: data.photoFile.type, - blob: Buffer.from(await data.photoFile.arrayBuffer()), + blob: new Uint8Array(await data.photoFile.arrayBuffer()), }, } }), diff --git a/exercises/06.hooks/02.problem.test-component/app/routes/users+/$username_+/__note-editor.tsx b/exercises/06.hooks/02.problem.test-component/app/routes/users+/$username_+/__note-editor.tsx index 714fa7baf..7c8ee2109 100644 --- a/exercises/06.hooks/02.problem.test-component/app/routes/users+/$username_+/__note-editor.tsx +++ b/exercises/06.hooks/02.problem.test-component/app/routes/users+/$username_+/__note-editor.tsx @@ -96,7 +96,7 @@ export async function action({ request, params }: ActionFunctionArgs) { id: i.id, altText: i.altText, contentType: i.file.type, - blob: Buffer.from(await i.file.arrayBuffer()), + blob: new Uint8Array(await i.file.arrayBuffer()), } } else { return { id: i.id, altText: i.altText } @@ -111,7 +111,7 @@ export async function action({ request, params }: ActionFunctionArgs) { return { altText: image.altText, contentType: image.file.type, - blob: Buffer.from(await image.file.arrayBuffer()), + blob: new Uint8Array(await image.file.arrayBuffer()), } }), ), diff --git a/exercises/06.hooks/02.problem.test-component/app/utils/misc.tsx b/exercises/06.hooks/02.problem.test-component/app/utils/misc.tsx index 8879f6b41..a553484db 100644 --- a/exercises/06.hooks/02.problem.test-component/app/utils/misc.tsx +++ b/exercises/06.hooks/02.problem.test-component/app/utils/misc.tsx @@ -303,7 +303,7 @@ export async function downloadFile(url: string, retries: number = 0) { throw new Error(`Failed to fetch image with status ${response.status}`) } const contentType = response.headers.get('content-type') ?? 'image/jpg' - const blob = Buffer.from(await response.arrayBuffer()) + const blob = new Uint8Array(await response.arrayBuffer()) return { contentType, blob } } catch (e) { if (retries > MAX_RETRIES) throw e diff --git a/exercises/06.hooks/02.problem.test-component/index.js b/exercises/06.hooks/02.problem.test-component/index.js index 8ba83ba70..e8728a002 100644 --- a/exercises/06.hooks/02.problem.test-component/index.js +++ b/exercises/06.hooks/02.problem.test-component/index.js @@ -1,11 +1,8 @@ import 'dotenv/config' import 'source-map-support/register.js' -import { installGlobals } from '@remix-run/node' import chalk from 'chalk' import closeWithGrace from 'close-with-grace' -installGlobals() - if ( process.env.NODE_ENV !== 'production' || process.env.PLAYWRIGHT_TEST_BASE_URL diff --git a/exercises/06.hooks/02.problem.test-component/package.json b/exercises/06.hooks/02.problem.test-component/package.json index ccfc3aa7e..3e9e881ef 100644 --- a/exercises/06.hooks/02.problem.test-component/package.json +++ b/exercises/06.hooks/02.problem.test-component/package.json @@ -30,9 +30,8 @@ "@conform-to/zod": "^0.9.0", "@epic-web/remember": "^1.1.0", "@epic-web/totp": "^1.1.2", - "@epic-web/workshop-utils": "^4.21.1", "@paralleldrive/cuid2": "^2.2.2", - "@prisma/client": "^5.16.2", + "@prisma/client": "^6.19.1", "@radix-ui/react-checkbox": "^1.1.1", "@radix-ui/react-dropdown-menu": "^2.1.1", "@radix-ui/react-label": "^2.1.0", @@ -59,13 +58,13 @@ "glob": "^11.0.0", "isbot": "^5.1.12", "morgan": "^1.10.0", - "prisma": "^5.16.2", + "prisma": "^6.19.1", "qrcode": "^1.5.3", "react": "^18.3.1", "react-dom": "^18.3.1", "remix-auth": "^3.7.0", "remix-auth-form": "^1.5.0", - "remix-auth-github": "^1.7.0", + "remix-auth-github": "1.7.0", "remix-utils": "^7.6.0", "sonner": "^1.5.0", "source-map-support": "^0.5.21", @@ -111,7 +110,7 @@ "execa": "^9.3.0", "fs-extra": "^11.2.0", "jsdom": "^24.1.0", - "msw": "^2.3.1", + "msw": "^2.12.4", "node-html-parser": "^6.1.13", "npm-run-all": "^4.1.5", "prettier": "^3.3.2", diff --git a/exercises/06.hooks/02.problem.test-component/tests/db-utils.ts b/exercises/06.hooks/02.problem.test-component/tests/db-utils.ts index 8f5062e16..2e1e23550 100644 --- a/exercises/06.hooks/02.problem.test-component/tests/db-utils.ts +++ b/exercises/06.hooks/02.problem.test-component/tests/db-utils.ts @@ -67,7 +67,7 @@ export async function getNoteImages() { }), img({ altText: - 'an office full of laptops and other office equipment that look like it was abandond in a rush out of the building in an emergency years ago.', + 'an office full of laptops and other office equipment that look like it was abandoned in a rush out of the building in an emergency years ago.', filepath: './tests/fixtures/images/notes/6.png', }), img({ @@ -110,6 +110,6 @@ export async function img({ return { altText, contentType: filepath.endsWith('.png') ? 'image/png' : 'image/jpeg', - blob: await fs.promises.readFile(filepath), + blob: new Uint8Array(await fs.promises.readFile(filepath)), } } diff --git a/exercises/06.hooks/02.problem.test-component/tests/e2e/onboarding.test.ts b/exercises/06.hooks/02.problem.test-component/tests/e2e/onboarding.test.ts index cd39afab3..88303b8c0 100644 --- a/exercises/06.hooks/02.problem.test-component/tests/e2e/onboarding.test.ts +++ b/exercises/06.hooks/02.problem.test-component/tests/e2e/onboarding.test.ts @@ -49,9 +49,7 @@ test('onboarding with link', async ({ page, getOnboardingData }) => { await page.getByRole('textbox', { name: /email/i }).fill(onboardingData.email) await page.getByRole('button', { name: /submit/i }).click() - await expect( - page.getByRole('button', { name: /submit/i, disabled: true }), - ).toBeVisible() + await expect(page.getByText(/check your email/i)).toBeVisible() const email = await waitFor(() => requireEmail(onboardingData.email)) diff --git a/exercises/06.hooks/02.problem.test-component/tests/setup/setup-test-env.ts b/exercises/06.hooks/02.problem.test-component/tests/setup/setup-test-env.ts index 477331463..f41c41463 100644 --- a/exercises/06.hooks/02.problem.test-component/tests/setup/setup-test-env.ts +++ b/exercises/06.hooks/02.problem.test-component/tests/setup/setup-test-env.ts @@ -1,12 +1,9 @@ import 'dotenv/config' import '#app/utils/env.server.ts' import '@testing-library/jest-dom/vitest' -import { installGlobals } from '@remix-run/node' import { cleanup } from '@testing-library/react' import { afterEach, beforeEach, vi, type MockInstance } from 'vitest' -installGlobals() - afterEach(() => cleanup()) export let consoleError: MockInstance diff --git a/exercises/06.hooks/02.solution.test-component/app/epicshop.tsx b/exercises/06.hooks/02.solution.test-component/app/epicshop.tsx deleted file mode 100644 index 96c5597cb..000000000 --- a/exercises/06.hooks/02.solution.test-component/app/epicshop.tsx +++ /dev/null @@ -1,9 +0,0 @@ -// Ignore this file please -import { EpicShopIFrameSync } from '@epic-web/workshop-utils/iframe-sync' -import { useNavigate } from '@remix-run/react' -import * as React from 'react' - -export function EpicShop() { - const navigate = useNavigate() - return -} diff --git a/exercises/06.hooks/02.solution.test-component/app/root.tsx b/exercises/06.hooks/02.solution.test-component/app/root.tsx index 3b2064a1a..fa7f41981 100644 --- a/exercises/06.hooks/02.solution.test-component/app/root.tsx +++ b/exercises/06.hooks/02.solution.test-component/app/root.tsx @@ -34,7 +34,6 @@ import { SearchBar } from './components/search-bar.tsx' import { Spacer } from './components/spacer.tsx' import { Button } from './components/ui/button.tsx' import { Icon } from './components/ui/icon.tsx' -import { EpicShop } from './epicshop.tsx' import fontStylestylesheetUrl from './styles/font.css' import tailwindStylesheetUrl from './styles/tailwind.css' import { getUserId } from './utils/auth.server.ts' @@ -159,7 +158,6 @@ function Document({ - diff --git a/exercises/06.hooks/02.solution.test-component/app/routes/resources+/note-images.$imageId.tsx b/exercises/06.hooks/02.solution.test-component/app/routes/resources+/note-images.$imageId.tsx index 417545a3e..865878a92 100644 --- a/exercises/06.hooks/02.solution.test-component/app/routes/resources+/note-images.$imageId.tsx +++ b/exercises/06.hooks/02.solution.test-component/app/routes/resources+/note-images.$imageId.tsx @@ -14,7 +14,7 @@ export async function loader({ params }: LoaderFunctionArgs) { return new Response(image.blob, { headers: { 'content-type': image.contentType, - 'content-length': Buffer.byteLength(image.blob).toString(), + 'content-length': image.blob.length.toString(), 'content-disposition': `inline; filename="${params.imageId}"`, 'cache-control': 'public, max-age=31536000, immutable', }, diff --git a/exercises/06.hooks/02.solution.test-component/app/routes/resources+/user-images.$imageId.tsx b/exercises/06.hooks/02.solution.test-component/app/routes/resources+/user-images.$imageId.tsx index c5a66b146..2de45198e 100644 --- a/exercises/06.hooks/02.solution.test-component/app/routes/resources+/user-images.$imageId.tsx +++ b/exercises/06.hooks/02.solution.test-component/app/routes/resources+/user-images.$imageId.tsx @@ -14,7 +14,7 @@ export async function loader({ params }: LoaderFunctionArgs) { return new Response(image.blob, { headers: { 'content-type': image.contentType, - 'content-length': Buffer.byteLength(image.blob).toString(), + 'content-length': image.blob.length.toString(), 'content-disposition': `inline; filename="${params.imageId}"`, 'cache-control': 'public, max-age=31536000, immutable', }, diff --git a/exercises/06.hooks/02.solution.test-component/app/routes/settings+/profile.photo.tsx b/exercises/06.hooks/02.solution.test-component/app/routes/settings+/profile.photo.tsx index f452baf9a..36e397f0b 100644 --- a/exercises/06.hooks/02.solution.test-component/app/routes/settings+/profile.photo.tsx +++ b/exercises/06.hooks/02.solution.test-component/app/routes/settings+/profile.photo.tsx @@ -76,7 +76,7 @@ export async function action({ request }: ActionFunctionArgs) { return { image: { contentType: data.photoFile.type, - blob: Buffer.from(await data.photoFile.arrayBuffer()), + blob: new Uint8Array(await data.photoFile.arrayBuffer()), }, } }), diff --git a/exercises/06.hooks/02.solution.test-component/app/routes/users+/$username_+/__note-editor.tsx b/exercises/06.hooks/02.solution.test-component/app/routes/users+/$username_+/__note-editor.tsx index 714fa7baf..7c8ee2109 100644 --- a/exercises/06.hooks/02.solution.test-component/app/routes/users+/$username_+/__note-editor.tsx +++ b/exercises/06.hooks/02.solution.test-component/app/routes/users+/$username_+/__note-editor.tsx @@ -96,7 +96,7 @@ export async function action({ request, params }: ActionFunctionArgs) { id: i.id, altText: i.altText, contentType: i.file.type, - blob: Buffer.from(await i.file.arrayBuffer()), + blob: new Uint8Array(await i.file.arrayBuffer()), } } else { return { id: i.id, altText: i.altText } @@ -111,7 +111,7 @@ export async function action({ request, params }: ActionFunctionArgs) { return { altText: image.altText, contentType: image.file.type, - blob: Buffer.from(await image.file.arrayBuffer()), + blob: new Uint8Array(await image.file.arrayBuffer()), } }), ), diff --git a/exercises/06.hooks/02.solution.test-component/app/utils/misc.tsx b/exercises/06.hooks/02.solution.test-component/app/utils/misc.tsx index 8879f6b41..a553484db 100644 --- a/exercises/06.hooks/02.solution.test-component/app/utils/misc.tsx +++ b/exercises/06.hooks/02.solution.test-component/app/utils/misc.tsx @@ -303,7 +303,7 @@ export async function downloadFile(url: string, retries: number = 0) { throw new Error(`Failed to fetch image with status ${response.status}`) } const contentType = response.headers.get('content-type') ?? 'image/jpg' - const blob = Buffer.from(await response.arrayBuffer()) + const blob = new Uint8Array(await response.arrayBuffer()) return { contentType, blob } } catch (e) { if (retries > MAX_RETRIES) throw e diff --git a/exercises/06.hooks/02.solution.test-component/index.js b/exercises/06.hooks/02.solution.test-component/index.js index 8ba83ba70..e8728a002 100644 --- a/exercises/06.hooks/02.solution.test-component/index.js +++ b/exercises/06.hooks/02.solution.test-component/index.js @@ -1,11 +1,8 @@ import 'dotenv/config' import 'source-map-support/register.js' -import { installGlobals } from '@remix-run/node' import chalk from 'chalk' import closeWithGrace from 'close-with-grace' -installGlobals() - if ( process.env.NODE_ENV !== 'production' || process.env.PLAYWRIGHT_TEST_BASE_URL diff --git a/exercises/06.hooks/02.solution.test-component/package.json b/exercises/06.hooks/02.solution.test-component/package.json index 5b6ae1ea0..2e60322df 100644 --- a/exercises/06.hooks/02.solution.test-component/package.json +++ b/exercises/06.hooks/02.solution.test-component/package.json @@ -30,9 +30,8 @@ "@conform-to/zod": "^0.9.0", "@epic-web/remember": "^1.1.0", "@epic-web/totp": "^1.1.2", - "@epic-web/workshop-utils": "^4.21.1", "@paralleldrive/cuid2": "^2.2.2", - "@prisma/client": "^5.16.2", + "@prisma/client": "^6.19.1", "@radix-ui/react-checkbox": "^1.1.1", "@radix-ui/react-dropdown-menu": "^2.1.1", "@radix-ui/react-label": "^2.1.0", @@ -59,13 +58,13 @@ "glob": "^11.0.0", "isbot": "^5.1.12", "morgan": "^1.10.0", - "prisma": "^5.16.2", + "prisma": "^6.19.1", "qrcode": "^1.5.3", "react": "^18.3.1", "react-dom": "^18.3.1", "remix-auth": "^3.7.0", "remix-auth-form": "^1.5.0", - "remix-auth-github": "^1.7.0", + "remix-auth-github": "1.7.0", "remix-utils": "^7.6.0", "sonner": "^1.5.0", "source-map-support": "^0.5.21", @@ -111,7 +110,7 @@ "execa": "^9.3.0", "fs-extra": "^11.2.0", "jsdom": "^24.1.0", - "msw": "^2.3.1", + "msw": "^2.12.4", "node-html-parser": "^6.1.13", "npm-run-all": "^4.1.5", "prettier": "^3.3.2", diff --git a/exercises/06.hooks/02.solution.test-component/tests/db-utils.ts b/exercises/06.hooks/02.solution.test-component/tests/db-utils.ts index 8f5062e16..2e1e23550 100644 --- a/exercises/06.hooks/02.solution.test-component/tests/db-utils.ts +++ b/exercises/06.hooks/02.solution.test-component/tests/db-utils.ts @@ -67,7 +67,7 @@ export async function getNoteImages() { }), img({ altText: - 'an office full of laptops and other office equipment that look like it was abandond in a rush out of the building in an emergency years ago.', + 'an office full of laptops and other office equipment that look like it was abandoned in a rush out of the building in an emergency years ago.', filepath: './tests/fixtures/images/notes/6.png', }), img({ @@ -110,6 +110,6 @@ export async function img({ return { altText, contentType: filepath.endsWith('.png') ? 'image/png' : 'image/jpeg', - blob: await fs.promises.readFile(filepath), + blob: new Uint8Array(await fs.promises.readFile(filepath)), } } diff --git a/exercises/06.hooks/02.solution.test-component/tests/e2e/onboarding.test.ts b/exercises/06.hooks/02.solution.test-component/tests/e2e/onboarding.test.ts index cd39afab3..88303b8c0 100644 --- a/exercises/06.hooks/02.solution.test-component/tests/e2e/onboarding.test.ts +++ b/exercises/06.hooks/02.solution.test-component/tests/e2e/onboarding.test.ts @@ -49,9 +49,7 @@ test('onboarding with link', async ({ page, getOnboardingData }) => { await page.getByRole('textbox', { name: /email/i }).fill(onboardingData.email) await page.getByRole('button', { name: /submit/i }).click() - await expect( - page.getByRole('button', { name: /submit/i, disabled: true }), - ).toBeVisible() + await expect(page.getByText(/check your email/i)).toBeVisible() const email = await waitFor(() => requireEmail(onboardingData.email)) diff --git a/exercises/06.hooks/02.solution.test-component/tests/setup/setup-test-env.ts b/exercises/06.hooks/02.solution.test-component/tests/setup/setup-test-env.ts index 477331463..f41c41463 100644 --- a/exercises/06.hooks/02.solution.test-component/tests/setup/setup-test-env.ts +++ b/exercises/06.hooks/02.solution.test-component/tests/setup/setup-test-env.ts @@ -1,12 +1,9 @@ import 'dotenv/config' import '#app/utils/env.server.ts' import '@testing-library/jest-dom/vitest' -import { installGlobals } from '@remix-run/node' import { cleanup } from '@testing-library/react' import { afterEach, beforeEach, vi, type MockInstance } from 'vitest' -installGlobals() - afterEach(() => cleanup()) export let consoleError: MockInstance diff --git a/exercises/07.remix-component/01.problem.stub-remix/app/epicshop.tsx b/exercises/07.remix-component/01.problem.stub-remix/app/epicshop.tsx deleted file mode 100644 index 96c5597cb..000000000 --- a/exercises/07.remix-component/01.problem.stub-remix/app/epicshop.tsx +++ /dev/null @@ -1,9 +0,0 @@ -// Ignore this file please -import { EpicShopIFrameSync } from '@epic-web/workshop-utils/iframe-sync' -import { useNavigate } from '@remix-run/react' -import * as React from 'react' - -export function EpicShop() { - const navigate = useNavigate() - return -} diff --git a/exercises/07.remix-component/01.problem.stub-remix/app/root.tsx b/exercises/07.remix-component/01.problem.stub-remix/app/root.tsx index 3b2064a1a..fa7f41981 100644 --- a/exercises/07.remix-component/01.problem.stub-remix/app/root.tsx +++ b/exercises/07.remix-component/01.problem.stub-remix/app/root.tsx @@ -34,7 +34,6 @@ import { SearchBar } from './components/search-bar.tsx' import { Spacer } from './components/spacer.tsx' import { Button } from './components/ui/button.tsx' import { Icon } from './components/ui/icon.tsx' -import { EpicShop } from './epicshop.tsx' import fontStylestylesheetUrl from './styles/font.css' import tailwindStylesheetUrl from './styles/tailwind.css' import { getUserId } from './utils/auth.server.ts' @@ -159,7 +158,6 @@ function Document({ - diff --git a/exercises/07.remix-component/01.problem.stub-remix/app/routes/resources+/note-images.$imageId.tsx b/exercises/07.remix-component/01.problem.stub-remix/app/routes/resources+/note-images.$imageId.tsx index 417545a3e..865878a92 100644 --- a/exercises/07.remix-component/01.problem.stub-remix/app/routes/resources+/note-images.$imageId.tsx +++ b/exercises/07.remix-component/01.problem.stub-remix/app/routes/resources+/note-images.$imageId.tsx @@ -14,7 +14,7 @@ export async function loader({ params }: LoaderFunctionArgs) { return new Response(image.blob, { headers: { 'content-type': image.contentType, - 'content-length': Buffer.byteLength(image.blob).toString(), + 'content-length': image.blob.length.toString(), 'content-disposition': `inline; filename="${params.imageId}"`, 'cache-control': 'public, max-age=31536000, immutable', }, diff --git a/exercises/07.remix-component/01.problem.stub-remix/app/routes/resources+/user-images.$imageId.tsx b/exercises/07.remix-component/01.problem.stub-remix/app/routes/resources+/user-images.$imageId.tsx index c5a66b146..2de45198e 100644 --- a/exercises/07.remix-component/01.problem.stub-remix/app/routes/resources+/user-images.$imageId.tsx +++ b/exercises/07.remix-component/01.problem.stub-remix/app/routes/resources+/user-images.$imageId.tsx @@ -14,7 +14,7 @@ export async function loader({ params }: LoaderFunctionArgs) { return new Response(image.blob, { headers: { 'content-type': image.contentType, - 'content-length': Buffer.byteLength(image.blob).toString(), + 'content-length': image.blob.length.toString(), 'content-disposition': `inline; filename="${params.imageId}"`, 'cache-control': 'public, max-age=31536000, immutable', }, diff --git a/exercises/07.remix-component/01.problem.stub-remix/app/routes/settings+/profile.photo.tsx b/exercises/07.remix-component/01.problem.stub-remix/app/routes/settings+/profile.photo.tsx index f452baf9a..36e397f0b 100644 --- a/exercises/07.remix-component/01.problem.stub-remix/app/routes/settings+/profile.photo.tsx +++ b/exercises/07.remix-component/01.problem.stub-remix/app/routes/settings+/profile.photo.tsx @@ -76,7 +76,7 @@ export async function action({ request }: ActionFunctionArgs) { return { image: { contentType: data.photoFile.type, - blob: Buffer.from(await data.photoFile.arrayBuffer()), + blob: new Uint8Array(await data.photoFile.arrayBuffer()), }, } }), diff --git a/exercises/07.remix-component/01.problem.stub-remix/app/routes/users+/$username_+/__note-editor.tsx b/exercises/07.remix-component/01.problem.stub-remix/app/routes/users+/$username_+/__note-editor.tsx index 714fa7baf..7c8ee2109 100644 --- a/exercises/07.remix-component/01.problem.stub-remix/app/routes/users+/$username_+/__note-editor.tsx +++ b/exercises/07.remix-component/01.problem.stub-remix/app/routes/users+/$username_+/__note-editor.tsx @@ -96,7 +96,7 @@ export async function action({ request, params }: ActionFunctionArgs) { id: i.id, altText: i.altText, contentType: i.file.type, - blob: Buffer.from(await i.file.arrayBuffer()), + blob: new Uint8Array(await i.file.arrayBuffer()), } } else { return { id: i.id, altText: i.altText } @@ -111,7 +111,7 @@ export async function action({ request, params }: ActionFunctionArgs) { return { altText: image.altText, contentType: image.file.type, - blob: Buffer.from(await image.file.arrayBuffer()), + blob: new Uint8Array(await image.file.arrayBuffer()), } }), ), diff --git a/exercises/07.remix-component/01.problem.stub-remix/app/utils/misc.tsx b/exercises/07.remix-component/01.problem.stub-remix/app/utils/misc.tsx index 8879f6b41..a553484db 100644 --- a/exercises/07.remix-component/01.problem.stub-remix/app/utils/misc.tsx +++ b/exercises/07.remix-component/01.problem.stub-remix/app/utils/misc.tsx @@ -303,7 +303,7 @@ export async function downloadFile(url: string, retries: number = 0) { throw new Error(`Failed to fetch image with status ${response.status}`) } const contentType = response.headers.get('content-type') ?? 'image/jpg' - const blob = Buffer.from(await response.arrayBuffer()) + const blob = new Uint8Array(await response.arrayBuffer()) return { contentType, blob } } catch (e) { if (retries > MAX_RETRIES) throw e diff --git a/exercises/07.remix-component/01.problem.stub-remix/index.js b/exercises/07.remix-component/01.problem.stub-remix/index.js index 8ba83ba70..e8728a002 100644 --- a/exercises/07.remix-component/01.problem.stub-remix/index.js +++ b/exercises/07.remix-component/01.problem.stub-remix/index.js @@ -1,11 +1,8 @@ import 'dotenv/config' import 'source-map-support/register.js' -import { installGlobals } from '@remix-run/node' import chalk from 'chalk' import closeWithGrace from 'close-with-grace' -installGlobals() - if ( process.env.NODE_ENV !== 'production' || process.env.PLAYWRIGHT_TEST_BASE_URL diff --git a/exercises/07.remix-component/01.problem.stub-remix/package.json b/exercises/07.remix-component/01.problem.stub-remix/package.json index e7bf2df68..b7121658f 100644 --- a/exercises/07.remix-component/01.problem.stub-remix/package.json +++ b/exercises/07.remix-component/01.problem.stub-remix/package.json @@ -30,9 +30,8 @@ "@conform-to/zod": "^0.9.0", "@epic-web/remember": "^1.1.0", "@epic-web/totp": "^1.1.2", - "@epic-web/workshop-utils": "^4.21.1", "@paralleldrive/cuid2": "^2.2.2", - "@prisma/client": "^5.16.2", + "@prisma/client": "^6.19.1", "@radix-ui/react-checkbox": "^1.1.1", "@radix-ui/react-dropdown-menu": "^2.1.1", "@radix-ui/react-label": "^2.1.0", @@ -59,13 +58,13 @@ "glob": "^11.0.0", "isbot": "^5.1.12", "morgan": "^1.10.0", - "prisma": "^5.16.2", + "prisma": "^6.19.1", "qrcode": "^1.5.3", "react": "^18.3.1", "react-dom": "^18.3.1", "remix-auth": "^3.7.0", "remix-auth-form": "^1.5.0", - "remix-auth-github": "^1.7.0", + "remix-auth-github": "1.7.0", "remix-utils": "^7.6.0", "sonner": "^1.5.0", "source-map-support": "^0.5.21", @@ -111,7 +110,7 @@ "execa": "^9.3.0", "fs-extra": "^11.2.0", "jsdom": "^24.1.0", - "msw": "^2.3.1", + "msw": "^2.12.4", "node-html-parser": "^6.1.13", "npm-run-all": "^4.1.5", "prettier": "^3.3.2", diff --git a/exercises/07.remix-component/01.problem.stub-remix/tests/db-utils.ts b/exercises/07.remix-component/01.problem.stub-remix/tests/db-utils.ts index 8f5062e16..2e1e23550 100644 --- a/exercises/07.remix-component/01.problem.stub-remix/tests/db-utils.ts +++ b/exercises/07.remix-component/01.problem.stub-remix/tests/db-utils.ts @@ -67,7 +67,7 @@ export async function getNoteImages() { }), img({ altText: - 'an office full of laptops and other office equipment that look like it was abandond in a rush out of the building in an emergency years ago.', + 'an office full of laptops and other office equipment that look like it was abandoned in a rush out of the building in an emergency years ago.', filepath: './tests/fixtures/images/notes/6.png', }), img({ @@ -110,6 +110,6 @@ export async function img({ return { altText, contentType: filepath.endsWith('.png') ? 'image/png' : 'image/jpeg', - blob: await fs.promises.readFile(filepath), + blob: new Uint8Array(await fs.promises.readFile(filepath)), } } diff --git a/exercises/07.remix-component/01.problem.stub-remix/tests/e2e/onboarding.test.ts b/exercises/07.remix-component/01.problem.stub-remix/tests/e2e/onboarding.test.ts index cd39afab3..88303b8c0 100644 --- a/exercises/07.remix-component/01.problem.stub-remix/tests/e2e/onboarding.test.ts +++ b/exercises/07.remix-component/01.problem.stub-remix/tests/e2e/onboarding.test.ts @@ -49,9 +49,7 @@ test('onboarding with link', async ({ page, getOnboardingData }) => { await page.getByRole('textbox', { name: /email/i }).fill(onboardingData.email) await page.getByRole('button', { name: /submit/i }).click() - await expect( - page.getByRole('button', { name: /submit/i, disabled: true }), - ).toBeVisible() + await expect(page.getByText(/check your email/i)).toBeVisible() const email = await waitFor(() => requireEmail(onboardingData.email)) diff --git a/exercises/07.remix-component/01.problem.stub-remix/tests/setup/setup-test-env.ts b/exercises/07.remix-component/01.problem.stub-remix/tests/setup/setup-test-env.ts index 477331463..f41c41463 100644 --- a/exercises/07.remix-component/01.problem.stub-remix/tests/setup/setup-test-env.ts +++ b/exercises/07.remix-component/01.problem.stub-remix/tests/setup/setup-test-env.ts @@ -1,12 +1,9 @@ import 'dotenv/config' import '#app/utils/env.server.ts' import '@testing-library/jest-dom/vitest' -import { installGlobals } from '@remix-run/node' import { cleanup } from '@testing-library/react' import { afterEach, beforeEach, vi, type MockInstance } from 'vitest' -installGlobals() - afterEach(() => cleanup()) export let consoleError: MockInstance diff --git a/exercises/07.remix-component/01.solution.stub-remix/app/epicshop.tsx b/exercises/07.remix-component/01.solution.stub-remix/app/epicshop.tsx deleted file mode 100644 index 96c5597cb..000000000 --- a/exercises/07.remix-component/01.solution.stub-remix/app/epicshop.tsx +++ /dev/null @@ -1,9 +0,0 @@ -// Ignore this file please -import { EpicShopIFrameSync } from '@epic-web/workshop-utils/iframe-sync' -import { useNavigate } from '@remix-run/react' -import * as React from 'react' - -export function EpicShop() { - const navigate = useNavigate() - return -} diff --git a/exercises/07.remix-component/01.solution.stub-remix/app/root.tsx b/exercises/07.remix-component/01.solution.stub-remix/app/root.tsx index 3b2064a1a..fa7f41981 100644 --- a/exercises/07.remix-component/01.solution.stub-remix/app/root.tsx +++ b/exercises/07.remix-component/01.solution.stub-remix/app/root.tsx @@ -34,7 +34,6 @@ import { SearchBar } from './components/search-bar.tsx' import { Spacer } from './components/spacer.tsx' import { Button } from './components/ui/button.tsx' import { Icon } from './components/ui/icon.tsx' -import { EpicShop } from './epicshop.tsx' import fontStylestylesheetUrl from './styles/font.css' import tailwindStylesheetUrl from './styles/tailwind.css' import { getUserId } from './utils/auth.server.ts' @@ -159,7 +158,6 @@ function Document({ - diff --git a/exercises/07.remix-component/01.solution.stub-remix/app/routes/resources+/note-images.$imageId.tsx b/exercises/07.remix-component/01.solution.stub-remix/app/routes/resources+/note-images.$imageId.tsx index 417545a3e..865878a92 100644 --- a/exercises/07.remix-component/01.solution.stub-remix/app/routes/resources+/note-images.$imageId.tsx +++ b/exercises/07.remix-component/01.solution.stub-remix/app/routes/resources+/note-images.$imageId.tsx @@ -14,7 +14,7 @@ export async function loader({ params }: LoaderFunctionArgs) { return new Response(image.blob, { headers: { 'content-type': image.contentType, - 'content-length': Buffer.byteLength(image.blob).toString(), + 'content-length': image.blob.length.toString(), 'content-disposition': `inline; filename="${params.imageId}"`, 'cache-control': 'public, max-age=31536000, immutable', }, diff --git a/exercises/07.remix-component/01.solution.stub-remix/app/routes/resources+/user-images.$imageId.tsx b/exercises/07.remix-component/01.solution.stub-remix/app/routes/resources+/user-images.$imageId.tsx index c5a66b146..2de45198e 100644 --- a/exercises/07.remix-component/01.solution.stub-remix/app/routes/resources+/user-images.$imageId.tsx +++ b/exercises/07.remix-component/01.solution.stub-remix/app/routes/resources+/user-images.$imageId.tsx @@ -14,7 +14,7 @@ export async function loader({ params }: LoaderFunctionArgs) { return new Response(image.blob, { headers: { 'content-type': image.contentType, - 'content-length': Buffer.byteLength(image.blob).toString(), + 'content-length': image.blob.length.toString(), 'content-disposition': `inline; filename="${params.imageId}"`, 'cache-control': 'public, max-age=31536000, immutable', }, diff --git a/exercises/07.remix-component/01.solution.stub-remix/app/routes/settings+/profile.photo.tsx b/exercises/07.remix-component/01.solution.stub-remix/app/routes/settings+/profile.photo.tsx index f452baf9a..36e397f0b 100644 --- a/exercises/07.remix-component/01.solution.stub-remix/app/routes/settings+/profile.photo.tsx +++ b/exercises/07.remix-component/01.solution.stub-remix/app/routes/settings+/profile.photo.tsx @@ -76,7 +76,7 @@ export async function action({ request }: ActionFunctionArgs) { return { image: { contentType: data.photoFile.type, - blob: Buffer.from(await data.photoFile.arrayBuffer()), + blob: new Uint8Array(await data.photoFile.arrayBuffer()), }, } }), diff --git a/exercises/07.remix-component/01.solution.stub-remix/app/routes/users+/$username_+/__note-editor.tsx b/exercises/07.remix-component/01.solution.stub-remix/app/routes/users+/$username_+/__note-editor.tsx index 714fa7baf..7c8ee2109 100644 --- a/exercises/07.remix-component/01.solution.stub-remix/app/routes/users+/$username_+/__note-editor.tsx +++ b/exercises/07.remix-component/01.solution.stub-remix/app/routes/users+/$username_+/__note-editor.tsx @@ -96,7 +96,7 @@ export async function action({ request, params }: ActionFunctionArgs) { id: i.id, altText: i.altText, contentType: i.file.type, - blob: Buffer.from(await i.file.arrayBuffer()), + blob: new Uint8Array(await i.file.arrayBuffer()), } } else { return { id: i.id, altText: i.altText } @@ -111,7 +111,7 @@ export async function action({ request, params }: ActionFunctionArgs) { return { altText: image.altText, contentType: image.file.type, - blob: Buffer.from(await image.file.arrayBuffer()), + blob: new Uint8Array(await image.file.arrayBuffer()), } }), ), diff --git a/exercises/07.remix-component/01.solution.stub-remix/app/utils/misc.tsx b/exercises/07.remix-component/01.solution.stub-remix/app/utils/misc.tsx index 8879f6b41..a553484db 100644 --- a/exercises/07.remix-component/01.solution.stub-remix/app/utils/misc.tsx +++ b/exercises/07.remix-component/01.solution.stub-remix/app/utils/misc.tsx @@ -303,7 +303,7 @@ export async function downloadFile(url: string, retries: number = 0) { throw new Error(`Failed to fetch image with status ${response.status}`) } const contentType = response.headers.get('content-type') ?? 'image/jpg' - const blob = Buffer.from(await response.arrayBuffer()) + const blob = new Uint8Array(await response.arrayBuffer()) return { contentType, blob } } catch (e) { if (retries > MAX_RETRIES) throw e diff --git a/exercises/07.remix-component/01.solution.stub-remix/index.js b/exercises/07.remix-component/01.solution.stub-remix/index.js index 8ba83ba70..e8728a002 100644 --- a/exercises/07.remix-component/01.solution.stub-remix/index.js +++ b/exercises/07.remix-component/01.solution.stub-remix/index.js @@ -1,11 +1,8 @@ import 'dotenv/config' import 'source-map-support/register.js' -import { installGlobals } from '@remix-run/node' import chalk from 'chalk' import closeWithGrace from 'close-with-grace' -installGlobals() - if ( process.env.NODE_ENV !== 'production' || process.env.PLAYWRIGHT_TEST_BASE_URL diff --git a/exercises/07.remix-component/01.solution.stub-remix/package.json b/exercises/07.remix-component/01.solution.stub-remix/package.json index 30b815178..3d8f7fd66 100644 --- a/exercises/07.remix-component/01.solution.stub-remix/package.json +++ b/exercises/07.remix-component/01.solution.stub-remix/package.json @@ -30,9 +30,8 @@ "@conform-to/zod": "^0.9.0", "@epic-web/remember": "^1.1.0", "@epic-web/totp": "^1.1.2", - "@epic-web/workshop-utils": "^4.21.1", "@paralleldrive/cuid2": "^2.2.2", - "@prisma/client": "^5.16.2", + "@prisma/client": "^6.19.1", "@radix-ui/react-checkbox": "^1.1.1", "@radix-ui/react-dropdown-menu": "^2.1.1", "@radix-ui/react-label": "^2.1.0", @@ -59,13 +58,13 @@ "glob": "^11.0.0", "isbot": "^5.1.12", "morgan": "^1.10.0", - "prisma": "^5.16.2", + "prisma": "^6.19.1", "qrcode": "^1.5.3", "react": "^18.3.1", "react-dom": "^18.3.1", "remix-auth": "^3.7.0", "remix-auth-form": "^1.5.0", - "remix-auth-github": "^1.7.0", + "remix-auth-github": "1.7.0", "remix-utils": "^7.6.0", "sonner": "^1.5.0", "source-map-support": "^0.5.21", @@ -111,7 +110,7 @@ "execa": "^9.3.0", "fs-extra": "^11.2.0", "jsdom": "^24.1.0", - "msw": "^2.3.1", + "msw": "^2.12.4", "node-html-parser": "^6.1.13", "npm-run-all": "^4.1.5", "prettier": "^3.3.2", diff --git a/exercises/07.remix-component/01.solution.stub-remix/tests/db-utils.ts b/exercises/07.remix-component/01.solution.stub-remix/tests/db-utils.ts index 8f5062e16..2e1e23550 100644 --- a/exercises/07.remix-component/01.solution.stub-remix/tests/db-utils.ts +++ b/exercises/07.remix-component/01.solution.stub-remix/tests/db-utils.ts @@ -67,7 +67,7 @@ export async function getNoteImages() { }), img({ altText: - 'an office full of laptops and other office equipment that look like it was abandond in a rush out of the building in an emergency years ago.', + 'an office full of laptops and other office equipment that look like it was abandoned in a rush out of the building in an emergency years ago.', filepath: './tests/fixtures/images/notes/6.png', }), img({ @@ -110,6 +110,6 @@ export async function img({ return { altText, contentType: filepath.endsWith('.png') ? 'image/png' : 'image/jpeg', - blob: await fs.promises.readFile(filepath), + blob: new Uint8Array(await fs.promises.readFile(filepath)), } } diff --git a/exercises/07.remix-component/01.solution.stub-remix/tests/e2e/onboarding.test.ts b/exercises/07.remix-component/01.solution.stub-remix/tests/e2e/onboarding.test.ts index cd39afab3..88303b8c0 100644 --- a/exercises/07.remix-component/01.solution.stub-remix/tests/e2e/onboarding.test.ts +++ b/exercises/07.remix-component/01.solution.stub-remix/tests/e2e/onboarding.test.ts @@ -49,9 +49,7 @@ test('onboarding with link', async ({ page, getOnboardingData }) => { await page.getByRole('textbox', { name: /email/i }).fill(onboardingData.email) await page.getByRole('button', { name: /submit/i }).click() - await expect( - page.getByRole('button', { name: /submit/i, disabled: true }), - ).toBeVisible() + await expect(page.getByText(/check your email/i)).toBeVisible() const email = await waitFor(() => requireEmail(onboardingData.email)) diff --git a/exercises/07.remix-component/01.solution.stub-remix/tests/setup/setup-test-env.ts b/exercises/07.remix-component/01.solution.stub-remix/tests/setup/setup-test-env.ts index 477331463..f41c41463 100644 --- a/exercises/07.remix-component/01.solution.stub-remix/tests/setup/setup-test-env.ts +++ b/exercises/07.remix-component/01.solution.stub-remix/tests/setup/setup-test-env.ts @@ -1,12 +1,9 @@ import 'dotenv/config' import '#app/utils/env.server.ts' import '@testing-library/jest-dom/vitest' -import { installGlobals } from '@remix-run/node' import { cleanup } from '@testing-library/react' import { afterEach, beforeEach, vi, type MockInstance } from 'vitest' -installGlobals() - afterEach(() => cleanup()) export let consoleError: MockInstance diff --git a/exercises/07.remix-component/02.problem.multiple-routes/app/epicshop.tsx b/exercises/07.remix-component/02.problem.multiple-routes/app/epicshop.tsx deleted file mode 100644 index 96c5597cb..000000000 --- a/exercises/07.remix-component/02.problem.multiple-routes/app/epicshop.tsx +++ /dev/null @@ -1,9 +0,0 @@ -// Ignore this file please -import { EpicShopIFrameSync } from '@epic-web/workshop-utils/iframe-sync' -import { useNavigate } from '@remix-run/react' -import * as React from 'react' - -export function EpicShop() { - const navigate = useNavigate() - return -} diff --git a/exercises/07.remix-component/02.problem.multiple-routes/app/root.tsx b/exercises/07.remix-component/02.problem.multiple-routes/app/root.tsx index 3b2064a1a..fa7f41981 100644 --- a/exercises/07.remix-component/02.problem.multiple-routes/app/root.tsx +++ b/exercises/07.remix-component/02.problem.multiple-routes/app/root.tsx @@ -34,7 +34,6 @@ import { SearchBar } from './components/search-bar.tsx' import { Spacer } from './components/spacer.tsx' import { Button } from './components/ui/button.tsx' import { Icon } from './components/ui/icon.tsx' -import { EpicShop } from './epicshop.tsx' import fontStylestylesheetUrl from './styles/font.css' import tailwindStylesheetUrl from './styles/tailwind.css' import { getUserId } from './utils/auth.server.ts' @@ -159,7 +158,6 @@ function Document({ - diff --git a/exercises/07.remix-component/02.problem.multiple-routes/app/routes/resources+/note-images.$imageId.tsx b/exercises/07.remix-component/02.problem.multiple-routes/app/routes/resources+/note-images.$imageId.tsx index 417545a3e..865878a92 100644 --- a/exercises/07.remix-component/02.problem.multiple-routes/app/routes/resources+/note-images.$imageId.tsx +++ b/exercises/07.remix-component/02.problem.multiple-routes/app/routes/resources+/note-images.$imageId.tsx @@ -14,7 +14,7 @@ export async function loader({ params }: LoaderFunctionArgs) { return new Response(image.blob, { headers: { 'content-type': image.contentType, - 'content-length': Buffer.byteLength(image.blob).toString(), + 'content-length': image.blob.length.toString(), 'content-disposition': `inline; filename="${params.imageId}"`, 'cache-control': 'public, max-age=31536000, immutable', }, diff --git a/exercises/07.remix-component/02.problem.multiple-routes/app/routes/resources+/user-images.$imageId.tsx b/exercises/07.remix-component/02.problem.multiple-routes/app/routes/resources+/user-images.$imageId.tsx index c5a66b146..2de45198e 100644 --- a/exercises/07.remix-component/02.problem.multiple-routes/app/routes/resources+/user-images.$imageId.tsx +++ b/exercises/07.remix-component/02.problem.multiple-routes/app/routes/resources+/user-images.$imageId.tsx @@ -14,7 +14,7 @@ export async function loader({ params }: LoaderFunctionArgs) { return new Response(image.blob, { headers: { 'content-type': image.contentType, - 'content-length': Buffer.byteLength(image.blob).toString(), + 'content-length': image.blob.length.toString(), 'content-disposition': `inline; filename="${params.imageId}"`, 'cache-control': 'public, max-age=31536000, immutable', }, diff --git a/exercises/07.remix-component/02.problem.multiple-routes/app/routes/settings+/profile.photo.tsx b/exercises/07.remix-component/02.problem.multiple-routes/app/routes/settings+/profile.photo.tsx index f452baf9a..36e397f0b 100644 --- a/exercises/07.remix-component/02.problem.multiple-routes/app/routes/settings+/profile.photo.tsx +++ b/exercises/07.remix-component/02.problem.multiple-routes/app/routes/settings+/profile.photo.tsx @@ -76,7 +76,7 @@ export async function action({ request }: ActionFunctionArgs) { return { image: { contentType: data.photoFile.type, - blob: Buffer.from(await data.photoFile.arrayBuffer()), + blob: new Uint8Array(await data.photoFile.arrayBuffer()), }, } }), diff --git a/exercises/07.remix-component/02.problem.multiple-routes/app/routes/users+/$username_+/__note-editor.tsx b/exercises/07.remix-component/02.problem.multiple-routes/app/routes/users+/$username_+/__note-editor.tsx index 714fa7baf..7c8ee2109 100644 --- a/exercises/07.remix-component/02.problem.multiple-routes/app/routes/users+/$username_+/__note-editor.tsx +++ b/exercises/07.remix-component/02.problem.multiple-routes/app/routes/users+/$username_+/__note-editor.tsx @@ -96,7 +96,7 @@ export async function action({ request, params }: ActionFunctionArgs) { id: i.id, altText: i.altText, contentType: i.file.type, - blob: Buffer.from(await i.file.arrayBuffer()), + blob: new Uint8Array(await i.file.arrayBuffer()), } } else { return { id: i.id, altText: i.altText } @@ -111,7 +111,7 @@ export async function action({ request, params }: ActionFunctionArgs) { return { altText: image.altText, contentType: image.file.type, - blob: Buffer.from(await image.file.arrayBuffer()), + blob: new Uint8Array(await image.file.arrayBuffer()), } }), ), diff --git a/exercises/07.remix-component/02.problem.multiple-routes/app/utils/misc.tsx b/exercises/07.remix-component/02.problem.multiple-routes/app/utils/misc.tsx index 8879f6b41..a553484db 100644 --- a/exercises/07.remix-component/02.problem.multiple-routes/app/utils/misc.tsx +++ b/exercises/07.remix-component/02.problem.multiple-routes/app/utils/misc.tsx @@ -303,7 +303,7 @@ export async function downloadFile(url: string, retries: number = 0) { throw new Error(`Failed to fetch image with status ${response.status}`) } const contentType = response.headers.get('content-type') ?? 'image/jpg' - const blob = Buffer.from(await response.arrayBuffer()) + const blob = new Uint8Array(await response.arrayBuffer()) return { contentType, blob } } catch (e) { if (retries > MAX_RETRIES) throw e diff --git a/exercises/07.remix-component/02.problem.multiple-routes/index.js b/exercises/07.remix-component/02.problem.multiple-routes/index.js index 8ba83ba70..e8728a002 100644 --- a/exercises/07.remix-component/02.problem.multiple-routes/index.js +++ b/exercises/07.remix-component/02.problem.multiple-routes/index.js @@ -1,11 +1,8 @@ import 'dotenv/config' import 'source-map-support/register.js' -import { installGlobals } from '@remix-run/node' import chalk from 'chalk' import closeWithGrace from 'close-with-grace' -installGlobals() - if ( process.env.NODE_ENV !== 'production' || process.env.PLAYWRIGHT_TEST_BASE_URL diff --git a/exercises/07.remix-component/02.problem.multiple-routes/package.json b/exercises/07.remix-component/02.problem.multiple-routes/package.json index 9b8a5e0da..87ae4db13 100644 --- a/exercises/07.remix-component/02.problem.multiple-routes/package.json +++ b/exercises/07.remix-component/02.problem.multiple-routes/package.json @@ -30,9 +30,8 @@ "@conform-to/zod": "^0.9.0", "@epic-web/remember": "^1.1.0", "@epic-web/totp": "^1.1.2", - "@epic-web/workshop-utils": "^4.21.1", "@paralleldrive/cuid2": "^2.2.2", - "@prisma/client": "^5.16.2", + "@prisma/client": "^6.19.1", "@radix-ui/react-checkbox": "^1.1.1", "@radix-ui/react-dropdown-menu": "^2.1.1", "@radix-ui/react-label": "^2.1.0", @@ -59,13 +58,13 @@ "glob": "^11.0.0", "isbot": "^5.1.12", "morgan": "^1.10.0", - "prisma": "^5.16.2", + "prisma": "^6.19.1", "qrcode": "^1.5.3", "react": "^18.3.1", "react-dom": "^18.3.1", "remix-auth": "^3.7.0", "remix-auth-form": "^1.5.0", - "remix-auth-github": "^1.7.0", + "remix-auth-github": "1.7.0", "remix-utils": "^7.6.0", "sonner": "^1.5.0", "source-map-support": "^0.5.21", @@ -111,7 +110,7 @@ "execa": "^9.3.0", "fs-extra": "^11.2.0", "jsdom": "^24.1.0", - "msw": "^2.3.1", + "msw": "^2.12.4", "node-html-parser": "^6.1.13", "npm-run-all": "^4.1.5", "prettier": "^3.3.2", diff --git a/exercises/07.remix-component/02.problem.multiple-routes/tests/db-utils.ts b/exercises/07.remix-component/02.problem.multiple-routes/tests/db-utils.ts index 8f5062e16..2e1e23550 100644 --- a/exercises/07.remix-component/02.problem.multiple-routes/tests/db-utils.ts +++ b/exercises/07.remix-component/02.problem.multiple-routes/tests/db-utils.ts @@ -67,7 +67,7 @@ export async function getNoteImages() { }), img({ altText: - 'an office full of laptops and other office equipment that look like it was abandond in a rush out of the building in an emergency years ago.', + 'an office full of laptops and other office equipment that look like it was abandoned in a rush out of the building in an emergency years ago.', filepath: './tests/fixtures/images/notes/6.png', }), img({ @@ -110,6 +110,6 @@ export async function img({ return { altText, contentType: filepath.endsWith('.png') ? 'image/png' : 'image/jpeg', - blob: await fs.promises.readFile(filepath), + blob: new Uint8Array(await fs.promises.readFile(filepath)), } } diff --git a/exercises/07.remix-component/02.problem.multiple-routes/tests/e2e/onboarding.test.ts b/exercises/07.remix-component/02.problem.multiple-routes/tests/e2e/onboarding.test.ts index cd39afab3..88303b8c0 100644 --- a/exercises/07.remix-component/02.problem.multiple-routes/tests/e2e/onboarding.test.ts +++ b/exercises/07.remix-component/02.problem.multiple-routes/tests/e2e/onboarding.test.ts @@ -49,9 +49,7 @@ test('onboarding with link', async ({ page, getOnboardingData }) => { await page.getByRole('textbox', { name: /email/i }).fill(onboardingData.email) await page.getByRole('button', { name: /submit/i }).click() - await expect( - page.getByRole('button', { name: /submit/i, disabled: true }), - ).toBeVisible() + await expect(page.getByText(/check your email/i)).toBeVisible() const email = await waitFor(() => requireEmail(onboardingData.email)) diff --git a/exercises/07.remix-component/02.problem.multiple-routes/tests/setup/setup-test-env.ts b/exercises/07.remix-component/02.problem.multiple-routes/tests/setup/setup-test-env.ts index 477331463..f41c41463 100644 --- a/exercises/07.remix-component/02.problem.multiple-routes/tests/setup/setup-test-env.ts +++ b/exercises/07.remix-component/02.problem.multiple-routes/tests/setup/setup-test-env.ts @@ -1,12 +1,9 @@ import 'dotenv/config' import '#app/utils/env.server.ts' import '@testing-library/jest-dom/vitest' -import { installGlobals } from '@remix-run/node' import { cleanup } from '@testing-library/react' import { afterEach, beforeEach, vi, type MockInstance } from 'vitest' -installGlobals() - afterEach(() => cleanup()) export let consoleError: MockInstance diff --git a/exercises/07.remix-component/02.solution.multiple-routes/app/epicshop.tsx b/exercises/07.remix-component/02.solution.multiple-routes/app/epicshop.tsx deleted file mode 100644 index 96c5597cb..000000000 --- a/exercises/07.remix-component/02.solution.multiple-routes/app/epicshop.tsx +++ /dev/null @@ -1,9 +0,0 @@ -// Ignore this file please -import { EpicShopIFrameSync } from '@epic-web/workshop-utils/iframe-sync' -import { useNavigate } from '@remix-run/react' -import * as React from 'react' - -export function EpicShop() { - const navigate = useNavigate() - return -} diff --git a/exercises/07.remix-component/02.solution.multiple-routes/app/root.tsx b/exercises/07.remix-component/02.solution.multiple-routes/app/root.tsx index 3b2064a1a..fa7f41981 100644 --- a/exercises/07.remix-component/02.solution.multiple-routes/app/root.tsx +++ b/exercises/07.remix-component/02.solution.multiple-routes/app/root.tsx @@ -34,7 +34,6 @@ import { SearchBar } from './components/search-bar.tsx' import { Spacer } from './components/spacer.tsx' import { Button } from './components/ui/button.tsx' import { Icon } from './components/ui/icon.tsx' -import { EpicShop } from './epicshop.tsx' import fontStylestylesheetUrl from './styles/font.css' import tailwindStylesheetUrl from './styles/tailwind.css' import { getUserId } from './utils/auth.server.ts' @@ -159,7 +158,6 @@ function Document({ - diff --git a/exercises/07.remix-component/02.solution.multiple-routes/app/routes/resources+/note-images.$imageId.tsx b/exercises/07.remix-component/02.solution.multiple-routes/app/routes/resources+/note-images.$imageId.tsx index 417545a3e..865878a92 100644 --- a/exercises/07.remix-component/02.solution.multiple-routes/app/routes/resources+/note-images.$imageId.tsx +++ b/exercises/07.remix-component/02.solution.multiple-routes/app/routes/resources+/note-images.$imageId.tsx @@ -14,7 +14,7 @@ export async function loader({ params }: LoaderFunctionArgs) { return new Response(image.blob, { headers: { 'content-type': image.contentType, - 'content-length': Buffer.byteLength(image.blob).toString(), + 'content-length': image.blob.length.toString(), 'content-disposition': `inline; filename="${params.imageId}"`, 'cache-control': 'public, max-age=31536000, immutable', }, diff --git a/exercises/07.remix-component/02.solution.multiple-routes/app/routes/resources+/user-images.$imageId.tsx b/exercises/07.remix-component/02.solution.multiple-routes/app/routes/resources+/user-images.$imageId.tsx index c5a66b146..2de45198e 100644 --- a/exercises/07.remix-component/02.solution.multiple-routes/app/routes/resources+/user-images.$imageId.tsx +++ b/exercises/07.remix-component/02.solution.multiple-routes/app/routes/resources+/user-images.$imageId.tsx @@ -14,7 +14,7 @@ export async function loader({ params }: LoaderFunctionArgs) { return new Response(image.blob, { headers: { 'content-type': image.contentType, - 'content-length': Buffer.byteLength(image.blob).toString(), + 'content-length': image.blob.length.toString(), 'content-disposition': `inline; filename="${params.imageId}"`, 'cache-control': 'public, max-age=31536000, immutable', }, diff --git a/exercises/07.remix-component/02.solution.multiple-routes/app/routes/settings+/profile.photo.tsx b/exercises/07.remix-component/02.solution.multiple-routes/app/routes/settings+/profile.photo.tsx index f452baf9a..36e397f0b 100644 --- a/exercises/07.remix-component/02.solution.multiple-routes/app/routes/settings+/profile.photo.tsx +++ b/exercises/07.remix-component/02.solution.multiple-routes/app/routes/settings+/profile.photo.tsx @@ -76,7 +76,7 @@ export async function action({ request }: ActionFunctionArgs) { return { image: { contentType: data.photoFile.type, - blob: Buffer.from(await data.photoFile.arrayBuffer()), + blob: new Uint8Array(await data.photoFile.arrayBuffer()), }, } }), diff --git a/exercises/07.remix-component/02.solution.multiple-routes/app/routes/users+/$username_+/__note-editor.tsx b/exercises/07.remix-component/02.solution.multiple-routes/app/routes/users+/$username_+/__note-editor.tsx index 714fa7baf..7c8ee2109 100644 --- a/exercises/07.remix-component/02.solution.multiple-routes/app/routes/users+/$username_+/__note-editor.tsx +++ b/exercises/07.remix-component/02.solution.multiple-routes/app/routes/users+/$username_+/__note-editor.tsx @@ -96,7 +96,7 @@ export async function action({ request, params }: ActionFunctionArgs) { id: i.id, altText: i.altText, contentType: i.file.type, - blob: Buffer.from(await i.file.arrayBuffer()), + blob: new Uint8Array(await i.file.arrayBuffer()), } } else { return { id: i.id, altText: i.altText } @@ -111,7 +111,7 @@ export async function action({ request, params }: ActionFunctionArgs) { return { altText: image.altText, contentType: image.file.type, - blob: Buffer.from(await image.file.arrayBuffer()), + blob: new Uint8Array(await image.file.arrayBuffer()), } }), ), diff --git a/exercises/07.remix-component/02.solution.multiple-routes/app/utils/misc.tsx b/exercises/07.remix-component/02.solution.multiple-routes/app/utils/misc.tsx index 8879f6b41..a553484db 100644 --- a/exercises/07.remix-component/02.solution.multiple-routes/app/utils/misc.tsx +++ b/exercises/07.remix-component/02.solution.multiple-routes/app/utils/misc.tsx @@ -303,7 +303,7 @@ export async function downloadFile(url: string, retries: number = 0) { throw new Error(`Failed to fetch image with status ${response.status}`) } const contentType = response.headers.get('content-type') ?? 'image/jpg' - const blob = Buffer.from(await response.arrayBuffer()) + const blob = new Uint8Array(await response.arrayBuffer()) return { contentType, blob } } catch (e) { if (retries > MAX_RETRIES) throw e diff --git a/exercises/07.remix-component/02.solution.multiple-routes/index.js b/exercises/07.remix-component/02.solution.multiple-routes/index.js index 8ba83ba70..e8728a002 100644 --- a/exercises/07.remix-component/02.solution.multiple-routes/index.js +++ b/exercises/07.remix-component/02.solution.multiple-routes/index.js @@ -1,11 +1,8 @@ import 'dotenv/config' import 'source-map-support/register.js' -import { installGlobals } from '@remix-run/node' import chalk from 'chalk' import closeWithGrace from 'close-with-grace' -installGlobals() - if ( process.env.NODE_ENV !== 'production' || process.env.PLAYWRIGHT_TEST_BASE_URL diff --git a/exercises/07.remix-component/02.solution.multiple-routes/package.json b/exercises/07.remix-component/02.solution.multiple-routes/package.json index d2529172a..206872e81 100644 --- a/exercises/07.remix-component/02.solution.multiple-routes/package.json +++ b/exercises/07.remix-component/02.solution.multiple-routes/package.json @@ -30,9 +30,8 @@ "@conform-to/zod": "^0.9.0", "@epic-web/remember": "^1.1.0", "@epic-web/totp": "^1.1.2", - "@epic-web/workshop-utils": "^4.21.1", "@paralleldrive/cuid2": "^2.2.2", - "@prisma/client": "^5.16.2", + "@prisma/client": "^6.19.1", "@radix-ui/react-checkbox": "^1.1.1", "@radix-ui/react-dropdown-menu": "^2.1.1", "@radix-ui/react-label": "^2.1.0", @@ -59,13 +58,13 @@ "glob": "^11.0.0", "isbot": "^5.1.12", "morgan": "^1.10.0", - "prisma": "^5.16.2", + "prisma": "^6.19.1", "qrcode": "^1.5.3", "react": "^18.3.1", "react-dom": "^18.3.1", "remix-auth": "^3.7.0", "remix-auth-form": "^1.5.0", - "remix-auth-github": "^1.7.0", + "remix-auth-github": "1.7.0", "remix-utils": "^7.6.0", "sonner": "^1.5.0", "source-map-support": "^0.5.21", @@ -111,7 +110,7 @@ "execa": "^9.3.0", "fs-extra": "^11.2.0", "jsdom": "^24.1.0", - "msw": "^2.3.1", + "msw": "^2.12.4", "node-html-parser": "^6.1.13", "npm-run-all": "^4.1.5", "prettier": "^3.3.2", diff --git a/exercises/07.remix-component/02.solution.multiple-routes/tests/db-utils.ts b/exercises/07.remix-component/02.solution.multiple-routes/tests/db-utils.ts index 8f5062e16..2e1e23550 100644 --- a/exercises/07.remix-component/02.solution.multiple-routes/tests/db-utils.ts +++ b/exercises/07.remix-component/02.solution.multiple-routes/tests/db-utils.ts @@ -67,7 +67,7 @@ export async function getNoteImages() { }), img({ altText: - 'an office full of laptops and other office equipment that look like it was abandond in a rush out of the building in an emergency years ago.', + 'an office full of laptops and other office equipment that look like it was abandoned in a rush out of the building in an emergency years ago.', filepath: './tests/fixtures/images/notes/6.png', }), img({ @@ -110,6 +110,6 @@ export async function img({ return { altText, contentType: filepath.endsWith('.png') ? 'image/png' : 'image/jpeg', - blob: await fs.promises.readFile(filepath), + blob: new Uint8Array(await fs.promises.readFile(filepath)), } } diff --git a/exercises/07.remix-component/02.solution.multiple-routes/tests/e2e/onboarding.test.ts b/exercises/07.remix-component/02.solution.multiple-routes/tests/e2e/onboarding.test.ts index cd39afab3..88303b8c0 100644 --- a/exercises/07.remix-component/02.solution.multiple-routes/tests/e2e/onboarding.test.ts +++ b/exercises/07.remix-component/02.solution.multiple-routes/tests/e2e/onboarding.test.ts @@ -49,9 +49,7 @@ test('onboarding with link', async ({ page, getOnboardingData }) => { await page.getByRole('textbox', { name: /email/i }).fill(onboardingData.email) await page.getByRole('button', { name: /submit/i }).click() - await expect( - page.getByRole('button', { name: /submit/i, disabled: true }), - ).toBeVisible() + await expect(page.getByText(/check your email/i)).toBeVisible() const email = await waitFor(() => requireEmail(onboardingData.email)) diff --git a/exercises/07.remix-component/02.solution.multiple-routes/tests/setup/setup-test-env.ts b/exercises/07.remix-component/02.solution.multiple-routes/tests/setup/setup-test-env.ts index 477331463..f41c41463 100644 --- a/exercises/07.remix-component/02.solution.multiple-routes/tests/setup/setup-test-env.ts +++ b/exercises/07.remix-component/02.solution.multiple-routes/tests/setup/setup-test-env.ts @@ -1,12 +1,9 @@ import 'dotenv/config' import '#app/utils/env.server.ts' import '@testing-library/jest-dom/vitest' -import { installGlobals } from '@remix-run/node' import { cleanup } from '@testing-library/react' import { afterEach, beforeEach, vi, type MockInstance } from 'vitest' -installGlobals() - afterEach(() => cleanup()) export let consoleError: MockInstance diff --git a/exercises/07.remix-component/README.mdx b/exercises/07.remix-component/README.mdx index eff5893df..e5c3a8985 100644 --- a/exercises/07.remix-component/README.mdx +++ b/exercises/07.remix-component/README.mdx @@ -13,7 +13,7 @@ So, the Remix team is working on a great solution for this called `createRemixStub` which allows you to create a mini-Remix app that you can render in your test and have all the routes you need for testing the component: -```tsx filename=app/routes/counter.test.tsx +```tsx filename=app/routes/counter.tsx import { useLoaderData } from '@remix-run/react' import { db } from '#app/utils/db.server' @@ -36,7 +36,7 @@ export default function Counter() { } ``` -```tsx filename=app/counter.test.tsx +```tsx filename=app/routes/counter.test.tsx import * as React from 'react' import { render, screen } from '@testing-library/react' import userEvent from '@testing-library/user-event' @@ -70,7 +70,7 @@ logic, however, I'm often interested in testing the component holistically, so we can actually import and use the original `action` and `loader` from the route as well: -```tsx filename=app/counter.test.tsx +```tsx filename=app/routes/counter.test.tsx import * as React from 'react' import { render, screen } from '@testing-library/react' import userEvent from '@testing-library/user-event' diff --git a/exercises/08.http-mocking/01.problem.start-server/app/epicshop.tsx b/exercises/08.http-mocking/01.problem.start-server/app/epicshop.tsx deleted file mode 100644 index 96c5597cb..000000000 --- a/exercises/08.http-mocking/01.problem.start-server/app/epicshop.tsx +++ /dev/null @@ -1,9 +0,0 @@ -// Ignore this file please -import { EpicShopIFrameSync } from '@epic-web/workshop-utils/iframe-sync' -import { useNavigate } from '@remix-run/react' -import * as React from 'react' - -export function EpicShop() { - const navigate = useNavigate() - return -} diff --git a/exercises/08.http-mocking/01.problem.start-server/app/root.tsx b/exercises/08.http-mocking/01.problem.start-server/app/root.tsx index 3b2064a1a..fa7f41981 100644 --- a/exercises/08.http-mocking/01.problem.start-server/app/root.tsx +++ b/exercises/08.http-mocking/01.problem.start-server/app/root.tsx @@ -34,7 +34,6 @@ import { SearchBar } from './components/search-bar.tsx' import { Spacer } from './components/spacer.tsx' import { Button } from './components/ui/button.tsx' import { Icon } from './components/ui/icon.tsx' -import { EpicShop } from './epicshop.tsx' import fontStylestylesheetUrl from './styles/font.css' import tailwindStylesheetUrl from './styles/tailwind.css' import { getUserId } from './utils/auth.server.ts' @@ -159,7 +158,6 @@ function Document({ - diff --git a/exercises/08.http-mocking/01.problem.start-server/app/routes/resources+/note-images.$imageId.tsx b/exercises/08.http-mocking/01.problem.start-server/app/routes/resources+/note-images.$imageId.tsx index 417545a3e..865878a92 100644 --- a/exercises/08.http-mocking/01.problem.start-server/app/routes/resources+/note-images.$imageId.tsx +++ b/exercises/08.http-mocking/01.problem.start-server/app/routes/resources+/note-images.$imageId.tsx @@ -14,7 +14,7 @@ export async function loader({ params }: LoaderFunctionArgs) { return new Response(image.blob, { headers: { 'content-type': image.contentType, - 'content-length': Buffer.byteLength(image.blob).toString(), + 'content-length': image.blob.length.toString(), 'content-disposition': `inline; filename="${params.imageId}"`, 'cache-control': 'public, max-age=31536000, immutable', }, diff --git a/exercises/08.http-mocking/01.problem.start-server/app/routes/resources+/user-images.$imageId.tsx b/exercises/08.http-mocking/01.problem.start-server/app/routes/resources+/user-images.$imageId.tsx index c5a66b146..2de45198e 100644 --- a/exercises/08.http-mocking/01.problem.start-server/app/routes/resources+/user-images.$imageId.tsx +++ b/exercises/08.http-mocking/01.problem.start-server/app/routes/resources+/user-images.$imageId.tsx @@ -14,7 +14,7 @@ export async function loader({ params }: LoaderFunctionArgs) { return new Response(image.blob, { headers: { 'content-type': image.contentType, - 'content-length': Buffer.byteLength(image.blob).toString(), + 'content-length': image.blob.length.toString(), 'content-disposition': `inline; filename="${params.imageId}"`, 'cache-control': 'public, max-age=31536000, immutable', }, diff --git a/exercises/08.http-mocking/01.problem.start-server/app/routes/settings+/profile.photo.tsx b/exercises/08.http-mocking/01.problem.start-server/app/routes/settings+/profile.photo.tsx index f452baf9a..36e397f0b 100644 --- a/exercises/08.http-mocking/01.problem.start-server/app/routes/settings+/profile.photo.tsx +++ b/exercises/08.http-mocking/01.problem.start-server/app/routes/settings+/profile.photo.tsx @@ -76,7 +76,7 @@ export async function action({ request }: ActionFunctionArgs) { return { image: { contentType: data.photoFile.type, - blob: Buffer.from(await data.photoFile.arrayBuffer()), + blob: new Uint8Array(await data.photoFile.arrayBuffer()), }, } }), diff --git a/exercises/08.http-mocking/01.problem.start-server/app/routes/users+/$username_+/__note-editor.tsx b/exercises/08.http-mocking/01.problem.start-server/app/routes/users+/$username_+/__note-editor.tsx index 714fa7baf..7c8ee2109 100644 --- a/exercises/08.http-mocking/01.problem.start-server/app/routes/users+/$username_+/__note-editor.tsx +++ b/exercises/08.http-mocking/01.problem.start-server/app/routes/users+/$username_+/__note-editor.tsx @@ -96,7 +96,7 @@ export async function action({ request, params }: ActionFunctionArgs) { id: i.id, altText: i.altText, contentType: i.file.type, - blob: Buffer.from(await i.file.arrayBuffer()), + blob: new Uint8Array(await i.file.arrayBuffer()), } } else { return { id: i.id, altText: i.altText } @@ -111,7 +111,7 @@ export async function action({ request, params }: ActionFunctionArgs) { return { altText: image.altText, contentType: image.file.type, - blob: Buffer.from(await image.file.arrayBuffer()), + blob: new Uint8Array(await image.file.arrayBuffer()), } }), ), diff --git a/exercises/08.http-mocking/01.problem.start-server/app/utils/misc.tsx b/exercises/08.http-mocking/01.problem.start-server/app/utils/misc.tsx index 8879f6b41..a553484db 100644 --- a/exercises/08.http-mocking/01.problem.start-server/app/utils/misc.tsx +++ b/exercises/08.http-mocking/01.problem.start-server/app/utils/misc.tsx @@ -303,7 +303,7 @@ export async function downloadFile(url: string, retries: number = 0) { throw new Error(`Failed to fetch image with status ${response.status}`) } const contentType = response.headers.get('content-type') ?? 'image/jpg' - const blob = Buffer.from(await response.arrayBuffer()) + const blob = new Uint8Array(await response.arrayBuffer()) return { contentType, blob } } catch (e) { if (retries > MAX_RETRIES) throw e diff --git a/exercises/08.http-mocking/01.problem.start-server/index.js b/exercises/08.http-mocking/01.problem.start-server/index.js index 8ba83ba70..e8728a002 100644 --- a/exercises/08.http-mocking/01.problem.start-server/index.js +++ b/exercises/08.http-mocking/01.problem.start-server/index.js @@ -1,11 +1,8 @@ import 'dotenv/config' import 'source-map-support/register.js' -import { installGlobals } from '@remix-run/node' import chalk from 'chalk' import closeWithGrace from 'close-with-grace' -installGlobals() - if ( process.env.NODE_ENV !== 'production' || process.env.PLAYWRIGHT_TEST_BASE_URL diff --git a/exercises/08.http-mocking/01.problem.start-server/package.json b/exercises/08.http-mocking/01.problem.start-server/package.json index 2954b083a..e7b1c0506 100644 --- a/exercises/08.http-mocking/01.problem.start-server/package.json +++ b/exercises/08.http-mocking/01.problem.start-server/package.json @@ -30,9 +30,8 @@ "@conform-to/zod": "^0.9.0", "@epic-web/remember": "^1.1.0", "@epic-web/totp": "^1.1.2", - "@epic-web/workshop-utils": "^4.21.1", "@paralleldrive/cuid2": "^2.2.2", - "@prisma/client": "^5.16.2", + "@prisma/client": "^6.19.1", "@radix-ui/react-checkbox": "^1.1.1", "@radix-ui/react-dropdown-menu": "^2.1.1", "@radix-ui/react-label": "^2.1.0", @@ -59,13 +58,13 @@ "glob": "^11.0.0", "isbot": "^5.1.12", "morgan": "^1.10.0", - "prisma": "^5.16.2", + "prisma": "^6.19.1", "qrcode": "^1.5.3", "react": "^18.3.1", "react-dom": "^18.3.1", "remix-auth": "^3.7.0", "remix-auth-form": "^1.5.0", - "remix-auth-github": "^1.7.0", + "remix-auth-github": "1.7.0", "remix-utils": "^7.6.0", "sonner": "^1.5.0", "source-map-support": "^0.5.21", @@ -111,7 +110,7 @@ "execa": "^9.3.0", "fs-extra": "^11.2.0", "jsdom": "^24.1.0", - "msw": "^2.3.1", + "msw": "^2.12.4", "node-html-parser": "^6.1.13", "npm-run-all": "^4.1.5", "prettier": "^3.3.2", diff --git a/exercises/08.http-mocking/01.problem.start-server/tests/db-utils.ts b/exercises/08.http-mocking/01.problem.start-server/tests/db-utils.ts index 8f5062e16..2e1e23550 100644 --- a/exercises/08.http-mocking/01.problem.start-server/tests/db-utils.ts +++ b/exercises/08.http-mocking/01.problem.start-server/tests/db-utils.ts @@ -67,7 +67,7 @@ export async function getNoteImages() { }), img({ altText: - 'an office full of laptops and other office equipment that look like it was abandond in a rush out of the building in an emergency years ago.', + 'an office full of laptops and other office equipment that look like it was abandoned in a rush out of the building in an emergency years ago.', filepath: './tests/fixtures/images/notes/6.png', }), img({ @@ -110,6 +110,6 @@ export async function img({ return { altText, contentType: filepath.endsWith('.png') ? 'image/png' : 'image/jpeg', - blob: await fs.promises.readFile(filepath), + blob: new Uint8Array(await fs.promises.readFile(filepath)), } } diff --git a/exercises/08.http-mocking/01.problem.start-server/tests/e2e/onboarding.test.ts b/exercises/08.http-mocking/01.problem.start-server/tests/e2e/onboarding.test.ts index cd39afab3..88303b8c0 100644 --- a/exercises/08.http-mocking/01.problem.start-server/tests/e2e/onboarding.test.ts +++ b/exercises/08.http-mocking/01.problem.start-server/tests/e2e/onboarding.test.ts @@ -49,9 +49,7 @@ test('onboarding with link', async ({ page, getOnboardingData }) => { await page.getByRole('textbox', { name: /email/i }).fill(onboardingData.email) await page.getByRole('button', { name: /submit/i }).click() - await expect( - page.getByRole('button', { name: /submit/i, disabled: true }), - ).toBeVisible() + await expect(page.getByText(/check your email/i)).toBeVisible() const email = await waitFor(() => requireEmail(onboardingData.email)) diff --git a/exercises/08.http-mocking/01.problem.start-server/tests/setup/setup-test-env.ts b/exercises/08.http-mocking/01.problem.start-server/tests/setup/setup-test-env.ts index 477331463..f41c41463 100644 --- a/exercises/08.http-mocking/01.problem.start-server/tests/setup/setup-test-env.ts +++ b/exercises/08.http-mocking/01.problem.start-server/tests/setup/setup-test-env.ts @@ -1,12 +1,9 @@ import 'dotenv/config' import '#app/utils/env.server.ts' import '@testing-library/jest-dom/vitest' -import { installGlobals } from '@remix-run/node' import { cleanup } from '@testing-library/react' import { afterEach, beforeEach, vi, type MockInstance } from 'vitest' -installGlobals() - afterEach(() => cleanup()) export let consoleError: MockInstance diff --git a/exercises/08.http-mocking/01.solution.start-server/app/epicshop.tsx b/exercises/08.http-mocking/01.solution.start-server/app/epicshop.tsx deleted file mode 100644 index 96c5597cb..000000000 --- a/exercises/08.http-mocking/01.solution.start-server/app/epicshop.tsx +++ /dev/null @@ -1,9 +0,0 @@ -// Ignore this file please -import { EpicShopIFrameSync } from '@epic-web/workshop-utils/iframe-sync' -import { useNavigate } from '@remix-run/react' -import * as React from 'react' - -export function EpicShop() { - const navigate = useNavigate() - return -} diff --git a/exercises/08.http-mocking/01.solution.start-server/app/root.tsx b/exercises/08.http-mocking/01.solution.start-server/app/root.tsx index 3b2064a1a..fa7f41981 100644 --- a/exercises/08.http-mocking/01.solution.start-server/app/root.tsx +++ b/exercises/08.http-mocking/01.solution.start-server/app/root.tsx @@ -34,7 +34,6 @@ import { SearchBar } from './components/search-bar.tsx' import { Spacer } from './components/spacer.tsx' import { Button } from './components/ui/button.tsx' import { Icon } from './components/ui/icon.tsx' -import { EpicShop } from './epicshop.tsx' import fontStylestylesheetUrl from './styles/font.css' import tailwindStylesheetUrl from './styles/tailwind.css' import { getUserId } from './utils/auth.server.ts' @@ -159,7 +158,6 @@ function Document({ - diff --git a/exercises/08.http-mocking/01.solution.start-server/app/routes/resources+/note-images.$imageId.tsx b/exercises/08.http-mocking/01.solution.start-server/app/routes/resources+/note-images.$imageId.tsx index 417545a3e..865878a92 100644 --- a/exercises/08.http-mocking/01.solution.start-server/app/routes/resources+/note-images.$imageId.tsx +++ b/exercises/08.http-mocking/01.solution.start-server/app/routes/resources+/note-images.$imageId.tsx @@ -14,7 +14,7 @@ export async function loader({ params }: LoaderFunctionArgs) { return new Response(image.blob, { headers: { 'content-type': image.contentType, - 'content-length': Buffer.byteLength(image.blob).toString(), + 'content-length': image.blob.length.toString(), 'content-disposition': `inline; filename="${params.imageId}"`, 'cache-control': 'public, max-age=31536000, immutable', }, diff --git a/exercises/08.http-mocking/01.solution.start-server/app/routes/resources+/user-images.$imageId.tsx b/exercises/08.http-mocking/01.solution.start-server/app/routes/resources+/user-images.$imageId.tsx index c5a66b146..2de45198e 100644 --- a/exercises/08.http-mocking/01.solution.start-server/app/routes/resources+/user-images.$imageId.tsx +++ b/exercises/08.http-mocking/01.solution.start-server/app/routes/resources+/user-images.$imageId.tsx @@ -14,7 +14,7 @@ export async function loader({ params }: LoaderFunctionArgs) { return new Response(image.blob, { headers: { 'content-type': image.contentType, - 'content-length': Buffer.byteLength(image.blob).toString(), + 'content-length': image.blob.length.toString(), 'content-disposition': `inline; filename="${params.imageId}"`, 'cache-control': 'public, max-age=31536000, immutable', }, diff --git a/exercises/08.http-mocking/01.solution.start-server/app/routes/settings+/profile.photo.tsx b/exercises/08.http-mocking/01.solution.start-server/app/routes/settings+/profile.photo.tsx index f452baf9a..36e397f0b 100644 --- a/exercises/08.http-mocking/01.solution.start-server/app/routes/settings+/profile.photo.tsx +++ b/exercises/08.http-mocking/01.solution.start-server/app/routes/settings+/profile.photo.tsx @@ -76,7 +76,7 @@ export async function action({ request }: ActionFunctionArgs) { return { image: { contentType: data.photoFile.type, - blob: Buffer.from(await data.photoFile.arrayBuffer()), + blob: new Uint8Array(await data.photoFile.arrayBuffer()), }, } }), diff --git a/exercises/08.http-mocking/01.solution.start-server/app/routes/users+/$username_+/__note-editor.tsx b/exercises/08.http-mocking/01.solution.start-server/app/routes/users+/$username_+/__note-editor.tsx index 714fa7baf..7c8ee2109 100644 --- a/exercises/08.http-mocking/01.solution.start-server/app/routes/users+/$username_+/__note-editor.tsx +++ b/exercises/08.http-mocking/01.solution.start-server/app/routes/users+/$username_+/__note-editor.tsx @@ -96,7 +96,7 @@ export async function action({ request, params }: ActionFunctionArgs) { id: i.id, altText: i.altText, contentType: i.file.type, - blob: Buffer.from(await i.file.arrayBuffer()), + blob: new Uint8Array(await i.file.arrayBuffer()), } } else { return { id: i.id, altText: i.altText } @@ -111,7 +111,7 @@ export async function action({ request, params }: ActionFunctionArgs) { return { altText: image.altText, contentType: image.file.type, - blob: Buffer.from(await image.file.arrayBuffer()), + blob: new Uint8Array(await image.file.arrayBuffer()), } }), ), diff --git a/exercises/08.http-mocking/01.solution.start-server/app/utils/misc.tsx b/exercises/08.http-mocking/01.solution.start-server/app/utils/misc.tsx index 8879f6b41..a553484db 100644 --- a/exercises/08.http-mocking/01.solution.start-server/app/utils/misc.tsx +++ b/exercises/08.http-mocking/01.solution.start-server/app/utils/misc.tsx @@ -303,7 +303,7 @@ export async function downloadFile(url: string, retries: number = 0) { throw new Error(`Failed to fetch image with status ${response.status}`) } const contentType = response.headers.get('content-type') ?? 'image/jpg' - const blob = Buffer.from(await response.arrayBuffer()) + const blob = new Uint8Array(await response.arrayBuffer()) return { contentType, blob } } catch (e) { if (retries > MAX_RETRIES) throw e diff --git a/exercises/08.http-mocking/01.solution.start-server/index.js b/exercises/08.http-mocking/01.solution.start-server/index.js index 8ba83ba70..e8728a002 100644 --- a/exercises/08.http-mocking/01.solution.start-server/index.js +++ b/exercises/08.http-mocking/01.solution.start-server/index.js @@ -1,11 +1,8 @@ import 'dotenv/config' import 'source-map-support/register.js' -import { installGlobals } from '@remix-run/node' import chalk from 'chalk' import closeWithGrace from 'close-with-grace' -installGlobals() - if ( process.env.NODE_ENV !== 'production' || process.env.PLAYWRIGHT_TEST_BASE_URL diff --git a/exercises/08.http-mocking/01.solution.start-server/package.json b/exercises/08.http-mocking/01.solution.start-server/package.json index 3be9a8684..8b3f255cb 100644 --- a/exercises/08.http-mocking/01.solution.start-server/package.json +++ b/exercises/08.http-mocking/01.solution.start-server/package.json @@ -30,9 +30,8 @@ "@conform-to/zod": "^0.9.0", "@epic-web/remember": "^1.1.0", "@epic-web/totp": "^1.1.2", - "@epic-web/workshop-utils": "^4.21.1", "@paralleldrive/cuid2": "^2.2.2", - "@prisma/client": "^5.16.2", + "@prisma/client": "^6.19.1", "@radix-ui/react-checkbox": "^1.1.1", "@radix-ui/react-dropdown-menu": "^2.1.1", "@radix-ui/react-label": "^2.1.0", @@ -59,13 +58,13 @@ "glob": "^11.0.0", "isbot": "^5.1.12", "morgan": "^1.10.0", - "prisma": "^5.16.2", + "prisma": "^6.19.1", "qrcode": "^1.5.3", "react": "^18.3.1", "react-dom": "^18.3.1", "remix-auth": "^3.7.0", "remix-auth-form": "^1.5.0", - "remix-auth-github": "^1.7.0", + "remix-auth-github": "1.7.0", "remix-utils": "^7.6.0", "sonner": "^1.5.0", "source-map-support": "^0.5.21", @@ -111,7 +110,7 @@ "execa": "^9.3.0", "fs-extra": "^11.2.0", "jsdom": "^24.1.0", - "msw": "^2.3.1", + "msw": "^2.12.4", "node-html-parser": "^6.1.13", "npm-run-all": "^4.1.5", "prettier": "^3.3.2", diff --git a/exercises/08.http-mocking/01.solution.start-server/tests/db-utils.ts b/exercises/08.http-mocking/01.solution.start-server/tests/db-utils.ts index 8f5062e16..2e1e23550 100644 --- a/exercises/08.http-mocking/01.solution.start-server/tests/db-utils.ts +++ b/exercises/08.http-mocking/01.solution.start-server/tests/db-utils.ts @@ -67,7 +67,7 @@ export async function getNoteImages() { }), img({ altText: - 'an office full of laptops and other office equipment that look like it was abandond in a rush out of the building in an emergency years ago.', + 'an office full of laptops and other office equipment that look like it was abandoned in a rush out of the building in an emergency years ago.', filepath: './tests/fixtures/images/notes/6.png', }), img({ @@ -110,6 +110,6 @@ export async function img({ return { altText, contentType: filepath.endsWith('.png') ? 'image/png' : 'image/jpeg', - blob: await fs.promises.readFile(filepath), + blob: new Uint8Array(await fs.promises.readFile(filepath)), } } diff --git a/exercises/08.http-mocking/01.solution.start-server/tests/e2e/onboarding.test.ts b/exercises/08.http-mocking/01.solution.start-server/tests/e2e/onboarding.test.ts index cd39afab3..88303b8c0 100644 --- a/exercises/08.http-mocking/01.solution.start-server/tests/e2e/onboarding.test.ts +++ b/exercises/08.http-mocking/01.solution.start-server/tests/e2e/onboarding.test.ts @@ -49,9 +49,7 @@ test('onboarding with link', async ({ page, getOnboardingData }) => { await page.getByRole('textbox', { name: /email/i }).fill(onboardingData.email) await page.getByRole('button', { name: /submit/i }).click() - await expect( - page.getByRole('button', { name: /submit/i, disabled: true }), - ).toBeVisible() + await expect(page.getByText(/check your email/i)).toBeVisible() const email = await waitFor(() => requireEmail(onboardingData.email)) diff --git a/exercises/08.http-mocking/01.solution.start-server/tests/setup/setup-test-env.ts b/exercises/08.http-mocking/01.solution.start-server/tests/setup/setup-test-env.ts index 477331463..f41c41463 100644 --- a/exercises/08.http-mocking/01.solution.start-server/tests/setup/setup-test-env.ts +++ b/exercises/08.http-mocking/01.solution.start-server/tests/setup/setup-test-env.ts @@ -1,12 +1,9 @@ import 'dotenv/config' import '#app/utils/env.server.ts' import '@testing-library/jest-dom/vitest' -import { installGlobals } from '@remix-run/node' import { cleanup } from '@testing-library/react' import { afterEach, beforeEach, vi, type MockInstance } from 'vitest' -installGlobals() - afterEach(() => cleanup()) export let consoleError: MockInstance diff --git a/exercises/08.http-mocking/02.problem.override-mocks/app/epicshop.tsx b/exercises/08.http-mocking/02.problem.override-mocks/app/epicshop.tsx deleted file mode 100644 index 96c5597cb..000000000 --- a/exercises/08.http-mocking/02.problem.override-mocks/app/epicshop.tsx +++ /dev/null @@ -1,9 +0,0 @@ -// Ignore this file please -import { EpicShopIFrameSync } from '@epic-web/workshop-utils/iframe-sync' -import { useNavigate } from '@remix-run/react' -import * as React from 'react' - -export function EpicShop() { - const navigate = useNavigate() - return -} diff --git a/exercises/08.http-mocking/02.problem.override-mocks/app/root.tsx b/exercises/08.http-mocking/02.problem.override-mocks/app/root.tsx index 3b2064a1a..fa7f41981 100644 --- a/exercises/08.http-mocking/02.problem.override-mocks/app/root.tsx +++ b/exercises/08.http-mocking/02.problem.override-mocks/app/root.tsx @@ -34,7 +34,6 @@ import { SearchBar } from './components/search-bar.tsx' import { Spacer } from './components/spacer.tsx' import { Button } from './components/ui/button.tsx' import { Icon } from './components/ui/icon.tsx' -import { EpicShop } from './epicshop.tsx' import fontStylestylesheetUrl from './styles/font.css' import tailwindStylesheetUrl from './styles/tailwind.css' import { getUserId } from './utils/auth.server.ts' @@ -159,7 +158,6 @@ function Document({ - diff --git a/exercises/08.http-mocking/02.problem.override-mocks/app/routes/resources+/note-images.$imageId.tsx b/exercises/08.http-mocking/02.problem.override-mocks/app/routes/resources+/note-images.$imageId.tsx index 417545a3e..865878a92 100644 --- a/exercises/08.http-mocking/02.problem.override-mocks/app/routes/resources+/note-images.$imageId.tsx +++ b/exercises/08.http-mocking/02.problem.override-mocks/app/routes/resources+/note-images.$imageId.tsx @@ -14,7 +14,7 @@ export async function loader({ params }: LoaderFunctionArgs) { return new Response(image.blob, { headers: { 'content-type': image.contentType, - 'content-length': Buffer.byteLength(image.blob).toString(), + 'content-length': image.blob.length.toString(), 'content-disposition': `inline; filename="${params.imageId}"`, 'cache-control': 'public, max-age=31536000, immutable', }, diff --git a/exercises/08.http-mocking/02.problem.override-mocks/app/routes/resources+/user-images.$imageId.tsx b/exercises/08.http-mocking/02.problem.override-mocks/app/routes/resources+/user-images.$imageId.tsx index c5a66b146..2de45198e 100644 --- a/exercises/08.http-mocking/02.problem.override-mocks/app/routes/resources+/user-images.$imageId.tsx +++ b/exercises/08.http-mocking/02.problem.override-mocks/app/routes/resources+/user-images.$imageId.tsx @@ -14,7 +14,7 @@ export async function loader({ params }: LoaderFunctionArgs) { return new Response(image.blob, { headers: { 'content-type': image.contentType, - 'content-length': Buffer.byteLength(image.blob).toString(), + 'content-length': image.blob.length.toString(), 'content-disposition': `inline; filename="${params.imageId}"`, 'cache-control': 'public, max-age=31536000, immutable', }, diff --git a/exercises/08.http-mocking/02.problem.override-mocks/app/routes/settings+/profile.photo.tsx b/exercises/08.http-mocking/02.problem.override-mocks/app/routes/settings+/profile.photo.tsx index f452baf9a..36e397f0b 100644 --- a/exercises/08.http-mocking/02.problem.override-mocks/app/routes/settings+/profile.photo.tsx +++ b/exercises/08.http-mocking/02.problem.override-mocks/app/routes/settings+/profile.photo.tsx @@ -76,7 +76,7 @@ export async function action({ request }: ActionFunctionArgs) { return { image: { contentType: data.photoFile.type, - blob: Buffer.from(await data.photoFile.arrayBuffer()), + blob: new Uint8Array(await data.photoFile.arrayBuffer()), }, } }), diff --git a/exercises/08.http-mocking/02.problem.override-mocks/app/routes/users+/$username_+/__note-editor.tsx b/exercises/08.http-mocking/02.problem.override-mocks/app/routes/users+/$username_+/__note-editor.tsx index 714fa7baf..7c8ee2109 100644 --- a/exercises/08.http-mocking/02.problem.override-mocks/app/routes/users+/$username_+/__note-editor.tsx +++ b/exercises/08.http-mocking/02.problem.override-mocks/app/routes/users+/$username_+/__note-editor.tsx @@ -96,7 +96,7 @@ export async function action({ request, params }: ActionFunctionArgs) { id: i.id, altText: i.altText, contentType: i.file.type, - blob: Buffer.from(await i.file.arrayBuffer()), + blob: new Uint8Array(await i.file.arrayBuffer()), } } else { return { id: i.id, altText: i.altText } @@ -111,7 +111,7 @@ export async function action({ request, params }: ActionFunctionArgs) { return { altText: image.altText, contentType: image.file.type, - blob: Buffer.from(await image.file.arrayBuffer()), + blob: new Uint8Array(await image.file.arrayBuffer()), } }), ), diff --git a/exercises/08.http-mocking/02.problem.override-mocks/app/utils/misc.tsx b/exercises/08.http-mocking/02.problem.override-mocks/app/utils/misc.tsx index 8879f6b41..a553484db 100644 --- a/exercises/08.http-mocking/02.problem.override-mocks/app/utils/misc.tsx +++ b/exercises/08.http-mocking/02.problem.override-mocks/app/utils/misc.tsx @@ -303,7 +303,7 @@ export async function downloadFile(url: string, retries: number = 0) { throw new Error(`Failed to fetch image with status ${response.status}`) } const contentType = response.headers.get('content-type') ?? 'image/jpg' - const blob = Buffer.from(await response.arrayBuffer()) + const blob = new Uint8Array(await response.arrayBuffer()) return { contentType, blob } } catch (e) { if (retries > MAX_RETRIES) throw e diff --git a/exercises/08.http-mocking/02.problem.override-mocks/index.js b/exercises/08.http-mocking/02.problem.override-mocks/index.js index 8ba83ba70..e8728a002 100644 --- a/exercises/08.http-mocking/02.problem.override-mocks/index.js +++ b/exercises/08.http-mocking/02.problem.override-mocks/index.js @@ -1,11 +1,8 @@ import 'dotenv/config' import 'source-map-support/register.js' -import { installGlobals } from '@remix-run/node' import chalk from 'chalk' import closeWithGrace from 'close-with-grace' -installGlobals() - if ( process.env.NODE_ENV !== 'production' || process.env.PLAYWRIGHT_TEST_BASE_URL diff --git a/exercises/08.http-mocking/02.problem.override-mocks/package.json b/exercises/08.http-mocking/02.problem.override-mocks/package.json index d7035a451..34ff76c63 100644 --- a/exercises/08.http-mocking/02.problem.override-mocks/package.json +++ b/exercises/08.http-mocking/02.problem.override-mocks/package.json @@ -30,9 +30,8 @@ "@conform-to/zod": "^0.9.0", "@epic-web/remember": "^1.1.0", "@epic-web/totp": "^1.1.2", - "@epic-web/workshop-utils": "^4.21.1", "@paralleldrive/cuid2": "^2.2.2", - "@prisma/client": "^5.16.2", + "@prisma/client": "^6.19.1", "@radix-ui/react-checkbox": "^1.1.1", "@radix-ui/react-dropdown-menu": "^2.1.1", "@radix-ui/react-label": "^2.1.0", @@ -59,13 +58,13 @@ "glob": "^11.0.0", "isbot": "^5.1.12", "morgan": "^1.10.0", - "prisma": "^5.16.2", + "prisma": "^6.19.1", "qrcode": "^1.5.3", "react": "^18.3.1", "react-dom": "^18.3.1", "remix-auth": "^3.7.0", "remix-auth-form": "^1.5.0", - "remix-auth-github": "^1.7.0", + "remix-auth-github": "1.7.0", "remix-utils": "^7.6.0", "sonner": "^1.5.0", "source-map-support": "^0.5.21", @@ -111,7 +110,7 @@ "execa": "^9.3.0", "fs-extra": "^11.2.0", "jsdom": "^24.1.0", - "msw": "^2.3.1", + "msw": "^2.12.4", "node-html-parser": "^6.1.13", "npm-run-all": "^4.1.5", "prettier": "^3.3.2", diff --git a/exercises/08.http-mocking/02.problem.override-mocks/tests/db-utils.ts b/exercises/08.http-mocking/02.problem.override-mocks/tests/db-utils.ts index 8f5062e16..2e1e23550 100644 --- a/exercises/08.http-mocking/02.problem.override-mocks/tests/db-utils.ts +++ b/exercises/08.http-mocking/02.problem.override-mocks/tests/db-utils.ts @@ -67,7 +67,7 @@ export async function getNoteImages() { }), img({ altText: - 'an office full of laptops and other office equipment that look like it was abandond in a rush out of the building in an emergency years ago.', + 'an office full of laptops and other office equipment that look like it was abandoned in a rush out of the building in an emergency years ago.', filepath: './tests/fixtures/images/notes/6.png', }), img({ @@ -110,6 +110,6 @@ export async function img({ return { altText, contentType: filepath.endsWith('.png') ? 'image/png' : 'image/jpeg', - blob: await fs.promises.readFile(filepath), + blob: new Uint8Array(await fs.promises.readFile(filepath)), } } diff --git a/exercises/08.http-mocking/02.problem.override-mocks/tests/e2e/onboarding.test.ts b/exercises/08.http-mocking/02.problem.override-mocks/tests/e2e/onboarding.test.ts index cd39afab3..88303b8c0 100644 --- a/exercises/08.http-mocking/02.problem.override-mocks/tests/e2e/onboarding.test.ts +++ b/exercises/08.http-mocking/02.problem.override-mocks/tests/e2e/onboarding.test.ts @@ -49,9 +49,7 @@ test('onboarding with link', async ({ page, getOnboardingData }) => { await page.getByRole('textbox', { name: /email/i }).fill(onboardingData.email) await page.getByRole('button', { name: /submit/i }).click() - await expect( - page.getByRole('button', { name: /submit/i, disabled: true }), - ).toBeVisible() + await expect(page.getByText(/check your email/i)).toBeVisible() const email = await waitFor(() => requireEmail(onboardingData.email)) diff --git a/exercises/08.http-mocking/02.problem.override-mocks/tests/setup/setup-test-env.ts b/exercises/08.http-mocking/02.problem.override-mocks/tests/setup/setup-test-env.ts index 477331463..f41c41463 100644 --- a/exercises/08.http-mocking/02.problem.override-mocks/tests/setup/setup-test-env.ts +++ b/exercises/08.http-mocking/02.problem.override-mocks/tests/setup/setup-test-env.ts @@ -1,12 +1,9 @@ import 'dotenv/config' import '#app/utils/env.server.ts' import '@testing-library/jest-dom/vitest' -import { installGlobals } from '@remix-run/node' import { cleanup } from '@testing-library/react' import { afterEach, beforeEach, vi, type MockInstance } from 'vitest' -installGlobals() - afterEach(() => cleanup()) export let consoleError: MockInstance diff --git a/exercises/08.http-mocking/02.solution.override-mocks/app/epicshop.tsx b/exercises/08.http-mocking/02.solution.override-mocks/app/epicshop.tsx deleted file mode 100644 index 96c5597cb..000000000 --- a/exercises/08.http-mocking/02.solution.override-mocks/app/epicshop.tsx +++ /dev/null @@ -1,9 +0,0 @@ -// Ignore this file please -import { EpicShopIFrameSync } from '@epic-web/workshop-utils/iframe-sync' -import { useNavigate } from '@remix-run/react' -import * as React from 'react' - -export function EpicShop() { - const navigate = useNavigate() - return -} diff --git a/exercises/08.http-mocking/02.solution.override-mocks/app/root.tsx b/exercises/08.http-mocking/02.solution.override-mocks/app/root.tsx index 3b2064a1a..fa7f41981 100644 --- a/exercises/08.http-mocking/02.solution.override-mocks/app/root.tsx +++ b/exercises/08.http-mocking/02.solution.override-mocks/app/root.tsx @@ -34,7 +34,6 @@ import { SearchBar } from './components/search-bar.tsx' import { Spacer } from './components/spacer.tsx' import { Button } from './components/ui/button.tsx' import { Icon } from './components/ui/icon.tsx' -import { EpicShop } from './epicshop.tsx' import fontStylestylesheetUrl from './styles/font.css' import tailwindStylesheetUrl from './styles/tailwind.css' import { getUserId } from './utils/auth.server.ts' @@ -159,7 +158,6 @@ function Document({ - diff --git a/exercises/08.http-mocking/02.solution.override-mocks/app/routes/resources+/note-images.$imageId.tsx b/exercises/08.http-mocking/02.solution.override-mocks/app/routes/resources+/note-images.$imageId.tsx index 417545a3e..865878a92 100644 --- a/exercises/08.http-mocking/02.solution.override-mocks/app/routes/resources+/note-images.$imageId.tsx +++ b/exercises/08.http-mocking/02.solution.override-mocks/app/routes/resources+/note-images.$imageId.tsx @@ -14,7 +14,7 @@ export async function loader({ params }: LoaderFunctionArgs) { return new Response(image.blob, { headers: { 'content-type': image.contentType, - 'content-length': Buffer.byteLength(image.blob).toString(), + 'content-length': image.blob.length.toString(), 'content-disposition': `inline; filename="${params.imageId}"`, 'cache-control': 'public, max-age=31536000, immutable', }, diff --git a/exercises/08.http-mocking/02.solution.override-mocks/app/routes/resources+/user-images.$imageId.tsx b/exercises/08.http-mocking/02.solution.override-mocks/app/routes/resources+/user-images.$imageId.tsx index c5a66b146..2de45198e 100644 --- a/exercises/08.http-mocking/02.solution.override-mocks/app/routes/resources+/user-images.$imageId.tsx +++ b/exercises/08.http-mocking/02.solution.override-mocks/app/routes/resources+/user-images.$imageId.tsx @@ -14,7 +14,7 @@ export async function loader({ params }: LoaderFunctionArgs) { return new Response(image.blob, { headers: { 'content-type': image.contentType, - 'content-length': Buffer.byteLength(image.blob).toString(), + 'content-length': image.blob.length.toString(), 'content-disposition': `inline; filename="${params.imageId}"`, 'cache-control': 'public, max-age=31536000, immutable', }, diff --git a/exercises/08.http-mocking/02.solution.override-mocks/app/routes/settings+/profile.photo.tsx b/exercises/08.http-mocking/02.solution.override-mocks/app/routes/settings+/profile.photo.tsx index f452baf9a..36e397f0b 100644 --- a/exercises/08.http-mocking/02.solution.override-mocks/app/routes/settings+/profile.photo.tsx +++ b/exercises/08.http-mocking/02.solution.override-mocks/app/routes/settings+/profile.photo.tsx @@ -76,7 +76,7 @@ export async function action({ request }: ActionFunctionArgs) { return { image: { contentType: data.photoFile.type, - blob: Buffer.from(await data.photoFile.arrayBuffer()), + blob: new Uint8Array(await data.photoFile.arrayBuffer()), }, } }), diff --git a/exercises/08.http-mocking/02.solution.override-mocks/app/routes/users+/$username_+/__note-editor.tsx b/exercises/08.http-mocking/02.solution.override-mocks/app/routes/users+/$username_+/__note-editor.tsx index 714fa7baf..7c8ee2109 100644 --- a/exercises/08.http-mocking/02.solution.override-mocks/app/routes/users+/$username_+/__note-editor.tsx +++ b/exercises/08.http-mocking/02.solution.override-mocks/app/routes/users+/$username_+/__note-editor.tsx @@ -96,7 +96,7 @@ export async function action({ request, params }: ActionFunctionArgs) { id: i.id, altText: i.altText, contentType: i.file.type, - blob: Buffer.from(await i.file.arrayBuffer()), + blob: new Uint8Array(await i.file.arrayBuffer()), } } else { return { id: i.id, altText: i.altText } @@ -111,7 +111,7 @@ export async function action({ request, params }: ActionFunctionArgs) { return { altText: image.altText, contentType: image.file.type, - blob: Buffer.from(await image.file.arrayBuffer()), + blob: new Uint8Array(await image.file.arrayBuffer()), } }), ), diff --git a/exercises/08.http-mocking/02.solution.override-mocks/app/utils/misc.tsx b/exercises/08.http-mocking/02.solution.override-mocks/app/utils/misc.tsx index 8879f6b41..a553484db 100644 --- a/exercises/08.http-mocking/02.solution.override-mocks/app/utils/misc.tsx +++ b/exercises/08.http-mocking/02.solution.override-mocks/app/utils/misc.tsx @@ -303,7 +303,7 @@ export async function downloadFile(url: string, retries: number = 0) { throw new Error(`Failed to fetch image with status ${response.status}`) } const contentType = response.headers.get('content-type') ?? 'image/jpg' - const blob = Buffer.from(await response.arrayBuffer()) + const blob = new Uint8Array(await response.arrayBuffer()) return { contentType, blob } } catch (e) { if (retries > MAX_RETRIES) throw e diff --git a/exercises/08.http-mocking/02.solution.override-mocks/index.js b/exercises/08.http-mocking/02.solution.override-mocks/index.js index 8ba83ba70..e8728a002 100644 --- a/exercises/08.http-mocking/02.solution.override-mocks/index.js +++ b/exercises/08.http-mocking/02.solution.override-mocks/index.js @@ -1,11 +1,8 @@ import 'dotenv/config' import 'source-map-support/register.js' -import { installGlobals } from '@remix-run/node' import chalk from 'chalk' import closeWithGrace from 'close-with-grace' -installGlobals() - if ( process.env.NODE_ENV !== 'production' || process.env.PLAYWRIGHT_TEST_BASE_URL diff --git a/exercises/08.http-mocking/02.solution.override-mocks/package.json b/exercises/08.http-mocking/02.solution.override-mocks/package.json index 18758b8ba..362bf6297 100644 --- a/exercises/08.http-mocking/02.solution.override-mocks/package.json +++ b/exercises/08.http-mocking/02.solution.override-mocks/package.json @@ -30,9 +30,8 @@ "@conform-to/zod": "^0.9.0", "@epic-web/remember": "^1.1.0", "@epic-web/totp": "^1.1.2", - "@epic-web/workshop-utils": "^4.21.1", "@paralleldrive/cuid2": "^2.2.2", - "@prisma/client": "^5.16.2", + "@prisma/client": "^6.19.1", "@radix-ui/react-checkbox": "^1.1.1", "@radix-ui/react-dropdown-menu": "^2.1.1", "@radix-ui/react-label": "^2.1.0", @@ -59,13 +58,13 @@ "glob": "^11.0.0", "isbot": "^5.1.12", "morgan": "^1.10.0", - "prisma": "^5.16.2", + "prisma": "^6.19.1", "qrcode": "^1.5.3", "react": "^18.3.1", "react-dom": "^18.3.1", "remix-auth": "^3.7.0", "remix-auth-form": "^1.5.0", - "remix-auth-github": "^1.7.0", + "remix-auth-github": "1.7.0", "remix-utils": "^7.6.0", "sonner": "^1.5.0", "source-map-support": "^0.5.21", @@ -111,7 +110,7 @@ "execa": "^9.3.0", "fs-extra": "^11.2.0", "jsdom": "^24.1.0", - "msw": "^2.3.1", + "msw": "^2.12.4", "node-html-parser": "^6.1.13", "npm-run-all": "^4.1.5", "prettier": "^3.3.2", diff --git a/exercises/08.http-mocking/02.solution.override-mocks/tests/db-utils.ts b/exercises/08.http-mocking/02.solution.override-mocks/tests/db-utils.ts index 8f5062e16..2e1e23550 100644 --- a/exercises/08.http-mocking/02.solution.override-mocks/tests/db-utils.ts +++ b/exercises/08.http-mocking/02.solution.override-mocks/tests/db-utils.ts @@ -67,7 +67,7 @@ export async function getNoteImages() { }), img({ altText: - 'an office full of laptops and other office equipment that look like it was abandond in a rush out of the building in an emergency years ago.', + 'an office full of laptops and other office equipment that look like it was abandoned in a rush out of the building in an emergency years ago.', filepath: './tests/fixtures/images/notes/6.png', }), img({ @@ -110,6 +110,6 @@ export async function img({ return { altText, contentType: filepath.endsWith('.png') ? 'image/png' : 'image/jpeg', - blob: await fs.promises.readFile(filepath), + blob: new Uint8Array(await fs.promises.readFile(filepath)), } } diff --git a/exercises/08.http-mocking/02.solution.override-mocks/tests/e2e/onboarding.test.ts b/exercises/08.http-mocking/02.solution.override-mocks/tests/e2e/onboarding.test.ts index cd39afab3..88303b8c0 100644 --- a/exercises/08.http-mocking/02.solution.override-mocks/tests/e2e/onboarding.test.ts +++ b/exercises/08.http-mocking/02.solution.override-mocks/tests/e2e/onboarding.test.ts @@ -49,9 +49,7 @@ test('onboarding with link', async ({ page, getOnboardingData }) => { await page.getByRole('textbox', { name: /email/i }).fill(onboardingData.email) await page.getByRole('button', { name: /submit/i }).click() - await expect( - page.getByRole('button', { name: /submit/i, disabled: true }), - ).toBeVisible() + await expect(page.getByText(/check your email/i)).toBeVisible() const email = await waitFor(() => requireEmail(onboardingData.email)) diff --git a/exercises/08.http-mocking/02.solution.override-mocks/tests/setup/setup-test-env.ts b/exercises/08.http-mocking/02.solution.override-mocks/tests/setup/setup-test-env.ts index 477331463..f41c41463 100644 --- a/exercises/08.http-mocking/02.solution.override-mocks/tests/setup/setup-test-env.ts +++ b/exercises/08.http-mocking/02.solution.override-mocks/tests/setup/setup-test-env.ts @@ -1,12 +1,9 @@ import 'dotenv/config' import '#app/utils/env.server.ts' import '@testing-library/jest-dom/vitest' -import { installGlobals } from '@remix-run/node' import { cleanup } from '@testing-library/react' import { afterEach, beforeEach, vi, type MockInstance } from 'vitest' -installGlobals() - afterEach(() => cleanup()) export let consoleError: MockInstance diff --git a/exercises/08.http-mocking/03.problem.setup/app/epicshop.tsx b/exercises/08.http-mocking/03.problem.setup/app/epicshop.tsx deleted file mode 100644 index 96c5597cb..000000000 --- a/exercises/08.http-mocking/03.problem.setup/app/epicshop.tsx +++ /dev/null @@ -1,9 +0,0 @@ -// Ignore this file please -import { EpicShopIFrameSync } from '@epic-web/workshop-utils/iframe-sync' -import { useNavigate } from '@remix-run/react' -import * as React from 'react' - -export function EpicShop() { - const navigate = useNavigate() - return -} diff --git a/exercises/08.http-mocking/03.problem.setup/app/root.tsx b/exercises/08.http-mocking/03.problem.setup/app/root.tsx index 3b2064a1a..fa7f41981 100644 --- a/exercises/08.http-mocking/03.problem.setup/app/root.tsx +++ b/exercises/08.http-mocking/03.problem.setup/app/root.tsx @@ -34,7 +34,6 @@ import { SearchBar } from './components/search-bar.tsx' import { Spacer } from './components/spacer.tsx' import { Button } from './components/ui/button.tsx' import { Icon } from './components/ui/icon.tsx' -import { EpicShop } from './epicshop.tsx' import fontStylestylesheetUrl from './styles/font.css' import tailwindStylesheetUrl from './styles/tailwind.css' import { getUserId } from './utils/auth.server.ts' @@ -159,7 +158,6 @@ function Document({ - diff --git a/exercises/08.http-mocking/03.problem.setup/app/routes/resources+/note-images.$imageId.tsx b/exercises/08.http-mocking/03.problem.setup/app/routes/resources+/note-images.$imageId.tsx index 417545a3e..865878a92 100644 --- a/exercises/08.http-mocking/03.problem.setup/app/routes/resources+/note-images.$imageId.tsx +++ b/exercises/08.http-mocking/03.problem.setup/app/routes/resources+/note-images.$imageId.tsx @@ -14,7 +14,7 @@ export async function loader({ params }: LoaderFunctionArgs) { return new Response(image.blob, { headers: { 'content-type': image.contentType, - 'content-length': Buffer.byteLength(image.blob).toString(), + 'content-length': image.blob.length.toString(), 'content-disposition': `inline; filename="${params.imageId}"`, 'cache-control': 'public, max-age=31536000, immutable', }, diff --git a/exercises/08.http-mocking/03.problem.setup/app/routes/resources+/user-images.$imageId.tsx b/exercises/08.http-mocking/03.problem.setup/app/routes/resources+/user-images.$imageId.tsx index c5a66b146..2de45198e 100644 --- a/exercises/08.http-mocking/03.problem.setup/app/routes/resources+/user-images.$imageId.tsx +++ b/exercises/08.http-mocking/03.problem.setup/app/routes/resources+/user-images.$imageId.tsx @@ -14,7 +14,7 @@ export async function loader({ params }: LoaderFunctionArgs) { return new Response(image.blob, { headers: { 'content-type': image.contentType, - 'content-length': Buffer.byteLength(image.blob).toString(), + 'content-length': image.blob.length.toString(), 'content-disposition': `inline; filename="${params.imageId}"`, 'cache-control': 'public, max-age=31536000, immutable', }, diff --git a/exercises/08.http-mocking/03.problem.setup/app/routes/settings+/profile.photo.tsx b/exercises/08.http-mocking/03.problem.setup/app/routes/settings+/profile.photo.tsx index f452baf9a..36e397f0b 100644 --- a/exercises/08.http-mocking/03.problem.setup/app/routes/settings+/profile.photo.tsx +++ b/exercises/08.http-mocking/03.problem.setup/app/routes/settings+/profile.photo.tsx @@ -76,7 +76,7 @@ export async function action({ request }: ActionFunctionArgs) { return { image: { contentType: data.photoFile.type, - blob: Buffer.from(await data.photoFile.arrayBuffer()), + blob: new Uint8Array(await data.photoFile.arrayBuffer()), }, } }), diff --git a/exercises/08.http-mocking/03.problem.setup/app/routes/users+/$username_+/__note-editor.tsx b/exercises/08.http-mocking/03.problem.setup/app/routes/users+/$username_+/__note-editor.tsx index 714fa7baf..7c8ee2109 100644 --- a/exercises/08.http-mocking/03.problem.setup/app/routes/users+/$username_+/__note-editor.tsx +++ b/exercises/08.http-mocking/03.problem.setup/app/routes/users+/$username_+/__note-editor.tsx @@ -96,7 +96,7 @@ export async function action({ request, params }: ActionFunctionArgs) { id: i.id, altText: i.altText, contentType: i.file.type, - blob: Buffer.from(await i.file.arrayBuffer()), + blob: new Uint8Array(await i.file.arrayBuffer()), } } else { return { id: i.id, altText: i.altText } @@ -111,7 +111,7 @@ export async function action({ request, params }: ActionFunctionArgs) { return { altText: image.altText, contentType: image.file.type, - blob: Buffer.from(await image.file.arrayBuffer()), + blob: new Uint8Array(await image.file.arrayBuffer()), } }), ), diff --git a/exercises/08.http-mocking/03.problem.setup/app/utils/misc.tsx b/exercises/08.http-mocking/03.problem.setup/app/utils/misc.tsx index 8879f6b41..a553484db 100644 --- a/exercises/08.http-mocking/03.problem.setup/app/utils/misc.tsx +++ b/exercises/08.http-mocking/03.problem.setup/app/utils/misc.tsx @@ -303,7 +303,7 @@ export async function downloadFile(url: string, retries: number = 0) { throw new Error(`Failed to fetch image with status ${response.status}`) } const contentType = response.headers.get('content-type') ?? 'image/jpg' - const blob = Buffer.from(await response.arrayBuffer()) + const blob = new Uint8Array(await response.arrayBuffer()) return { contentType, blob } } catch (e) { if (retries > MAX_RETRIES) throw e diff --git a/exercises/08.http-mocking/03.problem.setup/index.js b/exercises/08.http-mocking/03.problem.setup/index.js index 8ba83ba70..e8728a002 100644 --- a/exercises/08.http-mocking/03.problem.setup/index.js +++ b/exercises/08.http-mocking/03.problem.setup/index.js @@ -1,11 +1,8 @@ import 'dotenv/config' import 'source-map-support/register.js' -import { installGlobals } from '@remix-run/node' import chalk from 'chalk' import closeWithGrace from 'close-with-grace' -installGlobals() - if ( process.env.NODE_ENV !== 'production' || process.env.PLAYWRIGHT_TEST_BASE_URL diff --git a/exercises/08.http-mocking/03.problem.setup/package.json b/exercises/08.http-mocking/03.problem.setup/package.json index bb9505b0b..2f61a41af 100644 --- a/exercises/08.http-mocking/03.problem.setup/package.json +++ b/exercises/08.http-mocking/03.problem.setup/package.json @@ -30,9 +30,8 @@ "@conform-to/zod": "^0.9.0", "@epic-web/remember": "^1.1.0", "@epic-web/totp": "^1.1.2", - "@epic-web/workshop-utils": "^4.21.1", "@paralleldrive/cuid2": "^2.2.2", - "@prisma/client": "^5.16.2", + "@prisma/client": "^6.19.1", "@radix-ui/react-checkbox": "^1.1.1", "@radix-ui/react-dropdown-menu": "^2.1.1", "@radix-ui/react-label": "^2.1.0", @@ -59,13 +58,13 @@ "glob": "^11.0.0", "isbot": "^5.1.12", "morgan": "^1.10.0", - "prisma": "^5.16.2", + "prisma": "^6.19.1", "qrcode": "^1.5.3", "react": "^18.3.1", "react-dom": "^18.3.1", "remix-auth": "^3.7.0", "remix-auth-form": "^1.5.0", - "remix-auth-github": "^1.7.0", + "remix-auth-github": "1.7.0", "remix-utils": "^7.6.0", "sonner": "^1.5.0", "source-map-support": "^0.5.21", @@ -111,7 +110,7 @@ "execa": "^9.3.0", "fs-extra": "^11.2.0", "jsdom": "^24.1.0", - "msw": "^2.3.1", + "msw": "^2.12.4", "node-html-parser": "^6.1.13", "npm-run-all": "^4.1.5", "prettier": "^3.3.2", diff --git a/exercises/08.http-mocking/03.problem.setup/tests/db-utils.ts b/exercises/08.http-mocking/03.problem.setup/tests/db-utils.ts index 8f5062e16..2e1e23550 100644 --- a/exercises/08.http-mocking/03.problem.setup/tests/db-utils.ts +++ b/exercises/08.http-mocking/03.problem.setup/tests/db-utils.ts @@ -67,7 +67,7 @@ export async function getNoteImages() { }), img({ altText: - 'an office full of laptops and other office equipment that look like it was abandond in a rush out of the building in an emergency years ago.', + 'an office full of laptops and other office equipment that look like it was abandoned in a rush out of the building in an emergency years ago.', filepath: './tests/fixtures/images/notes/6.png', }), img({ @@ -110,6 +110,6 @@ export async function img({ return { altText, contentType: filepath.endsWith('.png') ? 'image/png' : 'image/jpeg', - blob: await fs.promises.readFile(filepath), + blob: new Uint8Array(await fs.promises.readFile(filepath)), } } diff --git a/exercises/08.http-mocking/03.problem.setup/tests/e2e/onboarding.test.ts b/exercises/08.http-mocking/03.problem.setup/tests/e2e/onboarding.test.ts index cd39afab3..88303b8c0 100644 --- a/exercises/08.http-mocking/03.problem.setup/tests/e2e/onboarding.test.ts +++ b/exercises/08.http-mocking/03.problem.setup/tests/e2e/onboarding.test.ts @@ -49,9 +49,7 @@ test('onboarding with link', async ({ page, getOnboardingData }) => { await page.getByRole('textbox', { name: /email/i }).fill(onboardingData.email) await page.getByRole('button', { name: /submit/i }).click() - await expect( - page.getByRole('button', { name: /submit/i, disabled: true }), - ).toBeVisible() + await expect(page.getByText(/check your email/i)).toBeVisible() const email = await waitFor(() => requireEmail(onboardingData.email)) diff --git a/exercises/08.http-mocking/03.problem.setup/tests/setup/setup-test-env.ts b/exercises/08.http-mocking/03.problem.setup/tests/setup/setup-test-env.ts index 477331463..f41c41463 100644 --- a/exercises/08.http-mocking/03.problem.setup/tests/setup/setup-test-env.ts +++ b/exercises/08.http-mocking/03.problem.setup/tests/setup/setup-test-env.ts @@ -1,12 +1,9 @@ import 'dotenv/config' import '#app/utils/env.server.ts' import '@testing-library/jest-dom/vitest' -import { installGlobals } from '@remix-run/node' import { cleanup } from '@testing-library/react' import { afterEach, beforeEach, vi, type MockInstance } from 'vitest' -installGlobals() - afterEach(() => cleanup()) export let consoleError: MockInstance diff --git a/exercises/08.http-mocking/03.solution.setup/app/epicshop.tsx b/exercises/08.http-mocking/03.solution.setup/app/epicshop.tsx deleted file mode 100644 index 96c5597cb..000000000 --- a/exercises/08.http-mocking/03.solution.setup/app/epicshop.tsx +++ /dev/null @@ -1,9 +0,0 @@ -// Ignore this file please -import { EpicShopIFrameSync } from '@epic-web/workshop-utils/iframe-sync' -import { useNavigate } from '@remix-run/react' -import * as React from 'react' - -export function EpicShop() { - const navigate = useNavigate() - return -} diff --git a/exercises/08.http-mocking/03.solution.setup/app/root.tsx b/exercises/08.http-mocking/03.solution.setup/app/root.tsx index 3b2064a1a..fa7f41981 100644 --- a/exercises/08.http-mocking/03.solution.setup/app/root.tsx +++ b/exercises/08.http-mocking/03.solution.setup/app/root.tsx @@ -34,7 +34,6 @@ import { SearchBar } from './components/search-bar.tsx' import { Spacer } from './components/spacer.tsx' import { Button } from './components/ui/button.tsx' import { Icon } from './components/ui/icon.tsx' -import { EpicShop } from './epicshop.tsx' import fontStylestylesheetUrl from './styles/font.css' import tailwindStylesheetUrl from './styles/tailwind.css' import { getUserId } from './utils/auth.server.ts' @@ -159,7 +158,6 @@ function Document({ - diff --git a/exercises/08.http-mocking/03.solution.setup/app/routes/resources+/note-images.$imageId.tsx b/exercises/08.http-mocking/03.solution.setup/app/routes/resources+/note-images.$imageId.tsx index 417545a3e..865878a92 100644 --- a/exercises/08.http-mocking/03.solution.setup/app/routes/resources+/note-images.$imageId.tsx +++ b/exercises/08.http-mocking/03.solution.setup/app/routes/resources+/note-images.$imageId.tsx @@ -14,7 +14,7 @@ export async function loader({ params }: LoaderFunctionArgs) { return new Response(image.blob, { headers: { 'content-type': image.contentType, - 'content-length': Buffer.byteLength(image.blob).toString(), + 'content-length': image.blob.length.toString(), 'content-disposition': `inline; filename="${params.imageId}"`, 'cache-control': 'public, max-age=31536000, immutable', }, diff --git a/exercises/08.http-mocking/03.solution.setup/app/routes/resources+/user-images.$imageId.tsx b/exercises/08.http-mocking/03.solution.setup/app/routes/resources+/user-images.$imageId.tsx index c5a66b146..2de45198e 100644 --- a/exercises/08.http-mocking/03.solution.setup/app/routes/resources+/user-images.$imageId.tsx +++ b/exercises/08.http-mocking/03.solution.setup/app/routes/resources+/user-images.$imageId.tsx @@ -14,7 +14,7 @@ export async function loader({ params }: LoaderFunctionArgs) { return new Response(image.blob, { headers: { 'content-type': image.contentType, - 'content-length': Buffer.byteLength(image.blob).toString(), + 'content-length': image.blob.length.toString(), 'content-disposition': `inline; filename="${params.imageId}"`, 'cache-control': 'public, max-age=31536000, immutable', }, diff --git a/exercises/08.http-mocking/03.solution.setup/app/routes/settings+/profile.photo.tsx b/exercises/08.http-mocking/03.solution.setup/app/routes/settings+/profile.photo.tsx index f452baf9a..36e397f0b 100644 --- a/exercises/08.http-mocking/03.solution.setup/app/routes/settings+/profile.photo.tsx +++ b/exercises/08.http-mocking/03.solution.setup/app/routes/settings+/profile.photo.tsx @@ -76,7 +76,7 @@ export async function action({ request }: ActionFunctionArgs) { return { image: { contentType: data.photoFile.type, - blob: Buffer.from(await data.photoFile.arrayBuffer()), + blob: new Uint8Array(await data.photoFile.arrayBuffer()), }, } }), diff --git a/exercises/08.http-mocking/03.solution.setup/app/routes/users+/$username_+/__note-editor.tsx b/exercises/08.http-mocking/03.solution.setup/app/routes/users+/$username_+/__note-editor.tsx index 714fa7baf..7c8ee2109 100644 --- a/exercises/08.http-mocking/03.solution.setup/app/routes/users+/$username_+/__note-editor.tsx +++ b/exercises/08.http-mocking/03.solution.setup/app/routes/users+/$username_+/__note-editor.tsx @@ -96,7 +96,7 @@ export async function action({ request, params }: ActionFunctionArgs) { id: i.id, altText: i.altText, contentType: i.file.type, - blob: Buffer.from(await i.file.arrayBuffer()), + blob: new Uint8Array(await i.file.arrayBuffer()), } } else { return { id: i.id, altText: i.altText } @@ -111,7 +111,7 @@ export async function action({ request, params }: ActionFunctionArgs) { return { altText: image.altText, contentType: image.file.type, - blob: Buffer.from(await image.file.arrayBuffer()), + blob: new Uint8Array(await image.file.arrayBuffer()), } }), ), diff --git a/exercises/08.http-mocking/03.solution.setup/app/utils/misc.tsx b/exercises/08.http-mocking/03.solution.setup/app/utils/misc.tsx index 8879f6b41..a553484db 100644 --- a/exercises/08.http-mocking/03.solution.setup/app/utils/misc.tsx +++ b/exercises/08.http-mocking/03.solution.setup/app/utils/misc.tsx @@ -303,7 +303,7 @@ export async function downloadFile(url: string, retries: number = 0) { throw new Error(`Failed to fetch image with status ${response.status}`) } const contentType = response.headers.get('content-type') ?? 'image/jpg' - const blob = Buffer.from(await response.arrayBuffer()) + const blob = new Uint8Array(await response.arrayBuffer()) return { contentType, blob } } catch (e) { if (retries > MAX_RETRIES) throw e diff --git a/exercises/08.http-mocking/03.solution.setup/index.js b/exercises/08.http-mocking/03.solution.setup/index.js index 8ba83ba70..e8728a002 100644 --- a/exercises/08.http-mocking/03.solution.setup/index.js +++ b/exercises/08.http-mocking/03.solution.setup/index.js @@ -1,11 +1,8 @@ import 'dotenv/config' import 'source-map-support/register.js' -import { installGlobals } from '@remix-run/node' import chalk from 'chalk' import closeWithGrace from 'close-with-grace' -installGlobals() - if ( process.env.NODE_ENV !== 'production' || process.env.PLAYWRIGHT_TEST_BASE_URL diff --git a/exercises/08.http-mocking/03.solution.setup/package.json b/exercises/08.http-mocking/03.solution.setup/package.json index e59d7865b..b819ce649 100644 --- a/exercises/08.http-mocking/03.solution.setup/package.json +++ b/exercises/08.http-mocking/03.solution.setup/package.json @@ -30,9 +30,8 @@ "@conform-to/zod": "^0.9.0", "@epic-web/remember": "^1.1.0", "@epic-web/totp": "^1.1.2", - "@epic-web/workshop-utils": "^4.21.1", "@paralleldrive/cuid2": "^2.2.2", - "@prisma/client": "^5.16.2", + "@prisma/client": "^6.19.1", "@radix-ui/react-checkbox": "^1.1.1", "@radix-ui/react-dropdown-menu": "^2.1.1", "@radix-ui/react-label": "^2.1.0", @@ -59,13 +58,13 @@ "glob": "^11.0.0", "isbot": "^5.1.12", "morgan": "^1.10.0", - "prisma": "^5.16.2", + "prisma": "^6.19.1", "qrcode": "^1.5.3", "react": "^18.3.1", "react-dom": "^18.3.1", "remix-auth": "^3.7.0", "remix-auth-form": "^1.5.0", - "remix-auth-github": "^1.7.0", + "remix-auth-github": "1.7.0", "remix-utils": "^7.6.0", "sonner": "^1.5.0", "source-map-support": "^0.5.21", @@ -111,7 +110,7 @@ "execa": "^9.3.0", "fs-extra": "^11.2.0", "jsdom": "^24.1.0", - "msw": "^2.3.1", + "msw": "^2.12.4", "node-html-parser": "^6.1.13", "npm-run-all": "^4.1.5", "prettier": "^3.3.2", diff --git a/exercises/08.http-mocking/03.solution.setup/tests/db-utils.ts b/exercises/08.http-mocking/03.solution.setup/tests/db-utils.ts index 8f5062e16..2e1e23550 100644 --- a/exercises/08.http-mocking/03.solution.setup/tests/db-utils.ts +++ b/exercises/08.http-mocking/03.solution.setup/tests/db-utils.ts @@ -67,7 +67,7 @@ export async function getNoteImages() { }), img({ altText: - 'an office full of laptops and other office equipment that look like it was abandond in a rush out of the building in an emergency years ago.', + 'an office full of laptops and other office equipment that look like it was abandoned in a rush out of the building in an emergency years ago.', filepath: './tests/fixtures/images/notes/6.png', }), img({ @@ -110,6 +110,6 @@ export async function img({ return { altText, contentType: filepath.endsWith('.png') ? 'image/png' : 'image/jpeg', - blob: await fs.promises.readFile(filepath), + blob: new Uint8Array(await fs.promises.readFile(filepath)), } } diff --git a/exercises/08.http-mocking/03.solution.setup/tests/e2e/onboarding.test.ts b/exercises/08.http-mocking/03.solution.setup/tests/e2e/onboarding.test.ts index cd39afab3..88303b8c0 100644 --- a/exercises/08.http-mocking/03.solution.setup/tests/e2e/onboarding.test.ts +++ b/exercises/08.http-mocking/03.solution.setup/tests/e2e/onboarding.test.ts @@ -49,9 +49,7 @@ test('onboarding with link', async ({ page, getOnboardingData }) => { await page.getByRole('textbox', { name: /email/i }).fill(onboardingData.email) await page.getByRole('button', { name: /submit/i }).click() - await expect( - page.getByRole('button', { name: /submit/i, disabled: true }), - ).toBeVisible() + await expect(page.getByText(/check your email/i)).toBeVisible() const email = await waitFor(() => requireEmail(onboardingData.email)) diff --git a/exercises/08.http-mocking/03.solution.setup/tests/setup/setup-test-env.ts b/exercises/08.http-mocking/03.solution.setup/tests/setup/setup-test-env.ts index 477331463..f41c41463 100644 --- a/exercises/08.http-mocking/03.solution.setup/tests/setup/setup-test-env.ts +++ b/exercises/08.http-mocking/03.solution.setup/tests/setup/setup-test-env.ts @@ -1,12 +1,9 @@ import 'dotenv/config' import '#app/utils/env.server.ts' import '@testing-library/jest-dom/vitest' -import { installGlobals } from '@remix-run/node' import { cleanup } from '@testing-library/react' import { afterEach, beforeEach, vi, type MockInstance } from 'vitest' -installGlobals() - afterEach(() => cleanup()) export let consoleError: MockInstance diff --git a/exercises/09.authenticated-integration/01.problem.create-session/app/epicshop.tsx b/exercises/09.authenticated-integration/01.problem.create-session/app/epicshop.tsx deleted file mode 100644 index 96c5597cb..000000000 --- a/exercises/09.authenticated-integration/01.problem.create-session/app/epicshop.tsx +++ /dev/null @@ -1,9 +0,0 @@ -// Ignore this file please -import { EpicShopIFrameSync } from '@epic-web/workshop-utils/iframe-sync' -import { useNavigate } from '@remix-run/react' -import * as React from 'react' - -export function EpicShop() { - const navigate = useNavigate() - return -} diff --git a/exercises/09.authenticated-integration/01.problem.create-session/app/root.tsx b/exercises/09.authenticated-integration/01.problem.create-session/app/root.tsx index 3b2064a1a..fa7f41981 100644 --- a/exercises/09.authenticated-integration/01.problem.create-session/app/root.tsx +++ b/exercises/09.authenticated-integration/01.problem.create-session/app/root.tsx @@ -34,7 +34,6 @@ import { SearchBar } from './components/search-bar.tsx' import { Spacer } from './components/spacer.tsx' import { Button } from './components/ui/button.tsx' import { Icon } from './components/ui/icon.tsx' -import { EpicShop } from './epicshop.tsx' import fontStylestylesheetUrl from './styles/font.css' import tailwindStylesheetUrl from './styles/tailwind.css' import { getUserId } from './utils/auth.server.ts' @@ -159,7 +158,6 @@ function Document({ - diff --git a/exercises/09.authenticated-integration/01.problem.create-session/app/routes/resources+/note-images.$imageId.tsx b/exercises/09.authenticated-integration/01.problem.create-session/app/routes/resources+/note-images.$imageId.tsx index 417545a3e..865878a92 100644 --- a/exercises/09.authenticated-integration/01.problem.create-session/app/routes/resources+/note-images.$imageId.tsx +++ b/exercises/09.authenticated-integration/01.problem.create-session/app/routes/resources+/note-images.$imageId.tsx @@ -14,7 +14,7 @@ export async function loader({ params }: LoaderFunctionArgs) { return new Response(image.blob, { headers: { 'content-type': image.contentType, - 'content-length': Buffer.byteLength(image.blob).toString(), + 'content-length': image.blob.length.toString(), 'content-disposition': `inline; filename="${params.imageId}"`, 'cache-control': 'public, max-age=31536000, immutable', }, diff --git a/exercises/09.authenticated-integration/01.problem.create-session/app/routes/resources+/user-images.$imageId.tsx b/exercises/09.authenticated-integration/01.problem.create-session/app/routes/resources+/user-images.$imageId.tsx index c5a66b146..2de45198e 100644 --- a/exercises/09.authenticated-integration/01.problem.create-session/app/routes/resources+/user-images.$imageId.tsx +++ b/exercises/09.authenticated-integration/01.problem.create-session/app/routes/resources+/user-images.$imageId.tsx @@ -14,7 +14,7 @@ export async function loader({ params }: LoaderFunctionArgs) { return new Response(image.blob, { headers: { 'content-type': image.contentType, - 'content-length': Buffer.byteLength(image.blob).toString(), + 'content-length': image.blob.length.toString(), 'content-disposition': `inline; filename="${params.imageId}"`, 'cache-control': 'public, max-age=31536000, immutable', }, diff --git a/exercises/09.authenticated-integration/01.problem.create-session/app/routes/settings+/profile.photo.tsx b/exercises/09.authenticated-integration/01.problem.create-session/app/routes/settings+/profile.photo.tsx index f452baf9a..36e397f0b 100644 --- a/exercises/09.authenticated-integration/01.problem.create-session/app/routes/settings+/profile.photo.tsx +++ b/exercises/09.authenticated-integration/01.problem.create-session/app/routes/settings+/profile.photo.tsx @@ -76,7 +76,7 @@ export async function action({ request }: ActionFunctionArgs) { return { image: { contentType: data.photoFile.type, - blob: Buffer.from(await data.photoFile.arrayBuffer()), + blob: new Uint8Array(await data.photoFile.arrayBuffer()), }, } }), diff --git a/exercises/09.authenticated-integration/01.problem.create-session/app/routes/users+/$username_+/__note-editor.tsx b/exercises/09.authenticated-integration/01.problem.create-session/app/routes/users+/$username_+/__note-editor.tsx index 714fa7baf..7c8ee2109 100644 --- a/exercises/09.authenticated-integration/01.problem.create-session/app/routes/users+/$username_+/__note-editor.tsx +++ b/exercises/09.authenticated-integration/01.problem.create-session/app/routes/users+/$username_+/__note-editor.tsx @@ -96,7 +96,7 @@ export async function action({ request, params }: ActionFunctionArgs) { id: i.id, altText: i.altText, contentType: i.file.type, - blob: Buffer.from(await i.file.arrayBuffer()), + blob: new Uint8Array(await i.file.arrayBuffer()), } } else { return { id: i.id, altText: i.altText } @@ -111,7 +111,7 @@ export async function action({ request, params }: ActionFunctionArgs) { return { altText: image.altText, contentType: image.file.type, - blob: Buffer.from(await image.file.arrayBuffer()), + blob: new Uint8Array(await image.file.arrayBuffer()), } }), ), diff --git a/exercises/09.authenticated-integration/01.problem.create-session/app/utils/misc.tsx b/exercises/09.authenticated-integration/01.problem.create-session/app/utils/misc.tsx index 8879f6b41..a553484db 100644 --- a/exercises/09.authenticated-integration/01.problem.create-session/app/utils/misc.tsx +++ b/exercises/09.authenticated-integration/01.problem.create-session/app/utils/misc.tsx @@ -303,7 +303,7 @@ export async function downloadFile(url: string, retries: number = 0) { throw new Error(`Failed to fetch image with status ${response.status}`) } const contentType = response.headers.get('content-type') ?? 'image/jpg' - const blob = Buffer.from(await response.arrayBuffer()) + const blob = new Uint8Array(await response.arrayBuffer()) return { contentType, blob } } catch (e) { if (retries > MAX_RETRIES) throw e diff --git a/exercises/09.authenticated-integration/01.problem.create-session/index.js b/exercises/09.authenticated-integration/01.problem.create-session/index.js index 8ba83ba70..e8728a002 100644 --- a/exercises/09.authenticated-integration/01.problem.create-session/index.js +++ b/exercises/09.authenticated-integration/01.problem.create-session/index.js @@ -1,11 +1,8 @@ import 'dotenv/config' import 'source-map-support/register.js' -import { installGlobals } from '@remix-run/node' import chalk from 'chalk' import closeWithGrace from 'close-with-grace' -installGlobals() - if ( process.env.NODE_ENV !== 'production' || process.env.PLAYWRIGHT_TEST_BASE_URL diff --git a/exercises/09.authenticated-integration/01.problem.create-session/package.json b/exercises/09.authenticated-integration/01.problem.create-session/package.json index ff53f2334..2905f2d9d 100644 --- a/exercises/09.authenticated-integration/01.problem.create-session/package.json +++ b/exercises/09.authenticated-integration/01.problem.create-session/package.json @@ -30,9 +30,8 @@ "@conform-to/zod": "^0.9.0", "@epic-web/remember": "^1.1.0", "@epic-web/totp": "^1.1.2", - "@epic-web/workshop-utils": "^4.21.1", "@paralleldrive/cuid2": "^2.2.2", - "@prisma/client": "^5.16.2", + "@prisma/client": "^6.19.1", "@radix-ui/react-checkbox": "^1.1.1", "@radix-ui/react-dropdown-menu": "^2.1.1", "@radix-ui/react-label": "^2.1.0", @@ -59,13 +58,13 @@ "glob": "^11.0.0", "isbot": "^5.1.12", "morgan": "^1.10.0", - "prisma": "^5.16.2", + "prisma": "^6.19.1", "qrcode": "^1.5.3", "react": "^18.3.1", "react-dom": "^18.3.1", "remix-auth": "^3.7.0", "remix-auth-form": "^1.5.0", - "remix-auth-github": "^1.7.0", + "remix-auth-github": "1.7.0", "remix-utils": "^7.6.0", "sonner": "^1.5.0", "source-map-support": "^0.5.21", @@ -111,7 +110,7 @@ "execa": "^9.3.0", "fs-extra": "^11.2.0", "jsdom": "^24.1.0", - "msw": "^2.3.1", + "msw": "^2.12.4", "node-html-parser": "^6.1.13", "npm-run-all": "^4.1.5", "prettier": "^3.3.2", diff --git a/exercises/09.authenticated-integration/01.problem.create-session/tests/db-utils.ts b/exercises/09.authenticated-integration/01.problem.create-session/tests/db-utils.ts index 3bdc6728e..257181f97 100644 --- a/exercises/09.authenticated-integration/01.problem.create-session/tests/db-utils.ts +++ b/exercises/09.authenticated-integration/01.problem.create-session/tests/db-utils.ts @@ -69,7 +69,7 @@ export async function getNoteImages() { }), img({ altText: - 'an office full of laptops and other office equipment that look like it was abandond in a rush out of the building in an emergency years ago.', + 'an office full of laptops and other office equipment that look like it was abandoned in a rush out of the building in an emergency years ago.', filepath: './tests/fixtures/images/notes/6.png', }), img({ @@ -137,6 +137,6 @@ export async function img({ return { altText, contentType: filepath.endsWith('.png') ? 'image/png' : 'image/jpeg', - blob: await fs.promises.readFile(filepath), + blob: new Uint8Array(await fs.promises.readFile(filepath)), } } diff --git a/exercises/09.authenticated-integration/01.problem.create-session/tests/e2e/onboarding.test.ts b/exercises/09.authenticated-integration/01.problem.create-session/tests/e2e/onboarding.test.ts index cd39afab3..88303b8c0 100644 --- a/exercises/09.authenticated-integration/01.problem.create-session/tests/e2e/onboarding.test.ts +++ b/exercises/09.authenticated-integration/01.problem.create-session/tests/e2e/onboarding.test.ts @@ -49,9 +49,7 @@ test('onboarding with link', async ({ page, getOnboardingData }) => { await page.getByRole('textbox', { name: /email/i }).fill(onboardingData.email) await page.getByRole('button', { name: /submit/i }).click() - await expect( - page.getByRole('button', { name: /submit/i, disabled: true }), - ).toBeVisible() + await expect(page.getByText(/check your email/i)).toBeVisible() const email = await waitFor(() => requireEmail(onboardingData.email)) diff --git a/exercises/09.authenticated-integration/01.problem.create-session/tests/setup/setup-test-env.ts b/exercises/09.authenticated-integration/01.problem.create-session/tests/setup/setup-test-env.ts index a87e93501..b7f5fcd75 100644 --- a/exercises/09.authenticated-integration/01.problem.create-session/tests/setup/setup-test-env.ts +++ b/exercises/09.authenticated-integration/01.problem.create-session/tests/setup/setup-test-env.ts @@ -1,13 +1,10 @@ import 'dotenv/config' import '#app/utils/env.server.ts' import '@testing-library/jest-dom/vitest' -import { installGlobals } from '@remix-run/node' import { cleanup } from '@testing-library/react' import { afterEach, beforeEach, vi, type MockInstance } from 'vitest' import { server } from '../mocks/index.ts' -installGlobals() - afterEach(() => server.resetHandlers()) afterEach(() => cleanup()) diff --git a/exercises/09.authenticated-integration/01.solution.create-session/app/epicshop.tsx b/exercises/09.authenticated-integration/01.solution.create-session/app/epicshop.tsx deleted file mode 100644 index 96c5597cb..000000000 --- a/exercises/09.authenticated-integration/01.solution.create-session/app/epicshop.tsx +++ /dev/null @@ -1,9 +0,0 @@ -// Ignore this file please -import { EpicShopIFrameSync } from '@epic-web/workshop-utils/iframe-sync' -import { useNavigate } from '@remix-run/react' -import * as React from 'react' - -export function EpicShop() { - const navigate = useNavigate() - return -} diff --git a/exercises/09.authenticated-integration/01.solution.create-session/app/root.tsx b/exercises/09.authenticated-integration/01.solution.create-session/app/root.tsx index 3b2064a1a..fa7f41981 100644 --- a/exercises/09.authenticated-integration/01.solution.create-session/app/root.tsx +++ b/exercises/09.authenticated-integration/01.solution.create-session/app/root.tsx @@ -34,7 +34,6 @@ import { SearchBar } from './components/search-bar.tsx' import { Spacer } from './components/spacer.tsx' import { Button } from './components/ui/button.tsx' import { Icon } from './components/ui/icon.tsx' -import { EpicShop } from './epicshop.tsx' import fontStylestylesheetUrl from './styles/font.css' import tailwindStylesheetUrl from './styles/tailwind.css' import { getUserId } from './utils/auth.server.ts' @@ -159,7 +158,6 @@ function Document({ - diff --git a/exercises/09.authenticated-integration/01.solution.create-session/app/routes/resources+/note-images.$imageId.tsx b/exercises/09.authenticated-integration/01.solution.create-session/app/routes/resources+/note-images.$imageId.tsx index 417545a3e..865878a92 100644 --- a/exercises/09.authenticated-integration/01.solution.create-session/app/routes/resources+/note-images.$imageId.tsx +++ b/exercises/09.authenticated-integration/01.solution.create-session/app/routes/resources+/note-images.$imageId.tsx @@ -14,7 +14,7 @@ export async function loader({ params }: LoaderFunctionArgs) { return new Response(image.blob, { headers: { 'content-type': image.contentType, - 'content-length': Buffer.byteLength(image.blob).toString(), + 'content-length': image.blob.length.toString(), 'content-disposition': `inline; filename="${params.imageId}"`, 'cache-control': 'public, max-age=31536000, immutable', }, diff --git a/exercises/09.authenticated-integration/01.solution.create-session/app/routes/resources+/user-images.$imageId.tsx b/exercises/09.authenticated-integration/01.solution.create-session/app/routes/resources+/user-images.$imageId.tsx index c5a66b146..2de45198e 100644 --- a/exercises/09.authenticated-integration/01.solution.create-session/app/routes/resources+/user-images.$imageId.tsx +++ b/exercises/09.authenticated-integration/01.solution.create-session/app/routes/resources+/user-images.$imageId.tsx @@ -14,7 +14,7 @@ export async function loader({ params }: LoaderFunctionArgs) { return new Response(image.blob, { headers: { 'content-type': image.contentType, - 'content-length': Buffer.byteLength(image.blob).toString(), + 'content-length': image.blob.length.toString(), 'content-disposition': `inline; filename="${params.imageId}"`, 'cache-control': 'public, max-age=31536000, immutable', }, diff --git a/exercises/09.authenticated-integration/01.solution.create-session/app/routes/settings+/profile.photo.tsx b/exercises/09.authenticated-integration/01.solution.create-session/app/routes/settings+/profile.photo.tsx index f452baf9a..36e397f0b 100644 --- a/exercises/09.authenticated-integration/01.solution.create-session/app/routes/settings+/profile.photo.tsx +++ b/exercises/09.authenticated-integration/01.solution.create-session/app/routes/settings+/profile.photo.tsx @@ -76,7 +76,7 @@ export async function action({ request }: ActionFunctionArgs) { return { image: { contentType: data.photoFile.type, - blob: Buffer.from(await data.photoFile.arrayBuffer()), + blob: new Uint8Array(await data.photoFile.arrayBuffer()), }, } }), diff --git a/exercises/09.authenticated-integration/01.solution.create-session/app/routes/users+/$username_+/__note-editor.tsx b/exercises/09.authenticated-integration/01.solution.create-session/app/routes/users+/$username_+/__note-editor.tsx index 714fa7baf..7c8ee2109 100644 --- a/exercises/09.authenticated-integration/01.solution.create-session/app/routes/users+/$username_+/__note-editor.tsx +++ b/exercises/09.authenticated-integration/01.solution.create-session/app/routes/users+/$username_+/__note-editor.tsx @@ -96,7 +96,7 @@ export async function action({ request, params }: ActionFunctionArgs) { id: i.id, altText: i.altText, contentType: i.file.type, - blob: Buffer.from(await i.file.arrayBuffer()), + blob: new Uint8Array(await i.file.arrayBuffer()), } } else { return { id: i.id, altText: i.altText } @@ -111,7 +111,7 @@ export async function action({ request, params }: ActionFunctionArgs) { return { altText: image.altText, contentType: image.file.type, - blob: Buffer.from(await image.file.arrayBuffer()), + blob: new Uint8Array(await image.file.arrayBuffer()), } }), ), diff --git a/exercises/09.authenticated-integration/01.solution.create-session/app/utils/misc.tsx b/exercises/09.authenticated-integration/01.solution.create-session/app/utils/misc.tsx index 8879f6b41..a553484db 100644 --- a/exercises/09.authenticated-integration/01.solution.create-session/app/utils/misc.tsx +++ b/exercises/09.authenticated-integration/01.solution.create-session/app/utils/misc.tsx @@ -303,7 +303,7 @@ export async function downloadFile(url: string, retries: number = 0) { throw new Error(`Failed to fetch image with status ${response.status}`) } const contentType = response.headers.get('content-type') ?? 'image/jpg' - const blob = Buffer.from(await response.arrayBuffer()) + const blob = new Uint8Array(await response.arrayBuffer()) return { contentType, blob } } catch (e) { if (retries > MAX_RETRIES) throw e diff --git a/exercises/09.authenticated-integration/01.solution.create-session/index.js b/exercises/09.authenticated-integration/01.solution.create-session/index.js index 8ba83ba70..e8728a002 100644 --- a/exercises/09.authenticated-integration/01.solution.create-session/index.js +++ b/exercises/09.authenticated-integration/01.solution.create-session/index.js @@ -1,11 +1,8 @@ import 'dotenv/config' import 'source-map-support/register.js' -import { installGlobals } from '@remix-run/node' import chalk from 'chalk' import closeWithGrace from 'close-with-grace' -installGlobals() - if ( process.env.NODE_ENV !== 'production' || process.env.PLAYWRIGHT_TEST_BASE_URL diff --git a/exercises/09.authenticated-integration/01.solution.create-session/package.json b/exercises/09.authenticated-integration/01.solution.create-session/package.json index 54b7b306d..6cfc7e1b9 100644 --- a/exercises/09.authenticated-integration/01.solution.create-session/package.json +++ b/exercises/09.authenticated-integration/01.solution.create-session/package.json @@ -30,9 +30,8 @@ "@conform-to/zod": "^0.9.0", "@epic-web/remember": "^1.1.0", "@epic-web/totp": "^1.1.2", - "@epic-web/workshop-utils": "^4.21.1", "@paralleldrive/cuid2": "^2.2.2", - "@prisma/client": "^5.16.2", + "@prisma/client": "^6.19.1", "@radix-ui/react-checkbox": "^1.1.1", "@radix-ui/react-dropdown-menu": "^2.1.1", "@radix-ui/react-label": "^2.1.0", @@ -59,13 +58,13 @@ "glob": "^11.0.0", "isbot": "^5.1.12", "morgan": "^1.10.0", - "prisma": "^5.16.2", + "prisma": "^6.19.1", "qrcode": "^1.5.3", "react": "^18.3.1", "react-dom": "^18.3.1", "remix-auth": "^3.7.0", "remix-auth-form": "^1.5.0", - "remix-auth-github": "^1.7.0", + "remix-auth-github": "1.7.0", "remix-utils": "^7.6.0", "sonner": "^1.5.0", "source-map-support": "^0.5.21", @@ -111,7 +110,7 @@ "execa": "^9.3.0", "fs-extra": "^11.2.0", "jsdom": "^24.1.0", - "msw": "^2.3.1", + "msw": "^2.12.4", "node-html-parser": "^6.1.13", "npm-run-all": "^4.1.5", "prettier": "^3.3.2", diff --git a/exercises/09.authenticated-integration/01.solution.create-session/tests/db-utils.ts b/exercises/09.authenticated-integration/01.solution.create-session/tests/db-utils.ts index 3bdc6728e..257181f97 100644 --- a/exercises/09.authenticated-integration/01.solution.create-session/tests/db-utils.ts +++ b/exercises/09.authenticated-integration/01.solution.create-session/tests/db-utils.ts @@ -69,7 +69,7 @@ export async function getNoteImages() { }), img({ altText: - 'an office full of laptops and other office equipment that look like it was abandond in a rush out of the building in an emergency years ago.', + 'an office full of laptops and other office equipment that look like it was abandoned in a rush out of the building in an emergency years ago.', filepath: './tests/fixtures/images/notes/6.png', }), img({ @@ -137,6 +137,6 @@ export async function img({ return { altText, contentType: filepath.endsWith('.png') ? 'image/png' : 'image/jpeg', - blob: await fs.promises.readFile(filepath), + blob: new Uint8Array(await fs.promises.readFile(filepath)), } } diff --git a/exercises/09.authenticated-integration/01.solution.create-session/tests/e2e/onboarding.test.ts b/exercises/09.authenticated-integration/01.solution.create-session/tests/e2e/onboarding.test.ts index cd39afab3..88303b8c0 100644 --- a/exercises/09.authenticated-integration/01.solution.create-session/tests/e2e/onboarding.test.ts +++ b/exercises/09.authenticated-integration/01.solution.create-session/tests/e2e/onboarding.test.ts @@ -49,9 +49,7 @@ test('onboarding with link', async ({ page, getOnboardingData }) => { await page.getByRole('textbox', { name: /email/i }).fill(onboardingData.email) await page.getByRole('button', { name: /submit/i }).click() - await expect( - page.getByRole('button', { name: /submit/i, disabled: true }), - ).toBeVisible() + await expect(page.getByText(/check your email/i)).toBeVisible() const email = await waitFor(() => requireEmail(onboardingData.email)) diff --git a/exercises/09.authenticated-integration/01.solution.create-session/tests/setup/setup-test-env.ts b/exercises/09.authenticated-integration/01.solution.create-session/tests/setup/setup-test-env.ts index a87e93501..b7f5fcd75 100644 --- a/exercises/09.authenticated-integration/01.solution.create-session/tests/setup/setup-test-env.ts +++ b/exercises/09.authenticated-integration/01.solution.create-session/tests/setup/setup-test-env.ts @@ -1,13 +1,10 @@ import 'dotenv/config' import '#app/utils/env.server.ts' import '@testing-library/jest-dom/vitest' -import { installGlobals } from '@remix-run/node' import { cleanup } from '@testing-library/react' import { afterEach, beforeEach, vi, type MockInstance } from 'vitest' import { server } from '../mocks/index.ts' -installGlobals() - afterEach(() => server.resetHandlers()) afterEach(() => cleanup()) diff --git a/exercises/09.authenticated-integration/02.problem.assert/app/epicshop.tsx b/exercises/09.authenticated-integration/02.problem.assert/app/epicshop.tsx deleted file mode 100644 index 96c5597cb..000000000 --- a/exercises/09.authenticated-integration/02.problem.assert/app/epicshop.tsx +++ /dev/null @@ -1,9 +0,0 @@ -// Ignore this file please -import { EpicShopIFrameSync } from '@epic-web/workshop-utils/iframe-sync' -import { useNavigate } from '@remix-run/react' -import * as React from 'react' - -export function EpicShop() { - const navigate = useNavigate() - return -} diff --git a/exercises/09.authenticated-integration/02.problem.assert/app/root.tsx b/exercises/09.authenticated-integration/02.problem.assert/app/root.tsx index 3b2064a1a..fa7f41981 100644 --- a/exercises/09.authenticated-integration/02.problem.assert/app/root.tsx +++ b/exercises/09.authenticated-integration/02.problem.assert/app/root.tsx @@ -34,7 +34,6 @@ import { SearchBar } from './components/search-bar.tsx' import { Spacer } from './components/spacer.tsx' import { Button } from './components/ui/button.tsx' import { Icon } from './components/ui/icon.tsx' -import { EpicShop } from './epicshop.tsx' import fontStylestylesheetUrl from './styles/font.css' import tailwindStylesheetUrl from './styles/tailwind.css' import { getUserId } from './utils/auth.server.ts' @@ -159,7 +158,6 @@ function Document({ - diff --git a/exercises/09.authenticated-integration/02.problem.assert/app/routes/resources+/note-images.$imageId.tsx b/exercises/09.authenticated-integration/02.problem.assert/app/routes/resources+/note-images.$imageId.tsx index 417545a3e..865878a92 100644 --- a/exercises/09.authenticated-integration/02.problem.assert/app/routes/resources+/note-images.$imageId.tsx +++ b/exercises/09.authenticated-integration/02.problem.assert/app/routes/resources+/note-images.$imageId.tsx @@ -14,7 +14,7 @@ export async function loader({ params }: LoaderFunctionArgs) { return new Response(image.blob, { headers: { 'content-type': image.contentType, - 'content-length': Buffer.byteLength(image.blob).toString(), + 'content-length': image.blob.length.toString(), 'content-disposition': `inline; filename="${params.imageId}"`, 'cache-control': 'public, max-age=31536000, immutable', }, diff --git a/exercises/09.authenticated-integration/02.problem.assert/app/routes/resources+/user-images.$imageId.tsx b/exercises/09.authenticated-integration/02.problem.assert/app/routes/resources+/user-images.$imageId.tsx index c5a66b146..2de45198e 100644 --- a/exercises/09.authenticated-integration/02.problem.assert/app/routes/resources+/user-images.$imageId.tsx +++ b/exercises/09.authenticated-integration/02.problem.assert/app/routes/resources+/user-images.$imageId.tsx @@ -14,7 +14,7 @@ export async function loader({ params }: LoaderFunctionArgs) { return new Response(image.blob, { headers: { 'content-type': image.contentType, - 'content-length': Buffer.byteLength(image.blob).toString(), + 'content-length': image.blob.length.toString(), 'content-disposition': `inline; filename="${params.imageId}"`, 'cache-control': 'public, max-age=31536000, immutable', }, diff --git a/exercises/09.authenticated-integration/02.problem.assert/app/routes/settings+/profile.photo.tsx b/exercises/09.authenticated-integration/02.problem.assert/app/routes/settings+/profile.photo.tsx index f452baf9a..36e397f0b 100644 --- a/exercises/09.authenticated-integration/02.problem.assert/app/routes/settings+/profile.photo.tsx +++ b/exercises/09.authenticated-integration/02.problem.assert/app/routes/settings+/profile.photo.tsx @@ -76,7 +76,7 @@ export async function action({ request }: ActionFunctionArgs) { return { image: { contentType: data.photoFile.type, - blob: Buffer.from(await data.photoFile.arrayBuffer()), + blob: new Uint8Array(await data.photoFile.arrayBuffer()), }, } }), diff --git a/exercises/09.authenticated-integration/02.problem.assert/app/routes/users+/$username_+/__note-editor.tsx b/exercises/09.authenticated-integration/02.problem.assert/app/routes/users+/$username_+/__note-editor.tsx index 714fa7baf..7c8ee2109 100644 --- a/exercises/09.authenticated-integration/02.problem.assert/app/routes/users+/$username_+/__note-editor.tsx +++ b/exercises/09.authenticated-integration/02.problem.assert/app/routes/users+/$username_+/__note-editor.tsx @@ -96,7 +96,7 @@ export async function action({ request, params }: ActionFunctionArgs) { id: i.id, altText: i.altText, contentType: i.file.type, - blob: Buffer.from(await i.file.arrayBuffer()), + blob: new Uint8Array(await i.file.arrayBuffer()), } } else { return { id: i.id, altText: i.altText } @@ -111,7 +111,7 @@ export async function action({ request, params }: ActionFunctionArgs) { return { altText: image.altText, contentType: image.file.type, - blob: Buffer.from(await image.file.arrayBuffer()), + blob: new Uint8Array(await image.file.arrayBuffer()), } }), ), diff --git a/exercises/09.authenticated-integration/02.problem.assert/app/utils/misc.tsx b/exercises/09.authenticated-integration/02.problem.assert/app/utils/misc.tsx index 8879f6b41..a553484db 100644 --- a/exercises/09.authenticated-integration/02.problem.assert/app/utils/misc.tsx +++ b/exercises/09.authenticated-integration/02.problem.assert/app/utils/misc.tsx @@ -303,7 +303,7 @@ export async function downloadFile(url: string, retries: number = 0) { throw new Error(`Failed to fetch image with status ${response.status}`) } const contentType = response.headers.get('content-type') ?? 'image/jpg' - const blob = Buffer.from(await response.arrayBuffer()) + const blob = new Uint8Array(await response.arrayBuffer()) return { contentType, blob } } catch (e) { if (retries > MAX_RETRIES) throw e diff --git a/exercises/09.authenticated-integration/02.problem.assert/index.js b/exercises/09.authenticated-integration/02.problem.assert/index.js index 8ba83ba70..e8728a002 100644 --- a/exercises/09.authenticated-integration/02.problem.assert/index.js +++ b/exercises/09.authenticated-integration/02.problem.assert/index.js @@ -1,11 +1,8 @@ import 'dotenv/config' import 'source-map-support/register.js' -import { installGlobals } from '@remix-run/node' import chalk from 'chalk' import closeWithGrace from 'close-with-grace' -installGlobals() - if ( process.env.NODE_ENV !== 'production' || process.env.PLAYWRIGHT_TEST_BASE_URL diff --git a/exercises/09.authenticated-integration/02.problem.assert/package.json b/exercises/09.authenticated-integration/02.problem.assert/package.json index 6917d7ca4..b751ba9f7 100644 --- a/exercises/09.authenticated-integration/02.problem.assert/package.json +++ b/exercises/09.authenticated-integration/02.problem.assert/package.json @@ -30,9 +30,8 @@ "@conform-to/zod": "^0.9.0", "@epic-web/remember": "^1.1.0", "@epic-web/totp": "^1.1.2", - "@epic-web/workshop-utils": "^4.21.1", "@paralleldrive/cuid2": "^2.2.2", - "@prisma/client": "^5.16.2", + "@prisma/client": "^6.19.1", "@radix-ui/react-checkbox": "^1.1.1", "@radix-ui/react-dropdown-menu": "^2.1.1", "@radix-ui/react-label": "^2.1.0", @@ -59,13 +58,13 @@ "glob": "^11.0.0", "isbot": "^5.1.12", "morgan": "^1.10.0", - "prisma": "^5.16.2", + "prisma": "^6.19.1", "qrcode": "^1.5.3", "react": "^18.3.1", "react-dom": "^18.3.1", "remix-auth": "^3.7.0", "remix-auth-form": "^1.5.0", - "remix-auth-github": "^1.7.0", + "remix-auth-github": "1.7.0", "remix-utils": "^7.6.0", "sonner": "^1.5.0", "source-map-support": "^0.5.21", @@ -111,7 +110,7 @@ "execa": "^9.3.0", "fs-extra": "^11.2.0", "jsdom": "^24.1.0", - "msw": "^2.3.1", + "msw": "^2.12.4", "node-html-parser": "^6.1.13", "npm-run-all": "^4.1.5", "prettier": "^3.3.2", diff --git a/exercises/09.authenticated-integration/02.problem.assert/tests/db-utils.ts b/exercises/09.authenticated-integration/02.problem.assert/tests/db-utils.ts index 3bdc6728e..257181f97 100644 --- a/exercises/09.authenticated-integration/02.problem.assert/tests/db-utils.ts +++ b/exercises/09.authenticated-integration/02.problem.assert/tests/db-utils.ts @@ -69,7 +69,7 @@ export async function getNoteImages() { }), img({ altText: - 'an office full of laptops and other office equipment that look like it was abandond in a rush out of the building in an emergency years ago.', + 'an office full of laptops and other office equipment that look like it was abandoned in a rush out of the building in an emergency years ago.', filepath: './tests/fixtures/images/notes/6.png', }), img({ @@ -137,6 +137,6 @@ export async function img({ return { altText, contentType: filepath.endsWith('.png') ? 'image/png' : 'image/jpeg', - blob: await fs.promises.readFile(filepath), + blob: new Uint8Array(await fs.promises.readFile(filepath)), } } diff --git a/exercises/09.authenticated-integration/02.problem.assert/tests/e2e/onboarding.test.ts b/exercises/09.authenticated-integration/02.problem.assert/tests/e2e/onboarding.test.ts index cd39afab3..88303b8c0 100644 --- a/exercises/09.authenticated-integration/02.problem.assert/tests/e2e/onboarding.test.ts +++ b/exercises/09.authenticated-integration/02.problem.assert/tests/e2e/onboarding.test.ts @@ -49,9 +49,7 @@ test('onboarding with link', async ({ page, getOnboardingData }) => { await page.getByRole('textbox', { name: /email/i }).fill(onboardingData.email) await page.getByRole('button', { name: /submit/i }).click() - await expect( - page.getByRole('button', { name: /submit/i, disabled: true }), - ).toBeVisible() + await expect(page.getByText(/check your email/i)).toBeVisible() const email = await waitFor(() => requireEmail(onboardingData.email)) diff --git a/exercises/09.authenticated-integration/02.problem.assert/tests/setup/setup-test-env.ts b/exercises/09.authenticated-integration/02.problem.assert/tests/setup/setup-test-env.ts index a87e93501..b7f5fcd75 100644 --- a/exercises/09.authenticated-integration/02.problem.assert/tests/setup/setup-test-env.ts +++ b/exercises/09.authenticated-integration/02.problem.assert/tests/setup/setup-test-env.ts @@ -1,13 +1,10 @@ import 'dotenv/config' import '#app/utils/env.server.ts' import '@testing-library/jest-dom/vitest' -import { installGlobals } from '@remix-run/node' import { cleanup } from '@testing-library/react' import { afterEach, beforeEach, vi, type MockInstance } from 'vitest' import { server } from '../mocks/index.ts' -installGlobals() - afterEach(() => server.resetHandlers()) afterEach(() => cleanup()) diff --git a/exercises/09.authenticated-integration/02.solution.assert/app/epicshop.tsx b/exercises/09.authenticated-integration/02.solution.assert/app/epicshop.tsx deleted file mode 100644 index 96c5597cb..000000000 --- a/exercises/09.authenticated-integration/02.solution.assert/app/epicshop.tsx +++ /dev/null @@ -1,9 +0,0 @@ -// Ignore this file please -import { EpicShopIFrameSync } from '@epic-web/workshop-utils/iframe-sync' -import { useNavigate } from '@remix-run/react' -import * as React from 'react' - -export function EpicShop() { - const navigate = useNavigate() - return -} diff --git a/exercises/09.authenticated-integration/02.solution.assert/app/root.tsx b/exercises/09.authenticated-integration/02.solution.assert/app/root.tsx index 3b2064a1a..fa7f41981 100644 --- a/exercises/09.authenticated-integration/02.solution.assert/app/root.tsx +++ b/exercises/09.authenticated-integration/02.solution.assert/app/root.tsx @@ -34,7 +34,6 @@ import { SearchBar } from './components/search-bar.tsx' import { Spacer } from './components/spacer.tsx' import { Button } from './components/ui/button.tsx' import { Icon } from './components/ui/icon.tsx' -import { EpicShop } from './epicshop.tsx' import fontStylestylesheetUrl from './styles/font.css' import tailwindStylesheetUrl from './styles/tailwind.css' import { getUserId } from './utils/auth.server.ts' @@ -159,7 +158,6 @@ function Document({ - diff --git a/exercises/09.authenticated-integration/02.solution.assert/app/routes/resources+/note-images.$imageId.tsx b/exercises/09.authenticated-integration/02.solution.assert/app/routes/resources+/note-images.$imageId.tsx index 417545a3e..865878a92 100644 --- a/exercises/09.authenticated-integration/02.solution.assert/app/routes/resources+/note-images.$imageId.tsx +++ b/exercises/09.authenticated-integration/02.solution.assert/app/routes/resources+/note-images.$imageId.tsx @@ -14,7 +14,7 @@ export async function loader({ params }: LoaderFunctionArgs) { return new Response(image.blob, { headers: { 'content-type': image.contentType, - 'content-length': Buffer.byteLength(image.blob).toString(), + 'content-length': image.blob.length.toString(), 'content-disposition': `inline; filename="${params.imageId}"`, 'cache-control': 'public, max-age=31536000, immutable', }, diff --git a/exercises/09.authenticated-integration/02.solution.assert/app/routes/resources+/user-images.$imageId.tsx b/exercises/09.authenticated-integration/02.solution.assert/app/routes/resources+/user-images.$imageId.tsx index c5a66b146..2de45198e 100644 --- a/exercises/09.authenticated-integration/02.solution.assert/app/routes/resources+/user-images.$imageId.tsx +++ b/exercises/09.authenticated-integration/02.solution.assert/app/routes/resources+/user-images.$imageId.tsx @@ -14,7 +14,7 @@ export async function loader({ params }: LoaderFunctionArgs) { return new Response(image.blob, { headers: { 'content-type': image.contentType, - 'content-length': Buffer.byteLength(image.blob).toString(), + 'content-length': image.blob.length.toString(), 'content-disposition': `inline; filename="${params.imageId}"`, 'cache-control': 'public, max-age=31536000, immutable', }, diff --git a/exercises/09.authenticated-integration/02.solution.assert/app/routes/settings+/profile.photo.tsx b/exercises/09.authenticated-integration/02.solution.assert/app/routes/settings+/profile.photo.tsx index f452baf9a..36e397f0b 100644 --- a/exercises/09.authenticated-integration/02.solution.assert/app/routes/settings+/profile.photo.tsx +++ b/exercises/09.authenticated-integration/02.solution.assert/app/routes/settings+/profile.photo.tsx @@ -76,7 +76,7 @@ export async function action({ request }: ActionFunctionArgs) { return { image: { contentType: data.photoFile.type, - blob: Buffer.from(await data.photoFile.arrayBuffer()), + blob: new Uint8Array(await data.photoFile.arrayBuffer()), }, } }), diff --git a/exercises/09.authenticated-integration/02.solution.assert/app/routes/users+/$username_+/__note-editor.tsx b/exercises/09.authenticated-integration/02.solution.assert/app/routes/users+/$username_+/__note-editor.tsx index 714fa7baf..7c8ee2109 100644 --- a/exercises/09.authenticated-integration/02.solution.assert/app/routes/users+/$username_+/__note-editor.tsx +++ b/exercises/09.authenticated-integration/02.solution.assert/app/routes/users+/$username_+/__note-editor.tsx @@ -96,7 +96,7 @@ export async function action({ request, params }: ActionFunctionArgs) { id: i.id, altText: i.altText, contentType: i.file.type, - blob: Buffer.from(await i.file.arrayBuffer()), + blob: new Uint8Array(await i.file.arrayBuffer()), } } else { return { id: i.id, altText: i.altText } @@ -111,7 +111,7 @@ export async function action({ request, params }: ActionFunctionArgs) { return { altText: image.altText, contentType: image.file.type, - blob: Buffer.from(await image.file.arrayBuffer()), + blob: new Uint8Array(await image.file.arrayBuffer()), } }), ), diff --git a/exercises/09.authenticated-integration/02.solution.assert/app/utils/misc.tsx b/exercises/09.authenticated-integration/02.solution.assert/app/utils/misc.tsx index 8879f6b41..a553484db 100644 --- a/exercises/09.authenticated-integration/02.solution.assert/app/utils/misc.tsx +++ b/exercises/09.authenticated-integration/02.solution.assert/app/utils/misc.tsx @@ -303,7 +303,7 @@ export async function downloadFile(url: string, retries: number = 0) { throw new Error(`Failed to fetch image with status ${response.status}`) } const contentType = response.headers.get('content-type') ?? 'image/jpg' - const blob = Buffer.from(await response.arrayBuffer()) + const blob = new Uint8Array(await response.arrayBuffer()) return { contentType, blob } } catch (e) { if (retries > MAX_RETRIES) throw e diff --git a/exercises/09.authenticated-integration/02.solution.assert/index.js b/exercises/09.authenticated-integration/02.solution.assert/index.js index 8ba83ba70..e8728a002 100644 --- a/exercises/09.authenticated-integration/02.solution.assert/index.js +++ b/exercises/09.authenticated-integration/02.solution.assert/index.js @@ -1,11 +1,8 @@ import 'dotenv/config' import 'source-map-support/register.js' -import { installGlobals } from '@remix-run/node' import chalk from 'chalk' import closeWithGrace from 'close-with-grace' -installGlobals() - if ( process.env.NODE_ENV !== 'production' || process.env.PLAYWRIGHT_TEST_BASE_URL diff --git a/exercises/09.authenticated-integration/02.solution.assert/package.json b/exercises/09.authenticated-integration/02.solution.assert/package.json index 30ce76428..8e8d3df94 100644 --- a/exercises/09.authenticated-integration/02.solution.assert/package.json +++ b/exercises/09.authenticated-integration/02.solution.assert/package.json @@ -30,9 +30,8 @@ "@conform-to/zod": "^0.9.0", "@epic-web/remember": "^1.1.0", "@epic-web/totp": "^1.1.2", - "@epic-web/workshop-utils": "^4.21.1", "@paralleldrive/cuid2": "^2.2.2", - "@prisma/client": "^5.16.2", + "@prisma/client": "^6.19.1", "@radix-ui/react-checkbox": "^1.1.1", "@radix-ui/react-dropdown-menu": "^2.1.1", "@radix-ui/react-label": "^2.1.0", @@ -59,13 +58,13 @@ "glob": "^11.0.0", "isbot": "^5.1.12", "morgan": "^1.10.0", - "prisma": "^5.16.2", + "prisma": "^6.19.1", "qrcode": "^1.5.3", "react": "^18.3.1", "react-dom": "^18.3.1", "remix-auth": "^3.7.0", "remix-auth-form": "^1.5.0", - "remix-auth-github": "^1.7.0", + "remix-auth-github": "1.7.0", "remix-utils": "^7.6.0", "sonner": "^1.5.0", "source-map-support": "^0.5.21", @@ -111,7 +110,7 @@ "execa": "^9.3.0", "fs-extra": "^11.2.0", "jsdom": "^24.1.0", - "msw": "^2.3.1", + "msw": "^2.12.4", "node-html-parser": "^6.1.13", "npm-run-all": "^4.1.5", "prettier": "^3.3.2", diff --git a/exercises/09.authenticated-integration/02.solution.assert/tests/db-utils.ts b/exercises/09.authenticated-integration/02.solution.assert/tests/db-utils.ts index 3bdc6728e..257181f97 100644 --- a/exercises/09.authenticated-integration/02.solution.assert/tests/db-utils.ts +++ b/exercises/09.authenticated-integration/02.solution.assert/tests/db-utils.ts @@ -69,7 +69,7 @@ export async function getNoteImages() { }), img({ altText: - 'an office full of laptops and other office equipment that look like it was abandond in a rush out of the building in an emergency years ago.', + 'an office full of laptops and other office equipment that look like it was abandoned in a rush out of the building in an emergency years ago.', filepath: './tests/fixtures/images/notes/6.png', }), img({ @@ -137,6 +137,6 @@ export async function img({ return { altText, contentType: filepath.endsWith('.png') ? 'image/png' : 'image/jpeg', - blob: await fs.promises.readFile(filepath), + blob: new Uint8Array(await fs.promises.readFile(filepath)), } } diff --git a/exercises/09.authenticated-integration/02.solution.assert/tests/e2e/onboarding.test.ts b/exercises/09.authenticated-integration/02.solution.assert/tests/e2e/onboarding.test.ts index cd39afab3..88303b8c0 100644 --- a/exercises/09.authenticated-integration/02.solution.assert/tests/e2e/onboarding.test.ts +++ b/exercises/09.authenticated-integration/02.solution.assert/tests/e2e/onboarding.test.ts @@ -49,9 +49,7 @@ test('onboarding with link', async ({ page, getOnboardingData }) => { await page.getByRole('textbox', { name: /email/i }).fill(onboardingData.email) await page.getByRole('button', { name: /submit/i }).click() - await expect( - page.getByRole('button', { name: /submit/i, disabled: true }), - ).toBeVisible() + await expect(page.getByText(/check your email/i)).toBeVisible() const email = await waitFor(() => requireEmail(onboardingData.email)) diff --git a/exercises/09.authenticated-integration/02.solution.assert/tests/setup/setup-test-env.ts b/exercises/09.authenticated-integration/02.solution.assert/tests/setup/setup-test-env.ts index a87e93501..b7f5fcd75 100644 --- a/exercises/09.authenticated-integration/02.solution.assert/tests/setup/setup-test-env.ts +++ b/exercises/09.authenticated-integration/02.solution.assert/tests/setup/setup-test-env.ts @@ -1,13 +1,10 @@ import 'dotenv/config' import '#app/utils/env.server.ts' import '@testing-library/jest-dom/vitest' -import { installGlobals } from '@remix-run/node' import { cleanup } from '@testing-library/react' import { afterEach, beforeEach, vi, type MockInstance } from 'vitest' import { server } from '../mocks/index.ts' -installGlobals() - afterEach(() => server.resetHandlers()) afterEach(() => cleanup()) diff --git a/exercises/09.authenticated-integration/03.problem.routes/app/epicshop.tsx b/exercises/09.authenticated-integration/03.problem.routes/app/epicshop.tsx deleted file mode 100644 index 96c5597cb..000000000 --- a/exercises/09.authenticated-integration/03.problem.routes/app/epicshop.tsx +++ /dev/null @@ -1,9 +0,0 @@ -// Ignore this file please -import { EpicShopIFrameSync } from '@epic-web/workshop-utils/iframe-sync' -import { useNavigate } from '@remix-run/react' -import * as React from 'react' - -export function EpicShop() { - const navigate = useNavigate() - return -} diff --git a/exercises/09.authenticated-integration/03.problem.routes/app/root.tsx b/exercises/09.authenticated-integration/03.problem.routes/app/root.tsx index 3b2064a1a..fa7f41981 100644 --- a/exercises/09.authenticated-integration/03.problem.routes/app/root.tsx +++ b/exercises/09.authenticated-integration/03.problem.routes/app/root.tsx @@ -34,7 +34,6 @@ import { SearchBar } from './components/search-bar.tsx' import { Spacer } from './components/spacer.tsx' import { Button } from './components/ui/button.tsx' import { Icon } from './components/ui/icon.tsx' -import { EpicShop } from './epicshop.tsx' import fontStylestylesheetUrl from './styles/font.css' import tailwindStylesheetUrl from './styles/tailwind.css' import { getUserId } from './utils/auth.server.ts' @@ -159,7 +158,6 @@ function Document({ - diff --git a/exercises/09.authenticated-integration/03.problem.routes/app/routes/resources+/note-images.$imageId.tsx b/exercises/09.authenticated-integration/03.problem.routes/app/routes/resources+/note-images.$imageId.tsx index 417545a3e..865878a92 100644 --- a/exercises/09.authenticated-integration/03.problem.routes/app/routes/resources+/note-images.$imageId.tsx +++ b/exercises/09.authenticated-integration/03.problem.routes/app/routes/resources+/note-images.$imageId.tsx @@ -14,7 +14,7 @@ export async function loader({ params }: LoaderFunctionArgs) { return new Response(image.blob, { headers: { 'content-type': image.contentType, - 'content-length': Buffer.byteLength(image.blob).toString(), + 'content-length': image.blob.length.toString(), 'content-disposition': `inline; filename="${params.imageId}"`, 'cache-control': 'public, max-age=31536000, immutable', }, diff --git a/exercises/09.authenticated-integration/03.problem.routes/app/routes/resources+/user-images.$imageId.tsx b/exercises/09.authenticated-integration/03.problem.routes/app/routes/resources+/user-images.$imageId.tsx index c5a66b146..2de45198e 100644 --- a/exercises/09.authenticated-integration/03.problem.routes/app/routes/resources+/user-images.$imageId.tsx +++ b/exercises/09.authenticated-integration/03.problem.routes/app/routes/resources+/user-images.$imageId.tsx @@ -14,7 +14,7 @@ export async function loader({ params }: LoaderFunctionArgs) { return new Response(image.blob, { headers: { 'content-type': image.contentType, - 'content-length': Buffer.byteLength(image.blob).toString(), + 'content-length': image.blob.length.toString(), 'content-disposition': `inline; filename="${params.imageId}"`, 'cache-control': 'public, max-age=31536000, immutable', }, diff --git a/exercises/09.authenticated-integration/03.problem.routes/app/routes/settings+/profile.photo.tsx b/exercises/09.authenticated-integration/03.problem.routes/app/routes/settings+/profile.photo.tsx index f452baf9a..36e397f0b 100644 --- a/exercises/09.authenticated-integration/03.problem.routes/app/routes/settings+/profile.photo.tsx +++ b/exercises/09.authenticated-integration/03.problem.routes/app/routes/settings+/profile.photo.tsx @@ -76,7 +76,7 @@ export async function action({ request }: ActionFunctionArgs) { return { image: { contentType: data.photoFile.type, - blob: Buffer.from(await data.photoFile.arrayBuffer()), + blob: new Uint8Array(await data.photoFile.arrayBuffer()), }, } }), diff --git a/exercises/09.authenticated-integration/03.problem.routes/app/routes/users+/$username.test.tsx b/exercises/09.authenticated-integration/03.problem.routes/app/routes/users+/$username.test.tsx index 666ca00c3..65f5143d9 100644 --- a/exercises/09.authenticated-integration/03.problem.routes/app/routes/users+/$username.test.tsx +++ b/exercises/09.authenticated-integration/03.problem.routes/app/routes/users+/$username.test.tsx @@ -112,7 +112,7 @@ test('The user profile when logged in as self', async () => { path: 'users/:username', Component: UsernameRoute, // 🐨 replace this with a smaller one that takes the request, sets the - // cookie header and then calls the rootLoader directly + // cookie header and then calls the loader directly loader(): Awaited> { return json({ user, diff --git a/exercises/09.authenticated-integration/03.problem.routes/app/routes/users+/$username_+/__note-editor.tsx b/exercises/09.authenticated-integration/03.problem.routes/app/routes/users+/$username_+/__note-editor.tsx index 714fa7baf..7c8ee2109 100644 --- a/exercises/09.authenticated-integration/03.problem.routes/app/routes/users+/$username_+/__note-editor.tsx +++ b/exercises/09.authenticated-integration/03.problem.routes/app/routes/users+/$username_+/__note-editor.tsx @@ -96,7 +96,7 @@ export async function action({ request, params }: ActionFunctionArgs) { id: i.id, altText: i.altText, contentType: i.file.type, - blob: Buffer.from(await i.file.arrayBuffer()), + blob: new Uint8Array(await i.file.arrayBuffer()), } } else { return { id: i.id, altText: i.altText } @@ -111,7 +111,7 @@ export async function action({ request, params }: ActionFunctionArgs) { return { altText: image.altText, contentType: image.file.type, - blob: Buffer.from(await image.file.arrayBuffer()), + blob: new Uint8Array(await image.file.arrayBuffer()), } }), ), diff --git a/exercises/09.authenticated-integration/03.problem.routes/app/utils/misc.tsx b/exercises/09.authenticated-integration/03.problem.routes/app/utils/misc.tsx index 8879f6b41..a553484db 100644 --- a/exercises/09.authenticated-integration/03.problem.routes/app/utils/misc.tsx +++ b/exercises/09.authenticated-integration/03.problem.routes/app/utils/misc.tsx @@ -303,7 +303,7 @@ export async function downloadFile(url: string, retries: number = 0) { throw new Error(`Failed to fetch image with status ${response.status}`) } const contentType = response.headers.get('content-type') ?? 'image/jpg' - const blob = Buffer.from(await response.arrayBuffer()) + const blob = new Uint8Array(await response.arrayBuffer()) return { contentType, blob } } catch (e) { if (retries > MAX_RETRIES) throw e diff --git a/exercises/09.authenticated-integration/03.problem.routes/index.js b/exercises/09.authenticated-integration/03.problem.routes/index.js index 8ba83ba70..e8728a002 100644 --- a/exercises/09.authenticated-integration/03.problem.routes/index.js +++ b/exercises/09.authenticated-integration/03.problem.routes/index.js @@ -1,11 +1,8 @@ import 'dotenv/config' import 'source-map-support/register.js' -import { installGlobals } from '@remix-run/node' import chalk from 'chalk' import closeWithGrace from 'close-with-grace' -installGlobals() - if ( process.env.NODE_ENV !== 'production' || process.env.PLAYWRIGHT_TEST_BASE_URL diff --git a/exercises/09.authenticated-integration/03.problem.routes/package.json b/exercises/09.authenticated-integration/03.problem.routes/package.json index 649ca8652..784790a0a 100644 --- a/exercises/09.authenticated-integration/03.problem.routes/package.json +++ b/exercises/09.authenticated-integration/03.problem.routes/package.json @@ -30,9 +30,8 @@ "@conform-to/zod": "^0.9.0", "@epic-web/remember": "^1.1.0", "@epic-web/totp": "^1.1.2", - "@epic-web/workshop-utils": "^4.21.1", "@paralleldrive/cuid2": "^2.2.2", - "@prisma/client": "^5.16.2", + "@prisma/client": "^6.19.1", "@radix-ui/react-checkbox": "^1.1.1", "@radix-ui/react-dropdown-menu": "^2.1.1", "@radix-ui/react-label": "^2.1.0", @@ -59,13 +58,13 @@ "glob": "^11.0.0", "isbot": "^5.1.12", "morgan": "^1.10.0", - "prisma": "^5.16.2", + "prisma": "^6.19.1", "qrcode": "^1.5.3", "react": "^18.3.1", "react-dom": "^18.3.1", "remix-auth": "^3.7.0", "remix-auth-form": "^1.5.0", - "remix-auth-github": "^1.7.0", + "remix-auth-github": "1.7.0", "remix-utils": "^7.6.0", "sonner": "^1.5.0", "source-map-support": "^0.5.21", @@ -111,7 +110,7 @@ "execa": "^9.3.0", "fs-extra": "^11.2.0", "jsdom": "^24.1.0", - "msw": "^2.3.1", + "msw": "^2.12.4", "node-html-parser": "^6.1.13", "npm-run-all": "^4.1.5", "prettier": "^3.3.2", diff --git a/exercises/09.authenticated-integration/03.problem.routes/tests/db-utils.ts b/exercises/09.authenticated-integration/03.problem.routes/tests/db-utils.ts index 3bdc6728e..257181f97 100644 --- a/exercises/09.authenticated-integration/03.problem.routes/tests/db-utils.ts +++ b/exercises/09.authenticated-integration/03.problem.routes/tests/db-utils.ts @@ -69,7 +69,7 @@ export async function getNoteImages() { }), img({ altText: - 'an office full of laptops and other office equipment that look like it was abandond in a rush out of the building in an emergency years ago.', + 'an office full of laptops and other office equipment that look like it was abandoned in a rush out of the building in an emergency years ago.', filepath: './tests/fixtures/images/notes/6.png', }), img({ @@ -137,6 +137,6 @@ export async function img({ return { altText, contentType: filepath.endsWith('.png') ? 'image/png' : 'image/jpeg', - blob: await fs.promises.readFile(filepath), + blob: new Uint8Array(await fs.promises.readFile(filepath)), } } diff --git a/exercises/09.authenticated-integration/03.problem.routes/tests/e2e/onboarding.test.ts b/exercises/09.authenticated-integration/03.problem.routes/tests/e2e/onboarding.test.ts index cd39afab3..88303b8c0 100644 --- a/exercises/09.authenticated-integration/03.problem.routes/tests/e2e/onboarding.test.ts +++ b/exercises/09.authenticated-integration/03.problem.routes/tests/e2e/onboarding.test.ts @@ -49,9 +49,7 @@ test('onboarding with link', async ({ page, getOnboardingData }) => { await page.getByRole('textbox', { name: /email/i }).fill(onboardingData.email) await page.getByRole('button', { name: /submit/i }).click() - await expect( - page.getByRole('button', { name: /submit/i, disabled: true }), - ).toBeVisible() + await expect(page.getByText(/check your email/i)).toBeVisible() const email = await waitFor(() => requireEmail(onboardingData.email)) diff --git a/exercises/09.authenticated-integration/03.problem.routes/tests/setup/setup-test-env.ts b/exercises/09.authenticated-integration/03.problem.routes/tests/setup/setup-test-env.ts index f370f5fe6..c26593fe6 100644 --- a/exercises/09.authenticated-integration/03.problem.routes/tests/setup/setup-test-env.ts +++ b/exercises/09.authenticated-integration/03.problem.routes/tests/setup/setup-test-env.ts @@ -1,15 +1,12 @@ import 'dotenv/config' import '#app/utils/env.server.ts' import '@testing-library/jest-dom/vitest' -import { installGlobals } from '@remix-run/node' import { cleanup } from '@testing-library/react' import { afterEach, beforeEach, vi, type MockInstance } from 'vitest' import { prisma } from '#app/utils/db.server.ts' import { insertedUsers } from '#tests/db-utils.ts' import { server } from '../mocks/index.ts' -installGlobals() - afterEach(() => server.resetHandlers()) afterEach(() => cleanup()) afterEach(async () => { diff --git a/exercises/09.authenticated-integration/03.solution.routes/app/epicshop.tsx b/exercises/09.authenticated-integration/03.solution.routes/app/epicshop.tsx deleted file mode 100644 index 96c5597cb..000000000 --- a/exercises/09.authenticated-integration/03.solution.routes/app/epicshop.tsx +++ /dev/null @@ -1,9 +0,0 @@ -// Ignore this file please -import { EpicShopIFrameSync } from '@epic-web/workshop-utils/iframe-sync' -import { useNavigate } from '@remix-run/react' -import * as React from 'react' - -export function EpicShop() { - const navigate = useNavigate() - return -} diff --git a/exercises/09.authenticated-integration/03.solution.routes/app/root.tsx b/exercises/09.authenticated-integration/03.solution.routes/app/root.tsx index 3b2064a1a..fa7f41981 100644 --- a/exercises/09.authenticated-integration/03.solution.routes/app/root.tsx +++ b/exercises/09.authenticated-integration/03.solution.routes/app/root.tsx @@ -34,7 +34,6 @@ import { SearchBar } from './components/search-bar.tsx' import { Spacer } from './components/spacer.tsx' import { Button } from './components/ui/button.tsx' import { Icon } from './components/ui/icon.tsx' -import { EpicShop } from './epicshop.tsx' import fontStylestylesheetUrl from './styles/font.css' import tailwindStylesheetUrl from './styles/tailwind.css' import { getUserId } from './utils/auth.server.ts' @@ -159,7 +158,6 @@ function Document({ - diff --git a/exercises/09.authenticated-integration/03.solution.routes/app/routes/resources+/note-images.$imageId.tsx b/exercises/09.authenticated-integration/03.solution.routes/app/routes/resources+/note-images.$imageId.tsx index 417545a3e..865878a92 100644 --- a/exercises/09.authenticated-integration/03.solution.routes/app/routes/resources+/note-images.$imageId.tsx +++ b/exercises/09.authenticated-integration/03.solution.routes/app/routes/resources+/note-images.$imageId.tsx @@ -14,7 +14,7 @@ export async function loader({ params }: LoaderFunctionArgs) { return new Response(image.blob, { headers: { 'content-type': image.contentType, - 'content-length': Buffer.byteLength(image.blob).toString(), + 'content-length': image.blob.length.toString(), 'content-disposition': `inline; filename="${params.imageId}"`, 'cache-control': 'public, max-age=31536000, immutable', }, diff --git a/exercises/09.authenticated-integration/03.solution.routes/app/routes/resources+/user-images.$imageId.tsx b/exercises/09.authenticated-integration/03.solution.routes/app/routes/resources+/user-images.$imageId.tsx index c5a66b146..2de45198e 100644 --- a/exercises/09.authenticated-integration/03.solution.routes/app/routes/resources+/user-images.$imageId.tsx +++ b/exercises/09.authenticated-integration/03.solution.routes/app/routes/resources+/user-images.$imageId.tsx @@ -14,7 +14,7 @@ export async function loader({ params }: LoaderFunctionArgs) { return new Response(image.blob, { headers: { 'content-type': image.contentType, - 'content-length': Buffer.byteLength(image.blob).toString(), + 'content-length': image.blob.length.toString(), 'content-disposition': `inline; filename="${params.imageId}"`, 'cache-control': 'public, max-age=31536000, immutable', }, diff --git a/exercises/09.authenticated-integration/03.solution.routes/app/routes/settings+/profile.photo.tsx b/exercises/09.authenticated-integration/03.solution.routes/app/routes/settings+/profile.photo.tsx index f452baf9a..36e397f0b 100644 --- a/exercises/09.authenticated-integration/03.solution.routes/app/routes/settings+/profile.photo.tsx +++ b/exercises/09.authenticated-integration/03.solution.routes/app/routes/settings+/profile.photo.tsx @@ -76,7 +76,7 @@ export async function action({ request }: ActionFunctionArgs) { return { image: { contentType: data.photoFile.type, - blob: Buffer.from(await data.photoFile.arrayBuffer()), + blob: new Uint8Array(await data.photoFile.arrayBuffer()), }, } }), diff --git a/exercises/09.authenticated-integration/03.solution.routes/app/routes/users+/$username_+/__note-editor.tsx b/exercises/09.authenticated-integration/03.solution.routes/app/routes/users+/$username_+/__note-editor.tsx index 714fa7baf..7c8ee2109 100644 --- a/exercises/09.authenticated-integration/03.solution.routes/app/routes/users+/$username_+/__note-editor.tsx +++ b/exercises/09.authenticated-integration/03.solution.routes/app/routes/users+/$username_+/__note-editor.tsx @@ -96,7 +96,7 @@ export async function action({ request, params }: ActionFunctionArgs) { id: i.id, altText: i.altText, contentType: i.file.type, - blob: Buffer.from(await i.file.arrayBuffer()), + blob: new Uint8Array(await i.file.arrayBuffer()), } } else { return { id: i.id, altText: i.altText } @@ -111,7 +111,7 @@ export async function action({ request, params }: ActionFunctionArgs) { return { altText: image.altText, contentType: image.file.type, - blob: Buffer.from(await image.file.arrayBuffer()), + blob: new Uint8Array(await image.file.arrayBuffer()), } }), ), diff --git a/exercises/09.authenticated-integration/03.solution.routes/app/utils/misc.tsx b/exercises/09.authenticated-integration/03.solution.routes/app/utils/misc.tsx index 8879f6b41..a553484db 100644 --- a/exercises/09.authenticated-integration/03.solution.routes/app/utils/misc.tsx +++ b/exercises/09.authenticated-integration/03.solution.routes/app/utils/misc.tsx @@ -303,7 +303,7 @@ export async function downloadFile(url: string, retries: number = 0) { throw new Error(`Failed to fetch image with status ${response.status}`) } const contentType = response.headers.get('content-type') ?? 'image/jpg' - const blob = Buffer.from(await response.arrayBuffer()) + const blob = new Uint8Array(await response.arrayBuffer()) return { contentType, blob } } catch (e) { if (retries > MAX_RETRIES) throw e diff --git a/exercises/09.authenticated-integration/03.solution.routes/index.js b/exercises/09.authenticated-integration/03.solution.routes/index.js index 8ba83ba70..e8728a002 100644 --- a/exercises/09.authenticated-integration/03.solution.routes/index.js +++ b/exercises/09.authenticated-integration/03.solution.routes/index.js @@ -1,11 +1,8 @@ import 'dotenv/config' import 'source-map-support/register.js' -import { installGlobals } from '@remix-run/node' import chalk from 'chalk' import closeWithGrace from 'close-with-grace' -installGlobals() - if ( process.env.NODE_ENV !== 'production' || process.env.PLAYWRIGHT_TEST_BASE_URL diff --git a/exercises/09.authenticated-integration/03.solution.routes/package.json b/exercises/09.authenticated-integration/03.solution.routes/package.json index ae2cd9062..9a5307e5e 100644 --- a/exercises/09.authenticated-integration/03.solution.routes/package.json +++ b/exercises/09.authenticated-integration/03.solution.routes/package.json @@ -30,9 +30,8 @@ "@conform-to/zod": "^0.9.0", "@epic-web/remember": "^1.1.0", "@epic-web/totp": "^1.1.2", - "@epic-web/workshop-utils": "^4.21.1", "@paralleldrive/cuid2": "^2.2.2", - "@prisma/client": "^5.16.2", + "@prisma/client": "^6.19.1", "@radix-ui/react-checkbox": "^1.1.1", "@radix-ui/react-dropdown-menu": "^2.1.1", "@radix-ui/react-label": "^2.1.0", @@ -59,13 +58,13 @@ "glob": "^11.0.0", "isbot": "^5.1.12", "morgan": "^1.10.0", - "prisma": "^5.16.2", + "prisma": "^6.19.1", "qrcode": "^1.5.3", "react": "^18.3.1", "react-dom": "^18.3.1", "remix-auth": "^3.7.0", "remix-auth-form": "^1.5.0", - "remix-auth-github": "^1.7.0", + "remix-auth-github": "1.7.0", "remix-utils": "^7.6.0", "sonner": "^1.5.0", "source-map-support": "^0.5.21", @@ -111,7 +110,7 @@ "execa": "^9.3.0", "fs-extra": "^11.2.0", "jsdom": "^24.1.0", - "msw": "^2.3.1", + "msw": "^2.12.4", "node-html-parser": "^6.1.13", "npm-run-all": "^4.1.5", "prettier": "^3.3.2", diff --git a/exercises/09.authenticated-integration/03.solution.routes/tests/db-utils.ts b/exercises/09.authenticated-integration/03.solution.routes/tests/db-utils.ts index 3bdc6728e..257181f97 100644 --- a/exercises/09.authenticated-integration/03.solution.routes/tests/db-utils.ts +++ b/exercises/09.authenticated-integration/03.solution.routes/tests/db-utils.ts @@ -69,7 +69,7 @@ export async function getNoteImages() { }), img({ altText: - 'an office full of laptops and other office equipment that look like it was abandond in a rush out of the building in an emergency years ago.', + 'an office full of laptops and other office equipment that look like it was abandoned in a rush out of the building in an emergency years ago.', filepath: './tests/fixtures/images/notes/6.png', }), img({ @@ -137,6 +137,6 @@ export async function img({ return { altText, contentType: filepath.endsWith('.png') ? 'image/png' : 'image/jpeg', - blob: await fs.promises.readFile(filepath), + blob: new Uint8Array(await fs.promises.readFile(filepath)), } } diff --git a/exercises/09.authenticated-integration/03.solution.routes/tests/e2e/onboarding.test.ts b/exercises/09.authenticated-integration/03.solution.routes/tests/e2e/onboarding.test.ts index cd39afab3..88303b8c0 100644 --- a/exercises/09.authenticated-integration/03.solution.routes/tests/e2e/onboarding.test.ts +++ b/exercises/09.authenticated-integration/03.solution.routes/tests/e2e/onboarding.test.ts @@ -49,9 +49,7 @@ test('onboarding with link', async ({ page, getOnboardingData }) => { await page.getByRole('textbox', { name: /email/i }).fill(onboardingData.email) await page.getByRole('button', { name: /submit/i }).click() - await expect( - page.getByRole('button', { name: /submit/i, disabled: true }), - ).toBeVisible() + await expect(page.getByText(/check your email/i)).toBeVisible() const email = await waitFor(() => requireEmail(onboardingData.email)) diff --git a/exercises/09.authenticated-integration/03.solution.routes/tests/setup/setup-test-env.ts b/exercises/09.authenticated-integration/03.solution.routes/tests/setup/setup-test-env.ts index f370f5fe6..c26593fe6 100644 --- a/exercises/09.authenticated-integration/03.solution.routes/tests/setup/setup-test-env.ts +++ b/exercises/09.authenticated-integration/03.solution.routes/tests/setup/setup-test-env.ts @@ -1,15 +1,12 @@ import 'dotenv/config' import '#app/utils/env.server.ts' import '@testing-library/jest-dom/vitest' -import { installGlobals } from '@remix-run/node' import { cleanup } from '@testing-library/react' import { afterEach, beforeEach, vi, type MockInstance } from 'vitest' import { prisma } from '#app/utils/db.server.ts' import { insertedUsers } from '#tests/db-utils.ts' import { server } from '../mocks/index.ts' -installGlobals() - afterEach(() => server.resetHandlers()) afterEach(() => cleanup()) afterEach(async () => { diff --git a/exercises/10.custom-assertions/01.problem.location/app/epicshop.tsx b/exercises/10.custom-assertions/01.problem.location/app/epicshop.tsx deleted file mode 100644 index 96c5597cb..000000000 --- a/exercises/10.custom-assertions/01.problem.location/app/epicshop.tsx +++ /dev/null @@ -1,9 +0,0 @@ -// Ignore this file please -import { EpicShopIFrameSync } from '@epic-web/workshop-utils/iframe-sync' -import { useNavigate } from '@remix-run/react' -import * as React from 'react' - -export function EpicShop() { - const navigate = useNavigate() - return -} diff --git a/exercises/10.custom-assertions/01.problem.location/app/root.tsx b/exercises/10.custom-assertions/01.problem.location/app/root.tsx index 3b2064a1a..fa7f41981 100644 --- a/exercises/10.custom-assertions/01.problem.location/app/root.tsx +++ b/exercises/10.custom-assertions/01.problem.location/app/root.tsx @@ -34,7 +34,6 @@ import { SearchBar } from './components/search-bar.tsx' import { Spacer } from './components/spacer.tsx' import { Button } from './components/ui/button.tsx' import { Icon } from './components/ui/icon.tsx' -import { EpicShop } from './epicshop.tsx' import fontStylestylesheetUrl from './styles/font.css' import tailwindStylesheetUrl from './styles/tailwind.css' import { getUserId } from './utils/auth.server.ts' @@ -159,7 +158,6 @@ function Document({ - diff --git a/exercises/10.custom-assertions/01.problem.location/app/routes/resources+/note-images.$imageId.tsx b/exercises/10.custom-assertions/01.problem.location/app/routes/resources+/note-images.$imageId.tsx index 417545a3e..865878a92 100644 --- a/exercises/10.custom-assertions/01.problem.location/app/routes/resources+/note-images.$imageId.tsx +++ b/exercises/10.custom-assertions/01.problem.location/app/routes/resources+/note-images.$imageId.tsx @@ -14,7 +14,7 @@ export async function loader({ params }: LoaderFunctionArgs) { return new Response(image.blob, { headers: { 'content-type': image.contentType, - 'content-length': Buffer.byteLength(image.blob).toString(), + 'content-length': image.blob.length.toString(), 'content-disposition': `inline; filename="${params.imageId}"`, 'cache-control': 'public, max-age=31536000, immutable', }, diff --git a/exercises/10.custom-assertions/01.problem.location/app/routes/resources+/user-images.$imageId.tsx b/exercises/10.custom-assertions/01.problem.location/app/routes/resources+/user-images.$imageId.tsx index c5a66b146..2de45198e 100644 --- a/exercises/10.custom-assertions/01.problem.location/app/routes/resources+/user-images.$imageId.tsx +++ b/exercises/10.custom-assertions/01.problem.location/app/routes/resources+/user-images.$imageId.tsx @@ -14,7 +14,7 @@ export async function loader({ params }: LoaderFunctionArgs) { return new Response(image.blob, { headers: { 'content-type': image.contentType, - 'content-length': Buffer.byteLength(image.blob).toString(), + 'content-length': image.blob.length.toString(), 'content-disposition': `inline; filename="${params.imageId}"`, 'cache-control': 'public, max-age=31536000, immutable', }, diff --git a/exercises/10.custom-assertions/01.problem.location/app/routes/settings+/profile.photo.tsx b/exercises/10.custom-assertions/01.problem.location/app/routes/settings+/profile.photo.tsx index f452baf9a..36e397f0b 100644 --- a/exercises/10.custom-assertions/01.problem.location/app/routes/settings+/profile.photo.tsx +++ b/exercises/10.custom-assertions/01.problem.location/app/routes/settings+/profile.photo.tsx @@ -76,7 +76,7 @@ export async function action({ request }: ActionFunctionArgs) { return { image: { contentType: data.photoFile.type, - blob: Buffer.from(await data.photoFile.arrayBuffer()), + blob: new Uint8Array(await data.photoFile.arrayBuffer()), }, } }), diff --git a/exercises/10.custom-assertions/01.problem.location/app/routes/users+/$username_+/__note-editor.tsx b/exercises/10.custom-assertions/01.problem.location/app/routes/users+/$username_+/__note-editor.tsx index 714fa7baf..7c8ee2109 100644 --- a/exercises/10.custom-assertions/01.problem.location/app/routes/users+/$username_+/__note-editor.tsx +++ b/exercises/10.custom-assertions/01.problem.location/app/routes/users+/$username_+/__note-editor.tsx @@ -96,7 +96,7 @@ export async function action({ request, params }: ActionFunctionArgs) { id: i.id, altText: i.altText, contentType: i.file.type, - blob: Buffer.from(await i.file.arrayBuffer()), + blob: new Uint8Array(await i.file.arrayBuffer()), } } else { return { id: i.id, altText: i.altText } @@ -111,7 +111,7 @@ export async function action({ request, params }: ActionFunctionArgs) { return { altText: image.altText, contentType: image.file.type, - blob: Buffer.from(await image.file.arrayBuffer()), + blob: new Uint8Array(await image.file.arrayBuffer()), } }), ), diff --git a/exercises/10.custom-assertions/01.problem.location/app/utils/misc.tsx b/exercises/10.custom-assertions/01.problem.location/app/utils/misc.tsx index 8879f6b41..a553484db 100644 --- a/exercises/10.custom-assertions/01.problem.location/app/utils/misc.tsx +++ b/exercises/10.custom-assertions/01.problem.location/app/utils/misc.tsx @@ -303,7 +303,7 @@ export async function downloadFile(url: string, retries: number = 0) { throw new Error(`Failed to fetch image with status ${response.status}`) } const contentType = response.headers.get('content-type') ?? 'image/jpg' - const blob = Buffer.from(await response.arrayBuffer()) + const blob = new Uint8Array(await response.arrayBuffer()) return { contentType, blob } } catch (e) { if (retries > MAX_RETRIES) throw e diff --git a/exercises/10.custom-assertions/01.problem.location/index.js b/exercises/10.custom-assertions/01.problem.location/index.js index 8ba83ba70..e8728a002 100644 --- a/exercises/10.custom-assertions/01.problem.location/index.js +++ b/exercises/10.custom-assertions/01.problem.location/index.js @@ -1,11 +1,8 @@ import 'dotenv/config' import 'source-map-support/register.js' -import { installGlobals } from '@remix-run/node' import chalk from 'chalk' import closeWithGrace from 'close-with-grace' -installGlobals() - if ( process.env.NODE_ENV !== 'production' || process.env.PLAYWRIGHT_TEST_BASE_URL diff --git a/exercises/10.custom-assertions/01.problem.location/package.json b/exercises/10.custom-assertions/01.problem.location/package.json index 002db2c5f..a462777ef 100644 --- a/exercises/10.custom-assertions/01.problem.location/package.json +++ b/exercises/10.custom-assertions/01.problem.location/package.json @@ -30,9 +30,8 @@ "@conform-to/zod": "^0.9.0", "@epic-web/remember": "^1.1.0", "@epic-web/totp": "^1.1.2", - "@epic-web/workshop-utils": "^4.21.1", "@paralleldrive/cuid2": "^2.2.2", - "@prisma/client": "^5.16.2", + "@prisma/client": "^6.19.1", "@radix-ui/react-checkbox": "^1.1.1", "@radix-ui/react-dropdown-menu": "^2.1.1", "@radix-ui/react-label": "^2.1.0", @@ -59,13 +58,13 @@ "glob": "^11.0.0", "isbot": "^5.1.12", "morgan": "^1.10.0", - "prisma": "^5.16.2", + "prisma": "^6.19.1", "qrcode": "^1.5.3", "react": "^18.3.1", "react-dom": "^18.3.1", "remix-auth": "^3.7.0", "remix-auth-form": "^1.5.0", - "remix-auth-github": "^1.7.0", + "remix-auth-github": "1.7.0", "remix-utils": "^7.6.0", "sonner": "^1.5.0", "source-map-support": "^0.5.21", @@ -111,7 +110,7 @@ "execa": "^9.3.0", "fs-extra": "^11.2.0", "jsdom": "^24.1.0", - "msw": "^2.3.1", + "msw": "^2.12.4", "node-html-parser": "^6.1.13", "npm-run-all": "^4.1.5", "prettier": "^3.3.2", diff --git a/exercises/10.custom-assertions/01.problem.location/tests/db-utils.ts b/exercises/10.custom-assertions/01.problem.location/tests/db-utils.ts index 3bdc6728e..257181f97 100644 --- a/exercises/10.custom-assertions/01.problem.location/tests/db-utils.ts +++ b/exercises/10.custom-assertions/01.problem.location/tests/db-utils.ts @@ -69,7 +69,7 @@ export async function getNoteImages() { }), img({ altText: - 'an office full of laptops and other office equipment that look like it was abandond in a rush out of the building in an emergency years ago.', + 'an office full of laptops and other office equipment that look like it was abandoned in a rush out of the building in an emergency years ago.', filepath: './tests/fixtures/images/notes/6.png', }), img({ @@ -137,6 +137,6 @@ export async function img({ return { altText, contentType: filepath.endsWith('.png') ? 'image/png' : 'image/jpeg', - blob: await fs.promises.readFile(filepath), + blob: new Uint8Array(await fs.promises.readFile(filepath)), } } diff --git a/exercises/10.custom-assertions/01.problem.location/tests/e2e/onboarding.test.ts b/exercises/10.custom-assertions/01.problem.location/tests/e2e/onboarding.test.ts index cd39afab3..88303b8c0 100644 --- a/exercises/10.custom-assertions/01.problem.location/tests/e2e/onboarding.test.ts +++ b/exercises/10.custom-assertions/01.problem.location/tests/e2e/onboarding.test.ts @@ -49,9 +49,7 @@ test('onboarding with link', async ({ page, getOnboardingData }) => { await page.getByRole('textbox', { name: /email/i }).fill(onboardingData.email) await page.getByRole('button', { name: /submit/i }).click() - await expect( - page.getByRole('button', { name: /submit/i, disabled: true }), - ).toBeVisible() + await expect(page.getByText(/check your email/i)).toBeVisible() const email = await waitFor(() => requireEmail(onboardingData.email)) diff --git a/exercises/10.custom-assertions/01.problem.location/tests/setup/setup-test-env.ts b/exercises/10.custom-assertions/01.problem.location/tests/setup/setup-test-env.ts index f370f5fe6..c26593fe6 100644 --- a/exercises/10.custom-assertions/01.problem.location/tests/setup/setup-test-env.ts +++ b/exercises/10.custom-assertions/01.problem.location/tests/setup/setup-test-env.ts @@ -1,15 +1,12 @@ import 'dotenv/config' import '#app/utils/env.server.ts' import '@testing-library/jest-dom/vitest' -import { installGlobals } from '@remix-run/node' import { cleanup } from '@testing-library/react' import { afterEach, beforeEach, vi, type MockInstance } from 'vitest' import { prisma } from '#app/utils/db.server.ts' import { insertedUsers } from '#tests/db-utils.ts' import { server } from '../mocks/index.ts' -installGlobals() - afterEach(() => server.resetHandlers()) afterEach(() => cleanup()) afterEach(async () => { diff --git a/exercises/10.custom-assertions/01.problem.location/tsconfig.json b/exercises/10.custom-assertions/01.problem.location/tsconfig.json index 24dfcf663..1fd3c87a9 100644 --- a/exercises/10.custom-assertions/01.problem.location/tsconfig.json +++ b/exercises/10.custom-assertions/01.problem.location/tsconfig.json @@ -2,6 +2,8 @@ "include": ["**/*.ts", "**/*.tsx"], "compilerOptions": { "lib": ["DOM", "DOM.Iterable", "ES2022"], + // this is necessary because our custom matchers are overriding the jest-dom matchers types + "types": ["vitest", "@testing-library/jest-dom"], "isolatedModules": true, "esModuleInterop": true, "jsx": "react-jsx", diff --git a/exercises/10.custom-assertions/01.solution.location/app/epicshop.tsx b/exercises/10.custom-assertions/01.solution.location/app/epicshop.tsx deleted file mode 100644 index 96c5597cb..000000000 --- a/exercises/10.custom-assertions/01.solution.location/app/epicshop.tsx +++ /dev/null @@ -1,9 +0,0 @@ -// Ignore this file please -import { EpicShopIFrameSync } from '@epic-web/workshop-utils/iframe-sync' -import { useNavigate } from '@remix-run/react' -import * as React from 'react' - -export function EpicShop() { - const navigate = useNavigate() - return -} diff --git a/exercises/10.custom-assertions/01.solution.location/app/root.tsx b/exercises/10.custom-assertions/01.solution.location/app/root.tsx index 3b2064a1a..fa7f41981 100644 --- a/exercises/10.custom-assertions/01.solution.location/app/root.tsx +++ b/exercises/10.custom-assertions/01.solution.location/app/root.tsx @@ -34,7 +34,6 @@ import { SearchBar } from './components/search-bar.tsx' import { Spacer } from './components/spacer.tsx' import { Button } from './components/ui/button.tsx' import { Icon } from './components/ui/icon.tsx' -import { EpicShop } from './epicshop.tsx' import fontStylestylesheetUrl from './styles/font.css' import tailwindStylesheetUrl from './styles/tailwind.css' import { getUserId } from './utils/auth.server.ts' @@ -159,7 +158,6 @@ function Document({ - diff --git a/exercises/10.custom-assertions/01.solution.location/app/routes/resources+/note-images.$imageId.tsx b/exercises/10.custom-assertions/01.solution.location/app/routes/resources+/note-images.$imageId.tsx index 417545a3e..865878a92 100644 --- a/exercises/10.custom-assertions/01.solution.location/app/routes/resources+/note-images.$imageId.tsx +++ b/exercises/10.custom-assertions/01.solution.location/app/routes/resources+/note-images.$imageId.tsx @@ -14,7 +14,7 @@ export async function loader({ params }: LoaderFunctionArgs) { return new Response(image.blob, { headers: { 'content-type': image.contentType, - 'content-length': Buffer.byteLength(image.blob).toString(), + 'content-length': image.blob.length.toString(), 'content-disposition': `inline; filename="${params.imageId}"`, 'cache-control': 'public, max-age=31536000, immutable', }, diff --git a/exercises/10.custom-assertions/01.solution.location/app/routes/resources+/user-images.$imageId.tsx b/exercises/10.custom-assertions/01.solution.location/app/routes/resources+/user-images.$imageId.tsx index c5a66b146..2de45198e 100644 --- a/exercises/10.custom-assertions/01.solution.location/app/routes/resources+/user-images.$imageId.tsx +++ b/exercises/10.custom-assertions/01.solution.location/app/routes/resources+/user-images.$imageId.tsx @@ -14,7 +14,7 @@ export async function loader({ params }: LoaderFunctionArgs) { return new Response(image.blob, { headers: { 'content-type': image.contentType, - 'content-length': Buffer.byteLength(image.blob).toString(), + 'content-length': image.blob.length.toString(), 'content-disposition': `inline; filename="${params.imageId}"`, 'cache-control': 'public, max-age=31536000, immutable', }, diff --git a/exercises/10.custom-assertions/01.solution.location/app/routes/settings+/profile.photo.tsx b/exercises/10.custom-assertions/01.solution.location/app/routes/settings+/profile.photo.tsx index f452baf9a..36e397f0b 100644 --- a/exercises/10.custom-assertions/01.solution.location/app/routes/settings+/profile.photo.tsx +++ b/exercises/10.custom-assertions/01.solution.location/app/routes/settings+/profile.photo.tsx @@ -76,7 +76,7 @@ export async function action({ request }: ActionFunctionArgs) { return { image: { contentType: data.photoFile.type, - blob: Buffer.from(await data.photoFile.arrayBuffer()), + blob: new Uint8Array(await data.photoFile.arrayBuffer()), }, } }), diff --git a/exercises/10.custom-assertions/01.solution.location/app/routes/users+/$username_+/__note-editor.tsx b/exercises/10.custom-assertions/01.solution.location/app/routes/users+/$username_+/__note-editor.tsx index 714fa7baf..7c8ee2109 100644 --- a/exercises/10.custom-assertions/01.solution.location/app/routes/users+/$username_+/__note-editor.tsx +++ b/exercises/10.custom-assertions/01.solution.location/app/routes/users+/$username_+/__note-editor.tsx @@ -96,7 +96,7 @@ export async function action({ request, params }: ActionFunctionArgs) { id: i.id, altText: i.altText, contentType: i.file.type, - blob: Buffer.from(await i.file.arrayBuffer()), + blob: new Uint8Array(await i.file.arrayBuffer()), } } else { return { id: i.id, altText: i.altText } @@ -111,7 +111,7 @@ export async function action({ request, params }: ActionFunctionArgs) { return { altText: image.altText, contentType: image.file.type, - blob: Buffer.from(await image.file.arrayBuffer()), + blob: new Uint8Array(await image.file.arrayBuffer()), } }), ), diff --git a/exercises/10.custom-assertions/01.solution.location/app/utils/misc.tsx b/exercises/10.custom-assertions/01.solution.location/app/utils/misc.tsx index 8879f6b41..a553484db 100644 --- a/exercises/10.custom-assertions/01.solution.location/app/utils/misc.tsx +++ b/exercises/10.custom-assertions/01.solution.location/app/utils/misc.tsx @@ -303,7 +303,7 @@ export async function downloadFile(url: string, retries: number = 0) { throw new Error(`Failed to fetch image with status ${response.status}`) } const contentType = response.headers.get('content-type') ?? 'image/jpg' - const blob = Buffer.from(await response.arrayBuffer()) + const blob = new Uint8Array(await response.arrayBuffer()) return { contentType, blob } } catch (e) { if (retries > MAX_RETRIES) throw e diff --git a/exercises/10.custom-assertions/01.solution.location/index.js b/exercises/10.custom-assertions/01.solution.location/index.js index 8ba83ba70..e8728a002 100644 --- a/exercises/10.custom-assertions/01.solution.location/index.js +++ b/exercises/10.custom-assertions/01.solution.location/index.js @@ -1,11 +1,8 @@ import 'dotenv/config' import 'source-map-support/register.js' -import { installGlobals } from '@remix-run/node' import chalk from 'chalk' import closeWithGrace from 'close-with-grace' -installGlobals() - if ( process.env.NODE_ENV !== 'production' || process.env.PLAYWRIGHT_TEST_BASE_URL diff --git a/exercises/10.custom-assertions/01.solution.location/package.json b/exercises/10.custom-assertions/01.solution.location/package.json index 6dd1ad6d7..95fd66f5a 100644 --- a/exercises/10.custom-assertions/01.solution.location/package.json +++ b/exercises/10.custom-assertions/01.solution.location/package.json @@ -30,9 +30,8 @@ "@conform-to/zod": "^0.9.0", "@epic-web/remember": "^1.1.0", "@epic-web/totp": "^1.1.2", - "@epic-web/workshop-utils": "^4.21.1", "@paralleldrive/cuid2": "^2.2.2", - "@prisma/client": "^5.16.2", + "@prisma/client": "^6.19.1", "@radix-ui/react-checkbox": "^1.1.1", "@radix-ui/react-dropdown-menu": "^2.1.1", "@radix-ui/react-label": "^2.1.0", @@ -59,13 +58,13 @@ "glob": "^11.0.0", "isbot": "^5.1.12", "morgan": "^1.10.0", - "prisma": "^5.16.2", + "prisma": "^6.19.1", "qrcode": "^1.5.3", "react": "^18.3.1", "react-dom": "^18.3.1", "remix-auth": "^3.7.0", "remix-auth-form": "^1.5.0", - "remix-auth-github": "^1.7.0", + "remix-auth-github": "1.7.0", "remix-utils": "^7.6.0", "sonner": "^1.5.0", "source-map-support": "^0.5.21", @@ -111,7 +110,7 @@ "execa": "^9.3.0", "fs-extra": "^11.2.0", "jsdom": "^24.1.0", - "msw": "^2.3.1", + "msw": "^2.12.4", "node-html-parser": "^6.1.13", "npm-run-all": "^4.1.5", "prettier": "^3.3.2", diff --git a/exercises/10.custom-assertions/01.solution.location/tests/db-utils.ts b/exercises/10.custom-assertions/01.solution.location/tests/db-utils.ts index 3bdc6728e..257181f97 100644 --- a/exercises/10.custom-assertions/01.solution.location/tests/db-utils.ts +++ b/exercises/10.custom-assertions/01.solution.location/tests/db-utils.ts @@ -69,7 +69,7 @@ export async function getNoteImages() { }), img({ altText: - 'an office full of laptops and other office equipment that look like it was abandond in a rush out of the building in an emergency years ago.', + 'an office full of laptops and other office equipment that look like it was abandoned in a rush out of the building in an emergency years ago.', filepath: './tests/fixtures/images/notes/6.png', }), img({ @@ -137,6 +137,6 @@ export async function img({ return { altText, contentType: filepath.endsWith('.png') ? 'image/png' : 'image/jpeg', - blob: await fs.promises.readFile(filepath), + blob: new Uint8Array(await fs.promises.readFile(filepath)), } } diff --git a/exercises/10.custom-assertions/01.solution.location/tests/e2e/onboarding.test.ts b/exercises/10.custom-assertions/01.solution.location/tests/e2e/onboarding.test.ts index cd39afab3..88303b8c0 100644 --- a/exercises/10.custom-assertions/01.solution.location/tests/e2e/onboarding.test.ts +++ b/exercises/10.custom-assertions/01.solution.location/tests/e2e/onboarding.test.ts @@ -49,9 +49,7 @@ test('onboarding with link', async ({ page, getOnboardingData }) => { await page.getByRole('textbox', { name: /email/i }).fill(onboardingData.email) await page.getByRole('button', { name: /submit/i }).click() - await expect( - page.getByRole('button', { name: /submit/i, disabled: true }), - ).toBeVisible() + await expect(page.getByText(/check your email/i)).toBeVisible() const email = await waitFor(() => requireEmail(onboardingData.email)) diff --git a/exercises/10.custom-assertions/01.solution.location/tests/setup/setup-test-env.ts b/exercises/10.custom-assertions/01.solution.location/tests/setup/setup-test-env.ts index f370f5fe6..c26593fe6 100644 --- a/exercises/10.custom-assertions/01.solution.location/tests/setup/setup-test-env.ts +++ b/exercises/10.custom-assertions/01.solution.location/tests/setup/setup-test-env.ts @@ -1,15 +1,12 @@ import 'dotenv/config' import '#app/utils/env.server.ts' import '@testing-library/jest-dom/vitest' -import { installGlobals } from '@remix-run/node' import { cleanup } from '@testing-library/react' import { afterEach, beforeEach, vi, type MockInstance } from 'vitest' import { prisma } from '#app/utils/db.server.ts' import { insertedUsers } from '#tests/db-utils.ts' import { server } from '../mocks/index.ts' -installGlobals() - afterEach(() => server.resetHandlers()) afterEach(() => cleanup()) afterEach(async () => { diff --git a/exercises/10.custom-assertions/01.solution.location/tsconfig.json b/exercises/10.custom-assertions/01.solution.location/tsconfig.json index 24dfcf663..1fd3c87a9 100644 --- a/exercises/10.custom-assertions/01.solution.location/tsconfig.json +++ b/exercises/10.custom-assertions/01.solution.location/tsconfig.json @@ -2,6 +2,8 @@ "include": ["**/*.ts", "**/*.tsx"], "compilerOptions": { "lib": ["DOM", "DOM.Iterable", "ES2022"], + // this is necessary because our custom matchers are overriding the jest-dom matchers types + "types": ["vitest", "@testing-library/jest-dom"], "isolatedModules": true, "esModuleInterop": true, "jsx": "react-jsx", diff --git a/exercises/11.test-db/01.problem.setup/README.mdx b/exercises/11.test-db/01.problem.setup/README.mdx index 09d774aa3..766b7c2fc 100644 --- a/exercises/11.test-db/01.problem.setup/README.mdx +++ b/exercises/11.test-db/01.problem.setup/README.mdx @@ -32,3 +32,10 @@ top of the setup file before anything else has a chance to import prisma. ```sh nonumber npx vitest auth ``` + + + Something must have changed and now you may get an error about `eventTargets`. + This will go away in the next steps, but check [this + issue](https://github.com/epicweb-dev/full-stack-testing/issues/39) for more + information and a workaround. + diff --git a/exercises/11.test-db/01.problem.setup/app/epicshop.tsx b/exercises/11.test-db/01.problem.setup/app/epicshop.tsx deleted file mode 100644 index 96c5597cb..000000000 --- a/exercises/11.test-db/01.problem.setup/app/epicshop.tsx +++ /dev/null @@ -1,9 +0,0 @@ -// Ignore this file please -import { EpicShopIFrameSync } from '@epic-web/workshop-utils/iframe-sync' -import { useNavigate } from '@remix-run/react' -import * as React from 'react' - -export function EpicShop() { - const navigate = useNavigate() - return -} diff --git a/exercises/11.test-db/01.problem.setup/app/root.tsx b/exercises/11.test-db/01.problem.setup/app/root.tsx index 3b2064a1a..fa7f41981 100644 --- a/exercises/11.test-db/01.problem.setup/app/root.tsx +++ b/exercises/11.test-db/01.problem.setup/app/root.tsx @@ -34,7 +34,6 @@ import { SearchBar } from './components/search-bar.tsx' import { Spacer } from './components/spacer.tsx' import { Button } from './components/ui/button.tsx' import { Icon } from './components/ui/icon.tsx' -import { EpicShop } from './epicshop.tsx' import fontStylestylesheetUrl from './styles/font.css' import tailwindStylesheetUrl from './styles/tailwind.css' import { getUserId } from './utils/auth.server.ts' @@ -159,7 +158,6 @@ function Document({ - diff --git a/exercises/11.test-db/01.problem.setup/app/routes/resources+/note-images.$imageId.tsx b/exercises/11.test-db/01.problem.setup/app/routes/resources+/note-images.$imageId.tsx index 417545a3e..865878a92 100644 --- a/exercises/11.test-db/01.problem.setup/app/routes/resources+/note-images.$imageId.tsx +++ b/exercises/11.test-db/01.problem.setup/app/routes/resources+/note-images.$imageId.tsx @@ -14,7 +14,7 @@ export async function loader({ params }: LoaderFunctionArgs) { return new Response(image.blob, { headers: { 'content-type': image.contentType, - 'content-length': Buffer.byteLength(image.blob).toString(), + 'content-length': image.blob.length.toString(), 'content-disposition': `inline; filename="${params.imageId}"`, 'cache-control': 'public, max-age=31536000, immutable', }, diff --git a/exercises/11.test-db/01.problem.setup/app/routes/resources+/user-images.$imageId.tsx b/exercises/11.test-db/01.problem.setup/app/routes/resources+/user-images.$imageId.tsx index c5a66b146..2de45198e 100644 --- a/exercises/11.test-db/01.problem.setup/app/routes/resources+/user-images.$imageId.tsx +++ b/exercises/11.test-db/01.problem.setup/app/routes/resources+/user-images.$imageId.tsx @@ -14,7 +14,7 @@ export async function loader({ params }: LoaderFunctionArgs) { return new Response(image.blob, { headers: { 'content-type': image.contentType, - 'content-length': Buffer.byteLength(image.blob).toString(), + 'content-length': image.blob.length.toString(), 'content-disposition': `inline; filename="${params.imageId}"`, 'cache-control': 'public, max-age=31536000, immutable', }, diff --git a/exercises/11.test-db/01.problem.setup/app/routes/settings+/profile.photo.tsx b/exercises/11.test-db/01.problem.setup/app/routes/settings+/profile.photo.tsx index f452baf9a..36e397f0b 100644 --- a/exercises/11.test-db/01.problem.setup/app/routes/settings+/profile.photo.tsx +++ b/exercises/11.test-db/01.problem.setup/app/routes/settings+/profile.photo.tsx @@ -76,7 +76,7 @@ export async function action({ request }: ActionFunctionArgs) { return { image: { contentType: data.photoFile.type, - blob: Buffer.from(await data.photoFile.arrayBuffer()), + blob: new Uint8Array(await data.photoFile.arrayBuffer()), }, } }), diff --git a/exercises/11.test-db/01.problem.setup/app/routes/users+/$username_+/__note-editor.tsx b/exercises/11.test-db/01.problem.setup/app/routes/users+/$username_+/__note-editor.tsx index 714fa7baf..7c8ee2109 100644 --- a/exercises/11.test-db/01.problem.setup/app/routes/users+/$username_+/__note-editor.tsx +++ b/exercises/11.test-db/01.problem.setup/app/routes/users+/$username_+/__note-editor.tsx @@ -96,7 +96,7 @@ export async function action({ request, params }: ActionFunctionArgs) { id: i.id, altText: i.altText, contentType: i.file.type, - blob: Buffer.from(await i.file.arrayBuffer()), + blob: new Uint8Array(await i.file.arrayBuffer()), } } else { return { id: i.id, altText: i.altText } @@ -111,7 +111,7 @@ export async function action({ request, params }: ActionFunctionArgs) { return { altText: image.altText, contentType: image.file.type, - blob: Buffer.from(await image.file.arrayBuffer()), + blob: new Uint8Array(await image.file.arrayBuffer()), } }), ), diff --git a/exercises/11.test-db/01.problem.setup/app/utils/misc.tsx b/exercises/11.test-db/01.problem.setup/app/utils/misc.tsx index 8879f6b41..a553484db 100644 --- a/exercises/11.test-db/01.problem.setup/app/utils/misc.tsx +++ b/exercises/11.test-db/01.problem.setup/app/utils/misc.tsx @@ -303,7 +303,7 @@ export async function downloadFile(url: string, retries: number = 0) { throw new Error(`Failed to fetch image with status ${response.status}`) } const contentType = response.headers.get('content-type') ?? 'image/jpg' - const blob = Buffer.from(await response.arrayBuffer()) + const blob = new Uint8Array(await response.arrayBuffer()) return { contentType, blob } } catch (e) { if (retries > MAX_RETRIES) throw e diff --git a/exercises/11.test-db/01.problem.setup/index.js b/exercises/11.test-db/01.problem.setup/index.js index 8ba83ba70..e8728a002 100644 --- a/exercises/11.test-db/01.problem.setup/index.js +++ b/exercises/11.test-db/01.problem.setup/index.js @@ -1,11 +1,8 @@ import 'dotenv/config' import 'source-map-support/register.js' -import { installGlobals } from '@remix-run/node' import chalk from 'chalk' import closeWithGrace from 'close-with-grace' -installGlobals() - if ( process.env.NODE_ENV !== 'production' || process.env.PLAYWRIGHT_TEST_BASE_URL diff --git a/exercises/11.test-db/01.problem.setup/package.json b/exercises/11.test-db/01.problem.setup/package.json index 4f71cc133..aa619147b 100644 --- a/exercises/11.test-db/01.problem.setup/package.json +++ b/exercises/11.test-db/01.problem.setup/package.json @@ -30,9 +30,8 @@ "@conform-to/zod": "^0.9.0", "@epic-web/remember": "^1.1.0", "@epic-web/totp": "^1.1.2", - "@epic-web/workshop-utils": "^4.21.1", "@paralleldrive/cuid2": "^2.2.2", - "@prisma/client": "^5.16.2", + "@prisma/client": "^6.19.1", "@radix-ui/react-checkbox": "^1.1.1", "@radix-ui/react-dropdown-menu": "^2.1.1", "@radix-ui/react-label": "^2.1.0", @@ -59,13 +58,13 @@ "glob": "^11.0.0", "isbot": "^5.1.12", "morgan": "^1.10.0", - "prisma": "^5.16.2", + "prisma": "^6.19.1", "qrcode": "^1.5.3", "react": "^18.3.1", "react-dom": "^18.3.1", "remix-auth": "^3.7.0", "remix-auth-form": "^1.5.0", - "remix-auth-github": "^1.7.0", + "remix-auth-github": "1.7.0", "remix-utils": "^7.6.0", "sonner": "^1.5.0", "source-map-support": "^0.5.21", @@ -111,7 +110,7 @@ "execa": "^9.3.0", "fs-extra": "^11.2.0", "jsdom": "^24.1.0", - "msw": "^2.3.1", + "msw": "^2.12.4", "node-html-parser": "^6.1.13", "npm-run-all": "^4.1.5", "prettier": "^3.3.2", diff --git a/exercises/11.test-db/01.problem.setup/tests/db-utils.ts b/exercises/11.test-db/01.problem.setup/tests/db-utils.ts index 9769a92d1..c470a39e5 100644 --- a/exercises/11.test-db/01.problem.setup/tests/db-utils.ts +++ b/exercises/11.test-db/01.problem.setup/tests/db-utils.ts @@ -69,7 +69,7 @@ export async function getNoteImages() { }), img({ altText: - 'an office full of laptops and other office equipment that look like it was abandond in a rush out of the building in an emergency years ago.', + 'an office full of laptops and other office equipment that look like it was abandoned in a rush out of the building in an emergency years ago.', filepath: './tests/fixtures/images/notes/6.png', }), img({ @@ -139,6 +139,6 @@ export async function img({ return { altText, contentType: filepath.endsWith('.png') ? 'image/png' : 'image/jpeg', - blob: await fs.promises.readFile(filepath), + blob: new Uint8Array(await fs.promises.readFile(filepath)), } } diff --git a/exercises/11.test-db/01.problem.setup/tests/e2e/onboarding.test.ts b/exercises/11.test-db/01.problem.setup/tests/e2e/onboarding.test.ts index cd39afab3..88303b8c0 100644 --- a/exercises/11.test-db/01.problem.setup/tests/e2e/onboarding.test.ts +++ b/exercises/11.test-db/01.problem.setup/tests/e2e/onboarding.test.ts @@ -49,9 +49,7 @@ test('onboarding with link', async ({ page, getOnboardingData }) => { await page.getByRole('textbox', { name: /email/i }).fill(onboardingData.email) await page.getByRole('button', { name: /submit/i }).click() - await expect( - page.getByRole('button', { name: /submit/i, disabled: true }), - ).toBeVisible() + await expect(page.getByText(/check your email/i)).toBeVisible() const email = await waitFor(() => requireEmail(onboardingData.email)) diff --git a/exercises/11.test-db/01.problem.setup/tests/setup/custom-matchers.ts b/exercises/11.test-db/01.problem.setup/tests/setup/custom-matchers.ts index af99614ab..2fc576bef 100644 --- a/exercises/11.test-db/01.problem.setup/tests/setup/custom-matchers.ts +++ b/exercises/11.test-db/01.problem.setup/tests/setup/custom-matchers.ts @@ -72,7 +72,7 @@ expect.extend({ } }, async toHaveSessionForUser(response: Response, userId: string) { - const setCookies = getSetCookie(response.headers) + const setCookies = response.headers.getSetCookie() const sessionSetCookie = setCookies.find( c => setCookieParser.parseString(c).name === 'en_session', ) @@ -113,7 +113,7 @@ expect.extend({ } }, async toSendToast(response: Response, toast: OptionalToast) { - const setCookies = getSetCookie(response.headers) + const setCookies = response.headers.getSetCookie() const toastSetCookie = setCookies.find( c => setCookieParser.parseString(c).name === 'en_toast', ) @@ -162,11 +162,3 @@ declare module 'vitest' { interface Assertion extends CustomMatchers {} interface AsymmetricMatchersContaining extends CustomMatchers {} } - -function getSetCookie(headers: Headers) { - // this is a sort of polyfill for headers.getSetCookie - // https://github.com/microsoft/TypeScript/issues/55270 - // https://github.com/remix-run/remix/issues/7067 - // @ts-expect-error see the two issues above - return headers.getAll('set-cookie') as Array -} diff --git a/exercises/11.test-db/01.problem.setup/tests/setup/setup-test-env.ts b/exercises/11.test-db/01.problem.setup/tests/setup/setup-test-env.ts index e88e335fb..ac2dc01ed 100644 --- a/exercises/11.test-db/01.problem.setup/tests/setup/setup-test-env.ts +++ b/exercises/11.test-db/01.problem.setup/tests/setup/setup-test-env.ts @@ -2,7 +2,6 @@ import 'dotenv/config' // 🐨 import ./db-setup.ts here import '#app/utils/env.server.ts' import '@testing-library/jest-dom/vitest' -import { installGlobals } from '@remix-run/node' import { cleanup } from '@testing-library/react' import { afterEach, beforeEach, vi, type MockInstance } from 'vitest' import { prisma } from '#app/utils/db.server.ts' @@ -10,8 +9,6 @@ import { insertedUsers } from '#tests/db-utils.ts' import { server } from '../mocks/index.ts' import './custom-matchers.ts' -installGlobals() - afterEach(() => server.resetHandlers()) afterEach(() => cleanup()) // 💣 now that we're isolated, we no longer need to worry about keeping track diff --git a/exercises/11.test-db/01.problem.setup/tsconfig.json b/exercises/11.test-db/01.problem.setup/tsconfig.json index 24dfcf663..1fd3c87a9 100644 --- a/exercises/11.test-db/01.problem.setup/tsconfig.json +++ b/exercises/11.test-db/01.problem.setup/tsconfig.json @@ -2,6 +2,8 @@ "include": ["**/*.ts", "**/*.tsx"], "compilerOptions": { "lib": ["DOM", "DOM.Iterable", "ES2022"], + // this is necessary because our custom matchers are overriding the jest-dom matchers types + "types": ["vitest", "@testing-library/jest-dom"], "isolatedModules": true, "esModuleInterop": true, "jsx": "react-jsx", diff --git a/exercises/11.test-db/01.solution.setup/app/epicshop.tsx b/exercises/11.test-db/01.solution.setup/app/epicshop.tsx deleted file mode 100644 index 96c5597cb..000000000 --- a/exercises/11.test-db/01.solution.setup/app/epicshop.tsx +++ /dev/null @@ -1,9 +0,0 @@ -// Ignore this file please -import { EpicShopIFrameSync } from '@epic-web/workshop-utils/iframe-sync' -import { useNavigate } from '@remix-run/react' -import * as React from 'react' - -export function EpicShop() { - const navigate = useNavigate() - return -} diff --git a/exercises/11.test-db/01.solution.setup/app/root.tsx b/exercises/11.test-db/01.solution.setup/app/root.tsx index 3b2064a1a..fa7f41981 100644 --- a/exercises/11.test-db/01.solution.setup/app/root.tsx +++ b/exercises/11.test-db/01.solution.setup/app/root.tsx @@ -34,7 +34,6 @@ import { SearchBar } from './components/search-bar.tsx' import { Spacer } from './components/spacer.tsx' import { Button } from './components/ui/button.tsx' import { Icon } from './components/ui/icon.tsx' -import { EpicShop } from './epicshop.tsx' import fontStylestylesheetUrl from './styles/font.css' import tailwindStylesheetUrl from './styles/tailwind.css' import { getUserId } from './utils/auth.server.ts' @@ -159,7 +158,6 @@ function Document({ - diff --git a/exercises/11.test-db/01.solution.setup/app/routes/resources+/note-images.$imageId.tsx b/exercises/11.test-db/01.solution.setup/app/routes/resources+/note-images.$imageId.tsx index 417545a3e..865878a92 100644 --- a/exercises/11.test-db/01.solution.setup/app/routes/resources+/note-images.$imageId.tsx +++ b/exercises/11.test-db/01.solution.setup/app/routes/resources+/note-images.$imageId.tsx @@ -14,7 +14,7 @@ export async function loader({ params }: LoaderFunctionArgs) { return new Response(image.blob, { headers: { 'content-type': image.contentType, - 'content-length': Buffer.byteLength(image.blob).toString(), + 'content-length': image.blob.length.toString(), 'content-disposition': `inline; filename="${params.imageId}"`, 'cache-control': 'public, max-age=31536000, immutable', }, diff --git a/exercises/11.test-db/01.solution.setup/app/routes/resources+/user-images.$imageId.tsx b/exercises/11.test-db/01.solution.setup/app/routes/resources+/user-images.$imageId.tsx index c5a66b146..2de45198e 100644 --- a/exercises/11.test-db/01.solution.setup/app/routes/resources+/user-images.$imageId.tsx +++ b/exercises/11.test-db/01.solution.setup/app/routes/resources+/user-images.$imageId.tsx @@ -14,7 +14,7 @@ export async function loader({ params }: LoaderFunctionArgs) { return new Response(image.blob, { headers: { 'content-type': image.contentType, - 'content-length': Buffer.byteLength(image.blob).toString(), + 'content-length': image.blob.length.toString(), 'content-disposition': `inline; filename="${params.imageId}"`, 'cache-control': 'public, max-age=31536000, immutable', }, diff --git a/exercises/11.test-db/01.solution.setup/app/routes/settings+/profile.photo.tsx b/exercises/11.test-db/01.solution.setup/app/routes/settings+/profile.photo.tsx index f452baf9a..36e397f0b 100644 --- a/exercises/11.test-db/01.solution.setup/app/routes/settings+/profile.photo.tsx +++ b/exercises/11.test-db/01.solution.setup/app/routes/settings+/profile.photo.tsx @@ -76,7 +76,7 @@ export async function action({ request }: ActionFunctionArgs) { return { image: { contentType: data.photoFile.type, - blob: Buffer.from(await data.photoFile.arrayBuffer()), + blob: new Uint8Array(await data.photoFile.arrayBuffer()), }, } }), diff --git a/exercises/11.test-db/01.solution.setup/app/routes/users+/$username_+/__note-editor.tsx b/exercises/11.test-db/01.solution.setup/app/routes/users+/$username_+/__note-editor.tsx index 714fa7baf..7c8ee2109 100644 --- a/exercises/11.test-db/01.solution.setup/app/routes/users+/$username_+/__note-editor.tsx +++ b/exercises/11.test-db/01.solution.setup/app/routes/users+/$username_+/__note-editor.tsx @@ -96,7 +96,7 @@ export async function action({ request, params }: ActionFunctionArgs) { id: i.id, altText: i.altText, contentType: i.file.type, - blob: Buffer.from(await i.file.arrayBuffer()), + blob: new Uint8Array(await i.file.arrayBuffer()), } } else { return { id: i.id, altText: i.altText } @@ -111,7 +111,7 @@ export async function action({ request, params }: ActionFunctionArgs) { return { altText: image.altText, contentType: image.file.type, - blob: Buffer.from(await image.file.arrayBuffer()), + blob: new Uint8Array(await image.file.arrayBuffer()), } }), ), diff --git a/exercises/11.test-db/01.solution.setup/app/utils/misc.tsx b/exercises/11.test-db/01.solution.setup/app/utils/misc.tsx index 8879f6b41..a553484db 100644 --- a/exercises/11.test-db/01.solution.setup/app/utils/misc.tsx +++ b/exercises/11.test-db/01.solution.setup/app/utils/misc.tsx @@ -303,7 +303,7 @@ export async function downloadFile(url: string, retries: number = 0) { throw new Error(`Failed to fetch image with status ${response.status}`) } const contentType = response.headers.get('content-type') ?? 'image/jpg' - const blob = Buffer.from(await response.arrayBuffer()) + const blob = new Uint8Array(await response.arrayBuffer()) return { contentType, blob } } catch (e) { if (retries > MAX_RETRIES) throw e diff --git a/exercises/11.test-db/01.solution.setup/index.js b/exercises/11.test-db/01.solution.setup/index.js index 8ba83ba70..e8728a002 100644 --- a/exercises/11.test-db/01.solution.setup/index.js +++ b/exercises/11.test-db/01.solution.setup/index.js @@ -1,11 +1,8 @@ import 'dotenv/config' import 'source-map-support/register.js' -import { installGlobals } from '@remix-run/node' import chalk from 'chalk' import closeWithGrace from 'close-with-grace' -installGlobals() - if ( process.env.NODE_ENV !== 'production' || process.env.PLAYWRIGHT_TEST_BASE_URL diff --git a/exercises/11.test-db/01.solution.setup/package.json b/exercises/11.test-db/01.solution.setup/package.json index 33a9e056b..42c37724b 100644 --- a/exercises/11.test-db/01.solution.setup/package.json +++ b/exercises/11.test-db/01.solution.setup/package.json @@ -30,9 +30,8 @@ "@conform-to/zod": "^0.9.0", "@epic-web/remember": "^1.1.0", "@epic-web/totp": "^1.1.2", - "@epic-web/workshop-utils": "^4.21.1", "@paralleldrive/cuid2": "^2.2.2", - "@prisma/client": "^5.16.2", + "@prisma/client": "^6.19.1", "@radix-ui/react-checkbox": "^1.1.1", "@radix-ui/react-dropdown-menu": "^2.1.1", "@radix-ui/react-label": "^2.1.0", @@ -59,13 +58,13 @@ "glob": "^11.0.0", "isbot": "^5.1.12", "morgan": "^1.10.0", - "prisma": "^5.16.2", + "prisma": "^6.19.1", "qrcode": "^1.5.3", "react": "^18.3.1", "react-dom": "^18.3.1", "remix-auth": "^3.7.0", "remix-auth-form": "^1.5.0", - "remix-auth-github": "^1.7.0", + "remix-auth-github": "1.7.0", "remix-utils": "^7.6.0", "sonner": "^1.5.0", "source-map-support": "^0.5.21", @@ -111,7 +110,7 @@ "execa": "^9.3.0", "fs-extra": "^11.2.0", "jsdom": "^24.1.0", - "msw": "^2.3.1", + "msw": "^2.12.4", "node-html-parser": "^6.1.13", "npm-run-all": "^4.1.5", "prettier": "^3.3.2", diff --git a/exercises/11.test-db/01.solution.setup/tests/db-utils.ts b/exercises/11.test-db/01.solution.setup/tests/db-utils.ts index dbf160d6e..f98c899a8 100644 --- a/exercises/11.test-db/01.solution.setup/tests/db-utils.ts +++ b/exercises/11.test-db/01.solution.setup/tests/db-utils.ts @@ -69,7 +69,7 @@ export async function getNoteImages() { }), img({ altText: - 'an office full of laptops and other office equipment that look like it was abandond in a rush out of the building in an emergency years ago.', + 'an office full of laptops and other office equipment that look like it was abandoned in a rush out of the building in an emergency years ago.', filepath: './tests/fixtures/images/notes/6.png', }), img({ @@ -134,6 +134,6 @@ export async function img({ return { altText, contentType: filepath.endsWith('.png') ? 'image/png' : 'image/jpeg', - blob: await fs.promises.readFile(filepath), + blob: new Uint8Array(await fs.promises.readFile(filepath)), } } diff --git a/exercises/11.test-db/01.solution.setup/tests/e2e/onboarding.test.ts b/exercises/11.test-db/01.solution.setup/tests/e2e/onboarding.test.ts index cd39afab3..88303b8c0 100644 --- a/exercises/11.test-db/01.solution.setup/tests/e2e/onboarding.test.ts +++ b/exercises/11.test-db/01.solution.setup/tests/e2e/onboarding.test.ts @@ -49,9 +49,7 @@ test('onboarding with link', async ({ page, getOnboardingData }) => { await page.getByRole('textbox', { name: /email/i }).fill(onboardingData.email) await page.getByRole('button', { name: /submit/i }).click() - await expect( - page.getByRole('button', { name: /submit/i, disabled: true }), - ).toBeVisible() + await expect(page.getByText(/check your email/i)).toBeVisible() const email = await waitFor(() => requireEmail(onboardingData.email)) diff --git a/exercises/11.test-db/01.solution.setup/tests/setup/custom-matchers.ts b/exercises/11.test-db/01.solution.setup/tests/setup/custom-matchers.ts index af99614ab..2fc576bef 100644 --- a/exercises/11.test-db/01.solution.setup/tests/setup/custom-matchers.ts +++ b/exercises/11.test-db/01.solution.setup/tests/setup/custom-matchers.ts @@ -72,7 +72,7 @@ expect.extend({ } }, async toHaveSessionForUser(response: Response, userId: string) { - const setCookies = getSetCookie(response.headers) + const setCookies = response.headers.getSetCookie() const sessionSetCookie = setCookies.find( c => setCookieParser.parseString(c).name === 'en_session', ) @@ -113,7 +113,7 @@ expect.extend({ } }, async toSendToast(response: Response, toast: OptionalToast) { - const setCookies = getSetCookie(response.headers) + const setCookies = response.headers.getSetCookie() const toastSetCookie = setCookies.find( c => setCookieParser.parseString(c).name === 'en_toast', ) @@ -162,11 +162,3 @@ declare module 'vitest' { interface Assertion extends CustomMatchers {} interface AsymmetricMatchersContaining extends CustomMatchers {} } - -function getSetCookie(headers: Headers) { - // this is a sort of polyfill for headers.getSetCookie - // https://github.com/microsoft/TypeScript/issues/55270 - // https://github.com/remix-run/remix/issues/7067 - // @ts-expect-error see the two issues above - return headers.getAll('set-cookie') as Array -} diff --git a/exercises/11.test-db/01.solution.setup/tests/setup/setup-test-env.ts b/exercises/11.test-db/01.solution.setup/tests/setup/setup-test-env.ts index beb46dec0..80524889c 100644 --- a/exercises/11.test-db/01.solution.setup/tests/setup/setup-test-env.ts +++ b/exercises/11.test-db/01.solution.setup/tests/setup/setup-test-env.ts @@ -2,14 +2,11 @@ import 'dotenv/config' import './db-setup.ts' import '#app/utils/env.server.ts' import '@testing-library/jest-dom/vitest' -import { installGlobals } from '@remix-run/node' import { cleanup } from '@testing-library/react' import { afterEach, beforeEach, vi, type MockInstance } from 'vitest' import { server } from '../mocks/index.ts' import './custom-matchers.ts' -installGlobals() - afterEach(() => server.resetHandlers()) afterEach(() => cleanup()) diff --git a/exercises/11.test-db/01.solution.setup/tsconfig.json b/exercises/11.test-db/01.solution.setup/tsconfig.json index 24dfcf663..1fd3c87a9 100644 --- a/exercises/11.test-db/01.solution.setup/tsconfig.json +++ b/exercises/11.test-db/01.solution.setup/tsconfig.json @@ -2,6 +2,8 @@ "include": ["**/*.ts", "**/*.tsx"], "compilerOptions": { "lib": ["DOM", "DOM.Iterable", "ES2022"], + // this is necessary because our custom matchers are overriding the jest-dom matchers types + "types": ["vitest", "@testing-library/jest-dom"], "isolatedModules": true, "esModuleInterop": true, "jsx": "react-jsx", diff --git a/exercises/11.test-db/02.problem.isolated-db/app/epicshop.tsx b/exercises/11.test-db/02.problem.isolated-db/app/epicshop.tsx deleted file mode 100644 index 96c5597cb..000000000 --- a/exercises/11.test-db/02.problem.isolated-db/app/epicshop.tsx +++ /dev/null @@ -1,9 +0,0 @@ -// Ignore this file please -import { EpicShopIFrameSync } from '@epic-web/workshop-utils/iframe-sync' -import { useNavigate } from '@remix-run/react' -import * as React from 'react' - -export function EpicShop() { - const navigate = useNavigate() - return -} diff --git a/exercises/11.test-db/02.problem.isolated-db/app/root.tsx b/exercises/11.test-db/02.problem.isolated-db/app/root.tsx index 3b2064a1a..fa7f41981 100644 --- a/exercises/11.test-db/02.problem.isolated-db/app/root.tsx +++ b/exercises/11.test-db/02.problem.isolated-db/app/root.tsx @@ -34,7 +34,6 @@ import { SearchBar } from './components/search-bar.tsx' import { Spacer } from './components/spacer.tsx' import { Button } from './components/ui/button.tsx' import { Icon } from './components/ui/icon.tsx' -import { EpicShop } from './epicshop.tsx' import fontStylestylesheetUrl from './styles/font.css' import tailwindStylesheetUrl from './styles/tailwind.css' import { getUserId } from './utils/auth.server.ts' @@ -159,7 +158,6 @@ function Document({ - diff --git a/exercises/11.test-db/02.problem.isolated-db/app/routes/resources+/note-images.$imageId.tsx b/exercises/11.test-db/02.problem.isolated-db/app/routes/resources+/note-images.$imageId.tsx index 417545a3e..865878a92 100644 --- a/exercises/11.test-db/02.problem.isolated-db/app/routes/resources+/note-images.$imageId.tsx +++ b/exercises/11.test-db/02.problem.isolated-db/app/routes/resources+/note-images.$imageId.tsx @@ -14,7 +14,7 @@ export async function loader({ params }: LoaderFunctionArgs) { return new Response(image.blob, { headers: { 'content-type': image.contentType, - 'content-length': Buffer.byteLength(image.blob).toString(), + 'content-length': image.blob.length.toString(), 'content-disposition': `inline; filename="${params.imageId}"`, 'cache-control': 'public, max-age=31536000, immutable', }, diff --git a/exercises/11.test-db/02.problem.isolated-db/app/routes/resources+/user-images.$imageId.tsx b/exercises/11.test-db/02.problem.isolated-db/app/routes/resources+/user-images.$imageId.tsx index c5a66b146..2de45198e 100644 --- a/exercises/11.test-db/02.problem.isolated-db/app/routes/resources+/user-images.$imageId.tsx +++ b/exercises/11.test-db/02.problem.isolated-db/app/routes/resources+/user-images.$imageId.tsx @@ -14,7 +14,7 @@ export async function loader({ params }: LoaderFunctionArgs) { return new Response(image.blob, { headers: { 'content-type': image.contentType, - 'content-length': Buffer.byteLength(image.blob).toString(), + 'content-length': image.blob.length.toString(), 'content-disposition': `inline; filename="${params.imageId}"`, 'cache-control': 'public, max-age=31536000, immutable', }, diff --git a/exercises/11.test-db/02.problem.isolated-db/app/routes/settings+/profile.photo.tsx b/exercises/11.test-db/02.problem.isolated-db/app/routes/settings+/profile.photo.tsx index f452baf9a..36e397f0b 100644 --- a/exercises/11.test-db/02.problem.isolated-db/app/routes/settings+/profile.photo.tsx +++ b/exercises/11.test-db/02.problem.isolated-db/app/routes/settings+/profile.photo.tsx @@ -76,7 +76,7 @@ export async function action({ request }: ActionFunctionArgs) { return { image: { contentType: data.photoFile.type, - blob: Buffer.from(await data.photoFile.arrayBuffer()), + blob: new Uint8Array(await data.photoFile.arrayBuffer()), }, } }), diff --git a/exercises/11.test-db/02.problem.isolated-db/app/routes/users+/$username_+/__note-editor.tsx b/exercises/11.test-db/02.problem.isolated-db/app/routes/users+/$username_+/__note-editor.tsx index 714fa7baf..7c8ee2109 100644 --- a/exercises/11.test-db/02.problem.isolated-db/app/routes/users+/$username_+/__note-editor.tsx +++ b/exercises/11.test-db/02.problem.isolated-db/app/routes/users+/$username_+/__note-editor.tsx @@ -96,7 +96,7 @@ export async function action({ request, params }: ActionFunctionArgs) { id: i.id, altText: i.altText, contentType: i.file.type, - blob: Buffer.from(await i.file.arrayBuffer()), + blob: new Uint8Array(await i.file.arrayBuffer()), } } else { return { id: i.id, altText: i.altText } @@ -111,7 +111,7 @@ export async function action({ request, params }: ActionFunctionArgs) { return { altText: image.altText, contentType: image.file.type, - blob: Buffer.from(await image.file.arrayBuffer()), + blob: new Uint8Array(await image.file.arrayBuffer()), } }), ), diff --git a/exercises/11.test-db/02.problem.isolated-db/app/utils/misc.tsx b/exercises/11.test-db/02.problem.isolated-db/app/utils/misc.tsx index 8879f6b41..a553484db 100644 --- a/exercises/11.test-db/02.problem.isolated-db/app/utils/misc.tsx +++ b/exercises/11.test-db/02.problem.isolated-db/app/utils/misc.tsx @@ -303,7 +303,7 @@ export async function downloadFile(url: string, retries: number = 0) { throw new Error(`Failed to fetch image with status ${response.status}`) } const contentType = response.headers.get('content-type') ?? 'image/jpg' - const blob = Buffer.from(await response.arrayBuffer()) + const blob = new Uint8Array(await response.arrayBuffer()) return { contentType, blob } } catch (e) { if (retries > MAX_RETRIES) throw e diff --git a/exercises/11.test-db/02.problem.isolated-db/index.js b/exercises/11.test-db/02.problem.isolated-db/index.js index 8ba83ba70..e8728a002 100644 --- a/exercises/11.test-db/02.problem.isolated-db/index.js +++ b/exercises/11.test-db/02.problem.isolated-db/index.js @@ -1,11 +1,8 @@ import 'dotenv/config' import 'source-map-support/register.js' -import { installGlobals } from '@remix-run/node' import chalk from 'chalk' import closeWithGrace from 'close-with-grace' -installGlobals() - if ( process.env.NODE_ENV !== 'production' || process.env.PLAYWRIGHT_TEST_BASE_URL diff --git a/exercises/11.test-db/02.problem.isolated-db/package.json b/exercises/11.test-db/02.problem.isolated-db/package.json index d8c784ad2..aa9cf0fb6 100644 --- a/exercises/11.test-db/02.problem.isolated-db/package.json +++ b/exercises/11.test-db/02.problem.isolated-db/package.json @@ -30,9 +30,8 @@ "@conform-to/zod": "^0.9.0", "@epic-web/remember": "^1.1.0", "@epic-web/totp": "^1.1.2", - "@epic-web/workshop-utils": "^4.21.1", "@paralleldrive/cuid2": "^2.2.2", - "@prisma/client": "^5.16.2", + "@prisma/client": "^6.19.1", "@radix-ui/react-checkbox": "^1.1.1", "@radix-ui/react-dropdown-menu": "^2.1.1", "@radix-ui/react-label": "^2.1.0", @@ -59,13 +58,13 @@ "glob": "^11.0.0", "isbot": "^5.1.12", "morgan": "^1.10.0", - "prisma": "^5.16.2", + "prisma": "^6.19.1", "qrcode": "^1.5.3", "react": "^18.3.1", "react-dom": "^18.3.1", "remix-auth": "^3.7.0", "remix-auth-form": "^1.5.0", - "remix-auth-github": "^1.7.0", + "remix-auth-github": "1.7.0", "remix-utils": "^7.6.0", "sonner": "^1.5.0", "source-map-support": "^0.5.21", @@ -111,7 +110,7 @@ "execa": "^9.3.0", "fs-extra": "^11.2.0", "jsdom": "^24.1.0", - "msw": "^2.3.1", + "msw": "^2.12.4", "node-html-parser": "^6.1.13", "npm-run-all": "^4.1.5", "prettier": "^3.3.2", diff --git a/exercises/11.test-db/02.problem.isolated-db/tests/db-utils.ts b/exercises/11.test-db/02.problem.isolated-db/tests/db-utils.ts index dbf160d6e..f98c899a8 100644 --- a/exercises/11.test-db/02.problem.isolated-db/tests/db-utils.ts +++ b/exercises/11.test-db/02.problem.isolated-db/tests/db-utils.ts @@ -69,7 +69,7 @@ export async function getNoteImages() { }), img({ altText: - 'an office full of laptops and other office equipment that look like it was abandond in a rush out of the building in an emergency years ago.', + 'an office full of laptops and other office equipment that look like it was abandoned in a rush out of the building in an emergency years ago.', filepath: './tests/fixtures/images/notes/6.png', }), img({ @@ -134,6 +134,6 @@ export async function img({ return { altText, contentType: filepath.endsWith('.png') ? 'image/png' : 'image/jpeg', - blob: await fs.promises.readFile(filepath), + blob: new Uint8Array(await fs.promises.readFile(filepath)), } } diff --git a/exercises/11.test-db/02.problem.isolated-db/tests/e2e/onboarding.test.ts b/exercises/11.test-db/02.problem.isolated-db/tests/e2e/onboarding.test.ts index cd39afab3..88303b8c0 100644 --- a/exercises/11.test-db/02.problem.isolated-db/tests/e2e/onboarding.test.ts +++ b/exercises/11.test-db/02.problem.isolated-db/tests/e2e/onboarding.test.ts @@ -49,9 +49,7 @@ test('onboarding with link', async ({ page, getOnboardingData }) => { await page.getByRole('textbox', { name: /email/i }).fill(onboardingData.email) await page.getByRole('button', { name: /submit/i }).click() - await expect( - page.getByRole('button', { name: /submit/i, disabled: true }), - ).toBeVisible() + await expect(page.getByText(/check your email/i)).toBeVisible() const email = await waitFor(() => requireEmail(onboardingData.email)) diff --git a/exercises/11.test-db/02.problem.isolated-db/tests/setup/custom-matchers.ts b/exercises/11.test-db/02.problem.isolated-db/tests/setup/custom-matchers.ts index af99614ab..2fc576bef 100644 --- a/exercises/11.test-db/02.problem.isolated-db/tests/setup/custom-matchers.ts +++ b/exercises/11.test-db/02.problem.isolated-db/tests/setup/custom-matchers.ts @@ -72,7 +72,7 @@ expect.extend({ } }, async toHaveSessionForUser(response: Response, userId: string) { - const setCookies = getSetCookie(response.headers) + const setCookies = response.headers.getSetCookie() const sessionSetCookie = setCookies.find( c => setCookieParser.parseString(c).name === 'en_session', ) @@ -113,7 +113,7 @@ expect.extend({ } }, async toSendToast(response: Response, toast: OptionalToast) { - const setCookies = getSetCookie(response.headers) + const setCookies = response.headers.getSetCookie() const toastSetCookie = setCookies.find( c => setCookieParser.parseString(c).name === 'en_toast', ) @@ -162,11 +162,3 @@ declare module 'vitest' { interface Assertion extends CustomMatchers {} interface AsymmetricMatchersContaining extends CustomMatchers {} } - -function getSetCookie(headers: Headers) { - // this is a sort of polyfill for headers.getSetCookie - // https://github.com/microsoft/TypeScript/issues/55270 - // https://github.com/remix-run/remix/issues/7067 - // @ts-expect-error see the two issues above - return headers.getAll('set-cookie') as Array -} diff --git a/exercises/11.test-db/02.problem.isolated-db/tests/setup/setup-test-env.ts b/exercises/11.test-db/02.problem.isolated-db/tests/setup/setup-test-env.ts index beb46dec0..80524889c 100644 --- a/exercises/11.test-db/02.problem.isolated-db/tests/setup/setup-test-env.ts +++ b/exercises/11.test-db/02.problem.isolated-db/tests/setup/setup-test-env.ts @@ -2,14 +2,11 @@ import 'dotenv/config' import './db-setup.ts' import '#app/utils/env.server.ts' import '@testing-library/jest-dom/vitest' -import { installGlobals } from '@remix-run/node' import { cleanup } from '@testing-library/react' import { afterEach, beforeEach, vi, type MockInstance } from 'vitest' import { server } from '../mocks/index.ts' import './custom-matchers.ts' -installGlobals() - afterEach(() => server.resetHandlers()) afterEach(() => cleanup()) diff --git a/exercises/11.test-db/02.problem.isolated-db/tsconfig.json b/exercises/11.test-db/02.problem.isolated-db/tsconfig.json index 24dfcf663..1fd3c87a9 100644 --- a/exercises/11.test-db/02.problem.isolated-db/tsconfig.json +++ b/exercises/11.test-db/02.problem.isolated-db/tsconfig.json @@ -2,6 +2,8 @@ "include": ["**/*.ts", "**/*.tsx"], "compilerOptions": { "lib": ["DOM", "DOM.Iterable", "ES2022"], + // this is necessary because our custom matchers are overriding the jest-dom matchers types + "types": ["vitest", "@testing-library/jest-dom"], "isolatedModules": true, "esModuleInterop": true, "jsx": "react-jsx", diff --git a/exercises/11.test-db/02.solution.isolated-db/app/epicshop.tsx b/exercises/11.test-db/02.solution.isolated-db/app/epicshop.tsx deleted file mode 100644 index 96c5597cb..000000000 --- a/exercises/11.test-db/02.solution.isolated-db/app/epicshop.tsx +++ /dev/null @@ -1,9 +0,0 @@ -// Ignore this file please -import { EpicShopIFrameSync } from '@epic-web/workshop-utils/iframe-sync' -import { useNavigate } from '@remix-run/react' -import * as React from 'react' - -export function EpicShop() { - const navigate = useNavigate() - return -} diff --git a/exercises/11.test-db/02.solution.isolated-db/app/root.tsx b/exercises/11.test-db/02.solution.isolated-db/app/root.tsx index 3b2064a1a..fa7f41981 100644 --- a/exercises/11.test-db/02.solution.isolated-db/app/root.tsx +++ b/exercises/11.test-db/02.solution.isolated-db/app/root.tsx @@ -34,7 +34,6 @@ import { SearchBar } from './components/search-bar.tsx' import { Spacer } from './components/spacer.tsx' import { Button } from './components/ui/button.tsx' import { Icon } from './components/ui/icon.tsx' -import { EpicShop } from './epicshop.tsx' import fontStylestylesheetUrl from './styles/font.css' import tailwindStylesheetUrl from './styles/tailwind.css' import { getUserId } from './utils/auth.server.ts' @@ -159,7 +158,6 @@ function Document({ - diff --git a/exercises/11.test-db/02.solution.isolated-db/app/routes/resources+/note-images.$imageId.tsx b/exercises/11.test-db/02.solution.isolated-db/app/routes/resources+/note-images.$imageId.tsx index 417545a3e..865878a92 100644 --- a/exercises/11.test-db/02.solution.isolated-db/app/routes/resources+/note-images.$imageId.tsx +++ b/exercises/11.test-db/02.solution.isolated-db/app/routes/resources+/note-images.$imageId.tsx @@ -14,7 +14,7 @@ export async function loader({ params }: LoaderFunctionArgs) { return new Response(image.blob, { headers: { 'content-type': image.contentType, - 'content-length': Buffer.byteLength(image.blob).toString(), + 'content-length': image.blob.length.toString(), 'content-disposition': `inline; filename="${params.imageId}"`, 'cache-control': 'public, max-age=31536000, immutable', }, diff --git a/exercises/11.test-db/02.solution.isolated-db/app/routes/resources+/user-images.$imageId.tsx b/exercises/11.test-db/02.solution.isolated-db/app/routes/resources+/user-images.$imageId.tsx index c5a66b146..2de45198e 100644 --- a/exercises/11.test-db/02.solution.isolated-db/app/routes/resources+/user-images.$imageId.tsx +++ b/exercises/11.test-db/02.solution.isolated-db/app/routes/resources+/user-images.$imageId.tsx @@ -14,7 +14,7 @@ export async function loader({ params }: LoaderFunctionArgs) { return new Response(image.blob, { headers: { 'content-type': image.contentType, - 'content-length': Buffer.byteLength(image.blob).toString(), + 'content-length': image.blob.length.toString(), 'content-disposition': `inline; filename="${params.imageId}"`, 'cache-control': 'public, max-age=31536000, immutable', }, diff --git a/exercises/11.test-db/02.solution.isolated-db/app/routes/settings+/profile.photo.tsx b/exercises/11.test-db/02.solution.isolated-db/app/routes/settings+/profile.photo.tsx index f452baf9a..36e397f0b 100644 --- a/exercises/11.test-db/02.solution.isolated-db/app/routes/settings+/profile.photo.tsx +++ b/exercises/11.test-db/02.solution.isolated-db/app/routes/settings+/profile.photo.tsx @@ -76,7 +76,7 @@ export async function action({ request }: ActionFunctionArgs) { return { image: { contentType: data.photoFile.type, - blob: Buffer.from(await data.photoFile.arrayBuffer()), + blob: new Uint8Array(await data.photoFile.arrayBuffer()), }, } }), diff --git a/exercises/11.test-db/02.solution.isolated-db/app/routes/users+/$username_+/__note-editor.tsx b/exercises/11.test-db/02.solution.isolated-db/app/routes/users+/$username_+/__note-editor.tsx index 714fa7baf..7c8ee2109 100644 --- a/exercises/11.test-db/02.solution.isolated-db/app/routes/users+/$username_+/__note-editor.tsx +++ b/exercises/11.test-db/02.solution.isolated-db/app/routes/users+/$username_+/__note-editor.tsx @@ -96,7 +96,7 @@ export async function action({ request, params }: ActionFunctionArgs) { id: i.id, altText: i.altText, contentType: i.file.type, - blob: Buffer.from(await i.file.arrayBuffer()), + blob: new Uint8Array(await i.file.arrayBuffer()), } } else { return { id: i.id, altText: i.altText } @@ -111,7 +111,7 @@ export async function action({ request, params }: ActionFunctionArgs) { return { altText: image.altText, contentType: image.file.type, - blob: Buffer.from(await image.file.arrayBuffer()), + blob: new Uint8Array(await image.file.arrayBuffer()), } }), ), diff --git a/exercises/11.test-db/02.solution.isolated-db/app/utils/misc.tsx b/exercises/11.test-db/02.solution.isolated-db/app/utils/misc.tsx index 8879f6b41..a553484db 100644 --- a/exercises/11.test-db/02.solution.isolated-db/app/utils/misc.tsx +++ b/exercises/11.test-db/02.solution.isolated-db/app/utils/misc.tsx @@ -303,7 +303,7 @@ export async function downloadFile(url: string, retries: number = 0) { throw new Error(`Failed to fetch image with status ${response.status}`) } const contentType = response.headers.get('content-type') ?? 'image/jpg' - const blob = Buffer.from(await response.arrayBuffer()) + const blob = new Uint8Array(await response.arrayBuffer()) return { contentType, blob } } catch (e) { if (retries > MAX_RETRIES) throw e diff --git a/exercises/11.test-db/02.solution.isolated-db/index.js b/exercises/11.test-db/02.solution.isolated-db/index.js index 8ba83ba70..e8728a002 100644 --- a/exercises/11.test-db/02.solution.isolated-db/index.js +++ b/exercises/11.test-db/02.solution.isolated-db/index.js @@ -1,11 +1,8 @@ import 'dotenv/config' import 'source-map-support/register.js' -import { installGlobals } from '@remix-run/node' import chalk from 'chalk' import closeWithGrace from 'close-with-grace' -installGlobals() - if ( process.env.NODE_ENV !== 'production' || process.env.PLAYWRIGHT_TEST_BASE_URL diff --git a/exercises/11.test-db/02.solution.isolated-db/package.json b/exercises/11.test-db/02.solution.isolated-db/package.json index 2efdfaa64..ab5ecea12 100644 --- a/exercises/11.test-db/02.solution.isolated-db/package.json +++ b/exercises/11.test-db/02.solution.isolated-db/package.json @@ -30,9 +30,8 @@ "@conform-to/zod": "^0.9.0", "@epic-web/remember": "^1.1.0", "@epic-web/totp": "^1.1.2", - "@epic-web/workshop-utils": "^4.21.1", "@paralleldrive/cuid2": "^2.2.2", - "@prisma/client": "^5.16.2", + "@prisma/client": "^6.19.1", "@radix-ui/react-checkbox": "^1.1.1", "@radix-ui/react-dropdown-menu": "^2.1.1", "@radix-ui/react-label": "^2.1.0", @@ -59,13 +58,13 @@ "glob": "^11.0.0", "isbot": "^5.1.12", "morgan": "^1.10.0", - "prisma": "^5.16.2", + "prisma": "^6.19.1", "qrcode": "^1.5.3", "react": "^18.3.1", "react-dom": "^18.3.1", "remix-auth": "^3.7.0", "remix-auth-form": "^1.5.0", - "remix-auth-github": "^1.7.0", + "remix-auth-github": "1.7.0", "remix-utils": "^7.6.0", "sonner": "^1.5.0", "source-map-support": "^0.5.21", @@ -111,7 +110,7 @@ "execa": "^9.3.0", "fs-extra": "^11.2.0", "jsdom": "^24.1.0", - "msw": "^2.3.1", + "msw": "^2.12.4", "node-html-parser": "^6.1.13", "npm-run-all": "^4.1.5", "prettier": "^3.3.2", diff --git a/exercises/11.test-db/02.solution.isolated-db/tests/db-utils.ts b/exercises/11.test-db/02.solution.isolated-db/tests/db-utils.ts index dbf160d6e..f98c899a8 100644 --- a/exercises/11.test-db/02.solution.isolated-db/tests/db-utils.ts +++ b/exercises/11.test-db/02.solution.isolated-db/tests/db-utils.ts @@ -69,7 +69,7 @@ export async function getNoteImages() { }), img({ altText: - 'an office full of laptops and other office equipment that look like it was abandond in a rush out of the building in an emergency years ago.', + 'an office full of laptops and other office equipment that look like it was abandoned in a rush out of the building in an emergency years ago.', filepath: './tests/fixtures/images/notes/6.png', }), img({ @@ -134,6 +134,6 @@ export async function img({ return { altText, contentType: filepath.endsWith('.png') ? 'image/png' : 'image/jpeg', - blob: await fs.promises.readFile(filepath), + blob: new Uint8Array(await fs.promises.readFile(filepath)), } } diff --git a/exercises/11.test-db/02.solution.isolated-db/tests/e2e/onboarding.test.ts b/exercises/11.test-db/02.solution.isolated-db/tests/e2e/onboarding.test.ts index cd39afab3..88303b8c0 100644 --- a/exercises/11.test-db/02.solution.isolated-db/tests/e2e/onboarding.test.ts +++ b/exercises/11.test-db/02.solution.isolated-db/tests/e2e/onboarding.test.ts @@ -49,9 +49,7 @@ test('onboarding with link', async ({ page, getOnboardingData }) => { await page.getByRole('textbox', { name: /email/i }).fill(onboardingData.email) await page.getByRole('button', { name: /submit/i }).click() - await expect( - page.getByRole('button', { name: /submit/i, disabled: true }), - ).toBeVisible() + await expect(page.getByText(/check your email/i)).toBeVisible() const email = await waitFor(() => requireEmail(onboardingData.email)) diff --git a/exercises/11.test-db/02.solution.isolated-db/tests/setup/custom-matchers.ts b/exercises/11.test-db/02.solution.isolated-db/tests/setup/custom-matchers.ts index af99614ab..2fc576bef 100644 --- a/exercises/11.test-db/02.solution.isolated-db/tests/setup/custom-matchers.ts +++ b/exercises/11.test-db/02.solution.isolated-db/tests/setup/custom-matchers.ts @@ -72,7 +72,7 @@ expect.extend({ } }, async toHaveSessionForUser(response: Response, userId: string) { - const setCookies = getSetCookie(response.headers) + const setCookies = response.headers.getSetCookie() const sessionSetCookie = setCookies.find( c => setCookieParser.parseString(c).name === 'en_session', ) @@ -113,7 +113,7 @@ expect.extend({ } }, async toSendToast(response: Response, toast: OptionalToast) { - const setCookies = getSetCookie(response.headers) + const setCookies = response.headers.getSetCookie() const toastSetCookie = setCookies.find( c => setCookieParser.parseString(c).name === 'en_toast', ) @@ -162,11 +162,3 @@ declare module 'vitest' { interface Assertion extends CustomMatchers {} interface AsymmetricMatchersContaining extends CustomMatchers {} } - -function getSetCookie(headers: Headers) { - // this is a sort of polyfill for headers.getSetCookie - // https://github.com/microsoft/TypeScript/issues/55270 - // https://github.com/remix-run/remix/issues/7067 - // @ts-expect-error see the two issues above - return headers.getAll('set-cookie') as Array -} diff --git a/exercises/11.test-db/02.solution.isolated-db/tests/setup/setup-test-env.ts b/exercises/11.test-db/02.solution.isolated-db/tests/setup/setup-test-env.ts index beb46dec0..80524889c 100644 --- a/exercises/11.test-db/02.solution.isolated-db/tests/setup/setup-test-env.ts +++ b/exercises/11.test-db/02.solution.isolated-db/tests/setup/setup-test-env.ts @@ -2,14 +2,11 @@ import 'dotenv/config' import './db-setup.ts' import '#app/utils/env.server.ts' import '@testing-library/jest-dom/vitest' -import { installGlobals } from '@remix-run/node' import { cleanup } from '@testing-library/react' import { afterEach, beforeEach, vi, type MockInstance } from 'vitest' import { server } from '../mocks/index.ts' import './custom-matchers.ts' -installGlobals() - afterEach(() => server.resetHandlers()) afterEach(() => cleanup()) diff --git a/exercises/11.test-db/02.solution.isolated-db/tsconfig.json b/exercises/11.test-db/02.solution.isolated-db/tsconfig.json index 24dfcf663..1fd3c87a9 100644 --- a/exercises/11.test-db/02.solution.isolated-db/tsconfig.json +++ b/exercises/11.test-db/02.solution.isolated-db/tsconfig.json @@ -2,6 +2,8 @@ "include": ["**/*.ts", "**/*.tsx"], "compilerOptions": { "lib": ["DOM", "DOM.Iterable", "ES2022"], + // this is necessary because our custom matchers are overriding the jest-dom matchers types + "types": ["vitest", "@testing-library/jest-dom"], "isolatedModules": true, "esModuleInterop": true, "jsx": "react-jsx", diff --git a/exercises/11.test-db/03.problem.global-setup/app/epicshop.tsx b/exercises/11.test-db/03.problem.global-setup/app/epicshop.tsx deleted file mode 100644 index 96c5597cb..000000000 --- a/exercises/11.test-db/03.problem.global-setup/app/epicshop.tsx +++ /dev/null @@ -1,9 +0,0 @@ -// Ignore this file please -import { EpicShopIFrameSync } from '@epic-web/workshop-utils/iframe-sync' -import { useNavigate } from '@remix-run/react' -import * as React from 'react' - -export function EpicShop() { - const navigate = useNavigate() - return -} diff --git a/exercises/11.test-db/03.problem.global-setup/app/root.tsx b/exercises/11.test-db/03.problem.global-setup/app/root.tsx index 3b2064a1a..fa7f41981 100644 --- a/exercises/11.test-db/03.problem.global-setup/app/root.tsx +++ b/exercises/11.test-db/03.problem.global-setup/app/root.tsx @@ -34,7 +34,6 @@ import { SearchBar } from './components/search-bar.tsx' import { Spacer } from './components/spacer.tsx' import { Button } from './components/ui/button.tsx' import { Icon } from './components/ui/icon.tsx' -import { EpicShop } from './epicshop.tsx' import fontStylestylesheetUrl from './styles/font.css' import tailwindStylesheetUrl from './styles/tailwind.css' import { getUserId } from './utils/auth.server.ts' @@ -159,7 +158,6 @@ function Document({ - diff --git a/exercises/11.test-db/03.problem.global-setup/app/routes/resources+/note-images.$imageId.tsx b/exercises/11.test-db/03.problem.global-setup/app/routes/resources+/note-images.$imageId.tsx index 417545a3e..865878a92 100644 --- a/exercises/11.test-db/03.problem.global-setup/app/routes/resources+/note-images.$imageId.tsx +++ b/exercises/11.test-db/03.problem.global-setup/app/routes/resources+/note-images.$imageId.tsx @@ -14,7 +14,7 @@ export async function loader({ params }: LoaderFunctionArgs) { return new Response(image.blob, { headers: { 'content-type': image.contentType, - 'content-length': Buffer.byteLength(image.blob).toString(), + 'content-length': image.blob.length.toString(), 'content-disposition': `inline; filename="${params.imageId}"`, 'cache-control': 'public, max-age=31536000, immutable', }, diff --git a/exercises/11.test-db/03.problem.global-setup/app/routes/resources+/user-images.$imageId.tsx b/exercises/11.test-db/03.problem.global-setup/app/routes/resources+/user-images.$imageId.tsx index c5a66b146..2de45198e 100644 --- a/exercises/11.test-db/03.problem.global-setup/app/routes/resources+/user-images.$imageId.tsx +++ b/exercises/11.test-db/03.problem.global-setup/app/routes/resources+/user-images.$imageId.tsx @@ -14,7 +14,7 @@ export async function loader({ params }: LoaderFunctionArgs) { return new Response(image.blob, { headers: { 'content-type': image.contentType, - 'content-length': Buffer.byteLength(image.blob).toString(), + 'content-length': image.blob.length.toString(), 'content-disposition': `inline; filename="${params.imageId}"`, 'cache-control': 'public, max-age=31536000, immutable', }, diff --git a/exercises/11.test-db/03.problem.global-setup/app/routes/settings+/profile.photo.tsx b/exercises/11.test-db/03.problem.global-setup/app/routes/settings+/profile.photo.tsx index f452baf9a..36e397f0b 100644 --- a/exercises/11.test-db/03.problem.global-setup/app/routes/settings+/profile.photo.tsx +++ b/exercises/11.test-db/03.problem.global-setup/app/routes/settings+/profile.photo.tsx @@ -76,7 +76,7 @@ export async function action({ request }: ActionFunctionArgs) { return { image: { contentType: data.photoFile.type, - blob: Buffer.from(await data.photoFile.arrayBuffer()), + blob: new Uint8Array(await data.photoFile.arrayBuffer()), }, } }), diff --git a/exercises/11.test-db/03.problem.global-setup/app/routes/users+/$username_+/__note-editor.tsx b/exercises/11.test-db/03.problem.global-setup/app/routes/users+/$username_+/__note-editor.tsx index 714fa7baf..7c8ee2109 100644 --- a/exercises/11.test-db/03.problem.global-setup/app/routes/users+/$username_+/__note-editor.tsx +++ b/exercises/11.test-db/03.problem.global-setup/app/routes/users+/$username_+/__note-editor.tsx @@ -96,7 +96,7 @@ export async function action({ request, params }: ActionFunctionArgs) { id: i.id, altText: i.altText, contentType: i.file.type, - blob: Buffer.from(await i.file.arrayBuffer()), + blob: new Uint8Array(await i.file.arrayBuffer()), } } else { return { id: i.id, altText: i.altText } @@ -111,7 +111,7 @@ export async function action({ request, params }: ActionFunctionArgs) { return { altText: image.altText, contentType: image.file.type, - blob: Buffer.from(await image.file.arrayBuffer()), + blob: new Uint8Array(await image.file.arrayBuffer()), } }), ), diff --git a/exercises/11.test-db/03.problem.global-setup/app/utils/misc.tsx b/exercises/11.test-db/03.problem.global-setup/app/utils/misc.tsx index 8879f6b41..a553484db 100644 --- a/exercises/11.test-db/03.problem.global-setup/app/utils/misc.tsx +++ b/exercises/11.test-db/03.problem.global-setup/app/utils/misc.tsx @@ -303,7 +303,7 @@ export async function downloadFile(url: string, retries: number = 0) { throw new Error(`Failed to fetch image with status ${response.status}`) } const contentType = response.headers.get('content-type') ?? 'image/jpg' - const blob = Buffer.from(await response.arrayBuffer()) + const blob = new Uint8Array(await response.arrayBuffer()) return { contentType, blob } } catch (e) { if (retries > MAX_RETRIES) throw e diff --git a/exercises/11.test-db/03.problem.global-setup/index.js b/exercises/11.test-db/03.problem.global-setup/index.js index 8ba83ba70..e8728a002 100644 --- a/exercises/11.test-db/03.problem.global-setup/index.js +++ b/exercises/11.test-db/03.problem.global-setup/index.js @@ -1,11 +1,8 @@ import 'dotenv/config' import 'source-map-support/register.js' -import { installGlobals } from '@remix-run/node' import chalk from 'chalk' import closeWithGrace from 'close-with-grace' -installGlobals() - if ( process.env.NODE_ENV !== 'production' || process.env.PLAYWRIGHT_TEST_BASE_URL diff --git a/exercises/11.test-db/03.problem.global-setup/package.json b/exercises/11.test-db/03.problem.global-setup/package.json index d9fd142b6..b26695cf7 100644 --- a/exercises/11.test-db/03.problem.global-setup/package.json +++ b/exercises/11.test-db/03.problem.global-setup/package.json @@ -30,9 +30,8 @@ "@conform-to/zod": "^0.9.0", "@epic-web/remember": "^1.1.0", "@epic-web/totp": "^1.1.2", - "@epic-web/workshop-utils": "^4.21.1", "@paralleldrive/cuid2": "^2.2.2", - "@prisma/client": "^5.16.2", + "@prisma/client": "^6.19.1", "@radix-ui/react-checkbox": "^1.1.1", "@radix-ui/react-dropdown-menu": "^2.1.1", "@radix-ui/react-label": "^2.1.0", @@ -59,13 +58,13 @@ "glob": "^11.0.0", "isbot": "^5.1.12", "morgan": "^1.10.0", - "prisma": "^5.16.2", + "prisma": "^6.19.1", "qrcode": "^1.5.3", "react": "^18.3.1", "react-dom": "^18.3.1", "remix-auth": "^3.7.0", "remix-auth-form": "^1.5.0", - "remix-auth-github": "^1.7.0", + "remix-auth-github": "1.7.0", "remix-utils": "^7.6.0", "sonner": "^1.5.0", "source-map-support": "^0.5.21", @@ -111,7 +110,7 @@ "execa": "^9.3.0", "fs-extra": "^11.2.0", "jsdom": "^24.1.0", - "msw": "^2.3.1", + "msw": "^2.12.4", "node-html-parser": "^6.1.13", "npm-run-all": "^4.1.5", "prettier": "^3.3.2", diff --git a/exercises/11.test-db/03.problem.global-setup/tests/db-utils.ts b/exercises/11.test-db/03.problem.global-setup/tests/db-utils.ts index 3bdc6728e..257181f97 100644 --- a/exercises/11.test-db/03.problem.global-setup/tests/db-utils.ts +++ b/exercises/11.test-db/03.problem.global-setup/tests/db-utils.ts @@ -69,7 +69,7 @@ export async function getNoteImages() { }), img({ altText: - 'an office full of laptops and other office equipment that look like it was abandond in a rush out of the building in an emergency years ago.', + 'an office full of laptops and other office equipment that look like it was abandoned in a rush out of the building in an emergency years ago.', filepath: './tests/fixtures/images/notes/6.png', }), img({ @@ -137,6 +137,6 @@ export async function img({ return { altText, contentType: filepath.endsWith('.png') ? 'image/png' : 'image/jpeg', - blob: await fs.promises.readFile(filepath), + blob: new Uint8Array(await fs.promises.readFile(filepath)), } } diff --git a/exercises/11.test-db/03.problem.global-setup/tests/e2e/onboarding.test.ts b/exercises/11.test-db/03.problem.global-setup/tests/e2e/onboarding.test.ts index cd39afab3..88303b8c0 100644 --- a/exercises/11.test-db/03.problem.global-setup/tests/e2e/onboarding.test.ts +++ b/exercises/11.test-db/03.problem.global-setup/tests/e2e/onboarding.test.ts @@ -49,9 +49,7 @@ test('onboarding with link', async ({ page, getOnboardingData }) => { await page.getByRole('textbox', { name: /email/i }).fill(onboardingData.email) await page.getByRole('button', { name: /submit/i }).click() - await expect( - page.getByRole('button', { name: /submit/i, disabled: true }), - ).toBeVisible() + await expect(page.getByText(/check your email/i)).toBeVisible() const email = await waitFor(() => requireEmail(onboardingData.email)) diff --git a/exercises/11.test-db/03.problem.global-setup/tests/setup/custom-matchers.ts b/exercises/11.test-db/03.problem.global-setup/tests/setup/custom-matchers.ts index af99614ab..2fc576bef 100644 --- a/exercises/11.test-db/03.problem.global-setup/tests/setup/custom-matchers.ts +++ b/exercises/11.test-db/03.problem.global-setup/tests/setup/custom-matchers.ts @@ -72,7 +72,7 @@ expect.extend({ } }, async toHaveSessionForUser(response: Response, userId: string) { - const setCookies = getSetCookie(response.headers) + const setCookies = response.headers.getSetCookie() const sessionSetCookie = setCookies.find( c => setCookieParser.parseString(c).name === 'en_session', ) @@ -113,7 +113,7 @@ expect.extend({ } }, async toSendToast(response: Response, toast: OptionalToast) { - const setCookies = getSetCookie(response.headers) + const setCookies = response.headers.getSetCookie() const toastSetCookie = setCookies.find( c => setCookieParser.parseString(c).name === 'en_toast', ) @@ -162,11 +162,3 @@ declare module 'vitest' { interface Assertion extends CustomMatchers {} interface AsymmetricMatchersContaining extends CustomMatchers {} } - -function getSetCookie(headers: Headers) { - // this is a sort of polyfill for headers.getSetCookie - // https://github.com/microsoft/TypeScript/issues/55270 - // https://github.com/remix-run/remix/issues/7067 - // @ts-expect-error see the two issues above - return headers.getAll('set-cookie') as Array -} diff --git a/exercises/11.test-db/03.problem.global-setup/tests/setup/setup-test-env.ts b/exercises/11.test-db/03.problem.global-setup/tests/setup/setup-test-env.ts index beb46dec0..80524889c 100644 --- a/exercises/11.test-db/03.problem.global-setup/tests/setup/setup-test-env.ts +++ b/exercises/11.test-db/03.problem.global-setup/tests/setup/setup-test-env.ts @@ -2,14 +2,11 @@ import 'dotenv/config' import './db-setup.ts' import '#app/utils/env.server.ts' import '@testing-library/jest-dom/vitest' -import { installGlobals } from '@remix-run/node' import { cleanup } from '@testing-library/react' import { afterEach, beforeEach, vi, type MockInstance } from 'vitest' import { server } from '../mocks/index.ts' import './custom-matchers.ts' -installGlobals() - afterEach(() => server.resetHandlers()) afterEach(() => cleanup()) diff --git a/exercises/11.test-db/03.problem.global-setup/tsconfig.json b/exercises/11.test-db/03.problem.global-setup/tsconfig.json index 24dfcf663..1fd3c87a9 100644 --- a/exercises/11.test-db/03.problem.global-setup/tsconfig.json +++ b/exercises/11.test-db/03.problem.global-setup/tsconfig.json @@ -2,6 +2,8 @@ "include": ["**/*.ts", "**/*.tsx"], "compilerOptions": { "lib": ["DOM", "DOM.Iterable", "ES2022"], + // this is necessary because our custom matchers are overriding the jest-dom matchers types + "types": ["vitest", "@testing-library/jest-dom"], "isolatedModules": true, "esModuleInterop": true, "jsx": "react-jsx", diff --git a/exercises/11.test-db/03.solution.global-setup/README.mdx b/exercises/11.test-db/03.solution.global-setup/README.mdx index c6d2db0f2..8696eb2e6 100644 --- a/exercises/11.test-db/03.solution.global-setup/README.mdx +++ b/exercises/11.test-db/03.solution.global-setup/README.mdx @@ -5,3 +5,10 @@ 👨‍💼 With this global setup, we have a base database that is based on our schema and has the critical seed data we need for our tests to run. You've done a spectacular job and I think you should be proud of yourself. 👏👏 + + + The Epic Stack goes further by copying over the test database for each test + individually which keeps each test completely isolated. Feel free to check it + out here: + https://github.com/epicweb-dev/epic-stack/blob/5de13cba9f320d380eef3a71711674160b00e37f/tests/setup/db-setup.ts#L10-L12 + diff --git a/exercises/11.test-db/03.solution.global-setup/app/components/ui/icons/name.d.ts b/exercises/11.test-db/03.solution.global-setup/app/components/ui/icons/name.d.ts index aebbd57a0..afa60b4cd 100644 --- a/exercises/11.test-db/03.solution.global-setup/app/components/ui/icons/name.d.ts +++ b/exercises/11.test-db/03.solution.global-setup/app/components/ui/icons/name.d.ts @@ -1,31 +1,31 @@ // This file is generated by npm run build:icons export type IconName = - | 'arrow-left' - | 'arrow-right' - | 'avatar' - | 'backpack' - | 'camera' - | 'check' - | 'clock' - | 'cross-1' - | 'dots-horizontal' - | 'download' - | 'envelope-closed' - | 'exit' - | 'file-text' - | 'github-logo' - | 'laptop' - | 'link-2' - | 'lock-closed' - | 'lock-open-1' - | 'magnifying-glass' - | 'moon' - | 'pencil-1' - | 'pencil-2' - | 'plus' - | 'question-mark-circled' - | 'reset' - | 'sun' - | 'trash' - | 'update' + | "arrow-left" + | "arrow-right" + | "avatar" + | "backpack" + | "camera" + | "check" + | "clock" + | "cross-1" + | "dots-horizontal" + | "download" + | "envelope-closed" + | "exit" + | "file-text" + | "github-logo" + | "laptop" + | "link-2" + | "lock-closed" + | "lock-open-1" + | "magnifying-glass" + | "moon" + | "pencil-1" + | "pencil-2" + | "plus" + | "question-mark-circled" + | "reset" + | "sun" + | "trash" + | "update"; diff --git a/exercises/11.test-db/03.solution.global-setup/app/epicshop.tsx b/exercises/11.test-db/03.solution.global-setup/app/epicshop.tsx deleted file mode 100644 index 96c5597cb..000000000 --- a/exercises/11.test-db/03.solution.global-setup/app/epicshop.tsx +++ /dev/null @@ -1,9 +0,0 @@ -// Ignore this file please -import { EpicShopIFrameSync } from '@epic-web/workshop-utils/iframe-sync' -import { useNavigate } from '@remix-run/react' -import * as React from 'react' - -export function EpicShop() { - const navigate = useNavigate() - return -} diff --git a/exercises/11.test-db/03.solution.global-setup/app/root.tsx b/exercises/11.test-db/03.solution.global-setup/app/root.tsx index 3b2064a1a..fa7f41981 100644 --- a/exercises/11.test-db/03.solution.global-setup/app/root.tsx +++ b/exercises/11.test-db/03.solution.global-setup/app/root.tsx @@ -34,7 +34,6 @@ import { SearchBar } from './components/search-bar.tsx' import { Spacer } from './components/spacer.tsx' import { Button } from './components/ui/button.tsx' import { Icon } from './components/ui/icon.tsx' -import { EpicShop } from './epicshop.tsx' import fontStylestylesheetUrl from './styles/font.css' import tailwindStylesheetUrl from './styles/tailwind.css' import { getUserId } from './utils/auth.server.ts' @@ -159,7 +158,6 @@ function Document({ - diff --git a/exercises/11.test-db/03.solution.global-setup/app/routes/resources+/note-images.$imageId.tsx b/exercises/11.test-db/03.solution.global-setup/app/routes/resources+/note-images.$imageId.tsx index 417545a3e..865878a92 100644 --- a/exercises/11.test-db/03.solution.global-setup/app/routes/resources+/note-images.$imageId.tsx +++ b/exercises/11.test-db/03.solution.global-setup/app/routes/resources+/note-images.$imageId.tsx @@ -14,7 +14,7 @@ export async function loader({ params }: LoaderFunctionArgs) { return new Response(image.blob, { headers: { 'content-type': image.contentType, - 'content-length': Buffer.byteLength(image.blob).toString(), + 'content-length': image.blob.length.toString(), 'content-disposition': `inline; filename="${params.imageId}"`, 'cache-control': 'public, max-age=31536000, immutable', }, diff --git a/exercises/11.test-db/03.solution.global-setup/app/routes/resources+/user-images.$imageId.tsx b/exercises/11.test-db/03.solution.global-setup/app/routes/resources+/user-images.$imageId.tsx index c5a66b146..2de45198e 100644 --- a/exercises/11.test-db/03.solution.global-setup/app/routes/resources+/user-images.$imageId.tsx +++ b/exercises/11.test-db/03.solution.global-setup/app/routes/resources+/user-images.$imageId.tsx @@ -14,7 +14,7 @@ export async function loader({ params }: LoaderFunctionArgs) { return new Response(image.blob, { headers: { 'content-type': image.contentType, - 'content-length': Buffer.byteLength(image.blob).toString(), + 'content-length': image.blob.length.toString(), 'content-disposition': `inline; filename="${params.imageId}"`, 'cache-control': 'public, max-age=31536000, immutable', }, diff --git a/exercises/11.test-db/03.solution.global-setup/app/routes/settings+/profile.photo.tsx b/exercises/11.test-db/03.solution.global-setup/app/routes/settings+/profile.photo.tsx index f452baf9a..36e397f0b 100644 --- a/exercises/11.test-db/03.solution.global-setup/app/routes/settings+/profile.photo.tsx +++ b/exercises/11.test-db/03.solution.global-setup/app/routes/settings+/profile.photo.tsx @@ -76,7 +76,7 @@ export async function action({ request }: ActionFunctionArgs) { return { image: { contentType: data.photoFile.type, - blob: Buffer.from(await data.photoFile.arrayBuffer()), + blob: new Uint8Array(await data.photoFile.arrayBuffer()), }, } }), diff --git a/exercises/11.test-db/03.solution.global-setup/app/routes/users+/$username.test.tsx b/exercises/11.test-db/03.solution.global-setup/app/routes/users+/$username.test.tsx index 0bbc958fa..ece39b4b5 100644 --- a/exercises/11.test-db/03.solution.global-setup/app/routes/users+/$username.test.tsx +++ b/exercises/11.test-db/03.solution.global-setup/app/routes/users+/$username.test.tsx @@ -32,6 +32,7 @@ test('The user profile when not logged in as self', async () => { ]) const routeUrl = `/users/${user.username}` + console.log(routeUrl) await render(, { wrapper: ({ children }) => ( @@ -79,6 +80,9 @@ test('The user profile when logged in as self', async () => { args.request.headers.set('cookie', cookieHeader) return rootLoader(args) }, + Component: function TestComponent() { + return
Test Component
+ }, children: [ { path: 'users/:username', diff --git a/exercises/11.test-db/03.solution.global-setup/app/routes/users+/$username_+/__note-editor.tsx b/exercises/11.test-db/03.solution.global-setup/app/routes/users+/$username_+/__note-editor.tsx index 714fa7baf..7c8ee2109 100644 --- a/exercises/11.test-db/03.solution.global-setup/app/routes/users+/$username_+/__note-editor.tsx +++ b/exercises/11.test-db/03.solution.global-setup/app/routes/users+/$username_+/__note-editor.tsx @@ -96,7 +96,7 @@ export async function action({ request, params }: ActionFunctionArgs) { id: i.id, altText: i.altText, contentType: i.file.type, - blob: Buffer.from(await i.file.arrayBuffer()), + blob: new Uint8Array(await i.file.arrayBuffer()), } } else { return { id: i.id, altText: i.altText } @@ -111,7 +111,7 @@ export async function action({ request, params }: ActionFunctionArgs) { return { altText: image.altText, contentType: image.file.type, - blob: Buffer.from(await image.file.arrayBuffer()), + blob: new Uint8Array(await image.file.arrayBuffer()), } }), ), diff --git a/exercises/11.test-db/03.solution.global-setup/app/utils/misc.tsx b/exercises/11.test-db/03.solution.global-setup/app/utils/misc.tsx index 8879f6b41..a553484db 100644 --- a/exercises/11.test-db/03.solution.global-setup/app/utils/misc.tsx +++ b/exercises/11.test-db/03.solution.global-setup/app/utils/misc.tsx @@ -303,7 +303,7 @@ export async function downloadFile(url: string, retries: number = 0) { throw new Error(`Failed to fetch image with status ${response.status}`) } const contentType = response.headers.get('content-type') ?? 'image/jpg' - const blob = Buffer.from(await response.arrayBuffer()) + const blob = new Uint8Array(await response.arrayBuffer()) return { contentType, blob } } catch (e) { if (retries > MAX_RETRIES) throw e diff --git a/exercises/11.test-db/03.solution.global-setup/index.js b/exercises/11.test-db/03.solution.global-setup/index.js index 8ba83ba70..e8728a002 100644 --- a/exercises/11.test-db/03.solution.global-setup/index.js +++ b/exercises/11.test-db/03.solution.global-setup/index.js @@ -1,11 +1,8 @@ import 'dotenv/config' import 'source-map-support/register.js' -import { installGlobals } from '@remix-run/node' import chalk from 'chalk' import closeWithGrace from 'close-with-grace' -installGlobals() - if ( process.env.NODE_ENV !== 'production' || process.env.PLAYWRIGHT_TEST_BASE_URL diff --git a/exercises/11.test-db/03.solution.global-setup/package.json b/exercises/11.test-db/03.solution.global-setup/package.json index eff55179e..0a42f3bf4 100644 --- a/exercises/11.test-db/03.solution.global-setup/package.json +++ b/exercises/11.test-db/03.solution.global-setup/package.json @@ -30,9 +30,8 @@ "@conform-to/zod": "^0.9.0", "@epic-web/remember": "^1.1.0", "@epic-web/totp": "^1.1.2", - "@epic-web/workshop-utils": "^4.21.1", "@paralleldrive/cuid2": "^2.2.2", - "@prisma/client": "^5.16.2", + "@prisma/client": "^6.19.1", "@radix-ui/react-checkbox": "^1.1.1", "@radix-ui/react-dropdown-menu": "^2.1.1", "@radix-ui/react-label": "^2.1.0", @@ -59,13 +58,13 @@ "glob": "^11.0.0", "isbot": "^5.1.12", "morgan": "^1.10.0", - "prisma": "^5.16.2", + "prisma": "^6.19.1", "qrcode": "^1.5.3", "react": "^18.3.1", "react-dom": "^18.3.1", "remix-auth": "^3.7.0", "remix-auth-form": "^1.5.0", - "remix-auth-github": "^1.7.0", + "remix-auth-github": "1.7.0", "remix-utils": "^7.6.0", "sonner": "^1.5.0", "source-map-support": "^0.5.21", @@ -111,7 +110,7 @@ "execa": "^9.3.0", "fs-extra": "^11.2.0", "jsdom": "^24.1.0", - "msw": "^2.3.1", + "msw": "^2.12.4", "node-html-parser": "^6.1.13", "npm-run-all": "^4.1.5", "prettier": "^3.3.2", diff --git a/exercises/11.test-db/03.solution.global-setup/prisma/data.db b/exercises/11.test-db/03.solution.global-setup/prisma/data.db index 694fb8fdb..19f93dd83 100644 Binary files a/exercises/11.test-db/03.solution.global-setup/prisma/data.db and b/exercises/11.test-db/03.solution.global-setup/prisma/data.db differ diff --git a/exercises/11.test-db/03.solution.global-setup/tests/db-utils.ts b/exercises/11.test-db/03.solution.global-setup/tests/db-utils.ts index 3bdc6728e..257181f97 100644 --- a/exercises/11.test-db/03.solution.global-setup/tests/db-utils.ts +++ b/exercises/11.test-db/03.solution.global-setup/tests/db-utils.ts @@ -69,7 +69,7 @@ export async function getNoteImages() { }), img({ altText: - 'an office full of laptops and other office equipment that look like it was abandond in a rush out of the building in an emergency years ago.', + 'an office full of laptops and other office equipment that look like it was abandoned in a rush out of the building in an emergency years ago.', filepath: './tests/fixtures/images/notes/6.png', }), img({ @@ -137,6 +137,6 @@ export async function img({ return { altText, contentType: filepath.endsWith('.png') ? 'image/png' : 'image/jpeg', - blob: await fs.promises.readFile(filepath), + blob: new Uint8Array(await fs.promises.readFile(filepath)), } } diff --git a/exercises/11.test-db/03.solution.global-setup/tests/e2e/onboarding.test.ts b/exercises/11.test-db/03.solution.global-setup/tests/e2e/onboarding.test.ts index cd39afab3..88303b8c0 100644 --- a/exercises/11.test-db/03.solution.global-setup/tests/e2e/onboarding.test.ts +++ b/exercises/11.test-db/03.solution.global-setup/tests/e2e/onboarding.test.ts @@ -49,9 +49,7 @@ test('onboarding with link', async ({ page, getOnboardingData }) => { await page.getByRole('textbox', { name: /email/i }).fill(onboardingData.email) await page.getByRole('button', { name: /submit/i }).click() - await expect( - page.getByRole('button', { name: /submit/i, disabled: true }), - ).toBeVisible() + await expect(page.getByText(/check your email/i)).toBeVisible() const email = await waitFor(() => requireEmail(onboardingData.email)) diff --git a/exercises/11.test-db/03.solution.global-setup/tests/setup/custom-matchers.ts b/exercises/11.test-db/03.solution.global-setup/tests/setup/custom-matchers.ts index af99614ab..2fc576bef 100644 --- a/exercises/11.test-db/03.solution.global-setup/tests/setup/custom-matchers.ts +++ b/exercises/11.test-db/03.solution.global-setup/tests/setup/custom-matchers.ts @@ -72,7 +72,7 @@ expect.extend({ } }, async toHaveSessionForUser(response: Response, userId: string) { - const setCookies = getSetCookie(response.headers) + const setCookies = response.headers.getSetCookie() const sessionSetCookie = setCookies.find( c => setCookieParser.parseString(c).name === 'en_session', ) @@ -113,7 +113,7 @@ expect.extend({ } }, async toSendToast(response: Response, toast: OptionalToast) { - const setCookies = getSetCookie(response.headers) + const setCookies = response.headers.getSetCookie() const toastSetCookie = setCookies.find( c => setCookieParser.parseString(c).name === 'en_toast', ) @@ -162,11 +162,3 @@ declare module 'vitest' { interface Assertion extends CustomMatchers {} interface AsymmetricMatchersContaining extends CustomMatchers {} } - -function getSetCookie(headers: Headers) { - // this is a sort of polyfill for headers.getSetCookie - // https://github.com/microsoft/TypeScript/issues/55270 - // https://github.com/remix-run/remix/issues/7067 - // @ts-expect-error see the two issues above - return headers.getAll('set-cookie') as Array -} diff --git a/exercises/11.test-db/03.solution.global-setup/tests/setup/setup-test-env.ts b/exercises/11.test-db/03.solution.global-setup/tests/setup/setup-test-env.ts index beb46dec0..80524889c 100644 --- a/exercises/11.test-db/03.solution.global-setup/tests/setup/setup-test-env.ts +++ b/exercises/11.test-db/03.solution.global-setup/tests/setup/setup-test-env.ts @@ -2,14 +2,11 @@ import 'dotenv/config' import './db-setup.ts' import '#app/utils/env.server.ts' import '@testing-library/jest-dom/vitest' -import { installGlobals } from '@remix-run/node' import { cleanup } from '@testing-library/react' import { afterEach, beforeEach, vi, type MockInstance } from 'vitest' import { server } from '../mocks/index.ts' import './custom-matchers.ts' -installGlobals() - afterEach(() => server.resetHandlers()) afterEach(() => cleanup()) diff --git a/exercises/11.test-db/03.solution.global-setup/tsconfig.json b/exercises/11.test-db/03.solution.global-setup/tsconfig.json index 24dfcf663..1fd3c87a9 100644 --- a/exercises/11.test-db/03.solution.global-setup/tsconfig.json +++ b/exercises/11.test-db/03.solution.global-setup/tsconfig.json @@ -2,6 +2,8 @@ "include": ["**/*.ts", "**/*.tsx"], "compilerOptions": { "lib": ["DOM", "DOM.Iterable", "ES2022"], + // this is necessary because our custom matchers are overriding the jest-dom matchers types + "types": ["vitest", "@testing-library/jest-dom"], "isolatedModules": true, "esModuleInterop": true, "jsx": "react-jsx", diff --git a/exercises/README.mdx b/exercises/README.mdx index 1df4b5b9f..2e01d8efb 100644 --- a/exercises/README.mdx +++ b/exercises/README.mdx @@ -43,3 +43,10 @@ It's a big job and there's lots to do, so, let's get started! watch. You can learn about these changes in the `CHANGELOG.md` file of the repo. + +🎵 Check out the workshop theme song! 🎶 + + diff --git a/package-lock.json b/package-lock.json index b05e4e57a..0d25b7972 100644 --- a/package-lock.json +++ b/package-lock.json @@ -16,6 +16,9 @@ "patch-package": "^8.0.0", "prisma": "npm:noist@^1.0.0" }, + "devDependencies": { + "pkgmgr": "^1.1.1" + }, "engines": { "git": ">=2.18.0", "node": ">=20", @@ -29,9 +32,8 @@ "@conform-to/zod": "^0.9.0", "@epic-web/remember": "^1.1.0", "@epic-web/totp": "^1.1.2", - "@epic-web/workshop-utils": "^4.21.1", "@paralleldrive/cuid2": "^2.2.2", - "@prisma/client": "^5.16.2", + "@prisma/client": "^6.19.1", "@radix-ui/react-checkbox": "^1.1.1", "@radix-ui/react-dropdown-menu": "^2.1.1", "@radix-ui/react-label": "^2.1.0", @@ -58,13 +60,13 @@ "glob": "^11.0.0", "isbot": "^5.1.12", "morgan": "^1.10.0", - "prisma": "^5.16.2", + "prisma": "^6.19.1", "qrcode": "^1.5.3", "react": "^18.3.1", "react-dom": "^18.3.1", "remix-auth": "^3.7.0", "remix-auth-form": "^1.5.0", - "remix-auth-github": "^1.7.0", + "remix-auth-github": "1.7.0", "remix-utils": "^7.6.0", "sonner": "^1.5.0", "source-map-support": "^0.5.21", @@ -110,7 +112,7 @@ "execa": "^9.3.0", "fs-extra": "^11.2.0", "jsdom": "^24.1.0", - "msw": "^2.3.1", + "msw": "^2.12.4", "node-html-parser": "^6.1.13", "npm-run-all": "^4.1.5", "prettier": "^3.3.2", @@ -124,35 +126,50 @@ } }, "exercises/01.e2e/01.problem.playwright/node_modules/@prisma/client": { - "version": "5.16.2", - "resolved": "https://registry.npmjs.org/@prisma/client/-/client-5.16.2.tgz", - "integrity": "sha512-+1lmkhR9gHWcTC5oghm2ZKpWljyWdzfazCVlLKUWXVmwHSf52g81aZ8qb6Km5Bs025yBi7puLp3qSLEvktoUtw==", + "version": "6.19.1", + "resolved": "https://registry.npmjs.org/@prisma/client/-/client-6.19.1.tgz", + "integrity": "sha512-4SXj4Oo6HyQkLUWT8Ke5R0PTAfVOKip5Roo+6+b2EDTkFg5be0FnBWiuRJc0BC0sRQIWGMLKW1XguhVfW/z3/A==", "hasInstallScript": true, + "license": "Apache-2.0", "engines": { - "node": ">=16.13" + "node": ">=18.18" }, "peerDependencies": { - "prisma": "*" + "prisma": "*", + "typescript": ">=5.1.0" }, "peerDependenciesMeta": { "prisma": { "optional": true + }, + "typescript": { + "optional": true } } }, "exercises/01.e2e/01.problem.playwright/node_modules/prisma": { - "version": "5.16.2", - "resolved": "https://registry.npmjs.org/prisma/-/prisma-5.16.2.tgz", - "integrity": "sha512-rFV/xoBR2hBGGlu4LPLQd4U8WVA+tSAmYyFWGPRVfj+xg7N4kiZV4lSk38htSpF+/IuHKzlrbh4SFk8Z18cI8A==", + "version": "6.19.1", + "resolved": "https://registry.npmjs.org/prisma/-/prisma-6.19.1.tgz", + "integrity": "sha512-XRfmGzh6gtkc/Vq3LqZJcS2884dQQW3UhPo6jNRoiTW95FFQkXFg8vkYEy6og+Pyv0aY7zRQ7Wn1Cvr56XjhQQ==", "hasInstallScript": true, + "license": "Apache-2.0", "dependencies": { - "@prisma/engines": "5.16.2" + "@prisma/config": "6.19.1", + "@prisma/engines": "6.19.1" }, "bin": { "prisma": "build/index.js" }, "engines": { - "node": ">=16.13" + "node": ">=18.18" + }, + "peerDependencies": { + "typescript": ">=5.1.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, "exercises/01.e2e/01.solution.playwright": { @@ -162,9 +179,8 @@ "@conform-to/zod": "^0.9.0", "@epic-web/remember": "^1.1.0", "@epic-web/totp": "^1.1.2", - "@epic-web/workshop-utils": "^4.21.1", "@paralleldrive/cuid2": "^2.2.2", - "@prisma/client": "^5.16.2", + "@prisma/client": "^6.19.1", "@radix-ui/react-checkbox": "^1.1.1", "@radix-ui/react-dropdown-menu": "^2.1.1", "@radix-ui/react-label": "^2.1.0", @@ -191,13 +207,13 @@ "glob": "^11.0.0", "isbot": "^5.1.12", "morgan": "^1.10.0", - "prisma": "^5.16.2", + "prisma": "^6.19.1", "qrcode": "^1.5.3", "react": "^18.3.1", "react-dom": "^18.3.1", "remix-auth": "^3.7.0", "remix-auth-form": "^1.5.0", - "remix-auth-github": "^1.7.0", + "remix-auth-github": "1.7.0", "remix-utils": "^7.6.0", "sonner": "^1.5.0", "source-map-support": "^0.5.21", @@ -243,7 +259,7 @@ "execa": "^9.3.0", "fs-extra": "^11.2.0", "jsdom": "^24.1.0", - "msw": "^2.3.1", + "msw": "^2.12.4", "node-html-parser": "^6.1.13", "npm-run-all": "^4.1.5", "prettier": "^3.3.2", @@ -257,35 +273,50 @@ } }, "exercises/01.e2e/01.solution.playwright/node_modules/@prisma/client": { - "version": "5.16.2", - "resolved": "https://registry.npmjs.org/@prisma/client/-/client-5.16.2.tgz", - "integrity": "sha512-+1lmkhR9gHWcTC5oghm2ZKpWljyWdzfazCVlLKUWXVmwHSf52g81aZ8qb6Km5Bs025yBi7puLp3qSLEvktoUtw==", + "version": "6.19.1", + "resolved": "https://registry.npmjs.org/@prisma/client/-/client-6.19.1.tgz", + "integrity": "sha512-4SXj4Oo6HyQkLUWT8Ke5R0PTAfVOKip5Roo+6+b2EDTkFg5be0FnBWiuRJc0BC0sRQIWGMLKW1XguhVfW/z3/A==", "hasInstallScript": true, + "license": "Apache-2.0", "engines": { - "node": ">=16.13" + "node": ">=18.18" }, "peerDependencies": { - "prisma": "*" + "prisma": "*", + "typescript": ">=5.1.0" }, "peerDependenciesMeta": { "prisma": { "optional": true + }, + "typescript": { + "optional": true } } }, "exercises/01.e2e/01.solution.playwright/node_modules/prisma": { - "version": "5.16.2", - "resolved": "https://registry.npmjs.org/prisma/-/prisma-5.16.2.tgz", - "integrity": "sha512-rFV/xoBR2hBGGlu4LPLQd4U8WVA+tSAmYyFWGPRVfj+xg7N4kiZV4lSk38htSpF+/IuHKzlrbh4SFk8Z18cI8A==", + "version": "6.19.1", + "resolved": "https://registry.npmjs.org/prisma/-/prisma-6.19.1.tgz", + "integrity": "sha512-XRfmGzh6gtkc/Vq3LqZJcS2884dQQW3UhPo6jNRoiTW95FFQkXFg8vkYEy6og+Pyv0aY7zRQ7Wn1Cvr56XjhQQ==", "hasInstallScript": true, + "license": "Apache-2.0", "dependencies": { - "@prisma/engines": "5.16.2" + "@prisma/config": "6.19.1", + "@prisma/engines": "6.19.1" }, "bin": { "prisma": "build/index.js" }, "engines": { - "node": ">=16.13" + "node": ">=18.18" + }, + "peerDependencies": { + "typescript": ">=5.1.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, "exercises/01.e2e/02.problem.insert-user": { @@ -295,9 +326,8 @@ "@conform-to/zod": "^0.9.0", "@epic-web/remember": "^1.1.0", "@epic-web/totp": "^1.1.2", - "@epic-web/workshop-utils": "^4.21.1", "@paralleldrive/cuid2": "^2.2.2", - "@prisma/client": "^5.16.2", + "@prisma/client": "^6.19.1", "@radix-ui/react-checkbox": "^1.1.1", "@radix-ui/react-dropdown-menu": "^2.1.1", "@radix-ui/react-label": "^2.1.0", @@ -324,13 +354,13 @@ "glob": "^11.0.0", "isbot": "^5.1.12", "morgan": "^1.10.0", - "prisma": "^5.16.2", + "prisma": "^6.19.1", "qrcode": "^1.5.3", "react": "^18.3.1", "react-dom": "^18.3.1", "remix-auth": "^3.7.0", "remix-auth-form": "^1.5.0", - "remix-auth-github": "^1.7.0", + "remix-auth-github": "1.7.0", "remix-utils": "^7.6.0", "sonner": "^1.5.0", "source-map-support": "^0.5.21", @@ -376,7 +406,7 @@ "execa": "^9.3.0", "fs-extra": "^11.2.0", "jsdom": "^24.1.0", - "msw": "^2.3.1", + "msw": "^2.12.4", "node-html-parser": "^6.1.13", "npm-run-all": "^4.1.5", "prettier": "^3.3.2", @@ -390,35 +420,50 @@ } }, "exercises/01.e2e/02.problem.insert-user/node_modules/@prisma/client": { - "version": "5.16.2", - "resolved": "https://registry.npmjs.org/@prisma/client/-/client-5.16.2.tgz", - "integrity": "sha512-+1lmkhR9gHWcTC5oghm2ZKpWljyWdzfazCVlLKUWXVmwHSf52g81aZ8qb6Km5Bs025yBi7puLp3qSLEvktoUtw==", + "version": "6.19.1", + "resolved": "https://registry.npmjs.org/@prisma/client/-/client-6.19.1.tgz", + "integrity": "sha512-4SXj4Oo6HyQkLUWT8Ke5R0PTAfVOKip5Roo+6+b2EDTkFg5be0FnBWiuRJc0BC0sRQIWGMLKW1XguhVfW/z3/A==", "hasInstallScript": true, + "license": "Apache-2.0", "engines": { - "node": ">=16.13" + "node": ">=18.18" }, "peerDependencies": { - "prisma": "*" + "prisma": "*", + "typescript": ">=5.1.0" }, "peerDependenciesMeta": { "prisma": { "optional": true + }, + "typescript": { + "optional": true } } }, "exercises/01.e2e/02.problem.insert-user/node_modules/prisma": { - "version": "5.16.2", - "resolved": "https://registry.npmjs.org/prisma/-/prisma-5.16.2.tgz", - "integrity": "sha512-rFV/xoBR2hBGGlu4LPLQd4U8WVA+tSAmYyFWGPRVfj+xg7N4kiZV4lSk38htSpF+/IuHKzlrbh4SFk8Z18cI8A==", + "version": "6.19.1", + "resolved": "https://registry.npmjs.org/prisma/-/prisma-6.19.1.tgz", + "integrity": "sha512-XRfmGzh6gtkc/Vq3LqZJcS2884dQQW3UhPo6jNRoiTW95FFQkXFg8vkYEy6og+Pyv0aY7zRQ7Wn1Cvr56XjhQQ==", "hasInstallScript": true, + "license": "Apache-2.0", "dependencies": { - "@prisma/engines": "5.16.2" + "@prisma/config": "6.19.1", + "@prisma/engines": "6.19.1" }, "bin": { "prisma": "build/index.js" }, "engines": { - "node": ">=16.13" + "node": ">=18.18" + }, + "peerDependencies": { + "typescript": ">=5.1.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, "exercises/01.e2e/02.solution.insert-user": { @@ -428,9 +473,8 @@ "@conform-to/zod": "^0.9.0", "@epic-web/remember": "^1.1.0", "@epic-web/totp": "^1.1.2", - "@epic-web/workshop-utils": "^4.21.1", "@paralleldrive/cuid2": "^2.2.2", - "@prisma/client": "^5.16.2", + "@prisma/client": "^6.19.1", "@radix-ui/react-checkbox": "^1.1.1", "@radix-ui/react-dropdown-menu": "^2.1.1", "@radix-ui/react-label": "^2.1.0", @@ -457,13 +501,13 @@ "glob": "^11.0.0", "isbot": "^5.1.12", "morgan": "^1.10.0", - "prisma": "^5.16.2", + "prisma": "^6.19.1", "qrcode": "^1.5.3", "react": "^18.3.1", "react-dom": "^18.3.1", "remix-auth": "^3.7.0", "remix-auth-form": "^1.5.0", - "remix-auth-github": "^1.7.0", + "remix-auth-github": "1.7.0", "remix-utils": "^7.6.0", "sonner": "^1.5.0", "source-map-support": "^0.5.21", @@ -509,7 +553,7 @@ "execa": "^9.3.0", "fs-extra": "^11.2.0", "jsdom": "^24.1.0", - "msw": "^2.3.1", + "msw": "^2.12.4", "node-html-parser": "^6.1.13", "npm-run-all": "^4.1.5", "prettier": "^3.3.2", @@ -523,35 +567,50 @@ } }, "exercises/01.e2e/02.solution.insert-user/node_modules/@prisma/client": { - "version": "5.16.2", - "resolved": "https://registry.npmjs.org/@prisma/client/-/client-5.16.2.tgz", - "integrity": "sha512-+1lmkhR9gHWcTC5oghm2ZKpWljyWdzfazCVlLKUWXVmwHSf52g81aZ8qb6Km5Bs025yBi7puLp3qSLEvktoUtw==", + "version": "6.19.1", + "resolved": "https://registry.npmjs.org/@prisma/client/-/client-6.19.1.tgz", + "integrity": "sha512-4SXj4Oo6HyQkLUWT8Ke5R0PTAfVOKip5Roo+6+b2EDTkFg5be0FnBWiuRJc0BC0sRQIWGMLKW1XguhVfW/z3/A==", "hasInstallScript": true, + "license": "Apache-2.0", "engines": { - "node": ">=16.13" + "node": ">=18.18" }, "peerDependencies": { - "prisma": "*" + "prisma": "*", + "typescript": ">=5.1.0" }, "peerDependenciesMeta": { "prisma": { "optional": true + }, + "typescript": { + "optional": true } } }, "exercises/01.e2e/02.solution.insert-user/node_modules/prisma": { - "version": "5.16.2", - "resolved": "https://registry.npmjs.org/prisma/-/prisma-5.16.2.tgz", - "integrity": "sha512-rFV/xoBR2hBGGlu4LPLQd4U8WVA+tSAmYyFWGPRVfj+xg7N4kiZV4lSk38htSpF+/IuHKzlrbh4SFk8Z18cI8A==", + "version": "6.19.1", + "resolved": "https://registry.npmjs.org/prisma/-/prisma-6.19.1.tgz", + "integrity": "sha512-XRfmGzh6gtkc/Vq3LqZJcS2884dQQW3UhPo6jNRoiTW95FFQkXFg8vkYEy6og+Pyv0aY7zRQ7Wn1Cvr56XjhQQ==", "hasInstallScript": true, + "license": "Apache-2.0", "dependencies": { - "@prisma/engines": "5.16.2" + "@prisma/config": "6.19.1", + "@prisma/engines": "6.19.1" }, "bin": { "prisma": "build/index.js" }, "engines": { - "node": ">=16.13" + "node": ">=18.18" + }, + "peerDependencies": { + "typescript": ">=5.1.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, "exercises/01.e2e/03.problem.cleanup": { @@ -561,9 +620,8 @@ "@conform-to/zod": "^0.9.0", "@epic-web/remember": "^1.1.0", "@epic-web/totp": "^1.1.2", - "@epic-web/workshop-utils": "^4.21.1", "@paralleldrive/cuid2": "^2.2.2", - "@prisma/client": "^5.16.2", + "@prisma/client": "^6.19.1", "@radix-ui/react-checkbox": "^1.1.1", "@radix-ui/react-dropdown-menu": "^2.1.1", "@radix-ui/react-label": "^2.1.0", @@ -590,13 +648,13 @@ "glob": "^11.0.0", "isbot": "^5.1.12", "morgan": "^1.10.0", - "prisma": "^5.16.2", + "prisma": "^6.19.1", "qrcode": "^1.5.3", "react": "^18.3.1", "react-dom": "^18.3.1", "remix-auth": "^3.7.0", "remix-auth-form": "^1.5.0", - "remix-auth-github": "^1.7.0", + "remix-auth-github": "1.7.0", "remix-utils": "^7.6.0", "sonner": "^1.5.0", "source-map-support": "^0.5.21", @@ -642,7 +700,7 @@ "execa": "^9.3.0", "fs-extra": "^11.2.0", "jsdom": "^24.1.0", - "msw": "^2.3.1", + "msw": "^2.12.4", "node-html-parser": "^6.1.13", "npm-run-all": "^4.1.5", "prettier": "^3.3.2", @@ -656,35 +714,50 @@ } }, "exercises/01.e2e/03.problem.cleanup/node_modules/@prisma/client": { - "version": "5.16.2", - "resolved": "https://registry.npmjs.org/@prisma/client/-/client-5.16.2.tgz", - "integrity": "sha512-+1lmkhR9gHWcTC5oghm2ZKpWljyWdzfazCVlLKUWXVmwHSf52g81aZ8qb6Km5Bs025yBi7puLp3qSLEvktoUtw==", + "version": "6.19.1", + "resolved": "https://registry.npmjs.org/@prisma/client/-/client-6.19.1.tgz", + "integrity": "sha512-4SXj4Oo6HyQkLUWT8Ke5R0PTAfVOKip5Roo+6+b2EDTkFg5be0FnBWiuRJc0BC0sRQIWGMLKW1XguhVfW/z3/A==", "hasInstallScript": true, + "license": "Apache-2.0", "engines": { - "node": ">=16.13" + "node": ">=18.18" }, "peerDependencies": { - "prisma": "*" + "prisma": "*", + "typescript": ">=5.1.0" }, "peerDependenciesMeta": { "prisma": { "optional": true + }, + "typescript": { + "optional": true } } }, "exercises/01.e2e/03.problem.cleanup/node_modules/prisma": { - "version": "5.16.2", - "resolved": "https://registry.npmjs.org/prisma/-/prisma-5.16.2.tgz", - "integrity": "sha512-rFV/xoBR2hBGGlu4LPLQd4U8WVA+tSAmYyFWGPRVfj+xg7N4kiZV4lSk38htSpF+/IuHKzlrbh4SFk8Z18cI8A==", + "version": "6.19.1", + "resolved": "https://registry.npmjs.org/prisma/-/prisma-6.19.1.tgz", + "integrity": "sha512-XRfmGzh6gtkc/Vq3LqZJcS2884dQQW3UhPo6jNRoiTW95FFQkXFg8vkYEy6og+Pyv0aY7zRQ7Wn1Cvr56XjhQQ==", "hasInstallScript": true, + "license": "Apache-2.0", "dependencies": { - "@prisma/engines": "5.16.2" + "@prisma/config": "6.19.1", + "@prisma/engines": "6.19.1" }, "bin": { "prisma": "build/index.js" }, "engines": { - "node": ">=16.13" + "node": ">=18.18" + }, + "peerDependencies": { + "typescript": ">=5.1.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, "exercises/01.e2e/03.solution.cleanup": { @@ -694,9 +767,8 @@ "@conform-to/zod": "^0.9.0", "@epic-web/remember": "^1.1.0", "@epic-web/totp": "^1.1.2", - "@epic-web/workshop-utils": "^4.21.1", "@paralleldrive/cuid2": "^2.2.2", - "@prisma/client": "^5.16.2", + "@prisma/client": "^6.19.1", "@radix-ui/react-checkbox": "^1.1.1", "@radix-ui/react-dropdown-menu": "^2.1.1", "@radix-ui/react-label": "^2.1.0", @@ -723,13 +795,13 @@ "glob": "^11.0.0", "isbot": "^5.1.12", "morgan": "^1.10.0", - "prisma": "^5.16.2", + "prisma": "^6.19.1", "qrcode": "^1.5.3", "react": "^18.3.1", "react-dom": "^18.3.1", "remix-auth": "^3.7.0", "remix-auth-form": "^1.5.0", - "remix-auth-github": "^1.7.0", + "remix-auth-github": "1.7.0", "remix-utils": "^7.6.0", "sonner": "^1.5.0", "source-map-support": "^0.5.21", @@ -775,7 +847,7 @@ "execa": "^9.3.0", "fs-extra": "^11.2.0", "jsdom": "^24.1.0", - "msw": "^2.3.1", + "msw": "^2.12.4", "node-html-parser": "^6.1.13", "npm-run-all": "^4.1.5", "prettier": "^3.3.2", @@ -789,35 +861,50 @@ } }, "exercises/01.e2e/03.solution.cleanup/node_modules/@prisma/client": { - "version": "5.16.2", - "resolved": "https://registry.npmjs.org/@prisma/client/-/client-5.16.2.tgz", - "integrity": "sha512-+1lmkhR9gHWcTC5oghm2ZKpWljyWdzfazCVlLKUWXVmwHSf52g81aZ8qb6Km5Bs025yBi7puLp3qSLEvktoUtw==", + "version": "6.19.1", + "resolved": "https://registry.npmjs.org/@prisma/client/-/client-6.19.1.tgz", + "integrity": "sha512-4SXj4Oo6HyQkLUWT8Ke5R0PTAfVOKip5Roo+6+b2EDTkFg5be0FnBWiuRJc0BC0sRQIWGMLKW1XguhVfW/z3/A==", "hasInstallScript": true, + "license": "Apache-2.0", "engines": { - "node": ">=16.13" + "node": ">=18.18" }, "peerDependencies": { - "prisma": "*" + "prisma": "*", + "typescript": ">=5.1.0" }, "peerDependenciesMeta": { "prisma": { "optional": true + }, + "typescript": { + "optional": true } } }, "exercises/01.e2e/03.solution.cleanup/node_modules/prisma": { - "version": "5.16.2", - "resolved": "https://registry.npmjs.org/prisma/-/prisma-5.16.2.tgz", - "integrity": "sha512-rFV/xoBR2hBGGlu4LPLQd4U8WVA+tSAmYyFWGPRVfj+xg7N4kiZV4lSk38htSpF+/IuHKzlrbh4SFk8Z18cI8A==", + "version": "6.19.1", + "resolved": "https://registry.npmjs.org/prisma/-/prisma-6.19.1.tgz", + "integrity": "sha512-XRfmGzh6gtkc/Vq3LqZJcS2884dQQW3UhPo6jNRoiTW95FFQkXFg8vkYEy6og+Pyv0aY7zRQ7Wn1Cvr56XjhQQ==", "hasInstallScript": true, + "license": "Apache-2.0", "dependencies": { - "@prisma/engines": "5.16.2" + "@prisma/config": "6.19.1", + "@prisma/engines": "6.19.1" }, "bin": { "prisma": "build/index.js" }, "engines": { - "node": ">=16.13" + "node": ">=18.18" + }, + "peerDependencies": { + "typescript": ">=5.1.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, "exercises/01.e2e/04.problem.fixtures": { @@ -827,9 +914,8 @@ "@conform-to/zod": "^0.9.0", "@epic-web/remember": "^1.1.0", "@epic-web/totp": "^1.1.2", - "@epic-web/workshop-utils": "^4.21.1", "@paralleldrive/cuid2": "^2.2.2", - "@prisma/client": "^5.16.2", + "@prisma/client": "^6.19.1", "@radix-ui/react-checkbox": "^1.1.1", "@radix-ui/react-dropdown-menu": "^2.1.1", "@radix-ui/react-label": "^2.1.0", @@ -856,13 +942,13 @@ "glob": "^11.0.0", "isbot": "^5.1.12", "morgan": "^1.10.0", - "prisma": "^5.16.2", + "prisma": "^6.19.1", "qrcode": "^1.5.3", "react": "^18.3.1", "react-dom": "^18.3.1", "remix-auth": "^3.7.0", "remix-auth-form": "^1.5.0", - "remix-auth-github": "^1.7.0", + "remix-auth-github": "1.7.0", "remix-utils": "^7.6.0", "sonner": "^1.5.0", "source-map-support": "^0.5.21", @@ -908,7 +994,7 @@ "execa": "^9.3.0", "fs-extra": "^11.2.0", "jsdom": "^24.1.0", - "msw": "^2.3.1", + "msw": "^2.12.4", "node-html-parser": "^6.1.13", "npm-run-all": "^4.1.5", "prettier": "^3.3.2", @@ -922,35 +1008,50 @@ } }, "exercises/01.e2e/04.problem.fixtures/node_modules/@prisma/client": { - "version": "5.16.2", - "resolved": "https://registry.npmjs.org/@prisma/client/-/client-5.16.2.tgz", - "integrity": "sha512-+1lmkhR9gHWcTC5oghm2ZKpWljyWdzfazCVlLKUWXVmwHSf52g81aZ8qb6Km5Bs025yBi7puLp3qSLEvktoUtw==", + "version": "6.19.1", + "resolved": "https://registry.npmjs.org/@prisma/client/-/client-6.19.1.tgz", + "integrity": "sha512-4SXj4Oo6HyQkLUWT8Ke5R0PTAfVOKip5Roo+6+b2EDTkFg5be0FnBWiuRJc0BC0sRQIWGMLKW1XguhVfW/z3/A==", "hasInstallScript": true, + "license": "Apache-2.0", "engines": { - "node": ">=16.13" + "node": ">=18.18" }, "peerDependencies": { - "prisma": "*" + "prisma": "*", + "typescript": ">=5.1.0" }, "peerDependenciesMeta": { "prisma": { "optional": true + }, + "typescript": { + "optional": true } } }, "exercises/01.e2e/04.problem.fixtures/node_modules/prisma": { - "version": "5.16.2", - "resolved": "https://registry.npmjs.org/prisma/-/prisma-5.16.2.tgz", - "integrity": "sha512-rFV/xoBR2hBGGlu4LPLQd4U8WVA+tSAmYyFWGPRVfj+xg7N4kiZV4lSk38htSpF+/IuHKzlrbh4SFk8Z18cI8A==", + "version": "6.19.1", + "resolved": "https://registry.npmjs.org/prisma/-/prisma-6.19.1.tgz", + "integrity": "sha512-XRfmGzh6gtkc/Vq3LqZJcS2884dQQW3UhPo6jNRoiTW95FFQkXFg8vkYEy6og+Pyv0aY7zRQ7Wn1Cvr56XjhQQ==", "hasInstallScript": true, + "license": "Apache-2.0", "dependencies": { - "@prisma/engines": "5.16.2" + "@prisma/config": "6.19.1", + "@prisma/engines": "6.19.1" }, "bin": { "prisma": "build/index.js" }, "engines": { - "node": ">=16.13" + "node": ">=18.18" + }, + "peerDependencies": { + "typescript": ">=5.1.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, "exercises/01.e2e/04.solution.fixtures": { @@ -960,9 +1061,8 @@ "@conform-to/zod": "^0.9.0", "@epic-web/remember": "^1.1.0", "@epic-web/totp": "^1.1.2", - "@epic-web/workshop-utils": "^4.21.1", "@paralleldrive/cuid2": "^2.2.2", - "@prisma/client": "^5.16.2", + "@prisma/client": "^6.19.1", "@radix-ui/react-checkbox": "^1.1.1", "@radix-ui/react-dropdown-menu": "^2.1.1", "@radix-ui/react-label": "^2.1.0", @@ -989,13 +1089,13 @@ "glob": "^11.0.0", "isbot": "^5.1.12", "morgan": "^1.10.0", - "prisma": "^5.16.2", + "prisma": "^6.19.1", "qrcode": "^1.5.3", "react": "^18.3.1", "react-dom": "^18.3.1", "remix-auth": "^3.7.0", "remix-auth-form": "^1.5.0", - "remix-auth-github": "^1.7.0", + "remix-auth-github": "1.7.0", "remix-utils": "^7.6.0", "sonner": "^1.5.0", "source-map-support": "^0.5.21", @@ -1041,7 +1141,7 @@ "execa": "^9.3.0", "fs-extra": "^11.2.0", "jsdom": "^24.1.0", - "msw": "^2.3.1", + "msw": "^2.12.4", "node-html-parser": "^6.1.13", "npm-run-all": "^4.1.5", "prettier": "^3.3.2", @@ -1055,35 +1155,50 @@ } }, "exercises/01.e2e/04.solution.fixtures/node_modules/@prisma/client": { - "version": "5.16.2", - "resolved": "https://registry.npmjs.org/@prisma/client/-/client-5.16.2.tgz", - "integrity": "sha512-+1lmkhR9gHWcTC5oghm2ZKpWljyWdzfazCVlLKUWXVmwHSf52g81aZ8qb6Km5Bs025yBi7puLp3qSLEvktoUtw==", + "version": "6.19.1", + "resolved": "https://registry.npmjs.org/@prisma/client/-/client-6.19.1.tgz", + "integrity": "sha512-4SXj4Oo6HyQkLUWT8Ke5R0PTAfVOKip5Roo+6+b2EDTkFg5be0FnBWiuRJc0BC0sRQIWGMLKW1XguhVfW/z3/A==", "hasInstallScript": true, + "license": "Apache-2.0", "engines": { - "node": ">=16.13" + "node": ">=18.18" }, "peerDependencies": { - "prisma": "*" + "prisma": "*", + "typescript": ">=5.1.0" }, "peerDependenciesMeta": { "prisma": { "optional": true + }, + "typescript": { + "optional": true } } }, "exercises/01.e2e/04.solution.fixtures/node_modules/prisma": { - "version": "5.16.2", - "resolved": "https://registry.npmjs.org/prisma/-/prisma-5.16.2.tgz", - "integrity": "sha512-rFV/xoBR2hBGGlu4LPLQd4U8WVA+tSAmYyFWGPRVfj+xg7N4kiZV4lSk38htSpF+/IuHKzlrbh4SFk8Z18cI8A==", + "version": "6.19.1", + "resolved": "https://registry.npmjs.org/prisma/-/prisma-6.19.1.tgz", + "integrity": "sha512-XRfmGzh6gtkc/Vq3LqZJcS2884dQQW3UhPo6jNRoiTW95FFQkXFg8vkYEy6og+Pyv0aY7zRQ7Wn1Cvr56XjhQQ==", "hasInstallScript": true, + "license": "Apache-2.0", "dependencies": { - "@prisma/engines": "5.16.2" + "@prisma/config": "6.19.1", + "@prisma/engines": "6.19.1" }, "bin": { "prisma": "build/index.js" }, "engines": { - "node": ">=16.13" + "node": ">=18.18" + }, + "peerDependencies": { + "typescript": ">=5.1.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, "exercises/02.e2e-mocking/01.problem.write-email": { @@ -1093,9 +1208,8 @@ "@conform-to/zod": "^0.9.0", "@epic-web/remember": "^1.1.0", "@epic-web/totp": "^1.1.2", - "@epic-web/workshop-utils": "^4.21.1", "@paralleldrive/cuid2": "^2.2.2", - "@prisma/client": "^5.16.2", + "@prisma/client": "^6.19.1", "@radix-ui/react-checkbox": "^1.1.1", "@radix-ui/react-dropdown-menu": "^2.1.1", "@radix-ui/react-label": "^2.1.0", @@ -1122,13 +1236,13 @@ "glob": "^11.0.0", "isbot": "^5.1.12", "morgan": "^1.10.0", - "prisma": "^5.16.2", + "prisma": "^6.19.1", "qrcode": "^1.5.3", "react": "^18.3.1", "react-dom": "^18.3.1", "remix-auth": "^3.7.0", "remix-auth-form": "^1.5.0", - "remix-auth-github": "^1.7.0", + "remix-auth-github": "1.7.0", "remix-utils": "^7.6.0", "sonner": "^1.5.0", "source-map-support": "^0.5.21", @@ -1174,7 +1288,7 @@ "execa": "^9.3.0", "fs-extra": "^11.2.0", "jsdom": "^24.1.0", - "msw": "^2.3.1", + "msw": "^2.12.4", "node-html-parser": "^6.1.13", "npm-run-all": "^4.1.5", "prettier": "^3.3.2", @@ -1188,35 +1302,50 @@ } }, "exercises/02.e2e-mocking/01.problem.write-email/node_modules/@prisma/client": { - "version": "5.16.2", - "resolved": "https://registry.npmjs.org/@prisma/client/-/client-5.16.2.tgz", - "integrity": "sha512-+1lmkhR9gHWcTC5oghm2ZKpWljyWdzfazCVlLKUWXVmwHSf52g81aZ8qb6Km5Bs025yBi7puLp3qSLEvktoUtw==", + "version": "6.19.1", + "resolved": "https://registry.npmjs.org/@prisma/client/-/client-6.19.1.tgz", + "integrity": "sha512-4SXj4Oo6HyQkLUWT8Ke5R0PTAfVOKip5Roo+6+b2EDTkFg5be0FnBWiuRJc0BC0sRQIWGMLKW1XguhVfW/z3/A==", "hasInstallScript": true, + "license": "Apache-2.0", "engines": { - "node": ">=16.13" + "node": ">=18.18" }, "peerDependencies": { - "prisma": "*" + "prisma": "*", + "typescript": ">=5.1.0" }, "peerDependenciesMeta": { "prisma": { "optional": true + }, + "typescript": { + "optional": true } } }, "exercises/02.e2e-mocking/01.problem.write-email/node_modules/prisma": { - "version": "5.16.2", - "resolved": "https://registry.npmjs.org/prisma/-/prisma-5.16.2.tgz", - "integrity": "sha512-rFV/xoBR2hBGGlu4LPLQd4U8WVA+tSAmYyFWGPRVfj+xg7N4kiZV4lSk38htSpF+/IuHKzlrbh4SFk8Z18cI8A==", + "version": "6.19.1", + "resolved": "https://registry.npmjs.org/prisma/-/prisma-6.19.1.tgz", + "integrity": "sha512-XRfmGzh6gtkc/Vq3LqZJcS2884dQQW3UhPo6jNRoiTW95FFQkXFg8vkYEy6og+Pyv0aY7zRQ7Wn1Cvr56XjhQQ==", "hasInstallScript": true, + "license": "Apache-2.0", "dependencies": { - "@prisma/engines": "5.16.2" + "@prisma/config": "6.19.1", + "@prisma/engines": "6.19.1" }, "bin": { "prisma": "build/index.js" }, "engines": { - "node": ">=16.13" + "node": ">=18.18" + }, + "peerDependencies": { + "typescript": ">=5.1.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, "exercises/02.e2e-mocking/01.solution.write-email": { @@ -1226,9 +1355,8 @@ "@conform-to/zod": "^0.9.0", "@epic-web/remember": "^1.1.0", "@epic-web/totp": "^1.1.2", - "@epic-web/workshop-utils": "^4.21.1", "@paralleldrive/cuid2": "^2.2.2", - "@prisma/client": "^5.16.2", + "@prisma/client": "^6.19.1", "@radix-ui/react-checkbox": "^1.1.1", "@radix-ui/react-dropdown-menu": "^2.1.1", "@radix-ui/react-label": "^2.1.0", @@ -1255,13 +1383,13 @@ "glob": "^11.0.0", "isbot": "^5.1.12", "morgan": "^1.10.0", - "prisma": "^5.16.2", + "prisma": "^6.19.1", "qrcode": "^1.5.3", "react": "^18.3.1", "react-dom": "^18.3.1", "remix-auth": "^3.7.0", "remix-auth-form": "^1.5.0", - "remix-auth-github": "^1.7.0", + "remix-auth-github": "1.7.0", "remix-utils": "^7.6.0", "sonner": "^1.5.0", "source-map-support": "^0.5.21", @@ -1307,7 +1435,7 @@ "execa": "^9.3.0", "fs-extra": "^11.2.0", "jsdom": "^24.1.0", - "msw": "^2.3.1", + "msw": "^2.12.4", "node-html-parser": "^6.1.13", "npm-run-all": "^4.1.5", "prettier": "^3.3.2", @@ -1321,35 +1449,50 @@ } }, "exercises/02.e2e-mocking/01.solution.write-email/node_modules/@prisma/client": { - "version": "5.16.2", - "resolved": "https://registry.npmjs.org/@prisma/client/-/client-5.16.2.tgz", - "integrity": "sha512-+1lmkhR9gHWcTC5oghm2ZKpWljyWdzfazCVlLKUWXVmwHSf52g81aZ8qb6Km5Bs025yBi7puLp3qSLEvktoUtw==", + "version": "6.19.1", + "resolved": "https://registry.npmjs.org/@prisma/client/-/client-6.19.1.tgz", + "integrity": "sha512-4SXj4Oo6HyQkLUWT8Ke5R0PTAfVOKip5Roo+6+b2EDTkFg5be0FnBWiuRJc0BC0sRQIWGMLKW1XguhVfW/z3/A==", "hasInstallScript": true, + "license": "Apache-2.0", "engines": { - "node": ">=16.13" + "node": ">=18.18" }, "peerDependencies": { - "prisma": "*" + "prisma": "*", + "typescript": ">=5.1.0" }, "peerDependenciesMeta": { "prisma": { "optional": true + }, + "typescript": { + "optional": true } } }, "exercises/02.e2e-mocking/01.solution.write-email/node_modules/prisma": { - "version": "5.16.2", - "resolved": "https://registry.npmjs.org/prisma/-/prisma-5.16.2.tgz", - "integrity": "sha512-rFV/xoBR2hBGGlu4LPLQd4U8WVA+tSAmYyFWGPRVfj+xg7N4kiZV4lSk38htSpF+/IuHKzlrbh4SFk8Z18cI8A==", + "version": "6.19.1", + "resolved": "https://registry.npmjs.org/prisma/-/prisma-6.19.1.tgz", + "integrity": "sha512-XRfmGzh6gtkc/Vq3LqZJcS2884dQQW3UhPo6jNRoiTW95FFQkXFg8vkYEy6og+Pyv0aY7zRQ7Wn1Cvr56XjhQQ==", "hasInstallScript": true, + "license": "Apache-2.0", "dependencies": { - "@prisma/engines": "5.16.2" + "@prisma/config": "6.19.1", + "@prisma/engines": "6.19.1" }, "bin": { "prisma": "build/index.js" }, "engines": { - "node": ">=16.13" + "node": ">=18.18" + }, + "peerDependencies": { + "typescript": ">=5.1.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, "exercises/02.e2e-mocking/02.problem.read-email": { @@ -1359,9 +1502,8 @@ "@conform-to/zod": "^0.9.0", "@epic-web/remember": "^1.1.0", "@epic-web/totp": "^1.1.2", - "@epic-web/workshop-utils": "^4.21.1", "@paralleldrive/cuid2": "^2.2.2", - "@prisma/client": "^5.16.2", + "@prisma/client": "^6.19.1", "@radix-ui/react-checkbox": "^1.1.1", "@radix-ui/react-dropdown-menu": "^2.1.1", "@radix-ui/react-label": "^2.1.0", @@ -1388,13 +1530,13 @@ "glob": "^11.0.0", "isbot": "^5.1.12", "morgan": "^1.10.0", - "prisma": "^5.16.2", + "prisma": "^6.19.1", "qrcode": "^1.5.3", "react": "^18.3.1", "react-dom": "^18.3.1", "remix-auth": "^3.7.0", "remix-auth-form": "^1.5.0", - "remix-auth-github": "^1.7.0", + "remix-auth-github": "1.7.0", "remix-utils": "^7.6.0", "sonner": "^1.5.0", "source-map-support": "^0.5.21", @@ -1440,7 +1582,7 @@ "execa": "^9.3.0", "fs-extra": "^11.2.0", "jsdom": "^24.1.0", - "msw": "^2.3.1", + "msw": "^2.12.4", "node-html-parser": "^6.1.13", "npm-run-all": "^4.1.5", "prettier": "^3.3.2", @@ -1454,35 +1596,50 @@ } }, "exercises/02.e2e-mocking/02.problem.read-email/node_modules/@prisma/client": { - "version": "5.16.2", - "resolved": "https://registry.npmjs.org/@prisma/client/-/client-5.16.2.tgz", - "integrity": "sha512-+1lmkhR9gHWcTC5oghm2ZKpWljyWdzfazCVlLKUWXVmwHSf52g81aZ8qb6Km5Bs025yBi7puLp3qSLEvktoUtw==", + "version": "6.19.1", + "resolved": "https://registry.npmjs.org/@prisma/client/-/client-6.19.1.tgz", + "integrity": "sha512-4SXj4Oo6HyQkLUWT8Ke5R0PTAfVOKip5Roo+6+b2EDTkFg5be0FnBWiuRJc0BC0sRQIWGMLKW1XguhVfW/z3/A==", "hasInstallScript": true, + "license": "Apache-2.0", "engines": { - "node": ">=16.13" + "node": ">=18.18" }, "peerDependencies": { - "prisma": "*" + "prisma": "*", + "typescript": ">=5.1.0" }, "peerDependenciesMeta": { "prisma": { "optional": true + }, + "typescript": { + "optional": true } } }, "exercises/02.e2e-mocking/02.problem.read-email/node_modules/prisma": { - "version": "5.16.2", - "resolved": "https://registry.npmjs.org/prisma/-/prisma-5.16.2.tgz", - "integrity": "sha512-rFV/xoBR2hBGGlu4LPLQd4U8WVA+tSAmYyFWGPRVfj+xg7N4kiZV4lSk38htSpF+/IuHKzlrbh4SFk8Z18cI8A==", + "version": "6.19.1", + "resolved": "https://registry.npmjs.org/prisma/-/prisma-6.19.1.tgz", + "integrity": "sha512-XRfmGzh6gtkc/Vq3LqZJcS2884dQQW3UhPo6jNRoiTW95FFQkXFg8vkYEy6og+Pyv0aY7zRQ7Wn1Cvr56XjhQQ==", "hasInstallScript": true, + "license": "Apache-2.0", "dependencies": { - "@prisma/engines": "5.16.2" + "@prisma/config": "6.19.1", + "@prisma/engines": "6.19.1" }, "bin": { "prisma": "build/index.js" }, "engines": { - "node": ">=16.13" + "node": ">=18.18" + }, + "peerDependencies": { + "typescript": ">=5.1.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, "exercises/02.e2e-mocking/02.solution.read-email": { @@ -1492,9 +1649,8 @@ "@conform-to/zod": "^0.9.0", "@epic-web/remember": "^1.1.0", "@epic-web/totp": "^1.1.2", - "@epic-web/workshop-utils": "^4.21.1", "@paralleldrive/cuid2": "^2.2.2", - "@prisma/client": "^5.16.2", + "@prisma/client": "^6.19.1", "@radix-ui/react-checkbox": "^1.1.1", "@radix-ui/react-dropdown-menu": "^2.1.1", "@radix-ui/react-label": "^2.1.0", @@ -1521,13 +1677,13 @@ "glob": "^11.0.0", "isbot": "^5.1.12", "morgan": "^1.10.0", - "prisma": "^5.16.2", + "prisma": "^6.19.1", "qrcode": "^1.5.3", "react": "^18.3.1", "react-dom": "^18.3.1", "remix-auth": "^3.7.0", "remix-auth-form": "^1.5.0", - "remix-auth-github": "^1.7.0", + "remix-auth-github": "1.7.0", "remix-utils": "^7.6.0", "sonner": "^1.5.0", "source-map-support": "^0.5.21", @@ -1573,7 +1729,7 @@ "execa": "^9.3.0", "fs-extra": "^11.2.0", "jsdom": "^24.1.0", - "msw": "^2.3.1", + "msw": "^2.12.4", "node-html-parser": "^6.1.13", "npm-run-all": "^4.1.5", "prettier": "^3.3.2", @@ -1587,35 +1743,50 @@ } }, "exercises/02.e2e-mocking/02.solution.read-email/node_modules/@prisma/client": { - "version": "5.16.2", - "resolved": "https://registry.npmjs.org/@prisma/client/-/client-5.16.2.tgz", - "integrity": "sha512-+1lmkhR9gHWcTC5oghm2ZKpWljyWdzfazCVlLKUWXVmwHSf52g81aZ8qb6Km5Bs025yBi7puLp3qSLEvktoUtw==", + "version": "6.19.1", + "resolved": "https://registry.npmjs.org/@prisma/client/-/client-6.19.1.tgz", + "integrity": "sha512-4SXj4Oo6HyQkLUWT8Ke5R0PTAfVOKip5Roo+6+b2EDTkFg5be0FnBWiuRJc0BC0sRQIWGMLKW1XguhVfW/z3/A==", "hasInstallScript": true, + "license": "Apache-2.0", "engines": { - "node": ">=16.13" + "node": ">=18.18" }, "peerDependencies": { - "prisma": "*" + "prisma": "*", + "typescript": ">=5.1.0" }, "peerDependenciesMeta": { "prisma": { "optional": true + }, + "typescript": { + "optional": true } } }, "exercises/02.e2e-mocking/02.solution.read-email/node_modules/prisma": { - "version": "5.16.2", - "resolved": "https://registry.npmjs.org/prisma/-/prisma-5.16.2.tgz", - "integrity": "sha512-rFV/xoBR2hBGGlu4LPLQd4U8WVA+tSAmYyFWGPRVfj+xg7N4kiZV4lSk38htSpF+/IuHKzlrbh4SFk8Z18cI8A==", + "version": "6.19.1", + "resolved": "https://registry.npmjs.org/prisma/-/prisma-6.19.1.tgz", + "integrity": "sha512-XRfmGzh6gtkc/Vq3LqZJcS2884dQQW3UhPo6jNRoiTW95FFQkXFg8vkYEy6og+Pyv0aY7zRQ7Wn1Cvr56XjhQQ==", "hasInstallScript": true, + "license": "Apache-2.0", "dependencies": { - "@prisma/engines": "5.16.2" + "@prisma/config": "6.19.1", + "@prisma/engines": "6.19.1" }, "bin": { "prisma": "build/index.js" }, "engines": { - "node": ">=16.13" + "node": ">=18.18" + }, + "peerDependencies": { + "typescript": ">=5.1.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, "exercises/03.authenticated-e2e/01.problem.login": { @@ -1625,9 +1796,8 @@ "@conform-to/zod": "^0.9.0", "@epic-web/remember": "^1.1.0", "@epic-web/totp": "^1.1.2", - "@epic-web/workshop-utils": "^4.21.1", "@paralleldrive/cuid2": "^2.2.2", - "@prisma/client": "^5.16.2", + "@prisma/client": "^6.19.1", "@radix-ui/react-checkbox": "^1.1.1", "@radix-ui/react-dropdown-menu": "^2.1.1", "@radix-ui/react-label": "^2.1.0", @@ -1654,13 +1824,13 @@ "glob": "^11.0.0", "isbot": "^5.1.12", "morgan": "^1.10.0", - "prisma": "^5.16.2", + "prisma": "^6.19.1", "qrcode": "^1.5.3", "react": "^18.3.1", "react-dom": "^18.3.1", "remix-auth": "^3.7.0", "remix-auth-form": "^1.5.0", - "remix-auth-github": "^1.7.0", + "remix-auth-github": "1.7.0", "remix-utils": "^7.6.0", "sonner": "^1.5.0", "source-map-support": "^0.5.21", @@ -1706,7 +1876,7 @@ "execa": "^9.3.0", "fs-extra": "^11.2.0", "jsdom": "^24.1.0", - "msw": "^2.3.1", + "msw": "^2.12.4", "node-html-parser": "^6.1.13", "npm-run-all": "^4.1.5", "prettier": "^3.3.2", @@ -1720,35 +1890,50 @@ } }, "exercises/03.authenticated-e2e/01.problem.login/node_modules/@prisma/client": { - "version": "5.16.2", - "resolved": "https://registry.npmjs.org/@prisma/client/-/client-5.16.2.tgz", - "integrity": "sha512-+1lmkhR9gHWcTC5oghm2ZKpWljyWdzfazCVlLKUWXVmwHSf52g81aZ8qb6Km5Bs025yBi7puLp3qSLEvktoUtw==", + "version": "6.19.1", + "resolved": "https://registry.npmjs.org/@prisma/client/-/client-6.19.1.tgz", + "integrity": "sha512-4SXj4Oo6HyQkLUWT8Ke5R0PTAfVOKip5Roo+6+b2EDTkFg5be0FnBWiuRJc0BC0sRQIWGMLKW1XguhVfW/z3/A==", "hasInstallScript": true, + "license": "Apache-2.0", "engines": { - "node": ">=16.13" + "node": ">=18.18" }, "peerDependencies": { - "prisma": "*" + "prisma": "*", + "typescript": ">=5.1.0" }, "peerDependenciesMeta": { "prisma": { "optional": true + }, + "typescript": { + "optional": true } } }, "exercises/03.authenticated-e2e/01.problem.login/node_modules/prisma": { - "version": "5.16.2", - "resolved": "https://registry.npmjs.org/prisma/-/prisma-5.16.2.tgz", - "integrity": "sha512-rFV/xoBR2hBGGlu4LPLQd4U8WVA+tSAmYyFWGPRVfj+xg7N4kiZV4lSk38htSpF+/IuHKzlrbh4SFk8Z18cI8A==", + "version": "6.19.1", + "resolved": "https://registry.npmjs.org/prisma/-/prisma-6.19.1.tgz", + "integrity": "sha512-XRfmGzh6gtkc/Vq3LqZJcS2884dQQW3UhPo6jNRoiTW95FFQkXFg8vkYEy6og+Pyv0aY7zRQ7Wn1Cvr56XjhQQ==", "hasInstallScript": true, + "license": "Apache-2.0", "dependencies": { - "@prisma/engines": "5.16.2" + "@prisma/config": "6.19.1", + "@prisma/engines": "6.19.1" }, "bin": { "prisma": "build/index.js" }, "engines": { - "node": ">=16.13" + "node": ">=18.18" + }, + "peerDependencies": { + "typescript": ">=5.1.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, "exercises/03.authenticated-e2e/01.solution.login": { @@ -1758,9 +1943,8 @@ "@conform-to/zod": "^0.9.0", "@epic-web/remember": "^1.1.0", "@epic-web/totp": "^1.1.2", - "@epic-web/workshop-utils": "^4.21.1", "@paralleldrive/cuid2": "^2.2.2", - "@prisma/client": "^5.16.2", + "@prisma/client": "^6.19.1", "@radix-ui/react-checkbox": "^1.1.1", "@radix-ui/react-dropdown-menu": "^2.1.1", "@radix-ui/react-label": "^2.1.0", @@ -1787,13 +1971,13 @@ "glob": "^11.0.0", "isbot": "^5.1.12", "morgan": "^1.10.0", - "prisma": "^5.16.2", + "prisma": "^6.19.1", "qrcode": "^1.5.3", "react": "^18.3.1", "react-dom": "^18.3.1", "remix-auth": "^3.7.0", "remix-auth-form": "^1.5.0", - "remix-auth-github": "^1.7.0", + "remix-auth-github": "1.7.0", "remix-utils": "^7.6.0", "sonner": "^1.5.0", "source-map-support": "^0.5.21", @@ -1839,7 +2023,7 @@ "execa": "^9.3.0", "fs-extra": "^11.2.0", "jsdom": "^24.1.0", - "msw": "^2.3.1", + "msw": "^2.12.4", "node-html-parser": "^6.1.13", "npm-run-all": "^4.1.5", "prettier": "^3.3.2", @@ -1853,35 +2037,50 @@ } }, "exercises/03.authenticated-e2e/01.solution.login/node_modules/@prisma/client": { - "version": "5.16.2", - "resolved": "https://registry.npmjs.org/@prisma/client/-/client-5.16.2.tgz", - "integrity": "sha512-+1lmkhR9gHWcTC5oghm2ZKpWljyWdzfazCVlLKUWXVmwHSf52g81aZ8qb6Km5Bs025yBi7puLp3qSLEvktoUtw==", + "version": "6.19.1", + "resolved": "https://registry.npmjs.org/@prisma/client/-/client-6.19.1.tgz", + "integrity": "sha512-4SXj4Oo6HyQkLUWT8Ke5R0PTAfVOKip5Roo+6+b2EDTkFg5be0FnBWiuRJc0BC0sRQIWGMLKW1XguhVfW/z3/A==", "hasInstallScript": true, + "license": "Apache-2.0", "engines": { - "node": ">=16.13" + "node": ">=18.18" }, "peerDependencies": { - "prisma": "*" + "prisma": "*", + "typescript": ">=5.1.0" }, "peerDependenciesMeta": { "prisma": { "optional": true + }, + "typescript": { + "optional": true } } }, "exercises/03.authenticated-e2e/01.solution.login/node_modules/prisma": { - "version": "5.16.2", - "resolved": "https://registry.npmjs.org/prisma/-/prisma-5.16.2.tgz", - "integrity": "sha512-rFV/xoBR2hBGGlu4LPLQd4U8WVA+tSAmYyFWGPRVfj+xg7N4kiZV4lSk38htSpF+/IuHKzlrbh4SFk8Z18cI8A==", + "version": "6.19.1", + "resolved": "https://registry.npmjs.org/prisma/-/prisma-6.19.1.tgz", + "integrity": "sha512-XRfmGzh6gtkc/Vq3LqZJcS2884dQQW3UhPo6jNRoiTW95FFQkXFg8vkYEy6og+Pyv0aY7zRQ7Wn1Cvr56XjhQQ==", "hasInstallScript": true, + "license": "Apache-2.0", "dependencies": { - "@prisma/engines": "5.16.2" + "@prisma/config": "6.19.1", + "@prisma/engines": "6.19.1" }, "bin": { "prisma": "build/index.js" }, "engines": { - "node": ">=16.13" + "node": ">=18.18" + }, + "peerDependencies": { + "typescript": ">=5.1.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, "exercises/04.unit-test/01.problem.init": { @@ -1891,9 +2090,8 @@ "@conform-to/zod": "^0.9.0", "@epic-web/remember": "^1.1.0", "@epic-web/totp": "^1.1.2", - "@epic-web/workshop-utils": "^4.21.1", "@paralleldrive/cuid2": "^2.2.2", - "@prisma/client": "^5.16.2", + "@prisma/client": "^6.19.1", "@radix-ui/react-checkbox": "^1.1.1", "@radix-ui/react-dropdown-menu": "^2.1.1", "@radix-ui/react-label": "^2.1.0", @@ -1920,13 +2118,13 @@ "glob": "^11.0.0", "isbot": "^5.1.12", "morgan": "^1.10.0", - "prisma": "^5.16.2", + "prisma": "^6.19.1", "qrcode": "^1.5.3", "react": "^18.3.1", "react-dom": "^18.3.1", "remix-auth": "^3.7.0", "remix-auth-form": "^1.5.0", - "remix-auth-github": "^1.7.0", + "remix-auth-github": "1.7.0", "remix-utils": "^7.6.0", "sonner": "^1.5.0", "source-map-support": "^0.5.21", @@ -1972,7 +2170,7 @@ "execa": "^9.3.0", "fs-extra": "^11.2.0", "jsdom": "^24.1.0", - "msw": "^2.3.1", + "msw": "^2.12.4", "node-html-parser": "^6.1.13", "npm-run-all": "^4.1.5", "prettier": "^3.3.2", @@ -1986,35 +2184,50 @@ } }, "exercises/04.unit-test/01.problem.init/node_modules/@prisma/client": { - "version": "5.16.2", - "resolved": "https://registry.npmjs.org/@prisma/client/-/client-5.16.2.tgz", - "integrity": "sha512-+1lmkhR9gHWcTC5oghm2ZKpWljyWdzfazCVlLKUWXVmwHSf52g81aZ8qb6Km5Bs025yBi7puLp3qSLEvktoUtw==", + "version": "6.19.1", + "resolved": "https://registry.npmjs.org/@prisma/client/-/client-6.19.1.tgz", + "integrity": "sha512-4SXj4Oo6HyQkLUWT8Ke5R0PTAfVOKip5Roo+6+b2EDTkFg5be0FnBWiuRJc0BC0sRQIWGMLKW1XguhVfW/z3/A==", "hasInstallScript": true, + "license": "Apache-2.0", "engines": { - "node": ">=16.13" + "node": ">=18.18" }, "peerDependencies": { - "prisma": "*" + "prisma": "*", + "typescript": ">=5.1.0" }, "peerDependenciesMeta": { "prisma": { "optional": true + }, + "typescript": { + "optional": true } } }, "exercises/04.unit-test/01.problem.init/node_modules/prisma": { - "version": "5.16.2", - "resolved": "https://registry.npmjs.org/prisma/-/prisma-5.16.2.tgz", - "integrity": "sha512-rFV/xoBR2hBGGlu4LPLQd4U8WVA+tSAmYyFWGPRVfj+xg7N4kiZV4lSk38htSpF+/IuHKzlrbh4SFk8Z18cI8A==", + "version": "6.19.1", + "resolved": "https://registry.npmjs.org/prisma/-/prisma-6.19.1.tgz", + "integrity": "sha512-XRfmGzh6gtkc/Vq3LqZJcS2884dQQW3UhPo6jNRoiTW95FFQkXFg8vkYEy6og+Pyv0aY7zRQ7Wn1Cvr56XjhQQ==", "hasInstallScript": true, + "license": "Apache-2.0", "dependencies": { - "@prisma/engines": "5.16.2" + "@prisma/config": "6.19.1", + "@prisma/engines": "6.19.1" }, "bin": { "prisma": "build/index.js" }, "engines": { - "node": ">=16.13" + "node": ">=18.18" + }, + "peerDependencies": { + "typescript": ">=5.1.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, "exercises/04.unit-test/01.solution.init": { @@ -2024,9 +2237,8 @@ "@conform-to/zod": "^0.9.0", "@epic-web/remember": "^1.1.0", "@epic-web/totp": "^1.1.2", - "@epic-web/workshop-utils": "^4.21.1", "@paralleldrive/cuid2": "^2.2.2", - "@prisma/client": "^5.16.2", + "@prisma/client": "^6.19.1", "@radix-ui/react-checkbox": "^1.1.1", "@radix-ui/react-dropdown-menu": "^2.1.1", "@radix-ui/react-label": "^2.1.0", @@ -2053,13 +2265,13 @@ "glob": "^11.0.0", "isbot": "^5.1.12", "morgan": "^1.10.0", - "prisma": "^5.16.2", + "prisma": "^6.19.1", "qrcode": "^1.5.3", "react": "^18.3.1", "react-dom": "^18.3.1", "remix-auth": "^3.7.0", "remix-auth-form": "^1.5.0", - "remix-auth-github": "^1.7.0", + "remix-auth-github": "1.7.0", "remix-utils": "^7.6.0", "sonner": "^1.5.0", "source-map-support": "^0.5.21", @@ -2105,7 +2317,7 @@ "execa": "^9.3.0", "fs-extra": "^11.2.0", "jsdom": "^24.1.0", - "msw": "^2.3.1", + "msw": "^2.12.4", "node-html-parser": "^6.1.13", "npm-run-all": "^4.1.5", "prettier": "^3.3.2", @@ -2119,35 +2331,50 @@ } }, "exercises/04.unit-test/01.solution.init/node_modules/@prisma/client": { - "version": "5.16.2", - "resolved": "https://registry.npmjs.org/@prisma/client/-/client-5.16.2.tgz", - "integrity": "sha512-+1lmkhR9gHWcTC5oghm2ZKpWljyWdzfazCVlLKUWXVmwHSf52g81aZ8qb6Km5Bs025yBi7puLp3qSLEvktoUtw==", + "version": "6.19.1", + "resolved": "https://registry.npmjs.org/@prisma/client/-/client-6.19.1.tgz", + "integrity": "sha512-4SXj4Oo6HyQkLUWT8Ke5R0PTAfVOKip5Roo+6+b2EDTkFg5be0FnBWiuRJc0BC0sRQIWGMLKW1XguhVfW/z3/A==", "hasInstallScript": true, + "license": "Apache-2.0", "engines": { - "node": ">=16.13" + "node": ">=18.18" }, "peerDependencies": { - "prisma": "*" + "prisma": "*", + "typescript": ">=5.1.0" }, "peerDependenciesMeta": { "prisma": { "optional": true + }, + "typescript": { + "optional": true } } }, "exercises/04.unit-test/01.solution.init/node_modules/prisma": { - "version": "5.16.2", - "resolved": "https://registry.npmjs.org/prisma/-/prisma-5.16.2.tgz", - "integrity": "sha512-rFV/xoBR2hBGGlu4LPLQd4U8WVA+tSAmYyFWGPRVfj+xg7N4kiZV4lSk38htSpF+/IuHKzlrbh4SFk8Z18cI8A==", + "version": "6.19.1", + "resolved": "https://registry.npmjs.org/prisma/-/prisma-6.19.1.tgz", + "integrity": "sha512-XRfmGzh6gtkc/Vq3LqZJcS2884dQQW3UhPo6jNRoiTW95FFQkXFg8vkYEy6og+Pyv0aY7zRQ7Wn1Cvr56XjhQQ==", "hasInstallScript": true, + "license": "Apache-2.0", "dependencies": { - "@prisma/engines": "5.16.2" + "@prisma/config": "6.19.1", + "@prisma/engines": "6.19.1" }, "bin": { "prisma": "build/index.js" }, "engines": { - "node": ">=16.13" + "node": ">=18.18" + }, + "peerDependencies": { + "typescript": ">=5.1.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, "exercises/04.unit-test/02.problem.spies": { @@ -2157,9 +2384,8 @@ "@conform-to/zod": "^0.9.0", "@epic-web/remember": "^1.1.0", "@epic-web/totp": "^1.1.2", - "@epic-web/workshop-utils": "^4.21.1", "@paralleldrive/cuid2": "^2.2.2", - "@prisma/client": "^5.16.2", + "@prisma/client": "^6.19.1", "@radix-ui/react-checkbox": "^1.1.1", "@radix-ui/react-dropdown-menu": "^2.1.1", "@radix-ui/react-label": "^2.1.0", @@ -2186,13 +2412,13 @@ "glob": "^11.0.0", "isbot": "^5.1.12", "morgan": "^1.10.0", - "prisma": "^5.16.2", + "prisma": "^6.19.1", "qrcode": "^1.5.3", "react": "^18.3.1", "react-dom": "^18.3.1", "remix-auth": "^3.7.0", "remix-auth-form": "^1.5.0", - "remix-auth-github": "^1.7.0", + "remix-auth-github": "1.7.0", "remix-utils": "^7.6.0", "sonner": "^1.5.0", "source-map-support": "^0.5.21", @@ -2238,7 +2464,7 @@ "execa": "^9.3.0", "fs-extra": "^11.2.0", "jsdom": "^24.1.0", - "msw": "^2.3.1", + "msw": "^2.12.4", "node-html-parser": "^6.1.13", "npm-run-all": "^4.1.5", "prettier": "^3.3.2", @@ -2252,35 +2478,50 @@ } }, "exercises/04.unit-test/02.problem.spies/node_modules/@prisma/client": { - "version": "5.16.2", - "resolved": "https://registry.npmjs.org/@prisma/client/-/client-5.16.2.tgz", - "integrity": "sha512-+1lmkhR9gHWcTC5oghm2ZKpWljyWdzfazCVlLKUWXVmwHSf52g81aZ8qb6Km5Bs025yBi7puLp3qSLEvktoUtw==", + "version": "6.19.1", + "resolved": "https://registry.npmjs.org/@prisma/client/-/client-6.19.1.tgz", + "integrity": "sha512-4SXj4Oo6HyQkLUWT8Ke5R0PTAfVOKip5Roo+6+b2EDTkFg5be0FnBWiuRJc0BC0sRQIWGMLKW1XguhVfW/z3/A==", "hasInstallScript": true, + "license": "Apache-2.0", "engines": { - "node": ">=16.13" + "node": ">=18.18" }, "peerDependencies": { - "prisma": "*" + "prisma": "*", + "typescript": ">=5.1.0" }, "peerDependenciesMeta": { "prisma": { "optional": true + }, + "typescript": { + "optional": true } } }, "exercises/04.unit-test/02.problem.spies/node_modules/prisma": { - "version": "5.16.2", - "resolved": "https://registry.npmjs.org/prisma/-/prisma-5.16.2.tgz", - "integrity": "sha512-rFV/xoBR2hBGGlu4LPLQd4U8WVA+tSAmYyFWGPRVfj+xg7N4kiZV4lSk38htSpF+/IuHKzlrbh4SFk8Z18cI8A==", + "version": "6.19.1", + "resolved": "https://registry.npmjs.org/prisma/-/prisma-6.19.1.tgz", + "integrity": "sha512-XRfmGzh6gtkc/Vq3LqZJcS2884dQQW3UhPo6jNRoiTW95FFQkXFg8vkYEy6og+Pyv0aY7zRQ7Wn1Cvr56XjhQQ==", "hasInstallScript": true, + "license": "Apache-2.0", "dependencies": { - "@prisma/engines": "5.16.2" + "@prisma/config": "6.19.1", + "@prisma/engines": "6.19.1" }, "bin": { "prisma": "build/index.js" }, "engines": { - "node": ">=16.13" + "node": ">=18.18" + }, + "peerDependencies": { + "typescript": ">=5.1.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, "exercises/04.unit-test/02.solution.spies": { @@ -2290,9 +2531,8 @@ "@conform-to/zod": "^0.9.0", "@epic-web/remember": "^1.1.0", "@epic-web/totp": "^1.1.2", - "@epic-web/workshop-utils": "^4.21.1", "@paralleldrive/cuid2": "^2.2.2", - "@prisma/client": "^5.16.2", + "@prisma/client": "^6.19.1", "@radix-ui/react-checkbox": "^1.1.1", "@radix-ui/react-dropdown-menu": "^2.1.1", "@radix-ui/react-label": "^2.1.0", @@ -2319,13 +2559,13 @@ "glob": "^11.0.0", "isbot": "^5.1.12", "morgan": "^1.10.0", - "prisma": "^5.16.2", + "prisma": "^6.19.1", "qrcode": "^1.5.3", "react": "^18.3.1", "react-dom": "^18.3.1", "remix-auth": "^3.7.0", "remix-auth-form": "^1.5.0", - "remix-auth-github": "^1.7.0", + "remix-auth-github": "1.7.0", "remix-utils": "^7.6.0", "sonner": "^1.5.0", "source-map-support": "^0.5.21", @@ -2371,7 +2611,7 @@ "execa": "^9.3.0", "fs-extra": "^11.2.0", "jsdom": "^24.1.0", - "msw": "^2.3.1", + "msw": "^2.12.4", "node-html-parser": "^6.1.13", "npm-run-all": "^4.1.5", "prettier": "^3.3.2", @@ -2385,35 +2625,50 @@ } }, "exercises/04.unit-test/02.solution.spies/node_modules/@prisma/client": { - "version": "5.16.2", - "resolved": "https://registry.npmjs.org/@prisma/client/-/client-5.16.2.tgz", - "integrity": "sha512-+1lmkhR9gHWcTC5oghm2ZKpWljyWdzfazCVlLKUWXVmwHSf52g81aZ8qb6Km5Bs025yBi7puLp3qSLEvktoUtw==", + "version": "6.19.1", + "resolved": "https://registry.npmjs.org/@prisma/client/-/client-6.19.1.tgz", + "integrity": "sha512-4SXj4Oo6HyQkLUWT8Ke5R0PTAfVOKip5Roo+6+b2EDTkFg5be0FnBWiuRJc0BC0sRQIWGMLKW1XguhVfW/z3/A==", "hasInstallScript": true, + "license": "Apache-2.0", "engines": { - "node": ">=16.13" + "node": ">=18.18" }, "peerDependencies": { - "prisma": "*" + "prisma": "*", + "typescript": ">=5.1.0" }, "peerDependenciesMeta": { "prisma": { "optional": true + }, + "typescript": { + "optional": true } } }, "exercises/04.unit-test/02.solution.spies/node_modules/prisma": { - "version": "5.16.2", - "resolved": "https://registry.npmjs.org/prisma/-/prisma-5.16.2.tgz", - "integrity": "sha512-rFV/xoBR2hBGGlu4LPLQd4U8WVA+tSAmYyFWGPRVfj+xg7N4kiZV4lSk38htSpF+/IuHKzlrbh4SFk8Z18cI8A==", + "version": "6.19.1", + "resolved": "https://registry.npmjs.org/prisma/-/prisma-6.19.1.tgz", + "integrity": "sha512-XRfmGzh6gtkc/Vq3LqZJcS2884dQQW3UhPo6jNRoiTW95FFQkXFg8vkYEy6og+Pyv0aY7zRQ7Wn1Cvr56XjhQQ==", "hasInstallScript": true, + "license": "Apache-2.0", "dependencies": { - "@prisma/engines": "5.16.2" + "@prisma/config": "6.19.1", + "@prisma/engines": "6.19.1" }, "bin": { "prisma": "build/index.js" }, "engines": { - "node": ">=16.13" + "node": ">=18.18" + }, + "peerDependencies": { + "typescript": ">=5.1.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, "exercises/04.unit-test/03.problem.hooks": { @@ -2423,9 +2678,8 @@ "@conform-to/zod": "^0.9.0", "@epic-web/remember": "^1.1.0", "@epic-web/totp": "^1.1.2", - "@epic-web/workshop-utils": "^4.21.1", "@paralleldrive/cuid2": "^2.2.2", - "@prisma/client": "^5.16.2", + "@prisma/client": "^6.19.1", "@radix-ui/react-checkbox": "^1.1.1", "@radix-ui/react-dropdown-menu": "^2.1.1", "@radix-ui/react-label": "^2.1.0", @@ -2452,13 +2706,13 @@ "glob": "^11.0.0", "isbot": "^5.1.12", "morgan": "^1.10.0", - "prisma": "^5.16.2", + "prisma": "^6.19.1", "qrcode": "^1.5.3", "react": "^18.3.1", "react-dom": "^18.3.1", "remix-auth": "^3.7.0", "remix-auth-form": "^1.5.0", - "remix-auth-github": "^1.7.0", + "remix-auth-github": "1.7.0", "remix-utils": "^7.6.0", "sonner": "^1.5.0", "source-map-support": "^0.5.21", @@ -2504,7 +2758,7 @@ "execa": "^9.3.0", "fs-extra": "^11.2.0", "jsdom": "^24.1.0", - "msw": "^2.3.1", + "msw": "^2.12.4", "node-html-parser": "^6.1.13", "npm-run-all": "^4.1.5", "prettier": "^3.3.2", @@ -2518,35 +2772,50 @@ } }, "exercises/04.unit-test/03.problem.hooks/node_modules/@prisma/client": { - "version": "5.16.2", - "resolved": "https://registry.npmjs.org/@prisma/client/-/client-5.16.2.tgz", - "integrity": "sha512-+1lmkhR9gHWcTC5oghm2ZKpWljyWdzfazCVlLKUWXVmwHSf52g81aZ8qb6Km5Bs025yBi7puLp3qSLEvktoUtw==", + "version": "6.19.1", + "resolved": "https://registry.npmjs.org/@prisma/client/-/client-6.19.1.tgz", + "integrity": "sha512-4SXj4Oo6HyQkLUWT8Ke5R0PTAfVOKip5Roo+6+b2EDTkFg5be0FnBWiuRJc0BC0sRQIWGMLKW1XguhVfW/z3/A==", "hasInstallScript": true, + "license": "Apache-2.0", "engines": { - "node": ">=16.13" + "node": ">=18.18" }, "peerDependencies": { - "prisma": "*" + "prisma": "*", + "typescript": ">=5.1.0" }, "peerDependenciesMeta": { "prisma": { "optional": true + }, + "typescript": { + "optional": true } } }, "exercises/04.unit-test/03.problem.hooks/node_modules/prisma": { - "version": "5.16.2", - "resolved": "https://registry.npmjs.org/prisma/-/prisma-5.16.2.tgz", - "integrity": "sha512-rFV/xoBR2hBGGlu4LPLQd4U8WVA+tSAmYyFWGPRVfj+xg7N4kiZV4lSk38htSpF+/IuHKzlrbh4SFk8Z18cI8A==", + "version": "6.19.1", + "resolved": "https://registry.npmjs.org/prisma/-/prisma-6.19.1.tgz", + "integrity": "sha512-XRfmGzh6gtkc/Vq3LqZJcS2884dQQW3UhPo6jNRoiTW95FFQkXFg8vkYEy6og+Pyv0aY7zRQ7Wn1Cvr56XjhQQ==", "hasInstallScript": true, + "license": "Apache-2.0", "dependencies": { - "@prisma/engines": "5.16.2" + "@prisma/config": "6.19.1", + "@prisma/engines": "6.19.1" }, "bin": { "prisma": "build/index.js" }, "engines": { - "node": ">=16.13" + "node": ">=18.18" + }, + "peerDependencies": { + "typescript": ">=5.1.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, "exercises/04.unit-test/03.solution.hooks": { @@ -2556,9 +2825,8 @@ "@conform-to/zod": "^0.9.0", "@epic-web/remember": "^1.1.0", "@epic-web/totp": "^1.1.2", - "@epic-web/workshop-utils": "^4.21.1", "@paralleldrive/cuid2": "^2.2.2", - "@prisma/client": "^5.16.2", + "@prisma/client": "^6.19.1", "@radix-ui/react-checkbox": "^1.1.1", "@radix-ui/react-dropdown-menu": "^2.1.1", "@radix-ui/react-label": "^2.1.0", @@ -2585,13 +2853,13 @@ "glob": "^11.0.0", "isbot": "^5.1.12", "morgan": "^1.10.0", - "prisma": "^5.16.2", + "prisma": "^6.19.1", "qrcode": "^1.5.3", "react": "^18.3.1", "react-dom": "^18.3.1", "remix-auth": "^3.7.0", "remix-auth-form": "^1.5.0", - "remix-auth-github": "^1.7.0", + "remix-auth-github": "1.7.0", "remix-utils": "^7.6.0", "sonner": "^1.5.0", "source-map-support": "^0.5.21", @@ -2637,7 +2905,7 @@ "execa": "^9.3.0", "fs-extra": "^11.2.0", "jsdom": "^24.1.0", - "msw": "^2.3.1", + "msw": "^2.12.4", "node-html-parser": "^6.1.13", "npm-run-all": "^4.1.5", "prettier": "^3.3.2", @@ -2651,35 +2919,50 @@ } }, "exercises/04.unit-test/03.solution.hooks/node_modules/@prisma/client": { - "version": "5.16.2", - "resolved": "https://registry.npmjs.org/@prisma/client/-/client-5.16.2.tgz", - "integrity": "sha512-+1lmkhR9gHWcTC5oghm2ZKpWljyWdzfazCVlLKUWXVmwHSf52g81aZ8qb6Km5Bs025yBi7puLp3qSLEvktoUtw==", + "version": "6.19.1", + "resolved": "https://registry.npmjs.org/@prisma/client/-/client-6.19.1.tgz", + "integrity": "sha512-4SXj4Oo6HyQkLUWT8Ke5R0PTAfVOKip5Roo+6+b2EDTkFg5be0FnBWiuRJc0BC0sRQIWGMLKW1XguhVfW/z3/A==", "hasInstallScript": true, + "license": "Apache-2.0", "engines": { - "node": ">=16.13" + "node": ">=18.18" }, "peerDependencies": { - "prisma": "*" + "prisma": "*", + "typescript": ">=5.1.0" }, "peerDependenciesMeta": { "prisma": { "optional": true + }, + "typescript": { + "optional": true } } }, "exercises/04.unit-test/03.solution.hooks/node_modules/prisma": { - "version": "5.16.2", - "resolved": "https://registry.npmjs.org/prisma/-/prisma-5.16.2.tgz", - "integrity": "sha512-rFV/xoBR2hBGGlu4LPLQd4U8WVA+tSAmYyFWGPRVfj+xg7N4kiZV4lSk38htSpF+/IuHKzlrbh4SFk8Z18cI8A==", + "version": "6.19.1", + "resolved": "https://registry.npmjs.org/prisma/-/prisma-6.19.1.tgz", + "integrity": "sha512-XRfmGzh6gtkc/Vq3LqZJcS2884dQQW3UhPo6jNRoiTW95FFQkXFg8vkYEy6og+Pyv0aY7zRQ7Wn1Cvr56XjhQQ==", "hasInstallScript": true, + "license": "Apache-2.0", "dependencies": { - "@prisma/engines": "5.16.2" + "@prisma/config": "6.19.1", + "@prisma/engines": "6.19.1" }, "bin": { "prisma": "build/index.js" }, "engines": { - "node": ">=16.13" + "node": ">=18.18" + }, + "peerDependencies": { + "typescript": ">=5.1.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, "exercises/04.unit-test/04.problem.setup": { @@ -2689,9 +2972,8 @@ "@conform-to/zod": "^0.9.0", "@epic-web/remember": "^1.1.0", "@epic-web/totp": "^1.1.2", - "@epic-web/workshop-utils": "^4.21.1", "@paralleldrive/cuid2": "^2.2.2", - "@prisma/client": "^5.16.2", + "@prisma/client": "^6.19.1", "@radix-ui/react-checkbox": "^1.1.1", "@radix-ui/react-dropdown-menu": "^2.1.1", "@radix-ui/react-label": "^2.1.0", @@ -2718,13 +3000,13 @@ "glob": "^11.0.0", "isbot": "^5.1.12", "morgan": "^1.10.0", - "prisma": "^5.16.2", + "prisma": "^6.19.1", "qrcode": "^1.5.3", "react": "^18.3.1", "react-dom": "^18.3.1", "remix-auth": "^3.7.0", "remix-auth-form": "^1.5.0", - "remix-auth-github": "^1.7.0", + "remix-auth-github": "1.7.0", "remix-utils": "^7.6.0", "sonner": "^1.5.0", "source-map-support": "^0.5.21", @@ -2770,7 +3052,7 @@ "execa": "^9.3.0", "fs-extra": "^11.2.0", "jsdom": "^24.1.0", - "msw": "^2.3.1", + "msw": "^2.12.4", "node-html-parser": "^6.1.13", "npm-run-all": "^4.1.5", "prettier": "^3.3.2", @@ -2784,35 +3066,50 @@ } }, "exercises/04.unit-test/04.problem.setup/node_modules/@prisma/client": { - "version": "5.16.2", - "resolved": "https://registry.npmjs.org/@prisma/client/-/client-5.16.2.tgz", - "integrity": "sha512-+1lmkhR9gHWcTC5oghm2ZKpWljyWdzfazCVlLKUWXVmwHSf52g81aZ8qb6Km5Bs025yBi7puLp3qSLEvktoUtw==", + "version": "6.19.1", + "resolved": "https://registry.npmjs.org/@prisma/client/-/client-6.19.1.tgz", + "integrity": "sha512-4SXj4Oo6HyQkLUWT8Ke5R0PTAfVOKip5Roo+6+b2EDTkFg5be0FnBWiuRJc0BC0sRQIWGMLKW1XguhVfW/z3/A==", "hasInstallScript": true, + "license": "Apache-2.0", "engines": { - "node": ">=16.13" + "node": ">=18.18" }, "peerDependencies": { - "prisma": "*" + "prisma": "*", + "typescript": ">=5.1.0" }, "peerDependenciesMeta": { "prisma": { "optional": true + }, + "typescript": { + "optional": true } } }, "exercises/04.unit-test/04.problem.setup/node_modules/prisma": { - "version": "5.16.2", - "resolved": "https://registry.npmjs.org/prisma/-/prisma-5.16.2.tgz", - "integrity": "sha512-rFV/xoBR2hBGGlu4LPLQd4U8WVA+tSAmYyFWGPRVfj+xg7N4kiZV4lSk38htSpF+/IuHKzlrbh4SFk8Z18cI8A==", + "version": "6.19.1", + "resolved": "https://registry.npmjs.org/prisma/-/prisma-6.19.1.tgz", + "integrity": "sha512-XRfmGzh6gtkc/Vq3LqZJcS2884dQQW3UhPo6jNRoiTW95FFQkXFg8vkYEy6og+Pyv0aY7zRQ7Wn1Cvr56XjhQQ==", "hasInstallScript": true, + "license": "Apache-2.0", "dependencies": { - "@prisma/engines": "5.16.2" + "@prisma/config": "6.19.1", + "@prisma/engines": "6.19.1" }, "bin": { "prisma": "build/index.js" }, "engines": { - "node": ">=16.13" + "node": ">=18.18" + }, + "peerDependencies": { + "typescript": ">=5.1.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, "exercises/04.unit-test/04.solution.setup": { @@ -2822,9 +3119,8 @@ "@conform-to/zod": "^0.9.0", "@epic-web/remember": "^1.1.0", "@epic-web/totp": "^1.1.2", - "@epic-web/workshop-utils": "^4.21.1", "@paralleldrive/cuid2": "^2.2.2", - "@prisma/client": "^5.16.2", + "@prisma/client": "^6.19.1", "@radix-ui/react-checkbox": "^1.1.1", "@radix-ui/react-dropdown-menu": "^2.1.1", "@radix-ui/react-label": "^2.1.0", @@ -2851,13 +3147,13 @@ "glob": "^11.0.0", "isbot": "^5.1.12", "morgan": "^1.10.0", - "prisma": "^5.16.2", + "prisma": "^6.19.1", "qrcode": "^1.5.3", "react": "^18.3.1", "react-dom": "^18.3.1", "remix-auth": "^3.7.0", "remix-auth-form": "^1.5.0", - "remix-auth-github": "^1.7.0", + "remix-auth-github": "1.7.0", "remix-utils": "^7.6.0", "sonner": "^1.5.0", "source-map-support": "^0.5.21", @@ -2903,7 +3199,7 @@ "execa": "^9.3.0", "fs-extra": "^11.2.0", "jsdom": "^24.1.0", - "msw": "^2.3.1", + "msw": "^2.12.4", "node-html-parser": "^6.1.13", "npm-run-all": "^4.1.5", "prettier": "^3.3.2", @@ -2917,35 +3213,50 @@ } }, "exercises/04.unit-test/04.solution.setup/node_modules/@prisma/client": { - "version": "5.16.2", - "resolved": "https://registry.npmjs.org/@prisma/client/-/client-5.16.2.tgz", - "integrity": "sha512-+1lmkhR9gHWcTC5oghm2ZKpWljyWdzfazCVlLKUWXVmwHSf52g81aZ8qb6Km5Bs025yBi7puLp3qSLEvktoUtw==", + "version": "6.19.1", + "resolved": "https://registry.npmjs.org/@prisma/client/-/client-6.19.1.tgz", + "integrity": "sha512-4SXj4Oo6HyQkLUWT8Ke5R0PTAfVOKip5Roo+6+b2EDTkFg5be0FnBWiuRJc0BC0sRQIWGMLKW1XguhVfW/z3/A==", "hasInstallScript": true, + "license": "Apache-2.0", "engines": { - "node": ">=16.13" + "node": ">=18.18" }, "peerDependencies": { - "prisma": "*" + "prisma": "*", + "typescript": ">=5.1.0" }, "peerDependenciesMeta": { "prisma": { "optional": true + }, + "typescript": { + "optional": true } } }, "exercises/04.unit-test/04.solution.setup/node_modules/prisma": { - "version": "5.16.2", - "resolved": "https://registry.npmjs.org/prisma/-/prisma-5.16.2.tgz", - "integrity": "sha512-rFV/xoBR2hBGGlu4LPLQd4U8WVA+tSAmYyFWGPRVfj+xg7N4kiZV4lSk38htSpF+/IuHKzlrbh4SFk8Z18cI8A==", + "version": "6.19.1", + "resolved": "https://registry.npmjs.org/prisma/-/prisma-6.19.1.tgz", + "integrity": "sha512-XRfmGzh6gtkc/Vq3LqZJcS2884dQQW3UhPo6jNRoiTW95FFQkXFg8vkYEy6og+Pyv0aY7zRQ7Wn1Cvr56XjhQQ==", "hasInstallScript": true, + "license": "Apache-2.0", "dependencies": { - "@prisma/engines": "5.16.2" + "@prisma/config": "6.19.1", + "@prisma/engines": "6.19.1" }, "bin": { "prisma": "build/index.js" }, "engines": { - "node": ">=16.13" + "node": ">=18.18" + }, + "peerDependencies": { + "typescript": ">=5.1.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, "exercises/05.component-test/01.problem.init": { @@ -2955,9 +3266,8 @@ "@conform-to/zod": "^0.9.0", "@epic-web/remember": "^1.1.0", "@epic-web/totp": "^1.1.2", - "@epic-web/workshop-utils": "^4.21.1", "@paralleldrive/cuid2": "^2.2.2", - "@prisma/client": "^5.16.2", + "@prisma/client": "^6.19.1", "@radix-ui/react-checkbox": "^1.1.1", "@radix-ui/react-dropdown-menu": "^2.1.1", "@radix-ui/react-label": "^2.1.0", @@ -2984,13 +3294,13 @@ "glob": "^11.0.0", "isbot": "^5.1.12", "morgan": "^1.10.0", - "prisma": "^5.16.2", + "prisma": "^6.19.1", "qrcode": "^1.5.3", "react": "^18.3.1", "react-dom": "^18.3.1", "remix-auth": "^3.7.0", "remix-auth-form": "^1.5.0", - "remix-auth-github": "^1.7.0", + "remix-auth-github": "1.7.0", "remix-utils": "^7.6.0", "sonner": "^1.5.0", "source-map-support": "^0.5.21", @@ -3036,7 +3346,7 @@ "execa": "^9.3.0", "fs-extra": "^11.2.0", "jsdom": "^24.1.0", - "msw": "^2.3.1", + "msw": "^2.12.4", "node-html-parser": "^6.1.13", "npm-run-all": "^4.1.5", "prettier": "^3.3.2", @@ -3050,35 +3360,50 @@ } }, "exercises/05.component-test/01.problem.init/node_modules/@prisma/client": { - "version": "5.16.2", - "resolved": "https://registry.npmjs.org/@prisma/client/-/client-5.16.2.tgz", - "integrity": "sha512-+1lmkhR9gHWcTC5oghm2ZKpWljyWdzfazCVlLKUWXVmwHSf52g81aZ8qb6Km5Bs025yBi7puLp3qSLEvktoUtw==", + "version": "6.19.1", + "resolved": "https://registry.npmjs.org/@prisma/client/-/client-6.19.1.tgz", + "integrity": "sha512-4SXj4Oo6HyQkLUWT8Ke5R0PTAfVOKip5Roo+6+b2EDTkFg5be0FnBWiuRJc0BC0sRQIWGMLKW1XguhVfW/z3/A==", "hasInstallScript": true, + "license": "Apache-2.0", "engines": { - "node": ">=16.13" + "node": ">=18.18" }, "peerDependencies": { - "prisma": "*" + "prisma": "*", + "typescript": ">=5.1.0" }, "peerDependenciesMeta": { "prisma": { "optional": true + }, + "typescript": { + "optional": true } } }, "exercises/05.component-test/01.problem.init/node_modules/prisma": { - "version": "5.16.2", - "resolved": "https://registry.npmjs.org/prisma/-/prisma-5.16.2.tgz", - "integrity": "sha512-rFV/xoBR2hBGGlu4LPLQd4U8WVA+tSAmYyFWGPRVfj+xg7N4kiZV4lSk38htSpF+/IuHKzlrbh4SFk8Z18cI8A==", + "version": "6.19.1", + "resolved": "https://registry.npmjs.org/prisma/-/prisma-6.19.1.tgz", + "integrity": "sha512-XRfmGzh6gtkc/Vq3LqZJcS2884dQQW3UhPo6jNRoiTW95FFQkXFg8vkYEy6og+Pyv0aY7zRQ7Wn1Cvr56XjhQQ==", "hasInstallScript": true, + "license": "Apache-2.0", "dependencies": { - "@prisma/engines": "5.16.2" + "@prisma/config": "6.19.1", + "@prisma/engines": "6.19.1" }, "bin": { "prisma": "build/index.js" }, "engines": { - "node": ">=16.13" + "node": ">=18.18" + }, + "peerDependencies": { + "typescript": ">=5.1.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, "exercises/05.component-test/01.solution.init": { @@ -3088,9 +3413,8 @@ "@conform-to/zod": "^0.9.0", "@epic-web/remember": "^1.1.0", "@epic-web/totp": "^1.1.2", - "@epic-web/workshop-utils": "^4.21.1", "@paralleldrive/cuid2": "^2.2.2", - "@prisma/client": "^5.16.2", + "@prisma/client": "^6.19.1", "@radix-ui/react-checkbox": "^1.1.1", "@radix-ui/react-dropdown-menu": "^2.1.1", "@radix-ui/react-label": "^2.1.0", @@ -3117,13 +3441,13 @@ "glob": "^11.0.0", "isbot": "^5.1.12", "morgan": "^1.10.0", - "prisma": "^5.16.2", + "prisma": "^6.19.1", "qrcode": "^1.5.3", "react": "^18.3.1", "react-dom": "^18.3.1", "remix-auth": "^3.7.0", "remix-auth-form": "^1.5.0", - "remix-auth-github": "^1.7.0", + "remix-auth-github": "1.7.0", "remix-utils": "^7.6.0", "sonner": "^1.5.0", "source-map-support": "^0.5.21", @@ -3169,7 +3493,7 @@ "execa": "^9.3.0", "fs-extra": "^11.2.0", "jsdom": "^24.1.0", - "msw": "^2.3.1", + "msw": "^2.12.4", "node-html-parser": "^6.1.13", "npm-run-all": "^4.1.5", "prettier": "^3.3.2", @@ -3183,35 +3507,50 @@ } }, "exercises/05.component-test/01.solution.init/node_modules/@prisma/client": { - "version": "5.16.2", - "resolved": "https://registry.npmjs.org/@prisma/client/-/client-5.16.2.tgz", - "integrity": "sha512-+1lmkhR9gHWcTC5oghm2ZKpWljyWdzfazCVlLKUWXVmwHSf52g81aZ8qb6Km5Bs025yBi7puLp3qSLEvktoUtw==", + "version": "6.19.1", + "resolved": "https://registry.npmjs.org/@prisma/client/-/client-6.19.1.tgz", + "integrity": "sha512-4SXj4Oo6HyQkLUWT8Ke5R0PTAfVOKip5Roo+6+b2EDTkFg5be0FnBWiuRJc0BC0sRQIWGMLKW1XguhVfW/z3/A==", "hasInstallScript": true, + "license": "Apache-2.0", "engines": { - "node": ">=16.13" + "node": ">=18.18" }, "peerDependencies": { - "prisma": "*" + "prisma": "*", + "typescript": ">=5.1.0" }, "peerDependenciesMeta": { "prisma": { "optional": true + }, + "typescript": { + "optional": true } } }, "exercises/05.component-test/01.solution.init/node_modules/prisma": { - "version": "5.16.2", - "resolved": "https://registry.npmjs.org/prisma/-/prisma-5.16.2.tgz", - "integrity": "sha512-rFV/xoBR2hBGGlu4LPLQd4U8WVA+tSAmYyFWGPRVfj+xg7N4kiZV4lSk38htSpF+/IuHKzlrbh4SFk8Z18cI8A==", + "version": "6.19.1", + "resolved": "https://registry.npmjs.org/prisma/-/prisma-6.19.1.tgz", + "integrity": "sha512-XRfmGzh6gtkc/Vq3LqZJcS2884dQQW3UhPo6jNRoiTW95FFQkXFg8vkYEy6og+Pyv0aY7zRQ7Wn1Cvr56XjhQQ==", "hasInstallScript": true, + "license": "Apache-2.0", "dependencies": { - "@prisma/engines": "5.16.2" + "@prisma/config": "6.19.1", + "@prisma/engines": "6.19.1" }, "bin": { "prisma": "build/index.js" }, "engines": { - "node": ">=16.13" + "node": ">=18.18" + }, + "peerDependencies": { + "typescript": ">=5.1.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, "exercises/05.component-test/02.problem.cleanup": { @@ -3221,9 +3560,8 @@ "@conform-to/zod": "^0.9.0", "@epic-web/remember": "^1.1.0", "@epic-web/totp": "^1.1.2", - "@epic-web/workshop-utils": "^4.21.1", "@paralleldrive/cuid2": "^2.2.2", - "@prisma/client": "^5.16.2", + "@prisma/client": "^6.19.1", "@radix-ui/react-checkbox": "^1.1.1", "@radix-ui/react-dropdown-menu": "^2.1.1", "@radix-ui/react-label": "^2.1.0", @@ -3250,13 +3588,13 @@ "glob": "^11.0.0", "isbot": "^5.1.12", "morgan": "^1.10.0", - "prisma": "^5.16.2", + "prisma": "^6.19.1", "qrcode": "^1.5.3", "react": "^18.3.1", "react-dom": "^18.3.1", "remix-auth": "^3.7.0", "remix-auth-form": "^1.5.0", - "remix-auth-github": "^1.7.0", + "remix-auth-github": "1.7.0", "remix-utils": "^7.6.0", "sonner": "^1.5.0", "source-map-support": "^0.5.21", @@ -3302,7 +3640,7 @@ "execa": "^9.3.0", "fs-extra": "^11.2.0", "jsdom": "^24.1.0", - "msw": "^2.3.1", + "msw": "^2.12.4", "node-html-parser": "^6.1.13", "npm-run-all": "^4.1.5", "prettier": "^3.3.2", @@ -3316,35 +3654,50 @@ } }, "exercises/05.component-test/02.problem.cleanup/node_modules/@prisma/client": { - "version": "5.16.2", - "resolved": "https://registry.npmjs.org/@prisma/client/-/client-5.16.2.tgz", - "integrity": "sha512-+1lmkhR9gHWcTC5oghm2ZKpWljyWdzfazCVlLKUWXVmwHSf52g81aZ8qb6Km5Bs025yBi7puLp3qSLEvktoUtw==", + "version": "6.19.1", + "resolved": "https://registry.npmjs.org/@prisma/client/-/client-6.19.1.tgz", + "integrity": "sha512-4SXj4Oo6HyQkLUWT8Ke5R0PTAfVOKip5Roo+6+b2EDTkFg5be0FnBWiuRJc0BC0sRQIWGMLKW1XguhVfW/z3/A==", "hasInstallScript": true, + "license": "Apache-2.0", "engines": { - "node": ">=16.13" + "node": ">=18.18" }, "peerDependencies": { - "prisma": "*" + "prisma": "*", + "typescript": ">=5.1.0" }, "peerDependenciesMeta": { "prisma": { "optional": true + }, + "typescript": { + "optional": true } } }, "exercises/05.component-test/02.problem.cleanup/node_modules/prisma": { - "version": "5.16.2", - "resolved": "https://registry.npmjs.org/prisma/-/prisma-5.16.2.tgz", - "integrity": "sha512-rFV/xoBR2hBGGlu4LPLQd4U8WVA+tSAmYyFWGPRVfj+xg7N4kiZV4lSk38htSpF+/IuHKzlrbh4SFk8Z18cI8A==", + "version": "6.19.1", + "resolved": "https://registry.npmjs.org/prisma/-/prisma-6.19.1.tgz", + "integrity": "sha512-XRfmGzh6gtkc/Vq3LqZJcS2884dQQW3UhPo6jNRoiTW95FFQkXFg8vkYEy6og+Pyv0aY7zRQ7Wn1Cvr56XjhQQ==", "hasInstallScript": true, + "license": "Apache-2.0", "dependencies": { - "@prisma/engines": "5.16.2" + "@prisma/config": "6.19.1", + "@prisma/engines": "6.19.1" }, "bin": { "prisma": "build/index.js" }, "engines": { - "node": ">=16.13" + "node": ">=18.18" + }, + "peerDependencies": { + "typescript": ">=5.1.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, "exercises/05.component-test/02.solution.cleanup": { @@ -3354,9 +3707,8 @@ "@conform-to/zod": "^0.9.0", "@epic-web/remember": "^1.1.0", "@epic-web/totp": "^1.1.2", - "@epic-web/workshop-utils": "^4.21.1", "@paralleldrive/cuid2": "^2.2.2", - "@prisma/client": "^5.16.2", + "@prisma/client": "^6.19.1", "@radix-ui/react-checkbox": "^1.1.1", "@radix-ui/react-dropdown-menu": "^2.1.1", "@radix-ui/react-label": "^2.1.0", @@ -3383,13 +3735,13 @@ "glob": "^11.0.0", "isbot": "^5.1.12", "morgan": "^1.10.0", - "prisma": "^5.16.2", + "prisma": "^6.19.1", "qrcode": "^1.5.3", "react": "^18.3.1", "react-dom": "^18.3.1", "remix-auth": "^3.7.0", "remix-auth-form": "^1.5.0", - "remix-auth-github": "^1.7.0", + "remix-auth-github": "1.7.0", "remix-utils": "^7.6.0", "sonner": "^1.5.0", "source-map-support": "^0.5.21", @@ -3435,7 +3787,7 @@ "execa": "^9.3.0", "fs-extra": "^11.2.0", "jsdom": "^24.1.0", - "msw": "^2.3.1", + "msw": "^2.12.4", "node-html-parser": "^6.1.13", "npm-run-all": "^4.1.5", "prettier": "^3.3.2", @@ -3449,36 +3801,51 @@ } }, "exercises/05.component-test/02.solution.cleanup/node_modules/@prisma/client": { - "version": "5.16.2", - "resolved": "https://registry.npmjs.org/@prisma/client/-/client-5.16.2.tgz", - "integrity": "sha512-+1lmkhR9gHWcTC5oghm2ZKpWljyWdzfazCVlLKUWXVmwHSf52g81aZ8qb6Km5Bs025yBi7puLp3qSLEvktoUtw==", + "version": "6.19.1", + "resolved": "https://registry.npmjs.org/@prisma/client/-/client-6.19.1.tgz", + "integrity": "sha512-4SXj4Oo6HyQkLUWT8Ke5R0PTAfVOKip5Roo+6+b2EDTkFg5be0FnBWiuRJc0BC0sRQIWGMLKW1XguhVfW/z3/A==", "hasInstallScript": true, + "license": "Apache-2.0", "engines": { - "node": ">=16.13" + "node": ">=18.18" }, "peerDependencies": { - "prisma": "*" + "prisma": "*", + "typescript": ">=5.1.0" }, "peerDependenciesMeta": { "prisma": { "optional": true + }, + "typescript": { + "optional": true } } }, "exercises/05.component-test/02.solution.cleanup/node_modules/prisma": { - "version": "5.16.2", - "resolved": "https://registry.npmjs.org/prisma/-/prisma-5.16.2.tgz", - "integrity": "sha512-rFV/xoBR2hBGGlu4LPLQd4U8WVA+tSAmYyFWGPRVfj+xg7N4kiZV4lSk38htSpF+/IuHKzlrbh4SFk8Z18cI8A==", + "version": "6.19.1", + "resolved": "https://registry.npmjs.org/prisma/-/prisma-6.19.1.tgz", + "integrity": "sha512-XRfmGzh6gtkc/Vq3LqZJcS2884dQQW3UhPo6jNRoiTW95FFQkXFg8vkYEy6og+Pyv0aY7zRQ7Wn1Cvr56XjhQQ==", "hasInstallScript": true, + "license": "Apache-2.0", "dependencies": { - "@prisma/engines": "5.16.2" + "@prisma/config": "6.19.1", + "@prisma/engines": "6.19.1" }, "bin": { "prisma": "build/index.js" }, "engines": { - "node": ">=16.13" - } + "node": ">=18.18" + }, + "peerDependencies": { + "typescript": ">=5.1.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } }, "exercises/06.hooks/01.problem.render-hook": { "name": "exercises__sep__06.hooks__sep__01.problem.render-hook", @@ -3487,9 +3854,8 @@ "@conform-to/zod": "^0.9.0", "@epic-web/remember": "^1.1.0", "@epic-web/totp": "^1.1.2", - "@epic-web/workshop-utils": "^4.21.1", "@paralleldrive/cuid2": "^2.2.2", - "@prisma/client": "^5.16.2", + "@prisma/client": "^6.19.1", "@radix-ui/react-checkbox": "^1.1.1", "@radix-ui/react-dropdown-menu": "^2.1.1", "@radix-ui/react-label": "^2.1.0", @@ -3516,13 +3882,13 @@ "glob": "^11.0.0", "isbot": "^5.1.12", "morgan": "^1.10.0", - "prisma": "^5.16.2", + "prisma": "^6.19.1", "qrcode": "^1.5.3", "react": "^18.3.1", "react-dom": "^18.3.1", "remix-auth": "^3.7.0", "remix-auth-form": "^1.5.0", - "remix-auth-github": "^1.7.0", + "remix-auth-github": "1.7.0", "remix-utils": "^7.6.0", "sonner": "^1.5.0", "source-map-support": "^0.5.21", @@ -3568,7 +3934,7 @@ "execa": "^9.3.0", "fs-extra": "^11.2.0", "jsdom": "^24.1.0", - "msw": "^2.3.1", + "msw": "^2.12.4", "node-html-parser": "^6.1.13", "npm-run-all": "^4.1.5", "prettier": "^3.3.2", @@ -3582,35 +3948,50 @@ } }, "exercises/06.hooks/01.problem.render-hook/node_modules/@prisma/client": { - "version": "5.16.2", - "resolved": "https://registry.npmjs.org/@prisma/client/-/client-5.16.2.tgz", - "integrity": "sha512-+1lmkhR9gHWcTC5oghm2ZKpWljyWdzfazCVlLKUWXVmwHSf52g81aZ8qb6Km5Bs025yBi7puLp3qSLEvktoUtw==", + "version": "6.19.1", + "resolved": "https://registry.npmjs.org/@prisma/client/-/client-6.19.1.tgz", + "integrity": "sha512-4SXj4Oo6HyQkLUWT8Ke5R0PTAfVOKip5Roo+6+b2EDTkFg5be0FnBWiuRJc0BC0sRQIWGMLKW1XguhVfW/z3/A==", "hasInstallScript": true, + "license": "Apache-2.0", "engines": { - "node": ">=16.13" + "node": ">=18.18" }, "peerDependencies": { - "prisma": "*" + "prisma": "*", + "typescript": ">=5.1.0" }, "peerDependenciesMeta": { "prisma": { "optional": true + }, + "typescript": { + "optional": true } } }, "exercises/06.hooks/01.problem.render-hook/node_modules/prisma": { - "version": "5.16.2", - "resolved": "https://registry.npmjs.org/prisma/-/prisma-5.16.2.tgz", - "integrity": "sha512-rFV/xoBR2hBGGlu4LPLQd4U8WVA+tSAmYyFWGPRVfj+xg7N4kiZV4lSk38htSpF+/IuHKzlrbh4SFk8Z18cI8A==", + "version": "6.19.1", + "resolved": "https://registry.npmjs.org/prisma/-/prisma-6.19.1.tgz", + "integrity": "sha512-XRfmGzh6gtkc/Vq3LqZJcS2884dQQW3UhPo6jNRoiTW95FFQkXFg8vkYEy6og+Pyv0aY7zRQ7Wn1Cvr56XjhQQ==", "hasInstallScript": true, + "license": "Apache-2.0", "dependencies": { - "@prisma/engines": "5.16.2" + "@prisma/config": "6.19.1", + "@prisma/engines": "6.19.1" }, "bin": { "prisma": "build/index.js" }, "engines": { - "node": ">=16.13" + "node": ">=18.18" + }, + "peerDependencies": { + "typescript": ">=5.1.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, "exercises/06.hooks/01.solution.render-hook": { @@ -3620,9 +4001,8 @@ "@conform-to/zod": "^0.9.0", "@epic-web/remember": "^1.1.0", "@epic-web/totp": "^1.1.2", - "@epic-web/workshop-utils": "^4.21.1", "@paralleldrive/cuid2": "^2.2.2", - "@prisma/client": "^5.16.2", + "@prisma/client": "^6.19.1", "@radix-ui/react-checkbox": "^1.1.1", "@radix-ui/react-dropdown-menu": "^2.1.1", "@radix-ui/react-label": "^2.1.0", @@ -3649,13 +4029,13 @@ "glob": "^11.0.0", "isbot": "^5.1.12", "morgan": "^1.10.0", - "prisma": "^5.16.2", + "prisma": "^6.19.1", "qrcode": "^1.5.3", "react": "^18.3.1", "react-dom": "^18.3.1", "remix-auth": "^3.7.0", "remix-auth-form": "^1.5.0", - "remix-auth-github": "^1.7.0", + "remix-auth-github": "1.7.0", "remix-utils": "^7.6.0", "sonner": "^1.5.0", "source-map-support": "^0.5.21", @@ -3701,7 +4081,7 @@ "execa": "^9.3.0", "fs-extra": "^11.2.0", "jsdom": "^24.1.0", - "msw": "^2.3.1", + "msw": "^2.12.4", "node-html-parser": "^6.1.13", "npm-run-all": "^4.1.5", "prettier": "^3.3.2", @@ -3715,35 +4095,50 @@ } }, "exercises/06.hooks/01.solution.render-hook/node_modules/@prisma/client": { - "version": "5.16.2", - "resolved": "https://registry.npmjs.org/@prisma/client/-/client-5.16.2.tgz", - "integrity": "sha512-+1lmkhR9gHWcTC5oghm2ZKpWljyWdzfazCVlLKUWXVmwHSf52g81aZ8qb6Km5Bs025yBi7puLp3qSLEvktoUtw==", + "version": "6.19.1", + "resolved": "https://registry.npmjs.org/@prisma/client/-/client-6.19.1.tgz", + "integrity": "sha512-4SXj4Oo6HyQkLUWT8Ke5R0PTAfVOKip5Roo+6+b2EDTkFg5be0FnBWiuRJc0BC0sRQIWGMLKW1XguhVfW/z3/A==", "hasInstallScript": true, + "license": "Apache-2.0", "engines": { - "node": ">=16.13" + "node": ">=18.18" }, "peerDependencies": { - "prisma": "*" + "prisma": "*", + "typescript": ">=5.1.0" }, "peerDependenciesMeta": { "prisma": { "optional": true + }, + "typescript": { + "optional": true } } }, "exercises/06.hooks/01.solution.render-hook/node_modules/prisma": { - "version": "5.16.2", - "resolved": "https://registry.npmjs.org/prisma/-/prisma-5.16.2.tgz", - "integrity": "sha512-rFV/xoBR2hBGGlu4LPLQd4U8WVA+tSAmYyFWGPRVfj+xg7N4kiZV4lSk38htSpF+/IuHKzlrbh4SFk8Z18cI8A==", + "version": "6.19.1", + "resolved": "https://registry.npmjs.org/prisma/-/prisma-6.19.1.tgz", + "integrity": "sha512-XRfmGzh6gtkc/Vq3LqZJcS2884dQQW3UhPo6jNRoiTW95FFQkXFg8vkYEy6og+Pyv0aY7zRQ7Wn1Cvr56XjhQQ==", "hasInstallScript": true, + "license": "Apache-2.0", "dependencies": { - "@prisma/engines": "5.16.2" + "@prisma/config": "6.19.1", + "@prisma/engines": "6.19.1" }, "bin": { "prisma": "build/index.js" }, "engines": { - "node": ">=16.13" + "node": ">=18.18" + }, + "peerDependencies": { + "typescript": ">=5.1.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, "exercises/06.hooks/02.problem.test-component": { @@ -3753,9 +4148,8 @@ "@conform-to/zod": "^0.9.0", "@epic-web/remember": "^1.1.0", "@epic-web/totp": "^1.1.2", - "@epic-web/workshop-utils": "^4.21.1", "@paralleldrive/cuid2": "^2.2.2", - "@prisma/client": "^5.16.2", + "@prisma/client": "^6.19.1", "@radix-ui/react-checkbox": "^1.1.1", "@radix-ui/react-dropdown-menu": "^2.1.1", "@radix-ui/react-label": "^2.1.0", @@ -3782,13 +4176,13 @@ "glob": "^11.0.0", "isbot": "^5.1.12", "morgan": "^1.10.0", - "prisma": "^5.16.2", + "prisma": "^6.19.1", "qrcode": "^1.5.3", "react": "^18.3.1", "react-dom": "^18.3.1", "remix-auth": "^3.7.0", "remix-auth-form": "^1.5.0", - "remix-auth-github": "^1.7.0", + "remix-auth-github": "1.7.0", "remix-utils": "^7.6.0", "sonner": "^1.5.0", "source-map-support": "^0.5.21", @@ -3834,7 +4228,7 @@ "execa": "^9.3.0", "fs-extra": "^11.2.0", "jsdom": "^24.1.0", - "msw": "^2.3.1", + "msw": "^2.12.4", "node-html-parser": "^6.1.13", "npm-run-all": "^4.1.5", "prettier": "^3.3.2", @@ -3848,35 +4242,50 @@ } }, "exercises/06.hooks/02.problem.test-component/node_modules/@prisma/client": { - "version": "5.16.2", - "resolved": "https://registry.npmjs.org/@prisma/client/-/client-5.16.2.tgz", - "integrity": "sha512-+1lmkhR9gHWcTC5oghm2ZKpWljyWdzfazCVlLKUWXVmwHSf52g81aZ8qb6Km5Bs025yBi7puLp3qSLEvktoUtw==", + "version": "6.19.1", + "resolved": "https://registry.npmjs.org/@prisma/client/-/client-6.19.1.tgz", + "integrity": "sha512-4SXj4Oo6HyQkLUWT8Ke5R0PTAfVOKip5Roo+6+b2EDTkFg5be0FnBWiuRJc0BC0sRQIWGMLKW1XguhVfW/z3/A==", "hasInstallScript": true, + "license": "Apache-2.0", "engines": { - "node": ">=16.13" + "node": ">=18.18" }, "peerDependencies": { - "prisma": "*" + "prisma": "*", + "typescript": ">=5.1.0" }, "peerDependenciesMeta": { "prisma": { "optional": true + }, + "typescript": { + "optional": true } } }, "exercises/06.hooks/02.problem.test-component/node_modules/prisma": { - "version": "5.16.2", - "resolved": "https://registry.npmjs.org/prisma/-/prisma-5.16.2.tgz", - "integrity": "sha512-rFV/xoBR2hBGGlu4LPLQd4U8WVA+tSAmYyFWGPRVfj+xg7N4kiZV4lSk38htSpF+/IuHKzlrbh4SFk8Z18cI8A==", + "version": "6.19.1", + "resolved": "https://registry.npmjs.org/prisma/-/prisma-6.19.1.tgz", + "integrity": "sha512-XRfmGzh6gtkc/Vq3LqZJcS2884dQQW3UhPo6jNRoiTW95FFQkXFg8vkYEy6og+Pyv0aY7zRQ7Wn1Cvr56XjhQQ==", "hasInstallScript": true, + "license": "Apache-2.0", "dependencies": { - "@prisma/engines": "5.16.2" + "@prisma/config": "6.19.1", + "@prisma/engines": "6.19.1" }, "bin": { "prisma": "build/index.js" }, "engines": { - "node": ">=16.13" + "node": ">=18.18" + }, + "peerDependencies": { + "typescript": ">=5.1.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, "exercises/06.hooks/02.solution.test-component": { @@ -3886,9 +4295,8 @@ "@conform-to/zod": "^0.9.0", "@epic-web/remember": "^1.1.0", "@epic-web/totp": "^1.1.2", - "@epic-web/workshop-utils": "^4.21.1", "@paralleldrive/cuid2": "^2.2.2", - "@prisma/client": "^5.16.2", + "@prisma/client": "^6.19.1", "@radix-ui/react-checkbox": "^1.1.1", "@radix-ui/react-dropdown-menu": "^2.1.1", "@radix-ui/react-label": "^2.1.0", @@ -3915,13 +4323,13 @@ "glob": "^11.0.0", "isbot": "^5.1.12", "morgan": "^1.10.0", - "prisma": "^5.16.2", + "prisma": "^6.19.1", "qrcode": "^1.5.3", "react": "^18.3.1", "react-dom": "^18.3.1", "remix-auth": "^3.7.0", "remix-auth-form": "^1.5.0", - "remix-auth-github": "^1.7.0", + "remix-auth-github": "1.7.0", "remix-utils": "^7.6.0", "sonner": "^1.5.0", "source-map-support": "^0.5.21", @@ -3967,7 +4375,7 @@ "execa": "^9.3.0", "fs-extra": "^11.2.0", "jsdom": "^24.1.0", - "msw": "^2.3.1", + "msw": "^2.12.4", "node-html-parser": "^6.1.13", "npm-run-all": "^4.1.5", "prettier": "^3.3.2", @@ -3981,35 +4389,50 @@ } }, "exercises/06.hooks/02.solution.test-component/node_modules/@prisma/client": { - "version": "5.16.2", - "resolved": "https://registry.npmjs.org/@prisma/client/-/client-5.16.2.tgz", - "integrity": "sha512-+1lmkhR9gHWcTC5oghm2ZKpWljyWdzfazCVlLKUWXVmwHSf52g81aZ8qb6Km5Bs025yBi7puLp3qSLEvktoUtw==", + "version": "6.19.1", + "resolved": "https://registry.npmjs.org/@prisma/client/-/client-6.19.1.tgz", + "integrity": "sha512-4SXj4Oo6HyQkLUWT8Ke5R0PTAfVOKip5Roo+6+b2EDTkFg5be0FnBWiuRJc0BC0sRQIWGMLKW1XguhVfW/z3/A==", "hasInstallScript": true, + "license": "Apache-2.0", "engines": { - "node": ">=16.13" + "node": ">=18.18" }, "peerDependencies": { - "prisma": "*" + "prisma": "*", + "typescript": ">=5.1.0" }, "peerDependenciesMeta": { "prisma": { "optional": true + }, + "typescript": { + "optional": true } } }, "exercises/06.hooks/02.solution.test-component/node_modules/prisma": { - "version": "5.16.2", - "resolved": "https://registry.npmjs.org/prisma/-/prisma-5.16.2.tgz", - "integrity": "sha512-rFV/xoBR2hBGGlu4LPLQd4U8WVA+tSAmYyFWGPRVfj+xg7N4kiZV4lSk38htSpF+/IuHKzlrbh4SFk8Z18cI8A==", + "version": "6.19.1", + "resolved": "https://registry.npmjs.org/prisma/-/prisma-6.19.1.tgz", + "integrity": "sha512-XRfmGzh6gtkc/Vq3LqZJcS2884dQQW3UhPo6jNRoiTW95FFQkXFg8vkYEy6og+Pyv0aY7zRQ7Wn1Cvr56XjhQQ==", "hasInstallScript": true, + "license": "Apache-2.0", "dependencies": { - "@prisma/engines": "5.16.2" + "@prisma/config": "6.19.1", + "@prisma/engines": "6.19.1" }, "bin": { "prisma": "build/index.js" }, "engines": { - "node": ">=16.13" + "node": ">=18.18" + }, + "peerDependencies": { + "typescript": ">=5.1.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, "exercises/07.remix-component/01.problem.stub-remix": { @@ -4019,9 +4442,8 @@ "@conform-to/zod": "^0.9.0", "@epic-web/remember": "^1.1.0", "@epic-web/totp": "^1.1.2", - "@epic-web/workshop-utils": "^4.21.1", "@paralleldrive/cuid2": "^2.2.2", - "@prisma/client": "^5.16.2", + "@prisma/client": "^6.19.1", "@radix-ui/react-checkbox": "^1.1.1", "@radix-ui/react-dropdown-menu": "^2.1.1", "@radix-ui/react-label": "^2.1.0", @@ -4048,13 +4470,13 @@ "glob": "^11.0.0", "isbot": "^5.1.12", "morgan": "^1.10.0", - "prisma": "^5.16.2", + "prisma": "^6.19.1", "qrcode": "^1.5.3", "react": "^18.3.1", "react-dom": "^18.3.1", "remix-auth": "^3.7.0", "remix-auth-form": "^1.5.0", - "remix-auth-github": "^1.7.0", + "remix-auth-github": "1.7.0", "remix-utils": "^7.6.0", "sonner": "^1.5.0", "source-map-support": "^0.5.21", @@ -4100,7 +4522,7 @@ "execa": "^9.3.0", "fs-extra": "^11.2.0", "jsdom": "^24.1.0", - "msw": "^2.3.1", + "msw": "^2.12.4", "node-html-parser": "^6.1.13", "npm-run-all": "^4.1.5", "prettier": "^3.3.2", @@ -4114,35 +4536,50 @@ } }, "exercises/07.remix-component/01.problem.stub-remix/node_modules/@prisma/client": { - "version": "5.16.2", - "resolved": "https://registry.npmjs.org/@prisma/client/-/client-5.16.2.tgz", - "integrity": "sha512-+1lmkhR9gHWcTC5oghm2ZKpWljyWdzfazCVlLKUWXVmwHSf52g81aZ8qb6Km5Bs025yBi7puLp3qSLEvktoUtw==", + "version": "6.19.1", + "resolved": "https://registry.npmjs.org/@prisma/client/-/client-6.19.1.tgz", + "integrity": "sha512-4SXj4Oo6HyQkLUWT8Ke5R0PTAfVOKip5Roo+6+b2EDTkFg5be0FnBWiuRJc0BC0sRQIWGMLKW1XguhVfW/z3/A==", "hasInstallScript": true, + "license": "Apache-2.0", "engines": { - "node": ">=16.13" + "node": ">=18.18" }, "peerDependencies": { - "prisma": "*" + "prisma": "*", + "typescript": ">=5.1.0" }, "peerDependenciesMeta": { "prisma": { "optional": true + }, + "typescript": { + "optional": true } } }, "exercises/07.remix-component/01.problem.stub-remix/node_modules/prisma": { - "version": "5.16.2", - "resolved": "https://registry.npmjs.org/prisma/-/prisma-5.16.2.tgz", - "integrity": "sha512-rFV/xoBR2hBGGlu4LPLQd4U8WVA+tSAmYyFWGPRVfj+xg7N4kiZV4lSk38htSpF+/IuHKzlrbh4SFk8Z18cI8A==", + "version": "6.19.1", + "resolved": "https://registry.npmjs.org/prisma/-/prisma-6.19.1.tgz", + "integrity": "sha512-XRfmGzh6gtkc/Vq3LqZJcS2884dQQW3UhPo6jNRoiTW95FFQkXFg8vkYEy6og+Pyv0aY7zRQ7Wn1Cvr56XjhQQ==", "hasInstallScript": true, + "license": "Apache-2.0", "dependencies": { - "@prisma/engines": "5.16.2" + "@prisma/config": "6.19.1", + "@prisma/engines": "6.19.1" }, "bin": { "prisma": "build/index.js" }, "engines": { - "node": ">=16.13" + "node": ">=18.18" + }, + "peerDependencies": { + "typescript": ">=5.1.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, "exercises/07.remix-component/01.solution.stub-remix": { @@ -4152,9 +4589,8 @@ "@conform-to/zod": "^0.9.0", "@epic-web/remember": "^1.1.0", "@epic-web/totp": "^1.1.2", - "@epic-web/workshop-utils": "^4.21.1", "@paralleldrive/cuid2": "^2.2.2", - "@prisma/client": "^5.16.2", + "@prisma/client": "^6.19.1", "@radix-ui/react-checkbox": "^1.1.1", "@radix-ui/react-dropdown-menu": "^2.1.1", "@radix-ui/react-label": "^2.1.0", @@ -4181,13 +4617,13 @@ "glob": "^11.0.0", "isbot": "^5.1.12", "morgan": "^1.10.0", - "prisma": "^5.16.2", + "prisma": "^6.19.1", "qrcode": "^1.5.3", "react": "^18.3.1", "react-dom": "^18.3.1", "remix-auth": "^3.7.0", "remix-auth-form": "^1.5.0", - "remix-auth-github": "^1.7.0", + "remix-auth-github": "1.7.0", "remix-utils": "^7.6.0", "sonner": "^1.5.0", "source-map-support": "^0.5.21", @@ -4233,7 +4669,7 @@ "execa": "^9.3.0", "fs-extra": "^11.2.0", "jsdom": "^24.1.0", - "msw": "^2.3.1", + "msw": "^2.12.4", "node-html-parser": "^6.1.13", "npm-run-all": "^4.1.5", "prettier": "^3.3.2", @@ -4247,35 +4683,50 @@ } }, "exercises/07.remix-component/01.solution.stub-remix/node_modules/@prisma/client": { - "version": "5.16.2", - "resolved": "https://registry.npmjs.org/@prisma/client/-/client-5.16.2.tgz", - "integrity": "sha512-+1lmkhR9gHWcTC5oghm2ZKpWljyWdzfazCVlLKUWXVmwHSf52g81aZ8qb6Km5Bs025yBi7puLp3qSLEvktoUtw==", + "version": "6.19.1", + "resolved": "https://registry.npmjs.org/@prisma/client/-/client-6.19.1.tgz", + "integrity": "sha512-4SXj4Oo6HyQkLUWT8Ke5R0PTAfVOKip5Roo+6+b2EDTkFg5be0FnBWiuRJc0BC0sRQIWGMLKW1XguhVfW/z3/A==", "hasInstallScript": true, + "license": "Apache-2.0", "engines": { - "node": ">=16.13" + "node": ">=18.18" }, "peerDependencies": { - "prisma": "*" + "prisma": "*", + "typescript": ">=5.1.0" }, "peerDependenciesMeta": { "prisma": { "optional": true + }, + "typescript": { + "optional": true } } }, "exercises/07.remix-component/01.solution.stub-remix/node_modules/prisma": { - "version": "5.16.2", - "resolved": "https://registry.npmjs.org/prisma/-/prisma-5.16.2.tgz", - "integrity": "sha512-rFV/xoBR2hBGGlu4LPLQd4U8WVA+tSAmYyFWGPRVfj+xg7N4kiZV4lSk38htSpF+/IuHKzlrbh4SFk8Z18cI8A==", + "version": "6.19.1", + "resolved": "https://registry.npmjs.org/prisma/-/prisma-6.19.1.tgz", + "integrity": "sha512-XRfmGzh6gtkc/Vq3LqZJcS2884dQQW3UhPo6jNRoiTW95FFQkXFg8vkYEy6og+Pyv0aY7zRQ7Wn1Cvr56XjhQQ==", "hasInstallScript": true, + "license": "Apache-2.0", "dependencies": { - "@prisma/engines": "5.16.2" + "@prisma/config": "6.19.1", + "@prisma/engines": "6.19.1" }, "bin": { "prisma": "build/index.js" }, "engines": { - "node": ">=16.13" + "node": ">=18.18" + }, + "peerDependencies": { + "typescript": ">=5.1.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, "exercises/07.remix-component/02.problem.multiple-routes": { @@ -4285,9 +4736,8 @@ "@conform-to/zod": "^0.9.0", "@epic-web/remember": "^1.1.0", "@epic-web/totp": "^1.1.2", - "@epic-web/workshop-utils": "^4.21.1", "@paralleldrive/cuid2": "^2.2.2", - "@prisma/client": "^5.16.2", + "@prisma/client": "^6.19.1", "@radix-ui/react-checkbox": "^1.1.1", "@radix-ui/react-dropdown-menu": "^2.1.1", "@radix-ui/react-label": "^2.1.0", @@ -4314,13 +4764,13 @@ "glob": "^11.0.0", "isbot": "^5.1.12", "morgan": "^1.10.0", - "prisma": "^5.16.2", + "prisma": "^6.19.1", "qrcode": "^1.5.3", "react": "^18.3.1", "react-dom": "^18.3.1", "remix-auth": "^3.7.0", "remix-auth-form": "^1.5.0", - "remix-auth-github": "^1.7.0", + "remix-auth-github": "1.7.0", "remix-utils": "^7.6.0", "sonner": "^1.5.0", "source-map-support": "^0.5.21", @@ -4366,7 +4816,7 @@ "execa": "^9.3.0", "fs-extra": "^11.2.0", "jsdom": "^24.1.0", - "msw": "^2.3.1", + "msw": "^2.12.4", "node-html-parser": "^6.1.13", "npm-run-all": "^4.1.5", "prettier": "^3.3.2", @@ -4380,35 +4830,50 @@ } }, "exercises/07.remix-component/02.problem.multiple-routes/node_modules/@prisma/client": { - "version": "5.16.2", - "resolved": "https://registry.npmjs.org/@prisma/client/-/client-5.16.2.tgz", - "integrity": "sha512-+1lmkhR9gHWcTC5oghm2ZKpWljyWdzfazCVlLKUWXVmwHSf52g81aZ8qb6Km5Bs025yBi7puLp3qSLEvktoUtw==", + "version": "6.19.1", + "resolved": "https://registry.npmjs.org/@prisma/client/-/client-6.19.1.tgz", + "integrity": "sha512-4SXj4Oo6HyQkLUWT8Ke5R0PTAfVOKip5Roo+6+b2EDTkFg5be0FnBWiuRJc0BC0sRQIWGMLKW1XguhVfW/z3/A==", "hasInstallScript": true, + "license": "Apache-2.0", "engines": { - "node": ">=16.13" + "node": ">=18.18" }, "peerDependencies": { - "prisma": "*" + "prisma": "*", + "typescript": ">=5.1.0" }, "peerDependenciesMeta": { "prisma": { "optional": true + }, + "typescript": { + "optional": true } } }, "exercises/07.remix-component/02.problem.multiple-routes/node_modules/prisma": { - "version": "5.16.2", - "resolved": "https://registry.npmjs.org/prisma/-/prisma-5.16.2.tgz", - "integrity": "sha512-rFV/xoBR2hBGGlu4LPLQd4U8WVA+tSAmYyFWGPRVfj+xg7N4kiZV4lSk38htSpF+/IuHKzlrbh4SFk8Z18cI8A==", + "version": "6.19.1", + "resolved": "https://registry.npmjs.org/prisma/-/prisma-6.19.1.tgz", + "integrity": "sha512-XRfmGzh6gtkc/Vq3LqZJcS2884dQQW3UhPo6jNRoiTW95FFQkXFg8vkYEy6og+Pyv0aY7zRQ7Wn1Cvr56XjhQQ==", "hasInstallScript": true, + "license": "Apache-2.0", "dependencies": { - "@prisma/engines": "5.16.2" + "@prisma/config": "6.19.1", + "@prisma/engines": "6.19.1" }, "bin": { "prisma": "build/index.js" }, "engines": { - "node": ">=16.13" + "node": ">=18.18" + }, + "peerDependencies": { + "typescript": ">=5.1.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, "exercises/07.remix-component/02.solution.multiple-routes": { @@ -4418,9 +4883,8 @@ "@conform-to/zod": "^0.9.0", "@epic-web/remember": "^1.1.0", "@epic-web/totp": "^1.1.2", - "@epic-web/workshop-utils": "^4.21.1", "@paralleldrive/cuid2": "^2.2.2", - "@prisma/client": "^5.16.2", + "@prisma/client": "^6.19.1", "@radix-ui/react-checkbox": "^1.1.1", "@radix-ui/react-dropdown-menu": "^2.1.1", "@radix-ui/react-label": "^2.1.0", @@ -4447,13 +4911,13 @@ "glob": "^11.0.0", "isbot": "^5.1.12", "morgan": "^1.10.0", - "prisma": "^5.16.2", + "prisma": "^6.19.1", "qrcode": "^1.5.3", "react": "^18.3.1", "react-dom": "^18.3.1", "remix-auth": "^3.7.0", "remix-auth-form": "^1.5.0", - "remix-auth-github": "^1.7.0", + "remix-auth-github": "1.7.0", "remix-utils": "^7.6.0", "sonner": "^1.5.0", "source-map-support": "^0.5.21", @@ -4499,7 +4963,7 @@ "execa": "^9.3.0", "fs-extra": "^11.2.0", "jsdom": "^24.1.0", - "msw": "^2.3.1", + "msw": "^2.12.4", "node-html-parser": "^6.1.13", "npm-run-all": "^4.1.5", "prettier": "^3.3.2", @@ -4513,35 +4977,50 @@ } }, "exercises/07.remix-component/02.solution.multiple-routes/node_modules/@prisma/client": { - "version": "5.16.2", - "resolved": "https://registry.npmjs.org/@prisma/client/-/client-5.16.2.tgz", - "integrity": "sha512-+1lmkhR9gHWcTC5oghm2ZKpWljyWdzfazCVlLKUWXVmwHSf52g81aZ8qb6Km5Bs025yBi7puLp3qSLEvktoUtw==", + "version": "6.19.1", + "resolved": "https://registry.npmjs.org/@prisma/client/-/client-6.19.1.tgz", + "integrity": "sha512-4SXj4Oo6HyQkLUWT8Ke5R0PTAfVOKip5Roo+6+b2EDTkFg5be0FnBWiuRJc0BC0sRQIWGMLKW1XguhVfW/z3/A==", "hasInstallScript": true, + "license": "Apache-2.0", "engines": { - "node": ">=16.13" + "node": ">=18.18" }, "peerDependencies": { - "prisma": "*" + "prisma": "*", + "typescript": ">=5.1.0" }, "peerDependenciesMeta": { "prisma": { "optional": true + }, + "typescript": { + "optional": true } } }, "exercises/07.remix-component/02.solution.multiple-routes/node_modules/prisma": { - "version": "5.16.2", - "resolved": "https://registry.npmjs.org/prisma/-/prisma-5.16.2.tgz", - "integrity": "sha512-rFV/xoBR2hBGGlu4LPLQd4U8WVA+tSAmYyFWGPRVfj+xg7N4kiZV4lSk38htSpF+/IuHKzlrbh4SFk8Z18cI8A==", + "version": "6.19.1", + "resolved": "https://registry.npmjs.org/prisma/-/prisma-6.19.1.tgz", + "integrity": "sha512-XRfmGzh6gtkc/Vq3LqZJcS2884dQQW3UhPo6jNRoiTW95FFQkXFg8vkYEy6og+Pyv0aY7zRQ7Wn1Cvr56XjhQQ==", "hasInstallScript": true, + "license": "Apache-2.0", "dependencies": { - "@prisma/engines": "5.16.2" + "@prisma/config": "6.19.1", + "@prisma/engines": "6.19.1" }, "bin": { "prisma": "build/index.js" }, "engines": { - "node": ">=16.13" + "node": ">=18.18" + }, + "peerDependencies": { + "typescript": ">=5.1.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, "exercises/08.http-mocking/01.problem.start-server": { @@ -4551,9 +5030,8 @@ "@conform-to/zod": "^0.9.0", "@epic-web/remember": "^1.1.0", "@epic-web/totp": "^1.1.2", - "@epic-web/workshop-utils": "^4.21.1", "@paralleldrive/cuid2": "^2.2.2", - "@prisma/client": "^5.16.2", + "@prisma/client": "^6.19.1", "@radix-ui/react-checkbox": "^1.1.1", "@radix-ui/react-dropdown-menu": "^2.1.1", "@radix-ui/react-label": "^2.1.0", @@ -4580,13 +5058,13 @@ "glob": "^11.0.0", "isbot": "^5.1.12", "morgan": "^1.10.0", - "prisma": "^5.16.2", + "prisma": "^6.19.1", "qrcode": "^1.5.3", "react": "^18.3.1", "react-dom": "^18.3.1", "remix-auth": "^3.7.0", "remix-auth-form": "^1.5.0", - "remix-auth-github": "^1.7.0", + "remix-auth-github": "1.7.0", "remix-utils": "^7.6.0", "sonner": "^1.5.0", "source-map-support": "^0.5.21", @@ -4632,7 +5110,7 @@ "execa": "^9.3.0", "fs-extra": "^11.2.0", "jsdom": "^24.1.0", - "msw": "^2.3.1", + "msw": "^2.12.4", "node-html-parser": "^6.1.13", "npm-run-all": "^4.1.5", "prettier": "^3.3.2", @@ -4646,35 +5124,50 @@ } }, "exercises/08.http-mocking/01.problem.start-server/node_modules/@prisma/client": { - "version": "5.16.2", - "resolved": "https://registry.npmjs.org/@prisma/client/-/client-5.16.2.tgz", - "integrity": "sha512-+1lmkhR9gHWcTC5oghm2ZKpWljyWdzfazCVlLKUWXVmwHSf52g81aZ8qb6Km5Bs025yBi7puLp3qSLEvktoUtw==", + "version": "6.19.1", + "resolved": "https://registry.npmjs.org/@prisma/client/-/client-6.19.1.tgz", + "integrity": "sha512-4SXj4Oo6HyQkLUWT8Ke5R0PTAfVOKip5Roo+6+b2EDTkFg5be0FnBWiuRJc0BC0sRQIWGMLKW1XguhVfW/z3/A==", "hasInstallScript": true, + "license": "Apache-2.0", "engines": { - "node": ">=16.13" + "node": ">=18.18" }, "peerDependencies": { - "prisma": "*" + "prisma": "*", + "typescript": ">=5.1.0" }, "peerDependenciesMeta": { "prisma": { "optional": true + }, + "typescript": { + "optional": true } } }, "exercises/08.http-mocking/01.problem.start-server/node_modules/prisma": { - "version": "5.16.2", - "resolved": "https://registry.npmjs.org/prisma/-/prisma-5.16.2.tgz", - "integrity": "sha512-rFV/xoBR2hBGGlu4LPLQd4U8WVA+tSAmYyFWGPRVfj+xg7N4kiZV4lSk38htSpF+/IuHKzlrbh4SFk8Z18cI8A==", + "version": "6.19.1", + "resolved": "https://registry.npmjs.org/prisma/-/prisma-6.19.1.tgz", + "integrity": "sha512-XRfmGzh6gtkc/Vq3LqZJcS2884dQQW3UhPo6jNRoiTW95FFQkXFg8vkYEy6og+Pyv0aY7zRQ7Wn1Cvr56XjhQQ==", "hasInstallScript": true, + "license": "Apache-2.0", "dependencies": { - "@prisma/engines": "5.16.2" + "@prisma/config": "6.19.1", + "@prisma/engines": "6.19.1" }, "bin": { "prisma": "build/index.js" }, "engines": { - "node": ">=16.13" + "node": ">=18.18" + }, + "peerDependencies": { + "typescript": ">=5.1.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, "exercises/08.http-mocking/01.solution.start-server": { @@ -4684,9 +5177,8 @@ "@conform-to/zod": "^0.9.0", "@epic-web/remember": "^1.1.0", "@epic-web/totp": "^1.1.2", - "@epic-web/workshop-utils": "^4.21.1", "@paralleldrive/cuid2": "^2.2.2", - "@prisma/client": "^5.16.2", + "@prisma/client": "^6.19.1", "@radix-ui/react-checkbox": "^1.1.1", "@radix-ui/react-dropdown-menu": "^2.1.1", "@radix-ui/react-label": "^2.1.0", @@ -4713,13 +5205,13 @@ "glob": "^11.0.0", "isbot": "^5.1.12", "morgan": "^1.10.0", - "prisma": "^5.16.2", + "prisma": "^6.19.1", "qrcode": "^1.5.3", "react": "^18.3.1", "react-dom": "^18.3.1", "remix-auth": "^3.7.0", "remix-auth-form": "^1.5.0", - "remix-auth-github": "^1.7.0", + "remix-auth-github": "1.7.0", "remix-utils": "^7.6.0", "sonner": "^1.5.0", "source-map-support": "^0.5.21", @@ -4765,7 +5257,7 @@ "execa": "^9.3.0", "fs-extra": "^11.2.0", "jsdom": "^24.1.0", - "msw": "^2.3.1", + "msw": "^2.12.4", "node-html-parser": "^6.1.13", "npm-run-all": "^4.1.5", "prettier": "^3.3.2", @@ -4779,35 +5271,50 @@ } }, "exercises/08.http-mocking/01.solution.start-server/node_modules/@prisma/client": { - "version": "5.16.2", - "resolved": "https://registry.npmjs.org/@prisma/client/-/client-5.16.2.tgz", - "integrity": "sha512-+1lmkhR9gHWcTC5oghm2ZKpWljyWdzfazCVlLKUWXVmwHSf52g81aZ8qb6Km5Bs025yBi7puLp3qSLEvktoUtw==", + "version": "6.19.1", + "resolved": "https://registry.npmjs.org/@prisma/client/-/client-6.19.1.tgz", + "integrity": "sha512-4SXj4Oo6HyQkLUWT8Ke5R0PTAfVOKip5Roo+6+b2EDTkFg5be0FnBWiuRJc0BC0sRQIWGMLKW1XguhVfW/z3/A==", "hasInstallScript": true, + "license": "Apache-2.0", "engines": { - "node": ">=16.13" + "node": ">=18.18" }, "peerDependencies": { - "prisma": "*" + "prisma": "*", + "typescript": ">=5.1.0" }, "peerDependenciesMeta": { "prisma": { "optional": true + }, + "typescript": { + "optional": true } } }, "exercises/08.http-mocking/01.solution.start-server/node_modules/prisma": { - "version": "5.16.2", - "resolved": "https://registry.npmjs.org/prisma/-/prisma-5.16.2.tgz", - "integrity": "sha512-rFV/xoBR2hBGGlu4LPLQd4U8WVA+tSAmYyFWGPRVfj+xg7N4kiZV4lSk38htSpF+/IuHKzlrbh4SFk8Z18cI8A==", + "version": "6.19.1", + "resolved": "https://registry.npmjs.org/prisma/-/prisma-6.19.1.tgz", + "integrity": "sha512-XRfmGzh6gtkc/Vq3LqZJcS2884dQQW3UhPo6jNRoiTW95FFQkXFg8vkYEy6og+Pyv0aY7zRQ7Wn1Cvr56XjhQQ==", "hasInstallScript": true, + "license": "Apache-2.0", "dependencies": { - "@prisma/engines": "5.16.2" + "@prisma/config": "6.19.1", + "@prisma/engines": "6.19.1" }, "bin": { "prisma": "build/index.js" }, "engines": { - "node": ">=16.13" + "node": ">=18.18" + }, + "peerDependencies": { + "typescript": ">=5.1.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, "exercises/08.http-mocking/02.problem.override-mocks": { @@ -4817,9 +5324,8 @@ "@conform-to/zod": "^0.9.0", "@epic-web/remember": "^1.1.0", "@epic-web/totp": "^1.1.2", - "@epic-web/workshop-utils": "^4.21.1", "@paralleldrive/cuid2": "^2.2.2", - "@prisma/client": "^5.16.2", + "@prisma/client": "^6.19.1", "@radix-ui/react-checkbox": "^1.1.1", "@radix-ui/react-dropdown-menu": "^2.1.1", "@radix-ui/react-label": "^2.1.0", @@ -4846,13 +5352,13 @@ "glob": "^11.0.0", "isbot": "^5.1.12", "morgan": "^1.10.0", - "prisma": "^5.16.2", + "prisma": "^6.19.1", "qrcode": "^1.5.3", "react": "^18.3.1", "react-dom": "^18.3.1", "remix-auth": "^3.7.0", "remix-auth-form": "^1.5.0", - "remix-auth-github": "^1.7.0", + "remix-auth-github": "1.7.0", "remix-utils": "^7.6.0", "sonner": "^1.5.0", "source-map-support": "^0.5.21", @@ -4898,7 +5404,7 @@ "execa": "^9.3.0", "fs-extra": "^11.2.0", "jsdom": "^24.1.0", - "msw": "^2.3.1", + "msw": "^2.12.4", "node-html-parser": "^6.1.13", "npm-run-all": "^4.1.5", "prettier": "^3.3.2", @@ -4912,35 +5418,50 @@ } }, "exercises/08.http-mocking/02.problem.override-mocks/node_modules/@prisma/client": { - "version": "5.16.2", - "resolved": "https://registry.npmjs.org/@prisma/client/-/client-5.16.2.tgz", - "integrity": "sha512-+1lmkhR9gHWcTC5oghm2ZKpWljyWdzfazCVlLKUWXVmwHSf52g81aZ8qb6Km5Bs025yBi7puLp3qSLEvktoUtw==", + "version": "6.19.1", + "resolved": "https://registry.npmjs.org/@prisma/client/-/client-6.19.1.tgz", + "integrity": "sha512-4SXj4Oo6HyQkLUWT8Ke5R0PTAfVOKip5Roo+6+b2EDTkFg5be0FnBWiuRJc0BC0sRQIWGMLKW1XguhVfW/z3/A==", "hasInstallScript": true, + "license": "Apache-2.0", "engines": { - "node": ">=16.13" + "node": ">=18.18" }, "peerDependencies": { - "prisma": "*" + "prisma": "*", + "typescript": ">=5.1.0" }, "peerDependenciesMeta": { "prisma": { "optional": true + }, + "typescript": { + "optional": true } } }, "exercises/08.http-mocking/02.problem.override-mocks/node_modules/prisma": { - "version": "5.16.2", - "resolved": "https://registry.npmjs.org/prisma/-/prisma-5.16.2.tgz", - "integrity": "sha512-rFV/xoBR2hBGGlu4LPLQd4U8WVA+tSAmYyFWGPRVfj+xg7N4kiZV4lSk38htSpF+/IuHKzlrbh4SFk8Z18cI8A==", + "version": "6.19.1", + "resolved": "https://registry.npmjs.org/prisma/-/prisma-6.19.1.tgz", + "integrity": "sha512-XRfmGzh6gtkc/Vq3LqZJcS2884dQQW3UhPo6jNRoiTW95FFQkXFg8vkYEy6og+Pyv0aY7zRQ7Wn1Cvr56XjhQQ==", "hasInstallScript": true, + "license": "Apache-2.0", "dependencies": { - "@prisma/engines": "5.16.2" + "@prisma/config": "6.19.1", + "@prisma/engines": "6.19.1" }, "bin": { "prisma": "build/index.js" }, "engines": { - "node": ">=16.13" + "node": ">=18.18" + }, + "peerDependencies": { + "typescript": ">=5.1.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, "exercises/08.http-mocking/02.solution.override-mocks": { @@ -4950,9 +5471,8 @@ "@conform-to/zod": "^0.9.0", "@epic-web/remember": "^1.1.0", "@epic-web/totp": "^1.1.2", - "@epic-web/workshop-utils": "^4.21.1", "@paralleldrive/cuid2": "^2.2.2", - "@prisma/client": "^5.16.2", + "@prisma/client": "^6.19.1", "@radix-ui/react-checkbox": "^1.1.1", "@radix-ui/react-dropdown-menu": "^2.1.1", "@radix-ui/react-label": "^2.1.0", @@ -4979,13 +5499,13 @@ "glob": "^11.0.0", "isbot": "^5.1.12", "morgan": "^1.10.0", - "prisma": "^5.16.2", + "prisma": "^6.19.1", "qrcode": "^1.5.3", "react": "^18.3.1", "react-dom": "^18.3.1", "remix-auth": "^3.7.0", "remix-auth-form": "^1.5.0", - "remix-auth-github": "^1.7.0", + "remix-auth-github": "1.7.0", "remix-utils": "^7.6.0", "sonner": "^1.5.0", "source-map-support": "^0.5.21", @@ -5031,7 +5551,7 @@ "execa": "^9.3.0", "fs-extra": "^11.2.0", "jsdom": "^24.1.0", - "msw": "^2.3.1", + "msw": "^2.12.4", "node-html-parser": "^6.1.13", "npm-run-all": "^4.1.5", "prettier": "^3.3.2", @@ -5045,35 +5565,50 @@ } }, "exercises/08.http-mocking/02.solution.override-mocks/node_modules/@prisma/client": { - "version": "5.16.2", - "resolved": "https://registry.npmjs.org/@prisma/client/-/client-5.16.2.tgz", - "integrity": "sha512-+1lmkhR9gHWcTC5oghm2ZKpWljyWdzfazCVlLKUWXVmwHSf52g81aZ8qb6Km5Bs025yBi7puLp3qSLEvktoUtw==", + "version": "6.19.1", + "resolved": "https://registry.npmjs.org/@prisma/client/-/client-6.19.1.tgz", + "integrity": "sha512-4SXj4Oo6HyQkLUWT8Ke5R0PTAfVOKip5Roo+6+b2EDTkFg5be0FnBWiuRJc0BC0sRQIWGMLKW1XguhVfW/z3/A==", "hasInstallScript": true, + "license": "Apache-2.0", "engines": { - "node": ">=16.13" + "node": ">=18.18" }, "peerDependencies": { - "prisma": "*" + "prisma": "*", + "typescript": ">=5.1.0" }, "peerDependenciesMeta": { "prisma": { "optional": true + }, + "typescript": { + "optional": true } } }, "exercises/08.http-mocking/02.solution.override-mocks/node_modules/prisma": { - "version": "5.16.2", - "resolved": "https://registry.npmjs.org/prisma/-/prisma-5.16.2.tgz", - "integrity": "sha512-rFV/xoBR2hBGGlu4LPLQd4U8WVA+tSAmYyFWGPRVfj+xg7N4kiZV4lSk38htSpF+/IuHKzlrbh4SFk8Z18cI8A==", + "version": "6.19.1", + "resolved": "https://registry.npmjs.org/prisma/-/prisma-6.19.1.tgz", + "integrity": "sha512-XRfmGzh6gtkc/Vq3LqZJcS2884dQQW3UhPo6jNRoiTW95FFQkXFg8vkYEy6og+Pyv0aY7zRQ7Wn1Cvr56XjhQQ==", "hasInstallScript": true, + "license": "Apache-2.0", "dependencies": { - "@prisma/engines": "5.16.2" + "@prisma/config": "6.19.1", + "@prisma/engines": "6.19.1" }, "bin": { "prisma": "build/index.js" }, "engines": { - "node": ">=16.13" + "node": ">=18.18" + }, + "peerDependencies": { + "typescript": ">=5.1.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, "exercises/08.http-mocking/03.problem.setup": { @@ -5083,9 +5618,8 @@ "@conform-to/zod": "^0.9.0", "@epic-web/remember": "^1.1.0", "@epic-web/totp": "^1.1.2", - "@epic-web/workshop-utils": "^4.21.1", "@paralleldrive/cuid2": "^2.2.2", - "@prisma/client": "^5.16.2", + "@prisma/client": "^6.19.1", "@radix-ui/react-checkbox": "^1.1.1", "@radix-ui/react-dropdown-menu": "^2.1.1", "@radix-ui/react-label": "^2.1.0", @@ -5112,13 +5646,13 @@ "glob": "^11.0.0", "isbot": "^5.1.12", "morgan": "^1.10.0", - "prisma": "^5.16.2", + "prisma": "^6.19.1", "qrcode": "^1.5.3", "react": "^18.3.1", "react-dom": "^18.3.1", "remix-auth": "^3.7.0", "remix-auth-form": "^1.5.0", - "remix-auth-github": "^1.7.0", + "remix-auth-github": "1.7.0", "remix-utils": "^7.6.0", "sonner": "^1.5.0", "source-map-support": "^0.5.21", @@ -5164,7 +5698,7 @@ "execa": "^9.3.0", "fs-extra": "^11.2.0", "jsdom": "^24.1.0", - "msw": "^2.3.1", + "msw": "^2.12.4", "node-html-parser": "^6.1.13", "npm-run-all": "^4.1.5", "prettier": "^3.3.2", @@ -5178,35 +5712,50 @@ } }, "exercises/08.http-mocking/03.problem.setup/node_modules/@prisma/client": { - "version": "5.16.2", - "resolved": "https://registry.npmjs.org/@prisma/client/-/client-5.16.2.tgz", - "integrity": "sha512-+1lmkhR9gHWcTC5oghm2ZKpWljyWdzfazCVlLKUWXVmwHSf52g81aZ8qb6Km5Bs025yBi7puLp3qSLEvktoUtw==", + "version": "6.19.1", + "resolved": "https://registry.npmjs.org/@prisma/client/-/client-6.19.1.tgz", + "integrity": "sha512-4SXj4Oo6HyQkLUWT8Ke5R0PTAfVOKip5Roo+6+b2EDTkFg5be0FnBWiuRJc0BC0sRQIWGMLKW1XguhVfW/z3/A==", "hasInstallScript": true, + "license": "Apache-2.0", "engines": { - "node": ">=16.13" + "node": ">=18.18" }, "peerDependencies": { - "prisma": "*" + "prisma": "*", + "typescript": ">=5.1.0" }, "peerDependenciesMeta": { "prisma": { "optional": true + }, + "typescript": { + "optional": true } } }, "exercises/08.http-mocking/03.problem.setup/node_modules/prisma": { - "version": "5.16.2", - "resolved": "https://registry.npmjs.org/prisma/-/prisma-5.16.2.tgz", - "integrity": "sha512-rFV/xoBR2hBGGlu4LPLQd4U8WVA+tSAmYyFWGPRVfj+xg7N4kiZV4lSk38htSpF+/IuHKzlrbh4SFk8Z18cI8A==", + "version": "6.19.1", + "resolved": "https://registry.npmjs.org/prisma/-/prisma-6.19.1.tgz", + "integrity": "sha512-XRfmGzh6gtkc/Vq3LqZJcS2884dQQW3UhPo6jNRoiTW95FFQkXFg8vkYEy6og+Pyv0aY7zRQ7Wn1Cvr56XjhQQ==", "hasInstallScript": true, + "license": "Apache-2.0", "dependencies": { - "@prisma/engines": "5.16.2" + "@prisma/config": "6.19.1", + "@prisma/engines": "6.19.1" }, "bin": { "prisma": "build/index.js" }, "engines": { - "node": ">=16.13" + "node": ">=18.18" + }, + "peerDependencies": { + "typescript": ">=5.1.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, "exercises/08.http-mocking/03.solution.setup": { @@ -5216,9 +5765,8 @@ "@conform-to/zod": "^0.9.0", "@epic-web/remember": "^1.1.0", "@epic-web/totp": "^1.1.2", - "@epic-web/workshop-utils": "^4.21.1", "@paralleldrive/cuid2": "^2.2.2", - "@prisma/client": "^5.16.2", + "@prisma/client": "^6.19.1", "@radix-ui/react-checkbox": "^1.1.1", "@radix-ui/react-dropdown-menu": "^2.1.1", "@radix-ui/react-label": "^2.1.0", @@ -5245,13 +5793,13 @@ "glob": "^11.0.0", "isbot": "^5.1.12", "morgan": "^1.10.0", - "prisma": "^5.16.2", + "prisma": "^6.19.1", "qrcode": "^1.5.3", "react": "^18.3.1", "react-dom": "^18.3.1", "remix-auth": "^3.7.0", "remix-auth-form": "^1.5.0", - "remix-auth-github": "^1.7.0", + "remix-auth-github": "1.7.0", "remix-utils": "^7.6.0", "sonner": "^1.5.0", "source-map-support": "^0.5.21", @@ -5297,7 +5845,7 @@ "execa": "^9.3.0", "fs-extra": "^11.2.0", "jsdom": "^24.1.0", - "msw": "^2.3.1", + "msw": "^2.12.4", "node-html-parser": "^6.1.13", "npm-run-all": "^4.1.5", "prettier": "^3.3.2", @@ -5311,35 +5859,50 @@ } }, "exercises/08.http-mocking/03.solution.setup/node_modules/@prisma/client": { - "version": "5.16.2", - "resolved": "https://registry.npmjs.org/@prisma/client/-/client-5.16.2.tgz", - "integrity": "sha512-+1lmkhR9gHWcTC5oghm2ZKpWljyWdzfazCVlLKUWXVmwHSf52g81aZ8qb6Km5Bs025yBi7puLp3qSLEvktoUtw==", + "version": "6.19.1", + "resolved": "https://registry.npmjs.org/@prisma/client/-/client-6.19.1.tgz", + "integrity": "sha512-4SXj4Oo6HyQkLUWT8Ke5R0PTAfVOKip5Roo+6+b2EDTkFg5be0FnBWiuRJc0BC0sRQIWGMLKW1XguhVfW/z3/A==", "hasInstallScript": true, + "license": "Apache-2.0", "engines": { - "node": ">=16.13" + "node": ">=18.18" }, "peerDependencies": { - "prisma": "*" + "prisma": "*", + "typescript": ">=5.1.0" }, "peerDependenciesMeta": { "prisma": { "optional": true + }, + "typescript": { + "optional": true } } }, "exercises/08.http-mocking/03.solution.setup/node_modules/prisma": { - "version": "5.16.2", - "resolved": "https://registry.npmjs.org/prisma/-/prisma-5.16.2.tgz", - "integrity": "sha512-rFV/xoBR2hBGGlu4LPLQd4U8WVA+tSAmYyFWGPRVfj+xg7N4kiZV4lSk38htSpF+/IuHKzlrbh4SFk8Z18cI8A==", + "version": "6.19.1", + "resolved": "https://registry.npmjs.org/prisma/-/prisma-6.19.1.tgz", + "integrity": "sha512-XRfmGzh6gtkc/Vq3LqZJcS2884dQQW3UhPo6jNRoiTW95FFQkXFg8vkYEy6og+Pyv0aY7zRQ7Wn1Cvr56XjhQQ==", "hasInstallScript": true, + "license": "Apache-2.0", "dependencies": { - "@prisma/engines": "5.16.2" + "@prisma/config": "6.19.1", + "@prisma/engines": "6.19.1" }, "bin": { "prisma": "build/index.js" }, "engines": { - "node": ">=16.13" + "node": ">=18.18" + }, + "peerDependencies": { + "typescript": ">=5.1.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, "exercises/09.authenticated-integration/01.problem.create-session": { @@ -5349,9 +5912,8 @@ "@conform-to/zod": "^0.9.0", "@epic-web/remember": "^1.1.0", "@epic-web/totp": "^1.1.2", - "@epic-web/workshop-utils": "^4.21.1", "@paralleldrive/cuid2": "^2.2.2", - "@prisma/client": "^5.16.2", + "@prisma/client": "^6.19.1", "@radix-ui/react-checkbox": "^1.1.1", "@radix-ui/react-dropdown-menu": "^2.1.1", "@radix-ui/react-label": "^2.1.0", @@ -5378,13 +5940,13 @@ "glob": "^11.0.0", "isbot": "^5.1.12", "morgan": "^1.10.0", - "prisma": "^5.16.2", + "prisma": "^6.19.1", "qrcode": "^1.5.3", "react": "^18.3.1", "react-dom": "^18.3.1", "remix-auth": "^3.7.0", "remix-auth-form": "^1.5.0", - "remix-auth-github": "^1.7.0", + "remix-auth-github": "1.7.0", "remix-utils": "^7.6.0", "sonner": "^1.5.0", "source-map-support": "^0.5.21", @@ -5430,7 +5992,7 @@ "execa": "^9.3.0", "fs-extra": "^11.2.0", "jsdom": "^24.1.0", - "msw": "^2.3.1", + "msw": "^2.12.4", "node-html-parser": "^6.1.13", "npm-run-all": "^4.1.5", "prettier": "^3.3.2", @@ -5444,35 +6006,50 @@ } }, "exercises/09.authenticated-integration/01.problem.create-session/node_modules/@prisma/client": { - "version": "5.16.2", - "resolved": "https://registry.npmjs.org/@prisma/client/-/client-5.16.2.tgz", - "integrity": "sha512-+1lmkhR9gHWcTC5oghm2ZKpWljyWdzfazCVlLKUWXVmwHSf52g81aZ8qb6Km5Bs025yBi7puLp3qSLEvktoUtw==", + "version": "6.19.1", + "resolved": "https://registry.npmjs.org/@prisma/client/-/client-6.19.1.tgz", + "integrity": "sha512-4SXj4Oo6HyQkLUWT8Ke5R0PTAfVOKip5Roo+6+b2EDTkFg5be0FnBWiuRJc0BC0sRQIWGMLKW1XguhVfW/z3/A==", "hasInstallScript": true, + "license": "Apache-2.0", "engines": { - "node": ">=16.13" + "node": ">=18.18" }, "peerDependencies": { - "prisma": "*" + "prisma": "*", + "typescript": ">=5.1.0" }, "peerDependenciesMeta": { "prisma": { "optional": true + }, + "typescript": { + "optional": true } } }, "exercises/09.authenticated-integration/01.problem.create-session/node_modules/prisma": { - "version": "5.16.2", - "resolved": "https://registry.npmjs.org/prisma/-/prisma-5.16.2.tgz", - "integrity": "sha512-rFV/xoBR2hBGGlu4LPLQd4U8WVA+tSAmYyFWGPRVfj+xg7N4kiZV4lSk38htSpF+/IuHKzlrbh4SFk8Z18cI8A==", + "version": "6.19.1", + "resolved": "https://registry.npmjs.org/prisma/-/prisma-6.19.1.tgz", + "integrity": "sha512-XRfmGzh6gtkc/Vq3LqZJcS2884dQQW3UhPo6jNRoiTW95FFQkXFg8vkYEy6og+Pyv0aY7zRQ7Wn1Cvr56XjhQQ==", "hasInstallScript": true, + "license": "Apache-2.0", "dependencies": { - "@prisma/engines": "5.16.2" + "@prisma/config": "6.19.1", + "@prisma/engines": "6.19.1" }, "bin": { "prisma": "build/index.js" }, "engines": { - "node": ">=16.13" + "node": ">=18.18" + }, + "peerDependencies": { + "typescript": ">=5.1.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, "exercises/09.authenticated-integration/01.solution.create-session": { @@ -5482,9 +6059,8 @@ "@conform-to/zod": "^0.9.0", "@epic-web/remember": "^1.1.0", "@epic-web/totp": "^1.1.2", - "@epic-web/workshop-utils": "^4.21.1", "@paralleldrive/cuid2": "^2.2.2", - "@prisma/client": "^5.16.2", + "@prisma/client": "^6.19.1", "@radix-ui/react-checkbox": "^1.1.1", "@radix-ui/react-dropdown-menu": "^2.1.1", "@radix-ui/react-label": "^2.1.0", @@ -5511,13 +6087,13 @@ "glob": "^11.0.0", "isbot": "^5.1.12", "morgan": "^1.10.0", - "prisma": "^5.16.2", + "prisma": "^6.19.1", "qrcode": "^1.5.3", "react": "^18.3.1", "react-dom": "^18.3.1", "remix-auth": "^3.7.0", "remix-auth-form": "^1.5.0", - "remix-auth-github": "^1.7.0", + "remix-auth-github": "1.7.0", "remix-utils": "^7.6.0", "sonner": "^1.5.0", "source-map-support": "^0.5.21", @@ -5563,7 +6139,7 @@ "execa": "^9.3.0", "fs-extra": "^11.2.0", "jsdom": "^24.1.0", - "msw": "^2.3.1", + "msw": "^2.12.4", "node-html-parser": "^6.1.13", "npm-run-all": "^4.1.5", "prettier": "^3.3.2", @@ -5577,35 +6153,50 @@ } }, "exercises/09.authenticated-integration/01.solution.create-session/node_modules/@prisma/client": { - "version": "5.16.2", - "resolved": "https://registry.npmjs.org/@prisma/client/-/client-5.16.2.tgz", - "integrity": "sha512-+1lmkhR9gHWcTC5oghm2ZKpWljyWdzfazCVlLKUWXVmwHSf52g81aZ8qb6Km5Bs025yBi7puLp3qSLEvktoUtw==", + "version": "6.19.1", + "resolved": "https://registry.npmjs.org/@prisma/client/-/client-6.19.1.tgz", + "integrity": "sha512-4SXj4Oo6HyQkLUWT8Ke5R0PTAfVOKip5Roo+6+b2EDTkFg5be0FnBWiuRJc0BC0sRQIWGMLKW1XguhVfW/z3/A==", "hasInstallScript": true, + "license": "Apache-2.0", "engines": { - "node": ">=16.13" + "node": ">=18.18" }, "peerDependencies": { - "prisma": "*" + "prisma": "*", + "typescript": ">=5.1.0" }, "peerDependenciesMeta": { "prisma": { "optional": true + }, + "typescript": { + "optional": true } } }, "exercises/09.authenticated-integration/01.solution.create-session/node_modules/prisma": { - "version": "5.16.2", - "resolved": "https://registry.npmjs.org/prisma/-/prisma-5.16.2.tgz", - "integrity": "sha512-rFV/xoBR2hBGGlu4LPLQd4U8WVA+tSAmYyFWGPRVfj+xg7N4kiZV4lSk38htSpF+/IuHKzlrbh4SFk8Z18cI8A==", + "version": "6.19.1", + "resolved": "https://registry.npmjs.org/prisma/-/prisma-6.19.1.tgz", + "integrity": "sha512-XRfmGzh6gtkc/Vq3LqZJcS2884dQQW3UhPo6jNRoiTW95FFQkXFg8vkYEy6og+Pyv0aY7zRQ7Wn1Cvr56XjhQQ==", "hasInstallScript": true, + "license": "Apache-2.0", "dependencies": { - "@prisma/engines": "5.16.2" + "@prisma/config": "6.19.1", + "@prisma/engines": "6.19.1" }, "bin": { "prisma": "build/index.js" }, "engines": { - "node": ">=16.13" + "node": ">=18.18" + }, + "peerDependencies": { + "typescript": ">=5.1.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, "exercises/09.authenticated-integration/02.problem.assert": { @@ -5615,9 +6206,8 @@ "@conform-to/zod": "^0.9.0", "@epic-web/remember": "^1.1.0", "@epic-web/totp": "^1.1.2", - "@epic-web/workshop-utils": "^4.21.1", "@paralleldrive/cuid2": "^2.2.2", - "@prisma/client": "^5.16.2", + "@prisma/client": "^6.19.1", "@radix-ui/react-checkbox": "^1.1.1", "@radix-ui/react-dropdown-menu": "^2.1.1", "@radix-ui/react-label": "^2.1.0", @@ -5644,13 +6234,13 @@ "glob": "^11.0.0", "isbot": "^5.1.12", "morgan": "^1.10.0", - "prisma": "^5.16.2", + "prisma": "^6.19.1", "qrcode": "^1.5.3", "react": "^18.3.1", "react-dom": "^18.3.1", "remix-auth": "^3.7.0", "remix-auth-form": "^1.5.0", - "remix-auth-github": "^1.7.0", + "remix-auth-github": "1.7.0", "remix-utils": "^7.6.0", "sonner": "^1.5.0", "source-map-support": "^0.5.21", @@ -5696,7 +6286,7 @@ "execa": "^9.3.0", "fs-extra": "^11.2.0", "jsdom": "^24.1.0", - "msw": "^2.3.1", + "msw": "^2.12.4", "node-html-parser": "^6.1.13", "npm-run-all": "^4.1.5", "prettier": "^3.3.2", @@ -5710,35 +6300,50 @@ } }, "exercises/09.authenticated-integration/02.problem.assert/node_modules/@prisma/client": { - "version": "5.16.2", - "resolved": "https://registry.npmjs.org/@prisma/client/-/client-5.16.2.tgz", - "integrity": "sha512-+1lmkhR9gHWcTC5oghm2ZKpWljyWdzfazCVlLKUWXVmwHSf52g81aZ8qb6Km5Bs025yBi7puLp3qSLEvktoUtw==", + "version": "6.19.1", + "resolved": "https://registry.npmjs.org/@prisma/client/-/client-6.19.1.tgz", + "integrity": "sha512-4SXj4Oo6HyQkLUWT8Ke5R0PTAfVOKip5Roo+6+b2EDTkFg5be0FnBWiuRJc0BC0sRQIWGMLKW1XguhVfW/z3/A==", "hasInstallScript": true, + "license": "Apache-2.0", "engines": { - "node": ">=16.13" + "node": ">=18.18" }, "peerDependencies": { - "prisma": "*" + "prisma": "*", + "typescript": ">=5.1.0" }, "peerDependenciesMeta": { "prisma": { "optional": true + }, + "typescript": { + "optional": true } } }, "exercises/09.authenticated-integration/02.problem.assert/node_modules/prisma": { - "version": "5.16.2", - "resolved": "https://registry.npmjs.org/prisma/-/prisma-5.16.2.tgz", - "integrity": "sha512-rFV/xoBR2hBGGlu4LPLQd4U8WVA+tSAmYyFWGPRVfj+xg7N4kiZV4lSk38htSpF+/IuHKzlrbh4SFk8Z18cI8A==", + "version": "6.19.1", + "resolved": "https://registry.npmjs.org/prisma/-/prisma-6.19.1.tgz", + "integrity": "sha512-XRfmGzh6gtkc/Vq3LqZJcS2884dQQW3UhPo6jNRoiTW95FFQkXFg8vkYEy6og+Pyv0aY7zRQ7Wn1Cvr56XjhQQ==", "hasInstallScript": true, + "license": "Apache-2.0", "dependencies": { - "@prisma/engines": "5.16.2" + "@prisma/config": "6.19.1", + "@prisma/engines": "6.19.1" }, "bin": { "prisma": "build/index.js" }, "engines": { - "node": ">=16.13" + "node": ">=18.18" + }, + "peerDependencies": { + "typescript": ">=5.1.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, "exercises/09.authenticated-integration/02.solution.assert": { @@ -5748,9 +6353,8 @@ "@conform-to/zod": "^0.9.0", "@epic-web/remember": "^1.1.0", "@epic-web/totp": "^1.1.2", - "@epic-web/workshop-utils": "^4.21.1", "@paralleldrive/cuid2": "^2.2.2", - "@prisma/client": "^5.16.2", + "@prisma/client": "^6.19.1", "@radix-ui/react-checkbox": "^1.1.1", "@radix-ui/react-dropdown-menu": "^2.1.1", "@radix-ui/react-label": "^2.1.0", @@ -5777,13 +6381,13 @@ "glob": "^11.0.0", "isbot": "^5.1.12", "morgan": "^1.10.0", - "prisma": "^5.16.2", + "prisma": "^6.19.1", "qrcode": "^1.5.3", "react": "^18.3.1", "react-dom": "^18.3.1", "remix-auth": "^3.7.0", "remix-auth-form": "^1.5.0", - "remix-auth-github": "^1.7.0", + "remix-auth-github": "1.7.0", "remix-utils": "^7.6.0", "sonner": "^1.5.0", "source-map-support": "^0.5.21", @@ -5829,7 +6433,7 @@ "execa": "^9.3.0", "fs-extra": "^11.2.0", "jsdom": "^24.1.0", - "msw": "^2.3.1", + "msw": "^2.12.4", "node-html-parser": "^6.1.13", "npm-run-all": "^4.1.5", "prettier": "^3.3.2", @@ -5843,35 +6447,50 @@ } }, "exercises/09.authenticated-integration/02.solution.assert/node_modules/@prisma/client": { - "version": "5.16.2", - "resolved": "https://registry.npmjs.org/@prisma/client/-/client-5.16.2.tgz", - "integrity": "sha512-+1lmkhR9gHWcTC5oghm2ZKpWljyWdzfazCVlLKUWXVmwHSf52g81aZ8qb6Km5Bs025yBi7puLp3qSLEvktoUtw==", + "version": "6.19.1", + "resolved": "https://registry.npmjs.org/@prisma/client/-/client-6.19.1.tgz", + "integrity": "sha512-4SXj4Oo6HyQkLUWT8Ke5R0PTAfVOKip5Roo+6+b2EDTkFg5be0FnBWiuRJc0BC0sRQIWGMLKW1XguhVfW/z3/A==", "hasInstallScript": true, + "license": "Apache-2.0", "engines": { - "node": ">=16.13" + "node": ">=18.18" }, "peerDependencies": { - "prisma": "*" + "prisma": "*", + "typescript": ">=5.1.0" }, "peerDependenciesMeta": { "prisma": { "optional": true + }, + "typescript": { + "optional": true } } }, "exercises/09.authenticated-integration/02.solution.assert/node_modules/prisma": { - "version": "5.16.2", - "resolved": "https://registry.npmjs.org/prisma/-/prisma-5.16.2.tgz", - "integrity": "sha512-rFV/xoBR2hBGGlu4LPLQd4U8WVA+tSAmYyFWGPRVfj+xg7N4kiZV4lSk38htSpF+/IuHKzlrbh4SFk8Z18cI8A==", + "version": "6.19.1", + "resolved": "https://registry.npmjs.org/prisma/-/prisma-6.19.1.tgz", + "integrity": "sha512-XRfmGzh6gtkc/Vq3LqZJcS2884dQQW3UhPo6jNRoiTW95FFQkXFg8vkYEy6og+Pyv0aY7zRQ7Wn1Cvr56XjhQQ==", "hasInstallScript": true, + "license": "Apache-2.0", "dependencies": { - "@prisma/engines": "5.16.2" + "@prisma/config": "6.19.1", + "@prisma/engines": "6.19.1" }, "bin": { "prisma": "build/index.js" }, "engines": { - "node": ">=16.13" + "node": ">=18.18" + }, + "peerDependencies": { + "typescript": ">=5.1.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, "exercises/09.authenticated-integration/03.problem.routes": { @@ -5881,9 +6500,8 @@ "@conform-to/zod": "^0.9.0", "@epic-web/remember": "^1.1.0", "@epic-web/totp": "^1.1.2", - "@epic-web/workshop-utils": "^4.21.1", "@paralleldrive/cuid2": "^2.2.2", - "@prisma/client": "^5.16.2", + "@prisma/client": "^6.19.1", "@radix-ui/react-checkbox": "^1.1.1", "@radix-ui/react-dropdown-menu": "^2.1.1", "@radix-ui/react-label": "^2.1.0", @@ -5910,13 +6528,13 @@ "glob": "^11.0.0", "isbot": "^5.1.12", "morgan": "^1.10.0", - "prisma": "^5.16.2", + "prisma": "^6.19.1", "qrcode": "^1.5.3", "react": "^18.3.1", "react-dom": "^18.3.1", "remix-auth": "^3.7.0", "remix-auth-form": "^1.5.0", - "remix-auth-github": "^1.7.0", + "remix-auth-github": "1.7.0", "remix-utils": "^7.6.0", "sonner": "^1.5.0", "source-map-support": "^0.5.21", @@ -5962,7 +6580,7 @@ "execa": "^9.3.0", "fs-extra": "^11.2.0", "jsdom": "^24.1.0", - "msw": "^2.3.1", + "msw": "^2.12.4", "node-html-parser": "^6.1.13", "npm-run-all": "^4.1.5", "prettier": "^3.3.2", @@ -5976,35 +6594,50 @@ } }, "exercises/09.authenticated-integration/03.problem.routes/node_modules/@prisma/client": { - "version": "5.16.2", - "resolved": "https://registry.npmjs.org/@prisma/client/-/client-5.16.2.tgz", - "integrity": "sha512-+1lmkhR9gHWcTC5oghm2ZKpWljyWdzfazCVlLKUWXVmwHSf52g81aZ8qb6Km5Bs025yBi7puLp3qSLEvktoUtw==", + "version": "6.19.1", + "resolved": "https://registry.npmjs.org/@prisma/client/-/client-6.19.1.tgz", + "integrity": "sha512-4SXj4Oo6HyQkLUWT8Ke5R0PTAfVOKip5Roo+6+b2EDTkFg5be0FnBWiuRJc0BC0sRQIWGMLKW1XguhVfW/z3/A==", "hasInstallScript": true, + "license": "Apache-2.0", "engines": { - "node": ">=16.13" + "node": ">=18.18" }, "peerDependencies": { - "prisma": "*" + "prisma": "*", + "typescript": ">=5.1.0" }, "peerDependenciesMeta": { "prisma": { "optional": true + }, + "typescript": { + "optional": true } } }, "exercises/09.authenticated-integration/03.problem.routes/node_modules/prisma": { - "version": "5.16.2", - "resolved": "https://registry.npmjs.org/prisma/-/prisma-5.16.2.tgz", - "integrity": "sha512-rFV/xoBR2hBGGlu4LPLQd4U8WVA+tSAmYyFWGPRVfj+xg7N4kiZV4lSk38htSpF+/IuHKzlrbh4SFk8Z18cI8A==", + "version": "6.19.1", + "resolved": "https://registry.npmjs.org/prisma/-/prisma-6.19.1.tgz", + "integrity": "sha512-XRfmGzh6gtkc/Vq3LqZJcS2884dQQW3UhPo6jNRoiTW95FFQkXFg8vkYEy6og+Pyv0aY7zRQ7Wn1Cvr56XjhQQ==", "hasInstallScript": true, + "license": "Apache-2.0", "dependencies": { - "@prisma/engines": "5.16.2" + "@prisma/config": "6.19.1", + "@prisma/engines": "6.19.1" }, "bin": { "prisma": "build/index.js" }, "engines": { - "node": ">=16.13" + "node": ">=18.18" + }, + "peerDependencies": { + "typescript": ">=5.1.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, "exercises/09.authenticated-integration/03.solution.routes": { @@ -6014,9 +6647,8 @@ "@conform-to/zod": "^0.9.0", "@epic-web/remember": "^1.1.0", "@epic-web/totp": "^1.1.2", - "@epic-web/workshop-utils": "^4.21.1", "@paralleldrive/cuid2": "^2.2.2", - "@prisma/client": "^5.16.2", + "@prisma/client": "^6.19.1", "@radix-ui/react-checkbox": "^1.1.1", "@radix-ui/react-dropdown-menu": "^2.1.1", "@radix-ui/react-label": "^2.1.0", @@ -6043,13 +6675,13 @@ "glob": "^11.0.0", "isbot": "^5.1.12", "morgan": "^1.10.0", - "prisma": "^5.16.2", + "prisma": "^6.19.1", "qrcode": "^1.5.3", "react": "^18.3.1", "react-dom": "^18.3.1", "remix-auth": "^3.7.0", "remix-auth-form": "^1.5.0", - "remix-auth-github": "^1.7.0", + "remix-auth-github": "1.7.0", "remix-utils": "^7.6.0", "sonner": "^1.5.0", "source-map-support": "^0.5.21", @@ -6095,7 +6727,7 @@ "execa": "^9.3.0", "fs-extra": "^11.2.0", "jsdom": "^24.1.0", - "msw": "^2.3.1", + "msw": "^2.12.4", "node-html-parser": "^6.1.13", "npm-run-all": "^4.1.5", "prettier": "^3.3.2", @@ -6109,35 +6741,50 @@ } }, "exercises/09.authenticated-integration/03.solution.routes/node_modules/@prisma/client": { - "version": "5.16.2", - "resolved": "https://registry.npmjs.org/@prisma/client/-/client-5.16.2.tgz", - "integrity": "sha512-+1lmkhR9gHWcTC5oghm2ZKpWljyWdzfazCVlLKUWXVmwHSf52g81aZ8qb6Km5Bs025yBi7puLp3qSLEvktoUtw==", + "version": "6.19.1", + "resolved": "https://registry.npmjs.org/@prisma/client/-/client-6.19.1.tgz", + "integrity": "sha512-4SXj4Oo6HyQkLUWT8Ke5R0PTAfVOKip5Roo+6+b2EDTkFg5be0FnBWiuRJc0BC0sRQIWGMLKW1XguhVfW/z3/A==", "hasInstallScript": true, + "license": "Apache-2.0", "engines": { - "node": ">=16.13" + "node": ">=18.18" }, "peerDependencies": { - "prisma": "*" + "prisma": "*", + "typescript": ">=5.1.0" }, "peerDependenciesMeta": { "prisma": { "optional": true + }, + "typescript": { + "optional": true } } }, "exercises/09.authenticated-integration/03.solution.routes/node_modules/prisma": { - "version": "5.16.2", - "resolved": "https://registry.npmjs.org/prisma/-/prisma-5.16.2.tgz", - "integrity": "sha512-rFV/xoBR2hBGGlu4LPLQd4U8WVA+tSAmYyFWGPRVfj+xg7N4kiZV4lSk38htSpF+/IuHKzlrbh4SFk8Z18cI8A==", + "version": "6.19.1", + "resolved": "https://registry.npmjs.org/prisma/-/prisma-6.19.1.tgz", + "integrity": "sha512-XRfmGzh6gtkc/Vq3LqZJcS2884dQQW3UhPo6jNRoiTW95FFQkXFg8vkYEy6og+Pyv0aY7zRQ7Wn1Cvr56XjhQQ==", "hasInstallScript": true, + "license": "Apache-2.0", "dependencies": { - "@prisma/engines": "5.16.2" + "@prisma/config": "6.19.1", + "@prisma/engines": "6.19.1" }, "bin": { "prisma": "build/index.js" }, "engines": { - "node": ">=16.13" + "node": ">=18.18" + }, + "peerDependencies": { + "typescript": ">=5.1.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, "exercises/10.custom-assertions/01.problem.location": { @@ -6147,9 +6794,8 @@ "@conform-to/zod": "^0.9.0", "@epic-web/remember": "^1.1.0", "@epic-web/totp": "^1.1.2", - "@epic-web/workshop-utils": "^4.21.1", "@paralleldrive/cuid2": "^2.2.2", - "@prisma/client": "^5.16.2", + "@prisma/client": "^6.19.1", "@radix-ui/react-checkbox": "^1.1.1", "@radix-ui/react-dropdown-menu": "^2.1.1", "@radix-ui/react-label": "^2.1.0", @@ -6176,13 +6822,13 @@ "glob": "^11.0.0", "isbot": "^5.1.12", "morgan": "^1.10.0", - "prisma": "^5.16.2", + "prisma": "^6.19.1", "qrcode": "^1.5.3", "react": "^18.3.1", "react-dom": "^18.3.1", "remix-auth": "^3.7.0", "remix-auth-form": "^1.5.0", - "remix-auth-github": "^1.7.0", + "remix-auth-github": "1.7.0", "remix-utils": "^7.6.0", "sonner": "^1.5.0", "source-map-support": "^0.5.21", @@ -6228,7 +6874,7 @@ "execa": "^9.3.0", "fs-extra": "^11.2.0", "jsdom": "^24.1.0", - "msw": "^2.3.1", + "msw": "^2.12.4", "node-html-parser": "^6.1.13", "npm-run-all": "^4.1.5", "prettier": "^3.3.2", @@ -6242,35 +6888,50 @@ } }, "exercises/10.custom-assertions/01.problem.location/node_modules/@prisma/client": { - "version": "5.16.2", - "resolved": "https://registry.npmjs.org/@prisma/client/-/client-5.16.2.tgz", - "integrity": "sha512-+1lmkhR9gHWcTC5oghm2ZKpWljyWdzfazCVlLKUWXVmwHSf52g81aZ8qb6Km5Bs025yBi7puLp3qSLEvktoUtw==", + "version": "6.19.1", + "resolved": "https://registry.npmjs.org/@prisma/client/-/client-6.19.1.tgz", + "integrity": "sha512-4SXj4Oo6HyQkLUWT8Ke5R0PTAfVOKip5Roo+6+b2EDTkFg5be0FnBWiuRJc0BC0sRQIWGMLKW1XguhVfW/z3/A==", "hasInstallScript": true, + "license": "Apache-2.0", "engines": { - "node": ">=16.13" + "node": ">=18.18" }, "peerDependencies": { - "prisma": "*" + "prisma": "*", + "typescript": ">=5.1.0" }, "peerDependenciesMeta": { "prisma": { "optional": true + }, + "typescript": { + "optional": true } } }, "exercises/10.custom-assertions/01.problem.location/node_modules/prisma": { - "version": "5.16.2", - "resolved": "https://registry.npmjs.org/prisma/-/prisma-5.16.2.tgz", - "integrity": "sha512-rFV/xoBR2hBGGlu4LPLQd4U8WVA+tSAmYyFWGPRVfj+xg7N4kiZV4lSk38htSpF+/IuHKzlrbh4SFk8Z18cI8A==", + "version": "6.19.1", + "resolved": "https://registry.npmjs.org/prisma/-/prisma-6.19.1.tgz", + "integrity": "sha512-XRfmGzh6gtkc/Vq3LqZJcS2884dQQW3UhPo6jNRoiTW95FFQkXFg8vkYEy6og+Pyv0aY7zRQ7Wn1Cvr56XjhQQ==", "hasInstallScript": true, + "license": "Apache-2.0", "dependencies": { - "@prisma/engines": "5.16.2" + "@prisma/config": "6.19.1", + "@prisma/engines": "6.19.1" }, "bin": { "prisma": "build/index.js" }, "engines": { - "node": ">=16.13" + "node": ">=18.18" + }, + "peerDependencies": { + "typescript": ">=5.1.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, "exercises/10.custom-assertions/01.solution.location": { @@ -6280,9 +6941,8 @@ "@conform-to/zod": "^0.9.0", "@epic-web/remember": "^1.1.0", "@epic-web/totp": "^1.1.2", - "@epic-web/workshop-utils": "^4.21.1", "@paralleldrive/cuid2": "^2.2.2", - "@prisma/client": "^5.16.2", + "@prisma/client": "^6.19.1", "@radix-ui/react-checkbox": "^1.1.1", "@radix-ui/react-dropdown-menu": "^2.1.1", "@radix-ui/react-label": "^2.1.0", @@ -6309,13 +6969,13 @@ "glob": "^11.0.0", "isbot": "^5.1.12", "morgan": "^1.10.0", - "prisma": "^5.16.2", + "prisma": "^6.19.1", "qrcode": "^1.5.3", "react": "^18.3.1", "react-dom": "^18.3.1", "remix-auth": "^3.7.0", "remix-auth-form": "^1.5.0", - "remix-auth-github": "^1.7.0", + "remix-auth-github": "1.7.0", "remix-utils": "^7.6.0", "sonner": "^1.5.0", "source-map-support": "^0.5.21", @@ -6361,7 +7021,7 @@ "execa": "^9.3.0", "fs-extra": "^11.2.0", "jsdom": "^24.1.0", - "msw": "^2.3.1", + "msw": "^2.12.4", "node-html-parser": "^6.1.13", "npm-run-all": "^4.1.5", "prettier": "^3.3.2", @@ -6375,35 +7035,50 @@ } }, "exercises/10.custom-assertions/01.solution.location/node_modules/@prisma/client": { - "version": "5.16.2", - "resolved": "https://registry.npmjs.org/@prisma/client/-/client-5.16.2.tgz", - "integrity": "sha512-+1lmkhR9gHWcTC5oghm2ZKpWljyWdzfazCVlLKUWXVmwHSf52g81aZ8qb6Km5Bs025yBi7puLp3qSLEvktoUtw==", + "version": "6.19.1", + "resolved": "https://registry.npmjs.org/@prisma/client/-/client-6.19.1.tgz", + "integrity": "sha512-4SXj4Oo6HyQkLUWT8Ke5R0PTAfVOKip5Roo+6+b2EDTkFg5be0FnBWiuRJc0BC0sRQIWGMLKW1XguhVfW/z3/A==", "hasInstallScript": true, + "license": "Apache-2.0", "engines": { - "node": ">=16.13" + "node": ">=18.18" }, "peerDependencies": { - "prisma": "*" + "prisma": "*", + "typescript": ">=5.1.0" }, "peerDependenciesMeta": { "prisma": { "optional": true + }, + "typescript": { + "optional": true } } }, "exercises/10.custom-assertions/01.solution.location/node_modules/prisma": { - "version": "5.16.2", - "resolved": "https://registry.npmjs.org/prisma/-/prisma-5.16.2.tgz", - "integrity": "sha512-rFV/xoBR2hBGGlu4LPLQd4U8WVA+tSAmYyFWGPRVfj+xg7N4kiZV4lSk38htSpF+/IuHKzlrbh4SFk8Z18cI8A==", + "version": "6.19.1", + "resolved": "https://registry.npmjs.org/prisma/-/prisma-6.19.1.tgz", + "integrity": "sha512-XRfmGzh6gtkc/Vq3LqZJcS2884dQQW3UhPo6jNRoiTW95FFQkXFg8vkYEy6og+Pyv0aY7zRQ7Wn1Cvr56XjhQQ==", "hasInstallScript": true, + "license": "Apache-2.0", "dependencies": { - "@prisma/engines": "5.16.2" + "@prisma/config": "6.19.1", + "@prisma/engines": "6.19.1" }, "bin": { "prisma": "build/index.js" }, "engines": { - "node": ">=16.13" + "node": ">=18.18" + }, + "peerDependencies": { + "typescript": ">=5.1.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, "exercises/11.test-db/01.problem.setup": { @@ -6413,9 +7088,8 @@ "@conform-to/zod": "^0.9.0", "@epic-web/remember": "^1.1.0", "@epic-web/totp": "^1.1.2", - "@epic-web/workshop-utils": "^4.21.1", "@paralleldrive/cuid2": "^2.2.2", - "@prisma/client": "^5.16.2", + "@prisma/client": "^6.19.1", "@radix-ui/react-checkbox": "^1.1.1", "@radix-ui/react-dropdown-menu": "^2.1.1", "@radix-ui/react-label": "^2.1.0", @@ -6442,13 +7116,13 @@ "glob": "^11.0.0", "isbot": "^5.1.12", "morgan": "^1.10.0", - "prisma": "^5.16.2", + "prisma": "^6.19.1", "qrcode": "^1.5.3", "react": "^18.3.1", "react-dom": "^18.3.1", "remix-auth": "^3.7.0", "remix-auth-form": "^1.5.0", - "remix-auth-github": "^1.7.0", + "remix-auth-github": "1.7.0", "remix-utils": "^7.6.0", "sonner": "^1.5.0", "source-map-support": "^0.5.21", @@ -6494,7 +7168,7 @@ "execa": "^9.3.0", "fs-extra": "^11.2.0", "jsdom": "^24.1.0", - "msw": "^2.3.1", + "msw": "^2.12.4", "node-html-parser": "^6.1.13", "npm-run-all": "^4.1.5", "prettier": "^3.3.2", @@ -6508,35 +7182,50 @@ } }, "exercises/11.test-db/01.problem.setup/node_modules/@prisma/client": { - "version": "5.16.2", - "resolved": "https://registry.npmjs.org/@prisma/client/-/client-5.16.2.tgz", - "integrity": "sha512-+1lmkhR9gHWcTC5oghm2ZKpWljyWdzfazCVlLKUWXVmwHSf52g81aZ8qb6Km5Bs025yBi7puLp3qSLEvktoUtw==", + "version": "6.19.1", + "resolved": "https://registry.npmjs.org/@prisma/client/-/client-6.19.1.tgz", + "integrity": "sha512-4SXj4Oo6HyQkLUWT8Ke5R0PTAfVOKip5Roo+6+b2EDTkFg5be0FnBWiuRJc0BC0sRQIWGMLKW1XguhVfW/z3/A==", "hasInstallScript": true, + "license": "Apache-2.0", "engines": { - "node": ">=16.13" + "node": ">=18.18" }, "peerDependencies": { - "prisma": "*" + "prisma": "*", + "typescript": ">=5.1.0" }, "peerDependenciesMeta": { "prisma": { "optional": true + }, + "typescript": { + "optional": true } } }, "exercises/11.test-db/01.problem.setup/node_modules/prisma": { - "version": "5.16.2", - "resolved": "https://registry.npmjs.org/prisma/-/prisma-5.16.2.tgz", - "integrity": "sha512-rFV/xoBR2hBGGlu4LPLQd4U8WVA+tSAmYyFWGPRVfj+xg7N4kiZV4lSk38htSpF+/IuHKzlrbh4SFk8Z18cI8A==", + "version": "6.19.1", + "resolved": "https://registry.npmjs.org/prisma/-/prisma-6.19.1.tgz", + "integrity": "sha512-XRfmGzh6gtkc/Vq3LqZJcS2884dQQW3UhPo6jNRoiTW95FFQkXFg8vkYEy6og+Pyv0aY7zRQ7Wn1Cvr56XjhQQ==", "hasInstallScript": true, + "license": "Apache-2.0", "dependencies": { - "@prisma/engines": "5.16.2" + "@prisma/config": "6.19.1", + "@prisma/engines": "6.19.1" }, "bin": { "prisma": "build/index.js" }, "engines": { - "node": ">=16.13" + "node": ">=18.18" + }, + "peerDependencies": { + "typescript": ">=5.1.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, "exercises/11.test-db/01.solution.setup": { @@ -6546,9 +7235,8 @@ "@conform-to/zod": "^0.9.0", "@epic-web/remember": "^1.1.0", "@epic-web/totp": "^1.1.2", - "@epic-web/workshop-utils": "^4.21.1", "@paralleldrive/cuid2": "^2.2.2", - "@prisma/client": "^5.16.2", + "@prisma/client": "^6.19.1", "@radix-ui/react-checkbox": "^1.1.1", "@radix-ui/react-dropdown-menu": "^2.1.1", "@radix-ui/react-label": "^2.1.0", @@ -6575,13 +7263,13 @@ "glob": "^11.0.0", "isbot": "^5.1.12", "morgan": "^1.10.0", - "prisma": "^5.16.2", + "prisma": "^6.19.1", "qrcode": "^1.5.3", "react": "^18.3.1", "react-dom": "^18.3.1", "remix-auth": "^3.7.0", "remix-auth-form": "^1.5.0", - "remix-auth-github": "^1.7.0", + "remix-auth-github": "1.7.0", "remix-utils": "^7.6.0", "sonner": "^1.5.0", "source-map-support": "^0.5.21", @@ -6627,7 +7315,7 @@ "execa": "^9.3.0", "fs-extra": "^11.2.0", "jsdom": "^24.1.0", - "msw": "^2.3.1", + "msw": "^2.12.4", "node-html-parser": "^6.1.13", "npm-run-all": "^4.1.5", "prettier": "^3.3.2", @@ -6641,35 +7329,50 @@ } }, "exercises/11.test-db/01.solution.setup/node_modules/@prisma/client": { - "version": "5.16.2", - "resolved": "https://registry.npmjs.org/@prisma/client/-/client-5.16.2.tgz", - "integrity": "sha512-+1lmkhR9gHWcTC5oghm2ZKpWljyWdzfazCVlLKUWXVmwHSf52g81aZ8qb6Km5Bs025yBi7puLp3qSLEvktoUtw==", + "version": "6.19.1", + "resolved": "https://registry.npmjs.org/@prisma/client/-/client-6.19.1.tgz", + "integrity": "sha512-4SXj4Oo6HyQkLUWT8Ke5R0PTAfVOKip5Roo+6+b2EDTkFg5be0FnBWiuRJc0BC0sRQIWGMLKW1XguhVfW/z3/A==", "hasInstallScript": true, + "license": "Apache-2.0", "engines": { - "node": ">=16.13" + "node": ">=18.18" }, "peerDependencies": { - "prisma": "*" + "prisma": "*", + "typescript": ">=5.1.0" }, "peerDependenciesMeta": { "prisma": { "optional": true + }, + "typescript": { + "optional": true } } }, "exercises/11.test-db/01.solution.setup/node_modules/prisma": { - "version": "5.16.2", - "resolved": "https://registry.npmjs.org/prisma/-/prisma-5.16.2.tgz", - "integrity": "sha512-rFV/xoBR2hBGGlu4LPLQd4U8WVA+tSAmYyFWGPRVfj+xg7N4kiZV4lSk38htSpF+/IuHKzlrbh4SFk8Z18cI8A==", + "version": "6.19.1", + "resolved": "https://registry.npmjs.org/prisma/-/prisma-6.19.1.tgz", + "integrity": "sha512-XRfmGzh6gtkc/Vq3LqZJcS2884dQQW3UhPo6jNRoiTW95FFQkXFg8vkYEy6og+Pyv0aY7zRQ7Wn1Cvr56XjhQQ==", "hasInstallScript": true, + "license": "Apache-2.0", "dependencies": { - "@prisma/engines": "5.16.2" + "@prisma/config": "6.19.1", + "@prisma/engines": "6.19.1" }, "bin": { "prisma": "build/index.js" }, "engines": { - "node": ">=16.13" + "node": ">=18.18" + }, + "peerDependencies": { + "typescript": ">=5.1.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, "exercises/11.test-db/02.problem.isolated-db": { @@ -6679,9 +7382,8 @@ "@conform-to/zod": "^0.9.0", "@epic-web/remember": "^1.1.0", "@epic-web/totp": "^1.1.2", - "@epic-web/workshop-utils": "^4.21.1", "@paralleldrive/cuid2": "^2.2.2", - "@prisma/client": "^5.16.2", + "@prisma/client": "^6.19.1", "@radix-ui/react-checkbox": "^1.1.1", "@radix-ui/react-dropdown-menu": "^2.1.1", "@radix-ui/react-label": "^2.1.0", @@ -6708,13 +7410,13 @@ "glob": "^11.0.0", "isbot": "^5.1.12", "morgan": "^1.10.0", - "prisma": "^5.16.2", + "prisma": "^6.19.1", "qrcode": "^1.5.3", "react": "^18.3.1", "react-dom": "^18.3.1", "remix-auth": "^3.7.0", "remix-auth-form": "^1.5.0", - "remix-auth-github": "^1.7.0", + "remix-auth-github": "1.7.0", "remix-utils": "^7.6.0", "sonner": "^1.5.0", "source-map-support": "^0.5.21", @@ -6760,7 +7462,7 @@ "execa": "^9.3.0", "fs-extra": "^11.2.0", "jsdom": "^24.1.0", - "msw": "^2.3.1", + "msw": "^2.12.4", "node-html-parser": "^6.1.13", "npm-run-all": "^4.1.5", "prettier": "^3.3.2", @@ -6774,47 +7476,61 @@ } }, "exercises/11.test-db/02.problem.isolated-db/node_modules/@prisma/client": { - "version": "5.16.2", - "resolved": "https://registry.npmjs.org/@prisma/client/-/client-5.16.2.tgz", - "integrity": "sha512-+1lmkhR9gHWcTC5oghm2ZKpWljyWdzfazCVlLKUWXVmwHSf52g81aZ8qb6Km5Bs025yBi7puLp3qSLEvktoUtw==", + "version": "6.19.1", + "resolved": "https://registry.npmjs.org/@prisma/client/-/client-6.19.1.tgz", + "integrity": "sha512-4SXj4Oo6HyQkLUWT8Ke5R0PTAfVOKip5Roo+6+b2EDTkFg5be0FnBWiuRJc0BC0sRQIWGMLKW1XguhVfW/z3/A==", "hasInstallScript": true, + "license": "Apache-2.0", "engines": { - "node": ">=16.13" + "node": ">=18.18" }, "peerDependencies": { - "prisma": "*" + "prisma": "*", + "typescript": ">=5.1.0" }, "peerDependenciesMeta": { "prisma": { "optional": true + }, + "typescript": { + "optional": true } } }, "exercises/11.test-db/02.problem.isolated-db/node_modules/prisma": { - "version": "5.16.2", - "resolved": "https://registry.npmjs.org/prisma/-/prisma-5.16.2.tgz", - "integrity": "sha512-rFV/xoBR2hBGGlu4LPLQd4U8WVA+tSAmYyFWGPRVfj+xg7N4kiZV4lSk38htSpF+/IuHKzlrbh4SFk8Z18cI8A==", + "version": "6.19.1", + "resolved": "https://registry.npmjs.org/prisma/-/prisma-6.19.1.tgz", + "integrity": "sha512-XRfmGzh6gtkc/Vq3LqZJcS2884dQQW3UhPo6jNRoiTW95FFQkXFg8vkYEy6og+Pyv0aY7zRQ7Wn1Cvr56XjhQQ==", "hasInstallScript": true, + "license": "Apache-2.0", "dependencies": { - "@prisma/engines": "5.16.2" + "@prisma/config": "6.19.1", + "@prisma/engines": "6.19.1" }, "bin": { "prisma": "build/index.js" }, "engines": { - "node": ">=16.13" - } - }, - "exercises/11.test-db/02.solution.isolated-db": { - "name": "exercises__sep__11.test-db__sep__02.solution.isolated-db", - "dependencies": { + "node": ">=18.18" + }, + "peerDependencies": { + "typescript": ">=5.1.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "exercises/11.test-db/02.solution.isolated-db": { + "name": "exercises__sep__11.test-db__sep__02.solution.isolated-db", + "dependencies": { "@conform-to/react": "^0.9.0", "@conform-to/zod": "^0.9.0", "@epic-web/remember": "^1.1.0", "@epic-web/totp": "^1.1.2", - "@epic-web/workshop-utils": "^4.21.1", "@paralleldrive/cuid2": "^2.2.2", - "@prisma/client": "^5.16.2", + "@prisma/client": "^6.19.1", "@radix-ui/react-checkbox": "^1.1.1", "@radix-ui/react-dropdown-menu": "^2.1.1", "@radix-ui/react-label": "^2.1.0", @@ -6841,13 +7557,13 @@ "glob": "^11.0.0", "isbot": "^5.1.12", "morgan": "^1.10.0", - "prisma": "^5.16.2", + "prisma": "^6.19.1", "qrcode": "^1.5.3", "react": "^18.3.1", "react-dom": "^18.3.1", "remix-auth": "^3.7.0", "remix-auth-form": "^1.5.0", - "remix-auth-github": "^1.7.0", + "remix-auth-github": "1.7.0", "remix-utils": "^7.6.0", "sonner": "^1.5.0", "source-map-support": "^0.5.21", @@ -6893,7 +7609,7 @@ "execa": "^9.3.0", "fs-extra": "^11.2.0", "jsdom": "^24.1.0", - "msw": "^2.3.1", + "msw": "^2.12.4", "node-html-parser": "^6.1.13", "npm-run-all": "^4.1.5", "prettier": "^3.3.2", @@ -6907,35 +7623,50 @@ } }, "exercises/11.test-db/02.solution.isolated-db/node_modules/@prisma/client": { - "version": "5.16.2", - "resolved": "https://registry.npmjs.org/@prisma/client/-/client-5.16.2.tgz", - "integrity": "sha512-+1lmkhR9gHWcTC5oghm2ZKpWljyWdzfazCVlLKUWXVmwHSf52g81aZ8qb6Km5Bs025yBi7puLp3qSLEvktoUtw==", + "version": "6.19.1", + "resolved": "https://registry.npmjs.org/@prisma/client/-/client-6.19.1.tgz", + "integrity": "sha512-4SXj4Oo6HyQkLUWT8Ke5R0PTAfVOKip5Roo+6+b2EDTkFg5be0FnBWiuRJc0BC0sRQIWGMLKW1XguhVfW/z3/A==", "hasInstallScript": true, + "license": "Apache-2.0", "engines": { - "node": ">=16.13" + "node": ">=18.18" }, "peerDependencies": { - "prisma": "*" + "prisma": "*", + "typescript": ">=5.1.0" }, "peerDependenciesMeta": { "prisma": { "optional": true + }, + "typescript": { + "optional": true } } }, "exercises/11.test-db/02.solution.isolated-db/node_modules/prisma": { - "version": "5.16.2", - "resolved": "https://registry.npmjs.org/prisma/-/prisma-5.16.2.tgz", - "integrity": "sha512-rFV/xoBR2hBGGlu4LPLQd4U8WVA+tSAmYyFWGPRVfj+xg7N4kiZV4lSk38htSpF+/IuHKzlrbh4SFk8Z18cI8A==", + "version": "6.19.1", + "resolved": "https://registry.npmjs.org/prisma/-/prisma-6.19.1.tgz", + "integrity": "sha512-XRfmGzh6gtkc/Vq3LqZJcS2884dQQW3UhPo6jNRoiTW95FFQkXFg8vkYEy6og+Pyv0aY7zRQ7Wn1Cvr56XjhQQ==", "hasInstallScript": true, + "license": "Apache-2.0", "dependencies": { - "@prisma/engines": "5.16.2" + "@prisma/config": "6.19.1", + "@prisma/engines": "6.19.1" }, "bin": { "prisma": "build/index.js" }, "engines": { - "node": ">=16.13" + "node": ">=18.18" + }, + "peerDependencies": { + "typescript": ">=5.1.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, "exercises/11.test-db/03.problem.global-setup": { @@ -6945,9 +7676,8 @@ "@conform-to/zod": "^0.9.0", "@epic-web/remember": "^1.1.0", "@epic-web/totp": "^1.1.2", - "@epic-web/workshop-utils": "^4.21.1", "@paralleldrive/cuid2": "^2.2.2", - "@prisma/client": "^5.16.2", + "@prisma/client": "^6.19.1", "@radix-ui/react-checkbox": "^1.1.1", "@radix-ui/react-dropdown-menu": "^2.1.1", "@radix-ui/react-label": "^2.1.0", @@ -6974,13 +7704,13 @@ "glob": "^11.0.0", "isbot": "^5.1.12", "morgan": "^1.10.0", - "prisma": "^5.16.2", + "prisma": "^6.19.1", "qrcode": "^1.5.3", "react": "^18.3.1", "react-dom": "^18.3.1", "remix-auth": "^3.7.0", "remix-auth-form": "^1.5.0", - "remix-auth-github": "^1.7.0", + "remix-auth-github": "1.7.0", "remix-utils": "^7.6.0", "sonner": "^1.5.0", "source-map-support": "^0.5.21", @@ -7026,7 +7756,7 @@ "execa": "^9.3.0", "fs-extra": "^11.2.0", "jsdom": "^24.1.0", - "msw": "^2.3.1", + "msw": "^2.12.4", "node-html-parser": "^6.1.13", "npm-run-all": "^4.1.5", "prettier": "^3.3.2", @@ -7040,35 +7770,50 @@ } }, "exercises/11.test-db/03.problem.global-setup/node_modules/@prisma/client": { - "version": "5.16.2", - "resolved": "https://registry.npmjs.org/@prisma/client/-/client-5.16.2.tgz", - "integrity": "sha512-+1lmkhR9gHWcTC5oghm2ZKpWljyWdzfazCVlLKUWXVmwHSf52g81aZ8qb6Km5Bs025yBi7puLp3qSLEvktoUtw==", + "version": "6.19.1", + "resolved": "https://registry.npmjs.org/@prisma/client/-/client-6.19.1.tgz", + "integrity": "sha512-4SXj4Oo6HyQkLUWT8Ke5R0PTAfVOKip5Roo+6+b2EDTkFg5be0FnBWiuRJc0BC0sRQIWGMLKW1XguhVfW/z3/A==", "hasInstallScript": true, + "license": "Apache-2.0", "engines": { - "node": ">=16.13" + "node": ">=18.18" }, "peerDependencies": { - "prisma": "*" + "prisma": "*", + "typescript": ">=5.1.0" }, "peerDependenciesMeta": { "prisma": { "optional": true + }, + "typescript": { + "optional": true } } }, "exercises/11.test-db/03.problem.global-setup/node_modules/prisma": { - "version": "5.16.2", - "resolved": "https://registry.npmjs.org/prisma/-/prisma-5.16.2.tgz", - "integrity": "sha512-rFV/xoBR2hBGGlu4LPLQd4U8WVA+tSAmYyFWGPRVfj+xg7N4kiZV4lSk38htSpF+/IuHKzlrbh4SFk8Z18cI8A==", + "version": "6.19.1", + "resolved": "https://registry.npmjs.org/prisma/-/prisma-6.19.1.tgz", + "integrity": "sha512-XRfmGzh6gtkc/Vq3LqZJcS2884dQQW3UhPo6jNRoiTW95FFQkXFg8vkYEy6og+Pyv0aY7zRQ7Wn1Cvr56XjhQQ==", "hasInstallScript": true, + "license": "Apache-2.0", "dependencies": { - "@prisma/engines": "5.16.2" + "@prisma/config": "6.19.1", + "@prisma/engines": "6.19.1" }, "bin": { "prisma": "build/index.js" }, "engines": { - "node": ">=16.13" + "node": ">=18.18" + }, + "peerDependencies": { + "typescript": ">=5.1.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, "exercises/11.test-db/03.solution.global-setup": { @@ -7078,9 +7823,8 @@ "@conform-to/zod": "^0.9.0", "@epic-web/remember": "^1.1.0", "@epic-web/totp": "^1.1.2", - "@epic-web/workshop-utils": "^4.21.1", "@paralleldrive/cuid2": "^2.2.2", - "@prisma/client": "^5.16.2", + "@prisma/client": "^6.19.1", "@radix-ui/react-checkbox": "^1.1.1", "@radix-ui/react-dropdown-menu": "^2.1.1", "@radix-ui/react-label": "^2.1.0", @@ -7107,13 +7851,13 @@ "glob": "^11.0.0", "isbot": "^5.1.12", "morgan": "^1.10.0", - "prisma": "^5.16.2", + "prisma": "^6.19.1", "qrcode": "^1.5.3", "react": "^18.3.1", "react-dom": "^18.3.1", "remix-auth": "^3.7.0", "remix-auth-form": "^1.5.0", - "remix-auth-github": "^1.7.0", + "remix-auth-github": "1.7.0", "remix-utils": "^7.6.0", "sonner": "^1.5.0", "source-map-support": "^0.5.21", @@ -7159,7 +7903,7 @@ "execa": "^9.3.0", "fs-extra": "^11.2.0", "jsdom": "^24.1.0", - "msw": "^2.3.1", + "msw": "^2.12.4", "node-html-parser": "^6.1.13", "npm-run-all": "^4.1.5", "prettier": "^3.3.2", @@ -7173,41 +7917,57 @@ } }, "exercises/11.test-db/03.solution.global-setup/node_modules/@prisma/client": { - "version": "5.16.2", - "resolved": "https://registry.npmjs.org/@prisma/client/-/client-5.16.2.tgz", - "integrity": "sha512-+1lmkhR9gHWcTC5oghm2ZKpWljyWdzfazCVlLKUWXVmwHSf52g81aZ8qb6Km5Bs025yBi7puLp3qSLEvktoUtw==", + "version": "6.19.1", + "resolved": "https://registry.npmjs.org/@prisma/client/-/client-6.19.1.tgz", + "integrity": "sha512-4SXj4Oo6HyQkLUWT8Ke5R0PTAfVOKip5Roo+6+b2EDTkFg5be0FnBWiuRJc0BC0sRQIWGMLKW1XguhVfW/z3/A==", "hasInstallScript": true, + "license": "Apache-2.0", "engines": { - "node": ">=16.13" + "node": ">=18.18" }, "peerDependencies": { - "prisma": "*" + "prisma": "*", + "typescript": ">=5.1.0" }, "peerDependenciesMeta": { "prisma": { "optional": true + }, + "typescript": { + "optional": true } } }, "exercises/11.test-db/03.solution.global-setup/node_modules/prisma": { - "version": "5.16.2", - "resolved": "https://registry.npmjs.org/prisma/-/prisma-5.16.2.tgz", - "integrity": "sha512-rFV/xoBR2hBGGlu4LPLQd4U8WVA+tSAmYyFWGPRVfj+xg7N4kiZV4lSk38htSpF+/IuHKzlrbh4SFk8Z18cI8A==", + "version": "6.19.1", + "resolved": "https://registry.npmjs.org/prisma/-/prisma-6.19.1.tgz", + "integrity": "sha512-XRfmGzh6gtkc/Vq3LqZJcS2884dQQW3UhPo6jNRoiTW95FFQkXFg8vkYEy6og+Pyv0aY7zRQ7Wn1Cvr56XjhQQ==", "hasInstallScript": true, + "license": "Apache-2.0", "dependencies": { - "@prisma/engines": "5.16.2" + "@prisma/config": "6.19.1", + "@prisma/engines": "6.19.1" }, "bin": { "prisma": "build/index.js" }, "engines": { - "node": ">=16.13" + "node": ">=18.18" + }, + "peerDependencies": { + "typescript": ">=5.1.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, "node_modules/@adobe/css-tools": { "version": "4.4.0", "resolved": "https://registry.npmjs.org/@adobe/css-tools/-/css-tools-4.4.0.tgz", - "integrity": "sha512-Ff9+ksdQQB3rMncgqDK78uLznstjyfIf2Arnh22pW8kBpLs6rpKDwgnZT46hin5Hl1WzazzK64DOrhSwYpS7bQ==" + "integrity": "sha512-Ff9+ksdQQB3rMncgqDK78uLznstjyfIf2Arnh22pW8kBpLs6rpKDwgnZT46hin5Hl1WzazzK64DOrhSwYpS7bQ==", + "dev": true }, "node_modules/@alloc/quick-lru": { "version": "5.2.0", @@ -7237,6 +7997,7 @@ "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.7.tgz", "integrity": "sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA==", + "dev": true, "dependencies": { "@babel/highlight": "^7.24.7", "picocolors": "^1.0.0" @@ -7602,6 +8363,7 @@ "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.7.tgz", "integrity": "sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==", + "dev": true, "engines": { "node": ">=6.9.0" } @@ -7632,6 +8394,7 @@ "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.7.tgz", "integrity": "sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw==", + "dev": true, "dependencies": { "@babel/helper-validator-identifier": "^7.24.7", "chalk": "^2.4.2", @@ -7646,6 +8409,7 @@ "version": "2.4.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, "dependencies": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", @@ -7659,6 +8423,7 @@ "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, "engines": { "node": ">=0.8.0" } @@ -7667,6 +8432,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, "engines": { "node": ">=4" } @@ -7675,6 +8441,7 @@ "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, "dependencies": { "has-flag": "^3.0.0" }, @@ -7974,33 +8741,6 @@ "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", "dev": true }, - "node_modules/@bundled-es-modules/cookie": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@bundled-es-modules/cookie/-/cookie-2.0.0.tgz", - "integrity": "sha512-Or6YHg/kamKHpxULAdSqhGqnWFneIXu1NKvvfBBzKGwpVsYuFIQ5aBPHDnnoR3ghW1nvSkALd+EF9iMtY7Vjxw==", - "dev": true, - "dependencies": { - "cookie": "^0.5.0" - } - }, - "node_modules/@bundled-es-modules/cookie/node_modules/cookie": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", - "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", - "dev": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/@bundled-es-modules/statuses": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@bundled-es-modules/statuses/-/statuses-1.0.1.tgz", - "integrity": "sha512-yn7BklA5acgcBr+7w064fGV+SGIFySjCKpqjcWgBAIfrAkY+4GQTJJHQMeT3V/sgz23VTEVV8TtOmkvJAhFVfg==", - "dev": true, - "dependencies": { - "statuses": "^2.0.1" - } - }, "node_modules/@conform-to/dom": { "version": "0.9.2", "resolved": "https://registry.npmjs.org/@conform-to/dom/-/dom-0.9.2.tgz", @@ -8033,9 +8773,11 @@ "dev": true }, "node_modules/@epic-web/cachified": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/@epic-web/cachified/-/cachified-5.2.0.tgz", - "integrity": "sha512-E/2LdIhS/wcn3ykV+u5xbTFahKtzReO0k4/cVtE7KBYiLCgR6bPRmlDUuyfWhbZX3zOmK+6OL7qdHkvgCWwSiA==" + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/@epic-web/cachified/-/cachified-5.6.0.tgz", + "integrity": "sha512-mr/MmnDm3dUaCe0lHWwAour1s8E8Pn7i03W9vdA4g7AwB2l2bMFfVc6Ofb7kczL62O8UY289u2NOuv9Ac+ksyg==", + "dev": true, + "license": "MIT" }, "node_modules/@epic-web/remember": { "version": "1.1.0", @@ -8053,162 +8795,6 @@ "node": ">=18" } }, - "node_modules/@epic-web/workshop-utils": { - "version": "4.21.1", - "resolved": "https://registry.npmjs.org/@epic-web/workshop-utils/-/workshop-utils-4.21.1.tgz", - "integrity": "sha512-fr/EHIjZgkvJTOs28xTYuE01Cj5Ksy5tBgpXglF+Z1xdonfiiiEgoGp8Gn7B/7fjYcApPMk4UH0ATj4FJGl18g==", - "dependencies": { - "@epic-web/cachified": "^5.2.0", - "@epic-web/remember": "^1.0.2", - "@kentcdodds/md-temp": "^9.0.1", - "@mdx-js/mdx": "^3.0.1", - "@playwright/test": "^1.44.1", - "@remix-run/node": "^2.9.2", - "@testing-library/dom": "^10.1.0", - "@testing-library/jest-dom": "^6.4.8", - "@total-typescript/ts-reset": "^0.5.1", - "@types/chai": "^4.3.17", - "@types/chai-dom": "^1.11.3", - "@vitest/expect": "^2.0.5", - "chai": "^5.1.1", - "chai-dom": "^1.12.0", - "chalk": "^5.3.0", - "chokidar": "^3.6.0", - "close-with-grace": "^1.3.0", - "cross-spawn": "^7.0.3", - "execa": "^9.1.0", - "fkill": "^9.0.0", - "fs-extra": "^11.2.0", - "glob": "^10.3.16", - "globby": "^14.0.1", - "lru-cache": "^10.2.2", - "md5-hex": "^5.0.0", - "mdast-util-mdx-jsx": "^3.1.2", - "mdx-bundler": "^10.0.2", - "p-queue": "^8.0.1", - "rehype": "^13.0.1", - "remark": "^15.0.1", - "remark-autolink-headings": "^7.0.1", - "remark-emoji": "^4.0.1", - "remark-gfm": "^4.0.0", - "unified": "^11.0.4", - "unist-util-remove-position": "^5.0.0", - "unist-util-visit": "^5.0.0", - "zod": "^3.23.8" - } - }, - "node_modules/@epic-web/workshop-utils/node_modules/@vitest/expect": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-2.0.5.tgz", - "integrity": "sha512-yHZtwuP7JZivj65Gxoi8upUN2OzHTi3zVfjwdpu2WrvCZPLwsJ2Ey5ILIPccoW23dd/zQBlJ4/dhi7DWNyXCpA==", - "dependencies": { - "@vitest/spy": "2.0.5", - "@vitest/utils": "2.0.5", - "chai": "^5.1.1", - "tinyrainbow": "^1.2.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/@epic-web/workshop-utils/node_modules/@vitest/pretty-format": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-2.0.5.tgz", - "integrity": "sha512-h8k+1oWHfwTkyTkb9egzwNMfJAEx4veaPSnMeKbVSjp4euqGSbQlm5+6VHwTr7u4FJslVVsUG5nopCaAYdOmSQ==", - "dependencies": { - "tinyrainbow": "^1.2.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/@epic-web/workshop-utils/node_modules/@vitest/spy": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-2.0.5.tgz", - "integrity": "sha512-c/jdthAhvJdpfVuaexSrnawxZz6pywlTPe84LUB2m/4t3rl2fTo9NFGBG4oWgaD+FTgDDV8hJ/nibT7IfH3JfA==", - "dependencies": { - "tinyspy": "^3.0.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/@epic-web/workshop-utils/node_modules/@vitest/utils": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-2.0.5.tgz", - "integrity": "sha512-d8HKbqIcya+GR67mkZbrzhS5kKhtp8dQLcmRZLGTscGVg7yImT82cIrhtn2L8+VujWcy6KZweApgNmPsTAO/UQ==", - "dependencies": { - "@vitest/pretty-format": "2.0.5", - "estree-walker": "^3.0.3", - "loupe": "^3.1.1", - "tinyrainbow": "^1.2.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/@epic-web/workshop-utils/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/@epic-web/workshop-utils/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/@epic-web/workshop-utils/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/@esbuild-plugins/node-resolve": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/@esbuild-plugins/node-resolve/-/node-resolve-0.2.2.tgz", - "integrity": "sha512-+t5FdX3ATQlb53UFDBRb4nqjYBz492bIrnVWvpQHpzZlu9BQL5HasMZhqc409ygUwOWCXZhrWr6NyZ6T6Y+cxw==", - "dependencies": { - "@types/resolve": "^1.17.1", - "debug": "^4.3.1", - "escape-string-regexp": "^4.0.0", - "resolve": "^1.19.0" - }, - "peerDependencies": { - "esbuild": "*" - } - }, "node_modules/@esbuild/aix-ppc64": { "version": "0.23.0", "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.23.0.tgz", @@ -8726,11 +9312,6 @@ "npm": ">=6.14.13" } }, - "node_modules/@fal-works/esbuild-plugin-global-externals": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/@fal-works/esbuild-plugin-global-externals/-/esbuild-plugin-global-externals-2.1.2.tgz", - "integrity": "sha512-cEee/Z+I12mZcFJshKcCqC8tuX5hG3s+d+9nZ3LabqKF1vKdF41B92pJVCBggjAGORAeOzyyDDKrZwIkLffeOQ==" - }, "node_modules/@floating-ui/core": { "version": "1.6.4", "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.6.4.tgz", @@ -8822,41 +9403,64 @@ "deprecated": "Use @eslint/object-schema instead", "dev": true }, + "node_modules/@inquirer/ansi": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@inquirer/ansi/-/ansi-1.0.2.tgz", + "integrity": "sha512-S8qNSZiYzFd0wAcyG5AXCvUHC5Sr7xpZ9wZ2py9XR88jUz8wooStVx5M6dRzczbBWjic9NP7+rY0Xi7qqK/aMQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, "node_modules/@inquirer/confirm": { - "version": "3.1.14", - "resolved": "https://registry.npmjs.org/@inquirer/confirm/-/confirm-3.1.14.tgz", - "integrity": "sha512-nbLSX37b2dGPtKWL3rPuR/5hOuD30S+pqJ/MuFiUEgN6GiMs8UMxiurKAMDzKt6C95ltjupa8zH6+3csXNHWpA==", + "version": "5.1.21", + "resolved": "https://registry.npmjs.org/@inquirer/confirm/-/confirm-5.1.21.tgz", + "integrity": "sha512-KR8edRkIsUayMXV+o3Gv+q4jlhENF9nMYUZs9PA2HzrXeHI8M5uDag70U7RJn9yyiMZSbtF5/UexBtAVtZGSbQ==", "dev": true, + "license": "MIT", "dependencies": { - "@inquirer/core": "^9.0.2", - "@inquirer/type": "^1.4.0" + "@inquirer/core": "^10.3.2", + "@inquirer/type": "^3.0.10" }, "engines": { "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, "node_modules/@inquirer/core": { - "version": "9.0.2", - "resolved": "https://registry.npmjs.org/@inquirer/core/-/core-9.0.2.tgz", - "integrity": "sha512-nguvH3TZar3ACwbytZrraRTzGqyxJfYJwv+ZwqZNatAosdWQMP1GV8zvmkNlBe2JeZSaw0WYBHZk52pDpWC9qA==", - "dev": true, - "dependencies": { - "@inquirer/figures": "^1.0.3", - "@inquirer/type": "^1.4.0", - "@types/mute-stream": "^0.0.4", - "@types/node": "^20.14.9", - "@types/wrap-ansi": "^3.0.0", - "ansi-escapes": "^4.3.2", - "cli-spinners": "^2.9.2", + "version": "10.3.2", + "resolved": "https://registry.npmjs.org/@inquirer/core/-/core-10.3.2.tgz", + "integrity": "sha512-43RTuEbfP8MbKzedNqBrlhhNKVwoK//vUFNW3Q3vZ88BLcrs4kYpGg+B2mm5p2K/HfygoCxuKwJJiv8PbGmE0A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/ansi": "^1.0.2", + "@inquirer/figures": "^1.0.15", + "@inquirer/type": "^3.0.10", "cli-width": "^4.1.0", - "mute-stream": "^1.0.0", + "mute-stream": "^2.0.0", "signal-exit": "^4.1.0", - "strip-ansi": "^6.0.1", "wrap-ansi": "^6.2.0", - "yoctocolors-cjs": "^2.1.2" + "yoctocolors-cjs": "^2.1.3" }, "engines": { "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, "node_modules/@inquirer/core/node_modules/ansi-styles": { @@ -8864,6 +9468,7 @@ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, + "license": "MIT", "dependencies": { "color-convert": "^2.0.1" }, @@ -8879,6 +9484,7 @@ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, + "license": "MIT", "dependencies": { "color-name": "~1.1.4" }, @@ -8890,19 +9496,22 @@ "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 + "dev": true, + "license": "MIT" }, "node_modules/@inquirer/core/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==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@inquirer/core/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==", "dev": true, + "license": "MIT", "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", @@ -8917,6 +9526,7 @@ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", "dev": true, + "license": "MIT", "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", @@ -8927,24 +9537,52 @@ } }, "node_modules/@inquirer/figures": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@inquirer/figures/-/figures-1.0.3.tgz", - "integrity": "sha512-ErXXzENMH5pJt5/ssXV0DfWUZqly8nGzf0UcBV9xTnP+KyffE2mqyxIMBrZ8ijQck2nU0TQm40EQB53YreyWHw==", + "version": "1.0.15", + "resolved": "https://registry.npmjs.org/@inquirer/figures/-/figures-1.0.15.tgz", + "integrity": "sha512-t2IEY+unGHOzAaVM5Xx6DEWKeXlDDcNPeDyUpsRc6CUhBfU3VQOEl+Vssh7VNp1dR8MdUJBWhuObjXCsVpjN5g==", "dev": true, + "license": "MIT", "engines": { "node": ">=18" } }, "node_modules/@inquirer/type": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@inquirer/type/-/type-1.4.0.tgz", - "integrity": "sha512-AjOqykVyjdJQvtfkNDGUyMYGF8xN50VUxftCQWsOyIo4DFRLr6VQhW0VItGI1JIyQGCGgIpKa7hMMwNhZb4OIw==", + "version": "3.0.10", + "resolved": "https://registry.npmjs.org/@inquirer/type/-/type-3.0.10.tgz", + "integrity": "sha512-BvziSRxfz5Ov8ch0z/n3oijRSEcEsHnhggm4xFZe93DHcUCTlutlq9Ox4SVENAfcRD22UQq7T/atg9Wr3k09eA==", "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@isaacs/balanced-match": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@isaacs/balanced-match/-/balanced-match-4.0.1.tgz", + "integrity": "sha512-yzMTt9lEb8Gv7zRioUilSglI0c0smZ9k5D65677DLWLtWJaXIS3CqcGyUFByYKlnUj6TkjLVs54fBl6+TiGQDQ==", + "license": "MIT", + "engines": { + "node": "20 || >=22" + } + }, + "node_modules/@isaacs/brace-expansion": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@isaacs/brace-expansion/-/brace-expansion-5.0.0.tgz", + "integrity": "sha512-ZT55BDLV0yv0RBm2czMiZ+SqCGO7AvmOM3G/w2xhVPH+te0aKgFjmBvGlL1dH+ql2tgGO3MVrbb3jCKyvpgnxA==", + "license": "MIT", "dependencies": { - "mute-stream": "^1.0.0" + "@isaacs/balanced-match": "^4.0.1" }, "engines": { - "node": ">=18" + "node": "20 || >=22" } }, "node_modules/@isaacs/cliui": { @@ -9046,91 +9684,18 @@ "integrity": "sha512-Lg3PnLp0QXpxwLIAuuJboLeRaIhrgJjeuh797QADg3xz8wGLugQOS5DpsE8A6i6Adgzf+bacllkKZG3J0tGfDw==", "dev": true }, - "node_modules/@kentcdodds/md-temp": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/@kentcdodds/md-temp/-/md-temp-9.0.1.tgz", - "integrity": "sha512-zlT9youXBwoP6eiYBfwfrRLJrH33gJa3hCcERea0dFQTW28EM7oGQIWIieB+wzEROD99iluDCoPE65TXm6/PQw==", - "dependencies": { - "escape-goat": "^4.0.0", - "parse-numeric-range": "^1.3.0", - "shiki": "^1.7.0", - "tinypool": "^1.0.0", - "unified": "^11.0.4", - "unist-util-visit": "^5.0.0" - } - }, - "node_modules/@mdx-js/esbuild": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@mdx-js/esbuild/-/esbuild-3.0.1.tgz", - "integrity": "sha512-+KZbCKcRjFtRD6qzD+c70Vq/VPVt5LHFsOshNcsdcONkaLTCSjmM7/uj71i3BcP+170f+P4DwVEMtqR/k0t5aw==", - "dependencies": { - "@mdx-js/mdx": "^3.0.0", - "@types/unist": "^3.0.0", - "vfile": "^6.0.0", - "vfile-message": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - }, - "peerDependencies": { - "esbuild": ">=0.14.0" - } - }, - "node_modules/@mdx-js/mdx": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@mdx-js/mdx/-/mdx-3.0.1.tgz", - "integrity": "sha512-eIQ4QTrOWyL3LWEe/bu6Taqzq2HQvHcyTMaOrI95P2/LmJE7AsfPfgJGuFLPVqBUE1BC1rik3VIhU+s9u72arA==", - "dependencies": { - "@types/estree": "^1.0.0", - "@types/estree-jsx": "^1.0.0", - "@types/hast": "^3.0.0", - "@types/mdx": "^2.0.0", - "collapse-white-space": "^2.0.0", - "devlop": "^1.0.0", - "estree-util-build-jsx": "^3.0.0", - "estree-util-is-identifier-name": "^3.0.0", - "estree-util-to-js": "^2.0.0", - "estree-walker": "^3.0.0", - "hast-util-to-estree": "^3.0.0", - "hast-util-to-jsx-runtime": "^2.0.0", - "markdown-extensions": "^2.0.0", - "periscopic": "^3.0.0", - "remark-mdx": "^3.0.0", - "remark-parse": "^11.0.0", - "remark-rehype": "^11.0.0", - "source-map": "^0.7.0", - "unified": "^11.0.0", - "unist-util-position-from-estree": "^2.0.0", - "unist-util-stringify-position": "^4.0.0", - "unist-util-visit": "^5.0.0", - "vfile": "^6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/@mswjs/cookies": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@mswjs/cookies/-/cookies-1.1.1.tgz", - "integrity": "sha512-W68qOHEjx1iD+4VjQudlx26CPIoxmIAtK4ZCexU0/UJBG6jYhcuyzKJx+Iw8uhBIGd9eba64XgWVgo20it1qwA==", - "dev": true, - "engines": { - "node": ">=18" - } - }, "node_modules/@mswjs/interceptors": { - "version": "0.29.1", - "resolved": "https://registry.npmjs.org/@mswjs/interceptors/-/interceptors-0.29.1.tgz", - "integrity": "sha512-3rDakgJZ77+RiQUuSK69t1F0m8BQKA8Vh5DCS5V0DWvNY67zob2JhhQrhCO0AKLGINTRSFd1tBaHcJTkhefoSw==", + "version": "0.40.0", + "resolved": "https://registry.npmjs.org/@mswjs/interceptors/-/interceptors-0.40.0.tgz", + "integrity": "sha512-EFd6cVbHsgLa6wa4RljGj6Wk75qoHxUSyc5asLyyPSyuhIcdS2Q3Phw6ImS1q+CkALthJRShiYfKANcQMuMqsQ==", "dev": true, + "license": "MIT", "dependencies": { "@open-draft/deferred-promise": "^2.2.0", "@open-draft/logger": "^0.3.0", "@open-draft/until": "^2.0.0", "is-node-process": "^1.2.0", - "outvariant": "^1.2.1", + "outvariant": "^1.4.3", "strict-event-emitter": "^0.5.1" }, "engines": { @@ -9319,13 +9884,15 @@ "version": "2.2.0", "resolved": "https://registry.npmjs.org/@open-draft/deferred-promise/-/deferred-promise-2.2.0.tgz", "integrity": "sha512-CecwLWx3rhxVQF6V4bAgPS5t+So2sTbPgAzafKkVizyi7tlwpcFpdFqq+wqF2OwNBmqFuu6tOyouTuxgpMfzmA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@open-draft/logger": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/@open-draft/logger/-/logger-0.3.0.tgz", "integrity": "sha512-X2g45fzhxH238HKO4xbSr7+wBS8Fvw6ixhTDuvLd5mqh6bJJCFAPwU9mPDxbcrRtfxv4u5IHCEH77BmxvXmmxQ==", "dev": true, + "license": "MIT", "dependencies": { "is-node-process": "^1.2.0", "outvariant": "^1.4.0" @@ -9335,7 +9902,8 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/@open-draft/until/-/until-2.1.0.tgz", "integrity": "sha512-U69T3ItWHvLwGg5eJ0n3I62nWuE6ilHlmz7zM0npLBRvPRd7e6NYmg54vvRtP5mZG7kZqZCFVdsTWo7BPtBujg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@paralleldrive/cuid2": { "version": "2.2.2", @@ -9355,11 +9923,13 @@ } }, "node_modules/@playwright/test": { - "version": "1.45.1", - "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.45.1.tgz", - "integrity": "sha512-Wo1bWTzQvGA7LyKGIZc8nFSTFf2TkthGIFBR+QVNilvwouGzFd4PYukZe3rvf5PSqjHi1+1NyKSDZKcQWETzaA==", + "version": "1.56.1", + "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.56.1.tgz", + "integrity": "sha512-vSMYtL/zOcFpvJCW71Q/OEGQb7KYBPAdKh35WNSkaZA75JlAO8ED8UN6GUNTm3drWomcbcqRPFqQbLae8yBTdg==", + "dev": true, + "license": "Apache-2.0", "dependencies": { - "playwright": "1.45.1" + "playwright": "1.56.1" }, "bin": { "playwright": "cli.js" @@ -9374,44 +9944,61 @@ "resolved": "https://registry.npmjs.org/noist/-/noist-1.0.0.tgz", "integrity": "sha512-vzNdyHzq8H8Jwe4aK489aPqYljPDd+VY2p3wbty2jzbhCVHNca2PK8w6DfLuH1PX62fLiVOL3hoRdhvdQxaX5A==" }, + "node_modules/@prisma/config": { + "version": "6.19.1", + "resolved": "https://registry.npmjs.org/@prisma/config/-/config-6.19.1.tgz", + "integrity": "sha512-bUL/aYkGXLwxVGhJmQMtslLT7KPEfUqmRa919fKI4wQFX4bIFUKiY8Jmio/2waAjjPYrtuDHa7EsNCnJTXxiOw==", + "license": "Apache-2.0", + "dependencies": { + "c12": "3.1.0", + "deepmerge-ts": "7.1.5", + "effect": "3.18.4", + "empathic": "2.0.0" + } + }, "node_modules/@prisma/debug": { - "version": "5.16.2", - "resolved": "https://registry.npmjs.org/@prisma/debug/-/debug-5.16.2.tgz", - "integrity": "sha512-ItzB4nR4O8eLzuJiuP3WwUJfoIvewMHqpGCad+64gvThcKEVOtaUza9AEJo2DPqAOa/AWkFyK54oM4WwHeew+A==" + "version": "6.19.1", + "resolved": "https://registry.npmjs.org/@prisma/debug/-/debug-6.19.1.tgz", + "integrity": "sha512-h1JImhlAd/s5nhY/e9qkAzausWldbeT+e4nZF7A4zjDYBF4BZmKDt4y0jK7EZapqOm1kW7V0e9agV/iFDy3fWw==", + "license": "Apache-2.0" }, "node_modules/@prisma/engines": { - "version": "5.16.2", - "resolved": "https://registry.npmjs.org/@prisma/engines/-/engines-5.16.2.tgz", - "integrity": "sha512-qUxwMtrwoG3byd4PbX6T7EjHJ8AUhzTuwniOGkh/hIznBfcE2QQnGakyEq4VnwNuttMqvh/GgPFapHQ3lCuRHg==", + "version": "6.19.1", + "resolved": "https://registry.npmjs.org/@prisma/engines/-/engines-6.19.1.tgz", + "integrity": "sha512-xy95dNJ7DiPf9IJ3oaVfX785nbFl7oNDzclUF+DIiJw6WdWCvPl0LPU0YqQLsrwv8N64uOQkH391ujo3wSo+Nw==", "hasInstallScript": true, + "license": "Apache-2.0", "dependencies": { - "@prisma/debug": "5.16.2", - "@prisma/engines-version": "5.16.0-24.34ace0eb2704183d2c05b60b52fba5c43c13f303", - "@prisma/fetch-engine": "5.16.2", - "@prisma/get-platform": "5.16.2" + "@prisma/debug": "6.19.1", + "@prisma/engines-version": "7.1.1-3.c2990dca591cba766e3b7ef5d9e8a84796e47ab7", + "@prisma/fetch-engine": "6.19.1", + "@prisma/get-platform": "6.19.1" } }, "node_modules/@prisma/engines-version": { - "version": "5.16.0-24.34ace0eb2704183d2c05b60b52fba5c43c13f303", - "resolved": "https://registry.npmjs.org/@prisma/engines-version/-/engines-version-5.16.0-24.34ace0eb2704183d2c05b60b52fba5c43c13f303.tgz", - "integrity": "sha512-HkT2WbfmFZ9WUPyuJHhkiADxazHg8Y4gByrTSVeb3OikP6tjQ7txtSUGu9OBOBH0C13dPKN2qqH12xKtHu/Hiw==" + "version": "7.1.1-3.c2990dca591cba766e3b7ef5d9e8a84796e47ab7", + "resolved": "https://registry.npmjs.org/@prisma/engines-version/-/engines-version-7.1.1-3.c2990dca591cba766e3b7ef5d9e8a84796e47ab7.tgz", + "integrity": "sha512-03bgb1VD5gvuumNf+7fVGBzfpJPjmqV423l/WxsWk2cNQ42JD0/SsFBPhN6z8iAvdHs07/7ei77SKu7aZfq8bA==", + "license": "Apache-2.0" }, "node_modules/@prisma/fetch-engine": { - "version": "5.16.2", - "resolved": "https://registry.npmjs.org/@prisma/fetch-engine/-/fetch-engine-5.16.2.tgz", - "integrity": "sha512-sq51lfHKfH2jjYSjBtMjP+AznFqOJzXpqmq6B9auWrlTJrMgZ7lPyhWUW7VU7LsQU48/TJ+DZeIz8s9bMYvcHg==", + "version": "6.19.1", + "resolved": "https://registry.npmjs.org/@prisma/fetch-engine/-/fetch-engine-6.19.1.tgz", + "integrity": "sha512-mmgcotdaq4VtAHO6keov3db+hqlBzQS6X7tR7dFCbvXjLVTxBYdSJFRWz+dq7F9p6dvWyy1X0v8BlfRixyQK6g==", + "license": "Apache-2.0", "dependencies": { - "@prisma/debug": "5.16.2", - "@prisma/engines-version": "5.16.0-24.34ace0eb2704183d2c05b60b52fba5c43c13f303", - "@prisma/get-platform": "5.16.2" + "@prisma/debug": "6.19.1", + "@prisma/engines-version": "7.1.1-3.c2990dca591cba766e3b7ef5d9e8a84796e47ab7", + "@prisma/get-platform": "6.19.1" } }, "node_modules/@prisma/get-platform": { - "version": "5.16.2", - "resolved": "https://registry.npmjs.org/@prisma/get-platform/-/get-platform-5.16.2.tgz", - "integrity": "sha512-cXiHPgNLNyj22vLouPVNegklpRL/iX2jxTeap5GRO3DmCoVyIHmJAV1CgUMUJhHlcol9yYy7EHvsnXTDJ/PKEA==", + "version": "6.19.1", + "resolved": "https://registry.npmjs.org/@prisma/get-platform/-/get-platform-6.19.1.tgz", + "integrity": "sha512-zsg44QUiQAnFUyh6Fbt7c9HjMXHwFTqtrgcX7DAZmRgnkPyYT7Sh8Mn8D5PuuDYNtMOYcpLGg576MLfIORsBYw==", + "license": "Apache-2.0", "dependencies": { - "@prisma/debug": "5.16.2" + "@prisma/debug": "6.19.1" } }, "node_modules/@radix-ui/primitive": { @@ -12586,7 +13173,8 @@ "node_modules/@sec-ant/readable-stream": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/@sec-ant/readable-stream/-/readable-stream-0.4.1.tgz", - "integrity": "sha512-831qok9r2t8AlxLko40y2ebgSDhenenCatLVeW/uBtnHPyhHOvG0C7TvfgecV+wHzIm5KUICgzmVpWS+IMEAeg==" + "integrity": "sha512-831qok9r2t8AlxLko40y2ebgSDhenenCatLVeW/uBtnHPyhHOvG0C7TvfgecV+wHzIm5KUICgzmVpWS+IMEAeg==", + "dev": true }, "node_modules/@selderee/plugin-htmlparser2": { "version": "0.11.0", @@ -12600,29 +13188,11 @@ "url": "https://ko-fi.com/killymxi" } }, - "node_modules/@shikijs/core": { - "version": "1.10.3", - "resolved": "https://registry.npmjs.org/@shikijs/core/-/core-1.10.3.tgz", - "integrity": "sha512-D45PMaBaeDHxww+EkcDQtDAtzv00Gcsp72ukBtaLSmqRvh0WgGMq3Al0rl1QQBZfuneO75NXMIzEZGFitThWbg==", - "dependencies": { - "@types/hast": "^3.0.4" - } - }, - "node_modules/@sindresorhus/is": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz", - "integrity": "sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sindresorhus/is?sponsor=1" - } - }, "node_modules/@sindresorhus/merge-streams": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/@sindresorhus/merge-streams/-/merge-streams-4.0.0.tgz", "integrity": "sha512-tlqY9xq5ukxTUZBmoOp+m61cqwQD5pHJtFY3Mn8CA8ps6yghLH/Hw8UPdqg4OLmFW3IFlcXnQNmo/dh8HzXYIQ==", + "dev": true, "engines": { "node": ">=18" }, @@ -13304,81 +13874,44 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/@standard-schema/spec": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@standard-schema/spec/-/spec-1.0.0.tgz", + "integrity": "sha512-m2bOd0f2RT9k8QJx1JN85cZYyH1RqFBdlwtkSlf4tBDYLCiiZnv1fIIwacK6cqwXavOydf0NPToMQgpKq+dVlA==", + "license": "MIT" + }, "node_modules/@testing-library/dom": { - "version": "10.3.1", - "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-10.3.1.tgz", - "integrity": "sha512-q/WL+vlXMpC0uXDyfsMtc1rmotzLV8Y0gq6q1gfrrDjQeHoeLrqHbxdPvPNAh1i+xuJl7+BezywcXArz7vLqKQ==", + "version": "10.4.1", + "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-10.4.1.tgz", + "integrity": "sha512-o4PXJQidqJl82ckFaXUeoAW+XysPLauYI43Abki5hABd853iMhitooc6znOnczgbTYmEP6U6/y1ZyKAIsvMKGg==", + "dev": true, + "license": "MIT", "dependencies": { "@babel/code-frame": "^7.10.4", "@babel/runtime": "^7.12.5", "@types/aria-query": "^5.0.1", "aria-query": "5.3.0", - "chalk": "^4.1.0", "dom-accessibility-api": "^0.5.9", "lz-string": "^1.5.0", + "picocolors": "1.1.1", "pretty-format": "^27.0.2" }, "engines": { "node": ">=18" } }, - "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/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/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/@testing-library/dom/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/@testing-library/jest-dom": { - "version": "6.4.8", - "resolved": "https://registry.npmjs.org/@testing-library/jest-dom/-/jest-dom-6.4.8.tgz", - "integrity": "sha512-JD0G+Zc38f5MBHA4NgxQMR5XtO5Jx9g86jqturNTt2WUfRmLDIY7iKkWHDCCTiDuFMre6nxAD5wHw9W5kI4rGw==", + "version": "6.9.1", + "resolved": "https://registry.npmjs.org/@testing-library/jest-dom/-/jest-dom-6.9.1.tgz", + "integrity": "sha512-zIcONa+hVtVSSep9UT3jZ5rizo2BsxgyDYU7WFD5eICBE7no3881HGeb/QkGfsJs6JTkY1aQhT7rIPC7e+0nnA==", + "dev": true, + "license": "MIT", "dependencies": { "@adobe/css-tools": "^4.4.0", - "@babel/runtime": "^7.9.2", "aria-query": "^5.0.0", - "chalk": "^3.0.0", "css.escape": "^1.5.1", "dom-accessibility-api": "^0.6.3", - "lodash": "^4.17.21", + "picocolors": "^1.1.1", "redent": "^3.0.0" }, "engines": { @@ -13387,52 +13920,11 @@ "yarn": ">=1" } }, - "node_modules/@testing-library/jest-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/jest-dom/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/@testing-library/jest-dom/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/@testing-library/jest-dom/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/@testing-library/jest-dom/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==" + "integrity": "sha512-7ZgogeTnjuHbo+ct10G9Ffp0mif17idi0IyWNVA/wcwcm7NPOD/WEHVP3n7n3MhXqxoIYm8d6MuZohYWIZ4T3w==", + "dev": true }, "node_modules/@testing-library/react": { "version": "16.0.0", @@ -13477,12 +13969,14 @@ "node_modules/@total-typescript/ts-reset": { "version": "0.5.1", "resolved": "https://registry.npmjs.org/@total-typescript/ts-reset/-/ts-reset-0.5.1.tgz", - "integrity": "sha512-AqlrT8YA1o7Ff5wPfMOL0pvL+1X+sw60NN6CcOCqs658emD6RfiXhF7Gu9QcfKBH7ELY2nInLhKSCWVoNL70MQ==" + "integrity": "sha512-AqlrT8YA1o7Ff5wPfMOL0pvL+1X+sw60NN6CcOCqs658emD6RfiXhF7Gu9QcfKBH7ELY2nInLhKSCWVoNL70MQ==", + "dev": true }, "node_modules/@types/acorn": { "version": "4.0.6", "resolved": "https://registry.npmjs.org/@types/acorn/-/acorn-4.0.6.tgz", "integrity": "sha512-veQTnWP+1D/xbxVrPC3zHnCZRjSrKfhbMUlEA43iMZLu7EsnTtkJklIuwrCPbOi8YkvDQAiW05VQQFvvz9oieQ==", + "dev": true, "dependencies": { "@types/estree": "*" } @@ -13490,7 +13984,8 @@ "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==" + "integrity": "sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==", + "dev": true }, "node_modules/@types/babel__core": { "version": "7.20.5", @@ -13549,19 +14044,6 @@ "@types/node": "*" } }, - "node_modules/@types/chai": { - "version": "4.3.17", - "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.3.17.tgz", - "integrity": "sha512-zmZ21EWzR71B4Sscphjief5djsLre50M6lI622OSySTmn9DB3j+C3kWroHfBQWXbOBwbgg/M8CG/hUxDLIloow==" - }, - "node_modules/@types/chai-dom": { - "version": "1.11.3", - "resolved": "https://registry.npmjs.org/@types/chai-dom/-/chai-dom-1.11.3.tgz", - "integrity": "sha512-EUEZI7uID4ewzxnU7DJXtyvykhQuwe+etJ1wwOiJyQRTH/ifMWKX+ghiXkxCUvNJ6IQDodf0JXhuP6zZcy2qXQ==", - "dependencies": { - "@types/chai": "*" - } - }, "node_modules/@types/compression": { "version": "1.7.5", "resolved": "https://registry.npmjs.org/@types/compression/-/compression-1.7.5.tgz", @@ -13589,6 +14071,7 @@ "version": "4.1.12", "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.12.tgz", "integrity": "sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==", + "dev": true, "dependencies": { "@types/ms": "*" } @@ -13596,12 +14079,14 @@ "node_modules/@types/estree": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", - "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==" + "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", + "dev": true }, "node_modules/@types/estree-jsx": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/@types/estree-jsx/-/estree-jsx-1.0.5.tgz", "integrity": "sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg==", + "dev": true, "dependencies": { "@types/estree": "*" } @@ -13640,14 +14125,6 @@ "@types/node": "*" } }, - "node_modules/@types/hast": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.4.tgz", - "integrity": "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==", - "dependencies": { - "@types/unist": "*" - } - }, "node_modules/@types/http-errors": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.4.tgz", @@ -13675,18 +14152,11 @@ "@types/node": "*" } }, - "node_modules/@types/mdast": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz", - "integrity": "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==", - "dependencies": { - "@types/unist": "*" - } - }, "node_modules/@types/mdx": { "version": "2.0.13", "resolved": "https://registry.npmjs.org/@types/mdx/-/mdx-2.0.13.tgz", - "integrity": "sha512-+OWZQfAYyio6YkJb3HLxDrvnx6SWWDbC0zVPfBRzUk0/nqoDyf6dNxQi3eArPe8rJ473nobTMQ/8Zk+LxJ+Yuw==" + "integrity": "sha512-+OWZQfAYyio6YkJb3HLxDrvnx6SWWDbC0zVPfBRzUk0/nqoDyf6dNxQi3eArPe8rJ473nobTMQ/8Zk+LxJ+Yuw==", + "dev": true }, "node_modules/@types/mime": { "version": "1.3.5", @@ -13706,16 +14176,8 @@ "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/mute-stream": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/@types/mute-stream/-/mute-stream-0.0.4.tgz", - "integrity": "sha512-CPM9nzrCPPJHQNA9keH9CVkVI+WR5kMa+7XEs5jcGQ0VoAGnLv242w8lIVgwAEfmE4oufJRaTc9PNLQl0ioAow==", - "dev": true, - "dependencies": { - "@types/node": "*" - } + "integrity": "sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==", + "dev": true }, "node_modules/@types/node": { "version": "20.14.10", @@ -13772,11 +14234,6 @@ "@types/react": "*" } }, - "node_modules/@types/resolve": { - "version": "1.20.6", - "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-1.20.6.tgz", - "integrity": "sha512-A4STmOXPhMUtHH+S6ymgE2GiBSMqf4oTvcQZMcHzokuTLVYzXTB8ttjcgxOVaAp2lGwEdzZ0J+cRbbeevQj1UQ==" - }, "node_modules/@types/semver": { "version": "7.5.8", "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.8.tgz", @@ -13832,21 +14289,11 @@ } }, "node_modules/@types/statuses": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@types/statuses/-/statuses-2.0.5.tgz", - "integrity": "sha512-jmIUGWrAiwu3dZpxntxieC+1n/5c3mjrImkmOSQ2NC5uP6cYO4aAZDdSmRcI5C1oiTmqlZGHC+/NmJrKogbP5A==", - "dev": true - }, - "node_modules/@types/unist": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.2.tgz", - "integrity": "sha512-dqId9J8K/vGi5Zr7oo212BGii5m3q5Hxlkwy3WpYuKPklmBEvsbMYYyLxAQpSffdLl/gdW0XUpKWFvYmyoWCoQ==" - }, - "node_modules/@types/wrap-ansi": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@types/wrap-ansi/-/wrap-ansi-3.0.0.tgz", - "integrity": "sha512-ltIpx+kM7g/MLRZfkbL7EsCEjfzCcScLpkg37eXEtx5kmrAKBkTJwd1GIAjDSL8wTpM6Hzn5YO4pSb91BEwu1g==", - "dev": true + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@types/statuses/-/statuses-2.0.6.tgz", + "integrity": "sha512-xMAgYwceFhRA2zY+XbEA7mxYbA093wdiW8Vu6gZPGWy9cmOyU9XesH1tNcEWsKFd5Vzrqx5T3D38PWx1FIIXkA==", + "dev": true, + "license": "MIT" }, "node_modules/@typescript-eslint/eslint-plugin": { "version": "5.62.0", @@ -14080,7 +14527,8 @@ "node_modules/@ungap/structured-clone": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", - "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==" + "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==", + "dev": true }, "node_modules/@vanilla-extract/babel-plugin-debug-ids": { "version": "1.0.6", @@ -14718,9 +15166,11 @@ } }, "node_modules/acorn": { - "version": "8.12.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.12.1.tgz", - "integrity": "sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==", + "version": "8.15.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", + "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", + "dev": true, + "license": "MIT", "bin": { "acorn": "bin/acorn" }, @@ -14732,6 +15182,7 @@ "version": "5.3.2", "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, "peerDependencies": { "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } @@ -14756,21 +15207,6 @@ "node": ">= 14" } }, - "node_modules/aggregate-error": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-5.0.0.tgz", - "integrity": "sha512-gOsf2YwSlleG6IjRYG2A7k0HmBMEo6qVNk9Bp/EaLgAJT5ngH6PXbqa4ItvnEwCm/velL5jAnQgsHsWnjhGmvw==", - "dependencies": { - "clean-stack": "^5.2.0", - "indent-string": "^5.0.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/ajv": { "version": "6.12.6", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", @@ -14787,33 +15223,6 @@ "url": "https://github.com/sponsors/epoberezkin" } }, - "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==", - "dev": true, - "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==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/ansi-regex": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", @@ -14826,6 +15235,7 @@ "version": "3.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, "dependencies": { "color-convert": "^1.9.0" }, @@ -14876,6 +15286,7 @@ "version": "5.3.0", "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.0.tgz", "integrity": "sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==", + "dev": true, "dependencies": { "dequal": "^2.0.3" } @@ -15060,6 +15471,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-2.0.1.tgz", "integrity": "sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==", + "dev": true, "engines": { "node": ">=12" } @@ -15074,6 +15486,7 @@ "version": "1.8.6", "resolved": "https://registry.npmjs.org/astring/-/astring-1.8.6.tgz", "integrity": "sha512-ISvCdHdlTDlH5IpxQJIex7BWBywFWgjJSVdwst+/iQCoEYnyOaQ95+X1JGshuBjGp6nxKUy1jMgE3zPqN7fQdg==", + "dev": true, "bin": { "astring": "bin/astring" } @@ -15165,6 +15578,7 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/bail/-/bail-2.0.2.tgz", "integrity": "sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==", + "dev": true, "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" @@ -15233,11 +15647,6 @@ "readable-stream": "^3.4.0" } }, - "node_modules/blueimp-md5": { - "version": "2.19.0", - "resolved": "https://registry.npmjs.org/blueimp-md5/-/blueimp-md5-2.19.0.tgz", - "integrity": "sha512-DRQrD6gJyy8FbiE4s+bDoXS9hiW3Vbx5uCdwvcCf3zLHL+Iv7LtGHLpr+GZV8rHG8tK766FGYBwRbu8pELTt+w==" - }, "node_modules/body-parser": { "version": "1.20.2", "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.2.tgz", @@ -15385,6 +15794,94 @@ "node": ">= 0.8" } }, + "node_modules/c12": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/c12/-/c12-3.1.0.tgz", + "integrity": "sha512-uWoS8OU1MEIsOv8p/5a82c3H31LsWVR5qiyXVfBNOzfffjUWtPnhAb4BYI2uG2HfGmZmFjCtui5XNWaps+iFuw==", + "license": "MIT", + "dependencies": { + "chokidar": "^4.0.3", + "confbox": "^0.2.2", + "defu": "^6.1.4", + "dotenv": "^16.6.1", + "exsolve": "^1.0.7", + "giget": "^2.0.0", + "jiti": "^2.4.2", + "ohash": "^2.0.11", + "pathe": "^2.0.3", + "perfect-debounce": "^1.0.0", + "pkg-types": "^2.2.0", + "rc9": "^2.1.2" + }, + "peerDependencies": { + "magicast": "^0.3.5" + }, + "peerDependenciesMeta": { + "magicast": { + "optional": true + } + } + }, + "node_modules/c12/node_modules/chokidar": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", + "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", + "license": "MIT", + "dependencies": { + "readdirp": "^4.0.1" + }, + "engines": { + "node": ">= 14.16.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/c12/node_modules/confbox": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/confbox/-/confbox-0.2.2.tgz", + "integrity": "sha512-1NB+BKqhtNipMsov4xI/NnhCKp9XG9NamYp5PVm9klAT0fsrNPjaFICsCFhNhwZJKNh7zB/3q8qXz0E9oaMNtQ==", + "license": "MIT" + }, + "node_modules/c12/node_modules/jiti": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.6.1.tgz", + "integrity": "sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==", + "license": "MIT", + "bin": { + "jiti": "lib/jiti-cli.mjs" + } + }, + "node_modules/c12/node_modules/pathe": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", + "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", + "license": "MIT" + }, + "node_modules/c12/node_modules/pkg-types": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-2.3.0.tgz", + "integrity": "sha512-SIqCzDRg0s9npO5XQ3tNZioRY1uK06lA41ynBC1YmFTmnY6FjUjVt6s4LoADmwoig1qqD0oK8h1p/8mlMx8Oig==", + "license": "MIT", + "dependencies": { + "confbox": "^0.2.2", + "exsolve": "^1.0.7", + "pathe": "^2.0.3" + } + }, + "node_modules/c12/node_modules/readdirp": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz", + "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==", + "license": "MIT", + "engines": { + "node": ">= 14.18.0" + }, + "funding": { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + }, "node_modules/cac": { "version": "6.7.14", "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz", @@ -15550,15 +16047,18 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/ccount/-/ccount-2.0.1.tgz", "integrity": "sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==", + "dev": true, "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" } }, "node_modules/chai": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/chai/-/chai-5.1.1.tgz", - "integrity": "sha512-pT1ZgP8rPNqUgieVaEY+ryQr6Q4HXNg8Ei9UnLUrjN4IA7dvQC5JB+/kxVcPNDHyBcc/26CXPkbNzq3qwrOEKA==", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/chai/-/chai-5.2.0.tgz", + "integrity": "sha512-mCuXncKXk5iCLhfhwTc0izo0gtEmpz5CtG2y8GiOINBlMVS6v8TMRc5TaLWKS6692m9+dVVfzgeVxR5UxWHTYw==", + "dev": true, + "license": "MIT", "dependencies": { "assertion-error": "^2.0.1", "check-error": "^2.1.1", @@ -15570,21 +16070,11 @@ "node": ">=12" } }, - "node_modules/chai-dom": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/chai-dom/-/chai-dom-1.12.0.tgz", - "integrity": "sha512-pLP8h6IBR8z1AdeQ+EMcJ7dXPdsax/1Q7gdGZjsnAmSBl3/gItQUYSCo32br1qOy4SlcBjvqId7ilAf3uJ2K1w==", - "engines": { - "node": ">= 0.12.0" - }, - "peerDependencies": { - "chai": ">= 3" - } - }, "node_modules/chalk": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", - "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", + "version": "5.6.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.6.2.tgz", + "integrity": "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==", + "license": "MIT", "engines": { "node": "^12.17.0 || ^14.13 || >=16.0.0" }, @@ -15592,18 +16082,11 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/char-regex": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", - "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", - "engines": { - "node": ">=10" - } - }, "node_modules/character-entities": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-2.0.2.tgz", "integrity": "sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==", + "dev": true, "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" @@ -15613,6 +16096,7 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/character-entities-html4/-/character-entities-html4-2.1.0.tgz", "integrity": "sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==", + "dev": true, "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" @@ -15622,6 +16106,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-3.0.0.tgz", "integrity": "sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==", + "dev": true, "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" @@ -15631,6 +16116,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-2.0.1.tgz", "integrity": "sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==", + "dev": true, "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" @@ -15640,6 +16126,7 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/check-error/-/check-error-2.1.1.tgz", "integrity": "sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==", + "dev": true, "engines": { "node": ">= 16" } @@ -15690,6 +16177,15 @@ "node": ">=8" } }, + "node_modules/citty": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/citty/-/citty-0.1.6.tgz", + "integrity": "sha512-tskPPKEs8D2KPafUypv2gxwJP8h/OaJmC82QQGGDQcHvXX43xF2VDACcJVmZ0EuSxkpO9Kc4MlrA3q0+FG58AQ==", + "license": "MIT", + "dependencies": { + "consola": "^3.2.3" + } + }, "node_modules/class-variance-authority": { "version": "0.7.0", "resolved": "https://registry.npmjs.org/class-variance-authority/-/class-variance-authority-0.7.0.tgz", @@ -15709,31 +16205,6 @@ "node": ">=6" } }, - "node_modules/clean-stack": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-5.2.0.tgz", - "integrity": "sha512-TyUIUJgdFnCISzG5zu3291TAsE77ddchd0bepon1VVQrKLGKFED4iXFEDQ24mIPdPBbyE16PK3F8MYE1CmcBEQ==", - "dependencies": { - "escape-string-regexp": "5.0.0" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/clean-stack/node_modules/escape-string-regexp": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", - "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/cli-cursor": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", @@ -15763,6 +16234,7 @@ "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-4.1.0.tgz", "integrity": "sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==", "dev": true, + "license": "ISC", "engines": { "node": ">= 12" } @@ -15873,19 +16345,11 @@ "node": ">=6" } }, - "node_modules/collapse-white-space": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/collapse-white-space/-/collapse-white-space-2.1.0.tgz", - "integrity": "sha512-loKTxY1zCOuG4j9f6EPnuyyYkf58RnhhWTvRoZEokgB+WbdXehfjFviyOVYkqzEWz1Q5kRiZdBYS5SwxbQYwzw==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, "node_modules/color-convert": { "version": "1.9.3", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, "dependencies": { "color-name": "1.1.3" } @@ -15893,7 +16357,8 @@ "node_modules/color-name": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true }, "node_modules/combined-stream": { "version": "1.0.8", @@ -15911,6 +16376,7 @@ "version": "2.0.3", "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz", "integrity": "sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==", + "dev": true, "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" @@ -15992,7 +16458,16 @@ "proto-list": "~1.2.1" } }, - "node_modules/content-disposition": { + "node_modules/consola": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/consola/-/consola-3.4.2.tgz", + "integrity": "sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA==", + "license": "MIT", + "engines": { + "node": "^14.18.0 || >=16.10.0" + } + }, + "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==", @@ -16103,9 +16578,10 @@ } }, "node_modules/cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "license": "MIT", "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", @@ -16165,7 +16641,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==" + "integrity": "sha512-YUifsXXuknHlUsmlgyY0PKzgPOr7/FjCePfHNt0jxm83wHZi44VDMQ7/fGNkjY3/jV1MC+1CmZbaHzugyeRtpg==", + "dev": true }, "node_modules/cssesc": { "version": "3.0.0", @@ -16290,11 +16767,12 @@ } }, "node_modules/debug": { - "version": "4.3.5", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.5.tgz", - "integrity": "sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg==", + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "license": "MIT", "dependencies": { - "ms": "2.1.2" + "ms": "^2.1.3" }, "engines": { "node": ">=6.0" @@ -16323,6 +16801,7 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/decode-named-character-reference/-/decode-named-character-reference-1.0.2.tgz", "integrity": "sha512-O8x12RzrUF8xyVcY0KJowWsmaJxQbmy0/EtnNtHRpsOcT7dFk5W598coHqBVpmWo1oQQfsCqfCmkZN5DJrZVdg==", + "dev": true, "dependencies": { "character-entities": "^2.0.0" }, @@ -16349,6 +16828,7 @@ "version": "5.0.2", "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-5.0.2.tgz", "integrity": "sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==", + "dev": true, "engines": { "node": ">=6" } @@ -16405,6 +16885,15 @@ "node": ">=0.10.0" } }, + "node_modules/deepmerge-ts": { + "version": "7.1.5", + "resolved": "https://registry.npmjs.org/deepmerge-ts/-/deepmerge-ts-7.1.5.tgz", + "integrity": "sha512-HOJkrhaYsweh+W+e74Yn7YStZOilkoPb6fycpwNLKzSPtruFs48nYis0zy5yJz1+ktUhHxoRDJ27RQAWLIJVJw==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=16.0.0" + } + }, "node_modules/defaults": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz", @@ -16450,6 +16939,12 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/defu": { + "version": "6.1.4", + "resolved": "https://registry.npmjs.org/defu/-/defu-6.1.4.tgz", + "integrity": "sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg==", + "license": "MIT" + }, "node_modules/delayed-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", @@ -16471,10 +16966,17 @@ "version": "2.0.3", "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", + "dev": true, "engines": { "node": ">=6" } }, + "node_modules/destr": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/destr/-/destr-2.0.5.tgz", + "integrity": "sha512-ugFTXCtDZunbzasqBxrK93Ik/DRYsO6S/fedkWEMKqt04xZ4csmnmwGDBAb07QWNaGMAmnTIemsYZCksjATwsA==", + "license": "MIT" + }, "node_modules/destroy": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", @@ -16489,18 +16991,6 @@ "resolved": "https://registry.npmjs.org/detect-node-es/-/detect-node-es-1.1.0.tgz", "integrity": "sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==" }, - "node_modules/devlop": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/devlop/-/devlop-1.1.0.tgz", - "integrity": "sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==", - "dependencies": { - "dequal": "^2.0.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, "node_modules/didyoumean": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", @@ -16552,7 +17042,8 @@ "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==" + "integrity": "sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==", + "dev": true }, "node_modules/dom-serializer": { "version": "2.0.0", @@ -16606,10 +17097,10 @@ } }, "node_modules/dotenv": { - "version": "16.4.5", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.5.tgz", - "integrity": "sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==", - "dev": true, + "version": "16.6.1", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.6.1.tgz", + "integrity": "sha512-uBq4egWHTcTt33a72vpSG0z3HnPuIl6NqYcTrKEg2azoEyl2hpW0zqlxysq2pK9HlDIHyHyakeYaYnSAwd8bow==", + "license": "BSD-2-Clause", "engines": { "node": ">=12" }, @@ -16708,6 +17199,16 @@ "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" }, + "node_modules/effect": { + "version": "3.18.4", + "resolved": "https://registry.npmjs.org/effect/-/effect-3.18.4.tgz", + "integrity": "sha512-b1LXQJLe9D11wfnOKAk3PKxuqYshQ0Heez+y5pnkd3jLj1yx9QhM72zZ9uUrOQyNvrs2GZZd/3maL0ZV18YuDA==", + "license": "MIT", + "dependencies": { + "@standard-schema/spec": "^1.0.0", + "fast-check": "^3.23.1" + } + }, "node_modules/electron-to-chromium": { "version": "1.4.823", "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.823.tgz", @@ -16719,18 +17220,13 @@ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==" }, - "node_modules/emojilib": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/emojilib/-/emojilib-2.4.0.tgz", - "integrity": "sha512-5U0rVMU5Y2n2+ykNLQqMoqklN9ICBT/KsvC1Gz6vqHbz2AXXGkG+Pm5rMWk/8Vjrr/mY9985Hi8DYzn1F09Nyw==" - }, - "node_modules/emoticon": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/emoticon/-/emoticon-4.0.1.tgz", - "integrity": "sha512-dqx7eA9YaqyvYtUhJwT4rC1HIp82j5ybS1/vQ42ur+jBe17dJMwZE4+gvL1XadSFfxaPFFGt3Xsw+Y8akThDlw==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" + "node_modules/empathic": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/empathic/-/empathic-2.0.0.tgz", + "integrity": "sha512-i6UzDscO/XfAcNYD75CfICkmfLedpyPDdozrLMmQc5ORaQcdMoc21OnlEylMIqI7U8eniKrPMxxtj8k0vhmJhA==", + "license": "MIT", + "engines": { + "node": ">=14" } }, "node_modules/encode-utf8": { @@ -17047,17 +17543,6 @@ "node": ">=6" } }, - "node_modules/escape-goat": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-goat/-/escape-goat-4.0.0.tgz", - "integrity": "sha512-2Sd4ShcWxbx6OY1IHyla/CVNwvg7XwZVoXZHcSu9w9SReNP1EzzD5T8NWKIR38fIqEns9kDWKUQTXXAmlDrdPg==", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/escape-html": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", @@ -17067,6 +17552,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, "engines": { "node": ">=10" }, @@ -17923,18 +18409,6 @@ "url": "https://opencollective.com/eslint" } }, - "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/esquery": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", @@ -17968,56 +18442,6 @@ "node": ">=4.0" } }, - "node_modules/estree-util-attach-comments": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/estree-util-attach-comments/-/estree-util-attach-comments-3.0.0.tgz", - "integrity": "sha512-cKUwm/HUcTDsYh/9FgnuFqpfquUbwIqwKM26BVCGDPVgvaCl/nDCCjUfiLlx6lsEZ3Z4RFxNbOQ60pkaEwFxGw==", - "dependencies": { - "@types/estree": "^1.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/estree-util-build-jsx": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/estree-util-build-jsx/-/estree-util-build-jsx-3.0.1.tgz", - "integrity": "sha512-8U5eiL6BTrPxp/CHbs2yMgP8ftMhR5ww1eIKoWRMlqvltHF8fZn5LRDvTKuxD3DUn+shRbLGqXemcP51oFCsGQ==", - "dependencies": { - "@types/estree-jsx": "^1.0.0", - "devlop": "^1.0.0", - "estree-util-is-identifier-name": "^3.0.0", - "estree-walker": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/estree-util-is-identifier-name": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/estree-util-is-identifier-name/-/estree-util-is-identifier-name-3.0.0.tgz", - "integrity": "sha512-hFtqIDZTIUZ9BXLb8y4pYGyk6+wekIivNVTcmvk8NoOh+VeRn5y6cEHzbURrWbfp1fIqdVipilzj+lfaadNZmg==", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/estree-util-to-js": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/estree-util-to-js/-/estree-util-to-js-2.0.0.tgz", - "integrity": "sha512-WDF+xj5rRWmD5tj6bIqRi6CkLIXbbNQUcxQHzGysQzvHmdYG2G7p/Tf0J0gpxGgkeMZNTIjT/AoSvC9Xehcgdg==", - "dependencies": { - "@types/estree-jsx": "^1.0.0", - "astring": "^1.8.0", - "source-map": "^0.7.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, "node_modules/estree-util-value-to-estree": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/estree-util-value-to-estree/-/estree-util-value-to-estree-1.3.0.tgz", @@ -18042,23 +18466,11 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/estree-util-visit": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/estree-util-visit/-/estree-util-visit-2.0.0.tgz", - "integrity": "sha512-m5KgiH85xAhhW8Wta0vShLcUvOsh3LLPI2YVwcbio1l7E09NTLL1EyMZFM1OyWowoH0skScNbhOPl4kcBgzTww==", - "dependencies": { - "@types/estree-jsx": "^1.0.0", - "@types/unist": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, "node_modules/estree-walker": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", + "dev": true, "dependencies": { "@types/estree": "^1.0.0" } @@ -18101,28 +18513,25 @@ "node": ">=6" } }, - "node_modules/eventemitter3": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz", - "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==" - }, "node_modules/execa": { - "version": "9.3.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-9.3.0.tgz", - "integrity": "sha512-l6JFbqnHEadBoVAVpN5dl2yCyfX28WoBAGaoQcNmLLSedOxTxcn2Qa83s8I/PA5i56vWru2OHOtrwF7Om2vqlg==", + "version": "9.6.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-9.6.0.tgz", + "integrity": "sha512-jpWzZ1ZhwUmeWRhS7Qv3mhpOhLfwI+uAX4e5fOcXqwMR7EcJ0pj2kV1CVzHVMX/LphnKWD3LObjZCoJ71lKpHw==", + "dev": true, + "license": "MIT", "dependencies": { "@sindresorhus/merge-streams": "^4.0.0", - "cross-spawn": "^7.0.3", + "cross-spawn": "^7.0.6", "figures": "^6.1.0", "get-stream": "^9.0.0", - "human-signals": "^7.0.0", + "human-signals": "^8.0.1", "is-plain-obj": "^4.1.0", "is-stream": "^4.0.1", - "npm-run-path": "^5.2.0", - "pretty-ms": "^9.0.0", + "npm-run-path": "^6.0.0", + "pretty-ms": "^9.2.0", "signal-exit": "^4.1.0", "strip-final-newline": "^4.0.0", - "yoctocolors": "^2.0.0" + "yoctocolors": "^2.1.1" }, "engines": { "node": "^18.19.0 || >=20.5.0" @@ -18131,10 +18540,28 @@ "url": "https://github.com/sindresorhus/execa?sponsor=1" } }, + "node_modules/execa/node_modules/npm-run-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-6.0.0.tgz", + "integrity": "sha512-9qny7Z9DsQU8Ou39ERsPU4OZQlSTP47ShQzuKZ6PRXpYLtIFgl/DEBYEXKlvcEa+9tHVcK8CF81Y2V72qaZhWA==", + "dev": true, + "dependencies": { + "path-key": "^4.0.0", + "unicorn-magic": "^0.3.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/execa/node_modules/parse-ms": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/parse-ms/-/parse-ms-4.0.0.tgz", "integrity": "sha512-TXfryirbmq34y8QBwgqCVLi+8oA3oWx2eAnSn62ITyEhEYaWRlVZ2DvMM9eZbMs/RfxPu/PK/aBLyGj4IrqMHw==", + "dev": true, + "license": "MIT", "engines": { "node": ">=18" }, @@ -18142,10 +18569,24 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/execa/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==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/execa/node_modules/pretty-ms": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/pretty-ms/-/pretty-ms-9.0.0.tgz", - "integrity": "sha512-E9e9HJ9R9NasGOgPaPE8VMeiPKAyWR5jcFpNnwIejslIhWqdqOrb2wShBsncMPUb+BcCd2OPYfh7p2W6oemTng==", + "version": "9.2.0", + "resolved": "https://registry.npmjs.org/pretty-ms/-/pretty-ms-9.2.0.tgz", + "integrity": "sha512-4yf0QO/sllf/1zbZWYnvWw3NxCQwLXKzIj0G849LSufP15BXKM0rbD2Z3wVnkMfjdn/CB0Dpp444gYAACdsplg==", + "dev": true, + "license": "MIT", "dependencies": { "parse-ms": "^4.0.0" }, @@ -18476,20 +18917,38 @@ } ] }, + "node_modules/exsolve": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/exsolve/-/exsolve-1.0.8.tgz", + "integrity": "sha512-LmDxfWXwcTArk8fUEnOfSZpHOJ6zOMUJKOtFLFqJLoKJetuQG874Uc7/Kki7zFLzYybmZhp1M7+98pfMqeX8yA==", + "license": "MIT" + }, "node_modules/extend": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "dev": true }, - "node_modules/extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", + "node_modules/fast-check": { + "version": "3.23.2", + "resolved": "https://registry.npmjs.org/fast-check/-/fast-check-3.23.2.tgz", + "integrity": "sha512-h5+1OzzfCC3Ef7VbtKdcv7zsstUQwUDlYpUTvjeUsJAssPgLn7QzbboPtL5ro04Mq0rPOsMzl7q5hIbRs2wD1A==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/dubzzz" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fast-check" + } + ], + "license": "MIT", "dependencies": { - "is-extendable": "^0.1.0" + "pure-rand": "^6.1.0" }, "engines": { - "node": ">=0.10.0" + "node": ">=8.0.0" } }, "node_modules/fast-deep-equal": { @@ -18499,15 +18958,16 @@ "dev": true }, "node_modules/fast-glob": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", - "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", + "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", + "license": "MIT", "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.4" + "micromatch": "^4.0.8" }, "engines": { "node": ">=8.6.0" @@ -18537,6 +18997,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/fault/-/fault-2.0.1.tgz", "integrity": "sha512-WtySTkS4OKev5JtpHXnib4Gxiurzh5NCGvWrFaZ34m6JehfTUhKZvn9njTfw48t6JumVQOmrKqpmGcdwxnhqBQ==", + "dev": true, "dependencies": { "format": "^0.2.0" }, @@ -18549,6 +19010,7 @@ "version": "6.1.0", "resolved": "https://registry.npmjs.org/figures/-/figures-6.1.0.tgz", "integrity": "sha512-d+l3qxjSesT4V7v2fh+QnmFnUWv9lSpjarhShNTgBOfA0ttejbQUAlHLitbjkoRiDulW0OPoQPYIGhIC8ohejg==", + "dev": true, "dependencies": { "is-unicode-supported": "^2.0.0" }, @@ -18636,113 +19098,6 @@ "micromatch": "^4.0.2" } }, - "node_modules/fkill": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/fkill/-/fkill-9.0.0.tgz", - "integrity": "sha512-MdYSsbdCaIRjzo5edthZtWmEZVMfr1qrtYZUHIdO3swCE+CoZA8S5l0s4jDsYlTa9ZiXv0pTgpzE7s4N8NeUOA==", - "dependencies": { - "aggregate-error": "^5.0.0", - "execa": "^8.0.1", - "pid-port": "^1.0.0", - "process-exists": "^5.0.0", - "ps-list": "^8.1.1", - "taskkill": "^5.0.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/fkill/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/fkill/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/fkill/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/fkill/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/fkill/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/fkill/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/fkill/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/flat-cache": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", @@ -18772,11 +19127,12 @@ } }, "node_modules/foreground-child": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.2.1.tgz", - "integrity": "sha512-PXUUyLqrR2XCWICfv6ukppP96sdFwWbNEnfEMt7jNsISjMsvaLNinAHNDYyvkyU+SZG2BTSbT5NjG+vZslfGTA==", + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz", + "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==", + "license": "ISC", "dependencies": { - "cross-spawn": "^7.0.0", + "cross-spawn": "^7.0.6", "signal-exit": "^4.0.1" }, "engines": { @@ -18804,6 +19160,7 @@ "version": "0.2.2", "resolved": "https://registry.npmjs.org/format/-/format-0.2.2.tgz", "integrity": "sha512-wzsgA6WOq+09wrU1tsJ09udeR/YZRaeArL9e1wPbFg3GG2yDnC2ldKpxs4xunpFF9DgqCqOIra3bc1HWrJ37Ww==", + "dev": true, "engines": { "node": ">=0.4.x" } @@ -18844,9 +19201,11 @@ "dev": true }, "node_modules/fs-extra": { - "version": "11.2.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.2.0.tgz", - "integrity": "sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==", + "version": "11.3.2", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.2.tgz", + "integrity": "sha512-Xr9F6z6up6Ws+NjzMCZc6WXg2YFRlrLP9NQDO3VQrWrfiojdhS56TzueT88ze0uBdCTwEIhQ3ptnmKeWGFAe0A==", + "dev": true, + "license": "MIT", "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", @@ -18947,14 +19306,6 @@ "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.4", "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", @@ -18996,6 +19347,7 @@ "version": "9.0.1", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-9.0.1.tgz", "integrity": "sha512-kVCxPF3vQM/N0B1PmoqVUqgHP+EeVjmZSQn+1oCRPxd2P21P2F19lIgbR3HBosbB1PUhOAoctJnfEn2GbN2eZA==", + "dev": true, "dependencies": { "@sec-ant/readable-stream": "^0.4.1", "is-stream": "^4.0.1" @@ -19036,20 +19388,44 @@ "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" } }, - "node_modules/glob": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-11.0.0.tgz", - "integrity": "sha512-9UiX/Bl6J2yaBbxKoEBRm4Cipxgok8kQYcOPEhScPwebu2I0HoQOuYdIO6S3hLuWoZgpDpwQZMzTFxgpkyT76g==", + "node_modules/giget": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/giget/-/giget-2.0.0.tgz", + "integrity": "sha512-L5bGsVkxJbJgdnwyuheIunkGatUF/zssUoxxjACCseZYAVbaqdh9Tsmmlkl8vYan09H7sbvKt4pS8GqKLBrEzA==", + "license": "MIT", "dependencies": { - "foreground-child": "^3.1.0", - "jackspeak": "^4.0.1", - "minimatch": "^10.0.0", - "minipass": "^7.1.2", - "package-json-from-dist": "^1.0.0", - "path-scurry": "^2.0.0" + "citty": "^0.1.6", + "consola": "^3.4.0", + "defu": "^6.1.4", + "node-fetch-native": "^1.6.6", + "nypm": "^0.6.0", + "pathe": "^2.0.3" }, "bin": { - "glob": "dist/esm/bin.mjs" + "giget": "dist/cli.mjs" + } + }, + "node_modules/giget/node_modules/pathe": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", + "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", + "license": "MIT" + }, + "node_modules/glob": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-11.1.0.tgz", + "integrity": "sha512-vuNwKSaKiqm7g0THUBu2x7ckSs3XJLXE+2ssL7/MfTGPLLcrJQ/4Uq1CjPTtO5cCIiRxqvN6Twy1qOwhL0Xjcw==", + "license": "BlueOak-1.0.0", + "dependencies": { + "foreground-child": "^3.3.1", + "jackspeak": "^4.1.1", + "minimatch": "^10.1.1", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^2.0.0" + }, + "bin": { + "glob": "dist/esm/bin.mjs" }, "engines": { "node": "20 || >=22" @@ -19070,11 +19446,12 @@ } }, "node_modules/glob/node_modules/minimatch": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.0.1.tgz", - "integrity": "sha512-ethXTt3SGGR+95gudmqJ1eNhRO7eGEGIgYA9vnPatK4/etz2MEVDno5GMCibdMTuBMyElzIlgxMna3K94XDIDQ==", + "version": "10.1.1", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.1.1.tgz", + "integrity": "sha512-enIvLvRAFZYXJzkCYG5RKmPfrFArdLv+R+lbQ53BmIMLIry74bjKzX6iHAm8WYamJkhSSEabrWN5D97XnKObjQ==", + "license": "BlueOak-1.0.0", "dependencies": { - "brace-expansion": "^2.0.1" + "@isaacs/brace-expansion": "^5.0.0" }, "engines": { "node": "20 || >=22" @@ -19108,47 +19485,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/globby": { - "version": "14.0.2", - "resolved": "https://registry.npmjs.org/globby/-/globby-14.0.2.tgz", - "integrity": "sha512-s3Fq41ZVh7vbbe2PN3nrW7yC7U7MFVc5c98/iTl9c2GawNMKx/J648KQRW6WKkuU8GIbbh2IXfIRQjOZnXcTnw==", - "dependencies": { - "@sindresorhus/merge-streams": "^2.1.0", - "fast-glob": "^3.3.2", - "ignore": "^5.2.4", - "path-type": "^5.0.0", - "slash": "^5.1.0", - "unicorn-magic": "^0.1.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/globby/node_modules/@sindresorhus/merge-streams": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/merge-streams/-/merge-streams-2.3.0.tgz", - "integrity": "sha512-LtoMMhxAlorcGhmFYI+LhPgbPZCkgP6ra1YL604EeF6U98pLlQ3iWIGMdWSC+vWmPBWBNgmDBAhnAobLROJmwg==", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/globby/node_modules/path-type": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-5.0.0.tgz", - "integrity": "sha512-5HviZNaZcfqP95rwpv+1HDgUamezbqdSYTyzjTvwtJSnIH+3vnbmWsItli8OFEndS984VT55M3jduxZbX351gg==", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/gopd": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", @@ -19172,48 +19508,15 @@ "dev": true }, "node_modules/graphql": { - "version": "16.9.0", - "resolved": "https://registry.npmjs.org/graphql/-/graphql-16.9.0.tgz", - "integrity": "sha512-GGTKBX4SD7Wdb8mqeDLni2oaRGYQWjWHGKPQ24ZMnUtKfcsVoiv4uX8+LJr1K6U5VW2Lu1BwJnj7uiori0YtRw==", + "version": "16.12.0", + "resolved": "https://registry.npmjs.org/graphql/-/graphql-16.12.0.tgz", + "integrity": "sha512-DKKrynuQRne0PNpEbzuEdHlYOMksHSUI8Zc9Unei5gTsMNA2/vMpoMz/yKba50pejK56qj98qM0SjYxAKi13gQ==", "dev": true, + "license": "MIT", "engines": { "node": "^12.22.0 || ^14.16.0 || ^16.0.0 || >=17.0.0" } }, - "node_modules/gray-matter": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/gray-matter/-/gray-matter-4.0.3.tgz", - "integrity": "sha512-5v6yZd4JK3eMI3FqqCouswVqwugaA9r4dNZB1wwcmrD02QkV5H0y7XBQW8QwQqEaZY1pM9aqORSORhJRdNK44Q==", - "dependencies": { - "js-yaml": "^3.13.1", - "kind-of": "^6.0.2", - "section-matter": "^1.0.0", - "strip-bom-string": "^1.0.0" - }, - "engines": { - "node": ">=6.0" - } - }, - "node_modules/gray-matter/node_modules/argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dependencies": { - "sprintf-js": "~1.0.2" - } - }, - "node_modules/gray-matter/node_modules/js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", - "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, "node_modules/gunzip-maybe": { "version": "1.4.2", "resolved": "https://registry.npmjs.org/gunzip-maybe/-/gunzip-maybe-1.4.2.tgz", @@ -19306,213 +19609,6 @@ "node": ">= 0.4" } }, - "node_modules/hast-util-from-html": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/hast-util-from-html/-/hast-util-from-html-2.0.1.tgz", - "integrity": "sha512-RXQBLMl9kjKVNkJTIO6bZyb2n+cUH8LFaSSzo82jiLT6Tfc+Pt7VQCS+/h3YwG4jaNE2TA2sdJisGWR+aJrp0g==", - "dependencies": { - "@types/hast": "^3.0.0", - "devlop": "^1.1.0", - "hast-util-from-parse5": "^8.0.0", - "parse5": "^7.0.0", - "vfile": "^6.0.0", - "vfile-message": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/hast-util-from-parse5": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/hast-util-from-parse5/-/hast-util-from-parse5-8.0.1.tgz", - "integrity": "sha512-Er/Iixbc7IEa7r/XLtuG52zoqn/b3Xng/w6aZQ0xGVxzhw5xUFxcRqdPzP6yFi/4HBYRaifaI5fQ1RH8n0ZeOQ==", - "dependencies": { - "@types/hast": "^3.0.0", - "@types/unist": "^3.0.0", - "devlop": "^1.0.0", - "hastscript": "^8.0.0", - "property-information": "^6.0.0", - "vfile": "^6.0.0", - "vfile-location": "^5.0.0", - "web-namespaces": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/hast-util-parse-selector": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/hast-util-parse-selector/-/hast-util-parse-selector-4.0.0.tgz", - "integrity": "sha512-wkQCkSYoOGCRKERFWcxMVMOcYE2K1AaNLU8DXS9arxnLOUEWbOXKXiJUNzEpqZ3JOKpnha3jkFrumEjVliDe7A==", - "dependencies": { - "@types/hast": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/hast-util-raw": { - "version": "9.0.4", - "resolved": "https://registry.npmjs.org/hast-util-raw/-/hast-util-raw-9.0.4.tgz", - "integrity": "sha512-LHE65TD2YiNsHD3YuXcKPHXPLuYh/gjp12mOfU8jxSrm1f/yJpsb0F/KKljS6U9LJoP0Ux+tCe8iJ2AsPzTdgA==", - "dependencies": { - "@types/hast": "^3.0.0", - "@types/unist": "^3.0.0", - "@ungap/structured-clone": "^1.0.0", - "hast-util-from-parse5": "^8.0.0", - "hast-util-to-parse5": "^8.0.0", - "html-void-elements": "^3.0.0", - "mdast-util-to-hast": "^13.0.0", - "parse5": "^7.0.0", - "unist-util-position": "^5.0.0", - "unist-util-visit": "^5.0.0", - "vfile": "^6.0.0", - "web-namespaces": "^2.0.0", - "zwitch": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/hast-util-to-estree": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/hast-util-to-estree/-/hast-util-to-estree-3.1.0.tgz", - "integrity": "sha512-lfX5g6hqVh9kjS/B9E2gSkvHH4SZNiQFiqWS0x9fENzEl+8W12RqdRxX6d/Cwxi30tPQs3bIO+aolQJNp1bIyw==", - "dependencies": { - "@types/estree": "^1.0.0", - "@types/estree-jsx": "^1.0.0", - "@types/hast": "^3.0.0", - "comma-separated-tokens": "^2.0.0", - "devlop": "^1.0.0", - "estree-util-attach-comments": "^3.0.0", - "estree-util-is-identifier-name": "^3.0.0", - "hast-util-whitespace": "^3.0.0", - "mdast-util-mdx-expression": "^2.0.0", - "mdast-util-mdx-jsx": "^3.0.0", - "mdast-util-mdxjs-esm": "^2.0.0", - "property-information": "^6.0.0", - "space-separated-tokens": "^2.0.0", - "style-to-object": "^0.4.0", - "unist-util-position": "^5.0.0", - "zwitch": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/hast-util-to-html": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/hast-util-to-html/-/hast-util-to-html-9.0.1.tgz", - "integrity": "sha512-hZOofyZANbyWo+9RP75xIDV/gq+OUKx+T46IlwERnKmfpwp81XBFbT9mi26ws+SJchA4RVUQwIBJpqEOBhMzEQ==", - "dependencies": { - "@types/hast": "^3.0.0", - "@types/unist": "^3.0.0", - "ccount": "^2.0.0", - "comma-separated-tokens": "^2.0.0", - "hast-util-raw": "^9.0.0", - "hast-util-whitespace": "^3.0.0", - "html-void-elements": "^3.0.0", - "mdast-util-to-hast": "^13.0.0", - "property-information": "^6.0.0", - "space-separated-tokens": "^2.0.0", - "stringify-entities": "^4.0.0", - "zwitch": "^2.0.4" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/hast-util-to-jsx-runtime": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/hast-util-to-jsx-runtime/-/hast-util-to-jsx-runtime-2.3.0.tgz", - "integrity": "sha512-H/y0+IWPdsLLS738P8tDnrQ8Z+dj12zQQ6WC11TIM21C8WFVoIxcqWXf2H3hiTVZjF1AWqoimGwrTWecWrnmRQ==", - "dependencies": { - "@types/estree": "^1.0.0", - "@types/hast": "^3.0.0", - "@types/unist": "^3.0.0", - "comma-separated-tokens": "^2.0.0", - "devlop": "^1.0.0", - "estree-util-is-identifier-name": "^3.0.0", - "hast-util-whitespace": "^3.0.0", - "mdast-util-mdx-expression": "^2.0.0", - "mdast-util-mdx-jsx": "^3.0.0", - "mdast-util-mdxjs-esm": "^2.0.0", - "property-information": "^6.0.0", - "space-separated-tokens": "^2.0.0", - "style-to-object": "^1.0.0", - "unist-util-position": "^5.0.0", - "vfile-message": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/hast-util-to-jsx-runtime/node_modules/inline-style-parser": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.2.3.tgz", - "integrity": "sha512-qlD8YNDqyTKTyuITrDOffsl6Tdhv+UC4hcdAVuQsK4IMQ99nSgd1MIA/Q+jQYoh9r3hVUXhYh7urSRmXPkW04g==" - }, - "node_modules/hast-util-to-jsx-runtime/node_modules/style-to-object": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/style-to-object/-/style-to-object-1.0.6.tgz", - "integrity": "sha512-khxq+Qm3xEyZfKd/y9L3oIWQimxuc4STrQKtQn8aSDRHb8mFgpukgX1hdzfrMEW6JCjyJ8p89x+IUMVnCBI1PA==", - "dependencies": { - "inline-style-parser": "0.2.3" - } - }, - "node_modules/hast-util-to-parse5": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/hast-util-to-parse5/-/hast-util-to-parse5-8.0.0.tgz", - "integrity": "sha512-3KKrV5ZVI8if87DVSi1vDeByYrkGzg4mEfeu4alwgmmIeARiBLKCZS2uw5Gb6nU9x9Yufyj3iudm6i7nl52PFw==", - "dependencies": { - "@types/hast": "^3.0.0", - "comma-separated-tokens": "^2.0.0", - "devlop": "^1.0.0", - "property-information": "^6.0.0", - "space-separated-tokens": "^2.0.0", - "web-namespaces": "^2.0.0", - "zwitch": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/hast-util-whitespace": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/hast-util-whitespace/-/hast-util-whitespace-3.0.0.tgz", - "integrity": "sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==", - "dependencies": { - "@types/hast": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/hastscript": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/hastscript/-/hastscript-8.0.0.tgz", - "integrity": "sha512-dMOtzCEd3ABUeSIISmrETiKuyydk1w0pa+gE/uormcTpSYuaNJPbX1NU3JLyscSLjwAQM8bWMhhIlnCqnRvDTw==", - "dependencies": { - "@types/hast": "^3.0.0", - "comma-separated-tokens": "^2.0.0", - "hast-util-parse-selector": "^4.0.0", - "property-information": "^6.0.0", - "space-separated-tokens": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, "node_modules/he": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", @@ -19582,15 +19678,6 @@ "node": ">=14" } }, - "node_modules/html-void-elements": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/html-void-elements/-/html-void-elements-3.0.0.tgz", - "integrity": "sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, "node_modules/htmlparser2": { "version": "8.0.2", "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-8.0.2.tgz", @@ -19651,9 +19738,11 @@ } }, "node_modules/human-signals": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-7.0.0.tgz", - "integrity": "sha512-74kytxOUSvNbjrT9KisAbaTZ/eJwD/LrbM/kh5j0IhPuJzwuA19dWvniFGwBzN9rVjg+O/e+F310PjObDXS+9Q==", + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-8.0.1.tgz", + "integrity": "sha512-eKCa6bwnJhvxj14kZk5NCPc6Hb6BdsU9DZcOnmQKSnO1VKrfV0zCvtttPZUsBvjmNDn8rpcJfpwSYnHBjc95MQ==", + "dev": true, + "license": "Apache-2.0", "engines": { "node": ">=18.18.0" } @@ -19702,9 +19791,11 @@ ] }, "node_modules/ignore": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.1.tgz", - "integrity": "sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==", + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "dev": true, + "license": "MIT", "engines": { "node": ">= 4" } @@ -19734,17 +19825,6 @@ "node": ">=0.8.19" } }, - "node_modules/indent-string": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-5.0.0.tgz", - "integrity": "sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg==", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/inflight": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", @@ -19768,7 +19848,8 @@ "node_modules/inline-style-parser": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.1.1.tgz", - "integrity": "sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q==" + "integrity": "sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q==", + "dev": true }, "node_modules/internal-slot": { "version": "1.0.7", @@ -19804,6 +19885,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-2.0.1.tgz", "integrity": "sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==", + "dev": true, "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" @@ -19813,6 +19895,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-2.0.1.tgz", "integrity": "sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==", + "dev": true, "dependencies": { "is-alphabetical": "^2.0.0", "is-decimal": "^2.0.0" @@ -19917,6 +20000,7 @@ "version": "2.0.5", "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz", "integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==", + "dev": true, "funding": [ { "type": "github", @@ -19994,6 +20078,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-2.0.1.tgz", "integrity": "sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==", + "dev": true, "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" @@ -20019,14 +20104,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", @@ -20093,6 +20170,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-2.0.1.tgz", "integrity": "sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==", + "dev": true, "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" @@ -20135,7 +20213,8 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/is-node-process/-/is-node-process-1.2.0.tgz", "integrity": "sha512-Vg4o6/fqPxIjtxgUH5QLJhwZ7gW5diGCVlXpuUfELC62CuxM1iHcRe51f2W1FDy04Ai4KJkagKjx3XaqyfRKXw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/is-number": { "version": "7.0.0", @@ -20173,6 +20252,7 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz", "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==", + "dev": true, "engines": { "node": ">=12" }, @@ -20190,6 +20270,7 @@ "version": "3.0.2", "resolved": "https://registry.npmjs.org/is-reference/-/is-reference-3.0.2.tgz", "integrity": "sha512-v3rht/LgVcsdZa3O2Nqs+NMowLOxeOm7Ay9+/ARQ2F+qEoANRcqrjAZKGN0v8ymUetZGgkp26LTnGT7H0Qo9Pg==", + "dev": true, "dependencies": { "@types/estree": "*" } @@ -20241,6 +20322,7 @@ "version": "4.0.1", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-4.0.1.tgz", "integrity": "sha512-Dnz92NInDqYckGEUJv689RbRiTSEHCQ7wOVeALbkOz999YpqT46yMRIGtSNl2iCL1waAZSx40+h59NV/EwzV/A==", + "dev": true, "engines": { "node": ">=18" }, @@ -20296,6 +20378,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-2.0.0.tgz", "integrity": "sha512-FRdAyx5lusK1iHG0TWpVtk9+1i+GjrzRffhDg4ovQ7mcidMQ6mj+MhKPmvh7Xwyv5gIS06ns49CA7Sqg7lC22Q==", + "dev": true, "engines": { "node": ">=18" }, @@ -20436,9 +20519,10 @@ } }, "node_modules/jackspeak": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-4.0.1.tgz", - "integrity": "sha512-cub8rahkh0Q/bw1+GxP7aeSe29hHHn2V4m29nnDlvCdlgU+3UGxkZp7Z53jLUdpX3jdTO0nJZUDl3xvbWc2Xog==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-4.1.1.tgz", + "integrity": "sha512-zptv57P3GpL+O0I7VdMJNBZCu+BPHVQUk55Ft8/QCJjTVxrnJHuVuX/0Bl2A6/+2oyR/ZMEuFKwmzqqZ/U5nPQ==", + "license": "BlueOak-1.0.0", "dependencies": { "@isaacs/cliui": "^8.0.2" }, @@ -20447,9 +20531,6 @@ }, "funding": { "url": "https://github.com/sponsors/isaacs" - }, - "optionalDependencies": { - "@pkgjs/parseargs": "^0.11.0" } }, "node_modules/javascript-stringify": { @@ -20737,14 +20818,6 @@ "json-buffer": "3.0.1" } }, - "node_modules/kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/klaw-sync": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/klaw-sync/-/klaw-sync-6.0.0.tgz", @@ -20888,7 +20961,8 @@ "node_modules/lodash": { "version": "4.17.21", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "dev": true }, "node_modules/lodash.camelcase": { "version": "4.3.0", @@ -20989,6 +21063,7 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/longest-streak/-/longest-streak-3.1.0.tgz", "integrity": "sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==", + "dev": true, "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" @@ -21006,12 +21081,11 @@ } }, "node_modules/loupe": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/loupe/-/loupe-3.1.1.tgz", - "integrity": "sha512-edNu/8D5MKVfGVFRhFf8aAxiTM6Wumfz5XsaatSxlD3w4R1d/WEKUTydCdPGbl9K7QG/Ca3GnDV2sIKIpXRQcw==", - "dependencies": { - "get-func-name": "^2.0.1" - } + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/loupe/-/loupe-3.1.4.tgz", + "integrity": "sha512-wJzkKwJrheKtknCOKNEtDK4iqg/MxmZheEMtSTYvnzRdEYaZzmgH976nenp8WdJRdx5Vc1X/9MO0Oszl6ezeXg==", + "dev": true, + "license": "MIT" }, "node_modules/lru-cache": { "version": "10.4.3", @@ -21022,6 +21096,7 @@ "version": "1.5.0", "resolved": "https://registry.npmjs.org/lz-string/-/lz-string-1.5.0.tgz", "integrity": "sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==", + "dev": true, "bin": { "lz-string": "bin/bin.js" } @@ -21061,26 +21136,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/markdown-extensions": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/markdown-extensions/-/markdown-extensions-2.0.0.tgz", - "integrity": "sha512-o5vL7aDWatOTX8LzaS1WMoaoxIiLRQJuIKKe2wAw6IeULDHaqbiqiggmx+pKvZDb1Sj+pE46Sn1T7lCqfFtg1Q==", - "engines": { - "node": ">=16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/markdown-table": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-3.0.3.tgz", - "integrity": "sha512-Z1NL3Tb1M9wH4XESsCDEksWoKTdlUafKc4pt0GRwjUyXaCFZ+dc3g2erqB6zm3szA2IUSi7VnPI+o/9jnxh9hw==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, "node_modules/marked": { "version": "7.0.4", "resolved": "https://registry.npmjs.org/marked/-/marked-7.0.4.tgz", @@ -21103,20 +21158,6 @@ "react": "18.x" } }, - "node_modules/md5-hex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/md5-hex/-/md5-hex-5.0.0.tgz", - "integrity": "sha512-18TKd0nxBzMLflLBSCM/I9n50izl7NQGuujgbKjVUs/9acY+a5uzpDUVd4wV130vaK67TzDnPin2gze88u+e4Q==", - "dependencies": { - "blueimp-md5": "^2.19.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/mdast-util-definitions": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/mdast-util-definitions/-/mdast-util-definitions-5.1.2.tgz", @@ -21189,64 +21230,15 @@ "url": "https://opencollective.com/unified" } }, - "node_modules/mdast-util-find-and-replace": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/mdast-util-find-and-replace/-/mdast-util-find-and-replace-3.0.1.tgz", - "integrity": "sha512-SG21kZHGC3XRTSUhtofZkBzZTJNM5ecCi0SK2IMKmSXR8vO3peL+kb1O0z7Zl83jKtutG4k5Wv/W7V3/YHvzPA==", + "node_modules/mdast-util-frontmatter": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mdast-util-frontmatter/-/mdast-util-frontmatter-1.0.1.tgz", + "integrity": "sha512-JjA2OjxRqAa8wEG8hloD0uTU0kdn8kbtOWpPP94NBkfAlbxn4S8gCGf/9DwFtEeGPXrDcNXdiDjVaRdUFqYokw==", + "dev": true, "dependencies": { - "@types/mdast": "^4.0.0", - "escape-string-regexp": "^5.0.0", - "unist-util-is": "^6.0.0", - "unist-util-visit-parents": "^6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-find-and-replace/node_modules/escape-string-regexp": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", - "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/mdast-util-from-markdown": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-2.0.1.tgz", - "integrity": "sha512-aJEUyzZ6TzlsX2s5B4Of7lN7EQtAxvtradMMglCQDyaTFgse6CmtmdJ15ElnVRlCg1vpNyVtbem0PWzlNieZsA==", - "dependencies": { - "@types/mdast": "^4.0.0", - "@types/unist": "^3.0.0", - "decode-named-character-reference": "^1.0.0", - "devlop": "^1.0.0", - "mdast-util-to-string": "^4.0.0", - "micromark": "^4.0.0", - "micromark-util-decode-numeric-character-reference": "^2.0.0", - "micromark-util-decode-string": "^2.0.0", - "micromark-util-normalize-identifier": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0", - "unist-util-stringify-position": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-frontmatter": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/mdast-util-frontmatter/-/mdast-util-frontmatter-1.0.1.tgz", - "integrity": "sha512-JjA2OjxRqAa8wEG8hloD0uTU0kdn8kbtOWpPP94NBkfAlbxn4S8gCGf/9DwFtEeGPXrDcNXdiDjVaRdUFqYokw==", - "dev": true, - "dependencies": { - "@types/mdast": "^3.0.0", - "mdast-util-to-markdown": "^1.3.0", - "micromark-extension-frontmatter": "^1.0.0" + "@types/mdast": "^3.0.0", + "mdast-util-to-markdown": "^1.3.0", + "micromark-extension-frontmatter": "^1.0.0" }, "funding": { "type": "opencollective", @@ -21450,347 +21442,6 @@ "url": "https://opencollective.com/unified" } }, - "node_modules/mdast-util-gfm": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/mdast-util-gfm/-/mdast-util-gfm-3.0.0.tgz", - "integrity": "sha512-dgQEX5Amaq+DuUqf26jJqSK9qgixgd6rYDHAv4aTBuA92cTknZlKpPfa86Z/s8Dj8xsAQpFfBmPUHWJBWqS4Bw==", - "dependencies": { - "mdast-util-from-markdown": "^2.0.0", - "mdast-util-gfm-autolink-literal": "^2.0.0", - "mdast-util-gfm-footnote": "^2.0.0", - "mdast-util-gfm-strikethrough": "^2.0.0", - "mdast-util-gfm-table": "^2.0.0", - "mdast-util-gfm-task-list-item": "^2.0.0", - "mdast-util-to-markdown": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-gfm-autolink-literal": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/mdast-util-gfm-autolink-literal/-/mdast-util-gfm-autolink-literal-2.0.0.tgz", - "integrity": "sha512-FyzMsduZZHSc3i0Px3PQcBT4WJY/X/RCtEJKuybiC6sjPqLv7h1yqAkmILZtuxMSsUyaLUWNp71+vQH2zqp5cg==", - "dependencies": { - "@types/mdast": "^4.0.0", - "ccount": "^2.0.0", - "devlop": "^1.0.0", - "mdast-util-find-and-replace": "^3.0.0", - "micromark-util-character": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-gfm-footnote": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/mdast-util-gfm-footnote/-/mdast-util-gfm-footnote-2.0.0.tgz", - "integrity": "sha512-5jOT2boTSVkMnQ7LTrd6n/18kqwjmuYqo7JUPe+tRCY6O7dAuTFMtTPauYYrMPpox9hlN0uOx/FL8XvEfG9/mQ==", - "dependencies": { - "@types/mdast": "^4.0.0", - "devlop": "^1.1.0", - "mdast-util-from-markdown": "^2.0.0", - "mdast-util-to-markdown": "^2.0.0", - "micromark-util-normalize-identifier": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-gfm-strikethrough": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/mdast-util-gfm-strikethrough/-/mdast-util-gfm-strikethrough-2.0.0.tgz", - "integrity": "sha512-mKKb915TF+OC5ptj5bJ7WFRPdYtuHv0yTRxK2tJvi+BDqbkiG7h7u/9SI89nRAYcmap2xHQL9D+QG/6wSrTtXg==", - "dependencies": { - "@types/mdast": "^4.0.0", - "mdast-util-from-markdown": "^2.0.0", - "mdast-util-to-markdown": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-gfm-table": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/mdast-util-gfm-table/-/mdast-util-gfm-table-2.0.0.tgz", - "integrity": "sha512-78UEvebzz/rJIxLvE7ZtDd/vIQ0RHv+3Mh5DR96p7cS7HsBhYIICDBCu8csTNWNO6tBWfqXPWekRuj2FNOGOZg==", - "dependencies": { - "@types/mdast": "^4.0.0", - "devlop": "^1.0.0", - "markdown-table": "^3.0.0", - "mdast-util-from-markdown": "^2.0.0", - "mdast-util-to-markdown": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-gfm-task-list-item": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/mdast-util-gfm-task-list-item/-/mdast-util-gfm-task-list-item-2.0.0.tgz", - "integrity": "sha512-IrtvNvjxC1o06taBAVJznEnkiHxLFTzgonUdy8hzFVeDun0uTjxxrRGVaNFqkU1wJR3RBPEfsxmU6jDWPofrTQ==", - "dependencies": { - "@types/mdast": "^4.0.0", - "devlop": "^1.0.0", - "mdast-util-from-markdown": "^2.0.0", - "mdast-util-to-markdown": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-mdx": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/mdast-util-mdx/-/mdast-util-mdx-3.0.0.tgz", - "integrity": "sha512-JfbYLAW7XnYTTbUsmpu0kdBUVe+yKVJZBItEjwyYJiDJuZ9w4eeaqks4HQO+R7objWgS2ymV60GYpI14Ug554w==", - "dependencies": { - "mdast-util-from-markdown": "^2.0.0", - "mdast-util-mdx-expression": "^2.0.0", - "mdast-util-mdx-jsx": "^3.0.0", - "mdast-util-mdxjs-esm": "^2.0.0", - "mdast-util-to-markdown": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-mdx-expression": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/mdast-util-mdx-expression/-/mdast-util-mdx-expression-2.0.0.tgz", - "integrity": "sha512-fGCu8eWdKUKNu5mohVGkhBXCXGnOTLuFqOvGMvdikr+J1w7lDJgxThOKpwRWzzbyXAU2hhSwsmssOY4yTokluw==", - "dependencies": { - "@types/estree-jsx": "^1.0.0", - "@types/hast": "^3.0.0", - "@types/mdast": "^4.0.0", - "devlop": "^1.0.0", - "mdast-util-from-markdown": "^2.0.0", - "mdast-util-to-markdown": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-mdx-jsx": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/mdast-util-mdx-jsx/-/mdast-util-mdx-jsx-3.1.2.tgz", - "integrity": "sha512-eKMQDeywY2wlHc97k5eD8VC+9ASMjN8ItEZQNGwJ6E0XWKiW/Z0V5/H8pvoXUf+y+Mj0VIgeRRbujBmFn4FTyA==", - "dependencies": { - "@types/estree-jsx": "^1.0.0", - "@types/hast": "^3.0.0", - "@types/mdast": "^4.0.0", - "@types/unist": "^3.0.0", - "ccount": "^2.0.0", - "devlop": "^1.1.0", - "mdast-util-from-markdown": "^2.0.0", - "mdast-util-to-markdown": "^2.0.0", - "parse-entities": "^4.0.0", - "stringify-entities": "^4.0.0", - "unist-util-remove-position": "^5.0.0", - "unist-util-stringify-position": "^4.0.0", - "vfile-message": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-mdxjs-esm": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/mdast-util-mdxjs-esm/-/mdast-util-mdxjs-esm-2.0.1.tgz", - "integrity": "sha512-EcmOpxsZ96CvlP03NghtH1EsLtr0n9Tm4lPUJUBccV9RwUOneqSycg19n5HGzCf+10LozMRSObtVr3ee1WoHtg==", - "dependencies": { - "@types/estree-jsx": "^1.0.0", - "@types/hast": "^3.0.0", - "@types/mdast": "^4.0.0", - "devlop": "^1.0.0", - "mdast-util-from-markdown": "^2.0.0", - "mdast-util-to-markdown": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-phrasing": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/mdast-util-phrasing/-/mdast-util-phrasing-4.1.0.tgz", - "integrity": "sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w==", - "dependencies": { - "@types/mdast": "^4.0.0", - "unist-util-is": "^6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-to-hast": { - "version": "13.2.0", - "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-13.2.0.tgz", - "integrity": "sha512-QGYKEuUsYT9ykKBCMOEDLsU5JRObWQusAolFMeko/tYPufNkRffBAQjIE+99jbA87xv6FgmjLtwjh9wBWajwAA==", - "dependencies": { - "@types/hast": "^3.0.0", - "@types/mdast": "^4.0.0", - "@ungap/structured-clone": "^1.0.0", - "devlop": "^1.0.0", - "micromark-util-sanitize-uri": "^2.0.0", - "trim-lines": "^3.0.0", - "unist-util-position": "^5.0.0", - "unist-util-visit": "^5.0.0", - "vfile": "^6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-to-markdown": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mdast-util-to-markdown/-/mdast-util-to-markdown-2.1.0.tgz", - "integrity": "sha512-SR2VnIEdVNCJbP6y7kVTJgPLifdr8WEU440fQec7qHoHOUz/oJ2jmNRqdDQ3rbiStOXb2mCDGTuwsK5OPUgYlQ==", - "dependencies": { - "@types/mdast": "^4.0.0", - "@types/unist": "^3.0.0", - "longest-streak": "^3.0.0", - "mdast-util-phrasing": "^4.0.0", - "mdast-util-to-string": "^4.0.0", - "micromark-util-decode-string": "^2.0.0", - "unist-util-visit": "^5.0.0", - "zwitch": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-to-string": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-4.0.0.tgz", - "integrity": "sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==", - "dependencies": { - "@types/mdast": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdx-bundler": { - "version": "10.0.2", - "resolved": "https://registry.npmjs.org/mdx-bundler/-/mdx-bundler-10.0.2.tgz", - "integrity": "sha512-0wF0zoCv+Ms4G+eSlk/jaKYoJHc0oXBaOma3kYlFJiKq9H8h41Dd66ioDBGF4noy80Pf7KTBQlyHfEpTqVml7A==", - "dependencies": { - "@babel/runtime": "^7.23.2", - "@esbuild-plugins/node-resolve": "^0.2.2", - "@fal-works/esbuild-plugin-global-externals": "^2.1.2", - "@mdx-js/esbuild": "^3.0.0", - "gray-matter": "^4.0.3", - "remark-frontmatter": "^5.0.0", - "remark-mdx-frontmatter": "^4.0.0", - "uuid": "^9.0.1", - "vfile": "^6.0.1" - }, - "engines": { - "node": ">=18", - "npm": ">=6" - }, - "peerDependencies": { - "esbuild": "0.*" - } - }, - "node_modules/mdx-bundler/node_modules/escape-string-regexp": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", - "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/mdx-bundler/node_modules/estree-util-value-to-estree": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/estree-util-value-to-estree/-/estree-util-value-to-estree-3.1.2.tgz", - "integrity": "sha512-S0gW2+XZkmsx00tU2uJ4L9hUT7IFabbml9pHh2WQqFmAbxit++YGZne0sKJbNwkj9Wvg9E4uqWl4nCIFQMmfag==", - "dependencies": { - "@types/estree": "^1.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/remcohaszing" - } - }, - "node_modules/mdx-bundler/node_modules/mdast-util-frontmatter": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/mdast-util-frontmatter/-/mdast-util-frontmatter-2.0.1.tgz", - "integrity": "sha512-LRqI9+wdgC25P0URIJY9vwocIzCcksduHQ9OF2joxQoyTNVduwLAFUzjoopuRJbJAReaKrNQKAZKL3uCMugWJA==", - "dependencies": { - "@types/mdast": "^4.0.0", - "devlop": "^1.0.0", - "escape-string-regexp": "^5.0.0", - "mdast-util-from-markdown": "^2.0.0", - "mdast-util-to-markdown": "^2.0.0", - "micromark-extension-frontmatter": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdx-bundler/node_modules/micromark-extension-frontmatter": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-extension-frontmatter/-/micromark-extension-frontmatter-2.0.0.tgz", - "integrity": "sha512-C4AkuM3dA58cgZha7zVnuVxBhDsbttIMiytjgsM2XbHAB2faRVaHRle40558FBN+DJcrLNCoqG5mlrpdU4cRtg==", - "dependencies": { - "fault": "^2.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdx-bundler/node_modules/remark-frontmatter": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/remark-frontmatter/-/remark-frontmatter-5.0.0.tgz", - "integrity": "sha512-XTFYvNASMe5iPN0719nPrdItC9aU0ssC4v14mH1BCi1u0n1gAocqcujWUrByftZTbLhRtiKRyjYTSIOcr69UVQ==", - "dependencies": { - "@types/mdast": "^4.0.0", - "mdast-util-frontmatter": "^2.0.0", - "micromark-extension-frontmatter": "^2.0.0", - "unified": "^11.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdx-bundler/node_modules/remark-mdx-frontmatter": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/remark-mdx-frontmatter/-/remark-mdx-frontmatter-4.0.0.tgz", - "integrity": "sha512-PZzAiDGOEfv1Ua7exQ8S5kKxkD8CDaSb4nM+1Mprs6u8dyvQifakh+kCj6NovfGXW+bTvrhjaR3srzjS2qJHKg==", - "dependencies": { - "@types/mdast": "^4.0.0", - "estree-util-is-identifier-name": "^3.0.0", - "estree-util-value-to-estree": "^3.0.0", - "toml": "^3.0.0", - "unified": "^11.0.0", - "yaml": "^2.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/remcohaszing" - } - }, "node_modules/media-query-parser": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/media-query-parser/-/media-query-parser-2.0.2.tgz", @@ -21825,7 +21476,8 @@ "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==" + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true }, "node_modules/merge2": { "version": "1.4.1", @@ -21843,73 +21495,6 @@ "node": ">= 0.6" } }, - "node_modules/micromark": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/micromark/-/micromark-4.0.0.tgz", - "integrity": "sha512-o/sd0nMof8kYff+TqcDx3VSrgBTcZpSvYcAHIfHhv5VAuNmisCxjhx6YmxS8PFEpb9z5WKWKPdzf0jM23ro3RQ==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "@types/debug": "^4.0.0", - "debug": "^4.0.0", - "decode-named-character-reference": "^1.0.0", - "devlop": "^1.0.0", - "micromark-core-commonmark": "^2.0.0", - "micromark-factory-space": "^2.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-chunked": "^2.0.0", - "micromark-util-combine-extensions": "^2.0.0", - "micromark-util-decode-numeric-character-reference": "^2.0.0", - "micromark-util-encode": "^2.0.0", - "micromark-util-normalize-identifier": "^2.0.0", - "micromark-util-resolve-all": "^2.0.0", - "micromark-util-sanitize-uri": "^2.0.0", - "micromark-util-subtokenize": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-core-commonmark": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-core-commonmark/-/micromark-core-commonmark-2.0.1.tgz", - "integrity": "sha512-CUQyKr1e///ZODyD1U3xit6zXwy1a8q2a1S1HKtIlmgvurrEpaw/Y9y6KSIbF8P59cn/NjzHyO+Q2fAyYLQrAA==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "decode-named-character-reference": "^1.0.0", - "devlop": "^1.0.0", - "micromark-factory-destination": "^2.0.0", - "micromark-factory-label": "^2.0.0", - "micromark-factory-space": "^2.0.0", - "micromark-factory-title": "^2.0.0", - "micromark-factory-whitespace": "^2.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-chunked": "^2.0.0", - "micromark-util-classify-character": "^2.0.0", - "micromark-util-html-tag-name": "^2.0.0", - "micromark-util-normalize-identifier": "^2.0.0", - "micromark-util-resolve-all": "^2.0.0", - "micromark-util-subtokenize": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, "node_modules/micromark-extension-frontmatter": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/micromark-extension-frontmatter/-/micromark-extension-frontmatter-1.1.1.tgz", @@ -21928,624 +21513,9 @@ }, "node_modules/micromark-extension-frontmatter/node_modules/micromark-util-character": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-1.2.0.tgz", - "integrity": "sha512-lXraTwcX3yH/vMDaFWCQJP1uIszLVebzUa3ZHdrgxr7KEU/9mL4mVgCpGbyhvNLNlauROiNUq7WN5u7ndbY6xg==", - "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.0" - } - }, - "node_modules/micromark-extension-frontmatter/node_modules/micromark-util-symbol": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-1.1.0.tgz", - "integrity": "sha512-uEjpEYY6KMs1g7QfJ2eX1SQEV+ZT4rUD3UcF6l57acZvLNK7PBZL+ty82Z1qhK1/yXIY4bdx04FKMgR0g4IAag==", - "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ] - }, - "node_modules/micromark-extension-frontmatter/node_modules/micromark-util-types": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-1.1.0.tgz", - "integrity": "sha512-ukRBgie8TIAcacscVHSiddHjO4k/q3pnedmzMQ4iwDcK0FtFCohKOlFbaOL/mPgfnPsL3C1ZyxJa4sbWrBl3jg==", - "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ] - }, - "node_modules/micromark-extension-gfm": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm/-/micromark-extension-gfm-3.0.0.tgz", - "integrity": "sha512-vsKArQsicm7t0z2GugkCKtZehqUm31oeGBV/KVSorWSy8ZlNAv7ytjFhvaryUiCUJYqs+NoE6AFhpQvBTM6Q4w==", - "dependencies": { - "micromark-extension-gfm-autolink-literal": "^2.0.0", - "micromark-extension-gfm-footnote": "^2.0.0", - "micromark-extension-gfm-strikethrough": "^2.0.0", - "micromark-extension-gfm-table": "^2.0.0", - "micromark-extension-gfm-tagfilter": "^2.0.0", - "micromark-extension-gfm-task-list-item": "^2.0.0", - "micromark-util-combine-extensions": "^2.0.0", - "micromark-util-types": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/micromark-extension-gfm-autolink-literal": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm-autolink-literal/-/micromark-extension-gfm-autolink-literal-2.1.0.tgz", - "integrity": "sha512-oOg7knzhicgQ3t4QCjCWgTmfNhvQbDDnJeVu9v81r7NltNCVmhPy1fJRX27pISafdjL+SVc4d3l48Gb6pbRypw==", - "dependencies": { - "micromark-util-character": "^2.0.0", - "micromark-util-sanitize-uri": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/micromark-extension-gfm-footnote": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm-footnote/-/micromark-extension-gfm-footnote-2.1.0.tgz", - "integrity": "sha512-/yPhxI1ntnDNsiHtzLKYnE3vf9JZ6cAisqVDauhp4CEHxlb4uoOTxOCJ+9s51bIB8U1N1FJ1RXOKTIlD5B/gqw==", - "dependencies": { - "devlop": "^1.0.0", - "micromark-core-commonmark": "^2.0.0", - "micromark-factory-space": "^2.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-normalize-identifier": "^2.0.0", - "micromark-util-sanitize-uri": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/micromark-extension-gfm-strikethrough": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm-strikethrough/-/micromark-extension-gfm-strikethrough-2.1.0.tgz", - "integrity": "sha512-ADVjpOOkjz1hhkZLlBiYA9cR2Anf8F4HqZUO6e5eDcPQd0Txw5fxLzzxnEkSkfnD0wziSGiv7sYhk/ktvbf1uw==", - "dependencies": { - "devlop": "^1.0.0", - "micromark-util-chunked": "^2.0.0", - "micromark-util-classify-character": "^2.0.0", - "micromark-util-resolve-all": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/micromark-extension-gfm-table": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm-table/-/micromark-extension-gfm-table-2.1.0.tgz", - "integrity": "sha512-Ub2ncQv+fwD70/l4ou27b4YzfNaCJOvyX4HxXU15m7mpYY+rjuWzsLIPZHJL253Z643RpbcP1oeIJlQ/SKW67g==", - "dependencies": { - "devlop": "^1.0.0", - "micromark-factory-space": "^2.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/micromark-extension-gfm-tagfilter": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm-tagfilter/-/micromark-extension-gfm-tagfilter-2.0.0.tgz", - "integrity": "sha512-xHlTOmuCSotIA8TW1mDIM6X2O1SiX5P9IuDtqGonFhEK0qgRI4yeC6vMxEV2dgyr2TiD+2PQ10o+cOhdVAcwfg==", - "dependencies": { - "micromark-util-types": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/micromark-extension-gfm-task-list-item": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm-task-list-item/-/micromark-extension-gfm-task-list-item-2.1.0.tgz", - "integrity": "sha512-qIBZhqxqI6fjLDYFTBIa4eivDMnP+OZqsNwmQ3xNLE4Cxwc+zfQEfbs6tzAo2Hjq+bh6q5F+Z8/cksrLFYWQQw==", - "dependencies": { - "devlop": "^1.0.0", - "micromark-factory-space": "^2.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/micromark-extension-mdx-expression": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/micromark-extension-mdx-expression/-/micromark-extension-mdx-expression-3.0.0.tgz", - "integrity": "sha512-sI0nwhUDz97xyzqJAbHQhp5TfaxEvZZZ2JDqUo+7NvyIYG6BZ5CPPqj2ogUoPJlmXHBnyZUzISg9+oUmU6tUjQ==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "@types/estree": "^1.0.0", - "devlop": "^1.0.0", - "micromark-factory-mdx-expression": "^2.0.0", - "micromark-factory-space": "^2.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-events-to-acorn": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-extension-mdx-jsx": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/micromark-extension-mdx-jsx/-/micromark-extension-mdx-jsx-3.0.0.tgz", - "integrity": "sha512-uvhhss8OGuzR4/N17L1JwvmJIpPhAd8oByMawEKx6NVdBCbesjH4t+vjEp3ZXft9DwvlKSD07fCeI44/N0Vf2w==", - "dependencies": { - "@types/acorn": "^4.0.0", - "@types/estree": "^1.0.0", - "devlop": "^1.0.0", - "estree-util-is-identifier-name": "^3.0.0", - "micromark-factory-mdx-expression": "^2.0.0", - "micromark-factory-space": "^2.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0", - "vfile-message": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/micromark-extension-mdx-md": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-extension-mdx-md/-/micromark-extension-mdx-md-2.0.0.tgz", - "integrity": "sha512-EpAiszsB3blw4Rpba7xTOUptcFeBFi+6PY8VnJ2hhimH+vCQDirWgsMpz7w1XcZE7LVrSAUGb9VJpG9ghlYvYQ==", - "dependencies": { - "micromark-util-types": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/micromark-extension-mdxjs": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/micromark-extension-mdxjs/-/micromark-extension-mdxjs-3.0.0.tgz", - "integrity": "sha512-A873fJfhnJ2siZyUrJ31l34Uqwy4xIFmvPY1oj+Ean5PHcPBYzEsvqvWGaWcfEIr11O5Dlw3p2y0tZWpKHDejQ==", - "dependencies": { - "acorn": "^8.0.0", - "acorn-jsx": "^5.0.0", - "micromark-extension-mdx-expression": "^3.0.0", - "micromark-extension-mdx-jsx": "^3.0.0", - "micromark-extension-mdx-md": "^2.0.0", - "micromark-extension-mdxjs-esm": "^3.0.0", - "micromark-util-combine-extensions": "^2.0.0", - "micromark-util-types": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/micromark-extension-mdxjs-esm": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/micromark-extension-mdxjs-esm/-/micromark-extension-mdxjs-esm-3.0.0.tgz", - "integrity": "sha512-DJFl4ZqkErRpq/dAPyeWp15tGrcrrJho1hKK5uBS70BCtfrIFg81sqcTVu3Ta+KD1Tk5vAtBNElWxtAa+m8K9A==", - "dependencies": { - "@types/estree": "^1.0.0", - "devlop": "^1.0.0", - "micromark-core-commonmark": "^2.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-events-to-acorn": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0", - "unist-util-position-from-estree": "^2.0.0", - "vfile-message": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/micromark-factory-destination": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-factory-destination/-/micromark-factory-destination-2.0.0.tgz", - "integrity": "sha512-j9DGrQLm/Uhl2tCzcbLhy5kXsgkHUrjJHg4fFAeoMRwJmJerT9aw4FEhIbZStWN8A3qMwOp1uzHr4UL8AInxtA==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "micromark-util-character": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-factory-label": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-factory-label/-/micromark-factory-label-2.0.0.tgz", - "integrity": "sha512-RR3i96ohZGde//4WSe/dJsxOX6vxIg9TimLAS3i4EhBAFx8Sm5SmqVfR8E87DPSR31nEAjZfbt91OMZWcNgdZw==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "devlop": "^1.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-factory-mdx-expression": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-factory-mdx-expression/-/micromark-factory-mdx-expression-2.0.1.tgz", - "integrity": "sha512-F0ccWIUHRLRrYp5TC9ZYXmZo+p2AM13ggbsW4T0b5CRKP8KHVRB8t4pwtBgTxtjRmwrK0Irwm7vs2JOZabHZfg==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "@types/estree": "^1.0.0", - "devlop": "^1.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-events-to-acorn": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0", - "unist-util-position-from-estree": "^2.0.0", - "vfile-message": "^4.0.0" - } - }, - "node_modules/micromark-factory-space": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.0.tgz", - "integrity": "sha512-TKr+LIDX2pkBJXFLzpyPyljzYK3MtmllMUMODTQJIUfDGncESaqB90db9IAUcz4AZAJFdd8U9zOp9ty1458rxg==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "micromark-util-character": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-factory-title": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-factory-title/-/micromark-factory-title-2.0.0.tgz", - "integrity": "sha512-jY8CSxmpWLOxS+t8W+FG3Xigc0RDQA9bKMY/EwILvsesiRniiVMejYTE4wumNc2f4UbAa4WsHqe3J1QS1sli+A==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "micromark-factory-space": "^2.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-factory-whitespace": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-factory-whitespace/-/micromark-factory-whitespace-2.0.0.tgz", - "integrity": "sha512-28kbwaBjc5yAI1XadbdPYHX/eDnqaUFVikLwrO7FDnKG7lpgxnvk/XGRhX/PN0mOZ+dBSZ+LgunHS+6tYQAzhA==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "micromark-factory-space": "^2.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-util-character": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.0.tgz", - "integrity": "sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-util-chunked": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-chunked/-/micromark-util-chunked-2.0.0.tgz", - "integrity": "sha512-anK8SWmNphkXdaKgz5hJvGa7l00qmcaUQoMYsBwDlSKFKjc6gjGXPDw3FNL3Nbwq5L8gE+RCbGqTw49FK5Qyvg==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "micromark-util-symbol": "^2.0.0" - } - }, - "node_modules/micromark-util-classify-character": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-classify-character/-/micromark-util-classify-character-2.0.0.tgz", - "integrity": "sha512-S0ze2R9GH+fu41FA7pbSqNWObo/kzwf8rN/+IGlW/4tC6oACOs8B++bh+i9bVyNnwCcuksbFwsBme5OCKXCwIw==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "micromark-util-character": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-util-combine-extensions": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-combine-extensions/-/micromark-util-combine-extensions-2.0.0.tgz", - "integrity": "sha512-vZZio48k7ON0fVS3CUgFatWHoKbbLTK/rT7pzpJ4Bjp5JjkZeasRfrS9wsBdDJK2cJLHMckXZdzPSSr1B8a4oQ==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "micromark-util-chunked": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-util-decode-numeric-character-reference": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-2.0.1.tgz", - "integrity": "sha512-bmkNc7z8Wn6kgjZmVHOX3SowGmVdhYS7yBpMnuMnPzDq/6xwVA604DuOXMZTO1lvq01g+Adfa0pE2UKGlxL1XQ==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "micromark-util-symbol": "^2.0.0" - } - }, - "node_modules/micromark-util-decode-string": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-decode-string/-/micromark-util-decode-string-2.0.0.tgz", - "integrity": "sha512-r4Sc6leeUTn3P6gk20aFMj2ntPwn6qpDZqWvYmAG6NgvFTIlj4WtrAudLi65qYoaGdXYViXYw2pkmn7QnIFasA==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "decode-named-character-reference": "^1.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-decode-numeric-character-reference": "^2.0.0", - "micromark-util-symbol": "^2.0.0" - } - }, - "node_modules/micromark-util-encode": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-2.0.0.tgz", - "integrity": "sha512-pS+ROfCXAGLWCOc8egcBvT0kf27GoWMqtdarNfDcjb6YLuV5cM3ioG45Ys2qOVqeqSbjaKg72vU+Wby3eddPsA==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ] - }, - "node_modules/micromark-util-events-to-acorn": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/micromark-util-events-to-acorn/-/micromark-util-events-to-acorn-2.0.2.tgz", - "integrity": "sha512-Fk+xmBrOv9QZnEDguL9OI9/NQQp6Hz4FuQ4YmCb/5V7+9eAh1s6AYSvL20kHkD67YIg7EpE54TiSlcsf3vyZgA==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "@types/acorn": "^4.0.0", - "@types/estree": "^1.0.0", - "@types/unist": "^3.0.0", - "devlop": "^1.0.0", - "estree-util-visit": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0", - "vfile-message": "^4.0.0" - } - }, - "node_modules/micromark-util-html-tag-name": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-html-tag-name/-/micromark-util-html-tag-name-2.0.0.tgz", - "integrity": "sha512-xNn4Pqkj2puRhKdKTm8t1YHC/BAjx6CEwRFXntTaRf/x16aqka6ouVoutm+QdkISTlT7e2zU7U4ZdlDLJd2Mcw==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ] - }, - "node_modules/micromark-util-normalize-identifier": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-2.0.0.tgz", - "integrity": "sha512-2xhYT0sfo85FMrUPtHcPo2rrp1lwbDEEzpx7jiH2xXJLqBuy4H0GgXk5ToU8IEwoROtXuL8ND0ttVa4rNqYK3w==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "micromark-util-symbol": "^2.0.0" - } - }, - "node_modules/micromark-util-resolve-all": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-resolve-all/-/micromark-util-resolve-all-2.0.0.tgz", - "integrity": "sha512-6KU6qO7DZ7GJkaCgwBNtplXCvGkJToU86ybBAUdavvgsCiG8lSSvYxr9MhwmQ+udpzywHsl4RpGJsYWG1pDOcA==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-util-sanitize-uri": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-2.0.0.tgz", - "integrity": "sha512-WhYv5UEcZrbAtlsnPuChHUAsu/iBPOVaEVsntLBIdpibO0ddy8OzavZz3iL2xVvBZOpolujSliP65Kq0/7KIYw==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "micromark-util-character": "^2.0.0", - "micromark-util-encode": "^2.0.0", - "micromark-util-symbol": "^2.0.0" - } - }, - "node_modules/micromark-util-subtokenize": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-subtokenize/-/micromark-util-subtokenize-2.0.1.tgz", - "integrity": "sha512-jZNtiFl/1aY73yS3UGQkutD0UbhTt68qnRpw2Pifmz5wV9h8gOVsN70v+Lq/f1rKaU/W8pxRe8y8Q9FX1AOe1Q==", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-1.2.0.tgz", + "integrity": "sha512-lXraTwcX3yH/vMDaFWCQJP1uIszLVebzUa3ZHdrgxr7KEU/9mL4mVgCpGbyhvNLNlauROiNUq7WN5u7ndbY6xg==", + "dev": true, "funding": [ { "type": "GitHub Sponsors", @@ -22557,16 +21527,15 @@ } ], "dependencies": { - "devlop": "^1.0.0", - "micromark-util-chunked": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0" } }, - "node_modules/micromark-util-symbol": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", - "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==", + "node_modules/micromark-extension-frontmatter/node_modules/micromark-util-symbol": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-1.1.0.tgz", + "integrity": "sha512-uEjpEYY6KMs1g7QfJ2eX1SQEV+ZT4rUD3UcF6l57acZvLNK7PBZL+ty82Z1qhK1/yXIY4bdx04FKMgR0g4IAag==", + "dev": true, "funding": [ { "type": "GitHub Sponsors", @@ -22578,10 +21547,11 @@ } ] }, - "node_modules/micromark-util-types": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.0.tgz", - "integrity": "sha512-oNh6S2WMHWRZrmutsRmDDfkzKtxF+bc2VxLC9dvtrDIRFln627VsFP6fLMgTryGDljgLPjkrzQSDcPrjPyDJ5w==", + "node_modules/micromark-extension-frontmatter/node_modules/micromark-util-types": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-1.1.0.tgz", + "integrity": "sha512-ukRBgie8TIAcacscVHSiddHjO4k/q3pnedmzMQ4iwDcK0FtFCohKOlFbaOL/mPgfnPsL3C1ZyxJa4sbWrBl3jg==", + "dev": true, "funding": [ { "type": "GitHub Sponsors", @@ -22594,9 +21564,10 @@ ] }, "node_modules/micromatch": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.7.tgz", - "integrity": "sha512-LPP/3KorzCwBxfeUuZmaR6bG2kdeHSbe0P2tY3FLRU4vYrjYz5hI4QZwV0njUx3jeuKe67YukQ1LSPZBKDqO/Q==", + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "license": "MIT", "dependencies": { "braces": "^3.0.3", "picomatch": "^2.3.1" @@ -22648,6 +21619,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", + "dev": true, "engines": { "node": ">=4" } @@ -22872,33 +21844,36 @@ } }, "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==" + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "license": "MIT" }, "node_modules/msw": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/msw/-/msw-2.3.1.tgz", - "integrity": "sha512-ocgvBCLn/5l3jpl1lssIb3cniuACJLoOfZu01e3n5dbJrpA5PeeWn28jCLgQDNt6d7QT8tF2fYRzm9JoEHtiig==", + "version": "2.12.4", + "resolved": "https://registry.npmjs.org/msw/-/msw-2.12.4.tgz", + "integrity": "sha512-rHNiVfTyKhzc0EjoXUBVGteNKBevdjOlVC6GlIRXpy+/3LHEIGRovnB5WPjcvmNODVQ1TNFnoa7wsGbd0V3epg==", "dev": true, "hasInstallScript": true, + "license": "MIT", "dependencies": { - "@bundled-es-modules/cookie": "^2.0.0", - "@bundled-es-modules/statuses": "^1.0.1", - "@inquirer/confirm": "^3.0.0", - "@mswjs/cookies": "^1.1.0", - "@mswjs/interceptors": "^0.29.0", - "@open-draft/until": "^2.1.0", - "@types/cookie": "^0.6.0", - "@types/statuses": "^2.0.4", - "chalk": "^4.1.2", - "graphql": "^16.8.1", + "@inquirer/confirm": "^5.0.0", + "@mswjs/interceptors": "^0.40.0", + "@open-draft/deferred-promise": "^2.2.0", + "@types/statuses": "^2.0.6", + "cookie": "^1.0.2", + "graphql": "^16.12.0", "headers-polyfill": "^4.0.2", "is-node-process": "^1.2.0", - "outvariant": "^1.4.2", - "path-to-regexp": "^6.2.0", + "outvariant": "^1.4.3", + "path-to-regexp": "^6.3.0", + "picocolors": "^1.1.1", + "rettime": "^0.7.0", + "statuses": "^2.0.2", "strict-event-emitter": "^0.5.1", - "type-fest": "^4.9.0", + "tough-cookie": "^6.0.0", + "type-fest": "^5.2.0", + "until-async": "^3.0.2", "yargs": "^17.7.2" }, "bin": { @@ -22911,7 +21886,7 @@ "url": "https://github.com/sponsors/mswjs" }, "peerDependencies": { - "typescript": ">= 4.7.x" + "typescript": ">= 4.8.x" }, "peerDependenciesMeta": { "typescript": { @@ -22919,68 +21894,74 @@ } } }, - "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==", + "node_modules/msw/node_modules/cookie": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-1.1.1.tgz", + "integrity": "sha512-ei8Aos7ja0weRpFzJnEA9UHJ/7XQmqglbRwnf2ATjcB9Wq874VKH9kfjjirM6UhU2/E5fFYadylyhFldcqSidQ==", "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, + "license": "MIT", "engines": { - "node": ">=8" + "node": ">=18" }, "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "type": "opencollective", + "url": "https://opencollective.com/express" } }, - "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==", + "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==", + "dev": true, + "license": "MIT" + }, + "node_modules/msw/node_modules/statuses": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz", + "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/msw/node_modules/tough-cookie": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-6.0.0.tgz", + "integrity": "sha512-kXuRi1mtaKMrsLUxz3sQYvVl37B0Ns6MzfrtV5DvJceE9bPyspOqk9xxv7XbZWcfLWbFmm997vl83qUWVJA64w==", "dev": true, + "license": "BSD-3-Clause", "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" + "tldts": "^7.0.5" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "node": ">=16" } }, - "node_modules/msw/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==", + "node_modules/msw/node_modules/type-fest": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-5.3.1.tgz", + "integrity": "sha512-VCn+LMHbd4t6sF3wfU/+HKT63C9OoyrSIf4b+vtWHpt2U7/4InZG467YDNMFMR70DdHjAdpPWmw2lzRdg0Xqqg==", "dev": true, + "license": "(MIT OR CC0-1.0)", "dependencies": { - "color-name": "~1.1.4" + "tagged-tag": "^1.0.0" }, "engines": { - "node": ">=7.0.0" + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/msw/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/msw/node_modules/path-to-regexp": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-6.2.2.tgz", - "integrity": "sha512-GQX3SSMokngb36+whdpRXE+3f9V8UzyAorlYvOGx87ufGHehNTn5lCxrKtLyZ4Yl/wEKnNnr98ZzOwwDZV5ogw==", - "dev": true - }, "node_modules/mute-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-1.0.0.tgz", - "integrity": "sha512-avsJQhyd+680gKXyG/sQc0nXaC6rBkPOfyHYcFb9+hdkqQkR9bdnkJ0AMZhke0oesPqIO+mFFJ+IdBc7mst4IA==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-2.0.0.tgz", + "integrity": "sha512-WWdIxpyjEn+FhQJQQv9aQAYlHoNVdzIzUySNV1gHUPDSdZJ3yZn7pAAbQcV7B56Mvu881q9FZV+0Vx2xC44VWA==", "dev": true, + "license": "ISC", "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": "^18.17.0 || >=20.5.0" } }, "node_modules/mz": { @@ -23036,19 +22017,11 @@ "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", "dev": true }, - "node_modules/node-emoji": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/node-emoji/-/node-emoji-2.1.3.tgz", - "integrity": "sha512-E2WEOVsgs7O16zsURJ/eH8BqhF029wGpEOnv7Urwdo2wmQanOACwJQh0devF9D9RhoZru0+9JXIS0dBXIAz+lA==", - "dependencies": { - "@sindresorhus/is": "^4.6.0", - "char-regex": "^1.0.2", - "emojilib": "^2.4.0", - "skin-tone": "^2.0.0" - }, - "engines": { - "node": ">=18" - } + "node_modules/node-fetch-native": { + "version": "1.6.7", + "resolved": "https://registry.npmjs.org/node-fetch-native/-/node-fetch-native-1.6.7.tgz", + "integrity": "sha512-g9yhqoedzIUm0nTnTqAQvueMPVOuIY16bqgAJJC8XOOubYFNwz6IER9qs0Gq2Xd0+CecCKFjtdDTMA4u4xG06Q==", + "license": "MIT" }, "node_modules/node-html-parser": { "version": "6.1.13", @@ -23337,6 +22310,7 @@ "version": "5.3.0", "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.3.0.tgz", "integrity": "sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==", + "dev": true, "dependencies": { "path-key": "^4.0.0" }, @@ -23351,6 +22325,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", + "dev": true, "engines": { "node": ">=12" }, @@ -23376,6 +22351,48 @@ "integrity": "sha512-qXDmcVlZV4XRtKFzddidpfVP4oMSGhga+xdMc25mv8kaLUHtgzCDhUxkrN8exkGdTlLNaXj7CV3GtON7zuGZ+w==", "dev": true }, + "node_modules/nypm": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/nypm/-/nypm-0.6.2.tgz", + "integrity": "sha512-7eM+hpOtrKrBDCh7Ypu2lJ9Z7PNZBdi/8AT3AX8xoCj43BBVHD0hPSTEvMtkMpfs8FCqBGhxB+uToIQimA111g==", + "license": "MIT", + "dependencies": { + "citty": "^0.1.6", + "consola": "^3.4.2", + "pathe": "^2.0.3", + "pkg-types": "^2.3.0", + "tinyexec": "^1.0.1" + }, + "bin": { + "nypm": "dist/cli.mjs" + }, + "engines": { + "node": "^14.16.0 || >=16.10.0" + } + }, + "node_modules/nypm/node_modules/confbox": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/confbox/-/confbox-0.2.2.tgz", + "integrity": "sha512-1NB+BKqhtNipMsov4xI/NnhCKp9XG9NamYp5PVm9klAT0fsrNPjaFICsCFhNhwZJKNh7zB/3q8qXz0E9oaMNtQ==", + "license": "MIT" + }, + "node_modules/nypm/node_modules/pathe": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", + "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", + "license": "MIT" + }, + "node_modules/nypm/node_modules/pkg-types": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-2.3.0.tgz", + "integrity": "sha512-SIqCzDRg0s9npO5XQ3tNZioRY1uK06lA41ynBC1YmFTmnY6FjUjVt6s4LoADmwoig1qqD0oK8h1p/8mlMx8Oig==", + "license": "MIT", + "dependencies": { + "confbox": "^0.2.2", + "exsolve": "^1.0.7", + "pathe": "^2.0.3" + } + }, "node_modules/object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", @@ -23525,6 +22542,12 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/ohash": { + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/ohash/-/ohash-2.0.11.tgz", + "integrity": "sha512-RdR9FQrFwNBNXAr4GixM8YaRZRJ5PUWbKYbE5eOsrwAjJW0q2REGcf79oYPsLyskQCZG1PLN+S/K1V00joZAoQ==", + "license": "MIT" + }, "node_modules/on-finished": { "version": "2.4.1", "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", @@ -23701,7 +22724,8 @@ "version": "1.4.3", "resolved": "https://registry.npmjs.org/outvariant/-/outvariant-1.4.3.tgz", "integrity": "sha512-+Sl2UErvtsoajRDKCE5/dBz4DIvHXQQnAxtQTF04OJxY0+DyZXSo5P5Bb7XYWOh81syohlYL24hbDwxedPUJCA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/p-limit": { "version": "3.1.0", @@ -23779,32 +22803,6 @@ "node": ">=8" } }, - "node_modules/p-queue": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/p-queue/-/p-queue-8.0.1.tgz", - "integrity": "sha512-NXzu9aQJTAzbBqOt2hwsR63ea7yvxJc0PwN/zobNAudYfb1B7R08SzB4TsLeSbUCuG467NhnoT0oO6w1qRO+BA==", - "dependencies": { - "eventemitter3": "^5.0.1", - "p-timeout": "^6.1.2" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-timeout": { - "version": "6.1.2", - "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-6.1.2.tgz", - "integrity": "sha512-UbD77BuZ9Bc9aABo74gfXhNvzC9Tx7SxtHSh1fxvx3jTLLYvmVhiQZZrJzqqU0jKbN32kb5VOKiLEQI/3bIjgQ==", - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/p-try": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", @@ -23840,6 +22838,7 @@ "version": "4.0.1", "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-4.0.1.tgz", "integrity": "sha512-SWzvYcSJh4d/SGLIOQfZ/CoNv6BTlI6YEQ7Nj82oDVnRpwe/Z/F1EMx42x3JAOwGBlCjeCH0BRJQbQ/opHL17w==", + "dev": true, "dependencies": { "@types/unist": "^2.0.0", "character-entities": "^2.0.0", @@ -23858,7 +22857,8 @@ "node_modules/parse-entities/node_modules/@types/unist": { "version": "2.0.10", "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.10.tgz", - "integrity": "sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA==" + "integrity": "sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA==", + "dev": true }, "node_modules/parse-json": { "version": "5.2.0", @@ -23893,15 +22893,11 @@ "node": ">=6" } }, - "node_modules/parse-numeric-range": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/parse-numeric-range/-/parse-numeric-range-1.3.0.tgz", - "integrity": "sha512-twN+njEipszzlMJd4ONUYgSfZPDxgHhT9Ahed5uTigpQn90FggW4SA/AIPq/6a149fTbE9qBEcSwE3FAEp6wQQ==" - }, "node_modules/parse5": { "version": "7.1.2", "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz", "integrity": "sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==", + "dev": true, "dependencies": { "entities": "^4.4.0" }, @@ -24153,6 +23149,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/pathval/-/pathval-2.0.0.tgz", "integrity": "sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA==", + "dev": true, "engines": { "node": ">= 14.16" } @@ -24176,10 +23173,17 @@ "through2": "^2.0.3" } }, + "node_modules/perfect-debounce": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/perfect-debounce/-/perfect-debounce-1.0.0.tgz", + "integrity": "sha512-xCy9V055GLEqoFaHoC1SoLIaLmWctgCUaBaWxDZ7/Zx4CTyX7cJQLJOok/orfjZAh9kEYpjJa4d0KcJmCbctZA==", + "license": "MIT" + }, "node_modules/periscopic": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/periscopic/-/periscopic-3.1.0.tgz", "integrity": "sha512-vKiQ8RRtkl9P+r/+oefh25C3fhybptkHKCZSPlcXiJux2tJF55GnEj3BVn4A5gKfq9NWWXXrxkHBwVPUfH0opw==", + "dev": true, "dependencies": { "@types/estree": "^1.0.0", "estree-walker": "^3.0.0", @@ -24187,9 +23191,10 @@ } }, "node_modules/picocolors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.1.tgz", - "integrity": "sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==" + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "license": "ISC" }, "node_modules/picomatch": { "version": "2.3.1", @@ -24202,108 +23207,6 @@ "url": "https://github.com/sponsors/jonschlinkert" } }, - "node_modules/pid-port": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/pid-port/-/pid-port-1.0.0.tgz", - "integrity": "sha512-LSNBeKChRPA4Xlrs6+zV588G1hSrFvANtPV5rt/5MPfSPK3V9XPWxx1d29svsrOjngT9ifLisXWCLS7DvO9ZhQ==", - "dependencies": { - "execa": "^8.0.1" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/pid-port/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/pid-port/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/pid-port/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/pid-port/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/pid-port/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/pid-port/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/pid-port/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/pidtree": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/pidtree/-/pidtree-0.6.0.tgz", @@ -24344,12 +23247,34 @@ "pathe": "^1.1.2" } }, + "node_modules/pkgmgr": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/pkgmgr/-/pkgmgr-1.1.1.tgz", + "integrity": "sha512-KodFOumBjt6dnD8oHrqJBgsMvy11OF3kTKEoIdR08UDhscKIt55DI8XyCz7UTfuDLf37bhF9ATAoRVhvjOP/dw==", + "dev": true, + "license": "MIT", + "bin": { + "pkgmgr": "bin/pkgmgr.js", + "pkgmgr-bun": "bin/pkgmgr-bun.js", + "pkgmgr-pnpm": "bin/pkgmgr-pnpm.js", + "pkgmgr-yarn": "bin/pkgmgr-yarn.js", + "pkgmgrx": "bin/pkgmgrx.js", + "pkgmgrx-bun": "bin/pkgmgrx-bun.js", + "pkgmgrx-pnpm": "bin/pkgmgrx-pnpm.js", + "pkgmgrx-yarn": "bin/pkgmgrx-yarn.js" + }, + "engines": { + "node": ">=18" + } + }, "node_modules/playwright": { - "version": "1.45.1", - "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.45.1.tgz", - "integrity": "sha512-Hjrgae4kpSQBr98nhCj3IScxVeVUixqj+5oyif8TdIn2opTCPEzqAqNMeK42i3cWDCVu9MI+ZsGWw+gVR4ISBg==", + "version": "1.56.1", + "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.56.1.tgz", + "integrity": "sha512-aFi5B0WovBHTEvpM3DzXTUaeN6eN0qWnTkKx4NQaH4Wvcmc153PdaY2UBdSYKaGYw+UyWXSVyxDUg5DoPEttjw==", + "dev": true, + "license": "Apache-2.0", "dependencies": { - "playwright-core": "1.45.1" + "playwright-core": "1.56.1" }, "bin": { "playwright": "cli.js" @@ -24362,9 +23287,11 @@ } }, "node_modules/playwright-core": { - "version": "1.45.1", - "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.45.1.tgz", - "integrity": "sha512-LF4CUUtrUu2TCpDw4mcrAIuYrEjVDfT1cHbJMfwnE2+1b8PZcFzPNgvZCvq2JfQ4aTjRCCHw5EJ2tmr2NSzdPg==", + "version": "1.56.1", + "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.56.1.tgz", + "integrity": "sha512-hutraynyn31F+Bifme+Ps9Vq59hKuUCz7H1kDOcBs+2oGguKkWTU50bBWrtz34OUWmIwpBTWDxaRPXrIXkgvmQ==", + "dev": true, + "license": "Apache-2.0", "bin": { "playwright-core": "cli.js" }, @@ -24376,7 +23303,9 @@ "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, + "license": "MIT", "optional": true, "os": [ "darwin" @@ -24723,6 +23652,7 @@ "version": "27.5.1", "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz", "integrity": "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==", + "dev": true, "dependencies": { "ansi-regex": "^5.0.1", "ansi-styles": "^5.0.0", @@ -24736,6 +23666,7 @@ "version": "5.2.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, "engines": { "node": ">=10" }, @@ -24781,20 +23712,6 @@ "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/process-exists": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/process-exists/-/process-exists-5.0.0.tgz", - "integrity": "sha512-6QPRh5fyHD8MaXr4GYML8K/YY0Sq5dKHGIOrAKS3cYpHQdmygFCcijIu1dVoNKAZ0TWAMoeh8KDK9dF8auBkJA==", - "dependencies": { - "ps-list": "^8.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/process-nextick-args": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", @@ -24854,6 +23771,7 @@ "version": "6.5.0", "resolved": "https://registry.npmjs.org/property-information/-/property-information-6.5.0.tgz", "integrity": "sha512-PgTgs/BlvHxOu8QuEN7wi5A0OmXaBcHpmCSTehcs6Uuu9IkDIEo13Hy7n898RHfrQ49vKCoGeWZSaAK01nwVig==", + "dev": true, "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" @@ -24876,17 +23794,6 @@ "node": ">= 0.10" } }, - "node_modules/ps-list": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/ps-list/-/ps-list-8.1.1.tgz", - "integrity": "sha512-OPS9kEJYVmiO48u/B9qneqhkMvgCxT+Tm28VCEJpheTpl8cJ0ffZRRNgS5mrQRTrX5yRTpaJ+hRDeefXYmmorQ==", - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/psl": { "version": "1.9.0", "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", @@ -24923,6 +23830,22 @@ "node": ">=6" } }, + "node_modules/pure-rand": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-6.1.0.tgz", + "integrity": "sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/dubzzz" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fast-check" + } + ], + "license": "MIT" + }, "node_modules/qrcode": { "version": "1.5.3", "resolved": "https://registry.npmjs.org/qrcode/-/qrcode-1.5.3.tgz", @@ -25166,6 +24089,16 @@ "node": ">= 0.8" } }, + "node_modules/rc9": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/rc9/-/rc9-2.1.2.tgz", + "integrity": "sha512-btXCnMmRIBINM2LDZoEmOogIZU7Qe7zn4BpomSKZ/ykbLObuBdvG+mFq11DL6fjH1DRwHhrlgtYWG96bJiC7Cg==", + "license": "MIT", + "dependencies": { + "defu": "^6.1.4", + "destr": "^2.0.3" + } + }, "node_modules/react": { "version": "18.3.1", "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", @@ -25192,7 +24125,8 @@ "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==" + "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", + "dev": true }, "node_modules/react-promise-suspense": { "version": "0.3.4", @@ -25411,6 +24345,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz", "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==", + "dev": true, "dependencies": { "indent-string": "^4.0.0", "strip-indent": "^3.0.0" @@ -25423,6 +24358,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "dev": true, "engines": { "node": ">=8" } @@ -25483,213 +24419,6 @@ "url": "https://github.com/sponsors/mysticatea" } }, - "node_modules/rehype": { - "version": "13.0.1", - "resolved": "https://registry.npmjs.org/rehype/-/rehype-13.0.1.tgz", - "integrity": "sha512-AcSLS2mItY+0fYu9xKxOu1LhUZeBZZBx8//5HKzF+0XP+eP8+6a5MXn2+DW2kfXR6Dtp1FEXMVrjyKAcvcU8vg==", - "dependencies": { - "@types/hast": "^3.0.0", - "rehype-parse": "^9.0.0", - "rehype-stringify": "^10.0.0", - "unified": "^11.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/rehype-parse": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/rehype-parse/-/rehype-parse-9.0.0.tgz", - "integrity": "sha512-WG7nfvmWWkCR++KEkZevZb/uw41E8TsH4DsY9UxsTbIXCVGbAs4S+r8FrQ+OtH5EEQAs+5UxKC42VinkmpA1Yw==", - "dependencies": { - "@types/hast": "^3.0.0", - "hast-util-from-html": "^2.0.0", - "unified": "^11.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/rehype-stringify": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/rehype-stringify/-/rehype-stringify-10.0.0.tgz", - "integrity": "sha512-1TX1i048LooI9QoecrXy7nGFFbFSufxVRAfc6Y9YMRAi56l+oB0zP51mLSV312uRuvVLPV1opSlJmslozR1XHQ==", - "dependencies": { - "@types/hast": "^3.0.0", - "hast-util-to-html": "^9.0.0", - "unified": "^11.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/remark": { - "version": "15.0.1", - "resolved": "https://registry.npmjs.org/remark/-/remark-15.0.1.tgz", - "integrity": "sha512-Eht5w30ruCXgFmxVUSlNWQ9iiimq07URKeFS3hNc8cUWy1llX4KDWfyEDZRycMc+znsN9Ux5/tJ/BFdgdOwA3A==", - "dependencies": { - "@types/mdast": "^4.0.0", - "remark-parse": "^11.0.0", - "remark-stringify": "^11.0.0", - "unified": "^11.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/remark-autolink-headings": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/remark-autolink-headings/-/remark-autolink-headings-7.0.1.tgz", - "integrity": "sha512-a1BIwoJ0cSnX+sPp5u3AFULBFWHGYBt57Fo4a+7IlGiJOQxs8b7uYAE5Iu26Ocl7Y5cvinZy3FaGVruLCKg6vA==", - "dependencies": { - "@types/hast": "^2.0.0", - "@types/mdast": "^3.0.0", - "extend": "^3.0.0", - "unified": "^10.0.0", - "unist-util-visit": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/remark-autolink-headings/node_modules/@types/hast": { - "version": "2.3.10", - "resolved": "https://registry.npmjs.org/@types/hast/-/hast-2.3.10.tgz", - "integrity": "sha512-McWspRw8xx8J9HurkVBfYj0xKoE25tOFlHGdx4MJ5xORQrMGZNqJhVQWaIbm6Oyla5kYOXtDiopzKRJzEOkwJw==", - "dependencies": { - "@types/unist": "^2" - } - }, - "node_modules/remark-autolink-headings/node_modules/@types/mdast": { - "version": "3.0.15", - "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.15.tgz", - "integrity": "sha512-LnwD+mUEfxWMa1QpDraczIn6k0Ee3SMicuYSSzS6ZYl2gKS09EClnJYGd8Du6rfc5r/GZEk5o1mRb8TaTj03sQ==", - "dependencies": { - "@types/unist": "^2" - } - }, - "node_modules/remark-autolink-headings/node_modules/@types/unist": { - "version": "2.0.10", - "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.10.tgz", - "integrity": "sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA==" - }, - "node_modules/remark-autolink-headings/node_modules/unified": { - "version": "10.1.2", - "resolved": "https://registry.npmjs.org/unified/-/unified-10.1.2.tgz", - "integrity": "sha512-pUSWAi/RAnVy1Pif2kAoeWNBa3JVrx0MId2LASj8G+7AiHWoKZNTomq6LG326T68U7/e263X6fTdcXIy7XnF7Q==", - "dependencies": { - "@types/unist": "^2.0.0", - "bail": "^2.0.0", - "extend": "^3.0.0", - "is-buffer": "^2.0.0", - "is-plain-obj": "^4.0.0", - "trough": "^2.0.0", - "vfile": "^5.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/remark-autolink-headings/node_modules/unist-util-is": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-5.2.1.tgz", - "integrity": "sha512-u9njyyfEh43npf1M+yGKDGVPbY/JWEemg5nH05ncKPfi+kBbKBJoTdsogMu33uhytuLlv9y0O7GH7fEdwLdLQw==", - "dependencies": { - "@types/unist": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/remark-autolink-headings/node_modules/unist-util-stringify-position": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-3.0.3.tgz", - "integrity": "sha512-k5GzIBZ/QatR8N5X2y+drfpWG8IDBzdnVj6OInRNWm1oXrzydiaAT2OQiA8DPRRZyAKb9b6I2a6PxYklZD0gKg==", - "dependencies": { - "@types/unist": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/remark-autolink-headings/node_modules/unist-util-visit": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-4.1.2.tgz", - "integrity": "sha512-MSd8OUGISqHdVvfY9TPhyK2VdUrPgxkUtWSuMHF6XAAFuL4LokseigBnZtPnJMu+FbynTkFNnFlyjxpVKujMRg==", - "dependencies": { - "@types/unist": "^2.0.0", - "unist-util-is": "^5.0.0", - "unist-util-visit-parents": "^5.1.1" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/remark-autolink-headings/node_modules/unist-util-visit-parents": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-5.1.3.tgz", - "integrity": "sha512-x6+y8g7wWMyQhL1iZfhIPhDAs7Xwbn9nRosDXl7qoPTSCy0yNxnKc+hWokFifWQIDGi154rdUqKvbCa4+1kLhg==", - "dependencies": { - "@types/unist": "^2.0.0", - "unist-util-is": "^5.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/remark-autolink-headings/node_modules/vfile": { - "version": "5.3.7", - "resolved": "https://registry.npmjs.org/vfile/-/vfile-5.3.7.tgz", - "integrity": "sha512-r7qlzkgErKjobAmyNIkkSpizsFPYiUPuJb5pNW1RB4JcYVZhs4lIbVqk8XPk033CV/1z8ss5pkax8SuhGpcG8g==", - "dependencies": { - "@types/unist": "^2.0.0", - "is-buffer": "^2.0.0", - "unist-util-stringify-position": "^3.0.0", - "vfile-message": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/remark-autolink-headings/node_modules/vfile-message": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-3.1.4.tgz", - "integrity": "sha512-fa0Z6P8HUrQN4BZaX05SIVXic+7kE3b05PWAtPuYP9QLHsLKYR7/AlLW3NtOrpXRLeawpDLMsVkmk5DG0NXgWw==", - "dependencies": { - "@types/unist": "^2.0.0", - "unist-util-stringify-position": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/remark-emoji": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/remark-emoji/-/remark-emoji-4.0.1.tgz", - "integrity": "sha512-fHdvsTR1dHkWKev9eNyhTo4EFwbUvJ8ka9SgeWkMPYFX4WoI7ViVBms3PjlQYgw5TLvNQso3GUB/b/8t3yo+dg==", - "dependencies": { - "@types/mdast": "^4.0.2", - "emoticon": "^4.0.1", - "mdast-util-find-and-replace": "^3.0.1", - "node-emoji": "^2.1.0", - "unified": "^11.0.4" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - } - }, "node_modules/remark-frontmatter": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/remark-frontmatter/-/remark-frontmatter-4.0.1.tgz", @@ -25783,36 +24512,6 @@ "url": "https://opencollective.com/unified" } }, - "node_modules/remark-gfm": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/remark-gfm/-/remark-gfm-4.0.0.tgz", - "integrity": "sha512-U92vJgBPkbw4Zfu/IiW2oTZLSL3Zpv+uI7My2eq8JxKgqraFdU8YUGicEJCEgSbeaG+QDFqIcwwfMTOEelPxuA==", - "dependencies": { - "@types/mdast": "^4.0.0", - "mdast-util-gfm": "^3.0.0", - "micromark-extension-gfm": "^3.0.0", - "remark-parse": "^11.0.0", - "remark-stringify": "^11.0.0", - "unified": "^11.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/remark-mdx": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/remark-mdx/-/remark-mdx-3.0.1.tgz", - "integrity": "sha512-3Pz3yPQ5Rht2pM5R+0J2MrGoBSrzf+tJG94N+t/ilfdh8YLyyKYtidAYwTveB20BoHAcwIopOUqhcmh2F7hGYA==", - "dependencies": { - "mdast-util-mdx": "^3.0.0", - "micromark-extension-mdxjs": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, "node_modules/remark-mdx-frontmatter": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/remark-mdx-frontmatter/-/remark-mdx-frontmatter-1.1.1.tgz", @@ -25838,51 +24537,6 @@ "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/remark-parse": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-11.0.0.tgz", - "integrity": "sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA==", - "dependencies": { - "@types/mdast": "^4.0.0", - "mdast-util-from-markdown": "^2.0.0", - "micromark-util-types": "^2.0.0", - "unified": "^11.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/remark-rehype": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/remark-rehype/-/remark-rehype-11.1.0.tgz", - "integrity": "sha512-z3tJrAs2kIs1AqIIy6pzHmAHlF1hWQ+OdY4/hv+Wxe35EhyLKcajL33iUEn3ScxtFox9nUvRufR/Zre8Q08H/g==", - "dependencies": { - "@types/hast": "^3.0.0", - "@types/mdast": "^4.0.0", - "mdast-util-to-hast": "^13.0.0", - "unified": "^11.0.0", - "vfile": "^6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/remark-stringify": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/remark-stringify/-/remark-stringify-11.0.0.tgz", - "integrity": "sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw==", - "dependencies": { - "@types/mdast": "^4.0.0", - "mdast-util-to-markdown": "^2.0.0", - "unified": "^11.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, "node_modules/remix-auth": { "version": "3.7.0", "resolved": "https://registry.npmjs.org/remix-auth/-/remix-auth-3.7.0.tgz", @@ -26129,6 +24783,13 @@ "node": ">= 4" } }, + "node_modules/rettime": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/rettime/-/rettime-0.7.0.tgz", + "integrity": "sha512-LPRKoHnLKd/r3dVxcwO7vhCW+orkOGj9ViueosEBK6ie89CijnfRlhaDhHq/3Hxu4CkWQtxwlBG0mzTQY6uQjw==", + "dev": true, + "license": "MIT" + }, "node_modules/reusify": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", @@ -26337,18 +24998,6 @@ "loose-envify": "^1.1.0" } }, - "node_modules/section-matter": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/section-matter/-/section-matter-1.0.0.tgz", - "integrity": "sha512-vfD3pmTzGpufjScBh50YHKzEu2lxBWhVEHsNGoEXmCmn2hKGfeNLYMzCJpe8cD7gqX7TJluOVpBkAequ6dgMmA==", - "dependencies": { - "extend-shallow": "^2.0.1", - "kind-of": "^6.0.0" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/selderee": { "version": "0.11.0", "resolved": "https://registry.npmjs.org/selderee/-/selderee-0.11.0.tgz", @@ -26407,11 +25056,6 @@ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" }, - "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/serve-static": { "version": "1.15.0", "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", @@ -26492,23 +25136,18 @@ } }, "node_modules/shell-quote": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.1.tgz", - "integrity": "sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==", + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.3.tgz", + "integrity": "sha512-ObmnIF4hXNg1BqhnHmgbDETF8dLPCggZWBjkQfhZpbszZnYur5DUljTcCHii5LC3J5E0yeO/1LIMyH+UvHQgyw==", "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/shiki": { - "version": "1.10.3", - "resolved": "https://registry.npmjs.org/shiki/-/shiki-1.10.3.tgz", - "integrity": "sha512-eneCLncGuvPdTutJuLyUGS8QNPAVFO5Trvld2wgEq1e002mwctAhJKeMGWtWVXOIEzmlcLRqcgPSorR6AVzOmQ==", - "dependencies": { - "@shikijs/core": "1.10.3", - "@types/hast": "^3.0.4" - } - }, "node_modules/side-channel": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", @@ -26533,44 +25172,22 @@ "dev": true }, "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/sisteransi": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", - "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", - "dev": true - }, - "node_modules/skin-tone": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/skin-tone/-/skin-tone-2.0.0.tgz", - "integrity": "sha512-kUMbT1oBJCpgrnKoSr0o6wPtvRWT9W9UKvGLwfJYO2WuahZRHOpEyL1ckyMGgMWh0UdpmaoFqKKD29WTomNEGA==", - "dependencies": { - "unicode-emoji-modifier-base": "^1.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/slash": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-5.1.0.tgz", - "integrity": "sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", "engines": { - "node": ">=14.16" + "node": ">=14" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/sisteransi": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", + "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", + "dev": true + }, "node_modules/sonner": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/sonner/-/sonner-1.5.0.tgz", @@ -26617,6 +25234,7 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-2.0.2.tgz", "integrity": "sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==", + "dev": true, "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" @@ -26662,11 +25280,6 @@ "react": ">=17.0.1" } }, - "node_modules/sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==" - }, "node_modules/ssri": { "version": "10.0.6", "resolved": "https://registry.npmjs.org/ssri/-/ssri-10.0.6.tgz", @@ -26776,7 +25389,8 @@ "version": "0.5.1", "resolved": "https://registry.npmjs.org/strict-event-emitter/-/strict-event-emitter-0.5.1.tgz", "integrity": "sha512-vMgjE/GGEPEFnhFub6pa4FmJBRBVOLpIII2hvCZ8Kzb7K0hlHo7mQv6xYrBvCL2LtAIBwFUK8wvuJgTVSQ5MFQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/string_decoder": { "version": "1.3.0", @@ -26980,6 +25594,7 @@ "version": "4.0.4", "resolved": "https://registry.npmjs.org/stringify-entities/-/stringify-entities-4.0.4.tgz", "integrity": "sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==", + "dev": true, "dependencies": { "character-entities-html4": "^2.0.0", "character-entities-legacy": "^3.0.0" @@ -27021,18 +25636,11 @@ "node": ">=4" } }, - "node_modules/strip-bom-string": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/strip-bom-string/-/strip-bom-string-1.0.0.tgz", - "integrity": "sha512-uCC2VHvQRYu+lMh4My/sFNmF2klFymLX1wHJeXnbEJERpV/ZsVuonzerjfrGpIGF7LBVa1O7i9kjiWvJiFck8g==", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/strip-final-newline": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-4.0.0.tgz", "integrity": "sha512-aulFJcD6YK8V1G7iRB5tigAP4TsHBZZrOV8pjV++zdUwmeV8uzbY7yn6h9MswN62adStNZFuCIx4haBnRuMDaw==", + "dev": true, "engines": { "node": ">=18" }, @@ -27044,6 +25652,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", + "dev": true, "dependencies": { "min-indent": "^1.0.0" }, @@ -27085,6 +25694,7 @@ "version": "0.4.4", "resolved": "https://registry.npmjs.org/style-to-object/-/style-to-object-0.4.4.tgz", "integrity": "sha512-HYNoHZa2GorYNyqiCaBgsxvcJIn7OHq6inEga+E6Ke3m5JkoqpQbnFssk4jwe+K7AhGa2fcha4wSOf1Kn01dMg==", + "dev": true, "dependencies": { "inline-style-parser": "0.1.1" } @@ -27194,6 +25804,19 @@ "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", "dev": true }, + "node_modules/tagged-tag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/tagged-tag/-/tagged-tag-1.0.0.tgz", + "integrity": "sha512-yEFYrVhod+hdNyx7g5Bnkkb0G6si8HJurOoOEgC8B/O0uXLHlaey/65KRv6cuWBNhBgHKAROVpc7QyYqE5gFng==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/tailwind-merge": { "version": "2.4.0", "resolved": "https://registry.npmjs.org/tailwind-merge/-/tailwind-merge-2.4.0.tgz", @@ -27369,113 +25992,6 @@ "node": ">=8" } }, - "node_modules/taskkill": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/taskkill/-/taskkill-5.0.0.tgz", - "integrity": "sha512-+HRtZ40Vc+6YfCDWCeAsixwxJgMbPY4HHuTgzPYH3JXvqHWUlsCfy+ylXlAKhFNcuLp4xVeWeFBUhDk+7KYUvQ==", - "dependencies": { - "execa": "^6.1.0" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/taskkill/node_modules/execa": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-6.1.0.tgz", - "integrity": "sha512-QVWlX2e50heYJcCPG0iWtf8r0xjEYfz/OYLGDYH+IyjWezzPNxz63qNFOu0l4YftGWuizFVZHHs8PrLU5p2IDA==", - "dependencies": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.1", - "human-signals": "^3.0.1", - "is-stream": "^3.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^5.1.0", - "onetime": "^6.0.0", - "signal-exit": "^3.0.7", - "strip-final-newline": "^3.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" - } - }, - "node_modules/taskkill/node_modules/get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/taskkill/node_modules/human-signals": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-3.0.1.tgz", - "integrity": "sha512-rQLskxnM/5OCldHo+wNXbpVgDn5A17CUoKX+7Sokwaknlq7CdSnphy0W39GU8dw59XiCXmFXDg4fRuckQRKewQ==", - "engines": { - "node": ">=12.20.0" - } - }, - "node_modules/taskkill/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/taskkill/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/taskkill/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/taskkill/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/taskkill/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/test-exclude": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-7.0.1.tgz", @@ -27620,10 +26136,21 @@ "integrity": "sha512-1/eK7zUnIklz4JUUlL+658n58XO2hHLQfSk1Zf2LKieUjxidN16eKFEoDEfjHc3ohofSSqK3X5yO6VGb6iW8Lw==", "dev": true }, + "node_modules/tinyexec": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.0.2.tgz", + "integrity": "sha512-W/KYk+NFhkmsYpuHq5JykngiOCnxeVL8v8dFnqxSD8qEEdRfXk1SDM6JzNqcERbcGYj9tMrDQBYV9cjgnunFIg==", + "license": "MIT", + "engines": { + "node": ">=18" + } + }, "node_modules/tinypool": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-1.0.0.tgz", - "integrity": "sha512-KIKExllK7jp3uvrNtvRBYBWBOAXSX8ZvoaD8T+7KB/QHIuoJW3Pmr60zucywjAlMb5TeXUkcs/MWeWLu0qvuAQ==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-1.1.1.tgz", + "integrity": "sha512-Zba82s87IFq9A9XmjiX5uZA/ARWDrB03OHlq+Vw1fSdt0I+4/Kutwy8BP4Y/y/aORMo61FQ0vIb5j44vSo5Pkg==", + "dev": true, + "license": "MIT", "engines": { "node": "^18.0.0 || >=20.0.0" } @@ -27632,6 +26159,7 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-1.2.0.tgz", "integrity": "sha512-weEDEq7Z5eTHPDh4xjX789+fHfF+P8boiFB+0vbWzpbnbsEr/GRaohi/uMKxg8RZMXnl1ItAi/IUHWMsjDV7kQ==", + "dev": true, "engines": { "node": ">=14.0.0" } @@ -27640,10 +26168,31 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/tinyspy/-/tinyspy-3.0.0.tgz", "integrity": "sha512-q5nmENpTHgiPVd1cJDDc9cVoYN5x4vCvwT3FMilvKPKneCBZAxn2YWQjDF0UMcE9k0Cay1gBiDfTMU0g+mPMQA==", + "dev": true, "engines": { "node": ">=14.0.0" } }, + "node_modules/tldts": { + "version": "7.0.19", + "resolved": "https://registry.npmjs.org/tldts/-/tldts-7.0.19.tgz", + "integrity": "sha512-8PWx8tvC4jDB39BQw1m4x8y5MH1BcQ5xHeL2n7UVFulMPH/3Q0uiamahFJ3lXA0zO2SUyRXuVVbWSDmstlt9YA==", + "dev": true, + "license": "MIT", + "dependencies": { + "tldts-core": "^7.0.19" + }, + "bin": { + "tldts": "bin/cli.js" + } + }, + "node_modules/tldts-core": { + "version": "7.0.19", + "resolved": "https://registry.npmjs.org/tldts-core/-/tldts-core-7.0.19.tgz", + "integrity": "sha512-lJX2dEWx0SGH4O6p+7FPwYmJ/bu1JbcGJ8RLaG9b7liIgZ85itUVEPbMtWRVrde/0fnDPEPHW10ZsKW3kVsE9A==", + "dev": true, + "license": "MIT" + }, "node_modules/tmp": { "version": "0.0.33", "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", @@ -27686,7 +26235,8 @@ "node_modules/toml": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/toml/-/toml-3.0.0.tgz", - "integrity": "sha512-y/mWCZinnvxjTKYhJ+pYxwD0mRLVvOtdS2Awbgxln6iEnt4rk0yBxeSBHkGJcPucRiG0e55mwWp+g/05rsrd6w==" + "integrity": "sha512-y/mWCZinnvxjTKYhJ+pYxwD0mRLVvOtdS2Awbgxln6iEnt4rk0yBxeSBHkGJcPucRiG0e55mwWp+g/05rsrd6w==", + "dev": true }, "node_modules/tough-cookie": { "version": "4.1.4", @@ -27728,6 +26278,7 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/trim-lines/-/trim-lines-3.0.1.tgz", "integrity": "sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==", + "dev": true, "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" @@ -27737,6 +26288,7 @@ "version": "2.2.0", "resolved": "https://registry.npmjs.org/trough/-/trough-2.2.0.tgz", "integrity": "sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==", + "dev": true, "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" @@ -28373,18 +26925,12 @@ "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", "dev": true }, - "node_modules/unicode-emoji-modifier-base": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unicode-emoji-modifier-base/-/unicode-emoji-modifier-base-1.0.0.tgz", - "integrity": "sha512-yLSH4py7oFH3oG/9K+XWrz1pSi3dfUrWEnInbxMfArOfc1+33BlGPQtLsOYwvdMy11AwUBetYuaRxSPqgkq+8g==", - "engines": { - "node": ">=4" - } - }, "node_modules/unicorn-magic": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/unicorn-magic/-/unicorn-magic-0.1.0.tgz", - "integrity": "sha512-lRfVq8fE8gz6QMBuDM6a+LO3IAzTi05H6gCVaUpir2E1Rwpo4ZUog45KpNXKC/Mn3Yb9UDuHumeFTo9iV/D9FQ==", + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/unicorn-magic/-/unicorn-magic-0.3.0.tgz", + "integrity": "sha512-+QBBXBCvifc56fsbuxZQ6Sic3wqqc3WWaqxs58gvJrcOuN83HGTCwz3oS5phzU9LthRNE9VrJCFCLUgHeeFnfA==", + "dev": true, + "license": "MIT", "engines": { "node": ">=18" }, @@ -28392,24 +26938,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/unified": { - "version": "11.0.5", - "resolved": "https://registry.npmjs.org/unified/-/unified-11.0.5.tgz", - "integrity": "sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA==", - "dependencies": { - "@types/unist": "^3.0.0", - "bail": "^2.0.0", - "devlop": "^1.0.0", - "extend": "^3.0.0", - "is-plain-obj": "^4.0.0", - "trough": "^2.0.0", - "vfile": "^6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, "node_modules/unique-filename": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-3.0.0.tgz", @@ -28444,94 +26972,6 @@ "url": "https://opencollective.com/unified" } }, - "node_modules/unist-util-is": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-6.0.0.tgz", - "integrity": "sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==", - "dependencies": { - "@types/unist": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/unist-util-position": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/unist-util-position/-/unist-util-position-5.0.0.tgz", - "integrity": "sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==", - "dependencies": { - "@types/unist": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/unist-util-position-from-estree": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unist-util-position-from-estree/-/unist-util-position-from-estree-2.0.0.tgz", - "integrity": "sha512-KaFVRjoqLyF6YXCbVLNad/eS4+OfPQQn2yOd7zF/h5T/CSL2v8NpN6a5TPvtbXthAGw5nG+PuTtq+DdIZr+cRQ==", - "dependencies": { - "@types/unist": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/unist-util-remove-position": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/unist-util-remove-position/-/unist-util-remove-position-5.0.0.tgz", - "integrity": "sha512-Hp5Kh3wLxv0PHj9m2yZhhLt58KzPtEYKQQ4yxfYFEO7EvHwzyDYnduhHnY1mDxoqr7VUwVuHXk9RXKIiYS1N8Q==", - "dependencies": { - "@types/unist": "^3.0.0", - "unist-util-visit": "^5.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/unist-util-stringify-position": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz", - "integrity": "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==", - "dependencies": { - "@types/unist": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/unist-util-visit": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-5.0.0.tgz", - "integrity": "sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==", - "dependencies": { - "@types/unist": "^3.0.0", - "unist-util-is": "^6.0.0", - "unist-util-visit-parents": "^6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/unist-util-visit-parents": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-6.0.1.tgz", - "integrity": "sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw==", - "dependencies": { - "@types/unist": "^3.0.0", - "unist-util-is": "^6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, "node_modules/universalify": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", @@ -28548,6 +26988,16 @@ "node": ">= 0.8" } }, + "node_modules/until-async": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/until-async/-/until-async-3.0.2.tgz", + "integrity": "sha512-IiSk4HlzAMqTUseHHe3VhIGyuFmN90zMTpD3Z3y8jeQbzLIq500MVM7Jq2vUAnTKAFPJrqwkzr6PoTcPhGcOiw==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/kettanaito" + } + }, "node_modules/update-browserslist-db": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.0.tgz", @@ -28729,46 +27179,6 @@ "node": ">= 0.8" } }, - "node_modules/vfile": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/vfile/-/vfile-6.0.1.tgz", - "integrity": "sha512-1bYqc7pt6NIADBJ98UiG0Bn/CHIVOoZ/IyEkqIruLg0mE1BKzkOXY2D6CSqQIcKqgadppE5lrxgWXJmXd7zZJw==", - "dependencies": { - "@types/unist": "^3.0.0", - "unist-util-stringify-position": "^4.0.0", - "vfile-message": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/vfile-location": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/vfile-location/-/vfile-location-5.0.2.tgz", - "integrity": "sha512-NXPYyxyBSH7zB5U6+3uDdd6Nybz6o6/od9rk8bp9H8GR3L+cm/fC0uUTbqBmUTnMCUDslAGBOIKNfvvb+gGlDg==", - "dependencies": { - "@types/unist": "^3.0.0", - "vfile": "^6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/vfile-message": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-4.0.2.tgz", - "integrity": "sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw==", - "dependencies": { - "@types/unist": "^3.0.0", - "unist-util-stringify-position": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, "node_modules/vite": { "version": "5.3.3", "resolved": "https://registry.npmjs.org/vite/-/vite-5.3.3.tgz", @@ -29465,15 +27875,6 @@ "@zxing/text-encoding": "0.9.0" } }, - "node_modules/web-namespaces": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/web-namespaces/-/web-namespaces-2.0.1.tgz", - "integrity": "sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, "node_modules/web-streams-polyfill": { "version": "3.3.3", "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.3.3.tgz", @@ -29916,6 +28317,7 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/yoctocolors/-/yoctocolors-2.1.1.tgz", "integrity": "sha512-GQHQqAopRhwU8Kt1DDM8NjibDXHC8eoh1erhGAJPEyveY9qqVeXvVikNKrDz69sHowPMorbPUrH/mx8c50eiBQ==", + "dev": true, "engines": { "node": ">=18" }, @@ -29924,10 +28326,11 @@ } }, "node_modules/yoctocolors-cjs": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/yoctocolors-cjs/-/yoctocolors-cjs-2.1.2.tgz", - "integrity": "sha512-cYVsTjKl8b+FrnidjibDWskAv7UKOfcwaVZdp/it9n1s9fU3IkgDbhdIRKCW4JDsAlECJY0ytoVPT3sK6kideA==", + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/yoctocolors-cjs/-/yoctocolors-cjs-2.1.3.tgz", + "integrity": "sha512-U/PBtDf35ff0D8X8D0jfdzHYEPFxAI7jJlxZXwCSez5M3190m+QobIfh+sWDWSHMCWWJN2AWamkegn6vr6YBTw==", "dev": true, + "license": "MIT", "engines": { "node": ">=18" }, @@ -29936,9 +28339,10 @@ } }, "node_modules/zod": { - "version": "3.23.8", - "resolved": "https://registry.npmjs.org/zod/-/zod-3.23.8.tgz", - "integrity": "sha512-XBx9AXhXktjUqnepgTiE5flcKIYWi/rme0Eaj+5Y0lftuGBq+jyRu/md4WnuxqgP1ubdpNCsYEYPxrzVHD8d6g==", + "version": "3.25.76", + "resolved": "https://registry.npmjs.org/zod/-/zod-3.25.76.tgz", + "integrity": "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==", + "license": "MIT", "funding": { "url": "https://github.com/sponsors/colinhacks" } @@ -29947,6 +28351,7 @@ "version": "2.0.4", "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-2.0.4.tgz", "integrity": "sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==", + "dev": true, "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" diff --git a/package.json b/package.json index 7d1a20a20..8a6a184b4 100644 --- a/package.json +++ b/package.json @@ -5,8 +5,19 @@ "title": "Full Stack Testing 🧪", "subtitle": "Confidently ship your full-stack app with automated tests", "githubRoot": "https://github.com/epicweb-dev/full-stack-testing/blob/main", - "root": true, - "epicWorkshopSlug": "web-application-testing", + "product": { + "host": "www.epicweb.dev", + "slug": "web-application-testing", + "displayName": "EpicWeb.dev", + "displayNameShort": "Epic Web", + "logo": "/logo.svg", + "discordChannelId": "1161045224907341972", + "discordTags": [ + "1161046174439063593", + "1161046014552199209" + ] + }, + "onboardingVideo": "https://www.epicweb.dev/tips/get-started-with-the-epic-workshop-app", "instructor": { "name": "Kent C. Dodds", "avatar": "/images/instructor.png", @@ -16,15 +27,15 @@ "type": "module", "scripts": { "postinstall": "patch-package --patch-dir epicshop/patches && cd ./epicshop && npm install", - "start": "npx --prefix ./epicshop epicshop start", - "dev": "npx --prefix ./epicshop epicshop start", - "setup": "node ./epicshop/setup.js", + "start": "pkgmgrx --prefix ./epicshop epicshop start", + "dev": "pkgmgrx --prefix ./epicshop epicshop start", + "setup": "pkgmgrx epicshop setup", "setup:custom": "node ./epicshop/setup-custom.js", - "build": "npm run build --if-present --workspaces", - "test": "npm run test --silent --prefix playground", - "test:e2e": "npm run test:e2e --silent --prefix playground", - "test:e2e:dev": "npm run test:e2e:dev --silent --prefix playground", - "test:e2e:run": "npm run test:e2e:run --silent --prefix playground", + "build": "pkgmgr run build --if-present --workspaces", + "test": "pkgmgr run test --silent --prefix playground", + "test:e2e": "pkgmgr run test:e2e --silent --prefix playground", + "test:e2e:dev": "pkgmgr run test:e2e:dev --silent --prefix playground", + "test:e2e:run": "pkgmgr run test:e2e:run --silent --prefix playground", "pretest:all": "npm run build", "test:all": "node ./scripts/test.js", "lint": "eslint .", @@ -110,5 +121,8 @@ ".env", "**/package-lock.json", "**/playwright-report/**" - ] + ], + "devDependencies": { + "pkgmgr": "^1.1.1" + } }