From 9374634338e924f1ec890f69a3357c82d5422a70 Mon Sep 17 00:00:00 2001 From: Ryan Bahan Date: Thu, 12 Mar 2026 11:52:43 -0600 Subject: [PATCH 1/2] Remove Cucumber test infrastructure The packages/features Cucumber test suite has been replaced by the Playwright-based e2e tests in packages/e2e. This removes the entire Cucumber infrastructure: - Delete packages/features (feature files, step definitions, world setup, helpers, snapshots, and config) - Remove test:features and test:regenerate-snapshots scripts - Remove acceptance-tests CI job from PR workflow - Remove acceptance test steps from main and manual workflows - Remove features package from knip config and ESLint overrides - Update testing strategy docs to reference e2e tests Active cucumber scenarios to consider migrating to e2e in a followup: - App scaffold + build (react-router and extension-only apps) - CLI command snapshot validation - GitHub Actions pinning check - Shared node dependency version sync Co-Authored-By: Claude Opus 4.6 (1M context) --- .github/workflows/tests-main.yml | 6 - .github/workflows/tests-manual.yml | 4 - .github/workflows/tests-pr.yml | 26 +- docs/cli/testing-strategy.md | 27 +- package.json | 14 +- packages/eslint-plugin-cli/config.js | 8 - packages/features/CHANGELOG.md | 140 ---- packages/features/cucumber.js | 22 - packages/features/features/app.feature | 26 - packages/features/features/commands.feature | 5 - .../features/features/github-actions.feature | 5 - packages/features/features/node-deps.feature | 5 - packages/features/features/theme.feature | 6 - packages/features/lib/constants.ts | 19 - packages/features/lib/environment.ts | 17 - packages/features/lib/fs.ts | 9 - packages/features/lib/sleep.ts | 12 - packages/features/lib/system.ts | 42 -- packages/features/package.json | 40 -- packages/features/project.json | 42 -- packages/features/snapshots/commands.txt | 111 --- packages/features/snapshots/regenerate.sh | 9 - packages/features/steps/app.steps.ts | 131 ---- packages/features/steps/cli.steps.ts | 6 - packages/features/steps/commands.steps.ts | 31 - packages/features/steps/create-app.steps.ts | 87 --- packages/features/steps/environment.steps.ts | 40 -- .../features/steps/github-actions.steps.ts | 34 - packages/features/steps/node-deps.steps.ts | 90 --- packages/features/steps/theme.steps.ts | 15 - packages/features/tsconfig.json | 12 - packages/features/world/index.ts | 57 -- pnpm-lock.yaml | 664 ++---------------- 33 files changed, 63 insertions(+), 1699 deletions(-) delete mode 100644 packages/features/CHANGELOG.md delete mode 100644 packages/features/cucumber.js delete mode 100644 packages/features/features/app.feature delete mode 100644 packages/features/features/commands.feature delete mode 100644 packages/features/features/github-actions.feature delete mode 100644 packages/features/features/node-deps.feature delete mode 100644 packages/features/features/theme.feature delete mode 100644 packages/features/lib/constants.ts delete mode 100644 packages/features/lib/environment.ts delete mode 100644 packages/features/lib/fs.ts delete mode 100644 packages/features/lib/sleep.ts delete mode 100644 packages/features/lib/system.ts delete mode 100644 packages/features/package.json delete mode 100644 packages/features/project.json delete mode 100644 packages/features/snapshots/commands.txt delete mode 100755 packages/features/snapshots/regenerate.sh delete mode 100644 packages/features/steps/app.steps.ts delete mode 100644 packages/features/steps/cli.steps.ts delete mode 100644 packages/features/steps/commands.steps.ts delete mode 100644 packages/features/steps/create-app.steps.ts delete mode 100644 packages/features/steps/environment.steps.ts delete mode 100644 packages/features/steps/github-actions.steps.ts delete mode 100644 packages/features/steps/node-deps.steps.ts delete mode 100644 packages/features/steps/theme.steps.ts delete mode 100644 packages/features/tsconfig.json delete mode 100644 packages/features/world/index.ts diff --git a/.github/workflows/tests-main.yml b/.github/workflows/tests-main.yml index 9effb7157ae..3a50df0acad 100644 --- a/.github/workflows/tests-main.yml +++ b/.github/workflows/tests-main.yml @@ -59,12 +59,6 @@ jobs: env: VITEST_MIN_THREADS: "1" VITEST_MAX_THREADS: "4" - - name: Acceptance tests - if: ${{ matrix.node == '24.1.0' }} - env: - SHOPIFY_CLI_PARTNERS_TOKEN: ${{ secrets.SHOPIFY_CLI_PARTNERS_TOKEN }} - SHOPIFY_FLAG_CLIENT_ID: ${{ secrets.SHOPIFY_FLAG_CLIENT_ID }} - run: pnpm nx run features:test - name: Send Slack notification on failure uses: slackapi/slack-github-action@007b2c3c751a190b6f0f040e47ed024deaa72844 # v1.23.0 if: ${{ failure() && !cancelled() }} diff --git a/.github/workflows/tests-manual.yml b/.github/workflows/tests-manual.yml index 7c27628f4ea..b2bd74dca7a 100644 --- a/.github/workflows/tests-manual.yml +++ b/.github/workflows/tests-manual.yml @@ -60,10 +60,6 @@ jobs: node-version: ${{ inputs.node-version }} - name: Unit tests run: pnpm test:unit --output-style=stream - - name: Acceptance tests - env: - SHOPIFY_CLI_PARTNERS_TOKEN: ${{ secrets.SHOPIFY_CLI_PARTNERS_TOKEN }} - run: pnpm test:features --output-style=stream - name: Setup tmate session if: ${{ failure() && inputs.debug-enabled }} uses: mxschmitt/action-tmate@c0afd6f790e3a5564914980036ebf83216678101 # v3 diff --git a/.github/workflows/tests-pr.yml b/.github/workflows/tests-pr.yml index 85ef50758fd..19642321aee 100644 --- a/.github/workflows/tests-pr.yml +++ b/.github/workflows/tests-pr.yml @@ -170,30 +170,6 @@ jobs: VITEST_MIN_THREADS: "1" VITEST_MAX_THREADS: "4" - acceptance-tests: - name: 'Acceptance tests with Node ${{ matrix.node }} in ${{ matrix.os }}' - runs-on: ${{ matrix.os }} - timeout-minutes: 30 - strategy: - matrix: - os: [ 'ubuntu-latest', 'macos-latest', 'windows-latest' ] - node: [ '24.1.0' ] - steps: - - uses: actions/checkout@v3 - with: - repository: ${{ github.event.pull_request.head.repo.full_name || github.event.repository.full_name }} - ref: ${{ github.event.pull_request.head.ref || github.event.merge_group.head_ref }} - fetch-depth: 1 - - name: Setup deps - uses: ./.github/actions/setup-cli-deps - with: - node-version: ${{ matrix.node }} - - name: Acceptance tests - env: - SHOPIFY_CLI_PARTNERS_TOKEN: ${{ secrets.SHOPIFY_CLI_PARTNERS_TOKEN }} - SHOPIFY_FLAG_CLIENT_ID: ${{ secrets.SHOPIFY_FLAG_CLIENT_ID }} - run: pnpm test:features --output-style=stream - test-coverage: if: ${{ github.event.pull_request.user.login != 'dependabot[bot]' }} name: 'Test Coverage' @@ -282,7 +258,7 @@ jobs: with: node-version: ${{ env.DEFAULT_NODE_VERSION }} - name: Build - run: pnpm nx run-many --all --skip-nx-cache --target=build --exclude=features --output-style=stream + run: pnpm nx run-many --all --skip-nx-cache --target=build --output-style=stream - name: Type-diff working-directory: workspace id: type-diff diff --git a/docs/cli/testing-strategy.md b/docs/cli/testing-strategy.md index 1394b073e4a..31cbcbe0024 100644 --- a/docs/cli/testing-strategy.md +++ b/docs/cli/testing-strategy.md @@ -73,32 +73,9 @@ test("writes", async () => { - [Vitest API](https://vitest.dev/api/) - [Examples](https://vitest.dev/guide/#examples) -## Acceptance tests 🥒 +## E2E tests -[Acceptance tests](https://en.wikipedia.org/wiki/Acceptance_testing) play an essential role in ensuring all the small pieces fit together to create user experiences. -They are defined as user stories which are a set of steps a user would take and the expectations they'd have while navigating through those steps. - -```feature -Scenario: I create a new app with pnpm - Given I have a working directory - When I create an app named MyApp with pnpm as dependency manager - Then I have an app named MyApp with pnpm as dependency manager -``` -Acceptance tests live under `packages/features` and implemented using [Cucumber](https://cucumber.io/). We create a working directory for every test that isolates the test from the rest. Moreover, the CLIs are invoked, configuring them to store global states in those temporary directories. That way, we prevent the global state from leaking into other tests and making them fail. - -Each `.feature` file under `features/` group of scenarios has something in common (e.g. all scenarios related to app development). Steps are declared in Typescript files under `steps`. All the files in that directory or sub-directories are automatically loaded. We recommend keeping parity between those files and the features to quickly locate the steps. - -### How to implement an acceptance test - -1. Describe the scenario in a `.feature` file. Create a new one if you can't find a feature file your scenario fits into. -2. Implement the steps of your scenario. -3. Run the scenario with `FEATURE=path/to/scenario.feature:line yarn test`. - -**Note** that we don't need to test all the user scenarios. Unlike unit tests, acceptance tests are slow. Focus on the user journeys that are most common and prefer larger but fewer scenarios over smaller but more. - -> :bulb: Try to make them as generic as possible by using regular expressions when defining steps. That way, your steps can easily be reused by other scenarios. - -> :bulb: If your scenario relies on a global state, for example, storing a file in the user's environment, adjust the implementation to control the state's location from the acceptance tests. This is extremely important to prevent flakiness. +End-to-end tests live under `packages/e2e` and are implemented using [Playwright](https://playwright.dev/). They test full user journeys by invoking the CLI and verifying outputs. Run them with `pnpm test:e2e`. ## Github Actions Before being able to marge a PR, it must pass all CI checks executed in Github Actions. diff --git a/package.json b/package.json index 3f6434c728a..880b55179ea 100644 --- a/package.json +++ b/package.json @@ -29,10 +29,8 @@ "shopify:run": "node packages/cli/bin/dev.js", "shopify": "nx build cli && node packages/cli/bin/dev.js", "test:e2e": "nx run-many --target=build --projects=cli,create-app --skip-nx-cache && pnpm --filter e2e exec playwright test", - "test:features": "pnpm nx run features:test", - "test:regenerate-snapshots": "nx build cli && packages/features/snapshots/regenerate.sh", "test:unit": "pnpm vitest run", - "test": "pnpm vitest run && pnpm nx run features:test", + "test": "pnpm vitest run", "type-check:affected": "nx affected --target=type-check", "type-check": "nx run-many --target=type-check --all --skip-nx-cache", "update-bugsnag": "bin/update-bugsnag.js" @@ -173,7 +171,6 @@ "graphql.config.ts" ], "ignoreBinaries": [ - "packages/features/snapshots/regenerate.sh", "bin/*", "shopify", "shopify-nightly", @@ -318,15 +315,6 @@ "**/src/index.ts" ], "project": "**/*.{ts,tsx}" - }, - "packages/features": { - "entry": [ - "**/cucumber.js", - "**/world/index.ts", - "**/steps/*.ts", - "**/lib/*.ts" - ], - "project": "**/*.ts" } } } diff --git a/packages/eslint-plugin-cli/config.js b/packages/eslint-plugin-cli/config.js index 454786fa3fa..96e22b98a4e 100644 --- a/packages/eslint-plugin-cli/config.js +++ b/packages/eslint-plugin-cli/config.js @@ -297,14 +297,6 @@ const config = [ rules: testFileRules, }, - // Features package - allow console for test utilities - { - files: ['**/packages/features/**/*.ts'], - rules: { - 'no-console': 'off', - }, - }, - // JS bin files - different rules apply { files: ['**/bin/*.js'], diff --git a/packages/features/CHANGELOG.md b/packages/features/CHANGELOG.md deleted file mode 100644 index bf071b99f39..00000000000 --- a/packages/features/CHANGELOG.md +++ /dev/null @@ -1,140 +0,0 @@ -# @shopify/features - -## 0.14.0 - -### Minor Changes - -- 521fb07: Add new `theme duplicate` command to duplicate store themes - -## 0.13.0 - -### Minor Changes - -- 24aa2dd: Drop support for Node 18 -- ce3dfdc: Print all log messages to stderr instead of stdout - -## 0.12.0 - -### Minor Changes - -- ca218cd31: Shopify CLI now defaults to be Global - -## 0.11.1 - -### Patch Changes - -- 960cdc0a2: Add a new "app init" command - -## 0.11.0 - -### Minor Changes - -- a9e847717: Upgrade oclif to v3 (improved help menus and more) - -## 0.10.0 - -### Minor Changes - -- 1d6fe3475: Increase minimum Node version to 18 -- 0896e62b1: Versioned app config support - -## 0.9.0 - -### Minor Changes - -- 2615b9765: Add new dev docs search command - -## 0.8.0 - -### Minor Changes - -- e13c78960: Hide plugins commands - -## 0.8.0-pre.0 - -### Minor Changes - -- e13c78960: Hide plugins commands - -## 0.7.2 - -### Patch Changes - -- 82a06e7e2: Add did-you-mean plugin - -## 0.7.1 - -### Patch Changes - -- 9d9480341: Add developer experience preview for JavaScript functions - -## 0.7.0 - -### Minor Changes - -- aaa9730d: New update-url command - -## 0.6.0 - -### Minor Changes - -- 737ca469: Remove logs functionality - -## 0.5.0 - -### Minor Changes - -- 8498d3e0: Add webhook trigger command - -## 0.4.0 - -### Minor Changes - -- 1d438b3c: Support for new internal extension type identifiers - -### Patch Changes - -- 858e3faf: Human facing internal extension type ids - -## 0.3.3 - -### Patch Changes - -- dbcffdbb: Fix issue when exchanging an identity token fails -- 022a4e24: Internal: build cli-kit using tsc instead of rollup+esbuild - -## 0.3.2 - -### Patch Changes - -- 57cc65b1: Reverted Human-facing extension type names - -## 0.3.1 - -### Patch Changes - -- c6a9450b: Add support to scaffold function extensions - -## 0.3.0 - -### Minor Changes - -- e744db7: Rename UI Extensions back to Extensions - -## 0.2.0 - -### Minor Changes - -- a9ae85a: Rename extensions to UI extensions consistently - -## 0.1.2 - -### Patch Changes - -- Add scaffold to the package.json's scripts section of the app template - -## 0.1.1 - -### Patch Changes - -- New CLI version diff --git a/packages/features/cucumber.js b/packages/features/cucumber.js deleted file mode 100644 index dc85b358e03..00000000000 --- a/packages/features/cucumber.js +++ /dev/null @@ -1,22 +0,0 @@ -import {platform} from 'os' - -const featureToRun = process.env.FEATURE - -const result = { - publishQuiet: true, - import: ['world/**/*.ts', 'steps/**/*.ts', 'lib/**/*.ts'], - format: ['@cucumber/pretty-formatter'], - parallel: 3, -} - -if (platform() === 'win32') { - result.tags = 'not @skip_windows' -} - -if (featureToRun) { - result.paths = [featureToRun] -} else { - result.paths = ['features/**/*.feature'] -} - -export default result diff --git a/packages/features/features/app.feature b/packages/features/features/app.feature deleted file mode 100644 index b3f3aebc33d..00000000000 --- a/packages/features/features/app.feature +++ /dev/null @@ -1,26 +0,0 @@ -# on windows linking to a local package causes errors in the CI environment -@skip_windows -Feature: Apps - -Background: - Given I have a working directory - -Scenario: I scaffold ui, theme and function extensions in a react-router app - And I create a react-router app named MyExtendedApp with npm as package manager -# When I create an extension named TestPurchaseExtensionReact of type post_purchase_ui and flavor react -# Then I have an extension named TestPurchaseExtensionReact of type checkout_post_purchase and flavor react -# When I create an extension named TestThemeExtension of type theme_app_extension -# Then I have an extension named TestThemeExtension of type theme -# When I create an extension named TestOrderDiscounts of type order_discounts and flavor vanilla-js -# Then I have an extension named TestOrderDiscounts of type function - Then I build the app -# Then all the extensions are built - -Scenario: I scaffold ui and function extensions in a extension only app - And I create a extension-only app named MyExtendedApp with npm as package manager -# When I create an extension named TestPurchaseExtensionReact of type post_purchase_ui and flavor react -# Then I have an extension named TestPurchaseExtensionReact of type checkout_post_purchase and flavor react -# When I create an extension named TestOrderDiscounts of type order_discounts and flavor vanilla-js -# Then I have an extension named TestOrderDiscounts of type function - Then I build the app -# Then all the extensions are built diff --git a/packages/features/features/commands.feature b/packages/features/features/commands.feature deleted file mode 100644 index 1262cc866f9..00000000000 --- a/packages/features/features/commands.feature +++ /dev/null @@ -1,5 +0,0 @@ -Feature: Loading all commands - -Scenario: No runtime errors happen when loading the CLI modules graph - When I list the available commands - Then I see all commands matching the snapshot diff --git a/packages/features/features/github-actions.feature b/packages/features/features/github-actions.feature deleted file mode 100644 index 0a4a252d493..00000000000 --- a/packages/features/features/github-actions.feature +++ /dev/null @@ -1,5 +0,0 @@ -Feature: Github Actions - -Scenario: All non-official github actions are pinned - When I look at the github actions we use - Then I see all non-official actions being pinned diff --git a/packages/features/features/node-deps.feature b/packages/features/features/node-deps.feature deleted file mode 100644 index 064e5f1b007..00000000000 --- a/packages/features/features/node-deps.feature +++ /dev/null @@ -1,5 +0,0 @@ -Feature: Node Dependencies - -Scenario: Shared node dependencies are in sync across packages - When I look at the package.json files in all packages - Then I see all shared node dependencies on the same version diff --git a/packages/features/features/theme.feature b/packages/features/features/theme.feature deleted file mode 100644 index d526b28e293..00000000000 --- a/packages/features/features/theme.feature +++ /dev/null @@ -1,6 +0,0 @@ -# Feature: Theme help - -# Scenario: I execute a theme command -# Given I have a working directory -# Then I see Theme's help menu -# Then I have Ruby CLI installed as a vendor dependency diff --git a/packages/features/lib/constants.ts b/packages/features/lib/constants.ts deleted file mode 100644 index 2fe1cc8a8d6..00000000000 --- a/packages/features/lib/constants.ts +++ /dev/null @@ -1,19 +0,0 @@ -import * as path from 'pathe' -import {fileURLToPath} from 'url' - -const __filename = fileURLToPath(import.meta.url) -const __dirname = path.dirname(__filename) - -export const directories = { - root: path.join(__dirname, '../../..'), - packages: { - cli: path.resolve(__dirname, '../../../packages/cli'), - app: path.resolve(__dirname, '../../../packages/app'), - cliKit: path.resolve(__dirname, '../../../packages/cli-kit'), - }, -} - -export const executables = { - cli: path.resolve(__dirname, '../../../packages/cli/bin/run.js'), - createApp: path.resolve(__dirname, '../../../packages/create-app/bin/run.js'), -} diff --git a/packages/features/lib/environment.ts b/packages/features/lib/environment.ts deleted file mode 100644 index 9d3ca89673f..00000000000 --- a/packages/features/lib/environment.ts +++ /dev/null @@ -1,17 +0,0 @@ -/** - * Given an environment variable, it returns true if its value represents a truthy value. - * @param value - The environment variable value or undefined if it's not defined. - * @returns True if the variable represents a truthy value. - */ -function isTruthy(value: string | undefined): boolean { - if (!value) { - return false - } - return ['TRUE', 'true', 'YES', 'yes', '1'].includes(value) -} - -/** Returns true if acceptance tests are run with DEBUG=1 */ -export const isDebug = isTruthy(process.env.DEBUG) - -/** Returns true if the acceptance tests are running on CI */ -export const isCI = isTruthy(process.env.CI) diff --git a/packages/features/lib/fs.ts b/packages/features/lib/fs.ts deleted file mode 100644 index a19879a85ff..00000000000 --- a/packages/features/lib/fs.ts +++ /dev/null @@ -1,9 +0,0 @@ -import fs from 'fs' - -export async function mkdir(path: string): Promise { - await fs.promises.mkdir(path, {recursive: true}) -} - -export async function writeFile(path: string, data: string): Promise { - await fs.promises.writeFile(path, data) -} diff --git a/packages/features/lib/sleep.ts b/packages/features/lib/sleep.ts deleted file mode 100644 index 3b84c2b0496..00000000000 --- a/packages/features/lib/sleep.ts +++ /dev/null @@ -1,12 +0,0 @@ -/** - * This function is designed to be a utility that pauses - * the execution of an e2e tests for debugging purposes. - * @returns A promise that resolves after a long period. - */ -const sleep = async () => { - await new Promise((resolve) => { - setTimeout(resolve, 60 * 60 * 1000) - }) -} - -export default sleep diff --git a/packages/features/lib/system.ts b/packages/features/lib/system.ts deleted file mode 100644 index 9d36ec7161d..00000000000 --- a/packages/features/lib/system.ts +++ /dev/null @@ -1,42 +0,0 @@ -import {isDebug} from './environment.js' -import colors from 'ansi-colors' -import {ExecaChildProcess, execa} from 'execa' - -export interface ExecOptions { - cwd?: string - env?: NodeJS.ProcessEnv -} - -/** - * It provides a promise-based interface for running system processes. - * The implementation forwards the standard - * output and error if the variable DEBUG=1 is set when running acceptance - * tests. - * @param command - The command to be executed. - * @returns A promise that resolves or rejects when the command execution finishes. - */ -export function exec(command: string, args: string[] = [], options?: ExecOptions): ExecaChildProcess { - if (isDebug) { - console.log(colors.gray(`Running: ${command} ${args.join(' ')}`)) - } - - const _options = { - ...options, - env: {...process.env, ...(options?.env ?? {}), SHOPIFY_RUN_AS_USER: '0'}, - } - const shortCommand = command.split('/').slice(-1).pop() || '' - const commandProcess = execa(command, args, _options) - - if (isDebug && commandProcess.stdout) { - commandProcess.stdout.on('data', (data: Buffer) => { - console.log(colors.gray(`${colors.bold(shortCommand)}: ${data.toString()}`)) - }) - } - if (isDebug && commandProcess.stderr) { - commandProcess.stderr.on('data', (data: Buffer) => { - console.log(colors.gray(`${colors.bold(shortCommand)}: ${data.toString()}`)) - }) - } - - return commandProcess -} diff --git a/packages/features/package.json b/packages/features/package.json deleted file mode 100644 index 0fcd63fe558..00000000000 --- a/packages/features/package.json +++ /dev/null @@ -1,40 +0,0 @@ -{ - "name": "@shopify/features", - "version": "0.14.0", - "packageManager": "pnpm@10.11.1", - "private": true, - "type": "module", - "scripts": { - "lint": "nx lint", - "lint:fix": "nx lint:fix", - "test": "nx run features:test", - "cucumber": "cucumber-js", - "type-check": "nx type-check" - }, - "eslintConfig": { - "extends": [ - "../../.eslintrc.cjs" - ], - "rules": { - "no-console": "off", - "import/extensions": [ - "error", - "never", - { - "ignorePackages": true - } - ] - } - }, - "devDependencies": { - "@cucumber/cucumber": "^12.2.0", - "@cucumber/messages": "30.1.0", - "@cucumber/pretty-formatter": "2.4.1", - "@types/fs-extra": "^9.0.13", - "fs-extra": "^9.1.0", - "tempy": "^3.1.0" - }, - "engines": { - "node": ">=20.10.0" - } -} diff --git a/packages/features/project.json b/packages/features/project.json deleted file mode 100644 index aa761a61417..00000000000 --- a/packages/features/project.json +++ /dev/null @@ -1,42 +0,0 @@ -{ - "name": "features", - "$schema": "../../node_modules/nx/schemas/project-schema.json", - "sourceRoot": "packages/features", - "projectType": "library", - "implicitDependencies": ["create-app", "cli"], - "tags": ["scope:e2e"], - "targets": { - "test": { - "executor": "nx:run-commands", - "dependsOn": ["^build"], - "options": { - "command": "pnpm cucumber", - "cwd": "packages/features", - "env": { - "NODE_OPTIONS": "--loader ts-node/esm" - } - } - }, - "lint": { - "executor": "nx:run-commands", - "options": { - "command": "pnpm eslint steps lib world", - "cwd": "packages/features" - } - }, - "lint:fix": { - "executor": "nx:run-commands", - "options": { - "command": "pnpm eslint steps lib world --fix", - "cwd": "packages/features" - } - }, - "type-check": { - "executor": "nx:run-commands", - "options": { - "command": "pnpm tsc --noEmit", - "cwd": "packages/features" - } - } - } -} diff --git a/packages/features/snapshots/commands.txt b/packages/features/snapshots/commands.txt deleted file mode 100644 index bfd6e031fcb..00000000000 --- a/packages/features/snapshots/commands.txt +++ /dev/null @@ -1,111 +0,0 @@ -├─ app -│ ├─ build -│ ├─ bulk -│ │ ├─ cancel -│ │ ├─ execute -│ │ └─ status -│ ├─ config -│ │ ├─ link -│ │ ├─ pull -│ │ └─ use -│ ├─ deploy -│ ├─ dev -│ │ └─ clean -│ ├─ env -│ │ ├─ pull -│ │ └─ show -│ ├─ execute -│ ├─ function -│ │ ├─ build -│ │ ├─ info -│ │ ├─ replay -│ │ ├─ run -│ │ ├─ schema -│ │ └─ typegen -│ ├─ generate -│ │ └─ extension -│ ├─ import-custom-data-definitions -│ ├─ import-extensions -│ ├─ info -│ ├─ init -│ ├─ logs -│ │ └─ sources -│ ├─ release -│ ├─ versions -│ │ └─ list -│ └─ webhook -│ └─ trigger -├─ auth -│ ├─ login -│ └─ logout -├─ commands -├─ config -│ └─ autocorrect -│ ├─ off -│ ├─ on -│ └─ status -├─ help -├─ hydrogen -│ ├─ build -│ ├─ check -│ ├─ codegen -│ ├─ customer-account-push -│ ├─ debug -│ │ └─ cpu -│ ├─ deploy -│ ├─ dev -│ ├─ env -│ │ ├─ list -│ │ ├─ pull -│ │ └─ push -│ ├─ generate -│ │ ├─ route -│ │ └─ routes -│ ├─ init -│ ├─ link -│ ├─ list -│ ├─ login -│ ├─ logout -│ ├─ preview -│ ├─ setup -│ │ ├─ css -│ │ ├─ markets -│ │ └─ vite -│ ├─ shortcut -│ ├─ unlink -│ └─ upgrade -├─ organization -│ └─ list -├─ plugins -│ ├─ add -│ ├─ inspect -│ ├─ install -│ ├─ link -│ ├─ remove -│ ├─ reset -│ ├─ uninstall -│ ├─ unlink -│ └─ update -├─ search -├─ theme -│ ├─ check -│ ├─ console -│ ├─ delete -│ ├─ dev -│ ├─ duplicate -│ ├─ info -│ ├─ init -│ ├─ language-server -│ ├─ list -│ ├─ metafields -│ │ └─ pull -│ ├─ open -│ ├─ package -│ ├─ profile -│ ├─ publish -│ ├─ pull -│ ├─ push -│ ├─ rename -│ └─ share -├─ upgrade -└─ version diff --git a/packages/features/snapshots/regenerate.sh b/packages/features/snapshots/regenerate.sh deleted file mode 100755 index 8d2f65d5adb..00000000000 --- a/packages/features/snapshots/regenerate.sh +++ /dev/null @@ -1,9 +0,0 @@ -#! /usr/bin/env bash - -set -euo pipefail - -# enter this dir so that we can run this script from the top-level -cd "$(dirname "$0")" - -# regenerate commands snapshot file -node ../../cli/bin/dev.js commands --tree > commands.txt diff --git a/packages/features/steps/app.steps.ts b/packages/features/steps/app.steps.ts deleted file mode 100644 index 9d4b99ee946..00000000000 --- a/packages/features/steps/app.steps.ts +++ /dev/null @@ -1,131 +0,0 @@ -import {executables} from '../lib/constants.js' -import {exec} from '../lib/system.js' -import {AppInfo} from '../world/index.js' -import * as path from 'pathe' -import {When, Then} from '@cucumber/cucumber' -import fs from 'fs-extra' - -import {strict as assert} from 'assert' - -When( - /I create an extension named (.+) of type ([^\s]+) and flavor (.+)$/, - {timeout: 5 * 60 * 1000}, - async function (name: string, type: string, flavor: string) { - await generateExtension({ - name, - type, - directory: this.appDirectory, - extraArgs: ['--flavor', flavor], - env: {...process.env, ...this.temporaryEnv, NODE_OPTIONS: ''}, - }) - }, -) - -When( - /I create an extension named (.+) of type ([^\s]+)$/, - {timeout: 5 * 60 * 1000}, - async function (name: string, type: string) { - await generateExtension({ - name, - type, - directory: this.appDirectory, - extraArgs: [], - env: {...process.env, ...this.temporaryEnv, NODE_OPTIONS: ''}, - }) - }, -) - -Then( - /I have an extension named (.+) of type ([^\s]+) and flavor (.+)$/, - {}, - async function (extName: string, extType: string, flavor: string) { - const appInfo: AppInfo = await this.appInfo() - const extension = this.findExtension(appInfo, extName) - if (!extension) assert.fail(`Extension not created! Config:\n${JSON.stringify(appInfo, null, 2)}`) - assert.equal(extension.configuration.type, extType) - - let fileExtension - - switch (flavor) { - case 'react': - fileExtension = 'jsx' - break - case 'typescript-react': - fileExtension = 'tsx' - break - case 'typescript': - fileExtension = 'ts' - break - case 'vanilla-js': - fileExtension = 'js' - break - default: - fileExtension = 'js' - } - - assert.equal(extension.entrySourceFilePath.split('/').pop(), `index.${fileExtension}`) - }, -) - -Then(/I have an extension named (.+) of type ([^\s]+)$/, {}, async function (extName: string, extType: string) { - const appInfo: AppInfo = await this.appInfo() - const extension = this.findExtension(appInfo, extName) - if (!extension) assert.fail(`Extension not created! Config:\n${JSON.stringify(appInfo, null, 2)}`) - assert.equal(extension.configuration.type, extType) -}) - -Then(/I do not have an extension named (.+) of type ([^\s]+)/, {}, async function (extName: string, _extType: string) { - const appInfo: AppInfo = await this.appInfo() - const extension = this.findExtension(appInfo, extName) - assert.equal(extension, undefined) -}) - -Then(/The extension named (.+) contains the theme extension directories/, {}, async function (extName: string) { - const appInfo: AppInfo = await this.appInfo() - const extension = this.findExtension(appInfo, extName) - if (!extension) assert.fail(`Extension not created! Config:\n${JSON.stringify(appInfo, null, 2)}`) - const expectedDirectories = ['assets', 'blocks', 'locales', 'snippets'] - - const nonExistingPaths = expectedDirectories - .flatMap((directory) => { - return [path.join(extension.directory, directory), path.join(extension.directory, directory, '.gitkeep')] - }) - .filter((expectedPath) => { - return !fs.pathExistsSync(expectedPath) - }) - if (nonExistingPaths.length !== 0) { - assert.fail(`The following paths were not found in the theme extension: ${nonExistingPaths.join(', ')}`) - } -}) - -interface GenerateExtensionArgs { - name: string - type: string - directory: string - extraArgs: string[] - env: Record -} -async function generateExtension({name, type, directory, extraArgs, env}: GenerateExtensionArgs) { - try { - await exec( - 'node', - [ - executables.cli, - 'app', - 'generate', - 'extension', - '--name', - name, - '--path', - directory, - '--template', - type, - ...extraArgs, - ], - {env}, - ) - } catch (error) { - console.error(`Failed to generate extension: ${name} of type ${type}`, error) - throw error - } -} diff --git a/packages/features/steps/cli.steps.ts b/packages/features/steps/cli.steps.ts deleted file mode 100644 index 3a5b7a8545b..00000000000 --- a/packages/features/steps/cli.steps.ts +++ /dev/null @@ -1,6 +0,0 @@ -import {Then} from '@cucumber/cucumber' - -Then(/I should be able to build the app at (.+)/, function (appName: string) { - console.log(appName) - // Write code here that turns the phrase above into concrete actions -}) diff --git a/packages/features/steps/commands.steps.ts b/packages/features/steps/commands.steps.ts deleted file mode 100644 index 2f55262ad4f..00000000000 --- a/packages/features/steps/commands.steps.ts +++ /dev/null @@ -1,31 +0,0 @@ -import {When, Then} from '@cucumber/cucumber' -import * as fs from 'fs/promises' -import {strict as assert} from 'assert' - -const errorMessage = ` -SNAPSHOT TEST FAILED! - -The result of 'shopify commands' has changed! We run this to check that -all commands can load successfully. - -It's normal to see this test fail when you add or remove a command in the CLI. -In this case you can run this command to regenerate the snapshot file: - -$ pnpm test:regenerate-snapshots - -Then you can commit this change and this test will pass. - -If instead you didn't mean to change a command, UH OH. Check the commands in -the diff below and figure out what is broken. -` - -When(/I list the available commands/, async function () { - const commandFlags = ['commands', '--tree'] - this.commandResult = (await this.execCLI(commandFlags)).stdout -}) - -Then(/I see all commands matching the snapshot/, async function () { - const snapshot: string = await fs.readFile('snapshots/commands.txt', {encoding: 'utf8'}) - const normalize = (value: string) => value.replace(/\r\n/g, '\n').trimEnd() - assert.equal(normalize(snapshot), normalize(this.commandResult), errorMessage) -}) diff --git a/packages/features/steps/create-app.steps.ts b/packages/features/steps/create-app.steps.ts deleted file mode 100644 index 46993fae51c..00000000000 --- a/packages/features/steps/create-app.steps.ts +++ /dev/null @@ -1,87 +0,0 @@ -import {executables} from '../lib/constants.js' -import {exec} from '../lib/system.js' -import {When, Then} from '@cucumber/cucumber' -import * as path from 'pathe' -import fs from 'fs-extra' - -import {strict as assert} from 'assert' - -interface ExtensionConfiguration { - configuration: { - name: string - } - outputPath: string -} - -When( - /I create a (.+) app named (.+) with (.+) as package manager/, - {timeout: 5 * 60 * 1000}, - async function (appType: string, appName: string, packageManager: string) { - let templateArgs - switch (appType) { - case 'react-router': - templateArgs = ['--template', 'reactRouter', '--flavor', 'javascript'] - break - case 'extension-only': - templateArgs = ['--template', 'none'] - break - default: - throw new Error(`Unknown app type: ${appType}`) - } - - const {stdout, stderr} = await exec( - 'node', - [ - executables.createApp, - '--name', - appName, - '--path', - this.temporaryDirectory, - '--package-manager', - packageManager, - '--local', - ...templateArgs, - ], - {env: {...process.env, ...this.temporaryEnv, NODE_OPTIONS: '', FORCE_COLOR: '0'}}, - ) - const output = `${stdout}\n${stderr}` - const hyphenatedAppName = output.match(/([\w-]+) is ready for you to build!/)?.[1] ?? appName - this.appDirectory = path.join(this.temporaryDirectory, hyphenatedAppName) - - // Ensure .npmrc exists before appending to it - const npmrcPath = path.join(this.appDirectory, '.npmrc') - await fs.ensureFile(npmrcPath) - // we need to disable this on CI otherwise pnpm will crash complaining that there is no lockfile - await fs.appendFile(npmrcPath, 'frozen-lockfile=false\n') - }, -) - -Then( - /I have an app named (.+) generated from the template with (.+) as package manager/, - {}, - async function (_appName: string, packageManager: string) { - const {stdout} = await this.execCLI(['app', 'info', '--path', this.appDirectory, '--json']) - const results = JSON.parse(stdout) - assert.equal(results.packageManager, packageManager) - }, -) - -Then(/I build the app/, {timeout: 2 * 60 * 1000 * 1000}, async function () { - await this.execCLI(['app', 'build', '--path', this.appDirectory]) -}) - -Then(/all the extensions are built/, {timeout: 2 * 60 * 1000 * 1000}, async function () { - const appInfo = await this.appInfo() - const extensionsMissingBuildFile = appInfo.allExtensions.filter((extension: ExtensionConfiguration) => { - const buildFilePath = extension.outputPath - - return !fs.pathExistsSync(buildFilePath) - }) - - if (extensionsMissingBuildFile.length) { - const extensionNames = extensionsMissingBuildFile.map( - (extensions: ExtensionConfiguration) => extensions.configuration.name, - ) - assert.fail(`Extensions without built file:\n${extensionNames.join(', ')}`) - } -}) diff --git a/packages/features/steps/environment.steps.ts b/packages/features/steps/environment.steps.ts deleted file mode 100644 index 686b378c9b1..00000000000 --- a/packages/features/steps/environment.steps.ts +++ /dev/null @@ -1,40 +0,0 @@ -import {writeFile} from '../lib/fs.js' -import {Given, After, setDefaultTimeout} from '@cucumber/cucumber' -import {temporaryDirectory} from 'tempy' -import {rimrafSync} from 'rimraf' -import * as path from 'pathe' - -// In the case of debug we want to disable -// the timeouts to be able to sleep the -// execution and debug things. -if (process.env.DEBUG === '1') { - setDefaultTimeout(-1) -} - -Given('I have a working directory', async function () { - this.temporaryDirectory = temporaryDirectory() - const dataHomeDirectory = path.join(this.temporaryDirectory, 'XDG_DATA_HOME') - const configHomeDirectory = path.join(this.temporaryDirectory, 'XDG_CONFIG_HOME') - const stateHomeDirectory = path.join(this.temporaryDirectory, 'XDG_STATE_HOME') - const cacheHomeDirectory = path.join(this.temporaryDirectory, 'XDG_CACHE_HOME') - - this.temporaryEnv = { - XDG_DATA_HOME: dataHomeDirectory, - XDG_CONFIG_HOME: configHomeDirectory, - XDG_STATE_HOME: stateHomeDirectory, - XDG_CACHE_HOME: cacheHomeDirectory, - } - - // When we run the acceptance tests in CI, the .npmrc is scoped to the project. - // Because of that, the projects that we create from acceptance tests fail to - // install dependencies because the package manager doesn't know which package registry - // to resolve the packages from. This line mitigates the issue. - const npmrc = '//registry.npmjs.org/' - await writeFile(path.join(this.temporaryDirectory, '.npmrc'), npmrc) -}) - -After(function () { - if (this.temporaryDirectory) { - rimrafSync(this.temporaryDirectory) - } -}) diff --git a/packages/features/steps/github-actions.steps.ts b/packages/features/steps/github-actions.steps.ts deleted file mode 100644 index 8e5cb346987..00000000000 --- a/packages/features/steps/github-actions.steps.ts +++ /dev/null @@ -1,34 +0,0 @@ -import {exec} from '../lib/system.js' -import {When, Then} from '@cucumber/cucumber' -import * as path from 'pathe' -import {strict as assert} from 'assert' - -import {fileURLToPath} from 'url' - -const __filename = fileURLToPath(import.meta.url) -const __dirname = path.dirname(__filename) - -When(/I look at the github actions we use/, async function () { - const {stdout} = await exec('grep', ['-Roh', 'uses: \\S*', '.'], {cwd: path.join(__dirname, '../../../.github')}) - this.githubActions = stdout.split('\n').map((line: string) => line.split(' ')[1]) -}) - -Then(/I see all non-official actions being pinned/, async function () { - const remaining: string[] = this.githubActions.filter( - // we skip the ones from github, from the repo or from Shopify - (action: string) => !action.startsWith('actions/') && !action.startsWith('./') && !action.startsWith('Shopify/'), - ) - const unpinned = remaining.filter( - (action: string) => - // an example of pinned package: - // pnpm/action-setup@646cdf48217256a3d0b80361c5a50727664284f2 - !action.match(/^[^@]+@[0-9a-f]+/), - ) - const errorMessage = `The following unofficial github actions have not been pinned:\n\n${unpinned - .map((el: string) => ` - ${el}`) - .join( - '\n', - )}\n\nRun the bin/pin-github-actions.js script, verify that the action is not doing anything malicious, then commit your changes.` - - assert.equal(unpinned.length, 0, errorMessage) -}) diff --git a/packages/features/steps/node-deps.steps.ts b/packages/features/steps/node-deps.steps.ts deleted file mode 100644 index 89b19334725..00000000000 --- a/packages/features/steps/node-deps.steps.ts +++ /dev/null @@ -1,90 +0,0 @@ -import {Then, When} from '@cucumber/cucumber' -import * as path from 'pathe' -import glob from 'fast-glob' -import {fileURLToPath} from 'url' -import fs from 'fs/promises' -import {strict as assert} from 'assert' - -const __filename = fileURLToPath(import.meta.url) -const __dirname = path.dirname(__filename) - -interface PackageJson { - dependencies?: Record - devDependencies?: Record - peerDependencies?: Record - resolutions?: Record -} - -async function parsePackageJson(path: string): Promise { - return JSON.parse(await fs.readFile(path, 'utf-8')) as PackageJson -} - -When(/I look at the package.json files in all packages/, async function () { - this.packageJsonMap = {} - for (const packageJson of glob.sync(`${__dirname}/../../*/package.json`)) { - const packageName = path.dirname(packageJson).split('/').pop()! - // eslint-disable-next-line no-await-in-loop - this.packageJsonMap[packageName] = await parsePackageJson(packageJson) - } - this.packageJsonMap.root = await parsePackageJson(`${__dirname}/../../../package.json`) -}) - -const sharedDependencies = [ - // react is not included as cli-kit uses 18, while other packages use 17 - '@babel/core', - '@oclif/core', - '@shopify/cli-kit', - '@types/node', - '@typescript-eslint/parser', - 'esbuild', - 'execa', - 'fast-glob', - 'graphql', - 'graphql-request', - 'graphql-tag', - 'ink', - 'liquidjs', - 'node-fetch', - 'typescript', - 'vite', - 'vitest', - 'zod', -] - -Then(/I see all shared node dependencies on the same version/, async function () { - const different: {dep: string; versions: {packageName: string; version: string}[]}[] = [] - - sharedDependencies.forEach((dep) => { - const depVersions = Object.entries(this.packageJsonMap).reduce( - (acc: {packageName: string; version: string}[], [packageName, json]) => { - const packageJson = json as PackageJson - const depVersion = - packageJson.dependencies?.[dep] ?? - packageJson.devDependencies?.[dep] ?? - packageJson.peerDependencies?.[dep] ?? - packageJson.resolutions?.[dep] - if (depVersion) { - acc.push({packageName, version: depVersion.replace(/^\^/, '')}) - } - return acc - }, - [], - ) - - const allVersions = depVersions.map((pair) => pair.version) - const someVersionsAreDifferent = [...new Set(allVersions)].length > 1 - - if (someVersionsAreDifferent) { - different.push({dep, versions: depVersions}) - } - }) - - const errorMessage = `The following node dependencies are on different versions across packages:\n\n${different - .map( - ({dep, versions}) => - ` - ${dep}:\n${versions.map(({packageName, version}) => ` - ${packageName}: ${version}`).join('\n')}`, - ) - .join('\n\n')}\n\nPlease make sure they are all on the same version.` - - assert.equal(different.length, 0, errorMessage) -}) diff --git a/packages/features/steps/theme.steps.ts b/packages/features/steps/theme.steps.ts deleted file mode 100644 index 68e75a422da..00000000000 --- a/packages/features/steps/theme.steps.ts +++ /dev/null @@ -1,15 +0,0 @@ -import {Then} from '@cucumber/cucumber' -import * as path from 'pathe' -import fs from 'fs' -import {strict as assert} from 'assert' - -Then(/I see Theme's help menu/, {timeout: 60 * 1000}, async function () { - await this.execCLI(['theme', 'help-old']) -}) - -Then(/I have Ruby CLI installed as a vendor dependency/, {}, async function () { - const cacheHome = this.temporaryEnv.XDG_CACHE_HOME - const cliPath = path.join(cacheHome, 'vendor', 'ruby-cli') - const exists = fs.existsSync(cliPath) - assert.equal(exists, true) -}) diff --git a/packages/features/tsconfig.json b/packages/features/tsconfig.json deleted file mode 100644 index 524e8f51583..00000000000 --- a/packages/features/tsconfig.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "extends": "../../configurations/tsconfig.json", - "include": ["./**/*.ts", "./**/*.js"], - "exclude": ["./dist"], - "compilerOptions": { - "outDir": "dist", - "types": ["node", "vitest/importMeta"] - }, - "references": [ - {"path": "../cli-kit"} - ] -} diff --git a/packages/features/world/index.ts b/packages/features/world/index.ts deleted file mode 100644 index 28b0c9de684..00000000000 --- a/packages/features/world/index.ts +++ /dev/null @@ -1,57 +0,0 @@ -import {executables} from '../lib/constants.js' -import {exec, ExecOptions} from '../lib/system.js' -import {setWorldConstructor} from '@cucumber/cucumber' - -export interface WorldConstructorParams { - temporaryDirectory: string -} - -export interface AppInfo { - allExtensions: Extension[] -} - -export interface Extension { - configuration: ExtensionConfiguration - directory: string - entrySourceFilePath: string -} - -export interface ExtensionConfiguration { - name: string - type: string - handle?: string -} - -export class World { - public temporaryDirectory: string - public temporaryEnv: Record | undefined - public appDirectory: string | undefined - - constructor({temporaryDirectory}: WorldConstructorParams) { - this.temporaryDirectory = temporaryDirectory - } - - public async appInfo() { - if (!this.appDirectory) { - throw new Error("An app hasn't been created. Make sure the acceptance test has a step to create an app.") - } - const {stdout} = await this.execCLI(['app', 'info', '--path', this.appDirectory, '--json']) - return JSON.parse(stdout) - } - - public async execCLI(args: string[], opts?: ExecOptions) { - const options = opts ?? {} - // we use a custom NODE_OPTIONS to use tsm-node/esm to transpile typescript, - // but we need to unset it otherwise child processes will also try to use it - options.env = {...process.env, ...this.temporaryEnv, ...options.env, NODE_OPTIONS: ''} - return exec('node', [executables.cli, ...args], options) - } - - public findExtension(appInfo: AppInfo, extName: string) { - return appInfo.allExtensions.find((extension: {configuration: ExtensionConfiguration}) => { - return extension.configuration.name === extName || extension.configuration.handle === extName.toLowerCase() - }) - } -} - -setWorldConstructor(World) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 95bb35d5434..30764ec242a 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -646,27 +646,6 @@ importers: specifier: 3.8.1 version: 3.8.1 - packages/features: - devDependencies: - '@cucumber/cucumber': - specifier: ^12.2.0 - version: 12.7.0 - '@cucumber/messages': - specifier: 30.1.0 - version: 30.1.0 - '@cucumber/pretty-formatter': - specifier: 2.4.1 - version: 2.4.1(@cucumber/messages@30.1.0) - '@types/fs-extra': - specifier: ^9.0.13 - version: 9.0.13 - fs-extra: - specifier: ^9.1.0 - version: 9.1.0 - tempy: - specifier: ^3.1.0 - version: 3.1.0 - packages/plugin-cloudflare: dependencies: '@oclif/core': @@ -792,7 +771,7 @@ importers: devDependencies: '@testing-library/react': specifier: ^16.3.2 - version: 16.3.2(@testing-library/dom@10.4.1)(@types/react-dom@18.3.7(@types/react@18.3.12))(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + version: 16.3.2(@testing-library/dom@10.4.1)(@types/react-dom@19.2.3(@types/react@18.3.12))(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@types/react': specifier: 18.3.12 version: 18.3.12 @@ -1809,10 +1788,6 @@ packages: '@changesets/write@0.4.0': resolution: {integrity: sha512-CdTLvIOPiCNuH71pyDu3rA+Q0n65cmAbXnwWH84rKGiFumFzkmHNT8KHTMEchcxN+Kl8I54xGUhJ7l3E7X396Q==} - '@colors/colors@1.5.0': - resolution: {integrity: sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==} - engines: {node: '>=0.1.90'} - '@cspotcode/source-map-support@0.8.1': resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==} engines: {node: '>=12'} @@ -1865,8 +1840,8 @@ packages: peerDependencies: '@csstools/css-tokenizer': ^4.0.0 - '@csstools/css-syntax-patches-for-csstree@1.1.0': - resolution: {integrity: sha512-H4tuz2nhWgNKLt1inYpoVCfbJbMwX/lQKp3g69rrrIMIYlFD9+zTykOKhNR8uGrAmbS/kT9n6hTFkmDkxLgeTA==} + '@csstools/css-syntax-patches-for-csstree@1.0.29': + resolution: {integrity: sha512-jx9GjkkP5YHuTmko2eWAvpPnb0mB4mGRr2U7XwVNwevm8nlpobZEVk+GNmiYMk2VuA75v+plfXWyroWKmICZXg==} '@csstools/css-tokenizer@3.0.4': resolution: {integrity: sha512-Vd/9EVDiu6PPJt9yAh6roZP6El1xHrdvIVGjyBsHR0RYwNHgL7FJPyIIW4fANJNG6FtyZfvlRPpFI4ZM/lubvw==} @@ -1876,72 +1851,6 @@ packages: resolution: {integrity: sha512-QxULHAm7cNu72w97JUNCBFODFaXpbDg+dP8b/oWFAZ2MTRppA3U00Y2L1HqaS4J6yBqxwa/Y3nMBaxVKbB/NsA==} engines: {node: '>=20.19.0'} - '@cucumber/ci-environment@13.0.0': - resolution: {integrity: sha512-cs+3NzfNkGbcmHPddjEv4TKFiBpZRQ6WJEEufB9mw+ExS22V/4R/zpDSEG+fsJ/iSNCd6A2sATdY8PFOyY3YnA==} - - '@cucumber/cucumber-expressions@19.0.0': - resolution: {integrity: sha512-4FKoOQh2Uf6F6/Ln+1OxuK8LkTg6PyAqekhf2Ix8zqV2M54sH+m7XNJNLhOFOAW/t9nxzRbw2CcvXbCLjcvHZg==} - - '@cucumber/cucumber@12.7.0': - resolution: {integrity: sha512-7A/9CJpJDxv1SQ7hAZU0zPn2yRxx6XMR+LO4T94Enm3cYNWsEEj+RGX38NLX4INT+H6w5raX3Csb/qs4vUBsOA==} - engines: {node: 20 || 22 || >=24} - hasBin: true - - '@cucumber/gherkin-streams@6.0.0': - resolution: {integrity: sha512-HLSHMmdDH0vCr7vsVEURcDA4WwnRLdjkhqr6a4HQ3i4RFK1wiDGPjBGVdGJLyuXuRdJpJbFc6QxHvT8pU4t6jw==} - hasBin: true - peerDependencies: - '@cucumber/gherkin': '>=22.0.0' - '@cucumber/message-streams': '>=4.0.0' - '@cucumber/messages': '>=17.1.1' - - '@cucumber/gherkin-utils@11.0.0': - resolution: {integrity: sha512-LJ+s4+TepHTgdKWDR4zbPyT7rQjmYIcukTwNbwNwgqr6i8Gjcmzf6NmtbYDA19m1ZFg6kWbFsmHnj37ZuX+kZA==} - hasBin: true - - '@cucumber/gherkin@38.0.0': - resolution: {integrity: sha512-duEXK+KDfQUzu3vsSzXjkxQ2tirF5PRsc1Xrts6THKHJO6mjw4RjM8RV+vliuDasmhhrmdLcOcM7d9nurNTJKw==} - - '@cucumber/html-formatter@23.0.0': - resolution: {integrity: sha512-WwcRzdM8Ixy4e53j+Frm3fKM5rNuIyWUfy4HajEN+Xk/YcjA6yW0ACGTFDReB++VDZz/iUtwYdTlPRY36NbqJg==} - peerDependencies: - '@cucumber/messages': '>=18' - - '@cucumber/junit-xml-formatter@0.9.0': - resolution: {integrity: sha512-WF+A7pBaXpKMD1i7K59Nk5519zj4extxY4+4nSgv5XLsGXHDf1gJnb84BkLUzevNtp2o2QzMG0vWLwSm8V5blw==} - peerDependencies: - '@cucumber/messages': '*' - - '@cucumber/message-streams@4.0.1': - resolution: {integrity: sha512-Kxap9uP5jD8tHUZVjTWgzxemi/0uOsbGjd4LBOSxcJoOCRbESFwemUzilJuzNTB8pcTQUh8D5oudUyxfkJOKmA==} - peerDependencies: - '@cucumber/messages': '>=17.1.1' - - '@cucumber/messages@30.1.0': - resolution: {integrity: sha512-KxnsSjHz9EGF23GeZc3BRMK2+bagt2p87mwwNfisBK7BfuyvnXJumyBQJJN4xv5SLSzBKxH3FsZnuOf8LwsHhg==} - - '@cucumber/messages@32.0.1': - resolution: {integrity: sha512-1OSoW+GQvFUNAl6tdP2CTBexTXMNJF0094goVUcvugtQeXtJ0K8sCP0xbq7GGoiezs/eJAAOD03+zAPT64orHQ==} - - '@cucumber/pretty-formatter@1.0.1': - resolution: {integrity: sha512-A1lU4VVP0aUWdOTmpdzvXOyEYuPtBDI0xYwYJnmoMDplzxMdhcHk86lyyvYDoMoPzzq6OkOE3isuosvUU4X7IQ==} - peerDependencies: - '@cucumber/cucumber': '>=7.0.0' - '@cucumber/messages': '*' - - '@cucumber/pretty-formatter@2.4.1': - resolution: {integrity: sha512-HomNZWTO7CqP44PNHOtguPqpHteIKzxyZNjFiuWKUXJ+DDTwLcdlBY2gIuP4BxEt9Q5AMu4ahde2Syo1elmTJQ==} - peerDependencies: - '@cucumber/messages': '*' - - '@cucumber/query@14.7.0': - resolution: {integrity: sha512-fiqZ4gMEgYjmbuWproF/YeCdD5y+gD2BqgBIGbpihOsx6UlNsyzoDSfO+Tny0q65DxfK+pHo2UkPyEl7dO7wmQ==} - peerDependencies: - '@cucumber/messages': '*' - - '@cucumber/tag-expressions@9.1.0': - resolution: {integrity: sha512-bvHjcRFZ+J1TqIa9eFNO1wGHqwx4V9ZKV3hYgkuK/VahHx73uiP4rKV3JVrvWSMrwrFvJG6C8aEwnCWSvbyFdQ==} - '@emnapi/core@1.8.1': resolution: {integrity: sha512-AvT9QFpxK0Zd8J0jopedNm+w/2fIzvtPKPjqyw9jwvBaReTTqPBk9Hixaz7KbjimP+QNz605/XnjFcDAL2pqBg==} @@ -2317,8 +2226,8 @@ packages: resolution: {integrity: sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@exodus/bytes@1.15.0': - resolution: {integrity: sha512-UY0nlA+feH81UGSHv92sLEPLCeZFjXOuHhrIo0HQydScuQc8s0A7kL/UdgwgDq8g8ilksmuoF35YVTNphV2aBQ==} + '@exodus/bytes@1.14.1': + resolution: {integrity: sha512-OhkBFWI6GcRMUroChZiopRiSp2iAMvEBK47NhJooDqz1RERO4QuZIZnjP63TXX8GAiLABkYmX+fuQsdJ1dd2QQ==} engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} peerDependencies: '@noble/hashes': ^1.8.0 || ^2.0.0 @@ -3927,10 +3836,6 @@ packages: resolution: {integrity: sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw==} engines: {node: '>=14.16'} - '@teppeis/multimaps@3.0.0': - resolution: {integrity: sha512-ID7fosbc50TbT0MK0EG12O+gAP3W3Aa/Pz4DaTtQtEvlc9Odaqi0de+xuZ7Li2GtK4HzEX7IuRWS/JmZLksR3Q==} - engines: {node: '>=14'} - '@testing-library/dom@10.4.1': resolution: {integrity: sha512-o4PXJQidqJl82ckFaXUeoAW+XysPLauYI43Abki5hABd853iMhitooc6znOnczgbTYmEP6U6/y1ZyKAIsvMKGg==} engines: {node: '>=18'} @@ -4459,10 +4364,6 @@ packages: resolution: {integrity: sha512-BvU8nYgGQBxcmMuEeUEmNTvrMVjJNSH7RgW24vXexN4Ven6qCvy4TntnvlnwnMLTVlcRQQdbRY8NKnaIoeWDNg==} engines: {node: '>=18'} - ansi-regex@4.1.1: - resolution: {integrity: sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==} - engines: {node: '>=6'} - ansi-regex@5.0.1: resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} engines: {node: '>=8'} @@ -4494,9 +4395,6 @@ packages: resolution: {integrity: sha512-0qWUglt9JEqLFr3w1I1pbrChn1grhaiAR2ocX1PP/flRmxgtwTzPFFFnfIlD6aMOLQZgSuCRlidD70lvx8yhzg==} engines: {node: '>=14'} - any-promise@1.3.0: - resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} - anymatch@3.1.3: resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} engines: {node: '>= 8'} @@ -4586,9 +4484,6 @@ packages: asap@2.0.6: resolution: {integrity: sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==} - assertion-error-formatter@3.0.0: - resolution: {integrity: sha512-6YyAVLrEze0kQ7CmJfUgrLHb+Y7XghmL2Ie7ijVa2Y9ynP3LV+VDiwFk62Dn0qtqbmY0BT0ss6p1xxpiF2PYbQ==} - assertion-error@2.0.1: resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==} engines: {node: '>=12'} @@ -4613,10 +4508,6 @@ packages: asynckit@0.4.0: resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} - at-least-node@1.0.0: - resolution: {integrity: sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==} - engines: {node: '>= 4.0.0'} - atomically@2.1.1: resolution: {integrity: sha512-P4w9o2dqARji6P7MHprklbfiArZAWvo07yW7qs3pdljb3BWr12FIB7W+p0zJiuiVsUpRO0iZn1kFFcpPegg0tQ==} @@ -4736,8 +4627,8 @@ packages: brace-expansion@2.0.2: resolution: {integrity: sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==} - brace-expansion@5.0.4: - resolution: {integrity: sha512-h+DEnpVvxmfVefa4jFbCf5HdH5YMDXRsmKflpf1pILZWRFlTbJpxeU55nJl4Smt5HQaGzg1o6RHFPJaOqnmBDg==} + brace-expansion@5.0.3: + resolution: {integrity: sha512-fy6KJm2RawA5RcHkLa1z/ScpBeA762UF9KmZQxwIbDtRJrgLzM10depAiEQ+CXYcoiqW1/m96OAAoke2nE9EeA==} engines: {node: 18 || 20 || >=22} braces@3.0.3: @@ -4887,9 +4778,6 @@ packages: resolution: {integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==} engines: {node: '>=8'} - class-transformer@0.5.1: - resolution: {integrity: sha512-SQa1Ws6hUbfC98vKGxZH3KFY0Y1lm5Zm0SY8XX9zbK7FJCyVEac3ATW0RIpwzW+oOfmHE5PMPufDG9hCfoEOMw==} - clean-stack@2.2.0: resolution: {integrity: sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==} engines: {node: '>=6'} @@ -4926,10 +4814,6 @@ packages: resolution: {integrity: sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==} engines: {node: '>=6'} - cli-table3@0.6.5: - resolution: {integrity: sha512-+W/5efTR7y5HRD7gACw9yQjqMVvEMLBHmboM/kPWam+H+Hmyrgjh6YncVKK122YZkXrLudzTuAukUw9FnMf7IQ==} - engines: {node: 10.* || >= 12.*} - cli-truncate@4.0.0: resolution: {integrity: sha512-nPdaFdQ0h/GEigbPClz11D0v/ZJEwxmeVZGeMo3Z5StPtUTkA9o1lD6QwoirYiSDzbcwn2XcjwmCp68W1IS4TA==} engines: {node: '>=18'} @@ -5015,18 +4899,6 @@ packages: resolution: {integrity: sha512-/rFeCpNJQbhSZjGVwO9RFV3xPqbnERS8MmIQzCtD/zl6gpJuV/bMLuN92oG3F7d8oDEHHRrujSXNUr8fpjntKw==} engines: {node: '>=18'} - commander@14.0.0: - resolution: {integrity: sha512-2uM9rYjPvyq39NwLRqaiLtWHyDC1FvryJDa2ATTVims5YAS4PupsEQsDvP14FqhFr0P49CYDugi59xaxJlTXRA==} - engines: {node: '>=20'} - - commander@14.0.2: - resolution: {integrity: sha512-TywoWNNRbhoD0BXs1P3ZEScW8W5iKrnbithIl0YH+uCmBd0QpPOA8yc82DS3BIE5Ma6FnBVUsJ7wVUDz4dvOWQ==} - engines: {node: '>=20'} - - commander@14.0.3: - resolution: {integrity: sha512-H+y0Jo/T1RZ9qPP4Eh1pkcQcLRglraJaSLoyOtHxu6AapkjWVCy2Sit1QQ4x3Dng8qDlSsZEet7g5Pq06MvTgw==} - engines: {node: '>=20'} - commander@9.5.0: resolution: {integrity: sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==} engines: {node: ^12.20.0 || >=14} @@ -5181,8 +5053,8 @@ packages: resolution: {integrity: sha512-x8dy3RnvYdlUcPOjkEHqozhiwzKNSq7GcPuXFbnyMOCHxX8V3OgIg/pYuabl2sbUPfIJaeAQB7PMOK8DFIdoRA==} engines: {node: '>=12'} - css-tree@3.2.1: - resolution: {integrity: sha512-X7sjQzceUhu1u7Y/ylrRZFU2FS6LRiFVp6rKLPg23y3x3c3DOKAwuXGDp+PAGjh6CSnCjYeAul8pcT8bAl+lSA==} + css-tree@3.1.0: + resolution: {integrity: sha512-0eW44TGN5SQXU1mWSkKwFstI/22X2bG1nYzZTYMAWjylYURhse752YgbE4Cx46AC+bAvI+/dYTPRk1LqSUnu6w==} engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0} css.escape@1.5.1: @@ -5952,10 +5824,6 @@ packages: resolution: {integrity: sha512-6Tb2myMioCAgv5kfvP5/PkZZ/ntTpVK39fHY7WkWBgvbeE+VHd/tZuZ4mrC+bxh4cfOZeYKVPaJIZtZXV7GNCQ==} engines: {node: '>=4.0.0'} - find-up-simple@1.0.1: - resolution: {integrity: sha512-afd4O7zpqHeRyg4PfDQsXmlDe2PfdHtJt6Akt8jOWaApLOZk5JXs6VMR29lz03pRe9mpykrRCYIYxaJYcfpncQ==} - engines: {node: '>=18'} - find-up@4.1.0: resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} engines: {node: '>=8'} @@ -6057,10 +5925,6 @@ packages: resolution: {integrity: sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==} engines: {node: '>=6 <7 || >=8'} - fs-extra@9.1.0: - resolution: {integrity: sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==} - engines: {node: '>=10'} - fs.realpath@1.0.0: resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} @@ -6177,10 +6041,6 @@ packages: resolution: {integrity: sha512-PT6XReJ+D07JvGoxQMkT6qji/jVNfX/h364XHZOWeRzy64sSFr+xJ5OX7LI3b4MPQzdL4H8Y8M0xzPpsVMwA8Q==} engines: {node: '>=10.0'} - global-dirs@3.0.1: - resolution: {integrity: sha512-NBcGGFbBA9s1VzD41QXDG+3++t9Mn5t1FpLdhESY6oKY4gYTFpX4wO3sqGUa0Srjtbfj3szX0RnemmrVRUdULA==} - engines: {node: '>=10'} - globals@14.0.0: resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==} engines: {node: '>=18'} @@ -6292,10 +6152,6 @@ packages: resolution: {integrity: sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==} engines: {node: '>=6'} - has-ansi@4.0.1: - resolution: {integrity: sha512-Qr4RtTm30xvEdqUXbSBVWDu+PrTokJOwe/FU+VdfJPk+MXAPoeOzKpRyrDTnZIJwAkQ4oBLTU53nu0HrkF/Z2A==} - engines: {node: '>=8'} - has-bigints@1.1.0: resolution: {integrity: sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==} engines: {node: '>= 0.4'} @@ -6340,10 +6196,6 @@ packages: resolution: {integrity: sha512-puUZAUKT5m8Zzvs72XWy3HtvVbTWljRE66cP60bxJzAqf2DgICo7lYTY2IHUmLnNpjYvw5bvmoHvPc0QO2a62w==} engines: {node: ^16.14.0 || >=18.0.0} - hosted-git-info@9.0.2: - resolution: {integrity: sha512-M422h7o/BR3rmCQ8UHi7cyyMqKltdP9Uo+J2fXK+RSAY+wTcKOIRyhTuKv4qn+DJf3g+PL890AzId5KZpX+CBg==} - engines: {node: ^20.17.0 || >=22.9.0} - html-encoding-sniffer@4.0.0: resolution: {integrity: sha512-Y22oTqIU4uuPgEemfz7NDJz6OeKf12Lsu+QC+s3BVpda64lTiMYCyGwg5ki4vFxkMwQdeZDl2adZoqUgdFuTgQ==} engines: {node: '>=18'} @@ -6448,10 +6300,6 @@ packages: resolution: {integrity: sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg==} engines: {node: '>=12'} - index-to-position@1.2.0: - resolution: {integrity: sha512-Yg7+ztRkqslMAS2iFaU+Oa4KTSidr63OsFGlOrJoW981kIYO3CGCS3wA95P1mUi/IVSJkn0D479KTJpVpvFNuw==} - engines: {node: '>=18'} - inflight@1.0.6: resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. @@ -6462,10 +6310,6 @@ packages: ini@1.3.8: resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} - ini@2.0.0: - resolution: {integrity: sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==} - engines: {node: '>=10'} - ink@5.0.1: resolution: {integrity: sha512-ae4AW/t8jlkj/6Ou21H2av0wxTk8vrGzXv+v2v7j4in+bl1M5XRMVbfNghzhBokV++FjF8RBDJvYo+ttR9YVRg==} engines: {node: '>=18'} @@ -6623,10 +6467,6 @@ packages: engines: {node: '>=14.16'} hasBin: true - is-installed-globally@0.4.0: - resolution: {integrity: sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ==} - engines: {node: '>=10'} - is-interactive@1.0.0: resolution: {integrity: sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==} engines: {node: '>=8'} @@ -6951,9 +6791,6 @@ packages: '@types/node': '>=18' typescript: '>=5.0.4' - knuth-shuffle-seeded@1.0.6: - resolution: {integrity: sha512-9pFH0SplrfyKyojCLxZfMcvkhf5hH0d+UwR9nTVJ/DDQJGuzcXjTwB7TP7sDfehSudlGGaOLblmEWqv04ERVWg==} - language-subtag-registry@0.3.23: resolution: {integrity: sha512-0K65Lea881pHotoGEa5gDlMxt3pctLi2RplBb7Ezh4rRdLEOtgi7n4EwK9lamnUCkKBqaeKRVebTq6BAxSkpXQ==} @@ -7032,9 +6869,6 @@ packages: lodash.merge@4.6.2: resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} - lodash.mergewith@4.6.2: - resolution: {integrity: sha512-GK3g5RPZWTRSeLSpgP8Xhra+pnjBC56q9FZYe1d5RN3TJ35dbkGy3YqBSMbyCrlbi+CM9Z3Jk5yTL7RCsqboyQ==} - lodash.sortby@4.7.0: resolution: {integrity: sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==} @@ -7092,10 +6926,6 @@ packages: lunr@2.3.9: resolution: {integrity: sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow==} - luxon@3.7.2: - resolution: {integrity: sha512-vtEhXh/gNjI9Yg1u4jX/0YVPMvxzHuGgCm6tC5kZyb08yjGWGnqAjGJvcXbqQR2P3MyMEFnRbpcdFS6PBcLqew==} - engines: {node: '>=12'} - lz-string@1.5.0: resolution: {integrity: sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==} hasBin: true @@ -7148,8 +6978,8 @@ packages: resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} engines: {node: '>= 0.4'} - mdn-data@2.27.1: - resolution: {integrity: sha512-9Yubnt3e8A0OKwxYSXyhLymGW4sCufcLG6VdiDdUGVkPhpqLxlvP5vl1983gQjJl3tqbrM731mjaZaP68AgosQ==} + mdn-data@2.12.2: + resolution: {integrity: sha512-IEn+pegP1aManZuckezWCO+XZQDplx1366JoVhTpMpBB1sPey/SbveZQUosKiKiGYjg1wH4pMlNgXbCiYgihQA==} mdurl@2.0.0: resolution: {integrity: sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w==} @@ -7235,15 +7065,15 @@ packages: resolution: {integrity: sha512-oRjTw/97aTBN0RHbYCdtF1MQfvusSIBQM0IZEgzl6426+8jSC0nF1a/GmnVLpfB9yyr6g6FTqWqiZVbxrtaCIg==} engines: {node: 18 || 20 || >=22} - minimatch@3.1.5: - resolution: {integrity: sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==} + minimatch@3.1.4: + resolution: {integrity: sha512-twmL+S8+7yIsE9wsqgzU3E8/LumN3M3QELrBZ20OdmQ9jB2JvW5oZtBEmft84k/Gs5CG9mqtWc6Y9vW+JEzGxw==} - minimatch@5.1.9: - resolution: {integrity: sha512-7o1wEA2RyMP7Iu7GNba9vc0RWWGACJOCZBJX2GJWip0ikV+wcOsgVuY9uE8CPiyQhkGFSlhuSkZPavN7u1c2Fw==} + minimatch@5.1.8: + resolution: {integrity: sha512-7RN35vit8DeBclkofOVmBY0eDAZZQd1HzmukRdSyz95CRh8FT54eqnbj0krQr3mrHR6sfRyYkyhwBWjoV5uqlQ==} engines: {node: '>=10'} - minimatch@7.4.9: - resolution: {integrity: sha512-Brg/fp/iAVDOQoHxkuN5bEYhyQlZhxddI78yWsCbeEwTHXQjlNLtiJDUsp1GIptVqMI7/gkJMz4vVAc01mpoBw==} + minimatch@7.4.8: + resolution: {integrity: sha512-RF6JWsI+7ecN51cfjtARMkIQoJxVeo3MIPKebcjf3J+mvrsbEHuHIDnPmu3FivgmWtTSsZI29wFH5TGeyqWC0g==} engines: {node: '>=10'} minimatch@9.0.3: @@ -7282,11 +7112,6 @@ packages: engines: {node: '>=10'} hasBin: true - mkdirp@3.0.1: - resolution: {integrity: sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==} - engines: {node: '>=10'} - hasBin: true - mri@1.2.0: resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==} engines: {node: '>=4'} @@ -7319,9 +7144,6 @@ packages: resolution: {integrity: sha512-WWdIxpyjEn+FhQJQQv9aQAYlHoNVdzIzUySNV1gHUPDSdZJ3yZn7pAAbQcV7B56Mvu881q9FZV+0Vx2xC44VWA==} engines: {node: ^18.17.0 || >=20.5.0} - mz@2.7.0: - resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} - n-gram@2.0.2: resolution: {integrity: sha512-S24aGsn+HLBxUGVAUFOwGpKs7LBcG4RudKU//eWzt/mQ97/NMKQxDWHyHx63UNWk/OOdihgmzoETn1tf5nQDzQ==} @@ -7409,10 +7231,6 @@ packages: resolution: {integrity: sha512-V6gygoYb/5EmNI+MEGrWkC+e6+Rr7mTmfHrxDbLzxQogBkgzo76rkok0Am6thgSF7Mv2nLOajAJj5vDJZEFn7g==} engines: {node: ^16.14.0 || >=18.0.0} - normalize-package-data@8.0.0: - resolution: {integrity: sha512-RWk+PI433eESQ7ounYxIp67CYuVsS1uYSonX3kA6ps/3LWfjVQa/ptEg6Y3T6uAMq1mWpX9PQ+qx+QaHpsc7gQ==} - engines: {node: ^20.17.0 || >=22.9.0} - normalize-path@2.1.1: resolution: {integrity: sha512-3pKJwH184Xo/lnH6oyP1q2pMd7HcypqqmRs91/6/i2CGtWwIKGCkOOMTm/zXbgTEWHw1uNpNi/igc3ePOYHb6w==} engines: {node: '>=0.10.0'} @@ -7694,10 +7512,6 @@ packages: package-manager-detector@0.2.11: resolution: {integrity: sha512-BEnLolu+yuz22S56CU1SUKq3XC3PkwD5wv4ikR4MfGvnRVcmzXR9DwSlW2fEamyTPyXHomBJRzgapeuBvRNzJQ==} - pad-right@0.2.2: - resolution: {integrity: sha512-4cy8M95ioIGolCoMmm2cMntGR1lPLEbOMzOKu8bzjuJP6JpzEMQcDHmh7hHLYGgob+nKe1YHFMaG4V59HQa89g==} - engines: {node: '>=0.10.0'} - pako@0.2.9: resolution: {integrity: sha512-NUcwaKxUxWrZLpDG+z/xZaCgQITkA/Dv4V/T6bw7VON6l1Xz/VnrBqrYjZQ12TamKHzITTfOEIYUj48y2KXImA==} @@ -7723,10 +7537,6 @@ packages: resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} engines: {node: '>=8'} - parse-json@8.3.0: - resolution: {integrity: sha512-ybiGyvspI+fAoRQbIPRddCcSTV9/LsJbf0e/S85VLowVGzRmokfneg2kwVW/KU5rOXrPSbF1qAKPMgNTqqROQQ==} - engines: {node: '>=18'} - parse-statements@1.0.11: resolution: {integrity: sha512-HlsyYdMBnbPQ9Jr/VgJ1YF4scnldvJpJxCVx6KgqPL4dxppsWrJHCIIxQXMJrqGnsRkNPATbeMJ8Yxu7JMsYcA==} @@ -7913,10 +7723,6 @@ packages: process-nextick-args@2.0.1: resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} - progress@2.0.3: - resolution: {integrity: sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==} - engines: {node: '>=0.4.0'} - promise@7.3.1: resolution: {integrity: sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==} @@ -7926,9 +7732,6 @@ packages: proper-lockfile@4.1.2: resolution: {integrity: sha512-TjNPblN4BwAWMXU8s9AEz4JmQxnD1NNL7bNOY/AKUzyamc379FWASUhc/K1pL2noVb+XmZKLL68cjzLsiOAMaA==} - property-expr@2.0.6: - resolution: {integrity: sha512-SVtmxhRE/CGkn3eZY1T6pC8Nln6Fr/lu1mKSgRud0eC73whjGfoAogbn78LkD8aFL0zz3bAFerKSnOl7NlErBA==} - proto-list@1.2.4: resolution: {integrity: sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==} @@ -8079,18 +7882,10 @@ packages: resolution: {integrity: sha512-9nfp2hYpCwOjAN+8TZFGhtWEwgvWHXqESH8qT89AT/lWklpLON22Lc8pEtnpsZz7VmawabSU0gCjnj8aC0euHQ==} engines: {node: '>=0.10.0'} - read-package-up@12.0.0: - resolution: {integrity: sha512-Q5hMVBYur/eQNWDdbF4/Wqqr9Bjvtrw2kjGxxBbKLbx8bVCL8gcArjTy8zDUuLGQicftpMuU0riQNcAsbtOVsw==} - engines: {node: '>=20'} - read-pkg-up@7.0.1: resolution: {integrity: sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==} engines: {node: '>=8'} - read-pkg@10.1.0: - resolution: {integrity: sha512-I8g2lArQiP78ll51UeMZojewtYgIRCKCWqZEgOO8c/uefTI+XDXvCSXu3+YNUaTNvZzobrL5+SqHjBrByRRTdg==} - engines: {node: '>=20'} - read-pkg@5.2.0: resolution: {integrity: sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==} engines: {node: '>=8'} @@ -8132,9 +7927,6 @@ packages: resolution: {integrity: sha512-EJ4UNY/U1t2P/2k6oqotuX2Cc3T6nxJwsM0N0asT7dhrtH1ltUxDn4NalSYmPE2rCkVpcf/X6R0wDwcFpzhd4w==} engines: {node: '>=6'} - reflect-metadata@0.2.2: - resolution: {integrity: sha512-urBwgfrvVP/eAyXx4hluJivBKzuEbSQs9rKWCrCkbSxNv8mxPcUZKeuoF3Uy4mJl3Lwprp6yy5/39VWigZ4K6Q==} - reflect.getprototypeof@1.0.10: resolution: {integrity: sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==} engines: {node: '>= 0.4'} @@ -8146,13 +7938,6 @@ packages: regenerate@1.4.2: resolution: {integrity: sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==} - regexp-match-indices@1.0.2: - resolution: {integrity: sha512-DwZuAkt8NF5mKwGGER1EGh2PRqyvhRhhLviH+R8y8dIuaQROlUfXjt4s9ZTXstIsSkptf06BSvwcEmmfheJJWQ==} - - regexp-tree@0.1.27: - resolution: {integrity: sha512-iETxpjK6YoRWJG5o6hXLwvjYAoW+FEZn9os0PD/b6AP6xQwsa/Y7lCVgIixBbUPMfhu+i2LtdeAqVTgGlQarfA==} - hasBin: true - regexp.prototype.flags@1.5.4: resolution: {integrity: sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==} engines: {node: '>= 0.4'} @@ -8188,10 +7973,6 @@ packages: remove-trailing-spaces@1.0.9: resolution: {integrity: sha512-xzG7w5IRijvIkHIjDk65URsJJ7k4J95wmcArY5PRcmjldIOl7oTvG8+X2Ag690R7SfwiOcHrWZKVc1Pp5WIOzA==} - repeat-string@1.6.1: - resolution: {integrity: sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==} - engines: {node: '>=0.10'} - require-directory@2.1.1: resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} engines: {node: '>=0.10.0'} @@ -8332,9 +8113,6 @@ packages: scheduler@0.27.0: resolution: {integrity: sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==} - seed-random@2.2.0: - resolution: {integrity: sha512-34EQV6AAHQGhoc0tn/96a9Fsi6v2xdqe/dMUwljGRaFOzR3EgRmECvD0O8vi8X+/uQ50LGHfkNu/Eue5TPKZkQ==} - semver-compare@1.0.0: resolution: {integrity: sha512-YM3/ITh2MJ5MtzaM429anh+x2jiLVjqILF4m4oyQB18W7Ggea7BfqdH/wGMK7dDiMghv/6WG7znWMwUDzJiXow==} @@ -8564,10 +8342,6 @@ packages: strict-event-emitter@0.5.1: resolution: {integrity: sha512-vMgjE/GGEPEFnhFub6pa4FmJBRBVOLpIII2hvCZ8Kzb7K0hlHo7mQv6xYrBvCL2LtAIBwFUK8wvuJgTVSQ5MFQ==} - string-argv@0.3.1: - resolution: {integrity: sha512-a1uQGz7IyVy9YwhqjZIZu1c8JO8dNIe20xBmSS6qu9kv++k3JGzCVmprbNN5Kn+BgzD5E7YYwg1CcjuJMRNsvg==} - engines: {node: '>=0.6.19'} - string-env-interpolation@1.0.1: resolution: {integrity: sha512-78lwMoCcn0nNu8LszbP1UA7g55OeE4v7rCeWnM5B453rnNr4aq+5it3FEYtZrSEiMvHZOZ9Jlqb0OD0M2VInqg==} @@ -8753,13 +8527,6 @@ packages: resolution: {integrity: sha512-u9E6A+ZDYdp7a4WnarkXPZOx8Ilz46+kby6p1yZ8zsGTz9gYa6FIS7lj2oezzNKmtdyyJNNmmXDppga5GB7kSw==} engines: {node: '>=18'} - thenify-all@1.6.0: - resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==} - engines: {node: '>=0.8'} - - thenify@3.3.1: - resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==} - through2@2.0.5: resolution: {integrity: sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==} @@ -8767,9 +8534,6 @@ packages: resolution: {integrity: sha512-YBGpG4bWsHoPvofT6y/5iqulfXIiIErl5B0LdtHT1mGXDFTAhhRrbUpTvBgYbovr+3cKblya2WAOcpoy90XguA==} engines: {node: '>=16'} - tiny-case@1.0.3: - resolution: {integrity: sha512-Eet/eeMhkO6TX8mnUteS9zgPbUMQa4I6Kkp5ORiBD5476/m+PIRiumP5tmh5ioJpH7k51Kehawy2UDfsnxxY8Q==} - tiny-jsonc@1.0.2: resolution: {integrity: sha512-f5QDAfLq6zIVSyCZQZhhyl0QS6MvAyTxgz4X4x3+EoCktNWEYJ6PeoEA97fyb98njpBNNi88ybpD7m+BDFXaCw==} @@ -8810,9 +8574,6 @@ packages: tldts-core@7.0.23: resolution: {integrity: sha512-0g9vrtDQLrNIiCj22HSe9d4mLVG3g5ph5DZ8zCKBr4OtrspmNB6ss7hVyzArAeE88ceZocIEGkyW1Ime7fxPtQ==} - tldts-core@7.0.25: - resolution: {integrity: sha512-ZjCZK0rppSBu7rjHYDYsEaMOIbbT+nWF57hKkv4IUmZWBNrBWBOjIElc0mKRgLM8bm7x/BBlof6t2gi/Oq/Asw==} - tldts@6.1.86: resolution: {integrity: sha512-WMi/OQ2axVTf/ykqCQgXiIct+mSQDFdH2fkwhPwgEwvJ1kSzZRiinb0zF2Xb8u4+OqPChmyI6MEu4EezNJz+FQ==} hasBin: true @@ -8821,10 +8582,6 @@ packages: resolution: {integrity: sha512-ASdhgQIBSay0R/eXggAkQ53G4nTJqTXqC2kbaBbdDwM7SkjyZyO0OaaN1/FH7U/yCeqOHDwFO5j8+Os/IS1dXw==} hasBin: true - tldts@7.0.25: - resolution: {integrity: sha512-keinCnPbwXEUG3ilrWQZU+CqcTTzHq9m2HhoUP2l7Xmi8l1LuijAXLpAJ5zRW+ifKTNscs4NdCkfkDCBYm352w==} - hasBin: true - tmp@0.2.5: resolution: {integrity: sha512-voyz6MApa1rQGUxT3E+BK7/ROe8itEx7vD8/HEvt4xwXucvQ5G5oeEiHkmHZJuBO21RpOf+YYm9MOivj709jow==} engines: {node: '>=14.14'} @@ -8840,9 +8597,6 @@ packages: resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} engines: {node: '>=0.6'} - toposort@2.0.2: - resolution: {integrity: sha512-0a5EOkAUp8D4moMi2W8ZF8jcga7BgZd91O/yabJCFY8az+XSzeGyTKs0Aoo897iV1Nj6guFq8orWDS96z91oGg==} - tough-cookie@5.1.2: resolution: {integrity: sha512-FVDYdxtnj0G6Qm/DhNPSb8Ju59ULcup3tuJxkFb5K8Bv2pUXILbf0xZWU8PX8Ov19OXljbUyveOFwRMwkXzO+A==} engines: {node: '>=16'} @@ -8851,10 +8605,6 @@ packages: resolution: {integrity: sha512-kXuRi1mtaKMrsLUxz3sQYvVl37B0Ns6MzfrtV5DvJceE9bPyspOqk9xxv7XbZWcfLWbFmm997vl83qUWVJA64w==} engines: {node: '>=16'} - tough-cookie@6.0.1: - resolution: {integrity: sha512-LktZQb3IeoUWB9lqR5EWTHgW/VTITCXg4D21M+lvybRVdylLrRMnqaIONLVb5mav8vM19m44HIcGq4qASeu2Qw==} - engines: {node: '>=16'} - tr46@5.1.1: resolution: {integrity: sha512-hdF5ZgjTqgAntKkklYw0R03MG2x/bSzTtkxmIRw/sTNV8YXsCJ1tfLAX23lhxhHJlEf3CRCOCGGWw3vI3GaSPw==} engines: {node: '>=18'} @@ -8878,10 +8628,6 @@ packages: peerDependencies: typescript: '>=4.0.0' - ts-dedent@2.2.0: - resolution: {integrity: sha512-q5W7tVM71e2xjHZTlgfTDoPF/SmqKG5hddq9SzR49CH2hayqRKJtQ4mtRlSxKaJlR/+9rEM+mnBHf7I2/BQcpQ==} - engines: {node: '>=6.10'} - ts-error@1.0.6: resolution: {integrity: sha512-tLJxacIQUM82IR7JO1UUkKlYuUTmoY9HBJAmNWFzheSlDS5SPMcNIepejHJa4BpPQLAcbRhRf3GDJzyj6rbKvA==} @@ -9049,8 +8795,8 @@ packages: resolution: {integrity: sha512-raqeBD6NQK4SkWhQzeYKd1KmIG6dllBOTt55Rmkt4HtI9mwdWtJljnrXjAFUBLTSN67HWrOIZ3EPF4kjUw80Bg==} engines: {node: '>=14.0'} - undici@7.24.0: - resolution: {integrity: sha512-jxytwMHhsbdpBXxLAcuu0fzlQeXCNnWdDyRHpvWsUl8vd98UwYdl9YTyn8/HcpcJPC3pwUveefsa3zTxyD/ERg==} + undici@7.22.0: + resolution: {integrity: sha512-RqslV2Us5BrllB+JeiZnK4peryVTndy9Dnqq62S3yYRRTj0tFQCwEniUy2167skdGOy3vqRzEvl1Dm4sV2ReDg==} engines: {node: '>=20.18.1'} unenv@1.10.0: @@ -9072,10 +8818,6 @@ packages: resolution: {integrity: sha512-hpbDzxUY9BFwX+UeBnxv3Sh1q7HFxj48DTmXchNgRa46lO8uj3/1iEn3MiNUYTg1g9ctIqXCCERn8gYZhHC5lQ==} engines: {node: '>=4'} - unicorn-magic@0.4.0: - resolution: {integrity: sha512-wH590V9VNgYH9g3lH9wWjTrUoKsjLF6sGLjhR4sH1LWpLmCOH0Zf7PukhDA8BiS7KHe4oPNkcTHqYkj7SOGUOw==} - engines: {node: '>=20'} - unique-string@2.0.0: resolution: {integrity: sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==} engines: {node: '>=8'} @@ -9133,9 +8875,6 @@ packages: react: 16.8.0 - 18 react-dom: 16.8.0 - 18 - util-arity@1.1.0: - resolution: {integrity: sha512-kkyIsXKwemfSy8ZEoaIz06ApApnWsk5hQO0vLjZS6UkBiGiW++Jsyb8vSBoc0WKlffGoGs5yYy/j5pp8zckrFA==} - util-deprecate@1.0.2: resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} @@ -9399,10 +9138,6 @@ packages: resolution: {integrity: sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg==} engines: {node: '>=18'} - xmlbuilder@15.1.1: - resolution: {integrity: sha512-yMqGBqtXyeN1e3TGYvgNgDVZ3j84W4cwkOXQswghol6APgZWaff9lnbvN7MHYJOiXsvGPXtjTYJEiC9J2wv9Eg==} - engines: {node: '>=8.0'} - xmlchars@2.2.0: resolution: {integrity: sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==} @@ -9470,9 +9205,6 @@ packages: yoga-wasm-web@0.3.3: resolution: {integrity: sha512-N+d4UJSJbt/R3wqY7Coqs5pcV0aUj2j9IaQ3rNj9bVCLld8tTGKRa2USARjnvZJWVx1NDmQev8EknoczaOQDOA==} - yup@1.7.1: - resolution: {integrity: sha512-GKHFX2nXul2/4Dtfxhozv701jLQHdf6J34YDh2cEkpqoo8le5Mg6/LrdseVLrFarmFygZTlfIhHx/QKfb/QWXw==} - zip-stream@4.1.1: resolution: {integrity: sha512-9qv4rlDiopXg4E69k+vMHjNN63YFMe9sZMrdlvKnCjlCRWeCBswPPMPUfx+ipsAWq1LXHe70RcbaHdJJpS6hyQ==} engines: {node: '>= 10'} @@ -9562,7 +9294,7 @@ snapshots: dependencies: '@asamuzakjp/nwsapi': 2.3.9 bidi-js: 1.0.3 - css-tree: 3.2.1 + css-tree: 3.1.0 is-potential-custom-element-name: 1.0.1 lru-cache: 11.2.6 optional: true @@ -10889,7 +10621,7 @@ snapshots: '@bramus/specificity@2.4.2': dependencies: - css-tree: 3.2.1 + css-tree: 3.1.0 optional: true '@bugsnag/browser@8.8.1': @@ -11076,9 +10808,6 @@ snapshots: human-id: 4.1.3 prettier: 2.8.8 - '@colors/colors@1.5.0': - optional: true - '@cspotcode/source-map-support@0.8.1': dependencies: '@jridgewell/trace-mapping': 0.3.9 @@ -11123,7 +10852,7 @@ snapshots: '@csstools/css-tokenizer': 4.0.0 optional: true - '@csstools/css-syntax-patches-for-csstree@1.1.0': + '@csstools/css-syntax-patches-for-csstree@1.0.29': optional: true '@csstools/css-tokenizer@3.0.4': {} @@ -11131,129 +10860,6 @@ snapshots: '@csstools/css-tokenizer@4.0.0': optional: true - '@cucumber/ci-environment@13.0.0': {} - - '@cucumber/cucumber-expressions@19.0.0': - dependencies: - regexp-match-indices: 1.0.2 - - '@cucumber/cucumber@12.7.0': - dependencies: - '@cucumber/ci-environment': 13.0.0 - '@cucumber/cucumber-expressions': 19.0.0 - '@cucumber/gherkin': 38.0.0 - '@cucumber/gherkin-streams': 6.0.0(@cucumber/gherkin@38.0.0)(@cucumber/message-streams@4.0.1(@cucumber/messages@32.0.1))(@cucumber/messages@32.0.1) - '@cucumber/gherkin-utils': 11.0.0 - '@cucumber/html-formatter': 23.0.0(@cucumber/messages@32.0.1) - '@cucumber/junit-xml-formatter': 0.9.0(@cucumber/messages@32.0.1) - '@cucumber/message-streams': 4.0.1(@cucumber/messages@30.1.0) - '@cucumber/messages': 32.0.1 - '@cucumber/pretty-formatter': 1.0.1(@cucumber/cucumber@12.7.0)(@cucumber/messages@32.0.1) - '@cucumber/tag-expressions': 9.1.0 - assertion-error-formatter: 3.0.0 - capital-case: 1.0.4 - chalk: 4.1.2 - cli-table3: 0.6.5 - commander: 14.0.3 - debug: 4.4.0(supports-color@8.1.1) - error-stack-parser: 2.1.4 - figures: 3.2.0 - glob: 13.0.6 - has-ansi: 4.0.1 - indent-string: 4.0.0 - is-installed-globally: 0.4.0 - is-stream: 2.0.1 - knuth-shuffle-seeded: 1.0.6 - lodash.merge: 4.6.2 - lodash.mergewith: 4.6.2 - luxon: 3.7.2 - mime: 3.0.0 - mkdirp: 3.0.1 - mz: 2.7.0 - progress: 2.0.3 - read-package-up: 12.0.0 - semver: 7.7.4 - string-argv: 0.3.1 - supports-color: 8.1.1 - type-fest: 4.41.0 - util-arity: 1.1.0 - yaml: 2.7.0 - yup: 1.7.1 - - '@cucumber/gherkin-streams@6.0.0(@cucumber/gherkin@38.0.0)(@cucumber/message-streams@4.0.1(@cucumber/messages@32.0.1))(@cucumber/messages@32.0.1)': - dependencies: - '@cucumber/gherkin': 38.0.0 - '@cucumber/message-streams': 4.0.1(@cucumber/messages@30.1.0) - '@cucumber/messages': 32.0.1 - commander: 14.0.0 - source-map-support: 0.5.21 - - '@cucumber/gherkin-utils@11.0.0': - dependencies: - '@cucumber/gherkin': 38.0.0 - '@cucumber/messages': 32.0.1 - '@teppeis/multimaps': 3.0.0 - commander: 14.0.2 - source-map-support: 0.5.21 - - '@cucumber/gherkin@38.0.0': - dependencies: - '@cucumber/messages': 32.0.1 - - '@cucumber/html-formatter@23.0.0(@cucumber/messages@32.0.1)': - dependencies: - '@cucumber/messages': 32.0.1 - - '@cucumber/junit-xml-formatter@0.9.0(@cucumber/messages@32.0.1)': - dependencies: - '@cucumber/messages': 32.0.1 - '@cucumber/query': 14.7.0(@cucumber/messages@32.0.1) - '@teppeis/multimaps': 3.0.0 - luxon: 3.7.2 - xmlbuilder: 15.1.1 - - '@cucumber/message-streams@4.0.1(@cucumber/messages@30.1.0)': - dependencies: - '@cucumber/messages': 30.1.0 - - '@cucumber/messages@30.1.0': - dependencies: - class-transformer: 0.5.1 - reflect-metadata: 0.2.2 - - '@cucumber/messages@32.0.1': - dependencies: - class-transformer: 0.5.1 - reflect-metadata: 0.2.2 - - '@cucumber/pretty-formatter@1.0.1(@cucumber/cucumber@12.7.0)(@cucumber/messages@32.0.1)': - dependencies: - '@cucumber/cucumber': 12.7.0 - '@cucumber/messages': 32.0.1 - ansi-styles: 5.2.0 - cli-table3: 0.6.5 - figures: 3.2.0 - ts-dedent: 2.2.0 - - '@cucumber/pretty-formatter@2.4.1(@cucumber/messages@30.1.0)': - dependencies: - '@cucumber/messages': 30.1.0 - '@cucumber/query': 14.7.0(@cucumber/messages@30.1.0) - - '@cucumber/query@14.7.0(@cucumber/messages@30.1.0)': - dependencies: - '@cucumber/messages': 30.1.0 - '@teppeis/multimaps': 3.0.0 - lodash.sortby: 4.7.0 - - '@cucumber/query@14.7.0(@cucumber/messages@32.0.1)': - dependencies: - '@cucumber/messages': 32.0.1 - '@teppeis/multimaps': 3.0.0 - lodash.sortby: 4.7.0 - - '@cucumber/tag-expressions@9.1.0': {} - '@emnapi/core@1.8.1': dependencies: '@emnapi/wasi-threads': 1.1.0 @@ -11459,7 +11065,7 @@ snapshots: dependencies: '@eslint/object-schema': 2.1.7 debug: 4.4.0(supports-color@8.1.1) - minimatch: 3.1.5 + minimatch: 3.1.4 transitivePeerDependencies: - supports-color @@ -11480,7 +11086,7 @@ snapshots: ignore: 5.3.2 import-fresh: 3.3.1 js-yaml: 4.1.1 - minimatch: 3.1.5 + minimatch: 3.1.4 strip-json-comments: 3.1.1 transitivePeerDependencies: - supports-color @@ -11494,7 +11100,7 @@ snapshots: '@eslint/core': 0.17.0 levn: 0.4.1 - '@exodus/bytes@1.15.0': + '@exodus/bytes@1.14.1': optional: true '@fastify/busboy@2.1.1': {} @@ -13721,8 +13327,6 @@ snapshots: dependencies: defer-to-connect: 2.0.1 - '@teppeis/multimaps@3.0.0': {} - '@testing-library/dom@10.4.1': dependencies: '@babel/code-frame': 7.29.0 @@ -13753,6 +13357,16 @@ snapshots: '@types/react': 18.3.12 '@types/react-dom': 18.3.7(@types/react@18.3.12) + '@testing-library/react@16.3.2(@testing-library/dom@10.4.1)(@types/react-dom@19.2.3(@types/react@18.3.12))(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@babel/runtime': 7.28.6 + '@testing-library/dom': 10.4.1 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.12 + '@types/react-dom': 19.2.3(@types/react@18.3.12) + '@theguild/federation-composition@0.21.3(graphql@16.10.0)': dependencies: constant-case: 3.0.4 @@ -13766,14 +13380,14 @@ snapshots: '@ts-morph/common@0.18.1': dependencies: fast-glob: 3.3.3 - minimatch: 5.1.9 + minimatch: 5.1.8 mkdirp: 1.0.4 path-browserify: 1.0.1 '@ts-morph/common@0.21.0': dependencies: fast-glob: 3.3.3 - minimatch: 7.4.9 + minimatch: 7.4.8 mkdirp: 2.1.6 path-browserify: 1.0.1 @@ -14354,8 +13968,6 @@ snapshots: dependencies: environment: 1.1.0 - ansi-regex@4.1.1: {} - ansi-regex@5.0.1: {} ansi-regex@6.2.2: {} @@ -14376,8 +13988,6 @@ snapshots: ansis@3.17.0: {} - any-promise@1.3.0: {} - anymatch@3.1.3: dependencies: normalize-path: 3.0.0 @@ -14508,12 +14118,6 @@ snapshots: asap@2.0.6: {} - assertion-error-formatter@3.0.0: - dependencies: - diff: 4.0.4 - pad-right: 0.2.2 - repeat-string: 1.6.1 - assertion-error@2.0.1: {} ast-types-flow@0.0.8: {} @@ -14530,8 +14134,6 @@ snapshots: asynckit@0.4.0: {} - at-least-node@1.0.0: {} - atomically@2.1.1: dependencies: stubborn-fs: 2.0.0 @@ -14672,7 +14274,7 @@ snapshots: dependencies: balanced-match: 1.0.2 - brace-expansion@5.0.4: + brace-expansion@5.0.3: dependencies: balanced-match: 4.0.4 @@ -14878,8 +14480,6 @@ snapshots: ci-info@3.9.0: {} - class-transformer@0.5.1: {} - clean-stack@2.2.0: {} clean-stack@3.0.1: @@ -14908,12 +14508,6 @@ snapshots: cli-spinners@2.9.2: {} - cli-table3@0.6.5: - dependencies: - string-width: 4.2.3 - optionalDependencies: - '@colors/colors': 1.5.0 - cli-truncate@4.0.0: dependencies: slice-ansi: 5.0.0 @@ -14997,12 +14591,6 @@ snapshots: commander@13.1.0: {} - commander@14.0.0: {} - - commander@14.0.2: {} - - commander@14.0.3: {} - commander@9.5.0: {} comment-parser@1.4.1: {} @@ -15161,9 +14749,9 @@ snapshots: dependencies: type-fest: 1.4.0 - css-tree@3.2.1: + css-tree@3.1.0: dependencies: - mdn-data: 2.27.1 + mdn-data: 2.12.2 source-map-js: 1.2.1 optional: true @@ -15177,8 +14765,8 @@ snapshots: cssstyle@6.2.0: dependencies: '@asamuzakjp/css-color': 5.0.1 - '@csstools/css-syntax-patches-for-csstree': 1.1.0 - css-tree: 3.2.1 + '@csstools/css-syntax-patches-for-csstree': 1.0.29 + css-tree: 3.1.0 lru-cache: 11.2.6 optional: true @@ -15748,7 +15336,7 @@ snapshots: hasown: 2.0.2 jsx-ast-utils: 3.3.5 language-tags: 1.0.9 - minimatch: 3.1.5 + minimatch: 3.1.4 object.fromentries: 2.0.8 safe-regex-test: 1.1.0 string.prototype.includes: 2.0.1 @@ -15811,7 +15399,7 @@ snapshots: estraverse: 5.3.0 hasown: 2.0.2 jsx-ast-utils: 3.3.5 - minimatch: 3.1.5 + minimatch: 3.1.4 object.entries: 1.1.9 object.fromentries: 2.0.8 object.values: 1.2.1 @@ -15880,7 +15468,7 @@ snapshots: is-glob: 4.0.3 json-stable-stringify-without-jsonify: 1.0.1 lodash.merge: 4.6.2 - minimatch: 3.1.5 + minimatch: 3.1.4 natural-compare: 1.4.0 optionator: 0.9.4 optionalDependencies: @@ -16086,8 +15674,6 @@ snapshots: dependencies: array-back: 3.1.0 - find-up-simple@1.0.1: {} - find-up@4.1.0: dependencies: locate-path: 5.0.0 @@ -16197,13 +15783,6 @@ snapshots: jsonfile: 4.0.0 universalify: 0.1.2 - fs-extra@9.1.0: - dependencies: - at-least-node: 1.0.0 - graceful-fs: 4.2.11 - jsonfile: 6.2.0 - universalify: 2.0.1 - fs.realpath@1.0.0: {} fsevents@2.3.2: @@ -16316,7 +15895,7 @@ snapshots: fs.realpath: 1.0.0 inflight: 1.0.6 inherits: 2.0.4 - minimatch: 3.1.5 + minimatch: 3.1.4 once: 1.4.0 path-is-absolute: 1.0.1 @@ -16325,7 +15904,7 @@ snapshots: fs.realpath: 1.0.0 inflight: 1.0.6 inherits: 2.0.4 - minimatch: 5.1.9 + minimatch: 5.1.8 once: 1.4.0 global-agent@3.0.0: @@ -16337,10 +15916,6 @@ snapshots: semver: 7.6.3 serialize-error: 7.0.1 - global-dirs@3.0.1: - dependencies: - ini: 2.0.0 - globals@14.0.0: {} globals@15.15.0: {} @@ -16515,10 +16090,6 @@ snapshots: hard-rejection@2.1.0: {} - has-ansi@4.0.1: - dependencies: - ansi-regex: 4.1.1 - has-bigints@1.1.0: {} has-flag@3.0.0: {} @@ -16556,17 +16127,13 @@ snapshots: dependencies: lru-cache: 10.4.3 - hosted-git-info@9.0.2: - dependencies: - lru-cache: 11.2.6 - html-encoding-sniffer@4.0.0: dependencies: whatwg-encoding: 3.1.1 html-encoding-sniffer@6.0.0: dependencies: - '@exodus/bytes': 1.15.0 + '@exodus/bytes': 1.14.1 transitivePeerDependencies: - '@noble/hashes' optional: true @@ -16664,8 +16231,6 @@ snapshots: indent-string@5.0.0: {} - index-to-position@1.2.0: {} - inflight@1.0.6: dependencies: once: 1.4.0 @@ -16675,8 +16240,6 @@ snapshots: ini@1.3.8: {} - ini@2.0.0: {} - ink@5.0.1(@types/react@18.3.12)(react@18.3.1): dependencies: '@alcalzone/ansi-tokenize': 0.1.3 @@ -16860,11 +16423,6 @@ snapshots: dependencies: is-docker: 3.0.0 - is-installed-globally@0.4.0: - dependencies: - global-dirs: 3.0.1 - is-path-inside: 3.0.3 - is-interactive@1.0.0: {} is-interactive@2.0.0: {} @@ -17106,7 +16664,7 @@ snapshots: '@acemir/cssom': 0.9.31 '@asamuzakjp/dom-selector': 6.8.1 '@bramus/specificity': 2.4.2 - '@exodus/bytes': 1.15.0 + '@exodus/bytes': 1.14.1 cssstyle: 6.2.0 data-urls: 7.0.0 decimal.js: 10.6.0 @@ -17117,8 +16675,8 @@ snapshots: parse5: 8.0.0 saxes: 6.0.0 symbol-tree: 3.2.4 - tough-cookie: 6.0.1 - undici: 7.24.0 + tough-cookie: 6.0.0 + undici: 7.22.0 w3c-xmlserializer: 5.0.0 webidl-conversions: 8.0.1 whatwg-mimetype: 5.0.0 @@ -17222,10 +16780,6 @@ snapshots: zod: 3.24.4 zod-validation-error: 3.5.4(zod@3.24.4) - knuth-shuffle-seeded@1.0.6: - dependencies: - seed-random: 2.2.0 - language-subtag-registry@0.3.23: {} language-tags@1.0.9: @@ -17299,8 +16853,6 @@ snapshots: lodash.merge@4.6.2: {} - lodash.mergewith@4.6.2: {} - lodash.sortby@4.7.0: {} lodash.startcase@4.4.0: {} @@ -17352,8 +16904,6 @@ snapshots: lunr@2.3.9: {} - luxon@3.7.2: {} - lz-string@1.5.0: {} macaddress@0.5.3: {} @@ -17401,7 +16951,7 @@ snapshots: math-intrinsics@1.1.0: {} - mdn-data@2.27.1: + mdn-data@2.12.2: optional: true mdurl@2.0.0: {} @@ -17468,17 +17018,17 @@ snapshots: minimatch@10.2.4: dependencies: - brace-expansion: 5.0.4 + brace-expansion: 5.0.3 - minimatch@3.1.5: + minimatch@3.1.4: dependencies: brace-expansion: 1.1.12 - minimatch@5.1.9: + minimatch@5.1.8: dependencies: brace-expansion: 2.0.2 - minimatch@7.4.9: + minimatch@7.4.8: dependencies: brace-expansion: 2.0.2 @@ -17492,7 +17042,7 @@ snapshots: minimatch@9.0.8: dependencies: - brace-expansion: 5.0.4 + brace-expansion: 5.0.3 minimist-options@4.1.0: dependencies: @@ -17510,8 +17060,6 @@ snapshots: mkdirp@2.1.6: {} - mkdirp@3.0.1: {} - mri@1.2.0: {} mrmime@1.0.1: {} @@ -17575,12 +17123,6 @@ snapshots: mute-stream@2.0.0: {} - mz@2.7.0: - dependencies: - any-promise: 1.3.0 - object-assign: 4.1.1 - thenify-all: 1.6.0 - n-gram@2.0.2: {} nanoid@3.3.8: {} @@ -17652,12 +17194,6 @@ snapshots: semver: 7.6.3 validate-npm-package-license: 3.0.4 - normalize-package-data@8.0.0: - dependencies: - hosted-git-info: 9.0.2 - semver: 7.6.3 - validate-npm-package-license: 3.0.4 - normalize-path@2.1.1: dependencies: remove-trailing-separator: 1.1.0 @@ -17994,10 +17530,6 @@ snapshots: dependencies: quansync: 0.2.11 - pad-right@0.2.2: - dependencies: - repeat-string: 1.6.1 - pako@0.2.9: {} param-case@3.0.4: @@ -18031,12 +17563,6 @@ snapshots: json-parse-even-better-errors: 2.3.1 lines-and-columns: 1.2.4 - parse-json@8.3.0: - dependencies: - '@babel/code-frame': 7.29.0 - index-to-position: 1.2.0 - type-fest: 4.41.0 - parse-statements@1.0.11: {} parse5@7.3.0: @@ -18202,8 +17728,6 @@ snapshots: process-nextick-args@2.0.1: {} - progress@2.0.3: {} - promise@7.3.1: dependencies: asap: 2.0.6 @@ -18220,8 +17744,6 @@ snapshots: retry: 0.12.0 signal-exit: 3.0.7 - property-expr@2.0.6: {} - proto-list@1.2.4: {} protobufjs@7.5.4: @@ -18387,26 +17909,12 @@ snapshots: react@19.2.4: {} - read-package-up@12.0.0: - dependencies: - find-up-simple: 1.0.1 - read-pkg: 10.1.0 - type-fest: 5.4.4 - read-pkg-up@7.0.1: dependencies: find-up: 4.1.0 read-pkg: 5.2.0 type-fest: 0.8.1 - read-pkg@10.1.0: - dependencies: - '@types/normalize-package-data': 2.4.4 - normalize-package-data: 8.0.0 - parse-json: 8.3.0 - type-fest: 5.4.4 - unicorn-magic: 0.4.0 - read-pkg@5.2.0: dependencies: '@types/normalize-package-data': 2.4.4 @@ -18439,7 +17947,7 @@ snapshots: readdir-glob@1.1.3: dependencies: - minimatch: 5.1.9 + minimatch: 5.1.8 readdirp@3.6.0: dependencies: @@ -18462,8 +17970,6 @@ snapshots: reduce-flatten@2.0.0: {} - reflect-metadata@0.2.2: {} - reflect.getprototypeof@1.0.10: dependencies: call-bind: 1.0.8 @@ -18481,12 +17987,6 @@ snapshots: regenerate@1.4.2: {} - regexp-match-indices@1.0.2: - dependencies: - regexp-tree: 0.1.27 - - regexp-tree@0.1.27: {} - regexp.prototype.flags@1.5.4: dependencies: call-bind: 1.0.8 @@ -18533,8 +18033,6 @@ snapshots: remove-trailing-spaces@1.0.9: {} - repeat-string@1.6.1: {} - require-directory@2.1.1: {} require-from-string@2.0.2: {} @@ -18697,8 +18195,6 @@ snapshots: scheduler@0.27.0: {} - seed-random@2.2.0: {} - semver-compare@1.0.0: {} semver@5.7.2: {} @@ -18960,8 +18456,6 @@ snapshots: strict-event-emitter@0.5.1: {} - string-argv@0.3.1: {} - string-env-interpolation@1.0.1: {} string-width@4.2.3: @@ -19189,14 +18683,6 @@ snapshots: glob: 10.5.0 minimatch: 10.2.4 - thenify-all@1.6.0: - dependencies: - thenify: 3.3.1 - - thenify@3.3.1: - dependencies: - any-promise: 1.3.0 - through2@2.0.5: dependencies: readable-stream: 2.3.8 @@ -19204,8 +18690,6 @@ snapshots: timeout-signal@2.0.0: {} - tiny-case@1.0.3: {} - tiny-jsonc@1.0.2: {} tinybench@2.9.0: {} @@ -19238,9 +18722,6 @@ snapshots: tldts-core@7.0.23: {} - tldts-core@7.0.25: - optional: true - tldts@6.1.86: dependencies: tldts-core: 6.1.86 @@ -19249,11 +18730,6 @@ snapshots: dependencies: tldts-core: 7.0.23 - tldts@7.0.25: - dependencies: - tldts-core: 7.0.25 - optional: true - tmp@0.2.5: {} to-regex-range@5.0.1: @@ -19264,8 +18740,6 @@ snapshots: toidentifier@1.0.1: {} - toposort@2.0.2: {} - tough-cookie@5.1.2: dependencies: tldts: 6.1.86 @@ -19274,11 +18748,6 @@ snapshots: dependencies: tldts: 7.0.23 - tough-cookie@6.0.1: - dependencies: - tldts: 7.0.25 - optional: true - tr46@5.1.1: dependencies: punycode: 2.3.1 @@ -19296,8 +18765,6 @@ snapshots: picomatch: 4.0.3 typescript: 5.9.3 - ts-dedent@2.2.0: {} - ts-error@1.0.6: {} ts-log@2.2.7: {} @@ -19463,7 +18930,7 @@ snapshots: dependencies: '@fastify/busboy': 2.1.1 - undici@7.24.0: + undici@7.22.0: optional: true unenv@1.10.0: @@ -19485,8 +18952,6 @@ snapshots: unicode-property-aliases-ecmascript@2.2.0: {} - unicorn-magic@0.4.0: {} - unique-string@2.0.0: dependencies: crypto-random-string: 2.0.0 @@ -19559,8 +19024,6 @@ snapshots: react: 18.3.1 react-dom: 19.2.4(react@18.3.1) - util-arity@1.1.0: {} - util-deprecate@1.0.2: {} utils-merge@1.0.1: {} @@ -19980,8 +19443,6 @@ snapshots: xml-name-validator@5.0.0: {} - xmlbuilder@15.1.1: {} - xmlchars@2.2.0: {} xtend@4.0.2: {} @@ -20027,13 +19488,6 @@ snapshots: yoga-wasm-web@0.3.3: {} - yup@1.7.1: - dependencies: - property-expr: 2.0.6 - tiny-case: 1.0.3 - toposort: 2.0.2 - type-fest: 2.19.0 - zip-stream@4.1.1: dependencies: archiver-utils: 3.0.4 From 17c32663dc52a34b1d4b392773f413efe99db196 Mon Sep 17 00:00:00 2001 From: Ryan Bahan Date: Thu, 12 Mar 2026 12:18:05 -0600 Subject: [PATCH 2/2] Clarify test entry points in testing strategy docs Distinguish between `pnpm test` (Vitest unit tests) and `pnpm test:e2e` (Playwright end-to-end suite) so contributors know how to exercise the full test suite. Co-Authored-By: Claude Opus 4.6 (1M context) --- docs/cli/testing-strategy.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/cli/testing-strategy.md b/docs/cli/testing-strategy.md index 31cbcbe0024..6244f7a2a9a 100644 --- a/docs/cli/testing-strategy.md +++ b/docs/cli/testing-strategy.md @@ -30,7 +30,7 @@ test("loads the app", async () => { }) ``` -Tests can be run with `pnpm test` or `pnpm test:watch` for the entire workspace or individual packages. `test:watch` keeps the process alive and runs tests as files are changed. If you want to run a single test, pass the path to the file as argument: +Tests can be run with `pnpm test` for the Vitest suite, `pnpm test:watch` for watch mode, or `pnpm test:e2e` for the Playwright end-to-end suite. If you want to run a single unit test, pass the path to the file as argument: ``` pnpm test path/to/my.test.ts