diff --git a/.gitignore b/.gitignore index 2ac0d42a147..088120a39a9 100644 --- a/.gitignore +++ b/.gitignore @@ -151,6 +151,9 @@ packages/*/docs/ packaging/dist +# E2E test temp directories and artifacts +.e2e-tmp + # Shadowenv generates user-specific files that shouldn't be committed .shadowenv.d/ diff --git a/package.json b/package.json index 678b840d481..577686594af 100644 --- a/package.json +++ b/package.json @@ -28,6 +28,7 @@ "post-release": "./bin/post-release", "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", @@ -130,7 +131,8 @@ "@graphql-typed-document-node/core" ], "ignoreWorkspaces": [ - "packages/eslint-plugin-cli" + "packages/eslint-plugin-cli", + "packages/e2e" ], "paths": { "@shopify/eslint-plugin-cli/configs": [ diff --git a/packages/e2e/.env.example b/packages/e2e/.env.example new file mode 100644 index 00000000000..5af4efc9c99 --- /dev/null +++ b/packages/e2e/.env.example @@ -0,0 +1,19 @@ +# Required: Client ID of the primary test app (must be in the genghis account's org) +# CI secret: E2E_CLIENT_ID +SHOPIFY_FLAG_CLIENT_ID= + +# Required: Genghis account email for browser-based OAuth login +# CI secret: E2E_ACCOUNT_EMAIL +E2E_ACCOUNT_EMAIL= + +# Required: Genghis account password for browser-based OAuth login +# CI secret: E2E_ACCOUNT_PASSWORD +E2E_ACCOUNT_PASSWORD= + +# Required: Dev store FQDN for dev server / deploy tests (e.g. my-store.myshopify.com) +# CI secret: E2E_STORE_FQDN +E2E_STORE_FQDN= + +# Optional: Client ID of a secondary app for config link tests +# CI secret: E2E_SECONDARY_CLIENT_ID +E2E_SECONDARY_CLIENT_ID= diff --git a/packages/e2e/.gitignore b/packages/e2e/.gitignore new file mode 100644 index 00000000000..502ee2939d8 --- /dev/null +++ b/packages/e2e/.gitignore @@ -0,0 +1,6 @@ +node_modules/ +test-results/ +playwright-report/ +dist/ +.env +.env.local diff --git a/packages/e2e/helpers/strip-ansi.ts b/packages/e2e/helpers/strip-ansi.ts new file mode 100644 index 00000000000..ae420938418 --- /dev/null +++ b/packages/e2e/helpers/strip-ansi.ts @@ -0,0 +1,5 @@ +// Re-export strip-ansi as a named export for easier use. +// strip-ansi v7+ is ESM-only and exports a default function. +import stripAnsiModule from 'strip-ansi' + +export const stripAnsi: (text: string) => string = stripAnsiModule diff --git a/packages/e2e/package.json b/packages/e2e/package.json new file mode 100644 index 00000000000..ff126b8d52f --- /dev/null +++ b/packages/e2e/package.json @@ -0,0 +1,39 @@ +{ + "name": "@shopify/e2e", + "version": "0.1.0", + "packageManager": "pnpm@10.11.1", + "private": true, + "type": "module", + "scripts": { + "test": "nx run e2e:test", + "lint": "nx lint", + "lint:fix": "nx lint:fix", + "type-check": "nx type-check" + }, + "eslintConfig": { + "extends": [ + "../../.eslintrc.cjs" + ], + "rules": { + "no-console": "off", + "import/extensions": [ + "error", + "never", + { + "ignorePackages": true + } + ] + } + }, + "devDependencies": { + "@playwright/test": "^1.50.0", + "@types/node": "18.19.70", + "execa": "^7.2.0", + "node-pty": "^1.0.0", + "strip-ansi": "^7.1.0", + "tempy": "^1.0.1" + }, + "engines": { + "node": ">=20.10.0" + } +} diff --git a/packages/e2e/playwright.config.ts b/packages/e2e/playwright.config.ts new file mode 100644 index 00000000000..f2260472c55 --- /dev/null +++ b/packages/e2e/playwright.config.ts @@ -0,0 +1,42 @@ +/* eslint-disable line-comment-position */ +/* eslint-disable no-restricted-imports */ +import {defineConfig} from '@playwright/test' +import * as fs from 'fs' +import * as path from 'path' +import {fileURLToPath} from 'url' + +const __dirname = path.dirname(fileURLToPath(import.meta.url)) + +// Load .env file if present (CI provides env vars directly) +const envPath = path.join(__dirname, '.env') +if (fs.existsSync(envPath)) { + for (const line of fs.readFileSync(envPath, 'utf-8').split('\n')) { + const trimmed = line.trim() + if (!trimmed || trimmed.startsWith('#')) continue + const eqIdx = trimmed.indexOf('=') + if (eqIdx === -1) continue + const key = trimmed.slice(0, eqIdx).trim() + const value = trimmed.slice(eqIdx + 1).trim() + process.env[key] ??= value + } +} + +const isCI = Boolean(process.env.CI) + +export default defineConfig({ + testDir: './tests', + fullyParallel: false, + forbidOnly: isCI, + retries: 0, + workers: 1, + maxFailures: isCI ? 3 : 0, // Stop early in CI after 3 failures + reporter: isCI ? [['html', {open: 'never'}], ['list']] : [['list']], + timeout: 3 * 60 * 1000, // 3 minutes per test + globalTimeout: 15 * 60 * 1000, // 15 minutes total + + use: { + trace: isCI ? 'on' : 'off', + screenshot: isCI ? 'on' : 'off', + video: 'off', + }, +}) diff --git a/packages/e2e/project.json b/packages/e2e/project.json new file mode 100644 index 00000000000..d8ec4c24fe6 --- /dev/null +++ b/packages/e2e/project.json @@ -0,0 +1,39 @@ +{ + "name": "e2e", + "$schema": "../../node_modules/nx/schemas/project-schema.json", + "sourceRoot": "packages/e2e", + "projectType": "library", + "implicitDependencies": ["cli", "create-app"], + "tags": ["scope:e2e"], + "targets": { + "test": { + "executor": "nx:run-commands", + "dependsOn": ["^build"], + "options": { + "command": "pnpm playwright test", + "cwd": "packages/e2e" + } + }, + "lint": { + "executor": "nx:run-commands", + "options": { + "command": "pnpm eslint \"**/*.ts\"", + "cwd": "packages/e2e" + } + }, + "lint:fix": { + "executor": "nx:run-commands", + "options": { + "command": "pnpm eslint '**/*.ts' --fix", + "cwd": "packages/e2e" + } + }, + "type-check": { + "executor": "nx:run-commands", + "options": { + "command": "pnpm tsc --noEmit", + "cwd": "packages/e2e" + } + } + } +} diff --git a/packages/e2e/setup/cli.ts b/packages/e2e/setup/cli.ts new file mode 100644 index 00000000000..1f39f38ca68 --- /dev/null +++ b/packages/e2e/setup/cli.ts @@ -0,0 +1,242 @@ +/* eslint-disable no-console */ +import {envFixture, executables} from './env.js' +import {stripAnsi} from '../helpers/strip-ansi.js' +import {execa, type Options as ExecaOptions} from 'execa' +import type {E2EEnv} from './env.js' +import type * as pty from 'node-pty' + +export interface ExecResult { + stdout: string + stderr: string + exitCode: number +} + +export interface SpawnedProcess { + /** Wait for a string to appear in the PTY output */ + waitForOutput(text: string, timeoutMs?: number): Promise + /** Send a single key to the PTY */ + sendKey(key: string): void + /** Send a line of text followed by Enter */ + sendLine(line: string): void + /** Wait for the process to exit */ + waitForExit(timeoutMs?: number): Promise + /** Kill the process */ + kill(): void + /** Get all output captured so far (ANSI stripped) */ + getOutput(): string + /** The underlying node-pty process */ + readonly ptyProcess: pty.IPty +} + +export interface CLIProcess { + /** Execute a CLI command non-interactively via execa */ + exec(args: string[], opts?: {cwd?: string; env?: NodeJS.ProcessEnv; timeout?: number}): Promise + /** Execute the create-app binary non-interactively via execa */ + execCreateApp(args: string[], opts?: {cwd?: string; env?: NodeJS.ProcessEnv; timeout?: number}): Promise + /** Spawn an interactive CLI command via node-pty */ + spawn(args: string[], opts?: {cwd?: string; env?: NodeJS.ProcessEnv}): Promise +} + +/** + * Test-scoped fixture providing CLI process management. + * Tracks all spawned processes and kills them in teardown. + */ +export const cliFixture = envFixture.extend<{cli: CLIProcess}>({ + cli: async ({env}, use) => { + const spawnedProcesses: SpawnedProcess[] = [] + + const cli: CLIProcess = { + async exec(args, opts = {}) { + // 3 min default + const timeout = opts.timeout ?? 3 * 60 * 1000 + const execaOpts: ExecaOptions = { + cwd: opts.cwd, + env: {...env.processEnv, ...opts.env}, + timeout, + reject: false, + } + + if (process.env.DEBUG === '1') { + console.log(`[e2e] exec: node ${executables.cli} ${args.join(' ')}`) + } + + const result = await execa('node', [executables.cli, ...args], execaOpts) + + return { + stdout: result.stdout ?? '', + stderr: result.stderr ?? '', + exitCode: result.exitCode ?? 1, + } + }, + + async execCreateApp(args, opts = {}) { + // 5 min default for scaffolding + const timeout = opts.timeout ?? 5 * 60 * 1000 + const execaOpts: ExecaOptions = { + cwd: opts.cwd, + env: {...env.processEnv, ...opts.env}, + timeout, + reject: false, + } + + if (process.env.DEBUG === '1') { + console.log(`[e2e] exec: node ${executables.createApp} ${args.join(' ')}`) + } + + const result = await execa('node', [executables.createApp, ...args], execaOpts) + + return { + stdout: result.stdout ?? '', + stderr: result.stderr ?? '', + exitCode: result.exitCode ?? 1, + } + }, + + async spawn(args, opts = {}) { + // Dynamic import to avoid requiring node-pty for Phase 1 tests + const nodePty = await import('node-pty') + + const spawnEnv: {[key: string]: string} = {} + for (const [key, value] of Object.entries({...env.processEnv, ...opts.env})) { + if (value !== undefined) { + spawnEnv[key] = value + } + } + + if (process.env.DEBUG === '1') { + console.log(`[e2e] spawn: node ${executables.cli} ${args.join(' ')}`) + } + + const ptyProcess = nodePty.spawn('node', [executables.cli, ...args], { + name: 'xterm-color', + cols: 120, + rows: 30, + cwd: opts.cwd, + env: spawnEnv, + }) + + let output = '' + const outputWaiters: {text: string; resolve: () => void; reject: (err: Error) => void}[] = [] + + ptyProcess.onData((data: string) => { + output += data + if (process.env.DEBUG === '1') { + process.stdout.write(data) + } + + // Check if any waiters are satisfied (check both raw and stripped output) + const stripped = stripAnsi(output) + for (let idx = outputWaiters.length - 1; idx >= 0; idx--) { + const waiter = outputWaiters[idx] + if (waiter && (stripped.includes(waiter.text) || output.includes(waiter.text))) { + waiter.resolve() + outputWaiters.splice(idx, 1) + } + } + }) + + let exitCode: number | undefined + let exitResolve: ((code: number) => void) | undefined + + ptyProcess.onExit(({exitCode: code}) => { + exitCode = code + if (exitResolve) { + exitResolve(code) + } + // Reject any remaining output waiters + for (const waiter of outputWaiters) { + waiter.reject(new Error(`Process exited (code ${code}) while waiting for output: "${waiter.text}"`)) + } + outputWaiters.length = 0 + }) + + const spawned: SpawnedProcess = { + ptyProcess, + + waitForOutput(text: string, timeoutMs = 3 * 60 * 1000) { + // Check if already in output (raw or stripped) + if (stripAnsi(output).includes(text) || output.includes(text)) { + return Promise.resolve() + } + + return new Promise((resolve, reject) => { + const timer = setTimeout(() => { + const waiterIdx = outputWaiters.findIndex((waiter) => waiter.text === text) + if (waiterIdx >= 0) outputWaiters.splice(waiterIdx, 1) + reject( + new Error( + `Timed out after ${timeoutMs}ms waiting for output: "${text}"\n\nCaptured output:\n${stripAnsi( + output, + )}`, + ), + ) + }, timeoutMs) + + outputWaiters.push({ + text, + resolve: () => { + clearTimeout(timer) + resolve() + }, + reject: (err) => { + clearTimeout(timer) + reject(err) + }, + }) + }) + }, + + sendKey(key: string) { + ptyProcess.write(key) + }, + + sendLine(line: string) { + ptyProcess.write(`${line}\r`) + }, + + waitForExit(timeoutMs = 60 * 1000) { + if (exitCode !== undefined) { + return Promise.resolve(exitCode) + } + + return new Promise((resolve, reject) => { + const timer = setTimeout(() => { + reject(new Error(`Timed out after ${timeoutMs}ms waiting for process exit`)) + }, timeoutMs) + + exitResolve = (code) => { + clearTimeout(timer) + resolve(code) + } + }) + }, + + kill() { + try { + ptyProcess.kill() + // eslint-disable-next-line no-catch-all/no-catch-all + } catch (_error) { + // Process may already be dead + } + }, + + getOutput() { + return stripAnsi(output) + }, + } + + spawnedProcesses.push(spawned) + return spawned + }, + } + + await use(cli) + + // Teardown: kill all spawned processes + for (const proc of spawnedProcesses) { + proc.kill() + } + }, +}) + +export {type E2EEnv} diff --git a/packages/e2e/setup/env.ts b/packages/e2e/setup/env.ts new file mode 100644 index 00000000000..36e8d8e6c77 --- /dev/null +++ b/packages/e2e/setup/env.ts @@ -0,0 +1,138 @@ +/* eslint-disable no-restricted-imports */ +import {test as base} from '@playwright/test' +import * as path from 'path' +import * as fs from 'fs' +import {fileURLToPath} from 'url' + +const __filename = fileURLToPath(import.meta.url) +const __dirname = path.dirname(__filename) + +export interface E2EEnv { + /** Partners token for API auth (empty string if not set) */ + partnersToken: string + /** Primary test app client ID (empty string if not set) */ + clientId: string + /** Dev store FQDN (e.g. cli-e2e-test.myshopify.com) */ + storeFqdn: string + /** Secondary app client ID for config link tests */ + secondaryClientId: string + /** Environment variables to pass to CLI processes */ + processEnv: NodeJS.ProcessEnv + /** Temporary directory root for this worker */ + tempDir: string +} + +export const directories = { + root: path.resolve(__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'), +} + +/** + * Creates an isolated temporary directory with XDG subdirectories and .npmrc. + * Returns the temp directory path and the env vars to pass to child processes. + */ +export function createIsolatedEnv(baseDir: string): {tempDir: string; xdgEnv: {[key: string]: string}} { + const tempDir = fs.mkdtempSync(path.join(baseDir, 'e2e-')) + + const xdgDirs = { + XDG_DATA_HOME: path.join(tempDir, 'XDG_DATA_HOME'), + XDG_CONFIG_HOME: path.join(tempDir, 'XDG_CONFIG_HOME'), + XDG_STATE_HOME: path.join(tempDir, 'XDG_STATE_HOME'), + XDG_CACHE_HOME: path.join(tempDir, 'XDG_CACHE_HOME'), + } + + for (const dir of Object.values(xdgDirs)) { + fs.mkdirSync(dir, {recursive: true}) + } + + // Write .npmrc to ensure package resolution works in CI + fs.writeFileSync(path.join(tempDir, '.npmrc'), '//registry.npmjs.org/') + + return {tempDir, xdgEnv: xdgDirs} +} + +/** + * Asserts that a required environment variable is set. + * Call this at the top of tests that need auth. + */ +export function requireEnv( + env: E2EEnv, + ...keys: (keyof Pick)[] +): void { + for (const key of keys) { + if (!env[key]) { + const envVarNames: {[key: string]: string} = { + partnersToken: 'SHOPIFY_CLI_PARTNERS_TOKEN', + clientId: 'SHOPIFY_FLAG_CLIENT_ID', + storeFqdn: 'E2E_STORE_FQDN', + secondaryClientId: 'E2E_SECONDARY_CLIENT_ID', + } + throw new Error(`${envVarNames[key]} environment variable is required for this test`) + } + } +} + +/** + * Worker-scoped fixture providing auth tokens and environment configuration. + * Auth tokens are optional — tests that need them should call requireEnv(). + */ +// eslint-disable-next-line @typescript-eslint/no-empty-object-type +export const envFixture = base.extend<{}, {env: E2EEnv}>({ + env: [ + // eslint-disable-next-line no-empty-pattern + async ({}, use) => { + const partnersToken = process.env.SHOPIFY_CLI_PARTNERS_TOKEN ?? '' + const clientId = process.env.SHOPIFY_FLAG_CLIENT_ID ?? '' + const storeFqdn = process.env.E2E_STORE_FQDN ?? '' + const secondaryClientId = process.env.E2E_SECONDARY_CLIENT_ID ?? '' + + const tmpBase = process.env.E2E_TEMP_DIR ?? path.join(directories.root, '.e2e-tmp') + fs.mkdirSync(tmpBase, {recursive: true}) + + const {tempDir, xdgEnv} = createIsolatedEnv(tmpBase) + + const processEnv: NodeJS.ProcessEnv = { + ...process.env, + ...xdgEnv, + SHOPIFY_RUN_AS_USER: '0', + NODE_OPTIONS: '', + // Prevent interactive prompts + CI: '1', + } + + if (partnersToken) { + processEnv.SHOPIFY_CLI_PARTNERS_TOKEN = partnersToken + } + if (clientId) { + processEnv.SHOPIFY_FLAG_CLIENT_ID = clientId + } + if (storeFqdn) { + processEnv.SHOPIFY_FLAG_STORE = storeFqdn + } + + const env: E2EEnv = { + partnersToken, + clientId, + storeFqdn, + secondaryClientId, + processEnv, + tempDir, + } + + await use(env) + + // Cleanup: remove temp directory + fs.rmSync(tempDir, {recursive: true, force: true}) + }, + {scope: 'worker'}, + ], +}) diff --git a/packages/e2e/tests/smoke-pty.spec.ts b/packages/e2e/tests/smoke-pty.spec.ts new file mode 100644 index 00000000000..3a9f28676f3 --- /dev/null +++ b/packages/e2e/tests/smoke-pty.spec.ts @@ -0,0 +1,12 @@ +import {cliFixture as test} from '../setup/cli.js' +import {expect} from '@playwright/test' + +test.describe('PTY smoke test', () => { + test('shopify version runs via PTY', async ({cli}) => { + const proc = await cli.spawn(['version']) + await proc.waitForOutput('3.') + const code = await proc.waitForExit() + expect(code).toBe(0) + expect(proc.getOutput()).toMatch(/\d+\.\d+\.\d+/) + }) +}) diff --git a/packages/e2e/tests/smoke.spec.ts b/packages/e2e/tests/smoke.spec.ts new file mode 100644 index 00000000000..b64d20520d5 --- /dev/null +++ b/packages/e2e/tests/smoke.spec.ts @@ -0,0 +1,10 @@ +import {cliFixture as test} from '../setup/cli.js' +import {expect} from '@playwright/test' + +test.describe('Smoke test', () => { + test('shopify version runs successfully', async ({cli}) => { + const result = await cli.exec(['version']) + expect(result.exitCode).toBe(0) + expect(result.stdout).toMatch(/\d+\.\d+\.\d+/) + }) +}) diff --git a/packages/e2e/tsconfig.json b/packages/e2e/tsconfig.json new file mode 100644 index 00000000000..d87e9d3dea2 --- /dev/null +++ b/packages/e2e/tsconfig.json @@ -0,0 +1,11 @@ +{ + "extends": "../../configurations/tsconfig.json", + "include": ["./**/*.ts"], + "exclude": ["./dist", "./test-results", "./playwright-report", "./scripts"], + "compilerOptions": { + "outDir": "dist", + "composite": false, + "declaration": false, + "types": ["node"] + } +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index ef3fd03f6e4..7b4f7d67149 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -576,6 +576,27 @@ importers: specifier: ^2.1.1 version: 2.1.1(esbuild@0.27.3) + packages/e2e: + devDependencies: + '@playwright/test': + specifier: ^1.50.0 + version: 1.58.2 + '@types/node': + specifier: 18.19.70 + version: 18.19.70 + execa: + specifier: ^7.2.0 + version: 7.2.0 + node-pty: + specifier: ^1.0.0 + version: 1.1.0 + strip-ansi: + specifier: ^7.1.0 + version: 7.1.0 + tempy: + specifier: ^1.0.1 + version: 1.0.1 + packages/eslint-plugin-cli: dependencies: '@babel/core': @@ -1985,8 +2006,8 @@ packages: resolution: {integrity: sha512-KfoGlYD/XXQSc3BkM1/k15+JQbkQ4ateHazeZoWl9P71FsLTDXSjGy6j7QqfhpIDSbxNISqhPMfZHYSbDFOofQ==} engines: {node: '>=18.0.0'} - '@envelop/core@5.5.1': - resolution: {integrity: sha512-3DQg8sFskDo386TkL5j12jyRAdip/8yzK3x7YGbZBgobZ4aKXrvDU0GppU0SnmrpQnNaiTUsxBs9LKkwQ/eyvw==} + '@envelop/core@5.5.0': + resolution: {integrity: sha512-nsU1EyJQAStaKHR1ZkB/ug9XBm+WPTliYtdedbJ/L1ykrp7dbbn0srqBeDnZ2mbZVp4hH3d0Fy+Og9OgPWZx+g==} engines: {node: '>=18.0.0'} '@envelop/instrumentation@1.0.0': @@ -2698,8 +2719,8 @@ packages: peerDependencies: graphql: 16.10.0 - '@graphql-tools/graphql-file-loader@8.1.12': - resolution: {integrity: sha512-Nma7gBgJoUbqXWTmdHjouo36tjzewA8MptVcHoH7widzkciaUVzBhriHzqICFB/dVxig//g9MX8s1XawZo7UAg==} + '@graphql-tools/graphql-file-loader@8.1.9': + resolution: {integrity: sha512-rkLK46Q62Zxift8B6Kfw6h8SH3pCR3DPCfNeC/lpLwYReezZz+2ARuLDFZjQGjW+4lpMwiAw8CIxDyQAUgqU6A==} engines: {node: '>=16.0.0'} peerDependencies: graphql: 16.10.0 @@ -2722,8 +2743,8 @@ packages: peerDependencies: graphql: 16.10.0 - '@graphql-tools/import@7.1.12': - resolution: {integrity: sha512-QSsdPsdJ7yCgQ5XODyKYpC7NlB9R1Koi0R3418PT7GiRm+9O8gYXSs/23dumcOnpiLrnf4qR2aytBn1+JOAhnA==} + '@graphql-tools/import@7.1.9': + resolution: {integrity: sha512-mHzOgyfzsAgstaZPIFEtKg4GVH4FbDHeHYrSs73mAPKS5F59/FlRuUJhAoRnxbVnc3qIZ6EsWBjOjNbnPK8viA==} engines: {node: '>=16.0.0'} peerDependencies: graphql: 16.10.0 @@ -3151,6 +3172,14 @@ packages: '@types/node': optional: true + '@isaacs/balanced-match@4.0.1': + resolution: {integrity: sha512-yzMTt9lEb8Gv7zRioUilSglI0c0smZ9k5D65677DLWLtWJaXIS3CqcGyUFByYKlnUj6TkjLVs54fBl6+TiGQDQ==} + engines: {node: 20 || >=22} + + '@isaacs/brace-expansion@5.0.0': + resolution: {integrity: sha512-ZT55BDLV0yv0RBm2czMiZ+SqCGO7AvmOM3G/w2xhVPH+te0aKgFjmBvGlL1dH+ql2tgGO3MVrbb3jCKyvpgnxA==} + engines: {node: 20 || >=22} + '@isaacs/cliui@8.0.2': resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} engines: {node: '>=12'} @@ -3159,8 +3188,8 @@ packages: resolution: {integrity: sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==} engines: {node: '>=8'} - '@jest/diff-sequences@30.3.0': - resolution: {integrity: sha512-cG51MVnLq1ecVUaQ3fr6YuuAOitHK1S4WUJHnsPFE/quQr33ADUx1FfrTCpMCRxvy0Yr9BThKpDjSlcTi91tMA==} + '@jest/diff-sequences@30.0.1': + resolution: {integrity: sha512-n5H8QLDJ47QqbCNn5SuFjCRDrOLEZ0h8vAHCK5RL9Ls7Xa8AQLa/YxAc9UjFqoEDM48muwtBGjtMY5cr0PLDCw==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} '@jest/get-type@30.1.0': @@ -3744,6 +3773,11 @@ packages: resolution: {integrity: sha512-QNqXyfVS2wm9hweSYD2O7F0G06uurj9kZ96TRQE5Y9hU7+tgdZwIkbAKc5Ocy1HxEY2kuDQa6cQ1WRs/O5LFKA==} engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} + '@playwright/test@1.58.2': + resolution: {integrity: sha512-akea+6bHYBBfA9uQqSYmlJXn61cTa+jbO87xVLCWbTqbWadRVmhxlXATaOjOgcBaWU4ePo0wB41KMFv3o35IXA==} + engines: {node: '>=18'} + hasBin: true + '@pnpm/config.env-replace@1.1.0': resolution: {integrity: sha512-htyl8TWnKL7K/ESFa1oW2UB5lVDxuF5DpM7tBi6Hu2LNL3mWkIzNLG6N4zoCUP1lCKNxWy/3iu8mS8MvToGd6w==} engines: {node: '>=12.22.0'} @@ -4311,6 +4345,12 @@ packages: resolution: {integrity: sha512-ID7fosbc50TbT0MK0EG12O+gAP3W3Aa/Pz4DaTtQtEvlc9Odaqi0de+xuZ7Li2GtK4HzEX7IuRWS/JmZLksR3Q==} engines: {node: '>=14'} + '@theguild/federation-composition@0.21.3': + resolution: {integrity: sha512-+LlHTa4UbRpZBog3ggAxjYIFvdfH3UMvvBUptur19TMWkqU4+n3GmN+mDjejU+dyBXIG27c25RsiQP1HyvM99g==} + engines: {node: '>=18'} + peerDependencies: + graphql: 16.10.0 + '@tootallnate/once@2.0.0': resolution: {integrity: sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==} engines: {node: '>= 10'} @@ -4908,10 +4948,6 @@ packages: resolution: {integrity: sha512-4nJ3yixlEthEJ9Rk4vPcdBRkZvQZlYyu8j4/Mqz5sgIkddmEnH2Yj2ZrnP9S3tQOvSNRUIgVNF/1yPpRAGNRig==} engines: {node: '>=14.16'} - ansi-escapes@7.1.1: - resolution: {integrity: sha512-Zhl0ErHcSRUaVfGUeUdDuLgpkEo8KIFjB4Y9uAc46ScOpdDiU1Dbyplh7qWJeJ/ZHpbyMSM26+X3BySgnIz40Q==} - engines: {node: '>=18'} - ansi-escapes@7.2.0: resolution: {integrity: sha512-g6LhBsl+GBPRWGWsBtutpzBYuIIdBkLEvad5C/va/74Db018+5TZiyA26cZJAr3Rft5lprVqOIPxf5Vid6tqAw==} engines: {node: '>=18'} @@ -5094,8 +5130,8 @@ packages: resolution: {integrity: sha512-Xm7bpRXnDSX2YE2YFfBk2FnF0ep6tmG7xPh8iHee8MIcrgq762Nkce856dYtJYLkuIoYZvGfTs/PbZhideTcEg==} engines: {node: '>=4'} - axios@1.13.6: - resolution: {integrity: sha512-ChTCHMouEe2kn713WHbQGcuYrr6fXTBiu460OTwWrWob16g1bXn4vtz07Ope7ewMozJAnEquLk5lWQWtBig9DQ==} + axios@1.13.4: + resolution: {integrity: sha512-1wVkUaAO6WyaYtCkcYCOx12ZgpGf9Zif+qXa4n+oYzK558YryKqiL6UWwd5DqiH3VRW0GYhTZQ/vlgJrCoNQlg==} axobject-query@4.1.0: resolution: {integrity: sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==} @@ -5313,10 +5349,6 @@ packages: resolution: {integrity: sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w==} engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} - chalk@5.6.2: - resolution: {integrity: sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==} - engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} - change-case-all@1.0.15: resolution: {integrity: sha512-3+GIFhk3sNuvFAJKU46o26OdzudQlPNBCu1ZQi3cMeMHhty1bhDxu2WrEilVNYaGvqUtR1VSigFcJOiS13dRhQ==} @@ -5942,8 +5974,8 @@ packages: end-of-stream@1.4.5: resolution: {integrity: sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==} - enhanced-resolve@5.20.0: - resolution: {integrity: sha512-/ce7+jQ1PQ6rVXwe+jKEg5hW5ciicHwIQUagZkp6IufBoY3YDgdTTY1azVs0qoRgVmvsNB+rbjLJxDAeHHtwsQ==} + enhanced-resolve@5.19.0: + resolution: {integrity: sha512-phv3E1Xl4tQOShqSte26C7Fl84EwUdZsyOuSSk9qtAGyyQs2s3jJzComh+Abf4g187lUUAvH+H26omrqia2aGg==} engines: {node: '>=10.13.0'} enquirer@2.3.6: @@ -5984,10 +6016,6 @@ packages: resolution: {integrity: sha512-WSzPgsdLtTcQwm4CROfS5ju2Wa1QQcVeT37jFjYzdFz1r9ahadC8B8/a4qxJxM+09F18iumCdRmlr96ZYkQvEg==} engines: {node: '>= 0.4'} - es-abstract@1.24.1: - resolution: {integrity: sha512-zHXBLhP+QehSSbsS9Pt23Gg964240DPd6QCf8WpkqEXxQ7fhdZzYsocOr5u7apWonsS5EjZDmTF+/slGMyasvw==} - engines: {node: '>= 0.4'} - es-define-property@1.0.1: resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==} engines: {node: '>= 0.4'} @@ -6132,27 +6160,6 @@ packages: eslint-import-resolver-webpack: optional: true - eslint-module-utils@2.12.1: - resolution: {integrity: sha512-L8jSWTze7K2mTg0vos/RuLRS5soomksDPoJLXIslC7c8Wmut3bx7CPpJijDcBZtxQ5lrbUdM+s0OlNbz0DCDNw==} - engines: {node: '>=4'} - peerDependencies: - '@typescript-eslint/parser': '*' - eslint: '*' - eslint-import-resolver-node: '*' - eslint-import-resolver-typescript: '*' - eslint-import-resolver-webpack: '*' - peerDependenciesMeta: - '@typescript-eslint/parser': - optional: true - eslint: - optional: true - eslint-import-resolver-node: - optional: true - eslint-import-resolver-typescript: - optional: true - eslint-import-resolver-webpack: - optional: true - eslint-plugin-es-x@7.8.0: resolution: {integrity: sha512-7Ds8+wAAoV3T+LAKeu39Y5BzXCrGKrcISfgKEqTS4BDN8SFEDQd0S43jiQ8vIa3wUKD07qitZdfzlenSi8/0qQ==} engines: {node: ^14.18.0 || >=16.0.0} @@ -6401,8 +6408,8 @@ packages: fast-safe-stringify@1.2.3: resolution: {integrity: sha512-QJYT/i0QYoiZBQ71ivxdyTqkwKkQ0oxACXHYxH2zYHJEgzi2LsbjgvtzTbLi1SZcF190Db2YP7I7eTsU2egOlw==} - fast-uri@3.1.0: - resolution: {integrity: sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA==} + fast-uri@3.0.6: + resolution: {integrity: sha512-Atfo14OibSv5wAp4VWNsFYE1AchQRTv9cBGWET4pZWHzYshFSS9NQI6I57rdKn9croWVMbYFbLhJ+yJvmZIIHw==} fast-xml-parser@5.3.6: resolution: {integrity: sha512-QNI3sAvSvaOiaMl8FYU4trnEzCwiRr8XMWgAHzlrWpTSj+QaCSvOf1h82OEP1s4hiAXhnbXSyFWCf4ldZzZRVA==} @@ -6452,8 +6459,8 @@ packages: resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==} engines: {node: '>=16.0.0'} - filelist@1.0.6: - resolution: {integrity: sha512-5giy2PkLYY1cP39p17Ech+2xlpTRL9HLspOfEgm0L6CwBXBTgsK5ou0JtzYuepxkaQ/tvhCFIJ5uXo0OrM2DxA==} + filelist@1.0.4: + resolution: {integrity: sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==} fill-range@7.1.1: resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} @@ -6536,10 +6543,6 @@ packages: resolution: {integrity: sha512-KrGhL9Q4zjj0kiUt5OO4Mr/A/jlI2jDYs5eHBpYHPcBEVSiipAvn2Ko2HnPe20rmcuuvMHNdZFp+4IlGTMF0Ow==} engines: {node: '>= 6'} - form-data@4.0.5: - resolution: {integrity: sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==} - engines: {node: '>= 6'} - formatly@0.2.4: resolution: {integrity: sha512-lIN7GpcvX/l/i24r/L9bnJ0I8Qn01qijWpQpDDvTLL29nKqSaJJu4h20+7VJ6m2CAhQ2/En/GbxDiHCzq/0MyA==} engines: {node: '>=18.3.0'} @@ -6586,6 +6589,11 @@ packages: fs.realpath@1.0.0: resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} + fsevents@2.3.2: + resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + fsevents@2.3.3: resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} @@ -6613,10 +6621,6 @@ packages: resolution: {integrity: sha512-QZjmEOC+IT1uk6Rx0sX22V6uHWVwbdbxf1faPqJ1QhLdGgsRGCZoyaQBm/piRdJy/D2um6hM1UP7ZEeQ4EkP+Q==} engines: {node: '>=18'} - get-east-asian-width@1.5.0: - resolution: {integrity: sha512-CQ+bEO+Tva/qlmw24dCejulK5pMzVnUOFOijVogd3KQs07HnRIgp8TGipvCCRT06xeYEbpbgwaCxglFyiuIcmA==} - engines: {node: '>=18'} - get-intrinsic@1.3.0: resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==} engines: {node: '>= 0.4'} @@ -7373,8 +7377,8 @@ packages: resolution: {integrity: sha512-6m+9Z3Gv9wN0WFVasqjCL/06+EFCMTqDEUl/b87HYK2rAPTyfz4ZIuSlPhY51PIQRWx5TaxeF1qmXKe9gfN3sA==} engines: {node: '>= 10.14.2'} - jest-diff@30.3.0: - resolution: {integrity: sha512-n3q4PDQjS4LrKxfWB3Z5KNk1XjXtZTBwQp71OP0Jo03Z6V60x++K5L8k6ZrW8MY8pOFylZvHM0zsjS1RqlHJZQ==} + jest-diff@30.2.0: + resolution: {integrity: sha512-dQHFo3Pt4/NLlG5z4PxZ/3yZTZ1C7s9hveiOj+GCN+uT109NC2QgsoVZsVOAvbJ3RgKkvyLGXZV9+piDpWbm6A==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} jest-get-type@26.3.0: @@ -7810,6 +7814,10 @@ packages: resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==} engines: {node: '>=4'} + minimatch@10.1.1: + resolution: {integrity: sha512-enIvLvRAFZYXJzkCYG5RKmPfrFArdLv+R+lbQ53BmIMLIry74bjKzX6iHAm8WYamJkhSSEabrWN5D97XnKObjQ==} + engines: {node: 20 || >=22} + minimatch@10.2.4: resolution: {integrity: sha512-oRjTw/97aTBN0RHbYCdtF1MQfvusSIBQM0IZEgzl6426+8jSC0nF1a/GmnVLpfB9yyr6g6FTqWqiZVbxrtaCIg==} engines: {node: 18 || 20 || >=22} @@ -7820,12 +7828,12 @@ packages: minimatch@3.1.5: resolution: {integrity: sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==} - minimatch@5.1.9: - resolution: {integrity: sha512-7o1wEA2RyMP7Iu7GNba9vc0RWWGACJOCZBJX2GJWip0ikV+wcOsgVuY9uE8CPiyQhkGFSlhuSkZPavN7u1c2Fw==} + minimatch@5.1.6: + resolution: {integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==} engines: {node: '>=10'} - minimatch@7.4.9: - resolution: {integrity: sha512-Brg/fp/iAVDOQoHxkuN5bEYhyQlZhxddI78yWsCbeEwTHXQjlNLtiJDUsp1GIptVqMI7/gkJMz4vVAc01mpoBw==} + minimatch@7.4.6: + resolution: {integrity: sha512-sBz8G/YjVniEz6lKPNpKxXwazJe4c19fEfV2GDMX6AjFz+MX9uDWIZW8XreVhkFW3fkIdTv/gxWr/Kks5FFAVw==} engines: {node: '>=10'} minimatch@9.0.3: @@ -7840,10 +7848,6 @@ packages: resolution: {integrity: sha512-kQAVowdR33euIqeA0+VZTDqU+qo1IeVY+hrKYtZMio3Pg0P0vuh/kwRylLUddJhB6pf3q/botcOvRtx4IN1wqQ==} engines: {node: '>=16 || 14 >=14.17'} - minimatch@9.0.9: - resolution: {integrity: sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==} - engines: {node: '>=16 || 14 >=14.17'} - minimist-options@4.1.0: resolution: {integrity: sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==} engines: {node: '>= 6'} @@ -7977,6 +7981,9 @@ packages: node-machine-id@1.1.12: resolution: {integrity: sha512-QNABxbrPa3qEIfrE6GOJ7BYIuignnJw7iQ2YPbc3Nla1HzRJjXzZOiikfF8m7eAMfichLt3M4VgLOetqgDmgGQ==} + node-pty@1.1.0: + resolution: {integrity: sha512-20JqtutY6JPXTUnL0ij1uad7Qe1baT46lyolh2sSENDd4sTzKZ4nmAFkeAARDKwmlLjPx6XKRlwRUxwjOy+lUg==} + node-releases@2.0.21: resolution: {integrity: sha512-5b0pgg78U3hwXkCM8Z9b2FJdPZlr9Psr9V2gQPESdGHqbntyFJKFW4r5TeWGFzafGY3hzs1JC62VEQMbl1JFkw==} @@ -8438,6 +8445,16 @@ packages: resolution: {integrity: sha512-NPE8TDbzl/3YQYY7CSS228s3g2ollTFnc+Qi3tqmqJp9Vg2ovUpixcJEo2HJScN2Ez+kEaal6y70c0ehqJBJeA==} engines: {node: '>=10'} + playwright-core@1.58.2: + resolution: {integrity: sha512-yZkEtftgwS8CsfYo7nm0KE8jsvm6i/PTgVtB8DL726wNf6H2IMsDuxCpJj59KDaxCtSnrWan2AeDqM7JBaultg==} + engines: {node: '>=18'} + hasBin: true + + playwright@1.58.2: + resolution: {integrity: sha512-vA30H8Nvkq/cPBnNw4Q8TWz1EJyqgpuinBcHET0YVJVFldr8JDNiU9LaWAE1KqSkRYazuaBhTpB5ZzShOezQ6A==} + engines: {node: '>=18'} + hasBin: true + pluralize@8.0.0: resolution: {integrity: sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==} engines: {node: '>=4'} @@ -8472,8 +8489,8 @@ packages: resolution: {integrity: sha512-7AeGuCYNGmycyQbCqd/3PWH4eOoX/OiCa0uphp57NVTeAGdJGaAliecxwBDHYQCIvrW7aDBZCYeNTP/WX69mkg==} engines: {node: '>= 10'} - pretty-format@30.3.0: - resolution: {integrity: sha512-oG4T3wCbfeuvljnyAzhBvpN45E8iOTXCU/TD3zXW80HA3dQ4ahdqMkWGiPWZvjpQwlbyHrPTWUAqUzGzv4l1JQ==} + pretty-format@30.2.0: + resolution: {integrity: sha512-9uBdv/B4EefsuAL+pWqueZyZS2Ba+LxfFeQ9DN14HU4bN8bhaxKdkpjpB6fs9+pSjIBu+FXQHImEg8j/Lw0+vA==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} printable-characters@1.0.42: @@ -8832,11 +8849,6 @@ packages: engines: {node: '>= 0.4'} hasBin: true - resolve@1.22.11: - resolution: {integrity: sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ==} - engines: {node: '>= 0.4'} - hasBin: true - resolve@2.0.0-next.5: resolution: {integrity: sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==} hasBin: true @@ -9216,8 +9228,8 @@ packages: resolution: {integrity: sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==} engines: {node: '>=18'} - string-width@8.2.0: - resolution: {integrity: sha512-6hJPQ8N0V0P3SNmP6h2J99RLuzrWz2gvT7VnK5tKvrNqJoyS9W4/Fb8mo31UiPvy00z7DQXkP2hnKBVav76thw==} + string-width@8.1.1: + resolution: {integrity: sha512-KpqHIdDL9KwYk22wEOg/VIqYbrnLeSApsKT/bSj6Ez7pn3CftUiLAv2Lccpq1ALcpLV9UX1Ppn92npZWu2w/aw==} engines: {node: '>=20'} string.prototype.includes@2.0.1: @@ -9261,10 +9273,6 @@ packages: resolution: {integrity: sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==} engines: {node: '>=12'} - strip-ansi@7.2.0: - resolution: {integrity: sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==} - engines: {node: '>=12'} - strip-bom@3.0.0: resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} engines: {node: '>=4'} @@ -9289,8 +9297,8 @@ packages: resolution: {integrity: sha512-0fk9zBqO67Nq5M/m45qHCJxylV/DhBlIOVExqgOMiCCrzrhU6tCibRXNqE3jwJLftzE9SNuZtYbpzcO+i9FiKw==} engines: {node: '>=14.16'} - strnum@2.2.0: - resolution: {integrity: sha512-Y7Bj8XyJxnPAORMZj/xltsfo55uOiyHcU2tnAVzHUnSJR/KsEX+9RoDeXEnsXtl/CX4fAcrt64gZ13aGaWPeBg==} + strnum@2.1.2: + resolution: {integrity: sha512-l63NF9y/cLROq/yqKXSLtcMeeyOfnSQlfMSlzFt/K73oIaD8DGaQWd7Z34X9GPiKqP5rbSh84Hl4bOlLcjiSrQ==} stubborn-fs@1.2.5: resolution: {integrity: sha512-H2N9c26eXjzL/S/K+i/RHHcFanE74dptvvjM8iwzwbVcWY/zjBbgRqF3K0DY4+OD+uTTASTBvDoxPDaPN02D7g==} @@ -9949,10 +9957,6 @@ packages: resolution: {integrity: sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw==} engines: {node: '>= 0.4'} - which-typed-array@1.1.20: - resolution: {integrity: sha512-LYfpUkmqwl0h9A2HL09Mms427Q1RZWuOHsukfVcKRq9q95iQxdw0ix1JQrqbcDR9PH1QDwf5Qo8OZb5lksZ8Xg==} - engines: {node: '>= 0.4'} - which@2.0.2: resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} engines: {node: '>= 8'} @@ -11973,7 +11977,7 @@ snapshots: '@whatwg-node/promise-helpers': 1.3.2 tslib: 2.8.1 - '@envelop/core@5.5.1': + '@envelop/core@5.5.0': dependencies: '@envelop/instrumentation': 1.0.0 '@envelop/types': 5.2.1 @@ -12252,7 +12256,7 @@ snapshots: '@graphql-tools/code-file-loader': 8.1.28(graphql@16.10.0) '@graphql-tools/git-loader': 8.0.32(graphql@16.10.0) '@graphql-tools/github-loader': 8.0.22(@types/node@24.7.0)(graphql@16.10.0) - '@graphql-tools/graphql-file-loader': 8.1.12(graphql@16.10.0) + '@graphql-tools/graphql-file-loader': 8.1.9(graphql@16.10.0) '@graphql-tools/json-file-loader': 8.0.26(graphql@16.10.0) '@graphql-tools/load': 8.1.8(graphql@16.10.0) '@graphql-tools/prisma-loader': 8.0.17(@types/node@24.7.0)(crossws@0.3.5)(graphql@16.10.0) @@ -12711,7 +12715,7 @@ snapshots: '@graphql-tools/executor-common@0.0.6(graphql@16.10.0)': dependencies: - '@envelop/core': 5.5.1 + '@envelop/core': 5.5.0 '@graphql-tools/utils': 10.7.2(graphql@16.10.0) graphql: 16.10.0 optional: true @@ -12890,14 +12894,16 @@ snapshots: tslib: 2.8.1 unixify: 1.0.0 - '@graphql-tools/graphql-file-loader@8.1.12(graphql@16.10.0)': + '@graphql-tools/graphql-file-loader@8.1.9(graphql@16.10.0)': dependencies: - '@graphql-tools/import': 7.1.12(graphql@16.10.0) + '@graphql-tools/import': 7.1.9(graphql@16.10.0) '@graphql-tools/utils': 10.7.2(graphql@16.10.0) globby: 11.1.0 graphql: 16.10.0 tslib: 2.8.1 unixify: 1.0.0 + transitivePeerDependencies: + - supports-color optional: true '@graphql-tools/graphql-tag-pluck@8.3.19(graphql@16.10.0)': @@ -12934,12 +12940,15 @@ snapshots: resolve-from: 5.0.0 tslib: 2.8.1 - '@graphql-tools/import@7.1.12(graphql@16.10.0)': + '@graphql-tools/import@7.1.9(graphql@16.10.0)': dependencies: '@graphql-tools/utils': 10.7.2(graphql@16.10.0) + '@theguild/federation-composition': 0.21.3(graphql@16.10.0) graphql: 16.10.0 resolve-from: 5.0.0 tslib: 2.8.1 + transitivePeerDependencies: + - supports-color optional: true '@graphql-tools/json-file-loader@8.0.18(graphql@16.10.0)': @@ -13499,18 +13508,24 @@ snapshots: optionalDependencies: '@types/node': 24.7.0 + '@isaacs/balanced-match@4.0.1': {} + + '@isaacs/brace-expansion@5.0.0': + dependencies: + '@isaacs/balanced-match': 4.0.1 + '@isaacs/cliui@8.0.2': dependencies: string-width: 5.1.2 string-width-cjs: string-width@4.2.3 - strip-ansi: 7.2.0 + strip-ansi: 7.1.0 strip-ansi-cjs: strip-ansi@6.0.1 wrap-ansi: 8.1.0 wrap-ansi-cjs: wrap-ansi@7.0.0 '@istanbuljs/schema@0.1.3': {} - '@jest/diff-sequences@30.3.0': {} + '@jest/diff-sequences@30.0.1': {} '@jest/get-type@30.1.0': {} @@ -13801,7 +13816,7 @@ snapshots: indent-string: 4.0.0 is-wsl: 2.2.0 js-yaml: 3.14.2 - minimatch: 9.0.9 + minimatch: 9.0.6 natural-orderby: 2.0.3 object-treeify: 1.1.33 password-prompt: 1.1.3 @@ -13847,7 +13862,7 @@ snapshots: indent-string: 4.0.0 is-wsl: 2.2.0 lilconfig: 3.1.3 - minimatch: 9.0.9 + minimatch: 9.0.6 semver: 7.7.4 string-width: 4.2.3 supports-color: 8.1.1 @@ -14239,6 +14254,10 @@ snapshots: '@pkgr/core@0.2.9': {} + '@playwright/test@1.58.2': + dependencies: + playwright: 1.58.2 + '@pnpm/config.env-replace@1.1.0': {} '@pnpm/network.ca-file@1.0.2': @@ -14488,7 +14507,7 @@ snapshots: eslint: 9.39.3(jiti@2.4.2) eslint-config-prettier: 9.1.2(eslint@9.39.3(jiti@2.4.2)) eslint-import-resolver-typescript: 4.4.4(eslint-plugin-import-x@4.16.1(@typescript-eslint/utils@8.56.1(eslint@9.39.3(jiti@2.4.2))(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint@9.39.3(jiti@2.4.2)))(eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.56.1(eslint@9.39.3(jiti@2.4.2))(typescript@5.9.3))(eslint@9.39.3(jiti@2.4.2)))(eslint@9.39.3(jiti@2.4.2)) - eslint-module-utils: 2.12.0(@typescript-eslint/parser@8.56.1(eslint@9.39.3(jiti@2.4.2))(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@4.4.4(eslint-plugin-import-x@4.16.1(@typescript-eslint/utils@8.56.1(eslint@9.39.3(jiti@2.4.2))(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint@9.39.3(jiti@2.4.2)))(eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.56.1(eslint@9.39.3(jiti@2.4.2))(typescript@5.9.3))(eslint@9.39.3(jiti@2.4.2)))(eslint@9.39.3(jiti@2.4.2)))(eslint@9.39.3(jiti@2.4.2)) + eslint-module-utils: 2.12.0(@typescript-eslint/parser@8.56.1(eslint@9.39.3(jiti@2.4.2))(typescript@5.9.3))(eslint-import-resolver-typescript@4.4.4(eslint-plugin-import-x@4.16.1(@typescript-eslint/utils@8.56.1(eslint@9.39.3(jiti@2.4.2))(typescript@5.9.3))(eslint@9.39.3(jiti@2.4.2)))(eslint@9.39.3(jiti@2.4.2)))(eslint@9.39.3(jiti@2.4.2)) eslint-plugin-eslint-comments: 3.2.0(eslint@9.39.3(jiti@2.4.2)) eslint-plugin-import-x: 4.16.1(@typescript-eslint/utils@8.56.1(eslint@9.39.3(jiti@2.4.2))(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint@9.39.3(jiti@2.4.2)) eslint-plugin-jest: 28.14.0(@typescript-eslint/eslint-plugin@8.56.1(@typescript-eslint/parser@8.56.1(eslint@9.39.3(jiti@2.4.2))(typescript@5.9.3))(eslint@9.39.3(jiti@2.4.2))(typescript@5.9.3))(eslint@9.39.3(jiti@2.4.2))(typescript@5.9.3) @@ -14632,7 +14651,7 @@ snapshots: jsonc-parser: 3.3.1 line-column: 1.0.2 lodash: 4.17.23 - minimatch: 9.0.9 + minimatch: 9.0.6 vscode-json-languageservice: 5.5.0 vscode-uri: 3.1.0 transitivePeerDependencies: @@ -15046,19 +15065,30 @@ snapshots: '@teppeis/multimaps@3.0.0': {} + '@theguild/federation-composition@0.21.3(graphql@16.10.0)': + dependencies: + constant-case: 3.0.4 + debug: 4.4.3(supports-color@8.1.1) + graphql: 16.10.0 + json5: 2.2.3 + lodash.sortby: 4.7.0 + transitivePeerDependencies: + - supports-color + optional: true + '@tootallnate/once@2.0.0': {} '@ts-morph/common@0.18.1': dependencies: fast-glob: 3.3.3 - minimatch: 5.1.9 + minimatch: 5.1.6 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.6 mkdirp: 2.1.6 path-browserify: 1.0.1 @@ -15320,8 +15350,8 @@ snapshots: '@typescript-eslint/project-service@8.43.0(typescript@5.9.3)': dependencies: - '@typescript-eslint/tsconfig-utils': 8.43.0(typescript@5.9.3) - '@typescript-eslint/types': 8.43.0 + '@typescript-eslint/tsconfig-utils': 8.56.1(typescript@5.9.3) + '@typescript-eslint/types': 8.56.1 debug: 4.4.0(supports-color@8.1.1) typescript: 5.9.3 transitivePeerDependencies: @@ -15391,9 +15421,9 @@ snapshots: debug: 4.4.0(supports-color@8.1.1) fast-glob: 3.3.3 is-glob: 4.0.3 - minimatch: 9.0.9 + minimatch: 9.0.6 semver: 7.6.3 - ts-api-utils: 2.1.0(typescript@5.9.3) + ts-api-utils: 2.4.0(typescript@5.9.3) typescript: 5.9.3 transitivePeerDependencies: - supports-color @@ -15738,7 +15768,7 @@ snapshots: ajv@8.18.0: dependencies: fast-deep-equal: 3.1.3 - fast-uri: 3.1.0 + fast-uri: 3.0.6 json-schema-traverse: 1.0.0 require-from-string: 2.0.2 @@ -15754,10 +15784,6 @@ snapshots: ansi-escapes@6.2.1: {} - ansi-escapes@7.1.1: - dependencies: - environment: 1.1.0 - ansi-escapes@7.2.0: dependencies: environment: 1.1.0 @@ -15877,7 +15903,7 @@ snapshots: call-bind: 1.0.8 call-bound: 1.0.4 define-properties: 1.2.1 - es-abstract: 1.24.1 + es-abstract: 1.24.0 es-errors: 1.3.0 es-object-atoms: 1.1.1 es-shim-unscopables: 1.1.0 @@ -15962,10 +15988,10 @@ snapshots: axe-core@4.10.3: {} - axios@1.13.6: + axios@1.13.4: dependencies: follow-redirects: 1.15.11 - form-data: 4.0.5 + form-data: 4.0.4 proxy-from-env: 1.1.0 transitivePeerDependencies: - debug @@ -16251,8 +16277,6 @@ snapshots: chalk@5.4.1: {} - chalk@5.6.2: {} - change-case-all@1.0.15: dependencies: change-case: 4.1.2 @@ -16371,7 +16395,7 @@ snapshots: cli-truncate@5.1.1: dependencies: slice-ansi: 7.1.2 - string-width: 8.2.0 + string-width: 8.1.1 cli-width@3.0.0: optional: true @@ -16853,7 +16877,7 @@ snapshots: dependencies: once: 1.4.0 - enhanced-resolve@5.20.0: + enhanced-resolve@5.19.0: dependencies: graceful-fs: 4.2.11 tapable: 2.3.0 @@ -16942,64 +16966,6 @@ snapshots: unbox-primitive: 1.1.0 which-typed-array: 1.1.19 - es-abstract@1.24.1: - dependencies: - array-buffer-byte-length: 1.0.2 - arraybuffer.prototype.slice: 1.0.4 - available-typed-arrays: 1.0.7 - call-bind: 1.0.8 - call-bound: 1.0.4 - data-view-buffer: 1.0.2 - data-view-byte-length: 1.0.2 - data-view-byte-offset: 1.0.1 - es-define-property: 1.0.1 - es-errors: 1.3.0 - es-object-atoms: 1.1.1 - es-set-tostringtag: 2.1.0 - es-to-primitive: 1.3.0 - function.prototype.name: 1.1.8 - get-intrinsic: 1.3.0 - get-proto: 1.0.1 - get-symbol-description: 1.1.0 - globalthis: 1.0.4 - gopd: 1.2.0 - has-property-descriptors: 1.0.2 - has-proto: 1.2.0 - has-symbols: 1.1.0 - hasown: 2.0.2 - internal-slot: 1.1.0 - is-array-buffer: 3.0.5 - is-callable: 1.2.7 - is-data-view: 1.0.2 - is-negative-zero: 2.0.3 - is-regex: 1.2.1 - is-set: 2.0.3 - is-shared-array-buffer: 1.0.4 - is-string: 1.1.1 - is-typed-array: 1.1.15 - is-weakref: 1.1.1 - math-intrinsics: 1.1.0 - object-inspect: 1.13.4 - object-keys: 1.1.1 - object.assign: 4.1.7 - own-keys: 1.0.1 - regexp.prototype.flags: 1.5.4 - safe-array-concat: 1.1.3 - safe-push-apply: 1.0.0 - safe-regex-test: 1.1.0 - set-proto: 1.0.0 - stop-iteration-iterator: 1.1.0 - string.prototype.trim: 1.2.10 - string.prototype.trimend: 1.0.9 - string.prototype.trimstart: 1.0.8 - typed-array-buffer: 1.0.3 - typed-array-byte-length: 1.0.3 - typed-array-byte-offset: 1.0.4 - typed-array-length: 1.0.7 - unbox-primitive: 1.1.0 - which-typed-array: 1.1.20 - optional: true - es-define-property@1.0.1: {} es-errors@1.3.0: {} @@ -17139,7 +17105,7 @@ snapshots: eslint-compat-utils@0.5.1(eslint@9.39.3(jiti@2.4.2)): dependencies: eslint: 9.39.3(jiti@2.4.2) - semver: 7.7.4 + semver: 7.6.3 eslint-config-prettier@10.1.5(eslint@9.39.3(jiti@2.4.2)): dependencies: @@ -17160,7 +17126,7 @@ snapshots: dependencies: debug: 3.2.7 is-core-module: 2.16.1 - resolve: 1.22.11 + resolve: 1.22.10 transitivePeerDependencies: - supports-color optional: true @@ -17192,21 +17158,20 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-module-utils@2.12.1(@typescript-eslint/parser@8.56.1(eslint@9.39.3(jiti@2.4.2))(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint@9.39.3(jiti@2.4.2)): + eslint-module-utils@2.12.0(@typescript-eslint/parser@8.56.1(eslint@9.39.3(jiti@2.4.2))(typescript@5.9.3))(eslint-import-resolver-typescript@4.4.4(eslint-plugin-import-x@4.16.1(@typescript-eslint/utils@8.56.1(eslint@9.39.3(jiti@2.4.2))(typescript@5.9.3))(eslint@9.39.3(jiti@2.4.2)))(eslint@9.39.3(jiti@2.4.2)))(eslint@9.39.3(jiti@2.4.2)): dependencies: debug: 3.2.7 optionalDependencies: '@typescript-eslint/parser': 8.56.1(eslint@9.39.3(jiti@2.4.2))(typescript@5.9.3) eslint: 9.39.3(jiti@2.4.2) - eslint-import-resolver-node: 0.3.9 + eslint-import-resolver-typescript: 4.4.4(eslint-plugin-import-x@4.16.1(@typescript-eslint/utils@8.56.1(eslint@9.39.3(jiti@2.4.2))(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint@9.39.3(jiti@2.4.2)))(eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.56.1(eslint@9.39.3(jiti@2.4.2))(typescript@5.9.3))(eslint@9.39.3(jiti@2.4.2)))(eslint@9.39.3(jiti@2.4.2)) transitivePeerDependencies: - supports-color - optional: true eslint-plugin-es-x@7.8.0(eslint@9.39.3(jiti@2.4.2)): dependencies: '@eslint-community/eslint-utils': 4.9.0(eslint@9.39.3(jiti@2.4.2)) - '@eslint-community/regexpp': 4.12.1 + '@eslint-community/regexpp': 4.12.2 eslint: 9.39.3(jiti@2.4.2) eslint-compat-utils: 0.5.1(eslint@9.39.3(jiti@2.4.2)) @@ -17224,8 +17189,8 @@ snapshots: eslint: 9.39.3(jiti@2.4.2) eslint-import-context: 0.1.9(unrs-resolver@1.11.1) is-glob: 4.0.3 - minimatch: 10.2.4 - semver: 7.7.4 + minimatch: 9.0.6 + semver: 7.7.3 stable-hash-x: 0.2.0 unrs-resolver: 1.11.1 optionalDependencies: @@ -17245,7 +17210,7 @@ snapshots: doctrine: 2.1.0 eslint: 9.39.3(jiti@2.4.2) eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.12.1(@typescript-eslint/parser@8.56.1(eslint@9.39.3(jiti@2.4.2))(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint@9.39.3(jiti@2.4.2)) + eslint-module-utils: 2.12.0(@typescript-eslint/parser@8.56.1(eslint@9.39.3(jiti@2.4.2))(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@4.4.4(eslint-plugin-import-x@4.16.1(@typescript-eslint/utils@8.56.1(eslint@9.39.3(jiti@2.4.2))(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint@9.39.3(jiti@2.4.2)))(eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.56.1(eslint@9.39.3(jiti@2.4.2))(typescript@5.9.3))(eslint@9.39.3(jiti@2.4.2)))(eslint@9.39.3(jiti@2.4.2)))(eslint@9.39.3(jiti@2.4.2)) hasown: 2.0.2 is-core-module: 2.16.1 is-glob: 4.0.3 @@ -17316,14 +17281,14 @@ snapshots: eslint-plugin-n@17.24.0(eslint@9.39.3(jiti@2.4.2))(typescript@5.9.3): dependencies: '@eslint-community/eslint-utils': 4.9.0(eslint@9.39.3(jiti@2.4.2)) - enhanced-resolve: 5.20.0 + enhanced-resolve: 5.19.0 eslint: 9.39.3(jiti@2.4.2) eslint-plugin-es-x: 7.8.0(eslint@9.39.3(jiti@2.4.2)) get-tsconfig: 4.13.6 globals: 15.15.0 globrex: 0.1.2 ignore: 5.3.2 - semver: 7.7.4 + semver: 7.6.3 ts-declaration-location: 1.0.7(typescript@5.9.3) transitivePeerDependencies: - typescript @@ -17590,11 +17555,11 @@ snapshots: fast-safe-stringify@1.2.3: {} - fast-uri@3.1.0: {} + fast-uri@3.0.6: {} fast-xml-parser@5.3.6: dependencies: - strnum: 2.2.0 + strnum: 2.1.2 fastest-levenshtein@1.0.16: {} @@ -17646,9 +17611,9 @@ snapshots: dependencies: flat-cache: 4.0.1 - filelist@1.0.6: + filelist@1.0.4: dependencies: - minimatch: 5.1.9 + minimatch: 5.1.6 fill-range@7.1.1: dependencies: @@ -17735,14 +17700,6 @@ snapshots: hasown: 2.0.2 mime-types: 2.1.35 - form-data@4.0.5: - dependencies: - asynckit: 0.4.0 - combined-stream: 1.0.8 - es-set-tostringtag: 2.1.0 - hasown: 2.0.2 - mime-types: 2.1.35 - formatly@0.2.4: dependencies: fd-package-json: 2.0.0 @@ -17794,6 +17751,9 @@ snapshots: fs.realpath@1.0.0: {} + fsevents@2.3.2: + optional: true + fsevents@2.3.3: optional: true @@ -17816,8 +17776,6 @@ snapshots: get-east-asian-width@1.4.0: {} - get-east-asian-width@1.5.0: {} - get-intrinsic@1.3.0: dependencies: call-bind-apply-helpers: 1.0.2 @@ -17885,7 +17843,7 @@ snapshots: dependencies: foreground-child: 3.3.1 jackspeak: 3.4.3 - minimatch: 9.0.9 + minimatch: 9.0.6 minipass: 7.1.2 package-json-from-dist: 1.0.1 path-scurry: 1.11.1 @@ -17894,7 +17852,7 @@ snapshots: dependencies: foreground-child: 3.3.1 jackspeak: 4.1.1 - minimatch: 10.2.4 + minimatch: 10.1.1 minipass: 7.1.2 package-json-from-dist: 1.0.1 path-scurry: 2.0.0 @@ -17904,7 +17862,7 @@ snapshots: fs.realpath: 1.0.0 inflight: 1.0.6 inherits: 2.0.4 - minimatch: 3.1.5 + minimatch: 3.1.2 once: 1.4.0 path-is-absolute: 1.0.1 @@ -17913,7 +17871,7 @@ snapshots: fs.realpath: 1.0.0 inflight: 1.0.6 inherits: 2.0.4 - minimatch: 5.1.9 + minimatch: 5.1.6 once: 1.4.0 global-agent@3.0.0: @@ -18009,7 +17967,7 @@ snapshots: cosmiconfig: 8.3.6(typescript@5.9.3) graphql: 16.10.0 jiti: 2.4.2 - minimatch: 9.0.9 + minimatch: 9.0.6 string-env-interpolation: 1.0.1 tslib: 2.8.1 transitivePeerDependencies: @@ -18032,7 +17990,7 @@ snapshots: cosmiconfig: 8.3.6(typescript@5.9.3) graphql: 16.10.0 jiti: 2.4.2 - minimatch: 9.0.9 + minimatch: 9.0.6 string-env-interpolation: 1.0.1 tslib: 2.8.1 transitivePeerDependencies: @@ -18290,10 +18248,10 @@ snapshots: ink@5.0.1(@types/react@18.3.12)(react@18.3.1): dependencies: '@alcalzone/ansi-tokenize': 0.1.3 - ansi-escapes: 7.1.1 + ansi-escapes: 7.2.0 ansi-styles: 6.2.3 auto-bind: 5.0.1 - chalk: 5.6.2 + chalk: 5.4.1 cli-boxes: 3.0.0 cli-cursor: 4.0.0 cli-truncate: 4.0.0 @@ -18632,7 +18590,7 @@ snapshots: '@babel/parser': 7.28.4 '@istanbuljs/schema': 0.1.3 istanbul-lib-coverage: 3.2.2 - semver: 7.7.4 + semver: 7.7.3 transitivePeerDependencies: - supports-color @@ -18677,7 +18635,7 @@ snapshots: jake@10.9.4: dependencies: async: 3.2.6 - filelist: 1.0.6 + filelist: 1.0.4 picocolors: 1.1.1 jest-diff@26.6.2: @@ -18687,12 +18645,12 @@ snapshots: jest-get-type: 26.3.0 pretty-format: 26.6.2 - jest-diff@30.3.0: + jest-diff@30.2.0: dependencies: - '@jest/diff-sequences': 30.3.0 + '@jest/diff-sequences': 30.0.1 '@jest/get-type': 30.1.0 chalk: 4.1.2 - pretty-format: 30.3.0 + pretty-format: 30.2.0 jest-get-type@26.3.0: {} @@ -18980,10 +18938,10 @@ snapshots: log-update@6.1.0: dependencies: - ansi-escapes: 7.1.1 + ansi-escapes: 7.2.0 cli-cursor: 5.0.0 slice-ansi: 7.1.2 - strip-ansi: 7.2.0 + strip-ansi: 7.1.0 wrap-ansi: 9.0.2 loglevel@1.9.2: {} @@ -19032,7 +18990,7 @@ snapshots: make-dir@4.0.0: dependencies: - semver: 7.7.4 + semver: 7.6.3 make-error@1.3.6: {} @@ -19125,6 +19083,10 @@ snapshots: min-indent@1.0.1: {} + minimatch@10.1.1: + dependencies: + '@isaacs/brace-expansion': 5.0.0 + minimatch@10.2.4: dependencies: brace-expansion: 5.0.4 @@ -19137,11 +19099,11 @@ snapshots: dependencies: brace-expansion: 1.1.12 - minimatch@5.1.9: + minimatch@5.1.6: dependencies: brace-expansion: 2.0.2 - minimatch@7.4.9: + minimatch@7.4.6: dependencies: brace-expansion: 2.0.2 @@ -19157,10 +19119,6 @@ snapshots: dependencies: brace-expansion: 5.0.4 - minimatch@9.0.9: - dependencies: - brace-expansion: 2.0.2 - minimist-options@4.1.0: dependencies: arrify: 1.0.1 @@ -19274,8 +19232,7 @@ snapshots: node-abort-controller@3.1.1: {} - node-addon-api@7.1.1: - optional: true + node-addon-api@7.1.1: {} node-domexception@1.0.0: {} @@ -19295,6 +19252,10 @@ snapshots: node-machine-id@1.1.12: {} + node-pty@1.1.0: + dependencies: + node-addon-api: 7.1.1 + node-releases@2.0.21: {} node-stream-zip@1.15.0: {} @@ -19309,7 +19270,7 @@ snapshots: normalize-package-data@6.0.2: dependencies: hosted-git-info: 7.0.2 - semver: 7.7.4 + semver: 7.6.3 validate-npm-package-license: 3.0.4 normalize-path@2.1.1: @@ -19347,7 +19308,7 @@ snapshots: '@yarnpkg/lockfile': 1.1.0 '@yarnpkg/parsers': 3.0.2 '@zkochan/js-yaml': 0.0.7 - axios: 1.13.6 + axios: 1.13.4 chalk: 4.1.2 cli-cursor: 3.1.0 cli-spinners: 2.6.1 @@ -19359,7 +19320,7 @@ snapshots: flat: 5.0.2 front-matter: 4.0.2 ignore: 7.0.5 - jest-diff: 30.3.0 + jest-diff: 30.2.0 jsonc-parser: 3.2.0 lines-and-columns: 2.0.3 minimatch: 9.0.3 @@ -19398,7 +19359,7 @@ snapshots: '@yarnpkg/lockfile': 1.1.0 '@yarnpkg/parsers': 3.0.2 '@zkochan/js-yaml': 0.0.7 - axios: 1.13.6 + axios: 1.13.4 cli-cursor: 3.1.0 cli-spinners: 2.6.1 cliui: 8.0.1 @@ -19410,7 +19371,7 @@ snapshots: flat: 5.0.2 front-matter: 4.0.2 ignore: 7.0.5 - jest-diff: 30.3.0 + jest-diff: 30.2.0 jsonc-parser: 3.2.0 lines-and-columns: 2.0.3 minimatch: 10.2.4 @@ -19420,14 +19381,14 @@ snapshots: ora: 5.3.0 picocolors: 1.1.1 resolve.exports: 2.0.3 - semver: 7.7.4 + semver: 7.6.3 string-width: 4.2.3 tar-stream: 2.2.0 tmp: 0.2.5 tree-kill: 1.2.2 tsconfig-paths: 4.2.0 tslib: 2.8.1 - yaml: 2.8.2 + yaml: 2.7.0 yargs: 17.7.2 yargs-parser: 21.1.1 optionalDependencies: @@ -19483,7 +19444,7 @@ snapshots: dependencies: call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.24.1 + es-abstract: 1.24.0 optional: true object.values@1.2.1: @@ -19572,7 +19533,7 @@ snapshots: bl: 4.1.0 chalk: 4.1.2 cli-cursor: 3.1.0 - cli-spinners: 2.6.1 + cli-spinners: 2.9.2 is-interactive: 1.0.0 log-symbols: 4.1.0 strip-ansi: 6.0.1 @@ -19825,6 +19786,14 @@ snapshots: dependencies: find-up: 5.0.0 + playwright-core@1.58.2: {} + + playwright@1.58.2: + dependencies: + playwright-core: 1.58.2 + optionalDependencies: + fsevents: 2.3.2 + pluralize@8.0.0: {} possible-typed-array-names@1.1.0: {} @@ -19852,7 +19821,7 @@ snapshots: ansi-styles: 4.3.0 react-is: 17.0.2 - pretty-format@30.3.0: + pretty-format@30.2.0: dependencies: '@jest/schemas': 30.0.5 ansi-styles: 5.2.0 @@ -20137,7 +20106,7 @@ snapshots: readdir-glob@1.1.3: dependencies: - minimatch: 5.1.9 + minimatch: 5.1.6 readdirp@3.6.0: dependencies: @@ -20263,13 +20232,6 @@ snapshots: path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 - resolve@1.22.11: - dependencies: - is-core-module: 2.16.1 - path-parse: 1.0.7 - supports-preserve-symlinks-flag: 1.0.0 - optional: true - resolve@2.0.0-next.5: dependencies: is-core-module: 2.16.1 @@ -20595,7 +20557,7 @@ snapshots: get-stdin: 9.0.0 git-hooks-list: 3.2.0 is-plain-obj: 4.1.0 - semver: 7.7.4 + semver: 7.6.3 sort-object-keys: 1.1.3 tinyglobby: 0.2.15 @@ -20703,7 +20665,7 @@ snapshots: dependencies: eastasianwidth: 0.2.0 emoji-regex: 9.2.2 - strip-ansi: 7.2.0 + strip-ansi: 7.1.0 string-width@7.2.0: dependencies: @@ -20711,10 +20673,10 @@ snapshots: get-east-asian-width: 1.4.0 strip-ansi: 7.1.0 - string-width@8.2.0: + string-width@8.1.1: dependencies: - get-east-asian-width: 1.5.0 - strip-ansi: 7.2.0 + get-east-asian-width: 1.4.0 + strip-ansi: 7.1.0 string.prototype.includes@2.0.1: dependencies: @@ -20786,10 +20748,6 @@ snapshots: dependencies: ansi-regex: 6.2.2 - strip-ansi@7.2.0: - dependencies: - ansi-regex: 6.2.2 - strip-bom@3.0.0: {} strip-final-newline@3.0.0: {} @@ -20804,7 +20762,7 @@ snapshots: strip-json-comments@5.0.1: {} - strnum@2.2.0: {} + strnum@2.1.2: {} stubborn-fs@1.2.5: {} @@ -20911,7 +20869,7 @@ snapshots: dependencies: '@istanbuljs/schema': 0.1.3 glob: 10.4.5 - minimatch: 9.0.9 + minimatch: 9.0.6 thenify-all@1.6.0: dependencies: @@ -21645,17 +21603,6 @@ snapshots: gopd: 1.2.0 has-tostringtag: 1.0.2 - which-typed-array@1.1.20: - dependencies: - available-typed-arrays: 1.0.7 - call-bind: 1.0.8 - call-bound: 1.0.4 - for-each: 0.3.5 - get-proto: 1.0.1 - gopd: 1.2.0 - has-tostringtag: 1.0.2 - optional: true - which@2.0.2: dependencies: isexe: 2.0.0 @@ -21702,7 +21649,7 @@ snapshots: dependencies: ansi-styles: 6.2.3 string-width: 5.1.2 - strip-ansi: 7.2.0 + strip-ansi: 7.1.0 wrap-ansi@9.0.2: dependencies: diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 421fedad98b..e8596419cc3 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -5,6 +5,7 @@ onlyBuiltDependencies: - '@parcel/watcher' - esbuild - msw + - node-pty - nx - protobufjs - yarn