diff --git a/.changeset/contract-tagging-merge-fix.md b/.changeset/contract-tagging-merge-fix.md new file mode 100644 index 000000000..8b0f84753 --- /dev/null +++ b/.changeset/contract-tagging-merge-fix.md @@ -0,0 +1,8 @@ +--- +'@walkeros/core': patch +--- + +Fix `resolveContracts` so a child contract that uses `extends` inherits the +parent's `tagging` when it does not redeclare it. Previously the parent's +`tagging` was silently dropped, which corrupted contract version tracking for +anyone building on a base contract. diff --git a/.changeset/flow-v4-routing-cache-cleanup.md b/.changeset/flow-v4-routing-cache-cleanup.md new file mode 100644 index 000000000..c15f7a618 --- /dev/null +++ b/.changeset/flow-v4-routing-cache-cleanup.md @@ -0,0 +1,56 @@ +--- +'@walkeros/core': patch +'@walkeros/collector': patch +'@walkeros/cli': patch +'@walkeros/mcp': patch +--- + +Flow v4 routing & cache cleanup. + +**Cache:** + +- `cache.full` is renamed to `cache.stop`. Search-and-replace. +- `cacheRule.match` is now optional. Omitted means always-match. The literal + `'*'` is dropped from the schema and the TypeScript types; `compileMatcher` + still tolerates the string at runtime for migration. +- New `cache.namespace?: string` field. Omit to write keys directly to the + store. Same store + same key + same namespace = same cache entry. +- Implicit per-step namespace prefixes (`s:`, `t:`, `d:`) are removed. If you + relied on them to separate same-keyed caches across + sources/transformers/destinations using the same store, set `cache.namespace` + explicitly. + +**Routing:** + +- Unified recursive `Route` type. A Route is `string | Route[] | RouteConfig`. +- New `case` operator replaces the legacy `Route[]` first-match shape. The + legacy shape is compiled as an implicit `{ case: [...] }` for runtime + compatibility, but new configs should use `case` explicitly. +- `RouteConfig` is a disjoint union enforced at the TypeScript type level via + `never` fields: a single RouteConfig sets at most one of `next` / `case`. A + bare `{ match }` is a gate (pass-through when the match fires, fall-through + when it fails). JSON Schema validation currently emits `anyOf` and does not + enforce disjointness at runtime — see follow-up notes. +- Sequence sugar (`next: [A, B, C]`) is preserved. + +**Path:** + +- A transformer entry with no `code` is a `path` — a code-less passthrough. The + engine synthesizes `(e) => ({ event: e })`. Use paths to name and share + `before` chains across destinations. Validation: a path must declare at least + one of `package`, `before`, `next`, or `cache`. + +**Schema & tooling:** + +- Updated Zod schemas (cache, route, matcher). +- Updated MCP tool descriptions and resource references. +- Updated `flow_validate` to enforce the new constraints (`EMPTY_TRANSFORMER` + error code added). + +**Migration:** Hard cut at the schema/type level. Configs using `cache.full` +will fail validation — rename to `stop`. Configs using `match: "*"` will fail +validation — omit `match`. Configs using `Route[]` first-match still work at +runtime (compiled as implicit `case`) but new configs should use `case` +explicitly. + +`$schema: "v4"` is preserved. No version bump. diff --git a/.changeset/pass-through-and-mapping-only-steps.md b/.changeset/pass-through-and-mapping-only-steps.md new file mode 100644 index 000000000..4422098e4 --- /dev/null +++ b/.changeset/pass-through-and-mapping-only-steps.md @@ -0,0 +1,41 @@ +--- +'@walkeros/core': minor +'@walkeros/collector': minor +'@walkeros/cli': minor +'@walkeros/mcp': minor +--- + +Pass-through transformer steps + closed-schema validation. + +**Validation:** `validateTransformerEntry` in `@walkeros/core` is now the single +source of truth. Bundler, `flow_validate`, and collector runtime all delegate. +Closed schema: unknown top-level keys are errors. `code` + `package` together is +a `CONFLICT`. + +**Pass-through steps:** A transformer entry with no `code` and no `package` is +valid; the collector synthesizes its push. Three variants: + +- before/next chain only (named hop) +- cache only (e.g. dedup) +- mapping only (event-to-event transform via `Mapping.Config`) + +**Mapping at the transformer position:** new `mapping?: Mapping.Config` field on +`Transformer.Config` / `InitTransformer`. Same shape as +`Destination.Config.mapping`, event-to-event semantic. `data` / `silent` are +ignored at the transformer position with a one-time warning. + +**Engine tag:** synthesized instance now uses `type: 'pass'` (was `'path'`). +Hard cut. + +**Runtime fixes:** + +- `compileNext` handles mixed-shape `next` arrays (`["a", { case }]`) via a new + `'sequence'` variant. +- A destination's `before` referencing a pass-through transformer now walks that + transformer's own `before` / `next`. +- `cache.stop: true` at a pre-collector transformer halts the pipeline (matches + `cache.mdx`). + +**Migration:** Typo keys on a step now fail validation. +`instance.type === 'path'` consumers must read `'pass'`. `runTransformerChain` +consumers should branch on the new `stopped` flag. diff --git a/.changeset/route-one-many.md b/.changeset/route-one-many.md new file mode 100644 index 000000000..a28052535 --- /dev/null +++ b/.changeset/route-one-many.md @@ -0,0 +1,12 @@ +--- +'@walkeros/core': minor +'@walkeros/collector': minor +'@walkeros/cli': patch +'@walkeros/mcp': patch +--- + +Route grammar: rename `case` to `one` (first-match dispatch) and add `many` +(all-match parallel fan-out, pre-collector only). `many` terminates the main +chain and is rejected at post-collector positions (`destination.before`, +`destination.next`); use multiple destinations for post-collector fan-out. +`RouteCaseConfig` is renamed to `RouteOneConfig`; no aliases. diff --git a/.changeset/store-cache-and-memory-removal.md b/.changeset/store-cache-and-memory-removal.md new file mode 100644 index 000000000..187d51abc --- /dev/null +++ b/.changeset/store-cache-and-memory-removal.md @@ -0,0 +1,19 @@ +--- +'@walkeros/core': minor +'@walkeros/collector': minor +'@walkeros/mcp': minor +'@walkeros/server-transformer-file': patch +--- + +Add `Flow.Store.cache` for store-level caching: read-through + write-through +wrapper with single-flight dedup, recursive composition via `cache.store`, and +per-wrapper counters. `CacheRule` is now a discriminated union +(`EventCacheRule | StoreCacheRule`); schema rejects inert fields in store +contexts. + +Built-in `__cache` upgraded with LRU, `maxEntries: 10000`, batched eviction, and +active TTL sweep. + +**Breaking:** `@walkeros/store-memory` is removed. Its logic is absorbed into +`__cache`. Migration: drop the store declaration, or omit `cache.store` to use +the built-in tier. `flow_validate` flags legacy references. diff --git a/.changeset/transformer-ga4-initial.md b/.changeset/transformer-ga4-initial.md new file mode 100644 index 000000000..82a007e86 --- /dev/null +++ b/.changeset/transformer-ga4-initial.md @@ -0,0 +1,13 @@ +--- +'@walkeros/transformer-ga4': patch +'@walkeros/collector': patch +--- + +Add `@walkeros/transformer-ga4`: GA4 Measurement Protocol v2 decoder transformer +with default mappings for 33 standard events. Server-side use via +`source-express` in the `before` chain. + +Also: fix collector to preserve fan-out in `source.before` chains. Previously, +when a before-transformer returned an array of events, only the first survived. +This enables vendor-protocol decoders (GA4, Segment, Snowplow, etc.) to fan a +batched request into N walkerOS events. diff --git a/.changeset/validate-step-primitive.md b/.changeset/validate-step-primitive.md new file mode 100644 index 000000000..6671c4a51 --- /dev/null +++ b/.changeset/validate-step-primitive.md @@ -0,0 +1,16 @@ +--- +'@walkeros/core': minor +--- + +Add step-level `validate?` primitive on every walkerOS step. `validate:` is a +declarative description of validation intent, like `cache` or `consent`. +Consumers decide how to enforce. + +Restructure `Flow.ContractRule` to a uniform +`{ extends?, tagging?, description?, events?, schema? }` shape. A single +agnostic JSON Schema replaces the typed section fields (`globals`, `context`, +`custom`, `user`, `consent`); standard event field names live inside +`schema.properties.`. `extends` resolves `schema` via additive deep-merge. + +Contracts are a description and governance concept: tooling, MCP, and humans +read them. Runtime enforcement is the consumer's call. diff --git a/.claude-plugin/plugin.json b/.claude-plugin/plugin.json index 4abfa1436..25ab51d86 100644 --- a/.claude-plugin/plugin.json +++ b/.claude-plugin/plugin.json @@ -31,6 +31,8 @@ "skills/walkeros-understanding-development", "skills/walkeros-using-logger", "skills/walkeros-using-cli", + "skills/walkeros-using-store-cache", + "skills/walkeros-using-transformer-ga4", "skills/walkeros-create-destination", "skills/walkeros-create-source", "skills/walkeros-create-transformer", diff --git a/AGENT.md b/AGENT.md index 26dc5fd43..f23c4beba 100644 --- a/AGENT.md +++ b/AGENT.md @@ -17,18 +17,20 @@ npm run lint # Check code quality Learn the concepts before coding: -| Skill | What You'll Learn | -| ------------------------------------------------------------------------ | -------------------------------------------------- | -| [understanding-development](skills/understanding-development/SKILL.md) | Build workflow, XP principles, folder structure | -| [understanding-flow](skills/understanding-flow/SKILL.md) | Architecture, composability, data flow | -| [understanding-events](skills/understanding-events/SKILL.md) | Event model, entity-action naming, properties | -| [understanding-mapping](skills/understanding-mapping/SKILL.md) | Event transformation, data/map/loop | -| [understanding-destinations](skills/understanding-destinations/SKILL.md) | Destination interface, env pattern | -| [understanding-sources](skills/understanding-sources/SKILL.md) | Source interface, capture patterns | -| [understanding-transformers](skills/understanding-transformers/SKILL.md) | Transformer interface, chaining, pipeline | -| [understanding-stores](skills/understanding-stores/SKILL.md) | Store interface, $store. wiring, lifecycle | -| [using-logger](skills/using-logger/SKILL.md) | Logger access, DRY principles, when to log | -| [using-step-examples](skills/using-step-examples/SKILL.md) | Step examples lifecycle, Three Type Zones, testing | +| Skill | What You'll Learn | +| ------------------------------------------------------------------------ | -------------------------------------------------------------------------- | +| [understanding-development](skills/understanding-development/SKILL.md) | Build workflow, XP principles, folder structure | +| [understanding-flow](skills/understanding-flow/SKILL.md) | Architecture, composability, data flow | +| [understanding-events](skills/understanding-events/SKILL.md) | Event model, entity-action naming, properties | +| [understanding-mapping](skills/understanding-mapping/SKILL.md) | Event transformation, data/map/loop | +| [understanding-destinations](skills/understanding-destinations/SKILL.md) | Destination interface, env pattern | +| [understanding-sources](skills/understanding-sources/SKILL.md) | Source interface, capture patterns | +| [understanding-transformers](skills/understanding-transformers/SKILL.md) | Transformer interface, chaining, pipeline | +| [understanding-stores](skills/understanding-stores/SKILL.md) | Store interface, $store. wiring, lifecycle | +| [using-logger](skills/using-logger/SKILL.md) | Logger access, DRY principles, when to log | +| [using-step-examples](skills/using-step-examples/SKILL.md) | Step examples lifecycle, Three Type Zones, testing | +| [using-store-cache](skills/walkeros-using-store-cache/SKILL.md) | Recipes for store-level cache, multi-tier composition | +| [using-transformer-ga4](skills/walkeros-using-transformer-ga4/SKILL.md) | Wire `@walkeros/transformer-ga4`, override mappings, troubleshoot decoding | ## Creating Things diff --git a/apps/demos/storybook/package.json b/apps/demos/storybook/package.json index a1f00b9c7..e47c1464d 100644 --- a/apps/demos/storybook/package.json +++ b/apps/demos/storybook/package.json @@ -13,6 +13,7 @@ "build-storybook": "storybook build" }, "dependencies": { + "@walkeros/core": "4.0.2", "@walkeros/web-source-browser": "4.0.2", "react": "^19.2.3", "react-dom": "^19.2.3" diff --git a/apps/explorer/package.json b/apps/explorer/package.json index b38016537..5518b5768 100644 --- a/apps/explorer/package.json +++ b/apps/explorer/package.json @@ -37,6 +37,7 @@ "@rjsf/validator-ajv8": "^6.1.2", "@walkeros/collector": "4.0.2", "@walkeros/core": "4.0.2", + "@walkeros/web-core": "4.0.2", "@walkeros/web-source-browser": "4.0.2", "clsx": "^2.1.1", "monaco-editor": "^0.55.1", diff --git a/apps/explorer/src/components/molecules/flow-map/FlowMap.transformers.stories.tsx b/apps/explorer/src/components/molecules/flow-map/FlowMap.transformers.stories.tsx index f78b44c6d..e2705d6c4 100644 --- a/apps/explorer/src/components/molecules/flow-map/FlowMap.transformers.stories.tsx +++ b/apps/explorer/src/components/molecules/flow-map/FlowMap.transformers.stories.tsx @@ -18,10 +18,10 @@ type Story = StoryObj; export const SimplePreTransformer: Story = { args: { sources: { - web: { label: 'Source', text: 'walker.js', next: 'validator' }, + web: { label: 'Source', text: 'walker.js', next: 'filter' }, }, preTransformers: { - validator: { label: 'Validator', text: 'JSON Schema' }, + filter: { label: 'Filter', text: 'Drop bots' }, }, collector: { label: 'Collector' }, destinations: { @@ -36,10 +36,10 @@ export const SimplePreTransformer: Story = { export const BothPreAndPostTransformers: Story = { args: { sources: { - web: { label: 'Source', text: 'walker.js', next: 'validator' }, + web: { label: 'Source', text: 'walker.js', next: 'filter' }, }, preTransformers: { - validator: { label: 'Validator', next: 'enricher' }, + filter: { label: 'Filter', next: 'enricher' }, enricher: { label: 'Enricher' }, }, collector: { label: 'Collector' }, @@ -60,10 +60,10 @@ export const FullFlowWithContext: Story = { args: { stageBefore: { label: 'Browser', text: 'Click event' }, sources: { - web: { label: 'Source', text: 'walker.js', next: 'validator' }, + web: { label: 'Source', text: 'walker.js', next: 'filter' }, }, preTransformers: { - validator: { label: 'Validator' }, + filter: { label: 'Filter' }, }, collector: { label: 'Collector' }, postTransformers: { @@ -79,17 +79,17 @@ export const FullFlowWithContext: Story = { /** * Combined test: skip connections on BOTH left and right sides. * Shows all 4 arrow cases: up/down on left, up/down on right. - * - Left: Web→Validator (down), App→Enricher (up) + * - Left: Web→Filter (down), App→Enricher (up) * - Right: Consent→BigQuery (up), Redactor→GA4 (down) */ export const AllArrowDirections: Story = { args: { sources: { - web: { label: 'Web', text: 'walker.js', next: 'validator' }, + web: { label: 'Web', text: 'walker.js', next: 'filter' }, app: { label: 'App', text: 'SDK', next: 'enricher' }, }, preTransformers: { - validator: { label: 'Validator', next: 'enricher' }, + filter: { label: 'Filter', next: 'enricher' }, enricher: { label: 'Enricher' }, }, collector: { label: 'Collector' }, @@ -110,12 +110,12 @@ export const AllArrowDirections: Story = { export const LongPreTransformerChain: Story = { args: { sources: { - web: { label: 'Source', next: 'validator' }, + web: { label: 'Source', next: 'filter' }, }, preTransformers: { - validator: { label: 'Validator', next: 'enricher' }, - enricher: { label: 'Enricher', next: 'filter' }, - filter: { label: 'Filter' }, + filter: { label: 'Filter', next: 'enricher' }, + enricher: { label: 'Enricher', next: 'redactor' }, + redactor: { label: 'Redactor' }, }, collector: { label: 'Collector' }, destinations: { diff --git a/apps/explorer/src/utils/__tests__/contract-path-walker.test.ts b/apps/explorer/src/utils/__tests__/contract-path-walker.test.ts index d94a468c8..5aa9d4c5c 100644 --- a/apps/explorer/src/utils/__tests__/contract-path-walker.test.ts +++ b/apps/explorer/src/utils/__tests__/contract-path-walker.test.ts @@ -8,9 +8,14 @@ const sampleContract: Flow.Contract = { default: { tagging: 1, description: 'Base', - globals: { + schema: { type: 'object', - properties: { lang: { type: 'string' }, env: { type: 'string' } }, + properties: { + globals: { + type: 'object', + properties: { lang: { type: 'string' }, env: { type: 'string' } }, + }, + }, }, events: { page: { @@ -57,9 +62,9 @@ describe('getContractPathCompletions', () => { it('returns top-level keys for a named contract', () => { const result = getContractPathCompletions(sampleContract, ['web']); const keys = result.map((r) => r.key); - // After resolution, web inherits default's globals + events + // After resolution, web inherits default's schema + events expect(keys).toEqual( - expect.arrayContaining(['description', 'globals', 'events']), + expect.arrayContaining(['description', 'schema', 'events']), ); // extends is stripped after resolution expect(keys).not.toContain('extends'); @@ -98,10 +103,13 @@ describe('getContractPathCompletions', () => { expect(keys).toEqual(expect.arrayContaining(['url', 'referrer'])); }); - it('returns section keys for globals', () => { + it('returns property keys deep inside schema', () => { const result = getContractPathCompletions(sampleContract, [ 'default', + 'schema', + 'properties', 'globals', + 'properties', ]); const keys = result.map((r) => r.key); expect(keys).toEqual(expect.arrayContaining(['lang', 'env'])); diff --git a/apps/explorer/src/utils/__tests__/monaco-intellisense-flow-extractor.test.ts b/apps/explorer/src/utils/__tests__/monaco-intellisense-flow-extractor.test.ts index 3de57808d..6ac7c9a42 100644 --- a/apps/explorer/src/utils/__tests__/monaco-intellisense-flow-extractor.test.ts +++ b/apps/explorer/src/utils/__tests__/monaco-intellisense-flow-extractor.test.ts @@ -106,7 +106,7 @@ describe('extractFlowIntelliSenseContext', () => { ga4: { package: '@walkeros/web-destination-gtag' }, }, transformers: { - validate: { package: '@walkeros/transformer-validator' }, + fingerprint: { package: '@walkeros/transformer-fingerprint' }, }, }, }, @@ -126,8 +126,8 @@ describe('extractFlowIntelliSenseContext', () => { platform: 'web', }, { - package: '@walkeros/transformer-validator', - shortName: 'validate', + package: '@walkeros/transformer-fingerprint', + shortName: 'fingerprint', type: 'transformer', platform: 'web', }, @@ -234,7 +234,7 @@ describe('extractFlowIntelliSenseContext — stores', () => { server: { config: { platform: 'server' }, stores: { - cache: { package: '@walkeros/store-memory' }, + cache: { package: '@walkeros/server-store-fs' }, ttl: {}, }, }, diff --git a/apps/explorer/src/utils/__tests__/monaco-walkeros-completions.test.ts b/apps/explorer/src/utils/__tests__/monaco-walkeros-completions.test.ts index c57494b20..eb1c33e23 100644 --- a/apps/explorer/src/utils/__tests__/monaco-walkeros-completions.test.ts +++ b/apps/explorer/src/utils/__tests__/monaco-walkeros-completions.test.ts @@ -139,9 +139,14 @@ describe('getContractCompletions', () => { const contractRaw = { default: { tagging: 1, - globals: { + schema: { type: 'object', - properties: { lang: { type: 'string' } }, + properties: { + globals: { + type: 'object', + properties: { lang: { type: 'string' } }, + }, + }, }, events: { page: { @@ -169,7 +174,7 @@ describe('getContractCompletions', () => { const labels = items.map((i) => i.label); expect(labels).toEqual( expect.arrayContaining([ - '$contract.default.globals', + '$contract.default.schema', '$contract.default.events', ]), ); @@ -191,13 +196,18 @@ describe('getContractCompletions', () => { describe('getMappingPathCompletions', () => { const contractRaw = { default: { - globals: { - type: 'object', - properties: { lang: { type: 'string' }, env: { type: 'string' } }, - }, - user: { + schema: { type: 'object', - properties: { email: { type: 'string' } }, + properties: { + globals: { + type: 'object', + properties: { lang: { type: 'string' }, env: { type: 'string' } }, + }, + user: { + type: 'object', + properties: { email: { type: 'string' } }, + }, + }, }, events: { page: { diff --git a/apps/explorer/src/utils/contract-path-walker.ts b/apps/explorer/src/utils/contract-path-walker.ts index 55965ef34..418d58bea 100644 --- a/apps/explorer/src/utils/contract-path-walker.ts +++ b/apps/explorer/src/utils/contract-path-walker.ts @@ -46,11 +46,11 @@ export function getSchemaPropertyCompletions( * * Path examples: * - [] → contract names ("default", "web") - * - ["web"] → top-level keys ("globals", "events", "tagging", ...) + * - ["web"] → top-level keys ("schema", "events", "tagging", ...) * - ["web", "events"] → entity names ("page", "product") * - ["web", "events", "page"] → action names ("view", "read") * - ["web", "events", "page", "view"] → schema properties ("title", "url") - * - ["web", "globals"] → globals schema properties ("lang", "env") + * - ["web", "schema", "properties", "globals", "properties"] → keys inside globals */ export function getContractPathCompletions( raw: Flow.Contract, @@ -80,15 +80,7 @@ export function getContractPathCompletions( keys.push({ key: 'tagging', type: 'number' }); if (entry.description !== undefined) keys.push({ key: 'description', type: 'string' }); - for (const section of [ - 'globals', - 'context', - 'custom', - 'user', - 'consent', - ] as const) { - if (entry[section]) keys.push({ key: section, detail: 'schema' }); - } + if (entry.schema) keys.push({ key: 'schema', detail: 'JSON Schema' }); if (entry.events) keys.push({ key: 'events', detail: 'entity map' }); return keys; } @@ -96,15 +88,11 @@ export function getContractPathCompletions( // Level 2+: walk into the entry const firstKey = rest[0]; - // Section schemas (globals, context, custom, user, consent) - const sectionKeys = ['globals', 'context', 'custom', 'user', 'consent']; - if (sectionKeys.includes(firstKey)) { - const schema = entry[firstKey as keyof Flow.ContractRule]; + // Schema (whole-event JSON Schema) + if (firstKey === 'schema') { + const schema = entry.schema; if (!schema || typeof schema !== 'object') return []; - if (rest.length === 1) { - return getSchemaPropertyCompletions(schema as Record); - } - return walkSchemaPath(schema as Record, rest.slice(1)); + return walkJsonSchema(schema as Record, rest.slice(1)); } // Events path @@ -146,7 +134,8 @@ export function getContractPathCompletions( } /** - * Walk into nested JSON Schema properties by path segments. + * Walk into nested JSON Schema properties by path segments (implicit + * `.properties` walk between segments). Used for event-level schemas. */ function walkSchemaPath( schema: Record, @@ -163,6 +152,31 @@ function walkSchemaPath( return getSchemaPropertyCompletions(current); } +/** + * Walk a literal path through a JSON Schema object. Segments traverse keys + * exactly as written (including `properties`), so paths like + * `schema.properties.globals.properties` work as autocompletion expects. + * At the end, if the current node has `properties`, return its keys; otherwise + * return the node's own keys. + */ +function walkJsonSchema( + schema: Record, + segments: string[], +): PathCompletion[] { + let current = schema; + for (const seg of segments) { + const next = current[seg]; + if (!next || typeof next !== 'object') return []; + current = next as Record; + } + if (current.properties && typeof current.properties === 'object') { + return getSchemaPropertyCompletions(current); + } + return Object.keys(current) + .filter((k) => k !== '__proto__') + .map((key) => ({ key })); +} + /** * Clear the resolution cache (useful for testing). */ diff --git a/apps/explorer/src/utils/monaco-walkeros-completions.ts b/apps/explorer/src/utils/monaco-walkeros-completions.ts index e67cbf207..28a8f8f60 100644 --- a/apps/explorer/src/utils/monaco-walkeros-completions.ts +++ b/apps/explorer/src/utils/monaco-walkeros-completions.ts @@ -261,26 +261,25 @@ export function getMappingPathCompletions( if (!contractRaw || Object.keys(contractRaw).length === 0) return []; - const sectionMap: Record = { - data: 'events', - globals: 'globals', - context: 'context', - custom: 'custom', - user: 'user', - consent: 'consent', - }; - - const section = sectionMap[prefix]; - if (!section) return []; + const sectionNames = new Set([ + 'globals', + 'context', + 'custom', + 'user', + 'consent', + ]); + const isEvents = prefix === 'data'; + if (!isEvents && !sectionNames.has(prefix)) return []; const allCompletions: CompletionEntry[] = []; const seen = new Set(); for (const contractName of Object.keys(contractRaw)) { - const pathSegments = - section === 'events' - ? [contractName, 'events', entity, action] - : [contractName, section]; + // `data.` reads from events[entity][action]; section prefixes + // (`globals.`, `consent.`, ...) read from schema.properties.
. + const pathSegments = isEvents + ? [contractName, 'events', entity, action] + : [contractName, 'schema', 'properties', prefix, 'properties']; const completions = getContractPathCompletions( contractRaw as Record>, diff --git a/package-lock.json b/package-lock.json index 55d106a29..8929029ca 100644 --- a/package-lock.json +++ b/package-lock.json @@ -61,15 +61,6 @@ "typescript": "^5.9.3" } }, - "apps/demos/destination": { - "name": "@walkeros/destination-demo", - "version": "2.0.0", - "extraneous": true, - "license": "MIT", - "dependencies": { - "@walkeros/core": "^2.0.0" - } - }, "apps/demos/react": { "name": "walkeros-demo-react", "version": "2.0.9", @@ -125,8 +116,6 @@ }, "apps/demos/react/node_modules/fdir": { "version": "6.5.0", - "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", - "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", "dev": true, "license": "MIT", "engines": { @@ -143,8 +132,6 @@ }, "apps/demos/react/node_modules/picomatch": { "version": "4.0.3", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", - "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", "dev": true, "license": "MIT", "optional": true, @@ -156,22 +143,11 @@ "url": "https://github.com/sponsors/jonschlinkert" } }, - "apps/demos/source": { - "name": "@walkeros/source-demo", - "version": "2.0.0", - "extraneous": true, - "license": "MIT", - "dependencies": { - "@walkeros/core": "^2.0.0" - }, - "devDependencies": { - "@walkeros/collector": "^2.0.0" - } - }, "apps/demos/storybook": { "name": "@walkeros/storybook-demo", "version": "4.0.2", "dependencies": { + "@walkeros/core": "4.0.2", "@walkeros/web-source-browser": "4.0.2", "react": "^19.2.3", "react-dom": "^19.2.3" @@ -219,15 +195,6 @@ "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0" } }, - "apps/demos/transformer": { - "name": "@walkeros/transformer-demo", - "version": "2.0.0", - "extraneous": true, - "license": "MIT", - "dependencies": { - "@walkeros/core": "^2.0.0" - } - }, "apps/explorer": { "name": "@walkeros/explorer", "version": "4.0.2", @@ -246,6 +213,7 @@ "@rjsf/validator-ajv8": "^6.1.2", "@walkeros/collector": "4.0.2", "@walkeros/core": "4.0.2", + "@walkeros/web-core": "4.0.2", "@walkeros/web-source-browser": "4.0.2", "clsx": "^2.1.1", "monaco-editor": "^0.55.1", @@ -289,8 +257,6 @@ }, "apps/explorer/node_modules/@jest/expect-utils": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.7.0.tgz", - "integrity": "sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==", "dev": true, "license": "MIT", "dependencies": { @@ -302,8 +268,6 @@ }, "apps/explorer/node_modules/@jest/schemas": { "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", - "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", "dev": true, "license": "MIT", "dependencies": { @@ -315,8 +279,6 @@ }, "apps/explorer/node_modules/@jest/types": { "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", - "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", "dev": true, "license": "MIT", "dependencies": { @@ -333,15 +295,11 @@ }, "apps/explorer/node_modules/@sinclair/typebox": { "version": "0.27.10", - "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.10.tgz", - "integrity": "sha512-MTBk/3jGLNB2tVxv6uLlFh1iu64iYOQ2PbdOSK3NW8JZsmlaOh2q6sdtKowBhfw8QFLmYNzTW4/oK4uATIi6ZA==", "dev": true, "license": "MIT" }, "apps/explorer/node_modules/@types/jest": { "version": "29.5.14", - "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.5.14.tgz", - "integrity": "sha512-ZN+4sdnLUbo8EVvVc2ao0GFW6oVrQRPn4K2lglySj7APvSrgzxHiNNK99us4WDMi57xxA2yggblIAMNhXOotLQ==", "dev": true, "license": "MIT", "dependencies": { @@ -351,8 +309,6 @@ }, "apps/explorer/node_modules/ansi-styles": { "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "license": "MIT", "dependencies": { @@ -367,8 +323,6 @@ }, "apps/explorer/node_modules/chalk": { "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "license": "MIT", "dependencies": { @@ -384,8 +338,6 @@ }, "apps/explorer/node_modules/expect": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/expect/-/expect-29.7.0.tgz", - "integrity": "sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==", "dev": true, "license": "MIT", "dependencies": { @@ -401,8 +353,6 @@ }, "apps/explorer/node_modules/jest-diff": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.7.0.tgz", - "integrity": "sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==", "dev": true, "license": "MIT", "dependencies": { @@ -417,8 +367,6 @@ }, "apps/explorer/node_modules/jest-matcher-utils": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.7.0.tgz", - "integrity": "sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==", "dev": true, "license": "MIT", "dependencies": { @@ -433,8 +381,6 @@ }, "apps/explorer/node_modules/jest-message-util": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.7.0.tgz", - "integrity": "sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==", "dev": true, "license": "MIT", "dependencies": { @@ -454,8 +400,6 @@ }, "apps/explorer/node_modules/jest-util": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", - "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", "dev": true, "license": "MIT", "dependencies": { @@ -472,8 +416,6 @@ }, "apps/explorer/node_modules/pretty-format": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", - "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", "dev": true, "license": "MIT", "dependencies": { @@ -487,8 +429,6 @@ }, "apps/explorer/node_modules/pretty-format/node_modules/ansi-styles": { "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", "dev": true, "license": "MIT", "engines": { @@ -585,14 +525,10 @@ }, "node_modules/@adobe/css-tools": { "version": "4.4.4", - "resolved": "https://registry.npmjs.org/@adobe/css-tools/-/css-tools-4.4.4.tgz", - "integrity": "sha512-Elp+iwUx5rN5+Y8xLt5/GRoG20WGoDCQ/1Fb+1LiGtvwbDavuSk0jhD/eZdckHAuzcDzccnkv+rEjyWfRx18gg==", "license": "MIT" }, "node_modules/@algolia/abtesting": { "version": "1.15.1", - "resolved": "https://registry.npmjs.org/@algolia/abtesting/-/abtesting-1.15.1.tgz", - "integrity": "sha512-2yuIC48rUuHGhU1U5qJ9kJHaxYpJ0jpDHJVI5ekOxSMYXlH4+HP+pA31G820lsAznfmu2nzDV7n5RO44zIY1zw==", "license": "MIT", "dependencies": { "@algolia/client-common": "5.49.1", @@ -606,8 +542,6 @@ }, "node_modules/@algolia/autocomplete-core": { "version": "1.19.2", - "resolved": "https://registry.npmjs.org/@algolia/autocomplete-core/-/autocomplete-core-1.19.2.tgz", - "integrity": "sha512-mKv7RyuAzXvwmq+0XRK8HqZXt9iZ5Kkm2huLjgn5JoCPtDy+oh9yxUMfDDaVCw0oyzZ1isdJBc7l9nuCyyR7Nw==", "license": "MIT", "dependencies": { "@algolia/autocomplete-plugin-algolia-insights": "1.19.2", @@ -616,8 +550,6 @@ }, "node_modules/@algolia/autocomplete-plugin-algolia-insights": { "version": "1.19.2", - "resolved": "https://registry.npmjs.org/@algolia/autocomplete-plugin-algolia-insights/-/autocomplete-plugin-algolia-insights-1.19.2.tgz", - "integrity": "sha512-TjxbcC/r4vwmnZaPwrHtkXNeqvlpdyR+oR9Wi2XyfORkiGkLTVhX2j+O9SaCCINbKoDfc+c2PB8NjfOnz7+oKg==", "license": "MIT", "dependencies": { "@algolia/autocomplete-shared": "1.19.2" @@ -628,8 +560,6 @@ }, "node_modules/@algolia/autocomplete-shared": { "version": "1.19.2", - "resolved": "https://registry.npmjs.org/@algolia/autocomplete-shared/-/autocomplete-shared-1.19.2.tgz", - "integrity": "sha512-jEazxZTVD2nLrC+wYlVHQgpBoBB5KPStrJxLzsIFl6Kqd1AlG9sIAGl39V5tECLpIQzB3Qa2T6ZPJ1ChkwMK/w==", "license": "MIT", "peerDependencies": { "@algolia/client-search": ">= 4.9.1 < 6", @@ -638,8 +568,6 @@ }, "node_modules/@algolia/client-abtesting": { "version": "5.49.1", - "resolved": "https://registry.npmjs.org/@algolia/client-abtesting/-/client-abtesting-5.49.1.tgz", - "integrity": "sha512-h6M7HzPin+45/l09q0r2dYmocSSt2MMGOOk5c4O5K/bBBlEwf1BKfN6z+iX4b8WXcQQhf7rgQwC52kBZJt/ZZw==", "license": "MIT", "dependencies": { "@algolia/client-common": "5.49.1", @@ -653,8 +581,6 @@ }, "node_modules/@algolia/client-analytics": { "version": "5.49.1", - "resolved": "https://registry.npmjs.org/@algolia/client-analytics/-/client-analytics-5.49.1.tgz", - "integrity": "sha512-048T9/Z8OeLmTk8h76QUqaNFp7Rq2VgS2Zm6Y2tNMYGQ1uNuzePY/udB5l5krlXll7ZGflyCjFvRiOtlPZpE9g==", "license": "MIT", "dependencies": { "@algolia/client-common": "5.49.1", @@ -668,8 +594,6 @@ }, "node_modules/@algolia/client-common": { "version": "5.49.1", - "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-5.49.1.tgz", - "integrity": "sha512-vp5/a9ikqvf3mn9QvHN8PRekn8hW34aV9eX+O0J5mKPZXeA6Pd5OQEh2ZWf7gJY6yyfTlLp5LMFzQUAU+Fpqpg==", "license": "MIT", "engines": { "node": ">= 14.0.0" @@ -677,8 +601,6 @@ }, "node_modules/@algolia/client-insights": { "version": "5.49.1", - "resolved": "https://registry.npmjs.org/@algolia/client-insights/-/client-insights-5.49.1.tgz", - "integrity": "sha512-B6N7PgkvYrul3bntTz/l6uXnhQ2bvP+M7NqTcayh681tSqPaA5cJCUBp/vrP7vpPRpej4Eeyx2qz5p0tE/2N2g==", "license": "MIT", "dependencies": { "@algolia/client-common": "5.49.1", @@ -692,8 +614,6 @@ }, "node_modules/@algolia/client-personalization": { "version": "5.49.1", - "resolved": "https://registry.npmjs.org/@algolia/client-personalization/-/client-personalization-5.49.1.tgz", - "integrity": "sha512-v+4DN+lkYfBd01Hbnb9ZrCHe7l+mvihyx218INRX/kaCXROIWUDIT1cs3urQxfE7kXBFnLsqYeOflQALv/gA5w==", "license": "MIT", "dependencies": { "@algolia/client-common": "5.49.1", @@ -707,8 +627,6 @@ }, "node_modules/@algolia/client-query-suggestions": { "version": "5.49.1", - "resolved": "https://registry.npmjs.org/@algolia/client-query-suggestions/-/client-query-suggestions-5.49.1.tgz", - "integrity": "sha512-Un11cab6ZCv0W+Jiak8UktGIqoa4+gSNgEZNfG8m8eTsXGqwIEr370H3Rqwj87zeNSlFpH2BslMXJ/cLNS1qtg==", "license": "MIT", "dependencies": { "@algolia/client-common": "5.49.1", @@ -722,8 +640,6 @@ }, "node_modules/@algolia/client-search": { "version": "5.49.1", - "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-5.49.1.tgz", - "integrity": "sha512-Nt9hri7nbOo0RipAsGjIssHkpLMHHN/P7QqENywAq5TLsoYDzUyJGny8FEiD/9KJUxtGH8blGpMedilI6kK3rA==", "license": "MIT", "dependencies": { "@algolia/client-common": "5.49.1", @@ -737,14 +653,10 @@ }, "node_modules/@algolia/events": { "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@algolia/events/-/events-4.0.1.tgz", - "integrity": "sha512-FQzvOCgoFXAbf5Y6mYozw2aj5KCJoA3m4heImceldzPSMbdyS4atVjJzXKMsfX3wnZTFYwkkt8/z8UesLHlSBQ==", "license": "MIT" }, "node_modules/@algolia/ingestion": { "version": "1.49.1", - "resolved": "https://registry.npmjs.org/@algolia/ingestion/-/ingestion-1.49.1.tgz", - "integrity": "sha512-b5hUXwDqje0Y4CpU6VL481DXgPgxpTD5sYMnfQTHKgUispGnaCLCm2/T9WbJo1YNUbX3iHtYDArp804eD6CmRQ==", "license": "MIT", "dependencies": { "@algolia/client-common": "5.49.1", @@ -758,8 +670,6 @@ }, "node_modules/@algolia/monitoring": { "version": "1.49.1", - "resolved": "https://registry.npmjs.org/@algolia/monitoring/-/monitoring-1.49.1.tgz", - "integrity": "sha512-bvrXwZ0WsL3rN6Q4m4QqxsXFCo6WAew7sAdrpMQMK4Efn4/W920r9ptOuckejOSSvyLr9pAWgC5rsHhR2FYuYw==", "license": "MIT", "dependencies": { "@algolia/client-common": "5.49.1", @@ -773,8 +683,6 @@ }, "node_modules/@algolia/recommend": { "version": "5.49.1", - "resolved": "https://registry.npmjs.org/@algolia/recommend/-/recommend-5.49.1.tgz", - "integrity": "sha512-h2yz3AGeGkQwNgbLmoe3bxYs8fac4An1CprKTypYyTU/k3Q+9FbIvJ8aS1DoBKaTjSRZVoyQS7SZQio6GaHbZw==", "license": "MIT", "dependencies": { "@algolia/client-common": "5.49.1", @@ -788,8 +696,6 @@ }, "node_modules/@algolia/requester-browser-xhr": { "version": "5.49.1", - "resolved": "https://registry.npmjs.org/@algolia/requester-browser-xhr/-/requester-browser-xhr-5.49.1.tgz", - "integrity": "sha512-2UPyRuUR/qpqSqH8mxFV5uBZWEpxhGPHLlx9Xf6OVxr79XO2ctzZQAhsmTZ6X22x+N8MBWpB9UEky7YU2HGFgA==", "license": "MIT", "dependencies": { "@algolia/client-common": "5.49.1" @@ -800,8 +706,6 @@ }, "node_modules/@algolia/requester-fetch": { "version": "5.49.1", - "resolved": "https://registry.npmjs.org/@algolia/requester-fetch/-/requester-fetch-5.49.1.tgz", - "integrity": "sha512-N+xlE4lN+wpuT+4vhNEwPVlrfN+DWAZmSX9SYhbz986Oq8AMsqdntOqUyiOXVxYsQtfLwmiej24vbvJGYv1Qtw==", "license": "MIT", "dependencies": { "@algolia/client-common": "5.49.1" @@ -812,8 +716,6 @@ }, "node_modules/@algolia/requester-node-http": { "version": "5.49.1", - "resolved": "https://registry.npmjs.org/@algolia/requester-node-http/-/requester-node-http-5.49.1.tgz", - "integrity": "sha512-zA5bkUOB5PPtTr182DJmajCiizHp0rCJQ0Chf96zNFvkdESKYlDeYA3tQ7r2oyHbu/8DiohAQ5PZ85edctzbXA==", "license": "MIT", "dependencies": { "@algolia/client-common": "5.49.1" @@ -824,8 +726,6 @@ }, "node_modules/@alloc/quick-lru": { "version": "5.2.0", - "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz", - "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==", "dev": true, "license": "MIT", "engines": { @@ -837,8 +737,6 @@ }, "node_modules/@amplitude/analytics-browser": { "version": "2.39.0", - "resolved": "https://registry.npmjs.org/@amplitude/analytics-browser/-/analytics-browser-2.39.0.tgz", - "integrity": "sha512-sTNGGjiubsDs1NqKsTXp0ykCaSIzjaGclMRHlnO7JBatqK0f/Knl0cfn1a7XBFuTVix/M5nrWATsKv6+0dSpMg==", "license": "MIT", "dependencies": { "@amplitude/analytics-core": "2.45.0", @@ -853,8 +751,6 @@ }, "node_modules/@amplitude/analytics-client-common": { "version": "2.4.43", - "resolved": "https://registry.npmjs.org/@amplitude/analytics-client-common/-/analytics-client-common-2.4.43.tgz", - "integrity": "sha512-R5n3cfnVNLk32BE2DbCp4xpn39mfmjMUjvOO9kt5dLFdF0cozb9MCawVyZJQVfnJJT6k5NMoswdUBu7Ul0nbRw==", "license": "MIT", "dependencies": { "@amplitude/analytics-connector": "^1.4.8", @@ -865,20 +761,14 @@ }, "node_modules/@amplitude/analytics-client-common/node_modules/@amplitude/analytics-types": { "version": "2.11.1", - "resolved": "https://registry.npmjs.org/@amplitude/analytics-types/-/analytics-types-2.11.1.tgz", - "integrity": "sha512-wFEgb0t99ly2uJKm5oZ28Lti0Kh5RecR5XBkwfUpDzn84IoCIZ8GJTsMw/nThu8FZFc7xFDA4UAt76zhZKrs9A==", "license": "MIT" }, "node_modules/@amplitude/analytics-connector": { "version": "1.6.4", - "resolved": "https://registry.npmjs.org/@amplitude/analytics-connector/-/analytics-connector-1.6.4.tgz", - "integrity": "sha512-SpIv0IQMNIq6SH3UqFGiaZyGSc7PBZwRdq7lvP0pBxW8i4Ny+8zwI0pV+VMfMHQwWY3wdIbWw5WQphNjpdq1/Q==", "license": "MIT" }, "node_modules/@amplitude/analytics-core": { "version": "2.45.0", - "resolved": "https://registry.npmjs.org/@amplitude/analytics-core/-/analytics-core-2.45.0.tgz", - "integrity": "sha512-vWRYbXu2Grs1GM+WHo03RPtbaPs5sJm21YQcAow9JASvtoY4xNqItIeRydCJQWtFHhbbxY41n+CVW6mzDP6aBA==", "license": "MIT", "dependencies": { "@amplitude/analytics-connector": "^1.6.4", @@ -890,8 +780,6 @@ }, "node_modules/@amplitude/analytics-node": { "version": "1.5.53", - "resolved": "https://registry.npmjs.org/@amplitude/analytics-node/-/analytics-node-1.5.53.tgz", - "integrity": "sha512-nNK+4XLTPuK/WrSm3kX6KWXjK+mc88nN+G4ebU011k+NyjRTIAhV3rH9BhDrdJl0L34aF56etyeblHdAxkHcCw==", "license": "MIT", "dependencies": { "@amplitude/analytics-core": "2.45.0", @@ -900,14 +788,10 @@ }, "node_modules/@amplitude/analytics-types": { "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@amplitude/analytics-types/-/analytics-types-1.4.0.tgz", - "integrity": "sha512-RiMPHBqdrJ8ktTqG+Wzj2htnN/PCG9jGZG0SXtTFnWwVvcAJYbYm55/nrP1TTyrx1OlLhvF2VG3lVUP/xGAU8w==", "license": "MIT" }, "node_modules/@amplitude/engagement-browser": { "version": "1.0.8", - "resolved": "https://registry.npmjs.org/@amplitude/engagement-browser/-/engagement-browser-1.0.8.tgz", - "integrity": "sha512-nSkHOlA6R6lfj51X4beC7lbR/wfJ3zCMwfXGe6M/8WHw8NtanLW0hkXhH+mDLUCA1xMLBbwO4VZOEPwjdFXubQ==", "license": "MIT", "dependencies": { "@amplitude/analytics-types": "^1.0.0" @@ -915,8 +799,6 @@ }, "node_modules/@amplitude/experiment-core": { "version": "0.12.0", - "resolved": "https://registry.npmjs.org/@amplitude/experiment-core/-/experiment-core-0.12.0.tgz", - "integrity": "sha512-EiLLxcyJD8T3GFsMPxBfWx9n9fBw6rC0RJwccPXLzResE0HnGZZpVWF86ZndnYmEMD1lUUjWi41N1ymEzodI5w==", "license": "MIT", "dependencies": { "js-base64": "^3.7.5" @@ -924,8 +806,6 @@ }, "node_modules/@amplitude/experiment-js-client": { "version": "1.20.4", - "resolved": "https://registry.npmjs.org/@amplitude/experiment-js-client/-/experiment-js-client-1.20.4.tgz", - "integrity": "sha512-Gt5N+hjaQUytvutsXnIgJjj9A4/K2sK53hxO5c3JsYH1rrxfZ1o42bSOl1KSET0OSvqUSBKh7pils54Ls1EuGg==", "license": "MIT", "dependencies": { "@amplitude/analytics-connector": "^1.6.4", @@ -937,8 +817,6 @@ }, "node_modules/@amplitude/plugin-autocapture-browser": { "version": "1.25.2", - "resolved": "https://registry.npmjs.org/@amplitude/plugin-autocapture-browser/-/plugin-autocapture-browser-1.25.2.tgz", - "integrity": "sha512-AWzIX0uit60Q742rH/96/n88e+3BaVZa4+7Xs+BeuuIOyrljOZlQKzH23Lxzkl0DgbNb5+MMqWds0pov3DV5TA==", "license": "MIT", "dependencies": { "@amplitude/analytics-core": "2.45.0", @@ -947,8 +825,6 @@ }, "node_modules/@amplitude/plugin-custom-enrichment-browser": { "version": "0.1.4", - "resolved": "https://registry.npmjs.org/@amplitude/plugin-custom-enrichment-browser/-/plugin-custom-enrichment-browser-0.1.4.tgz", - "integrity": "sha512-vxuQocn8YGE2wMLZUmotRG8c6RijoaQAsHKDQEO56CNk3WhSecgSGMnlHcUcOYIzwfXKFj4MxRJS386kdDHV+Q==", "license": "MIT", "dependencies": { "@amplitude/analytics-core": "2.45.0", @@ -957,8 +833,6 @@ }, "node_modules/@amplitude/plugin-experiment-browser": { "version": "1.0.0-beta.23", - "resolved": "https://registry.npmjs.org/@amplitude/plugin-experiment-browser/-/plugin-experiment-browser-1.0.0-beta.23.tgz", - "integrity": "sha512-RnWcbxerbJTOMkI+/5a02mv2nNnf5t4q1EI1h0YzoEHIfOzjWyc+ycVzyzGOHOMqFhZtmRBlrbxlk7quKWQ7xA==", "license": "MIT", "dependencies": { "@amplitude/analytics-core": "2.45.0", @@ -967,8 +841,6 @@ }, "node_modules/@amplitude/plugin-network-capture-browser": { "version": "1.9.13", - "resolved": "https://registry.npmjs.org/@amplitude/plugin-network-capture-browser/-/plugin-network-capture-browser-1.9.13.tgz", - "integrity": "sha512-8uzTQFbP+dvqJX+S39KqKw+EheJW8JCWT/xlXT55vtTU/ZTFeF074QnHFEKUPewpYXpwKXgJky8PDoMk0b46Qw==", "license": "MIT", "dependencies": { "@amplitude/analytics-core": "2.45.0", @@ -977,8 +849,6 @@ }, "node_modules/@amplitude/plugin-page-url-enrichment-browser": { "version": "0.7.5", - "resolved": "https://registry.npmjs.org/@amplitude/plugin-page-url-enrichment-browser/-/plugin-page-url-enrichment-browser-0.7.5.tgz", - "integrity": "sha512-0Q7P5vsue/s92i3zevVDVJf9AiHkbxGdwkB8iV2oWgkXtglzWugwr//qN+muHmXdi1ZWxRjm93CW+jQJVripgw==", "license": "MIT", "dependencies": { "@amplitude/analytics-core": "2.45.0", @@ -987,8 +857,6 @@ }, "node_modules/@amplitude/plugin-page-view-tracking-browser": { "version": "2.9.6", - "resolved": "https://registry.npmjs.org/@amplitude/plugin-page-view-tracking-browser/-/plugin-page-view-tracking-browser-2.9.6.tgz", - "integrity": "sha512-/4lG2lXIB6qbQNf1VYQ5fDOnvInPEtYuOgvmyLfuZ6PvHVFUu4NZtoOVdAcy0R9x76rNyCpRXxdL78p9Ra1ANA==", "license": "MIT", "dependencies": { "@amplitude/analytics-core": "2.45.0", @@ -997,8 +865,6 @@ }, "node_modules/@amplitude/plugin-session-replay-browser": { "version": "1.27.7", - "resolved": "https://registry.npmjs.org/@amplitude/plugin-session-replay-browser/-/plugin-session-replay-browser-1.27.7.tgz", - "integrity": "sha512-KcGMFaBGqZAOm1Gdzio9d95IL3Nmp5J1xOu1PD0NAPYLfW1MyoyA5PFIIlMqqVf1DoCjmgqP7AY4swetU2tpWg==", "license": "MIT", "dependencies": { "@amplitude/analytics-client-common": "2.4.43", @@ -1013,14 +879,10 @@ }, "node_modules/@amplitude/plugin-session-replay-browser/node_modules/@amplitude/analytics-types": { "version": "2.11.1", - "resolved": "https://registry.npmjs.org/@amplitude/analytics-types/-/analytics-types-2.11.1.tgz", - "integrity": "sha512-wFEgb0t99ly2uJKm5oZ28Lti0Kh5RecR5XBkwfUpDzn84IoCIZ8GJTsMw/nThu8FZFc7xFDA4UAt76zhZKrs9A==", "license": "MIT" }, "node_modules/@amplitude/plugin-web-vitals-browser": { "version": "1.1.28", - "resolved": "https://registry.npmjs.org/@amplitude/plugin-web-vitals-browser/-/plugin-web-vitals-browser-1.1.28.tgz", - "integrity": "sha512-gs4Y1eOuVUEDwYEJF82f/GmgQ7iM4Y/eZTkftJKjFsBNbrPro2CuLymfdAcC+QuVfyrp3qAiWcSGnjDXA6ZbQg==", "license": "MIT", "dependencies": { "@amplitude/analytics-core": "2.45.0", @@ -1030,8 +892,6 @@ }, "node_modules/@amplitude/rrdom": { "version": "2.0.0-alpha.39", - "resolved": "https://registry.npmjs.org/@amplitude/rrdom/-/rrdom-2.0.0-alpha.39.tgz", - "integrity": "sha512-XEbowsOygks3zLYa9BbDnboy+GXTDLcPffLocurkJv84k2WUrhmas3RtY+VpGY8N26PoKP2Ev6KuCp8KTV0Igw==", "license": "MIT", "dependencies": { "@amplitude/rrweb-snapshot": "^2.0.0-alpha.39" @@ -1039,8 +899,6 @@ }, "node_modules/@amplitude/rrweb": { "version": "2.0.0-alpha.39", - "resolved": "https://registry.npmjs.org/@amplitude/rrweb/-/rrweb-2.0.0-alpha.39.tgz", - "integrity": "sha512-DKj6iwNTip8+ltU/unrIqr9qBzPv21SqKCwI7CgnAZYm1d31TD/Y+R8iXdu6pLnXNhreeBrSbO8fJ9xNLmsxjw==", "license": "MIT", "dependencies": { "@amplitude/rrdom": "^2.0.0-alpha.39", @@ -1055,8 +913,6 @@ }, "node_modules/@amplitude/rrweb-packer": { "version": "2.0.0-alpha.36", - "resolved": "https://registry.npmjs.org/@amplitude/rrweb-packer/-/rrweb-packer-2.0.0-alpha.36.tgz", - "integrity": "sha512-kqKg6OGoxHZvG4jwyO4kIjLdf8MkL6JcY5iLB09PQNP7O36ysnrH+ecJfa4V1Rld99kX25Pefkw4bzKmmFAqcg==", "license": "MIT", "dependencies": { "@amplitude/rrweb-types": "^2.0.0-alpha.36", @@ -1065,8 +921,6 @@ }, "node_modules/@amplitude/rrweb-plugin-console-record": { "version": "2.0.0-alpha.36", - "resolved": "https://registry.npmjs.org/@amplitude/rrweb-plugin-console-record/-/rrweb-plugin-console-record-2.0.0-alpha.36.tgz", - "integrity": "sha512-7VbXu36PpJA8dSOFxpfpMaoDTuPK5uy1C8mN+Wfdm0X4ROdmrvcTdlQj+jGzhLGeK+xbTixHEy23itCNUau7hQ==", "license": "MIT", "peerDependencies": { "@amplitude/rrweb": "^2.0.0-alpha.36" @@ -1074,8 +928,6 @@ }, "node_modules/@amplitude/rrweb-record": { "version": "2.0.0-alpha.36", - "resolved": "https://registry.npmjs.org/@amplitude/rrweb-record/-/rrweb-record-2.0.0-alpha.36.tgz", - "integrity": "sha512-zSHvmG5NUG4jNgWNVM7Oj3+rJPagv+TiHlnSiJ1X0WWLIg1GbUnOoTqpincZS5QupqTxQchNQaUg9MNu0MM3sQ==", "license": "MIT", "dependencies": { "@amplitude/rrweb": "^2.0.0-alpha.36", @@ -1084,8 +936,6 @@ }, "node_modules/@amplitude/rrweb-snapshot": { "version": "2.0.0-alpha.39", - "resolved": "https://registry.npmjs.org/@amplitude/rrweb-snapshot/-/rrweb-snapshot-2.0.0-alpha.39.tgz", - "integrity": "sha512-dBli0V4yVG2ZV+PhgB2mGbLrcSxfyhtQf3jxvYlQFAR55/9DtyIVi4ohX9Sf1TOA30AqySA/xON03FNeRis4PA==", "license": "MIT", "dependencies": { "postcss": "^8.4.38" @@ -1093,20 +943,14 @@ }, "node_modules/@amplitude/rrweb-types": { "version": "2.0.0-alpha.39", - "resolved": "https://registry.npmjs.org/@amplitude/rrweb-types/-/rrweb-types-2.0.0-alpha.39.tgz", - "integrity": "sha512-iyDOcpKH5Vf64YtzC24Ele3zL+DygFoKN4eSl2X4ckZQYKp4ORfSyU7oPmKvuKhjokcheH6fGfVENcXSh04G/A==", "license": "MIT" }, "node_modules/@amplitude/rrweb-utils": { "version": "2.0.0-alpha.39", - "resolved": "https://registry.npmjs.org/@amplitude/rrweb-utils/-/rrweb-utils-2.0.0-alpha.39.tgz", - "integrity": "sha512-5d3Z6FGSklOqx/VYy3CMTh18D8/oXiecPkMfaXCoxE/T5Ud9Iml8SMERHM+nxxrZZ1ngSh9W/nlDo6Iijzy+cg==", "license": "MIT" }, "node_modules/@amplitude/session-replay-browser": { "version": "1.36.0", - "resolved": "https://registry.npmjs.org/@amplitude/session-replay-browser/-/session-replay-browser-1.36.0.tgz", - "integrity": "sha512-HZpNRMRAiLbzGF84DzF+ZH5WztJH4tVe2e/FzYJ2r27Sgf2gftCmzCB9pN8BXXcHKYtQK8/Qol+PTmSIzvyvEw==", "license": "MIT", "dependencies": { "@amplitude/analytics-client-common": "2.4.43", @@ -1126,14 +970,10 @@ }, "node_modules/@amplitude/session-replay-browser/node_modules/@amplitude/analytics-types": { "version": "2.11.1", - "resolved": "https://registry.npmjs.org/@amplitude/analytics-types/-/analytics-types-2.11.1.tgz", - "integrity": "sha512-wFEgb0t99ly2uJKm5oZ28Lti0Kh5RecR5XBkwfUpDzn84IoCIZ8GJTsMw/nThu8FZFc7xFDA4UAt76zhZKrs9A==", "license": "MIT" }, "node_modules/@amplitude/session-replay-browser/node_modules/@amplitude/experiment-core": { "version": "0.7.2", - "resolved": "https://registry.npmjs.org/@amplitude/experiment-core/-/experiment-core-0.7.2.tgz", - "integrity": "sha512-Wc2NWvgQ+bLJLeF0A9wBSPIaw0XuqqgkPKsoNFQrmS7r5Djd56um75In05tqmVntPJZRvGKU46pAp8o5tdf4mA==", "license": "MIT", "dependencies": { "js-base64": "^3.7.5" @@ -1141,20 +981,14 @@ }, "node_modules/@amplitude/session-replay-browser/node_modules/@amplitude/rrweb-types": { "version": "2.0.0-alpha.36", - "resolved": "https://registry.npmjs.org/@amplitude/rrweb-types/-/rrweb-types-2.0.0-alpha.36.tgz", - "integrity": "sha512-Bd2r3Bs0XIJt5fgPRWVl8bhvA9FCjJn8vQlDTO8ffPxilGPIzUXLQ06+xoLYkK9v+PDKJnCapOTL4A2LilDmgA==", "license": "MIT" }, "node_modules/@amplitude/session-replay-browser/node_modules/@amplitude/rrweb-utils": { "version": "2.0.0-alpha.36", - "resolved": "https://registry.npmjs.org/@amplitude/rrweb-utils/-/rrweb-utils-2.0.0-alpha.36.tgz", - "integrity": "sha512-w5RGROLU1Kyrq9j+trxcvvfkTp05MEKJ70Ig+YvHyZsE0nElh1PCF8PHAjV0/kji68+KqB03c0hoyaV99CDaDw==", "license": "MIT" }, "node_modules/@amplitude/targeting": { "version": "0.2.0", - "resolved": "https://registry.npmjs.org/@amplitude/targeting/-/targeting-0.2.0.tgz", - "integrity": "sha512-/50ywTrC4hfcfJVBbh5DFbqMPPfaIOivZeb5Gb+OGM03QrA+lsUqdvtnKLNuWtceD4H6QQ2KFzPJ5aAJLyzVDA==", "license": "MIT", "dependencies": { "@amplitude/analytics-client-common": ">=1 <3", @@ -1167,8 +1001,6 @@ }, "node_modules/@amplitude/targeting/node_modules/@amplitude/experiment-core": { "version": "0.7.2", - "resolved": "https://registry.npmjs.org/@amplitude/experiment-core/-/experiment-core-0.7.2.tgz", - "integrity": "sha512-Wc2NWvgQ+bLJLeF0A9wBSPIaw0XuqqgkPKsoNFQrmS7r5Djd56um75In05tqmVntPJZRvGKU46pAp8o5tdf4mA==", "license": "MIT", "dependencies": { "js-base64": "^3.7.5" @@ -1176,8 +1008,6 @@ }, "node_modules/@amplitude/ua-parser-js": { "version": "0.7.33", - "resolved": "https://registry.npmjs.org/@amplitude/ua-parser-js/-/ua-parser-js-0.7.33.tgz", - "integrity": "sha512-wKEtVR4vXuPT9cVEIJkYWnlF++Gx3BdLatPBM+SZ1ztVIvnhdGBZR/mn9x/PzyrMcRlZmyi6L56I2J3doVBnjA==", "funding": [ { "type": "opencollective", @@ -1195,8 +1025,6 @@ }, "node_modules/@amplitude/unified": { "version": "1.0.16", - "resolved": "https://registry.npmjs.org/@amplitude/unified/-/unified-1.0.16.tgz", - "integrity": "sha512-qvjSfswXmLj+OfLVr3806zYsiBJSCyMYXYCYxF1cBwqZLGPOEnwMHJ2+dVi2sy4XpzmsWfDMWNbPEaVRRRs9bw==", "license": "MIT", "dependencies": { "@amplitude/analytics-browser": "2.39.0", @@ -1208,8 +1036,6 @@ }, "node_modules/@antfu/install-pkg": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@antfu/install-pkg/-/install-pkg-1.1.0.tgz", - "integrity": "sha512-MGQsmw10ZyI+EJo45CdSER4zEb+p31LpDAFp2Z3gkSd1yqVZGi0Ebx++YTEMonJy4oChEMLsxZ64j8FH6sSqtQ==", "license": "MIT", "dependencies": { "package-manager-detector": "^1.3.0", @@ -1221,14 +1047,10 @@ }, "node_modules/@antfu/install-pkg/node_modules/package-manager-detector": { "version": "1.6.0", - "resolved": "https://registry.npmjs.org/package-manager-detector/-/package-manager-detector-1.6.0.tgz", - "integrity": "sha512-61A5ThoTiDG/C8s8UMZwSorAGwMJ0ERVGj2OjoW5pAalsNOg15+iQiPzrLJ4jhZ1HJzmC2PIHT2oEiH3R5fzNA==", "license": "MIT" }, "node_modules/@asamuzakjp/css-color": { "version": "3.2.0", - "resolved": "https://registry.npmjs.org/@asamuzakjp/css-color/-/css-color-3.2.0.tgz", - "integrity": "sha512-K1A6z8tS3XsmCMM86xoWdn7Fkdn9m6RSVtocUrJYIwZnFVkng/PvkEoWtOWmP+Scc6saYWHWZYbndEEXxl24jw==", "license": "MIT", "dependencies": { "@csstools/css-calc": "^2.1.3", @@ -1240,14 +1062,10 @@ }, "node_modules/@asamuzakjp/css-color/node_modules/lru-cache": { "version": "10.4.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", - "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", "license": "ISC" }, "node_modules/@auto-it/bot-list": { "version": "11.3.6", - "resolved": "https://registry.npmjs.org/@auto-it/bot-list/-/bot-list-11.3.6.tgz", - "integrity": "sha512-BtFOhGv+V47TAYr77uiFz0l807g655Wcui/1KOJpqUYvF07MjG3+D8Ob4sMl8ewDQfgtAMTJKJF3S7AUdKPQng==", "dev": true, "license": "MIT", "engines": { @@ -1256,8 +1074,6 @@ }, "node_modules/@auto-it/core": { "version": "11.3.6", - "resolved": "https://registry.npmjs.org/@auto-it/core/-/core-11.3.6.tgz", - "integrity": "sha512-OE7feN8pbpcSCiWaOHYah+oXsinhJ6OfDrsLyPywNSfEPjal4q18ss2iQX1zTmrFIEjDSmptdjqlmwx+dm/8wQ==", "dev": true, "license": "MIT", "dependencies": { @@ -1313,8 +1129,6 @@ }, "node_modules/@auto-it/core/node_modules/ansi-styles": { "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "license": "MIT", "dependencies": { @@ -1329,8 +1143,6 @@ }, "node_modules/@auto-it/core/node_modules/chalk": { "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "license": "MIT", "dependencies": { @@ -1346,8 +1158,6 @@ }, "node_modules/@auto-it/core/node_modules/cosmiconfig": { "version": "7.0.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.0.tgz", - "integrity": "sha512-pondGvTuVYDk++upghXJabWzL6Kxu6f26ljFw64Swq9v6sQPUL3EUlVDV56diOjpCayKihL6hVe8exIACU4XcA==", "dev": true, "license": "MIT", "dependencies": { @@ -1363,15 +1173,11 @@ }, "node_modules/@auto-it/core/node_modules/tslib": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.1.0.tgz", - "integrity": "sha512-hcVC3wYEziELGGmEEXue7D75zbwIIVUMWAVbHItGPx0ziyXxrOMQx4rQEVEV45Ut/1IotuEvwqPopzIOkDMf0A==", "dev": true, "license": "0BSD" }, "node_modules/@auto-it/core/node_modules/yaml": { "version": "1.10.2", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", - "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", "dev": true, "license": "ISC", "engines": { @@ -1380,8 +1186,6 @@ }, "node_modules/@auto-it/npm": { "version": "11.3.6", - "resolved": "https://registry.npmjs.org/@auto-it/npm/-/npm-11.3.6.tgz", - "integrity": "sha512-yKYvlBcIRIOlFLJFpAq2ipdGihqyxAf5KZ9YeDxF/xN54XUV5A5kQqohSpAckxpWKBwxPIKODdLyY5Y0Tm0qfQ==", "dev": true, "license": "MIT", "dependencies": { @@ -1403,15 +1207,11 @@ }, "node_modules/@auto-it/npm/node_modules/tslib": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.1.0.tgz", - "integrity": "sha512-hcVC3wYEziELGGmEEXue7D75zbwIIVUMWAVbHItGPx0ziyXxrOMQx4rQEVEV45Ut/1IotuEvwqPopzIOkDMf0A==", "dev": true, "license": "0BSD" }, "node_modules/@auto-it/package-json-utils": { "version": "11.3.6", - "resolved": "https://registry.npmjs.org/@auto-it/package-json-utils/-/package-json-utils-11.3.6.tgz", - "integrity": "sha512-j1GT9alk4kJoyyuAxqqHD7okHQjJuJXeAMTMRt4ZpjDjElPuPbxvzjM+QZNuxaMTyjxRoT2YbFyx0uIt7pqXlQ==", "dev": true, "license": "MIT", "dependencies": { @@ -1424,8 +1224,6 @@ }, "node_modules/@auto-it/released": { "version": "11.3.6", - "resolved": "https://registry.npmjs.org/@auto-it/released/-/released-11.3.6.tgz", - "integrity": "sha512-mhe1QjEylUjONE24LUij3A0BCXvadABhbyPS+Jxq6hFS5Rh/gkOmxSuCa1HpO6DSsVdM0gOSF8ZYhUJ/9vHT8A==", "dev": true, "license": "MIT", "dependencies": { @@ -1439,15 +1237,11 @@ }, "node_modules/@auto-it/released/node_modules/tslib": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.1.0.tgz", - "integrity": "sha512-hcVC3wYEziELGGmEEXue7D75zbwIIVUMWAVbHItGPx0ziyXxrOMQx4rQEVEV45Ut/1IotuEvwqPopzIOkDMf0A==", "dev": true, "license": "0BSD" }, "node_modules/@auto-it/version-file": { "version": "11.3.6", - "resolved": "https://registry.npmjs.org/@auto-it/version-file/-/version-file-11.3.6.tgz", - "integrity": "sha512-dtf2T02ryIdX1GWQ9jeLW7EQj1IOBNFQX4BGS2uAddjszsd65hYNoRFMzQ+T/tr7j5Fn9RDaxXLamwYfaSPn9Q==", "dev": true, "license": "MIT", "dependencies": { @@ -1460,15 +1254,11 @@ }, "node_modules/@auto-it/version-file/node_modules/tslib": { "version": "1.10.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.10.0.tgz", - "integrity": "sha512-qOebF53frne81cf0S9B41ByenJ3/IuH8yJKngAX35CmiZySA0khhkovshKK+jGCaMnVomla7gVlIcc3EvKPbTQ==", "dev": true, "license": "Apache-2.0" }, "node_modules/@aws-crypto/sha256-browser": { "version": "5.2.0", - "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-browser/-/sha256-browser-5.2.0.tgz", - "integrity": "sha512-AXfN/lGotSQwu6HNcEsIASo7kWXZ5HYWvfOmSNKDsEqC4OashTp8alTmaz+F7TC2L083SFv5RdB+qU3Vs1kZqw==", "license": "Apache-2.0", "dependencies": { "@aws-crypto/sha256-js": "^5.2.0", @@ -1482,8 +1272,6 @@ }, "node_modules/@aws-crypto/sha256-browser/node_modules/@smithy/is-array-buffer": { "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-2.2.0.tgz", - "integrity": "sha512-GGP3O9QFD24uGeAXYUjwSTXARoqpZykHadOmA8G5vfJPK0/DC67qa//0qvqrJzL1xc8WQWX7/yc7fwudjPHPhA==", "license": "Apache-2.0", "dependencies": { "tslib": "^2.6.2" @@ -1494,8 +1282,6 @@ }, "node_modules/@aws-crypto/sha256-browser/node_modules/@smithy/util-buffer-from": { "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-2.2.0.tgz", - "integrity": "sha512-IJdWBbTcMQ6DA0gdNhh/BwrLkDR+ADW5Kr1aZmd4k3DIF6ezMV4R2NIAmT08wQJ3yUK82thHWmC/TnK/wpMMIA==", "license": "Apache-2.0", "dependencies": { "@smithy/is-array-buffer": "^2.2.0", @@ -1507,8 +1293,6 @@ }, "node_modules/@aws-crypto/sha256-browser/node_modules/@smithy/util-utf8": { "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-2.3.0.tgz", - "integrity": "sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A==", "license": "Apache-2.0", "dependencies": { "@smithy/util-buffer-from": "^2.2.0", @@ -1520,8 +1304,6 @@ }, "node_modules/@aws-crypto/sha256-js": { "version": "5.2.0", - "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-js/-/sha256-js-5.2.0.tgz", - "integrity": "sha512-FFQQyu7edu4ufvIZ+OadFpHHOt+eSTBaYaki44c+akjg7qZg9oOQeLlk77F6tSYqjDAFClrHJk9tMf0HdVyOvA==", "license": "Apache-2.0", "dependencies": { "@aws-crypto/util": "^5.2.0", @@ -1534,8 +1316,6 @@ }, "node_modules/@aws-crypto/supports-web-crypto": { "version": "5.2.0", - "resolved": "https://registry.npmjs.org/@aws-crypto/supports-web-crypto/-/supports-web-crypto-5.2.0.tgz", - "integrity": "sha512-iAvUotm021kM33eCdNfwIN//F77/IADDSs58i+MDaOqFrVjZo9bAal0NK7HurRuWLLpF1iLX7gbWrjHjeo+YFg==", "license": "Apache-2.0", "dependencies": { "tslib": "^2.6.2" @@ -1543,8 +1323,6 @@ }, "node_modules/@aws-crypto/util": { "version": "5.2.0", - "resolved": "https://registry.npmjs.org/@aws-crypto/util/-/util-5.2.0.tgz", - "integrity": "sha512-4RkU9EsI6ZpBve5fseQlGNUWKMa1RLPQ1dnjnQoe07ldfIzcsGb5hC5W0Dm7u423KWzawlrpbjXBrXCEv9zazQ==", "license": "Apache-2.0", "dependencies": { "@aws-sdk/types": "^3.222.0", @@ -1554,8 +1332,6 @@ }, "node_modules/@aws-crypto/util/node_modules/@smithy/is-array-buffer": { "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-2.2.0.tgz", - "integrity": "sha512-GGP3O9QFD24uGeAXYUjwSTXARoqpZykHadOmA8G5vfJPK0/DC67qa//0qvqrJzL1xc8WQWX7/yc7fwudjPHPhA==", "license": "Apache-2.0", "dependencies": { "tslib": "^2.6.2" @@ -1566,8 +1342,6 @@ }, "node_modules/@aws-crypto/util/node_modules/@smithy/util-buffer-from": { "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-2.2.0.tgz", - "integrity": "sha512-IJdWBbTcMQ6DA0gdNhh/BwrLkDR+ADW5Kr1aZmd4k3DIF6ezMV4R2NIAmT08wQJ3yUK82thHWmC/TnK/wpMMIA==", "license": "Apache-2.0", "dependencies": { "@smithy/is-array-buffer": "^2.2.0", @@ -1579,8 +1353,6 @@ }, "node_modules/@aws-crypto/util/node_modules/@smithy/util-utf8": { "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-2.3.0.tgz", - "integrity": "sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A==", "license": "Apache-2.0", "dependencies": { "@smithy/util-buffer-from": "^2.2.0", @@ -1592,8 +1364,6 @@ }, "node_modules/@aws-sdk/client-firehose": { "version": "3.1000.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-firehose/-/client-firehose-3.1000.0.tgz", - "integrity": "sha512-gI+t96pb6XzM1ZWHsxwpSGoWf5Urg1jdZDerF4666ZWnarMzwi8d5EcWdflSCZEF2QSAVdcZ6wykMOivLqaNQA==", "license": "Apache-2.0", "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", @@ -1642,8 +1412,6 @@ }, "node_modules/@aws-sdk/client-sns": { "version": "3.1045.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sns/-/client-sns-3.1045.0.tgz", - "integrity": "sha512-w/iwPYVAXx62dD2E5nBQaUOntlYWCjaIPXGZpdC6+WWF/idTPjN3qu5Q0KgcrP6zQDGCgtAVaLlLVaK36/5x7A==", "license": "Apache-2.0", "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", @@ -1692,8 +1460,6 @@ }, "node_modules/@aws-sdk/client-sqs": { "version": "3.1045.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sqs/-/client-sqs-3.1045.0.tgz", - "integrity": "sha512-reWeEE53mgCv8uUFSicvVf0A6BoWGImdC4y5x5clkeEmfIikahIBtons6u0d32kwI4NczpcretpUkOCE/nvWAA==", "license": "Apache-2.0", "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", @@ -1744,8 +1510,6 @@ }, "node_modules/@aws-sdk/client-sts": { "version": "3.1045.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.1045.0.tgz", - "integrity": "sha512-oDJJ7rM1osvfBdfZuhQ5DM6lHD9iuypL9m2LsEiA/lB8xuE5uPYsftNDcS0J9VRXFSvYTqC14K7Y5vMMKMg0vw==", "license": "Apache-2.0", "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", @@ -1795,8 +1559,6 @@ }, "node_modules/@aws-sdk/core": { "version": "3.974.8", - "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.974.8.tgz", - "integrity": "sha512-njR2qoG6ZuB0kvAS2FyICsFZJ6gmCcf2X/7JcD14sUvGDm26wiZ5BrA6LOiUxKFEF+IVe7kdroxyE00YlkiYsw==", "license": "Apache-2.0", "dependencies": { "@aws-sdk/types": "^3.973.8", @@ -1820,8 +1582,6 @@ }, "node_modules/@aws-sdk/credential-provider-env": { "version": "3.972.34", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.972.34.tgz", - "integrity": "sha512-XT0jtf8Fw9JE6ppsQeoNnZRiG+jqRixMT1v1ZR17G60UvVdsQmTG8nbEyHuEPfMxDXEhfdARaM/XiEhca4lGHQ==", "license": "Apache-2.0", "dependencies": { "@aws-sdk/core": "^3.974.8", @@ -1836,8 +1596,6 @@ }, "node_modules/@aws-sdk/credential-provider-http": { "version": "3.972.36", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-http/-/credential-provider-http-3.972.36.tgz", - "integrity": "sha512-DPoGWfy7J7RKxvbf5kOKIGQkD2ek3dbKgzKIGrnLuvZBz5myU+Im/H6pmc14QcnFbqHMqxvtWSgRDSJW3qXLQg==", "license": "Apache-2.0", "dependencies": { "@aws-sdk/core": "^3.974.8", @@ -1857,8 +1615,6 @@ }, "node_modules/@aws-sdk/credential-provider-ini": { "version": "3.972.38", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.972.38.tgz", - "integrity": "sha512-oDzUBu2MGJFgoar05sPMCwSrhw44ASyccrHzj66vO69OZqi7I6hZZxXfuPLC8OCzW7C+sU+bI73XHij41yekgQ==", "license": "Apache-2.0", "dependencies": { "@aws-sdk/core": "^3.974.8", @@ -1882,8 +1638,6 @@ }, "node_modules/@aws-sdk/credential-provider-login": { "version": "3.972.38", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-login/-/credential-provider-login-3.972.38.tgz", - "integrity": "sha512-g1NosS8qe4OF++G2UFCM5ovSkgipC7YYor5KCWatG0UoMSO5YFj9C8muePlyVmOBV/WTI16Jo3/s1NUo/o1Bww==", "license": "Apache-2.0", "dependencies": { "@aws-sdk/core": "^3.974.8", @@ -1901,8 +1655,6 @@ }, "node_modules/@aws-sdk/credential-provider-node": { "version": "3.972.39", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.972.39.tgz", - "integrity": "sha512-HEswDQyxUtadoZ/bJsPPENHg7R0Lzym5LuMksJeHvqhCOpP+rtkDLKI4/ZChH4w3cf5kG8n6bZuI8PzajoiqMg==", "license": "Apache-2.0", "dependencies": { "@aws-sdk/credential-provider-env": "^3.972.34", @@ -1924,8 +1676,6 @@ }, "node_modules/@aws-sdk/credential-provider-process": { "version": "3.972.34", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.972.34.tgz", - "integrity": "sha512-T3IFs4EVmVi1dVN5RciFnklCANSzvrQd/VuHY9ThHSQmYkTogjcGkoJEr+oNUPQZnso52183088NqysMPji1/Q==", "license": "Apache-2.0", "dependencies": { "@aws-sdk/core": "^3.974.8", @@ -1941,8 +1691,6 @@ }, "node_modules/@aws-sdk/credential-provider-sso": { "version": "3.972.38", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.972.38.tgz", - "integrity": "sha512-5ZxG+t0+3Q3QPh8KEjX6syskhgNf7I0MN7oGioTf6Lm1NTjfP7sIcYGNsthXC2qR8vcD3edNZwCr2ovfSSWuRA==", "license": "Apache-2.0", "dependencies": { "@aws-sdk/core": "^3.974.8", @@ -1960,8 +1708,6 @@ }, "node_modules/@aws-sdk/credential-provider-web-identity": { "version": "3.972.38", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.972.38.tgz", - "integrity": "sha512-lYHFF30DGI20jZcYX8cm6Ns0V7f1dDN6g/MBDLTyD/5iw+bXs3yBr2iAiHDkx4RFU5JgsnZvCHYKiRVPRdmOgw==", "license": "Apache-2.0", "dependencies": { "@aws-sdk/core": "^3.974.8", @@ -1978,8 +1724,6 @@ }, "node_modules/@aws-sdk/middleware-host-header": { "version": "3.972.10", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.972.10.tgz", - "integrity": "sha512-IJSsIMeVQ8MMCPbuh1AbltkFhLBLXn7aejzfX5YKT/VLDHn++Dcz8886tXckE+wQssyPUhaXrJhdakO2VilRhg==", "license": "Apache-2.0", "dependencies": { "@aws-sdk/types": "^3.973.8", @@ -1993,8 +1737,6 @@ }, "node_modules/@aws-sdk/middleware-logger": { "version": "3.972.10", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.972.10.tgz", - "integrity": "sha512-OOuGvvz1Dm20SjZo5oEBePFqxt5nf8AwkNDSyUHvD9/bfNASmstcYxFAHUowy4n6Io7mWUZ04JURZwSBvyQanQ==", "license": "Apache-2.0", "dependencies": { "@aws-sdk/types": "^3.973.8", @@ -2007,8 +1749,6 @@ }, "node_modules/@aws-sdk/middleware-recursion-detection": { "version": "3.972.11", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.972.11.tgz", - "integrity": "sha512-+zz6f79Kj9V5qFK2P+D8Ehjnw4AhphAlCAsPjUqEcInA9umtSSKMrHbSagEeOIsDNuvVrH98bjRHcyQukTrhaQ==", "license": "Apache-2.0", "dependencies": { "@aws-sdk/types": "^3.973.8", @@ -2023,8 +1763,6 @@ }, "node_modules/@aws-sdk/middleware-sdk-s3": { "version": "3.972.37", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-s3/-/middleware-sdk-s3-3.972.37.tgz", - "integrity": "sha512-Km7M+i8DrLArVzrid1gfxeGhYHBd3uxvE77g0s5a52zPSVosxzQBnJ0gwWb6NIp/DOk8gsBMhi7V+cpJG0ndTA==", "license": "Apache-2.0", "dependencies": { "@aws-sdk/core": "^3.974.8", @@ -2048,8 +1786,6 @@ }, "node_modules/@aws-sdk/middleware-sdk-sqs": { "version": "3.972.22", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-sqs/-/middleware-sdk-sqs-3.972.22.tgz", - "integrity": "sha512-DtR3mEiOUJcnEX/QuXmvbJto6xvQzp2ftnHb29c0aQYdmmzbKf0gsu9ovx1i/yy4ZR6m0rttTucS0iiP32dlGA==", "license": "Apache-2.0", "dependencies": { "@aws-sdk/types": "^3.973.8", @@ -2065,8 +1801,6 @@ }, "node_modules/@aws-sdk/middleware-user-agent": { "version": "3.972.38", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.972.38.tgz", - "integrity": "sha512-iz+B29TXcAZsJpwB+AwG/TTGA5l/VnmMZ2UxtiySOZjI6gCdmviXPwdgzcmuazMy16rXoPY4mYCGe7zdNKfx5A==", "license": "Apache-2.0", "dependencies": { "@aws-sdk/core": "^3.974.8", @@ -2084,8 +1818,6 @@ }, "node_modules/@aws-sdk/nested-clients": { "version": "3.997.6", - "resolved": "https://registry.npmjs.org/@aws-sdk/nested-clients/-/nested-clients-3.997.6.tgz", - "integrity": "sha512-WBDnqatJl+kGObpfmfSxqnXeYTu3Me8wx8WCtvoxX3pfWrrTv8I4WTMSSs7PZqcRcVh8WeUKMgGFjMG+52SR1w==", "license": "Apache-2.0", "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", @@ -2134,8 +1866,6 @@ }, "node_modules/@aws-sdk/region-config-resolver": { "version": "3.972.13", - "resolved": "https://registry.npmjs.org/@aws-sdk/region-config-resolver/-/region-config-resolver-3.972.13.tgz", - "integrity": "sha512-CvJ2ZIjK/jVD/lbOpowBVElJyC1YxLTIJ13yM0AEo0t2v7swOzGjSA6lJGH+DwZXQhcjUjoYwc8bVYCX5MDr1A==", "license": "Apache-2.0", "dependencies": { "@aws-sdk/types": "^3.973.8", @@ -2150,8 +1880,6 @@ }, "node_modules/@aws-sdk/signature-v4-multi-region": { "version": "3.996.25", - "resolved": "https://registry.npmjs.org/@aws-sdk/signature-v4-multi-region/-/signature-v4-multi-region-3.996.25.tgz", - "integrity": "sha512-+CMIt3e1VzlklAECmG+DtP1sV8iKq25FuA0OKpnJ4KA0kxUtd7CgClY7/RU6VzJBQwbN4EJ9Ue6plvqx1qGadw==", "license": "Apache-2.0", "dependencies": { "@aws-sdk/middleware-sdk-s3": "^3.972.37", @@ -2167,8 +1895,6 @@ }, "node_modules/@aws-sdk/token-providers": { "version": "3.1041.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.1041.0.tgz", - "integrity": "sha512-Th7kPI6YPtvJUcdznooXJMy+9rQWjmEF81LxaJssngBzuysK4a/x+l8kjm1zb7nYsUPbndnBdUnwng/3PLvtGw==", "license": "Apache-2.0", "dependencies": { "@aws-sdk/core": "^3.974.8", @@ -2185,8 +1911,6 @@ }, "node_modules/@aws-sdk/types": { "version": "3.973.8", - "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.973.8.tgz", - "integrity": "sha512-gjlAdtHMbtR9X5iIhVUvbVcy55KnznpC6bkDUWW9z915bi0ckdUr5cjf16Kp6xq0bP5HBD2xzgbL9F9Quv5vUw==", "license": "Apache-2.0", "dependencies": { "@smithy/types": "^4.14.1", @@ -2198,8 +1922,6 @@ }, "node_modules/@aws-sdk/util-arn-parser": { "version": "3.972.3", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-arn-parser/-/util-arn-parser-3.972.3.tgz", - "integrity": "sha512-HzSD8PMFrvgi2Kserxuff5VitNq2sgf3w9qxmskKDiDTThWfVteJxuCS9JXiPIPtmCrp+7N9asfIaVhBFORllA==", "license": "Apache-2.0", "dependencies": { "tslib": "^2.6.2" @@ -2210,8 +1932,6 @@ }, "node_modules/@aws-sdk/util-endpoints": { "version": "3.996.8", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.996.8.tgz", - "integrity": "sha512-oOZHcRDihk5iEe5V25NVWg45b3qEA8OpHWVdU/XQh8Zj4heVPAJqWvMphQnU7LkufmUo10EpvFPZuQMiFLJK3g==", "license": "Apache-2.0", "dependencies": { "@aws-sdk/types": "^3.973.8", @@ -2226,8 +1946,6 @@ }, "node_modules/@aws-sdk/util-locate-window": { "version": "3.965.4", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-locate-window/-/util-locate-window-3.965.4.tgz", - "integrity": "sha512-H1onv5SkgPBK2P6JR2MjGgbOnttoNzSPIRoeZTNPZYyaplwGg50zS3amXvXqF0/qfXpWEC9rLWU564QTB9bSog==", "license": "Apache-2.0", "dependencies": { "tslib": "^2.6.2" @@ -2238,8 +1956,6 @@ }, "node_modules/@aws-sdk/util-user-agent-browser": { "version": "3.972.10", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.972.10.tgz", - "integrity": "sha512-FAzqXvfEssGdSIz8ejatan0bOdx1qefBWKF/gWmVBXIP1HkS7v/wjjaqrAGGKvyihrXTXW00/2/1nTJtxpXz7g==", "license": "Apache-2.0", "dependencies": { "@aws-sdk/types": "^3.973.8", @@ -2250,8 +1966,6 @@ }, "node_modules/@aws-sdk/util-user-agent-node": { "version": "3.973.24", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.973.24.tgz", - "integrity": "sha512-ZWwlkjcIp7cEL8ZfTpTAPNkwx25p7xol0xlKoWVVf22+nsjwmLcHYtTPjIV1cSpmB/b6DaK4cb1fSkvCXHgRdw==", "license": "Apache-2.0", "dependencies": { "@aws-sdk/middleware-user-agent": "^3.972.38", @@ -2275,8 +1989,6 @@ }, "node_modules/@aws-sdk/xml-builder": { "version": "3.972.22", - "resolved": "https://registry.npmjs.org/@aws-sdk/xml-builder/-/xml-builder-3.972.22.tgz", - "integrity": "sha512-PMYKKtJd70IsSG0yHrdAbxBr+ZWBKLvzFZfD3/urxgf6hXVMzuU5M+3MJ5G67RpOmLBu1fAUN65SbWuKUCOlAA==", "license": "Apache-2.0", "dependencies": { "@nodable/entities": "2.1.0", @@ -2290,8 +2002,6 @@ }, "node_modules/@aws/lambda-invoke-store": { "version": "0.2.3", - "resolved": "https://registry.npmjs.org/@aws/lambda-invoke-store/-/lambda-invoke-store-0.2.3.tgz", - "integrity": "sha512-oLvsaPMTBejkkmHhjf09xTgk71mOqyr/409NKhRIL08If7AhVfUsJhVsx386uJaqNd42v9kWamQ9lFbkoC2dYw==", "license": "Apache-2.0", "engines": { "node": ">=18.0.0" @@ -2299,8 +2009,6 @@ }, "node_modules/@babel/code-frame": { "version": "7.29.0", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.0.tgz", - "integrity": "sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw==", "license": "MIT", "dependencies": { "@babel/helper-validator-identifier": "^7.28.5", @@ -2313,8 +2021,6 @@ }, "node_modules/@babel/compat-data": { "version": "7.29.0", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.29.0.tgz", - "integrity": "sha512-T1NCJqT/j9+cn8fvkt7jtwbLBfLC/1y1c7NtCeXFRgzGTsafi68MRv8yzkYSapBnFA6L3U2VSc02ciDzoAJhJg==", "license": "MIT", "engines": { "node": ">=6.9.0" @@ -2322,8 +2028,6 @@ }, "node_modules/@babel/core": { "version": "7.29.0", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.29.0.tgz", - "integrity": "sha512-CGOfOJqWjg2qW/Mb6zNsDm+u5vFQ8DxXfbM09z69p5Z6+mE1ikP2jUXw+j42Pf1XTYED2Rni5f95npYeuwMDQA==", "license": "MIT", "dependencies": { "@babel/code-frame": "^7.29.0", @@ -2352,8 +2056,6 @@ }, "node_modules/@babel/core/node_modules/semver": { "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "license": "ISC", "bin": { "semver": "bin/semver.js" @@ -2361,8 +2063,6 @@ }, "node_modules/@babel/generator": { "version": "7.29.1", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.1.tgz", - "integrity": "sha512-qsaF+9Qcm2Qv8SRIMMscAvG4O3lJ0F1GuMo5HR/Bp02LopNgnZBC/EkbevHFeGs4ls/oPz9v+Bsmzbkbe+0dUw==", "license": "MIT", "dependencies": { "@babel/parser": "^7.29.0", @@ -2377,8 +2077,6 @@ }, "node_modules/@babel/helper-annotate-as-pure": { "version": "7.27.3", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.27.3.tgz", - "integrity": "sha512-fXSwMQqitTGeHLBC08Eq5yXz2m37E4pJX1qAU1+2cNedz/ifv/bVXft90VeSav5nFO61EcNgwr0aJxbyPaWBPg==", "license": "MIT", "dependencies": { "@babel/types": "^7.27.3" @@ -2389,8 +2087,6 @@ }, "node_modules/@babel/helper-compilation-targets": { "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.28.6.tgz", - "integrity": "sha512-JYtls3hqi15fcx5GaSNL7SCTJ2MNmjrkHXg4FSpOA/grxK8KwyZ5bubHsCq8FXCkua6xhuaaBit+3b7+VZRfcA==", "license": "MIT", "dependencies": { "@babel/compat-data": "^7.28.6", @@ -2405,8 +2101,6 @@ }, "node_modules/@babel/helper-compilation-targets/node_modules/semver": { "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "license": "ISC", "bin": { "semver": "bin/semver.js" @@ -2414,8 +2108,6 @@ }, "node_modules/@babel/helper-create-class-features-plugin": { "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.28.6.tgz", - "integrity": "sha512-dTOdvsjnG3xNT9Y0AUg1wAl38y+4Rl4sf9caSQZOXdNqVn+H+HbbJ4IyyHaIqNR6SW9oJpA/RuRjsjCw2IdIow==", "license": "MIT", "dependencies": { "@babel/helper-annotate-as-pure": "^7.27.3", @@ -2435,8 +2127,6 @@ }, "node_modules/@babel/helper-create-class-features-plugin/node_modules/semver": { "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "license": "ISC", "bin": { "semver": "bin/semver.js" @@ -2444,8 +2134,6 @@ }, "node_modules/@babel/helper-create-regexp-features-plugin": { "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.28.5.tgz", - "integrity": "sha512-N1EhvLtHzOvj7QQOUCCS3NrPJP8c5W6ZXCHDn7Yialuy1iu4r5EmIYkXlKNqT99Ciw+W0mDqWoR6HWMZlFP3hw==", "license": "MIT", "dependencies": { "@babel/helper-annotate-as-pure": "^7.27.3", @@ -2461,8 +2149,6 @@ }, "node_modules/@babel/helper-create-regexp-features-plugin/node_modules/semver": { "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "license": "ISC", "bin": { "semver": "bin/semver.js" @@ -2470,8 +2156,6 @@ }, "node_modules/@babel/helper-define-polyfill-provider": { "version": "0.6.6", - "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.6.tgz", - "integrity": "sha512-mOAsxeeKkUKayvZR3HeTYD/fICpCPLJrU5ZjelT/PA6WHtNDBOE436YiaEUvHN454bRM3CebhDsIpieCc4texA==", "license": "MIT", "dependencies": { "@babel/helper-compilation-targets": "^7.28.6", @@ -2486,8 +2170,6 @@ }, "node_modules/@babel/helper-globals": { "version": "7.28.0", - "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz", - "integrity": "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==", "license": "MIT", "engines": { "node": ">=6.9.0" @@ -2495,8 +2177,6 @@ }, "node_modules/@babel/helper-member-expression-to-functions": { "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.28.5.tgz", - "integrity": "sha512-cwM7SBRZcPCLgl8a7cY0soT1SptSzAlMH39vwiRpOQkJlh53r5hdHwLSCZpQdVLT39sZt+CRpNwYG4Y2v77atg==", "license": "MIT", "dependencies": { "@babel/traverse": "^7.28.5", @@ -2508,8 +2188,6 @@ }, "node_modules/@babel/helper-module-imports": { "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.28.6.tgz", - "integrity": "sha512-l5XkZK7r7wa9LucGw9LwZyyCUscb4x37JWTPz7swwFE/0FMQAGpiWUZn8u9DzkSBWEcK25jmvubfpw2dnAMdbw==", "license": "MIT", "dependencies": { "@babel/traverse": "^7.28.6", @@ -2521,8 +2199,6 @@ }, "node_modules/@babel/helper-module-transforms": { "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.28.6.tgz", - "integrity": "sha512-67oXFAYr2cDLDVGLXTEABjdBJZ6drElUSI7WKp70NrpyISso3plG9SAGEF6y7zbha/wOzUByWWTJvEDVNIUGcA==", "license": "MIT", "dependencies": { "@babel/helper-module-imports": "^7.28.6", @@ -2538,8 +2214,6 @@ }, "node_modules/@babel/helper-optimise-call-expression": { "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.27.1.tgz", - "integrity": "sha512-URMGH08NzYFhubNSGJrpUEphGKQwMQYBySzat5cAByY1/YgIRkULnIy3tAMeszlL/so2HbeilYloUmSpd7GdVw==", "license": "MIT", "dependencies": { "@babel/types": "^7.27.1" @@ -2550,8 +2224,6 @@ }, "node_modules/@babel/helper-plugin-utils": { "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.28.6.tgz", - "integrity": "sha512-S9gzZ/bz83GRysI7gAD4wPT/AI3uCnY+9xn+Mx/KPs2JwHJIz1W8PZkg2cqyt3RNOBM8ejcXhV6y8Og7ly/Dug==", "license": "MIT", "engines": { "node": ">=6.9.0" @@ -2559,8 +2231,6 @@ }, "node_modules/@babel/helper-remap-async-to-generator": { "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.27.1.tgz", - "integrity": "sha512-7fiA521aVw8lSPeI4ZOD3vRFkoqkJcS+z4hFo82bFSH/2tNd6eJ5qCVMS5OzDmZh/kaHQeBaeyxK6wljcPtveA==", "license": "MIT", "dependencies": { "@babel/helper-annotate-as-pure": "^7.27.1", @@ -2576,8 +2246,6 @@ }, "node_modules/@babel/helper-replace-supers": { "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.28.6.tgz", - "integrity": "sha512-mq8e+laIk94/yFec3DxSjCRD2Z0TAjhVbEJY3UQrlwVo15Lmt7C2wAUbK4bjnTs4APkwsYLTahXRraQXhb1WCg==", "license": "MIT", "dependencies": { "@babel/helper-member-expression-to-functions": "^7.28.5", @@ -2593,8 +2261,6 @@ }, "node_modules/@babel/helper-skip-transparent-expression-wrappers": { "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.27.1.tgz", - "integrity": "sha512-Tub4ZKEXqbPjXgWLl2+3JpQAYBJ8+ikpQ2Ocj/q/r0LwE3UhENh7EUabyHjz2kCEsrRY83ew2DQdHluuiDQFzg==", "license": "MIT", "dependencies": { "@babel/traverse": "^7.27.1", @@ -2606,8 +2272,6 @@ }, "node_modules/@babel/helper-string-parser": { "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", - "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", "license": "MIT", "engines": { "node": ">=6.9.0" @@ -2615,8 +2279,6 @@ }, "node_modules/@babel/helper-validator-identifier": { "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz", - "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==", "license": "MIT", "engines": { "node": ">=6.9.0" @@ -2624,8 +2286,6 @@ }, "node_modules/@babel/helper-validator-option": { "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz", - "integrity": "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==", "license": "MIT", "engines": { "node": ">=6.9.0" @@ -2633,8 +2293,6 @@ }, "node_modules/@babel/helper-wrap-function": { "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.28.6.tgz", - "integrity": "sha512-z+PwLziMNBeSQJonizz2AGnndLsP2DeGHIxDAn+wdHOGuo4Fo1x1HBPPXeE9TAOPHNNWQKCSlA2VZyYyyibDnQ==", "license": "MIT", "dependencies": { "@babel/template": "^7.28.6", @@ -2647,8 +2305,6 @@ }, "node_modules/@babel/helpers": { "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.28.6.tgz", - "integrity": "sha512-xOBvwq86HHdB7WUDTfKfT/Vuxh7gElQ+Sfti2Cy6yIWNW05P8iUslOVcZ4/sKbE+/jQaukQAdz/gf3724kYdqw==", "license": "MIT", "dependencies": { "@babel/template": "^7.28.6", @@ -2660,8 +2316,6 @@ }, "node_modules/@babel/parser": { "version": "7.29.0", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.0.tgz", - "integrity": "sha512-IyDgFV5GeDUVX4YdF/3CPULtVGSXXMLh1xVIgdCgxApktqnQV0r7/8Nqthg+8YLGaAtdyIlo2qIdZrbCv4+7ww==", "license": "MIT", "dependencies": { "@babel/types": "^7.29.0" @@ -2675,8 +2329,6 @@ }, "node_modules/@babel/plugin-bugfix-firefox-class-in-computed-class-key": { "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.28.5.tgz", - "integrity": "sha512-87GDMS3tsmMSi/3bWOte1UblL+YUTFMV8SZPZ2eSEL17s74Cw/l63rR6NmGVKMYW2GYi85nE+/d6Hw5N0bEk2Q==", "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.27.1", @@ -2691,8 +2343,6 @@ }, "node_modules/@babel/plugin-bugfix-safari-class-field-initializer-scope": { "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-class-field-initializer-scope/-/plugin-bugfix-safari-class-field-initializer-scope-7.27.1.tgz", - "integrity": "sha512-qNeq3bCKnGgLkEXUuFry6dPlGfCdQNZbn7yUAPCInwAJHMU7THJfrBSozkcWq5sNM6RcF3S8XyQL2A52KNR9IA==", "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" @@ -2706,8 +2356,6 @@ }, "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.27.1.tgz", - "integrity": "sha512-g4L7OYun04N1WyqMNjldFwlfPCLVkgB54A/YCXICZYBsvJJE3kByKv9c9+R/nAfmIfjl2rKYLNyMHboYbZaWaA==", "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" @@ -2721,8 +2369,6 @@ }, "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.27.1.tgz", - "integrity": "sha512-oO02gcONcD5O1iTLi/6frMJBIwWEHceWGSGqrpCmEL8nogiS6J9PBlE48CaK20/Jx1LuRml9aDftLgdjXT8+Cw==", "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.27.1", @@ -2738,8 +2384,6 @@ }, "node_modules/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": { "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.28.6.tgz", - "integrity": "sha512-a0aBScVTlNaiUe35UtfxAN7A/tehvvG4/ByO6+46VPKTRSlfnAFsgKy0FUh+qAkQrDTmhDkT+IBOKlOoMUxQ0g==", "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.28.6", @@ -2754,8 +2398,6 @@ }, "node_modules/@babel/plugin-proposal-private-property-in-object": { "version": "7.21.0-placeholder-for-preset-env.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz", - "integrity": "sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==", "license": "MIT", "engines": { "node": ">=6.9.0" @@ -2766,8 +2408,6 @@ }, "node_modules/@babel/plugin-syntax-async-generators": { "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", - "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" @@ -2778,8 +2418,6 @@ }, "node_modules/@babel/plugin-syntax-bigint": { "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", - "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" @@ -2790,8 +2428,6 @@ }, "node_modules/@babel/plugin-syntax-class-properties": { "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", - "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.12.13" @@ -2802,8 +2438,6 @@ }, "node_modules/@babel/plugin-syntax-class-static-block": { "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", - "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.14.5" @@ -2817,8 +2451,6 @@ }, "node_modules/@babel/plugin-syntax-dynamic-import": { "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", - "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" @@ -2829,8 +2461,6 @@ }, "node_modules/@babel/plugin-syntax-import-assertions": { "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.28.6.tgz", - "integrity": "sha512-pSJUpFHdx9z5nqTSirOCMtYVP2wFgoWhP0p3g8ONK/4IHhLIBd0B9NYqAvIUAhq+OkhO4VM1tENCt0cjlsNShw==", "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.28.6" @@ -2844,8 +2474,6 @@ }, "node_modules/@babel/plugin-syntax-import-attributes": { "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.28.6.tgz", - "integrity": "sha512-jiLC0ma9XkQT3TKJ9uYvlakm66Pamywo+qwL+oL8HJOvc6TWdZXVfhqJr8CCzbSGUAbDOzlGHJC1U+vRfLQDvw==", "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.28.6" @@ -2859,8 +2487,6 @@ }, "node_modules/@babel/plugin-syntax-import-meta": { "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", - "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.10.4" @@ -2871,8 +2497,6 @@ }, "node_modules/@babel/plugin-syntax-json-strings": { "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", - "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" @@ -2883,8 +2507,6 @@ }, "node_modules/@babel/plugin-syntax-jsx": { "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.28.6.tgz", - "integrity": "sha512-wgEmr06G6sIpqr8YDwA2dSRTE3bJ+V0IfpzfSY3Lfgd7YWOaAdlykvJi13ZKBt8cZHfgH1IXN+CL656W3uUa4w==", "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.28.6" @@ -2898,8 +2520,6 @@ }, "node_modules/@babel/plugin-syntax-logical-assignment-operators": { "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", - "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.10.4" @@ -2910,8 +2530,6 @@ }, "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", - "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" @@ -2922,8 +2540,6 @@ }, "node_modules/@babel/plugin-syntax-numeric-separator": { "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", - "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.10.4" @@ -2934,8 +2550,6 @@ }, "node_modules/@babel/plugin-syntax-object-rest-spread": { "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", - "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" @@ -2946,8 +2560,6 @@ }, "node_modules/@babel/plugin-syntax-optional-catch-binding": { "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", - "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" @@ -2958,8 +2570,6 @@ }, "node_modules/@babel/plugin-syntax-optional-chaining": { "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", - "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" @@ -2970,8 +2580,6 @@ }, "node_modules/@babel/plugin-syntax-private-property-in-object": { "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", - "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.14.5" @@ -2985,8 +2593,6 @@ }, "node_modules/@babel/plugin-syntax-top-level-await": { "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", - "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.14.5" @@ -3000,8 +2606,6 @@ }, "node_modules/@babel/plugin-syntax-typescript": { "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.28.6.tgz", - "integrity": "sha512-+nDNmQye7nlnuuHDboPbGm00Vqg3oO8niRRL27/4LYHUsHYh0zJ1xWOz0uRwNFmM1Avzk8wZbc6rdiYhomzv/A==", "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.28.6" @@ -3015,8 +2619,6 @@ }, "node_modules/@babel/plugin-syntax-unicode-sets-regex": { "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz", - "integrity": "sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==", "license": "MIT", "dependencies": { "@babel/helper-create-regexp-features-plugin": "^7.18.6", @@ -3031,8 +2633,6 @@ }, "node_modules/@babel/plugin-transform-arrow-functions": { "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.27.1.tgz", - "integrity": "sha512-8Z4TGic6xW70FKThA5HYEKKyBpOOsucTOD1DjU3fZxDg+K3zBJcXMFnt/4yQiZnf5+MiOMSXQ9PaEK/Ilh1DeA==", "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" @@ -3046,8 +2646,6 @@ }, "node_modules/@babel/plugin-transform-async-generator-functions": { "version": "7.29.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.29.0.tgz", - "integrity": "sha512-va0VdWro4zlBr2JsXC+ofCPB2iG12wPtVGTWFx2WLDOM3nYQZZIGP82qku2eW/JR83sD+k2k+CsNtyEbUqhU6w==", "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.28.6", @@ -3063,8 +2661,6 @@ }, "node_modules/@babel/plugin-transform-async-to-generator": { "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.28.6.tgz", - "integrity": "sha512-ilTRcmbuXjsMmcZ3HASTe4caH5Tpo93PkTxF9oG2VZsSWsahydmcEHhix9Ik122RcTnZnUzPbmux4wh1swfv7g==", "license": "MIT", "dependencies": { "@babel/helper-module-imports": "^7.28.6", @@ -3080,8 +2676,6 @@ }, "node_modules/@babel/plugin-transform-block-scoped-functions": { "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.27.1.tgz", - "integrity": "sha512-cnqkuOtZLapWYZUYM5rVIdv1nXYuFVIltZ6ZJ7nIj585QsjKM5dhL2Fu/lICXZ1OyIAFc7Qy+bvDAtTXqGrlhg==", "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" @@ -3095,8 +2689,6 @@ }, "node_modules/@babel/plugin-transform-block-scoping": { "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.28.6.tgz", - "integrity": "sha512-tt/7wOtBmwHPNMPu7ax4pdPz6shjFrmHDghvNC+FG9Qvj7D6mJcoRQIF5dy4njmxR941l6rgtvfSB2zX3VlUIw==", "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.28.6" @@ -3110,8 +2702,6 @@ }, "node_modules/@babel/plugin-transform-class-properties": { "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.28.6.tgz", - "integrity": "sha512-dY2wS3I2G7D697VHndN91TJr8/AAfXQNt5ynCTI/MpxMsSzHp+52uNivYT5wCPax3whc47DR8Ba7cmlQMg24bw==", "license": "MIT", "dependencies": { "@babel/helper-create-class-features-plugin": "^7.28.6", @@ -3126,8 +2716,6 @@ }, "node_modules/@babel/plugin-transform-class-static-block": { "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.28.6.tgz", - "integrity": "sha512-rfQ++ghVwTWTqQ7w8qyDxL1XGihjBss4CmTgGRCTAC9RIbhVpyp4fOeZtta0Lbf+dTNIVJer6ych2ibHwkZqsQ==", "license": "MIT", "dependencies": { "@babel/helper-create-class-features-plugin": "^7.28.6", @@ -3142,8 +2730,6 @@ }, "node_modules/@babel/plugin-transform-classes": { "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.28.6.tgz", - "integrity": "sha512-EF5KONAqC5zAqT783iMGuM2ZtmEBy+mJMOKl2BCvPZ2lVrwvXnB6o+OBWCS+CoeCCpVRF2sA2RBKUxvT8tQT5Q==", "license": "MIT", "dependencies": { "@babel/helper-annotate-as-pure": "^7.27.3", @@ -3162,8 +2748,6 @@ }, "node_modules/@babel/plugin-transform-computed-properties": { "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.28.6.tgz", - "integrity": "sha512-bcc3k0ijhHbc2lEfpFHgx7eYw9KNXqOerKWfzbxEHUGKnS3sz9C4CNL9OiFN1297bDNfUiSO7DaLzbvHQQQ1BQ==", "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.28.6", @@ -3178,8 +2762,6 @@ }, "node_modules/@babel/plugin-transform-destructuring": { "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.28.5.tgz", - "integrity": "sha512-Kl9Bc6D0zTUcFUvkNuQh4eGXPKKNDOJQXVyyM4ZAQPMveniJdxi8XMJwLo+xSoW3MIq81bD33lcUe9kZpl0MCw==", "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.27.1", @@ -3194,8 +2776,6 @@ }, "node_modules/@babel/plugin-transform-dotall-regex": { "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.28.6.tgz", - "integrity": "sha512-SljjowuNKB7q5Oayv4FoPzeB74g3QgLt8IVJw9ADvWy3QnUb/01aw8I4AVv8wYnPvQz2GDDZ/g3GhcNyDBI4Bg==", "license": "MIT", "dependencies": { "@babel/helper-create-regexp-features-plugin": "^7.28.5", @@ -3210,8 +2790,6 @@ }, "node_modules/@babel/plugin-transform-duplicate-keys": { "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.27.1.tgz", - "integrity": "sha512-MTyJk98sHvSs+cvZ4nOauwTTG1JeonDjSGvGGUNHreGQns+Mpt6WX/dVzWBHgg+dYZhkC4X+zTDfkTU+Vy9y7Q==", "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" @@ -3225,8 +2803,6 @@ }, "node_modules/@babel/plugin-transform-duplicate-named-capturing-groups-regex": { "version": "7.29.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-named-capturing-groups-regex/-/plugin-transform-duplicate-named-capturing-groups-regex-7.29.0.tgz", - "integrity": "sha512-zBPcW2lFGxdiD8PUnPwJjag2J9otbcLQzvbiOzDxpYXyCuYX9agOwMPGn1prVH0a4qzhCKu24rlH4c1f7yA8rw==", "license": "MIT", "dependencies": { "@babel/helper-create-regexp-features-plugin": "^7.28.5", @@ -3241,8 +2817,6 @@ }, "node_modules/@babel/plugin-transform-dynamic-import": { "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.27.1.tgz", - "integrity": "sha512-MHzkWQcEmjzzVW9j2q8LGjwGWpG2mjwaaB0BNQwst3FIjqsg8Ct/mIZlvSPJvfi9y2AC8mi/ktxbFVL9pZ1I4A==", "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" @@ -3256,8 +2830,6 @@ }, "node_modules/@babel/plugin-transform-explicit-resource-management": { "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-explicit-resource-management/-/plugin-transform-explicit-resource-management-7.28.6.tgz", - "integrity": "sha512-Iao5Konzx2b6g7EPqTy40UZbcdXE126tTxVFr/nAIj+WItNxjKSYTEw3RC+A2/ZetmdJsgueL1KhaMCQHkLPIg==", "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.28.6", @@ -3272,8 +2844,6 @@ }, "node_modules/@babel/plugin-transform-exponentiation-operator": { "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.28.6.tgz", - "integrity": "sha512-WitabqiGjV/vJ0aPOLSFfNY1u9U3R7W36B03r5I2KoNix+a3sOhJ3pKFB3R5It9/UiK78NiO0KE9P21cMhlPkw==", "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.28.6" @@ -3287,8 +2857,6 @@ }, "node_modules/@babel/plugin-transform-export-namespace-from": { "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.27.1.tgz", - "integrity": "sha512-tQvHWSZ3/jH2xuq/vZDy0jNn+ZdXJeM8gHvX4lnJmsc3+50yPlWdZXIc5ay+umX+2/tJIqHqiEqcJvxlmIvRvQ==", "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" @@ -3302,8 +2870,6 @@ }, "node_modules/@babel/plugin-transform-for-of": { "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.27.1.tgz", - "integrity": "sha512-BfbWFFEJFQzLCQ5N8VocnCtA8J1CLkNTe2Ms2wocj75dd6VpiqS5Z5quTYcUoo4Yq+DN0rtikODccuv7RU81sw==", "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.27.1", @@ -3318,8 +2884,6 @@ }, "node_modules/@babel/plugin-transform-function-name": { "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.27.1.tgz", - "integrity": "sha512-1bQeydJF9Nr1eBCMMbC+hdwmRlsv5XYOMu03YSWFwNs0HsAmtSxxF1fyuYPqemVldVyFmlCU7w8UE14LupUSZQ==", "license": "MIT", "dependencies": { "@babel/helper-compilation-targets": "^7.27.1", @@ -3335,8 +2899,6 @@ }, "node_modules/@babel/plugin-transform-json-strings": { "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.28.6.tgz", - "integrity": "sha512-Nr+hEN+0geQkzhbdgQVPoqr47lZbm+5fCUmO70722xJZd0Mvb59+33QLImGj6F+DkK3xgDi1YVysP8whD6FQAw==", "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.28.6" @@ -3350,8 +2912,6 @@ }, "node_modules/@babel/plugin-transform-literals": { "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.27.1.tgz", - "integrity": "sha512-0HCFSepIpLTkLcsi86GG3mTUzxV5jpmbv97hTETW3yzrAij8aqlD36toB1D0daVFJM8NK6GvKO0gslVQmm+zZA==", "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" @@ -3365,8 +2925,6 @@ }, "node_modules/@babel/plugin-transform-logical-assignment-operators": { "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.28.6.tgz", - "integrity": "sha512-+anKKair6gpi8VsM/95kmomGNMD0eLz1NQ8+Pfw5sAwWH9fGYXT50E55ZpV0pHUHWf6IUTWPM+f/7AAff+wr9A==", "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.28.6" @@ -3380,8 +2938,6 @@ }, "node_modules/@babel/plugin-transform-member-expression-literals": { "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.27.1.tgz", - "integrity": "sha512-hqoBX4dcZ1I33jCSWcXrP+1Ku7kdqXf1oeah7ooKOIiAdKQ+uqftgCFNOSzA5AMS2XIHEYeGFg4cKRCdpxzVOQ==", "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" @@ -3395,8 +2951,6 @@ }, "node_modules/@babel/plugin-transform-modules-amd": { "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.27.1.tgz", - "integrity": "sha512-iCsytMg/N9/oFq6n+gFTvUYDZQOMK5kEdeYxmxt91fcJGycfxVP9CnrxoliM0oumFERba2i8ZtwRUCMhvP1LnA==", "license": "MIT", "dependencies": { "@babel/helper-module-transforms": "^7.27.1", @@ -3411,8 +2965,6 @@ }, "node_modules/@babel/plugin-transform-modules-commonjs": { "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.28.6.tgz", - "integrity": "sha512-jppVbf8IV9iWWwWTQIxJMAJCWBuuKx71475wHwYytrRGQ2CWiDvYlADQno3tcYpS/T2UUWFQp3nVtYfK/YBQrA==", "license": "MIT", "dependencies": { "@babel/helper-module-transforms": "^7.28.6", @@ -3427,8 +2979,6 @@ }, "node_modules/@babel/plugin-transform-modules-systemjs": { "version": "7.29.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.29.0.tgz", - "integrity": "sha512-PrujnVFbOdUpw4UHiVwKvKRLMMic8+eC0CuNlxjsyZUiBjhFdPsewdXCkveh2KqBA9/waD0W1b4hXSOBQJezpQ==", "license": "MIT", "dependencies": { "@babel/helper-module-transforms": "^7.28.6", @@ -3445,8 +2995,6 @@ }, "node_modules/@babel/plugin-transform-modules-umd": { "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.27.1.tgz", - "integrity": "sha512-iQBE/xC5BV1OxJbp6WG7jq9IWiD+xxlZhLrdwpPkTX3ydmXdvoCpyfJN7acaIBZaOqTfr76pgzqBJflNbeRK+w==", "license": "MIT", "dependencies": { "@babel/helper-module-transforms": "^7.27.1", @@ -3461,8 +3009,6 @@ }, "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { "version": "7.29.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.29.0.tgz", - "integrity": "sha512-1CZQA5KNAD6ZYQLPw7oi5ewtDNxH/2vuCh+6SmvgDfhumForvs8a1o9n0UrEoBD8HU4djO2yWngTQlXl1NDVEQ==", "license": "MIT", "dependencies": { "@babel/helper-create-regexp-features-plugin": "^7.28.5", @@ -3477,8 +3023,6 @@ }, "node_modules/@babel/plugin-transform-new-target": { "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.27.1.tgz", - "integrity": "sha512-f6PiYeqXQ05lYq3TIfIDu/MtliKUbNwkGApPUvyo6+tc7uaR4cPjPe7DFPr15Uyycg2lZU6btZ575CuQoYh7MQ==", "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" @@ -3492,8 +3036,6 @@ }, "node_modules/@babel/plugin-transform-nullish-coalescing-operator": { "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.28.6.tgz", - "integrity": "sha512-3wKbRgmzYbw24mDJXT7N+ADXw8BC/imU9yo9c9X9NKaLF1fW+e5H1U5QjMUBe4Qo4Ox/o++IyUkl1sVCLgevKg==", "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.28.6" @@ -3507,8 +3049,6 @@ }, "node_modules/@babel/plugin-transform-numeric-separator": { "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.28.6.tgz", - "integrity": "sha512-SJR8hPynj8outz+SlStQSwvziMN4+Bq99it4tMIf5/Caq+3iOc0JtKyse8puvyXkk3eFRIA5ID/XfunGgO5i6w==", "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.28.6" @@ -3522,8 +3062,6 @@ }, "node_modules/@babel/plugin-transform-object-rest-spread": { "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.28.6.tgz", - "integrity": "sha512-5rh+JR4JBC4pGkXLAcYdLHZjXudVxWMXbB6u6+E9lRL5TrGVbHt1TjxGbZ8CkmYw9zjkB7jutzOROArsqtncEA==", "license": "MIT", "dependencies": { "@babel/helper-compilation-targets": "^7.28.6", @@ -3541,8 +3079,6 @@ }, "node_modules/@babel/plugin-transform-object-super": { "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.27.1.tgz", - "integrity": "sha512-SFy8S9plRPbIcxlJ8A6mT/CxFdJx/c04JEctz4jf8YZaVS2px34j7NXRrlGlHkN/M2gnpL37ZpGRGVFLd3l8Ng==", "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.27.1", @@ -3557,8 +3093,6 @@ }, "node_modules/@babel/plugin-transform-optional-catch-binding": { "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.28.6.tgz", - "integrity": "sha512-R8ja/Pyrv0OGAvAXQhSTmWyPJPml+0TMqXlO5w+AsMEiwb2fg3WkOvob7UxFSL3OIttFSGSRFKQsOhJ/X6HQdQ==", "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.28.6" @@ -3572,8 +3106,6 @@ }, "node_modules/@babel/plugin-transform-optional-chaining": { "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.28.6.tgz", - "integrity": "sha512-A4zobikRGJTsX9uqVFdafzGkqD30t26ck2LmOzAuLL8b2x6k3TIqRiT2xVvA9fNmFeTX484VpsdgmKNA0bS23w==", "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.28.6", @@ -3588,8 +3120,6 @@ }, "node_modules/@babel/plugin-transform-parameters": { "version": "7.27.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.27.7.tgz", - "integrity": "sha512-qBkYTYCb76RRxUM6CcZA5KRu8K4SM8ajzVeUgVdMVO9NN9uI/GaVmBg/WKJJGnNokV9SY8FxNOVWGXzqzUidBg==", "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" @@ -3603,8 +3133,6 @@ }, "node_modules/@babel/plugin-transform-private-methods": { "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.28.6.tgz", - "integrity": "sha512-piiuapX9CRv7+0st8lmuUlRSmX6mBcVeNQ1b4AYzJxfCMuBfB0vBXDiGSmm03pKJw1v6cZ8KSeM+oUnM6yAExg==", "license": "MIT", "dependencies": { "@babel/helper-create-class-features-plugin": "^7.28.6", @@ -3619,8 +3147,6 @@ }, "node_modules/@babel/plugin-transform-private-property-in-object": { "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.28.6.tgz", - "integrity": "sha512-b97jvNSOb5+ehyQmBpmhOCiUC5oVK4PMnpRvO7+ymFBoqYjeDHIU9jnrNUuwHOiL9RpGDoKBpSViarV+BU+eVA==", "license": "MIT", "dependencies": { "@babel/helper-annotate-as-pure": "^7.27.3", @@ -3636,8 +3162,6 @@ }, "node_modules/@babel/plugin-transform-property-literals": { "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.27.1.tgz", - "integrity": "sha512-oThy3BCuCha8kDZ8ZkgOg2exvPYUlprMukKQXI1r1pJ47NCvxfkEy8vK+r/hT9nF0Aa4H1WUPZZjHTFtAhGfmQ==", "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" @@ -3651,8 +3175,6 @@ }, "node_modules/@babel/plugin-transform-react-constant-elements": { "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.27.1.tgz", - "integrity": "sha512-edoidOjl/ZxvYo4lSBOQGDSyToYVkTAwyVoa2tkuYTSmjrB1+uAedoL5iROVLXkxH+vRgA7uP4tMg2pUJpZ3Ug==", "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" @@ -3666,8 +3188,6 @@ }, "node_modules/@babel/plugin-transform-react-display-name": { "version": "7.28.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.28.0.tgz", - "integrity": "sha512-D6Eujc2zMxKjfa4Zxl4GHMsmhKKZ9VpcqIchJLvwTxad9zWIYulwYItBovpDOoNLISpcZSXoDJ5gaGbQUDqViA==", "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" @@ -3681,8 +3201,6 @@ }, "node_modules/@babel/plugin-transform-react-jsx": { "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.28.6.tgz", - "integrity": "sha512-61bxqhiRfAACulXSLd/GxqmAedUSrRZIu/cbaT18T1CetkTmtDN15it7i80ru4DVqRK1WMxQhXs+Lf9kajm5Ow==", "license": "MIT", "dependencies": { "@babel/helper-annotate-as-pure": "^7.27.3", @@ -3700,8 +3218,6 @@ }, "node_modules/@babel/plugin-transform-react-jsx-development": { "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.27.1.tgz", - "integrity": "sha512-ykDdF5yI4f1WrAolLqeF3hmYU12j9ntLQl/AOG1HAS21jxyg1Q0/J/tpREuYLfatGdGmXp/3yS0ZA76kOlVq9Q==", "license": "MIT", "dependencies": { "@babel/plugin-transform-react-jsx": "^7.27.1" @@ -3715,8 +3231,6 @@ }, "node_modules/@babel/plugin-transform-react-jsx-self": { "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.27.1.tgz", - "integrity": "sha512-6UzkCs+ejGdZ5mFFC/OCUrv028ab2fp1znZmCZjAOBKiBK2jXD1O+BPSfX8X2qjJ75fZBMSnQn3Rq2mrBJK2mw==", "dev": true, "license": "MIT", "dependencies": { @@ -3731,8 +3245,6 @@ }, "node_modules/@babel/plugin-transform-react-jsx-source": { "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.27.1.tgz", - "integrity": "sha512-zbwoTsBruTeKB9hSq73ha66iFeJHuaFkUbwvqElnygoNbj/jHRsSeokowZFN3CZ64IvEqcmmkVe89OPXc7ldAw==", "dev": true, "license": "MIT", "dependencies": { @@ -3747,8 +3259,6 @@ }, "node_modules/@babel/plugin-transform-react-pure-annotations": { "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.27.1.tgz", - "integrity": "sha512-JfuinvDOsD9FVMTHpzA/pBLisxpv1aSf+OIV8lgH3MuWrks19R27e6a6DipIg4aX1Zm9Wpb04p8wljfKrVSnPA==", "license": "MIT", "dependencies": { "@babel/helper-annotate-as-pure": "^7.27.1", @@ -3763,8 +3273,6 @@ }, "node_modules/@babel/plugin-transform-regenerator": { "version": "7.29.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.29.0.tgz", - "integrity": "sha512-FijqlqMA7DmRdg/aINBSs04y8XNTYw/lr1gJ2WsmBnnaNw1iS43EPkJW+zK7z65auG3AWRFXWj+NcTQwYptUog==", "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.28.6" @@ -3778,8 +3286,6 @@ }, "node_modules/@babel/plugin-transform-regexp-modifiers": { "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regexp-modifiers/-/plugin-transform-regexp-modifiers-7.28.6.tgz", - "integrity": "sha512-QGWAepm9qxpaIs7UM9FvUSnCGlb8Ua1RhyM4/veAxLwt3gMat/LSGrZixyuj4I6+Kn9iwvqCyPTtbdxanYoWYg==", "license": "MIT", "dependencies": { "@babel/helper-create-regexp-features-plugin": "^7.28.5", @@ -3794,8 +3300,6 @@ }, "node_modules/@babel/plugin-transform-reserved-words": { "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.27.1.tgz", - "integrity": "sha512-V2ABPHIJX4kC7HegLkYoDpfg9PVmuWy/i6vUM5eGK22bx4YVFD3M5F0QQnWQoDs6AGsUWTVOopBiMFQgHaSkVw==", "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" @@ -3809,8 +3313,6 @@ }, "node_modules/@babel/plugin-transform-runtime": { "version": "7.29.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.29.0.tgz", - "integrity": "sha512-jlaRT5dJtMaMCV6fAuLbsQMSwz/QkvaHOHOSXRitGGwSpR1blCY4KUKoyP2tYO8vJcqYe8cEj96cqSztv3uF9w==", "license": "MIT", "dependencies": { "@babel/helper-module-imports": "^7.28.6", @@ -3829,8 +3331,6 @@ }, "node_modules/@babel/plugin-transform-runtime/node_modules/semver": { "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "license": "ISC", "bin": { "semver": "bin/semver.js" @@ -3838,8 +3338,6 @@ }, "node_modules/@babel/plugin-transform-shorthand-properties": { "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.27.1.tgz", - "integrity": "sha512-N/wH1vcn4oYawbJ13Y/FxcQrWk63jhfNa7jef0ih7PHSIHX2LB7GWE1rkPrOnka9kwMxb6hMl19p7lidA+EHmQ==", "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" @@ -3853,8 +3351,6 @@ }, "node_modules/@babel/plugin-transform-spread": { "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.28.6.tgz", - "integrity": "sha512-9U4QObUC0FtJl05AsUcodau/RWDytrU6uKgkxu09mLR9HLDAtUMoPuuskm5huQsoktmsYpI+bGmq+iapDcriKA==", "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.28.6", @@ -3869,8 +3365,6 @@ }, "node_modules/@babel/plugin-transform-sticky-regex": { "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.27.1.tgz", - "integrity": "sha512-lhInBO5bi/Kowe2/aLdBAawijx+q1pQzicSgnkB6dUPc1+RC8QmJHKf2OjvU+NZWitguJHEaEmbV6VWEouT58g==", "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" @@ -3884,8 +3378,6 @@ }, "node_modules/@babel/plugin-transform-template-literals": { "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.27.1.tgz", - "integrity": "sha512-fBJKiV7F2DxZUkg5EtHKXQdbsbURW3DZKQUWphDum0uRP6eHGGa/He9mc0mypL680pb+e/lDIthRohlv8NCHkg==", "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" @@ -3899,8 +3391,6 @@ }, "node_modules/@babel/plugin-transform-typeof-symbol": { "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.27.1.tgz", - "integrity": "sha512-RiSILC+nRJM7FY5srIyc4/fGIwUhyDuuBSdWn4y6yT6gm652DpCHZjIipgn6B7MQ1ITOUnAKWixEUjQRIBIcLw==", "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" @@ -3914,8 +3404,6 @@ }, "node_modules/@babel/plugin-transform-typescript": { "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.28.6.tgz", - "integrity": "sha512-0YWL2RFxOqEm9Efk5PvreamxPME8OyY0wM5wh5lHjF+VtVhdneCWGzZeSqzOfiobVqQaNCd2z0tQvnI9DaPWPw==", "license": "MIT", "dependencies": { "@babel/helper-annotate-as-pure": "^7.27.3", @@ -3933,8 +3421,6 @@ }, "node_modules/@babel/plugin-transform-unicode-escapes": { "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.27.1.tgz", - "integrity": "sha512-Ysg4v6AmF26k9vpfFuTZg8HRfVWzsh1kVfowA23y9j/Gu6dOuahdUVhkLqpObp3JIv27MLSii6noRnuKN8H0Mg==", "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" @@ -3948,8 +3434,6 @@ }, "node_modules/@babel/plugin-transform-unicode-property-regex": { "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.28.6.tgz", - "integrity": "sha512-4Wlbdl/sIZjzi/8St0evF0gEZrgOswVO6aOzqxh1kDZOl9WmLrHq2HtGhnOJZmHZYKP8WZ1MDLCt5DAWwRo57A==", "license": "MIT", "dependencies": { "@babel/helper-create-regexp-features-plugin": "^7.28.5", @@ -3964,8 +3448,6 @@ }, "node_modules/@babel/plugin-transform-unicode-regex": { "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.27.1.tgz", - "integrity": "sha512-xvINq24TRojDuyt6JGtHmkVkrfVV3FPT16uytxImLeBZqW3/H52yN+kM1MGuyPkIQxrzKwPHs5U/MP3qKyzkGw==", "license": "MIT", "dependencies": { "@babel/helper-create-regexp-features-plugin": "^7.27.1", @@ -3980,8 +3462,6 @@ }, "node_modules/@babel/plugin-transform-unicode-sets-regex": { "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.28.6.tgz", - "integrity": "sha512-/wHc/paTUmsDYN7SZkpWxogTOBNnlx7nBQYfy6JJlCT7G3mVhltk3e++N7zV0XfgGsrqBxd4rJQt9H16I21Y1Q==", "license": "MIT", "dependencies": { "@babel/helper-create-regexp-features-plugin": "^7.28.5", @@ -3996,8 +3476,6 @@ }, "node_modules/@babel/preset-env": { "version": "7.29.0", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.29.0.tgz", - "integrity": "sha512-fNEdfc0yi16lt6IZo2Qxk3knHVdfMYX33czNb4v8yWhemoBhibCpQK/uYHtSKIiO+p/zd3+8fYVXhQdOVV608w==", "license": "MIT", "dependencies": { "@babel/compat-data": "^7.29.0", @@ -4080,8 +3558,6 @@ }, "node_modules/@babel/preset-env/node_modules/babel-plugin-polyfill-corejs3": { "version": "0.14.0", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.14.0.tgz", - "integrity": "sha512-AvDcMxJ34W4Wgy4KBIIePQTAOP1Ie2WFwkQp3dB7FQ/f0lI5+nM96zUnYEOE1P9sEg0es5VCP0HxiWu5fUHZAQ==", "license": "MIT", "dependencies": { "@babel/helper-define-polyfill-provider": "^0.6.6", @@ -4093,8 +3569,6 @@ }, "node_modules/@babel/preset-env/node_modules/semver": { "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "license": "ISC", "bin": { "semver": "bin/semver.js" @@ -4102,8 +3576,6 @@ }, "node_modules/@babel/preset-modules": { "version": "0.1.6-no-external-plugins", - "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz", - "integrity": "sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==", "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.0.0", @@ -4116,8 +3588,6 @@ }, "node_modules/@babel/preset-react": { "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.28.5.tgz", - "integrity": "sha512-Z3J8vhRq7CeLjdC58jLv4lnZ5RKFUJWqH5emvxmv9Hv3BD1T9R/Im713R4MTKwvFaV74ejZ3sM01LyEKk4ugNQ==", "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.27.1", @@ -4136,8 +3606,6 @@ }, "node_modules/@babel/preset-typescript": { "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.28.5.tgz", - "integrity": "sha512-+bQy5WOI2V6LJZpPVxY+yp66XdZ2yifu0Mc1aP5CQKgjn4QM5IN2i5fAZ4xKop47pr8rpVhiAeu+nDQa12C8+g==", "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.27.1", @@ -4155,8 +3623,6 @@ }, "node_modules/@babel/runtime": { "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.28.6.tgz", - "integrity": "sha512-05WQkdpL9COIMz4LjTxGpPNCdlpyimKppYNoJ5Di5EUObifl8t4tuLuUBBZEpoLYOmfvIWrsp9fCl0HoPRVTdA==", "license": "MIT", "engines": { "node": ">=6.9.0" @@ -4164,8 +3630,6 @@ }, "node_modules/@babel/runtime-corejs3": { "version": "7.29.0", - "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.29.0.tgz", - "integrity": "sha512-TgUkdp71C9pIbBcHudc+gXZnihEDOjUAmXO1VO4HHGES7QLZcShR0stfKIxLSNIYx2fqhmJChOjm/wkF8wv4gA==", "license": "MIT", "dependencies": { "core-js-pure": "^3.48.0" @@ -4176,8 +3640,6 @@ }, "node_modules/@babel/template": { "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.28.6.tgz", - "integrity": "sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ==", "license": "MIT", "dependencies": { "@babel/code-frame": "^7.28.6", @@ -4190,8 +3652,6 @@ }, "node_modules/@babel/traverse": { "version": "7.29.0", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.0.tgz", - "integrity": "sha512-4HPiQr0X7+waHfyXPZpWPfWL/J7dcN1mx9gL6WdQVMbPnF3+ZhSMs8tCxN7oHddJE9fhNE7+lxdnlyemKfJRuA==", "license": "MIT", "dependencies": { "@babel/code-frame": "^7.29.0", @@ -4208,8 +3668,6 @@ }, "node_modules/@babel/types": { "version": "7.29.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.0.tgz", - "integrity": "sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==", "license": "MIT", "dependencies": { "@babel/helper-string-parser": "^7.27.1", @@ -4221,20 +3679,14 @@ }, "node_modules/@bcoe/v8-coverage": { "version": "0.2.3", - "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", - "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", "license": "MIT" }, "node_modules/@braintree/sanitize-url": { "version": "7.1.2", - "resolved": "https://registry.npmjs.org/@braintree/sanitize-url/-/sanitize-url-7.1.2.tgz", - "integrity": "sha512-jigsZK+sMF/cuiB7sERuo9V7N9jx+dhmHHnQyDSVdpZwVutaBu7WvNYqMDLSgFgfB30n452TP3vjDAvFC973mA==", "license": "MIT" }, "node_modules/@changesets/apply-release-plan": { "version": "7.1.0", - "resolved": "https://registry.npmjs.org/@changesets/apply-release-plan/-/apply-release-plan-7.1.0.tgz", - "integrity": "sha512-yq8ML3YS7koKQ/9bk1PqO0HMzApIFNwjlwCnwFEXMzNe8NpzeeYYKCmnhWJGkN8g7E51MnWaSbqRcTcdIxUgnQ==", "dev": true, "license": "MIT", "dependencies": { @@ -4255,8 +3707,6 @@ }, "node_modules/@changesets/apply-release-plan/node_modules/prettier": { "version": "2.8.8", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz", - "integrity": "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==", "dev": true, "license": "MIT", "bin": { @@ -4271,8 +3721,6 @@ }, "node_modules/@changesets/assemble-release-plan": { "version": "6.0.9", - "resolved": "https://registry.npmjs.org/@changesets/assemble-release-plan/-/assemble-release-plan-6.0.9.tgz", - "integrity": "sha512-tPgeeqCHIwNo8sypKlS3gOPmsS3wP0zHt67JDuL20P4QcXiw/O4Hl7oXiuLnP9yg+rXLQ2sScdV1Kkzde61iSQ==", "dev": true, "license": "MIT", "dependencies": { @@ -4286,8 +3734,6 @@ }, "node_modules/@changesets/changelog-git": { "version": "0.2.1", - "resolved": "https://registry.npmjs.org/@changesets/changelog-git/-/changelog-git-0.2.1.tgz", - "integrity": "sha512-x/xEleCFLH28c3bQeQIyeZf8lFXyDFVn1SgcBiR2Tw/r4IAWlk1fzxCEZ6NxQAjF2Nwtczoen3OA2qR+UawQ8Q==", "dev": true, "license": "MIT", "dependencies": { @@ -4296,8 +3742,6 @@ }, "node_modules/@changesets/cli": { "version": "2.30.0", - "resolved": "https://registry.npmjs.org/@changesets/cli/-/cli-2.30.0.tgz", - "integrity": "sha512-5D3Nk2JPqMI1wK25pEymeWRSlSMdo5QOGlyfrKg0AOufrUcjEE3RQgaCpHoBiM31CSNrtSgdJ0U6zL1rLDDfBA==", "dev": true, "license": "MIT", "dependencies": { @@ -4334,8 +3778,6 @@ }, "node_modules/@changesets/config": { "version": "3.1.3", - "resolved": "https://registry.npmjs.org/@changesets/config/-/config-3.1.3.tgz", - "integrity": "sha512-vnXjcey8YgBn2L1OPWd3ORs0bGC4LoYcK/ubpgvzNVr53JXV5GiTVj7fWdMRsoKUH7hhhMAQnsJUqLr21EncNw==", "dev": true, "license": "MIT", "dependencies": { @@ -4351,8 +3793,6 @@ }, "node_modules/@changesets/errors": { "version": "0.2.0", - "resolved": "https://registry.npmjs.org/@changesets/errors/-/errors-0.2.0.tgz", - "integrity": "sha512-6BLOQUscTpZeGljvyQXlWOItQyU71kCdGz7Pi8H8zdw6BI0g3m43iL4xKUVPWtG+qrrL9DTjpdn8eYuCQSRpow==", "dev": true, "license": "MIT", "dependencies": { @@ -4361,8 +3801,6 @@ }, "node_modules/@changesets/get-dependents-graph": { "version": "2.1.3", - "resolved": "https://registry.npmjs.org/@changesets/get-dependents-graph/-/get-dependents-graph-2.1.3.tgz", - "integrity": "sha512-gphr+v0mv2I3Oxt19VdWRRUxq3sseyUpX9DaHpTUmLj92Y10AGy+XOtV+kbM6L/fDcpx7/ISDFK6T8A/P3lOdQ==", "dev": true, "license": "MIT", "dependencies": { @@ -4374,8 +3812,6 @@ }, "node_modules/@changesets/get-release-plan": { "version": "4.0.15", - "resolved": "https://registry.npmjs.org/@changesets/get-release-plan/-/get-release-plan-4.0.15.tgz", - "integrity": "sha512-Q04ZaRPuEVZtA+auOYgFaVQQSA98dXiVe/yFaZfY7hoSmQICHGvP0TF4u3EDNHWmmCS4ekA/XSpKlSM2PyTS2g==", "dev": true, "license": "MIT", "dependencies": { @@ -4389,15 +3825,11 @@ }, "node_modules/@changesets/get-version-range-type": { "version": "0.4.0", - "resolved": "https://registry.npmjs.org/@changesets/get-version-range-type/-/get-version-range-type-0.4.0.tgz", - "integrity": "sha512-hwawtob9DryoGTpixy1D3ZXbGgJu1Rhr+ySH2PvTLHvkZuQ7sRT4oQwMh0hbqZH1weAooedEjRsbrWcGLCeyVQ==", "dev": true, "license": "MIT" }, "node_modules/@changesets/git": { "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@changesets/git/-/git-3.0.4.tgz", - "integrity": "sha512-BXANzRFkX+XcC1q/d27NKvlJ1yf7PSAgi8JG6dt8EfbHFHi4neau7mufcSca5zRhwOL8j9s6EqsxmT+s+/E6Sw==", "dev": true, "license": "MIT", "dependencies": { @@ -4410,8 +3842,6 @@ }, "node_modules/@changesets/logger": { "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@changesets/logger/-/logger-0.1.1.tgz", - "integrity": "sha512-OQtR36ZlnuTxKqoW4Sv6x5YIhOmClRd5pWsjZsddYxpWs517R0HkyiefQPIytCVh4ZcC5x9XaG8KTdd5iRQUfg==", "dev": true, "license": "MIT", "dependencies": { @@ -4420,8 +3850,6 @@ }, "node_modules/@changesets/parse": { "version": "0.4.3", - "resolved": "https://registry.npmjs.org/@changesets/parse/-/parse-0.4.3.tgz", - "integrity": "sha512-ZDmNc53+dXdWEv7fqIUSgRQOLYoUom5Z40gmLgmATmYR9NbL6FJJHwakcCpzaeCy+1D0m0n7mT4jj2B/MQPl7A==", "dev": true, "license": "MIT", "dependencies": { @@ -4431,8 +3859,6 @@ }, "node_modules/@changesets/pre": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@changesets/pre/-/pre-2.0.2.tgz", - "integrity": "sha512-HaL/gEyFVvkf9KFg6484wR9s0qjAXlZ8qWPDkTyKF6+zqjBe/I2mygg3MbpZ++hdi0ToqNUF8cjj7fBy0dg8Ug==", "dev": true, "license": "MIT", "dependencies": { @@ -4444,8 +3870,6 @@ }, "node_modules/@changesets/read": { "version": "0.6.7", - "resolved": "https://registry.npmjs.org/@changesets/read/-/read-0.6.7.tgz", - "integrity": "sha512-D1G4AUYGrBEk8vj8MGwf75k9GpN6XL3wg8i42P2jZZwFLXnlr2Pn7r9yuQNbaMCarP7ZQWNJbV6XLeysAIMhTA==", "dev": true, "license": "MIT", "dependencies": { @@ -4460,8 +3884,6 @@ }, "node_modules/@changesets/should-skip-package": { "version": "0.1.2", - "resolved": "https://registry.npmjs.org/@changesets/should-skip-package/-/should-skip-package-0.1.2.tgz", - "integrity": "sha512-qAK/WrqWLNCP22UDdBTMPH5f41elVDlsNyat180A33dWxuUDyNpg6fPi/FyTZwRriVjg0L8gnjJn2F9XAoF0qw==", "dev": true, "license": "MIT", "dependencies": { @@ -4471,15 +3893,11 @@ }, "node_modules/@changesets/types": { "version": "6.1.0", - "resolved": "https://registry.npmjs.org/@changesets/types/-/types-6.1.0.tgz", - "integrity": "sha512-rKQcJ+o1nKNgeoYRHKOS07tAMNd3YSN0uHaJOZYjBAgxfV7TUE7JE+z4BzZdQwb5hKaYbayKN5KrYV7ODb2rAA==", "dev": true, "license": "MIT" }, "node_modules/@changesets/write": { "version": "0.4.0", - "resolved": "https://registry.npmjs.org/@changesets/write/-/write-0.4.0.tgz", - "integrity": "sha512-CdTLvIOPiCNuH71pyDu3rA+Q0n65cmAbXnwWH84rKGiFumFzkmHNT8KHTMEchcxN+Kl8I54xGUhJ7l3E7X396Q==", "dev": true, "license": "MIT", "dependencies": { @@ -4491,8 +3909,6 @@ }, "node_modules/@changesets/write/node_modules/prettier": { "version": "2.8.8", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz", - "integrity": "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==", "dev": true, "license": "MIT", "bin": { @@ -4507,8 +3923,6 @@ }, "node_modules/@chevrotain/cst-dts-gen": { "version": "11.1.2", - "resolved": "https://registry.npmjs.org/@chevrotain/cst-dts-gen/-/cst-dts-gen-11.1.2.tgz", - "integrity": "sha512-XTsjvDVB5nDZBQB8o0o/0ozNelQtn2KrUVteIHSlPd2VAV2utEb6JzyCJaJ8tGxACR4RiBNWy5uYUHX2eji88Q==", "license": "Apache-2.0", "dependencies": { "@chevrotain/gast": "11.1.2", @@ -4518,8 +3932,6 @@ }, "node_modules/@chevrotain/gast": { "version": "11.1.2", - "resolved": "https://registry.npmjs.org/@chevrotain/gast/-/gast-11.1.2.tgz", - "integrity": "sha512-Z9zfXR5jNZb1Hlsd/p+4XWeUFugrHirq36bKzPWDSIacV+GPSVXdk+ahVWZTwjhNwofAWg/sZg58fyucKSQx5g==", "license": "Apache-2.0", "dependencies": { "@chevrotain/types": "11.1.2", @@ -4528,26 +3940,18 @@ }, "node_modules/@chevrotain/regexp-to-ast": { "version": "11.1.2", - "resolved": "https://registry.npmjs.org/@chevrotain/regexp-to-ast/-/regexp-to-ast-11.1.2.tgz", - "integrity": "sha512-nMU3Uj8naWer7xpZTYJdxbAs6RIv/dxYzkYU8GSwgUtcAAlzjcPfX1w+RKRcYG8POlzMeayOQ/znfwxEGo5ulw==", "license": "Apache-2.0" }, "node_modules/@chevrotain/types": { "version": "11.1.2", - "resolved": "https://registry.npmjs.org/@chevrotain/types/-/types-11.1.2.tgz", - "integrity": "sha512-U+HFai5+zmJCkK86QsaJtoITlboZHBqrVketcO2ROv865xfCMSFpELQoz1GkX5GzME8pTa+3kbKrZHQtI0gdbw==", "license": "Apache-2.0" }, "node_modules/@chevrotain/utils": { "version": "11.1.2", - "resolved": "https://registry.npmjs.org/@chevrotain/utils/-/utils-11.1.2.tgz", - "integrity": "sha512-4mudFAQ6H+MqBTfqLmU7G1ZwRzCLfJEooL/fsF6rCX5eePMbGhoy5n4g+G4vlh2muDcsCTJtL+uKbOzWxs5LHA==", "license": "Apache-2.0" }, "node_modules/@colors/colors": { "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz", - "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==", "license": "MIT", "optional": true, "engines": { @@ -4556,8 +3960,6 @@ }, "node_modules/@cspotcode/source-map-support": { "version": "0.8.1", - "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", - "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", "devOptional": true, "license": "MIT", "dependencies": { @@ -4569,8 +3971,6 @@ }, "node_modules/@cspotcode/source-map-support/node_modules/@jridgewell/trace-mapping": { "version": "0.3.9", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", - "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", "devOptional": true, "license": "MIT", "dependencies": { @@ -4580,8 +3980,6 @@ }, "node_modules/@csstools/cascade-layer-name-parser": { "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@csstools/cascade-layer-name-parser/-/cascade-layer-name-parser-2.0.5.tgz", - "integrity": "sha512-p1ko5eHgV+MgXFVa4STPKpvPxr6ReS8oS2jzTukjR74i5zJNyWO1ZM1m8YKBXnzDKWfBN1ztLYlHxbVemDD88A==", "funding": [ { "type": "github", @@ -4603,8 +4001,6 @@ }, "node_modules/@csstools/color-helpers": { "version": "5.1.0", - "resolved": "https://registry.npmjs.org/@csstools/color-helpers/-/color-helpers-5.1.0.tgz", - "integrity": "sha512-S11EXWJyy0Mz5SYvRmY8nJYTFFd1LCNV+7cXyAgQtOOuzb4EsgfqDufL+9esx72/eLhsRdGZwaldu/h+E4t4BA==", "funding": [ { "type": "github", @@ -4622,8 +4018,6 @@ }, "node_modules/@csstools/css-calc": { "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@csstools/css-calc/-/css-calc-2.1.4.tgz", - "integrity": "sha512-3N8oaj+0juUw/1H3YwmDDJXCgTB1gKU6Hc/bB502u9zR0q2vd786XJH9QfrKIEgFlZmhZiq6epXl4rHqhzsIgQ==", "funding": [ { "type": "github", @@ -4645,8 +4039,6 @@ }, "node_modules/@csstools/css-color-parser": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@csstools/css-color-parser/-/css-color-parser-3.1.0.tgz", - "integrity": "sha512-nbtKwh3a6xNVIp/VRuXV64yTKnb1IjTAEEh3irzS+HkKjAOYLTGNb9pmVNntZ8iVBHcWDA2Dof0QtPgFI1BaTA==", "funding": [ { "type": "github", @@ -4672,8 +4064,6 @@ }, "node_modules/@csstools/css-parser-algorithms": { "version": "3.0.5", - "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-3.0.5.tgz", - "integrity": "sha512-DaDeUkXZKjdGhgYaHNJTV9pV7Y9B3b644jCLs9Upc3VeNGg6LWARAT6O+Q+/COo+2gg/bM5rhpMAtf70WqfBdQ==", "funding": [ { "type": "github", @@ -4694,8 +4084,6 @@ }, "node_modules/@csstools/css-tokenizer": { "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-3.0.4.tgz", - "integrity": "sha512-Vd/9EVDiu6PPJt9yAh6roZP6El1xHrdvIVGjyBsHR0RYwNHgL7FJPyIIW4fANJNG6FtyZfvlRPpFI4ZM/lubvw==", "funding": [ { "type": "github", @@ -4713,8 +4101,6 @@ }, "node_modules/@csstools/media-query-list-parser": { "version": "4.0.3", - "resolved": "https://registry.npmjs.org/@csstools/media-query-list-parser/-/media-query-list-parser-4.0.3.tgz", - "integrity": "sha512-HAYH7d3TLRHDOUQK4mZKf9k9Ph/m8Akstg66ywKR4SFAigjs3yBiUeZtFxywiTm5moZMAp/5W/ZuFnNXXYLuuQ==", "funding": [ { "type": "github", @@ -4736,8 +4122,6 @@ }, "node_modules/@csstools/postcss-alpha-function": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@csstools/postcss-alpha-function/-/postcss-alpha-function-1.0.1.tgz", - "integrity": "sha512-isfLLwksH3yHkFXfCI2Gcaqg7wGGHZZwunoJzEZk0yKYIokgre6hYVFibKL3SYAoR1kBXova8LB+JoO5vZzi9w==", "funding": [ { "type": "github", @@ -4765,8 +4149,6 @@ }, "node_modules/@csstools/postcss-cascade-layers": { "version": "5.0.2", - "resolved": "https://registry.npmjs.org/@csstools/postcss-cascade-layers/-/postcss-cascade-layers-5.0.2.tgz", - "integrity": "sha512-nWBE08nhO8uWl6kSAeCx4im7QfVko3zLrtgWZY4/bP87zrSPpSyN/3W3TDqz1jJuH+kbKOHXg5rJnK+ZVYcFFg==", "funding": [ { "type": "github", @@ -4791,8 +4173,6 @@ }, "node_modules/@csstools/postcss-cascade-layers/node_modules/@csstools/selector-specificity": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-5.0.0.tgz", - "integrity": "sha512-PCqQV3c4CoVm3kdPhyeZ07VmBRdH2EpMFA/pd9OASpOEC3aXNGoqPDAZ80D0cLpMBxnmk0+yNhGsEx31hq7Gtw==", "funding": [ { "type": "github", @@ -4813,8 +4193,6 @@ }, "node_modules/@csstools/postcss-cascade-layers/node_modules/postcss-selector-parser": { "version": "7.1.1", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.1.tgz", - "integrity": "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==", "license": "MIT", "dependencies": { "cssesc": "^3.0.0", @@ -4826,8 +4204,6 @@ }, "node_modules/@csstools/postcss-color-function": { "version": "4.0.12", - "resolved": "https://registry.npmjs.org/@csstools/postcss-color-function/-/postcss-color-function-4.0.12.tgz", - "integrity": "sha512-yx3cljQKRaSBc2hfh8rMZFZzChaFgwmO2JfFgFr1vMcF3C/uyy5I4RFIBOIWGq1D+XbKCG789CGkG6zzkLpagA==", "funding": [ { "type": "github", @@ -4855,8 +4231,6 @@ }, "node_modules/@csstools/postcss-color-function-display-p3-linear": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@csstools/postcss-color-function-display-p3-linear/-/postcss-color-function-display-p3-linear-1.0.1.tgz", - "integrity": "sha512-E5qusdzhlmO1TztYzDIi8XPdPoYOjoTY6HBYBCYSj+Gn4gQRBlvjgPQXzfzuPQqt8EhkC/SzPKObg4Mbn8/xMg==", "funding": [ { "type": "github", @@ -4884,8 +4258,6 @@ }, "node_modules/@csstools/postcss-color-mix-function": { "version": "3.0.12", - "resolved": "https://registry.npmjs.org/@csstools/postcss-color-mix-function/-/postcss-color-mix-function-3.0.12.tgz", - "integrity": "sha512-4STERZfCP5Jcs13P1U5pTvI9SkgLgfMUMhdXW8IlJWkzOOOqhZIjcNhWtNJZes2nkBDsIKJ0CJtFtuaZ00moag==", "funding": [ { "type": "github", @@ -4913,8 +4285,6 @@ }, "node_modules/@csstools/postcss-color-mix-variadic-function-arguments": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@csstools/postcss-color-mix-variadic-function-arguments/-/postcss-color-mix-variadic-function-arguments-1.0.2.tgz", - "integrity": "sha512-rM67Gp9lRAkTo+X31DUqMEq+iK+EFqsidfecmhrteErxJZb6tUoJBVQca1Vn1GpDql1s1rD1pKcuYzMsg7Z1KQ==", "funding": [ { "type": "github", @@ -4942,8 +4312,6 @@ }, "node_modules/@csstools/postcss-content-alt-text": { "version": "2.0.8", - "resolved": "https://registry.npmjs.org/@csstools/postcss-content-alt-text/-/postcss-content-alt-text-2.0.8.tgz", - "integrity": "sha512-9SfEW9QCxEpTlNMnpSqFaHyzsiRpZ5J5+KqCu1u5/eEJAWsMhzT40qf0FIbeeglEvrGRMdDzAxMIz3wqoGSb+Q==", "funding": [ { "type": "github", @@ -4970,8 +4338,6 @@ }, "node_modules/@csstools/postcss-contrast-color-function": { "version": "2.0.12", - "resolved": "https://registry.npmjs.org/@csstools/postcss-contrast-color-function/-/postcss-contrast-color-function-2.0.12.tgz", - "integrity": "sha512-YbwWckjK3qwKjeYz/CijgcS7WDUCtKTd8ShLztm3/i5dhh4NaqzsbYnhm4bjrpFpnLZ31jVcbK8YL77z3GBPzA==", "funding": [ { "type": "github", @@ -4999,8 +4365,6 @@ }, "node_modules/@csstools/postcss-exponential-functions": { "version": "2.0.9", - "resolved": "https://registry.npmjs.org/@csstools/postcss-exponential-functions/-/postcss-exponential-functions-2.0.9.tgz", - "integrity": "sha512-abg2W/PI3HXwS/CZshSa79kNWNZHdJPMBXeZNyPQFbbj8sKO3jXxOt/wF7juJVjyDTc6JrvaUZYFcSBZBhaxjw==", "funding": [ { "type": "github", @@ -5026,8 +4390,6 @@ }, "node_modules/@csstools/postcss-font-format-keywords": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@csstools/postcss-font-format-keywords/-/postcss-font-format-keywords-4.0.0.tgz", - "integrity": "sha512-usBzw9aCRDvchpok6C+4TXC57btc4bJtmKQWOHQxOVKen1ZfVqBUuCZ/wuqdX5GHsD0NRSr9XTP+5ID1ZZQBXw==", "funding": [ { "type": "github", @@ -5052,8 +4414,6 @@ }, "node_modules/@csstools/postcss-gamut-mapping": { "version": "2.0.11", - "resolved": "https://registry.npmjs.org/@csstools/postcss-gamut-mapping/-/postcss-gamut-mapping-2.0.11.tgz", - "integrity": "sha512-fCpCUgZNE2piVJKC76zFsgVW1apF6dpYsqGyH8SIeCcM4pTEsRTWTLCaJIMKFEundsCKwY1rwfhtrio04RJ4Dw==", "funding": [ { "type": "github", @@ -5079,8 +4439,6 @@ }, "node_modules/@csstools/postcss-gradients-interpolation-method": { "version": "5.0.12", - "resolved": "https://registry.npmjs.org/@csstools/postcss-gradients-interpolation-method/-/postcss-gradients-interpolation-method-5.0.12.tgz", - "integrity": "sha512-jugzjwkUY0wtNrZlFeyXzimUL3hN4xMvoPnIXxoZqxDvjZRiSh+itgHcVUWzJ2VwD/VAMEgCLvtaJHX+4Vj3Ow==", "funding": [ { "type": "github", @@ -5108,8 +4466,6 @@ }, "node_modules/@csstools/postcss-hwb-function": { "version": "4.0.12", - "resolved": "https://registry.npmjs.org/@csstools/postcss-hwb-function/-/postcss-hwb-function-4.0.12.tgz", - "integrity": "sha512-mL/+88Z53KrE4JdePYFJAQWFrcADEqsLprExCM04GDNgHIztwFzj0Mbhd/yxMBngq0NIlz58VVxjt5abNs1VhA==", "funding": [ { "type": "github", @@ -5137,8 +4493,6 @@ }, "node_modules/@csstools/postcss-ic-unit": { "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@csstools/postcss-ic-unit/-/postcss-ic-unit-4.0.4.tgz", - "integrity": "sha512-yQ4VmossuOAql65sCPppVO1yfb7hDscf4GseF0VCA/DTDaBc0Wtf8MTqVPfjGYlT5+2buokG0Gp7y0atYZpwjg==", "funding": [ { "type": "github", @@ -5164,8 +4518,6 @@ }, "node_modules/@csstools/postcss-initial": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@csstools/postcss-initial/-/postcss-initial-2.0.1.tgz", - "integrity": "sha512-L1wLVMSAZ4wovznquK0xmC7QSctzO4D0Is590bxpGqhqjboLXYA16dWZpfwImkdOgACdQ9PqXsuRroW6qPlEsg==", "funding": [ { "type": "github", @@ -5186,8 +4538,6 @@ }, "node_modules/@csstools/postcss-is-pseudo-class": { "version": "5.0.3", - "resolved": "https://registry.npmjs.org/@csstools/postcss-is-pseudo-class/-/postcss-is-pseudo-class-5.0.3.tgz", - "integrity": "sha512-jS/TY4SpG4gszAtIg7Qnf3AS2pjcUM5SzxpApOrlndMeGhIbaTzWBzzP/IApXoNWEW7OhcjkRT48jnAUIFXhAQ==", "funding": [ { "type": "github", @@ -5212,8 +4562,6 @@ }, "node_modules/@csstools/postcss-is-pseudo-class/node_modules/@csstools/selector-specificity": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-5.0.0.tgz", - "integrity": "sha512-PCqQV3c4CoVm3kdPhyeZ07VmBRdH2EpMFA/pd9OASpOEC3aXNGoqPDAZ80D0cLpMBxnmk0+yNhGsEx31hq7Gtw==", "funding": [ { "type": "github", @@ -5234,8 +4582,6 @@ }, "node_modules/@csstools/postcss-is-pseudo-class/node_modules/postcss-selector-parser": { "version": "7.1.1", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.1.tgz", - "integrity": "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==", "license": "MIT", "dependencies": { "cssesc": "^3.0.0", @@ -5247,8 +4593,6 @@ }, "node_modules/@csstools/postcss-light-dark-function": { "version": "2.0.11", - "resolved": "https://registry.npmjs.org/@csstools/postcss-light-dark-function/-/postcss-light-dark-function-2.0.11.tgz", - "integrity": "sha512-fNJcKXJdPM3Lyrbmgw2OBbaioU7yuKZtiXClf4sGdQttitijYlZMD5K7HrC/eF83VRWRrYq6OZ0Lx92leV2LFA==", "funding": [ { "type": "github", @@ -5275,8 +4619,6 @@ }, "node_modules/@csstools/postcss-logical-float-and-clear": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@csstools/postcss-logical-float-and-clear/-/postcss-logical-float-and-clear-3.0.0.tgz", - "integrity": "sha512-SEmaHMszwakI2rqKRJgE+8rpotFfne1ZS6bZqBoQIicFyV+xT1UF42eORPxJkVJVrH9C0ctUgwMSn3BLOIZldQ==", "funding": [ { "type": "github", @@ -5297,8 +4639,6 @@ }, "node_modules/@csstools/postcss-logical-overflow": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@csstools/postcss-logical-overflow/-/postcss-logical-overflow-2.0.0.tgz", - "integrity": "sha512-spzR1MInxPuXKEX2csMamshR4LRaSZ3UXVaRGjeQxl70ySxOhMpP2252RAFsg8QyyBXBzuVOOdx1+bVO5bPIzA==", "funding": [ { "type": "github", @@ -5319,8 +4659,6 @@ }, "node_modules/@csstools/postcss-logical-overscroll-behavior": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@csstools/postcss-logical-overscroll-behavior/-/postcss-logical-overscroll-behavior-2.0.0.tgz", - "integrity": "sha512-e/webMjoGOSYfqLunyzByZj5KKe5oyVg/YSbie99VEaSDE2kimFm0q1f6t/6Jo+VVCQ/jbe2Xy+uX+C4xzWs4w==", "funding": [ { "type": "github", @@ -5341,8 +4679,6 @@ }, "node_modules/@csstools/postcss-logical-resize": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@csstools/postcss-logical-resize/-/postcss-logical-resize-3.0.0.tgz", - "integrity": "sha512-DFbHQOFW/+I+MY4Ycd/QN6Dg4Hcbb50elIJCfnwkRTCX05G11SwViI5BbBlg9iHRl4ytB7pmY5ieAFk3ws7yyg==", "funding": [ { "type": "github", @@ -5366,8 +4702,6 @@ }, "node_modules/@csstools/postcss-logical-viewport-units": { "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@csstools/postcss-logical-viewport-units/-/postcss-logical-viewport-units-3.0.4.tgz", - "integrity": "sha512-q+eHV1haXA4w9xBwZLKjVKAWn3W2CMqmpNpZUk5kRprvSiBEGMgrNH3/sJZ8UA3JgyHaOt3jwT9uFa4wLX4EqQ==", "funding": [ { "type": "github", @@ -5392,8 +4726,6 @@ }, "node_modules/@csstools/postcss-media-minmax": { "version": "2.0.9", - "resolved": "https://registry.npmjs.org/@csstools/postcss-media-minmax/-/postcss-media-minmax-2.0.9.tgz", - "integrity": "sha512-af9Qw3uS3JhYLnCbqtZ9crTvvkR+0Se+bBqSr7ykAnl9yKhk6895z9rf+2F4dClIDJWxgn0iZZ1PSdkhrbs2ig==", "funding": [ { "type": "github", @@ -5420,8 +4752,6 @@ }, "node_modules/@csstools/postcss-media-queries-aspect-ratio-number-values": { "version": "3.0.5", - "resolved": "https://registry.npmjs.org/@csstools/postcss-media-queries-aspect-ratio-number-values/-/postcss-media-queries-aspect-ratio-number-values-3.0.5.tgz", - "integrity": "sha512-zhAe31xaaXOY2Px8IYfoVTB3wglbJUVigGphFLj6exb7cjZRH9A6adyE22XfFK3P2PzwRk0VDeTJmaxpluyrDg==", "funding": [ { "type": "github", @@ -5447,8 +4777,6 @@ }, "node_modules/@csstools/postcss-nested-calc": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@csstools/postcss-nested-calc/-/postcss-nested-calc-4.0.0.tgz", - "integrity": "sha512-jMYDdqrQQxE7k9+KjstC3NbsmC063n1FTPLCgCRS2/qHUbHM0mNy9pIn4QIiQGs9I/Bg98vMqw7mJXBxa0N88A==", "funding": [ { "type": "github", @@ -5473,8 +4801,6 @@ }, "node_modules/@csstools/postcss-normalize-display-values": { "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@csstools/postcss-normalize-display-values/-/postcss-normalize-display-values-4.0.1.tgz", - "integrity": "sha512-TQUGBuRvxdc7TgNSTevYqrL8oItxiwPDixk20qCB5me/W8uF7BPbhRrAvFuhEoywQp/woRsUZ6SJ+sU5idZAIA==", "funding": [ { "type": "github", @@ -5498,8 +4824,6 @@ }, "node_modules/@csstools/postcss-oklab-function": { "version": "4.0.12", - "resolved": "https://registry.npmjs.org/@csstools/postcss-oklab-function/-/postcss-oklab-function-4.0.12.tgz", - "integrity": "sha512-HhlSmnE1NKBhXsTnNGjxvhryKtO7tJd1w42DKOGFD6jSHtYOrsJTQDKPMwvOfrzUAk8t7GcpIfRyM7ssqHpFjg==", "funding": [ { "type": "github", @@ -5527,8 +4851,6 @@ }, "node_modules/@csstools/postcss-position-area-property": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@csstools/postcss-position-area-property/-/postcss-position-area-property-1.0.0.tgz", - "integrity": "sha512-fUP6KR8qV2NuUZV3Cw8itx0Ep90aRjAZxAEzC3vrl6yjFv+pFsQbR18UuQctEKmA72K9O27CoYiKEgXxkqjg8Q==", "funding": [ { "type": "github", @@ -5549,8 +4871,6 @@ }, "node_modules/@csstools/postcss-progressive-custom-properties": { "version": "4.2.1", - "resolved": "https://registry.npmjs.org/@csstools/postcss-progressive-custom-properties/-/postcss-progressive-custom-properties-4.2.1.tgz", - "integrity": "sha512-uPiiXf7IEKtUQXsxu6uWtOlRMXd2QWWy5fhxHDnPdXKCQckPP3E34ZgDoZ62r2iT+UOgWsSbM4NvHE5m3mAEdw==", "funding": [ { "type": "github", @@ -5574,8 +4894,6 @@ }, "node_modules/@csstools/postcss-property-rule-prelude-list": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@csstools/postcss-property-rule-prelude-list/-/postcss-property-rule-prelude-list-1.0.0.tgz", - "integrity": "sha512-IxuQjUXq19fobgmSSvUDO7fVwijDJaZMvWQugxfEUxmjBeDCVaDuMpsZ31MsTm5xbnhA+ElDi0+rQ7sQQGisFA==", "funding": [ { "type": "github", @@ -5600,8 +4918,6 @@ }, "node_modules/@csstools/postcss-random-function": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@csstools/postcss-random-function/-/postcss-random-function-2.0.1.tgz", - "integrity": "sha512-q+FQaNiRBhnoSNo+GzqGOIBKoHQ43lYz0ICrV+UudfWnEF6ksS6DsBIJSISKQT2Bvu3g4k6r7t0zYrk5pDlo8w==", "funding": [ { "type": "github", @@ -5627,8 +4943,6 @@ }, "node_modules/@csstools/postcss-relative-color-syntax": { "version": "3.0.12", - "resolved": "https://registry.npmjs.org/@csstools/postcss-relative-color-syntax/-/postcss-relative-color-syntax-3.0.12.tgz", - "integrity": "sha512-0RLIeONxu/mtxRtf3o41Lq2ghLimw0w9ByLWnnEVuy89exmEEq8bynveBxNW3nyHqLAFEeNtVEmC1QK9MZ8Huw==", "funding": [ { "type": "github", @@ -5656,8 +4970,6 @@ }, "node_modules/@csstools/postcss-scope-pseudo-class": { "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@csstools/postcss-scope-pseudo-class/-/postcss-scope-pseudo-class-4.0.1.tgz", - "integrity": "sha512-IMi9FwtH6LMNuLea1bjVMQAsUhFxJnyLSgOp/cpv5hrzWmrUYU5fm0EguNDIIOHUqzXode8F/1qkC/tEo/qN8Q==", "funding": [ { "type": "github", @@ -5681,8 +4993,6 @@ }, "node_modules/@csstools/postcss-scope-pseudo-class/node_modules/postcss-selector-parser": { "version": "7.1.1", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.1.tgz", - "integrity": "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==", "license": "MIT", "dependencies": { "cssesc": "^3.0.0", @@ -5694,8 +5004,6 @@ }, "node_modules/@csstools/postcss-sign-functions": { "version": "1.1.4", - "resolved": "https://registry.npmjs.org/@csstools/postcss-sign-functions/-/postcss-sign-functions-1.1.4.tgz", - "integrity": "sha512-P97h1XqRPcfcJndFdG95Gv/6ZzxUBBISem0IDqPZ7WMvc/wlO+yU0c5D/OCpZ5TJoTt63Ok3knGk64N+o6L2Pg==", "funding": [ { "type": "github", @@ -5721,8 +5029,6 @@ }, "node_modules/@csstools/postcss-stepped-value-functions": { "version": "4.0.9", - "resolved": "https://registry.npmjs.org/@csstools/postcss-stepped-value-functions/-/postcss-stepped-value-functions-4.0.9.tgz", - "integrity": "sha512-h9btycWrsex4dNLeQfyU3y3w40LMQooJWFMm/SK9lrKguHDcFl4VMkncKKoXi2z5rM9YGWbUQABI8BT2UydIcA==", "funding": [ { "type": "github", @@ -5748,8 +5054,6 @@ }, "node_modules/@csstools/postcss-syntax-descriptor-syntax-production": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@csstools/postcss-syntax-descriptor-syntax-production/-/postcss-syntax-descriptor-syntax-production-1.0.1.tgz", - "integrity": "sha512-GneqQWefjM//f4hJ/Kbox0C6f2T7+pi4/fqTqOFGTL3EjnvOReTqO1qUQ30CaUjkwjYq9qZ41hzarrAxCc4gow==", "funding": [ { "type": "github", @@ -5773,8 +5077,6 @@ }, "node_modules/@csstools/postcss-system-ui-font-family": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@csstools/postcss-system-ui-font-family/-/postcss-system-ui-font-family-1.0.0.tgz", - "integrity": "sha512-s3xdBvfWYfoPSBsikDXbuorcMG1nN1M6GdU0qBsGfcmNR0A/qhloQZpTxjA3Xsyrk1VJvwb2pOfiOT3at/DuIQ==", "funding": [ { "type": "github", @@ -5799,8 +5101,6 @@ }, "node_modules/@csstools/postcss-text-decoration-shorthand": { "version": "4.0.3", - "resolved": "https://registry.npmjs.org/@csstools/postcss-text-decoration-shorthand/-/postcss-text-decoration-shorthand-4.0.3.tgz", - "integrity": "sha512-KSkGgZfx0kQjRIYnpsD7X2Om9BUXX/Kii77VBifQW9Ih929hK0KNjVngHDH0bFB9GmfWcR9vJYJJRvw/NQjkrA==", "funding": [ { "type": "github", @@ -5825,8 +5125,6 @@ }, "node_modules/@csstools/postcss-trigonometric-functions": { "version": "4.0.9", - "resolved": "https://registry.npmjs.org/@csstools/postcss-trigonometric-functions/-/postcss-trigonometric-functions-4.0.9.tgz", - "integrity": "sha512-Hnh5zJUdpNrJqK9v1/E3BbrQhaDTj5YiX7P61TOvUhoDHnUmsNNxcDAgkQ32RrcWx9GVUvfUNPcUkn8R3vIX6A==", "funding": [ { "type": "github", @@ -5852,8 +5150,6 @@ }, "node_modules/@csstools/postcss-unset-value": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@csstools/postcss-unset-value/-/postcss-unset-value-4.0.0.tgz", - "integrity": "sha512-cBz3tOCI5Fw6NIFEwU3RiwK6mn3nKegjpJuzCndoGq3BZPkUjnsq7uQmIeMNeMbMk7YD2MfKcgCpZwX5jyXqCA==", "funding": [ { "type": "github", @@ -5874,8 +5170,6 @@ }, "node_modules/@csstools/utilities": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@csstools/utilities/-/utilities-2.0.0.tgz", - "integrity": "sha512-5VdOr0Z71u+Yp3ozOx8T11N703wIFGVRgOWbOZMKgglPJsWA54MRIoMNVMa7shUToIhx5J8vX4sOZgD2XiihiQ==", "funding": [ { "type": "github", @@ -5896,8 +5190,6 @@ }, "node_modules/@discoveryjs/json-ext": { "version": "0.5.7", - "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz", - "integrity": "sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==", "license": "MIT", "engines": { "node": ">=10.0.0" @@ -5905,8 +5197,6 @@ }, "node_modules/@docsearch/core": { "version": "4.6.0", - "resolved": "https://registry.npmjs.org/@docsearch/core/-/core-4.6.0.tgz", - "integrity": "sha512-IqG3oSd529jVRQ4dWZQKwZwQLVd//bWJTz2HiL0LkiHrI4U/vLrBasKB7lwQB/69nBAcCgs3TmudxTZSLH/ZQg==", "license": "MIT", "peerDependencies": { "@types/react": ">= 16.8.0 < 20.0.0", @@ -5927,14 +5217,10 @@ }, "node_modules/@docsearch/css": { "version": "4.6.0", - "resolved": "https://registry.npmjs.org/@docsearch/css/-/css-4.6.0.tgz", - "integrity": "sha512-YlcAimkXclvqta47g47efzCM5CFxDwv2ClkDfEs/fC/Ak0OxPH2b3czwa4o8O1TRBf+ujFF2RiUwszz2fPVNJQ==", "license": "MIT" }, "node_modules/@docsearch/react": { "version": "4.6.0", - "resolved": "https://registry.npmjs.org/@docsearch/react/-/react-4.6.0.tgz", - "integrity": "sha512-j8H5B4ArGxBPBWvw3X0J0Rm/Pjv2JDa2rV5OE0DLTp5oiBCptIJ/YlNOhZxuzbO2nwge+o3Z52nJRi3hryK9cA==", "license": "MIT", "dependencies": { "@algolia/autocomplete-core": "1.19.2", @@ -5964,8 +5250,6 @@ }, "node_modules/@docusaurus/babel": { "version": "3.9.2", - "resolved": "https://registry.npmjs.org/@docusaurus/babel/-/babel-3.9.2.tgz", - "integrity": "sha512-GEANdi/SgER+L7Japs25YiGil/AUDnFFHaCGPBbundxoWtCkA2lmy7/tFmgED4y1htAy6Oi4wkJEQdGssnw9MA==", "license": "MIT", "dependencies": { "@babel/core": "^7.25.9", @@ -5990,8 +5274,6 @@ }, "node_modules/@docusaurus/babel/node_modules/fs-extra": { "version": "11.3.3", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.3.tgz", - "integrity": "sha512-VWSRii4t0AFm6ixFFmLLx1t7wS1gh+ckoa84aOeapGum0h+EZd1EhEumSB+ZdDLnEPuucsVB9oB7cxJHap6Afg==", "license": "MIT", "dependencies": { "graceful-fs": "^4.2.0", @@ -6004,8 +5286,6 @@ }, "node_modules/@docusaurus/babel/node_modules/jsonfile": { "version": "6.2.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.0.tgz", - "integrity": "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==", "license": "MIT", "dependencies": { "universalify": "^2.0.0" @@ -6016,8 +5296,6 @@ }, "node_modules/@docusaurus/babel/node_modules/universalify": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", - "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", "license": "MIT", "engines": { "node": ">= 10.0.0" @@ -6025,8 +5303,6 @@ }, "node_modules/@docusaurus/bundler": { "version": "3.9.2", - "resolved": "https://registry.npmjs.org/@docusaurus/bundler/-/bundler-3.9.2.tgz", - "integrity": "sha512-ZOVi6GYgTcsZcUzjblpzk3wH1Fya2VNpd5jtHoCCFcJlMQ1EYXZetfAnRHLcyiFeBABaI1ltTYbOBtH/gahGVA==", "license": "MIT", "dependencies": { "@babel/core": "^7.25.9", @@ -6068,8 +5344,6 @@ }, "node_modules/@docusaurus/bundler/node_modules/css-loader": { "version": "6.11.0", - "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-6.11.0.tgz", - "integrity": "sha512-CTJ+AEQJjq5NzLga5pE39qdiSV56F8ywCIsqNIRF0r7BDgWsN25aazToqAFg7ZrtA/U016xudB3ffgweORxX7g==", "license": "MIT", "dependencies": { "icss-utils": "^5.1.0", @@ -6103,8 +5377,6 @@ }, "node_modules/@docusaurus/core": { "version": "3.9.2", - "resolved": "https://registry.npmjs.org/@docusaurus/core/-/core-3.9.2.tgz", - "integrity": "sha512-HbjwKeC+pHUFBfLMNzuSjqFE/58+rLVKmOU3lxQrpsxLBOGosYco/Q0GduBb0/jEMRiyEqjNT/01rRdOMWq5pw==", "license": "MIT", "dependencies": { "@docusaurus/babel": "3.9.2", @@ -6164,8 +5436,6 @@ }, "node_modules/@docusaurus/core/node_modules/ansi-regex": { "version": "6.2.2", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", - "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", "license": "MIT", "engines": { "node": ">=12" @@ -6176,8 +5446,6 @@ }, "node_modules/@docusaurus/core/node_modules/boxen": { "version": "6.2.1", - "resolved": "https://registry.npmjs.org/boxen/-/boxen-6.2.1.tgz", - "integrity": "sha512-H4PEsJXfFI/Pt8sjDWbHlQPx4zL/bvSQjcilJmaulGt5mLDorHOHpmdXAJcBcmru7PhYSp/cDMWRko4ZUMFkSw==", "license": "MIT", "dependencies": { "ansi-align": "^3.0.1", @@ -6198,8 +5466,6 @@ }, "node_modules/@docusaurus/core/node_modules/chalk": { "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", @@ -6214,8 +5480,6 @@ }, "node_modules/@docusaurus/core/node_modules/chalk/node_modules/ansi-styles": { "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "license": "MIT", "dependencies": { "color-convert": "^2.0.1" @@ -6229,8 +5493,6 @@ }, "node_modules/@docusaurus/core/node_modules/commander": { "version": "5.1.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz", - "integrity": "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==", "license": "MIT", "engines": { "node": ">= 6" @@ -6238,14 +5500,10 @@ }, "node_modules/@docusaurus/core/node_modules/emoji-regex": { "version": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", "license": "MIT" }, "node_modules/@docusaurus/core/node_modules/fs-extra": { "version": "11.3.3", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.3.tgz", - "integrity": "sha512-VWSRii4t0AFm6ixFFmLLx1t7wS1gh+ckoa84aOeapGum0h+EZd1EhEumSB+ZdDLnEPuucsVB9oB7cxJHap6Afg==", "license": "MIT", "dependencies": { "graceful-fs": "^4.2.0", @@ -6258,8 +5516,6 @@ }, "node_modules/@docusaurus/core/node_modules/jsonfile": { "version": "6.2.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.0.tgz", - "integrity": "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==", "license": "MIT", "dependencies": { "universalify": "^2.0.0" @@ -6270,8 +5526,6 @@ }, "node_modules/@docusaurus/core/node_modules/p-map": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", - "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", "license": "MIT", "dependencies": { "aggregate-error": "^3.0.0" @@ -6285,8 +5539,6 @@ }, "node_modules/@docusaurus/core/node_modules/react-router-dom": { "version": "5.3.4", - "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-5.3.4.tgz", - "integrity": "sha512-m4EqFMHv/Ih4kpcBCONHbkT68KoAeHN4p3lAGoNryfHi0dMy0kCzEZakiKRsvg5wHZ/JLrLW8o8KomWiz/qbYQ==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.12.13", @@ -6303,8 +5555,6 @@ }, "node_modules/@docusaurus/core/node_modules/string-width": { "version": "5.1.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", - "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", "license": "MIT", "dependencies": { "eastasianwidth": "^0.2.0", @@ -6320,8 +5570,6 @@ }, "node_modules/@docusaurus/core/node_modules/strip-ansi": { "version": "7.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz", - "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", "license": "MIT", "dependencies": { "ansi-regex": "^6.2.2" @@ -6335,8 +5583,6 @@ }, "node_modules/@docusaurus/core/node_modules/type-fest": { "version": "2.19.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz", - "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==", "license": "(MIT OR CC0-1.0)", "engines": { "node": ">=12.20" @@ -6347,8 +5593,6 @@ }, "node_modules/@docusaurus/core/node_modules/universalify": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", - "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", "license": "MIT", "engines": { "node": ">= 10.0.0" @@ -6356,8 +5600,6 @@ }, "node_modules/@docusaurus/core/node_modules/widest-line": { "version": "4.0.1", - "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-4.0.1.tgz", - "integrity": "sha512-o0cyEG0e8GPzT4iGHphIOh0cJOV8fivsXxddQasHPHfoZf1ZexrfeA21w2NaEN1RHE+fXlfISmOE8R9N3u3Qig==", "license": "MIT", "dependencies": { "string-width": "^5.0.1" @@ -6371,8 +5613,6 @@ }, "node_modules/@docusaurus/core/node_modules/wrap-ansi": { "version": "8.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", - "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", "license": "MIT", "dependencies": { "ansi-styles": "^6.1.0", @@ -6388,8 +5628,6 @@ }, "node_modules/@docusaurus/cssnano-preset": { "version": "3.9.2", - "resolved": "https://registry.npmjs.org/@docusaurus/cssnano-preset/-/cssnano-preset-3.9.2.tgz", - "integrity": "sha512-8gBKup94aGttRduABsj7bpPFTX7kbwu+xh3K9NMCF5K4bWBqTFYW+REKHF6iBVDHRJ4grZdIPbvkiHd/XNKRMQ==", "license": "MIT", "dependencies": { "cssnano-preset-advanced": "^6.1.2", @@ -6403,8 +5641,6 @@ }, "node_modules/@docusaurus/faster": { "version": "3.9.2", - "resolved": "https://registry.npmjs.org/@docusaurus/faster/-/faster-3.9.2.tgz", - "integrity": "sha512-DEVIwhbrZZ4ir31X+qQNEQqDWkgCJUV6kiPPAd2MGTY8n5/n0c4B8qA5k1ipF2izwH00JEf0h6Daaut71zzkyw==", "devOptional": true, "license": "MIT", "dependencies": { @@ -6427,8 +5663,6 @@ }, "node_modules/@docusaurus/logger": { "version": "3.9.2", - "resolved": "https://registry.npmjs.org/@docusaurus/logger/-/logger-3.9.2.tgz", - "integrity": "sha512-/SVCc57ByARzGSU60c50rMyQlBuMIJCjcsJlkphxY6B0GV4UH3tcA1994N8fFfbJ9kX3jIBe/xg3XP5qBtGDbA==", "license": "MIT", "dependencies": { "chalk": "^4.1.2", @@ -6440,8 +5674,6 @@ }, "node_modules/@docusaurus/logger/node_modules/ansi-styles": { "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "license": "MIT", "dependencies": { "color-convert": "^2.0.1" @@ -6455,8 +5687,6 @@ }, "node_modules/@docusaurus/logger/node_modules/chalk": { "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", @@ -6471,8 +5701,6 @@ }, "node_modules/@docusaurus/mdx-loader": { "version": "3.9.2", - "resolved": "https://registry.npmjs.org/@docusaurus/mdx-loader/-/mdx-loader-3.9.2.tgz", - "integrity": "sha512-wiYoGwF9gdd6rev62xDU8AAM8JuLI/hlwOtCzMmYcspEkzecKrP8J8X+KpYnTlACBUUtXNJpSoCwFWJhLRevzQ==", "license": "MIT", "dependencies": { "@docusaurus/logger": "3.9.2", @@ -6510,8 +5738,6 @@ }, "node_modules/@docusaurus/mdx-loader/node_modules/fs-extra": { "version": "11.3.3", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.3.tgz", - "integrity": "sha512-VWSRii4t0AFm6ixFFmLLx1t7wS1gh+ckoa84aOeapGum0h+EZd1EhEumSB+ZdDLnEPuucsVB9oB7cxJHap6Afg==", "license": "MIT", "dependencies": { "graceful-fs": "^4.2.0", @@ -6524,8 +5750,6 @@ }, "node_modules/@docusaurus/mdx-loader/node_modules/jsonfile": { "version": "6.2.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.0.tgz", - "integrity": "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==", "license": "MIT", "dependencies": { "universalify": "^2.0.0" @@ -6536,8 +5760,6 @@ }, "node_modules/@docusaurus/mdx-loader/node_modules/universalify": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", - "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", "license": "MIT", "engines": { "node": ">= 10.0.0" @@ -6545,8 +5767,6 @@ }, "node_modules/@docusaurus/module-type-aliases": { "version": "3.9.2", - "resolved": "https://registry.npmjs.org/@docusaurus/module-type-aliases/-/module-type-aliases-3.9.2.tgz", - "integrity": "sha512-8qVe2QA9hVLzvnxP46ysuofJUIc/yYQ82tvA/rBTrnpXtCjNSFLxEZfd5U8cYZuJIVlkPxamsIgwd5tGZXfvew==", "license": "MIT", "dependencies": { "@docusaurus/types": "3.9.2", @@ -6564,8 +5784,6 @@ }, "node_modules/@docusaurus/plugin-client-redirects": { "version": "3.9.2", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-client-redirects/-/plugin-client-redirects-3.9.2.tgz", - "integrity": "sha512-lUgMArI9vyOYMzLRBUILcg9vcPTCyyI2aiuXq/4npcMVqOr6GfmwtmBYWSbNMlIUM0147smm4WhpXD0KFboffw==", "dev": true, "license": "MIT", "dependencies": { @@ -6589,8 +5807,6 @@ }, "node_modules/@docusaurus/plugin-client-redirects/node_modules/fs-extra": { "version": "11.3.3", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.3.tgz", - "integrity": "sha512-VWSRii4t0AFm6ixFFmLLx1t7wS1gh+ckoa84aOeapGum0h+EZd1EhEumSB+ZdDLnEPuucsVB9oB7cxJHap6Afg==", "dev": true, "license": "MIT", "dependencies": { @@ -6604,8 +5820,6 @@ }, "node_modules/@docusaurus/plugin-client-redirects/node_modules/jsonfile": { "version": "6.2.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.0.tgz", - "integrity": "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==", "dev": true, "license": "MIT", "dependencies": { @@ -6617,8 +5831,6 @@ }, "node_modules/@docusaurus/plugin-client-redirects/node_modules/universalify": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", - "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", "dev": true, "license": "MIT", "engines": { @@ -6627,8 +5839,6 @@ }, "node_modules/@docusaurus/plugin-content-blog": { "version": "3.9.2", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-blog/-/plugin-content-blog-3.9.2.tgz", - "integrity": "sha512-3I2HXy3L1QcjLJLGAoTvoBnpOwa6DPUa3Q0dMK19UTY9mhPkKQg/DYhAGTiBUKcTR0f08iw7kLPqOhIgdV3eVQ==", "license": "MIT", "dependencies": { "@docusaurus/core": "3.9.2", @@ -6661,8 +5871,6 @@ }, "node_modules/@docusaurus/plugin-content-blog/node_modules/fs-extra": { "version": "11.3.3", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.3.tgz", - "integrity": "sha512-VWSRii4t0AFm6ixFFmLLx1t7wS1gh+ckoa84aOeapGum0h+EZd1EhEumSB+ZdDLnEPuucsVB9oB7cxJHap6Afg==", "license": "MIT", "dependencies": { "graceful-fs": "^4.2.0", @@ -6675,8 +5883,6 @@ }, "node_modules/@docusaurus/plugin-content-blog/node_modules/jsonfile": { "version": "6.2.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.0.tgz", - "integrity": "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==", "license": "MIT", "dependencies": { "universalify": "^2.0.0" @@ -6687,8 +5893,6 @@ }, "node_modules/@docusaurus/plugin-content-blog/node_modules/universalify": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", - "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", "license": "MIT", "engines": { "node": ">= 10.0.0" @@ -6696,8 +5900,6 @@ }, "node_modules/@docusaurus/plugin-content-docs": { "version": "3.9.2", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-docs/-/plugin-content-docs-3.9.2.tgz", - "integrity": "sha512-C5wZsGuKTY8jEYsqdxhhFOe1ZDjH0uIYJ9T/jebHwkyxqnr4wW0jTkB72OMqNjsoQRcb0JN3PcSeTwFlVgzCZg==", "license": "MIT", "dependencies": { "@docusaurus/core": "3.9.2", @@ -6729,8 +5931,6 @@ }, "node_modules/@docusaurus/plugin-content-docs/node_modules/fs-extra": { "version": "11.3.3", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.3.tgz", - "integrity": "sha512-VWSRii4t0AFm6ixFFmLLx1t7wS1gh+ckoa84aOeapGum0h+EZd1EhEumSB+ZdDLnEPuucsVB9oB7cxJHap6Afg==", "license": "MIT", "dependencies": { "graceful-fs": "^4.2.0", @@ -6743,8 +5943,6 @@ }, "node_modules/@docusaurus/plugin-content-docs/node_modules/jsonfile": { "version": "6.2.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.0.tgz", - "integrity": "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==", "license": "MIT", "dependencies": { "universalify": "^2.0.0" @@ -6755,8 +5953,6 @@ }, "node_modules/@docusaurus/plugin-content-docs/node_modules/universalify": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", - "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", "license": "MIT", "engines": { "node": ">= 10.0.0" @@ -6764,8 +5960,6 @@ }, "node_modules/@docusaurus/plugin-content-pages": { "version": "3.9.2", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-pages/-/plugin-content-pages-3.9.2.tgz", - "integrity": "sha512-s4849w/p4noXUrGpPUF0BPqIAfdAe76BLaRGAGKZ1gTDNiGxGcpsLcwJ9OTi1/V8A+AzvsmI9pkjie2zjIQZKA==", "license": "MIT", "dependencies": { "@docusaurus/core": "3.9.2", @@ -6787,8 +5981,6 @@ }, "node_modules/@docusaurus/plugin-content-pages/node_modules/fs-extra": { "version": "11.3.3", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.3.tgz", - "integrity": "sha512-VWSRii4t0AFm6ixFFmLLx1t7wS1gh+ckoa84aOeapGum0h+EZd1EhEumSB+ZdDLnEPuucsVB9oB7cxJHap6Afg==", "license": "MIT", "dependencies": { "graceful-fs": "^4.2.0", @@ -6801,8 +5993,6 @@ }, "node_modules/@docusaurus/plugin-content-pages/node_modules/jsonfile": { "version": "6.2.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.0.tgz", - "integrity": "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==", "license": "MIT", "dependencies": { "universalify": "^2.0.0" @@ -6813,8 +6003,6 @@ }, "node_modules/@docusaurus/plugin-content-pages/node_modules/universalify": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", - "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", "license": "MIT", "engines": { "node": ">= 10.0.0" @@ -6822,8 +6010,6 @@ }, "node_modules/@docusaurus/plugin-css-cascade-layers": { "version": "3.9.2", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-css-cascade-layers/-/plugin-css-cascade-layers-3.9.2.tgz", - "integrity": "sha512-w1s3+Ss+eOQbscGM4cfIFBlVg/QKxyYgj26k5AnakuHkKxH6004ZtuLe5awMBotIYF2bbGDoDhpgQ4r/kcj4rQ==", "license": "MIT", "dependencies": { "@docusaurus/core": "3.9.2", @@ -6838,8 +6024,6 @@ }, "node_modules/@docusaurus/plugin-debug": { "version": "3.9.2", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-debug/-/plugin-debug-3.9.2.tgz", - "integrity": "sha512-j7a5hWuAFxyQAkilZwhsQ/b3T7FfHZ+0dub6j/GxKNFJp2h9qk/P1Bp7vrGASnvA9KNQBBL1ZXTe7jlh4VdPdA==", "license": "MIT", "dependencies": { "@docusaurus/core": "3.9.2", @@ -6859,8 +6043,6 @@ }, "node_modules/@docusaurus/plugin-debug/node_modules/fs-extra": { "version": "11.3.3", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.3.tgz", - "integrity": "sha512-VWSRii4t0AFm6ixFFmLLx1t7wS1gh+ckoa84aOeapGum0h+EZd1EhEumSB+ZdDLnEPuucsVB9oB7cxJHap6Afg==", "license": "MIT", "dependencies": { "graceful-fs": "^4.2.0", @@ -6873,8 +6055,6 @@ }, "node_modules/@docusaurus/plugin-debug/node_modules/jsonfile": { "version": "6.2.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.0.tgz", - "integrity": "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==", "license": "MIT", "dependencies": { "universalify": "^2.0.0" @@ -6885,8 +6065,6 @@ }, "node_modules/@docusaurus/plugin-debug/node_modules/universalify": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", - "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", "license": "MIT", "engines": { "node": ">= 10.0.0" @@ -6894,8 +6072,6 @@ }, "node_modules/@docusaurus/plugin-google-analytics": { "version": "3.9.2", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-analytics/-/plugin-google-analytics-3.9.2.tgz", - "integrity": "sha512-mAwwQJ1Us9jL/lVjXtErXto4p4/iaLlweC54yDUK1a97WfkC6Z2k5/769JsFgwOwOP+n5mUQGACXOEQ0XDuVUw==", "license": "MIT", "dependencies": { "@docusaurus/core": "3.9.2", @@ -6913,8 +6089,6 @@ }, "node_modules/@docusaurus/plugin-google-gtag": { "version": "3.9.2", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-gtag/-/plugin-google-gtag-3.9.2.tgz", - "integrity": "sha512-YJ4lDCphabBtw19ooSlc1MnxtYGpjFV9rEdzjLsUnBCeis2djUyCozZaFhCg6NGEwOn7HDDyMh0yzcdRpnuIvA==", "license": "MIT", "dependencies": { "@docusaurus/core": "3.9.2", @@ -6933,14 +6107,10 @@ }, "node_modules/@docusaurus/plugin-google-gtag/node_modules/@types/gtag.js": { "version": "0.0.12", - "resolved": "https://registry.npmjs.org/@types/gtag.js/-/gtag.js-0.0.12.tgz", - "integrity": "sha512-YQV9bUsemkzG81Ea295/nF/5GijnD2Af7QhEofh7xu+kvCN6RdodgNwwGWXB5GMI3NoyvQo0odNctoH/qLMIpg==", "license": "MIT" }, "node_modules/@docusaurus/plugin-google-tag-manager": { "version": "3.9.2", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-tag-manager/-/plugin-google-tag-manager-3.9.2.tgz", - "integrity": "sha512-LJtIrkZN/tuHD8NqDAW1Tnw0ekOwRTfobWPsdO15YxcicBo2ykKF0/D6n0vVBfd3srwr9Z6rzrIWYrMzBGrvNw==", "license": "MIT", "dependencies": { "@docusaurus/core": "3.9.2", @@ -6958,8 +6128,6 @@ }, "node_modules/@docusaurus/plugin-sitemap": { "version": "3.9.2", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-sitemap/-/plugin-sitemap-3.9.2.tgz", - "integrity": "sha512-WLh7ymgDXjG8oPoM/T4/zUP7KcSuFYRZAUTl8vR6VzYkfc18GBM4xLhcT+AKOwun6kBivYKUJf+vlqYJkm+RHw==", "license": "MIT", "dependencies": { "@docusaurus/core": "3.9.2", @@ -6982,8 +6150,6 @@ }, "node_modules/@docusaurus/plugin-sitemap/node_modules/fs-extra": { "version": "11.3.3", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.3.tgz", - "integrity": "sha512-VWSRii4t0AFm6ixFFmLLx1t7wS1gh+ckoa84aOeapGum0h+EZd1EhEumSB+ZdDLnEPuucsVB9oB7cxJHap6Afg==", "license": "MIT", "dependencies": { "graceful-fs": "^4.2.0", @@ -6996,8 +6162,6 @@ }, "node_modules/@docusaurus/plugin-sitemap/node_modules/jsonfile": { "version": "6.2.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.0.tgz", - "integrity": "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==", "license": "MIT", "dependencies": { "universalify": "^2.0.0" @@ -7008,8 +6172,6 @@ }, "node_modules/@docusaurus/plugin-sitemap/node_modules/universalify": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", - "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", "license": "MIT", "engines": { "node": ">= 10.0.0" @@ -7017,8 +6179,6 @@ }, "node_modules/@docusaurus/plugin-svgr": { "version": "3.9.2", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-svgr/-/plugin-svgr-3.9.2.tgz", - "integrity": "sha512-n+1DE+5b3Lnf27TgVU5jM1d4x5tUh2oW5LTsBxJX4PsAPV0JGcmI6p3yLYtEY0LRVEIJh+8RsdQmRE66wSV8mw==", "license": "MIT", "dependencies": { "@docusaurus/core": "3.9.2", @@ -7040,8 +6200,6 @@ }, "node_modules/@docusaurus/preset-classic": { "version": "3.9.2", - "resolved": "https://registry.npmjs.org/@docusaurus/preset-classic/-/preset-classic-3.9.2.tgz", - "integrity": "sha512-IgyYO2Gvaigi21LuDIe+nvmN/dfGXAiMcV/murFqcpjnZc7jxFAxW+9LEjdPt61uZLxG4ByW/oUmX/DDK9t/8w==", "license": "MIT", "dependencies": { "@docusaurus/core": "3.9.2", @@ -7070,8 +6228,6 @@ }, "node_modules/@docusaurus/theme-classic": { "version": "3.9.2", - "resolved": "https://registry.npmjs.org/@docusaurus/theme-classic/-/theme-classic-3.9.2.tgz", - "integrity": "sha512-IGUsArG5hhekXd7RDb11v94ycpJpFdJPkLnt10fFQWOVxAtq5/D7hT6lzc2fhyQKaaCE62qVajOMKL7OiAFAIA==", "license": "MIT", "dependencies": { "@docusaurus/core": "3.9.2", @@ -7110,8 +6266,6 @@ }, "node_modules/@docusaurus/theme-classic/node_modules/react-router-dom": { "version": "5.3.4", - "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-5.3.4.tgz", - "integrity": "sha512-m4EqFMHv/Ih4kpcBCONHbkT68KoAeHN4p3lAGoNryfHi0dMy0kCzEZakiKRsvg5wHZ/JLrLW8o8KomWiz/qbYQ==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.12.13", @@ -7128,8 +6282,6 @@ }, "node_modules/@docusaurus/theme-common": { "version": "3.9.2", - "resolved": "https://registry.npmjs.org/@docusaurus/theme-common/-/theme-common-3.9.2.tgz", - "integrity": "sha512-6c4DAbR6n6nPbnZhY2V3tzpnKnGL+6aOsLvFL26VRqhlczli9eWG0VDUNoCQEPnGwDMhPS42UhSAnz5pThm5Ag==", "license": "MIT", "dependencies": { "@docusaurus/mdx-loader": "3.9.2", @@ -7156,8 +6308,6 @@ }, "node_modules/@docusaurus/theme-live-codeblock": { "version": "3.9.2", - "resolved": "https://registry.npmjs.org/@docusaurus/theme-live-codeblock/-/theme-live-codeblock-3.9.2.tgz", - "integrity": "sha512-cgxxZh18dI5Q4iV0GLmwqXtgZbTLOnb0TYgZRiUh0mnIGbuNWFUhUYXXl5owKbDfIXFdFAiI/owJKM83howEAw==", "license": "MIT", "dependencies": { "@docusaurus/core": "3.9.2", @@ -7180,8 +6330,6 @@ }, "node_modules/@docusaurus/theme-live-codeblock/node_modules/fs-extra": { "version": "11.3.3", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.3.tgz", - "integrity": "sha512-VWSRii4t0AFm6ixFFmLLx1t7wS1gh+ckoa84aOeapGum0h+EZd1EhEumSB+ZdDLnEPuucsVB9oB7cxJHap6Afg==", "license": "MIT", "dependencies": { "graceful-fs": "^4.2.0", @@ -7194,8 +6342,6 @@ }, "node_modules/@docusaurus/theme-live-codeblock/node_modules/jsonfile": { "version": "6.2.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.0.tgz", - "integrity": "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==", "license": "MIT", "dependencies": { "universalify": "^2.0.0" @@ -7206,8 +6352,6 @@ }, "node_modules/@docusaurus/theme-live-codeblock/node_modules/universalify": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", - "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", "license": "MIT", "engines": { "node": ">= 10.0.0" @@ -7215,8 +6359,6 @@ }, "node_modules/@docusaurus/theme-mermaid": { "version": "3.9.2", - "resolved": "https://registry.npmjs.org/@docusaurus/theme-mermaid/-/theme-mermaid-3.9.2.tgz", - "integrity": "sha512-5vhShRDq/ntLzdInsQkTdoKWSzw8d1jB17sNPYhA/KvYYFXfuVEGHLM6nrf8MFbV8TruAHDG21Fn3W4lO8GaDw==", "license": "MIT", "dependencies": { "@docusaurus/core": "3.9.2", @@ -7243,8 +6385,6 @@ }, "node_modules/@docusaurus/theme-search-algolia": { "version": "3.9.2", - "resolved": "https://registry.npmjs.org/@docusaurus/theme-search-algolia/-/theme-search-algolia-3.9.2.tgz", - "integrity": "sha512-GBDSFNwjnh5/LdkxCKQHkgO2pIMX1447BxYUBG2wBiajS21uj64a+gH/qlbQjDLxmGrbrllBrtJkUHxIsiwRnw==", "license": "MIT", "dependencies": { "@docsearch/react": "^3.9.0 || ^4.1.0", @@ -7274,8 +6414,6 @@ }, "node_modules/@docusaurus/theme-search-algolia/node_modules/fs-extra": { "version": "11.3.3", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.3.tgz", - "integrity": "sha512-VWSRii4t0AFm6ixFFmLLx1t7wS1gh+ckoa84aOeapGum0h+EZd1EhEumSB+ZdDLnEPuucsVB9oB7cxJHap6Afg==", "license": "MIT", "dependencies": { "graceful-fs": "^4.2.0", @@ -7288,8 +6426,6 @@ }, "node_modules/@docusaurus/theme-search-algolia/node_modules/jsonfile": { "version": "6.2.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.0.tgz", - "integrity": "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==", "license": "MIT", "dependencies": { "universalify": "^2.0.0" @@ -7300,8 +6436,6 @@ }, "node_modules/@docusaurus/theme-search-algolia/node_modules/universalify": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", - "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", "license": "MIT", "engines": { "node": ">= 10.0.0" @@ -7309,8 +6443,6 @@ }, "node_modules/@docusaurus/theme-translations": { "version": "3.9.2", - "resolved": "https://registry.npmjs.org/@docusaurus/theme-translations/-/theme-translations-3.9.2.tgz", - "integrity": "sha512-vIryvpP18ON9T9rjgMRFLr2xJVDpw1rtagEGf8Ccce4CkTrvM/fRB8N2nyWYOW5u3DdjkwKw5fBa+3tbn9P4PA==", "license": "MIT", "dependencies": { "fs-extra": "^11.1.1", @@ -7322,8 +6454,6 @@ }, "node_modules/@docusaurus/theme-translations/node_modules/fs-extra": { "version": "11.3.3", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.3.tgz", - "integrity": "sha512-VWSRii4t0AFm6ixFFmLLx1t7wS1gh+ckoa84aOeapGum0h+EZd1EhEumSB+ZdDLnEPuucsVB9oB7cxJHap6Afg==", "license": "MIT", "dependencies": { "graceful-fs": "^4.2.0", @@ -7336,8 +6466,6 @@ }, "node_modules/@docusaurus/theme-translations/node_modules/jsonfile": { "version": "6.2.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.0.tgz", - "integrity": "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==", "license": "MIT", "dependencies": { "universalify": "^2.0.0" @@ -7348,8 +6476,6 @@ }, "node_modules/@docusaurus/theme-translations/node_modules/universalify": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", - "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", "license": "MIT", "engines": { "node": ">= 10.0.0" @@ -7357,15 +6483,11 @@ }, "node_modules/@docusaurus/tsconfig": { "version": "3.9.2", - "resolved": "https://registry.npmjs.org/@docusaurus/tsconfig/-/tsconfig-3.9.2.tgz", - "integrity": "sha512-j6/Fp4Rlpxsc632cnRnl5HpOWeb6ZKssDj6/XzzAzVGXXfm9Eptx3rxCC+fDzySn9fHTS+CWJjPineCR1bB5WQ==", "dev": true, "license": "MIT" }, "node_modules/@docusaurus/types": { "version": "3.9.2", - "resolved": "https://registry.npmjs.org/@docusaurus/types/-/types-3.9.2.tgz", - "integrity": "sha512-Ux1JUNswg+EfUEmajJjyhIohKceitY/yzjRUpu04WXgvVz+fbhVC0p+R0JhvEu4ytw8zIAys2hrdpQPBHRIa8Q==", "license": "MIT", "dependencies": { "@mdx-js/mdx": "^3.0.0", @@ -7386,8 +6508,6 @@ }, "node_modules/@docusaurus/types/node_modules/commander": { "version": "5.1.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz", - "integrity": "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==", "license": "MIT", "engines": { "node": ">= 6" @@ -7395,8 +6515,6 @@ }, "node_modules/@docusaurus/types/node_modules/webpack-merge": { "version": "5.10.0", - "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.10.0.tgz", - "integrity": "sha512-+4zXKdx7UnO+1jaN4l2lHVD+mFvnlZQP/6ljaJVb4SZiwIKeUnrT5l0gkT8z+n4hKpC+jpOv6O9R+gLtag7pSA==", "license": "MIT", "dependencies": { "clone-deep": "^4.0.1", @@ -7409,8 +6527,6 @@ }, "node_modules/@docusaurus/utils": { "version": "3.9.2", - "resolved": "https://registry.npmjs.org/@docusaurus/utils/-/utils-3.9.2.tgz", - "integrity": "sha512-lBSBiRruFurFKXr5Hbsl2thmGweAPmddhF3jb99U4EMDA5L+e5Y1rAkOS07Nvrup7HUMBDrCV45meaxZnt28nQ==", "license": "MIT", "dependencies": { "@docusaurus/logger": "3.9.2", @@ -7441,8 +6557,6 @@ }, "node_modules/@docusaurus/utils-common": { "version": "3.9.2", - "resolved": "https://registry.npmjs.org/@docusaurus/utils-common/-/utils-common-3.9.2.tgz", - "integrity": "sha512-I53UC1QctruA6SWLvbjbhCpAw7+X7PePoe5pYcwTOEXD/PxeP8LnECAhTHHwWCblyUX5bMi4QLRkxvyZ+IT8Aw==", "license": "MIT", "dependencies": { "@docusaurus/types": "3.9.2", @@ -7454,8 +6568,6 @@ }, "node_modules/@docusaurus/utils-validation": { "version": "3.9.2", - "resolved": "https://registry.npmjs.org/@docusaurus/utils-validation/-/utils-validation-3.9.2.tgz", - "integrity": "sha512-l7yk3X5VnNmATbwijJkexdhulNsQaNDwoagiwujXoxFbWLcxHQqNQ+c/IAlzrfMMOfa/8xSBZ7KEKDesE/2J7A==", "license": "MIT", "dependencies": { "@docusaurus/logger": "3.9.2", @@ -7473,8 +6585,6 @@ }, "node_modules/@docusaurus/utils-validation/node_modules/fs-extra": { "version": "11.3.3", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.3.tgz", - "integrity": "sha512-VWSRii4t0AFm6ixFFmLLx1t7wS1gh+ckoa84aOeapGum0h+EZd1EhEumSB+ZdDLnEPuucsVB9oB7cxJHap6Afg==", "license": "MIT", "dependencies": { "graceful-fs": "^4.2.0", @@ -7487,8 +6597,6 @@ }, "node_modules/@docusaurus/utils-validation/node_modules/jsonfile": { "version": "6.2.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.0.tgz", - "integrity": "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==", "license": "MIT", "dependencies": { "universalify": "^2.0.0" @@ -7499,8 +6607,6 @@ }, "node_modules/@docusaurus/utils-validation/node_modules/universalify": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", - "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", "license": "MIT", "engines": { "node": ">= 10.0.0" @@ -7508,8 +6614,6 @@ }, "node_modules/@docusaurus/utils/node_modules/fs-extra": { "version": "11.3.3", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.3.tgz", - "integrity": "sha512-VWSRii4t0AFm6ixFFmLLx1t7wS1gh+ckoa84aOeapGum0h+EZd1EhEumSB+ZdDLnEPuucsVB9oB7cxJHap6Afg==", "license": "MIT", "dependencies": { "graceful-fs": "^4.2.0", @@ -7522,8 +6626,6 @@ }, "node_modules/@docusaurus/utils/node_modules/jsonfile": { "version": "6.2.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.0.tgz", - "integrity": "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==", "license": "MIT", "dependencies": { "universalify": "^2.0.0" @@ -7534,8 +6636,6 @@ }, "node_modules/@docusaurus/utils/node_modules/universalify": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", - "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", "license": "MIT", "engines": { "node": ">= 10.0.0" @@ -7543,8 +6643,6 @@ }, "node_modules/@easyops-cn/autocomplete.js": { "version": "0.38.1", - "resolved": "https://registry.npmjs.org/@easyops-cn/autocomplete.js/-/autocomplete.js-0.38.1.tgz", - "integrity": "sha512-drg76jS6syilOUmVNkyo1c7ZEBPcPuK+aJA7AksM5ZIIbV57DMHCywiCr+uHyv8BE5jUTU98j/H7gVrkHrWW3Q==", "license": "MIT", "dependencies": { "cssesc": "^3.0.0", @@ -7553,8 +6651,6 @@ }, "node_modules/@easyops-cn/docusaurus-search-local": { "version": "0.55.1", - "resolved": "https://registry.npmjs.org/@easyops-cn/docusaurus-search-local/-/docusaurus-search-local-0.55.1.tgz", - "integrity": "sha512-jmBKj1J+tajqNrCvECwKCQYTWwHVZDGApy8lLOYEPe+Dm0/f3Ccdw8BP5/OHNpltr7WDNY2roQXn+TWn2f1kig==", "license": "MIT", "dependencies": { "@docusaurus/plugin-content-docs": "^2 || ^3", @@ -7592,8 +6688,6 @@ }, "node_modules/@easyops-cn/docusaurus-search-local/node_modules/cheerio": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.2.0.tgz", - "integrity": "sha512-WDrybc/gKFpTYQutKIK6UvfcuxijIZfMfXaYm8NMsPQxSYvf+13fXUJ4rztGGbJcBQ/GF55gvrZ0Bc0bj/mqvg==", "license": "MIT", "dependencies": { "cheerio-select": "^2.1.0", @@ -7617,8 +6711,6 @@ }, "node_modules/@easyops-cn/docusaurus-search-local/node_modules/entities": { "version": "7.0.1", - "resolved": "https://registry.npmjs.org/entities/-/entities-7.0.1.tgz", - "integrity": "sha512-TWrgLOFUQTH994YUyl1yT4uyavY5nNB5muff+RtWaqNVCAK408b5ZnnbNAUEWLTCpum9w6arT70i1XdQ4UeOPA==", "license": "BSD-2-Clause", "engines": { "node": ">=0.12" @@ -7629,8 +6721,6 @@ }, "node_modules/@easyops-cn/docusaurus-search-local/node_modules/fs-extra": { "version": "10.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", - "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", "license": "MIT", "dependencies": { "graceful-fs": "^4.2.0", @@ -7643,8 +6733,6 @@ }, "node_modules/@easyops-cn/docusaurus-search-local/node_modules/htmlparser2": { "version": "10.1.0", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-10.1.0.tgz", - "integrity": "sha512-VTZkM9GWRAtEpveh7MSF6SjjrpNVNNVJfFup7xTY3UpFtm67foy9HDVXneLtFVt4pMz5kZtgNcvCniNFb1hlEQ==", "funding": [ "https://github.com/fb55/htmlparser2?sponsor=1", { @@ -7662,8 +6750,6 @@ }, "node_modules/@easyops-cn/docusaurus-search-local/node_modules/jsonfile": { "version": "6.2.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.0.tgz", - "integrity": "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==", "license": "MIT", "dependencies": { "universalify": "^2.0.0" @@ -7674,48 +6760,13 @@ }, "node_modules/@easyops-cn/docusaurus-search-local/node_modules/universalify": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", - "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", "license": "MIT", "engines": { "node": ">= 10.0.0" } }, - "node_modules/@emnapi/core": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.8.1.tgz", - "integrity": "sha512-AvT9QFpxK0Zd8J0jopedNm+w/2fIzvtPKPjqyw9jwvBaReTTqPBk9Hixaz7KbjimP+QNz605/XnjFcDAL2pqBg==", - "license": "MIT", - "optional": true, - "dependencies": { - "@emnapi/wasi-threads": "1.1.0", - "tslib": "^2.4.0" - } - }, - "node_modules/@emnapi/runtime": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.8.1.tgz", - "integrity": "sha512-mehfKSMWjjNol8659Z8KxEMrdSJDDot5SXMq00dM8BN4o+CLNXQ0xH2V7EchNHV4RmbZLmmPdEaXZc5H2FXmDg==", - "license": "MIT", - "optional": true, - "dependencies": { - "tslib": "^2.4.0" - } - }, - "node_modules/@emnapi/wasi-threads": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.1.0.tgz", - "integrity": "sha512-WI0DdZ8xFSbgMjR1sFsKABJ/C5OnRrjT06JXbZKexJGrDuPTzZdDYfFlsgcCXCyf+suG5QU2e/y1Wo2V/OapLQ==", - "license": "MIT", - "optional": true, - "dependencies": { - "tslib": "^2.4.0" - } - }, "node_modules/@endemolshinegroup/cosmiconfig-typescript-loader": { "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@endemolshinegroup/cosmiconfig-typescript-loader/-/cosmiconfig-typescript-loader-3.0.2.tgz", - "integrity": "sha512-QRVtqJuS1mcT56oHpVegkKBlgtWjXw/gHNWO3eL9oyB5Sc7HBoc2OLG/nYpVfT/Jejvo3NUrD0Udk7XgoyDKkA==", "dev": true, "license": "MIT", "dependencies": { @@ -7733,15 +6784,11 @@ }, "node_modules/@endemolshinegroup/cosmiconfig-typescript-loader/node_modules/arg": { "version": "4.1.3", - "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", - "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", "dev": true, "license": "MIT" }, "node_modules/@endemolshinegroup/cosmiconfig-typescript-loader/node_modules/source-map": { "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true, "license": "BSD-3-Clause", "engines": { @@ -7750,8 +6797,6 @@ }, "node_modules/@endemolshinegroup/cosmiconfig-typescript-loader/node_modules/source-map-support": { "version": "0.5.21", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", - "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", "dev": true, "license": "MIT", "dependencies": { @@ -7761,8 +6806,6 @@ }, "node_modules/@endemolshinegroup/cosmiconfig-typescript-loader/node_modules/ts-node": { "version": "9.1.1", - "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-9.1.1.tgz", - "integrity": "sha512-hPlt7ZACERQGf03M253ytLY3dHbGNGrAq9qIHWUY9XHYl1z7wYngSr3OQ5xmui8o2AaxsONxIzjafLUiWBo1Fg==", "dev": true, "license": "MIT", "dependencies": { @@ -7786,138 +6829,8 @@ "typescript": ">=2.7" } }, - "node_modules/@esbuild/aix-ppc64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.27.3.tgz", - "integrity": "sha512-9fJMTNFTWZMh5qwrBItuziu834eOCUcEqymSH7pY+zoMVEZg3gcPuBNxH1EvfVYe9h0x/Ptw8KBzv7qxb7l8dg==", - "cpu": [ - "ppc64" - ], - "license": "MIT", - "optional": true, - "os": [ - "aix" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/android-arm": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.27.3.tgz", - "integrity": "sha512-i5D1hPY7GIQmXlXhs2w8AWHhenb00+GxjxRncS2ZM7YNVGNfaMxgzSGuO8o8SJzRc/oZwU2bcScvVERk03QhzA==", - "cpu": [ - "arm" - ], - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/android-arm64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.27.3.tgz", - "integrity": "sha512-YdghPYUmj/FX2SYKJ0OZxf+iaKgMsKHVPF1MAq/P8WirnSpCStzKJFjOjzsW0QQ7oIAiccHdcqjbHmJxRb/dmg==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/android-x64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.27.3.tgz", - "integrity": "sha512-IN/0BNTkHtk8lkOM8JWAYFg4ORxBkZQf9zXiEOfERX/CzxW3Vg1ewAhU7QSWQpVIzTW+b8Xy+lGzdYXV6UZObQ==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/darwin-x64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.27.3.tgz", - "integrity": "sha512-vHk/hA7/1AckjGzRqi6wbo+jaShzRowYip6rt6q7VYEDX4LEy1pZfDpdxCBnGtl+A5zq8iXDcyuxwtv3hNtHFg==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/freebsd-arm64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.27.3.tgz", - "integrity": "sha512-ipTYM2fjt3kQAYOvo6vcxJx3nBYAzPjgTCk7QEgZG8AUO3ydUhvelmhrbOheMnGOlaSFUoHXB6un+A7q4ygY9w==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/freebsd-x64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.27.3.tgz", - "integrity": "sha512-dDk0X87T7mI6U3K9VjWtHOXqwAMJBNN2r7bejDsc+j03SEjtD9HrOl8gVFByeM0aJksoUuUVU9TBaZa2rgj0oA==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-arm": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.27.3.tgz", - "integrity": "sha512-s6nPv2QkSupJwLYyfS+gwdirm0ukyTFNl3KTgZEAiJDd+iHZcbTPPcWCcRYH+WlNbwChgH2QkE9NSlNrMT8Gfw==", - "cpu": [ - "arm" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, "node_modules/@esbuild/linux-arm64": { "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.27.3.tgz", - "integrity": "sha512-sZOuFz/xWnZ4KH3YfFrKCf1WyPZHakVzTiqji3WDc0BCl2kBwiJLCXpzLzUBLgmp4veFZdvN5ChW4Eq/8Fc2Fg==", "cpu": [ "arm64" ], @@ -7930,266 +6843,8 @@ "node": ">=18" } }, - "node_modules/@esbuild/linux-ia32": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.27.3.tgz", - "integrity": "sha512-yGlQYjdxtLdh0a3jHjuwOrxQjOZYD/C9PfdbgJJF3TIZWnm/tMd/RcNiLngiu4iwcBAOezdnSLAwQDPqTmtTYg==", - "cpu": [ - "ia32" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-loong64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.27.3.tgz", - "integrity": "sha512-WO60Sn8ly3gtzhyjATDgieJNet/KqsDlX5nRC5Y3oTFcS1l0KWba+SEa9Ja1GfDqSF1z6hif/SkpQJbL63cgOA==", - "cpu": [ - "loong64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-mips64el": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.27.3.tgz", - "integrity": "sha512-APsymYA6sGcZ4pD6k+UxbDjOFSvPWyZhjaiPyl/f79xKxwTnrn5QUnXR5prvetuaSMsb4jgeHewIDCIWljrSxw==", - "cpu": [ - "mips64el" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-ppc64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.27.3.tgz", - "integrity": "sha512-eizBnTeBefojtDb9nSh4vvVQ3V9Qf9Df01PfawPcRzJH4gFSgrObw+LveUyDoKU3kxi5+9RJTCWlj4FjYXVPEA==", - "cpu": [ - "ppc64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-riscv64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.27.3.tgz", - "integrity": "sha512-3Emwh0r5wmfm3ssTWRQSyVhbOHvqegUDRd0WhmXKX2mkHJe1SFCMJhagUleMq+Uci34wLSipf8Lagt4LlpRFWQ==", - "cpu": [ - "riscv64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-s390x": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.27.3.tgz", - "integrity": "sha512-pBHUx9LzXWBc7MFIEEL0yD/ZVtNgLytvx60gES28GcWMqil8ElCYR4kvbV2BDqsHOvVDRrOxGySBM9Fcv744hw==", - "cpu": [ - "s390x" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-x64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.27.3.tgz", - "integrity": "sha512-Czi8yzXUWIQYAtL/2y6vogER8pvcsOsk5cpwL4Gk5nJqH5UZiVByIY8Eorm5R13gq+DQKYg0+JyQoytLQas4dA==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/netbsd-arm64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.27.3.tgz", - "integrity": "sha512-sDpk0RgmTCR/5HguIZa9n9u+HVKf40fbEUt+iTzSnCaGvY9kFP0YKBWZtJaraonFnqef5SlJ8/TiPAxzyS+UoA==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/netbsd-x64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.27.3.tgz", - "integrity": "sha512-P14lFKJl/DdaE00LItAukUdZO5iqNH7+PjoBm+fLQjtxfcfFE20Xf5CrLsmZdq5LFFZzb5JMZ9grUwvtVYzjiA==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/openbsd-arm64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.27.3.tgz", - "integrity": "sha512-AIcMP77AvirGbRl/UZFTq5hjXK+2wC7qFRGoHSDrZ5v5b8DK/GYpXW3CPRL53NkvDqb9D+alBiC/dV0Fb7eJcw==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/openbsd-x64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.27.3.tgz", - "integrity": "sha512-DnW2sRrBzA+YnE70LKqnM3P+z8vehfJWHXECbwBmH/CU51z6FiqTQTHFenPlHmo3a8UgpLyH3PT+87OViOh1AQ==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/openharmony-arm64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.27.3.tgz", - "integrity": "sha512-NinAEgr/etERPTsZJ7aEZQvvg/A6IsZG/LgZy+81wON2huV7SrK3e63dU0XhyZP4RKGyTm7aOgmQk0bGp0fy2g==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "openharmony" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/sunos-x64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.27.3.tgz", - "integrity": "sha512-PanZ+nEz+eWoBJ8/f8HKxTTD172SKwdXebZ0ndd953gt1HRBbhMsaNqjTyYLGLPdoWHy4zLU7bDVJztF5f3BHA==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/win32-arm64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.27.3.tgz", - "integrity": "sha512-B2t59lWWYrbRDw/tjiWOuzSsFh1Y/E95ofKz7rIVYSQkUYBjfSgf6oeYPNWHToFRr2zx52JKApIcAS/D5TUBnA==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/win32-ia32": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.27.3.tgz", - "integrity": "sha512-QLKSFeXNS8+tHW7tZpMtjlNb7HKau0QDpwm49u0vUp9y1WOF+PEzkU84y9GqYaAVW8aH8f3GcBck26jh54cX4Q==", - "cpu": [ - "ia32" - ], - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/win32-x64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.27.3.tgz", - "integrity": "sha512-4uJGhsxuptu3OcpVAzli+/gWusVGwZZHTlS63hh++ehExkVT8SgiEf7/uC/PclrPPkLhZqGgCTjd0VWLo6xMqA==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, "node_modules/@eslint-community/eslint-utils": { "version": "4.9.1", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.1.tgz", - "integrity": "sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==", "license": "MIT", "dependencies": { "eslint-visitor-keys": "^3.4.3" @@ -8206,8 +6861,6 @@ }, "node_modules/@eslint-community/regexpp": { "version": "4.12.2", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.2.tgz", - "integrity": "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==", "license": "MIT", "engines": { "node": "^12.0.0 || ^14.0.0 || >=16.0.0" @@ -8215,8 +6868,6 @@ }, "node_modules/@eslint/config-array": { "version": "0.21.1", - "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.21.1.tgz", - "integrity": "sha512-aw1gNayWpdI/jSYVgzN5pL0cfzU02GT3NBpeT/DXbx1/1x7ZKxFPd9bwrzygx/qiwIQiJ1sw/zD8qY/kRvlGHA==", "license": "Apache-2.0", "dependencies": { "@eslint/object-schema": "^2.1.7", @@ -8229,14 +6880,10 @@ }, "node_modules/@eslint/config-array/node_modules/balanced-match": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", "license": "MIT" }, "node_modules/@eslint/config-array/node_modules/brace-expansion": { "version": "1.1.12", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", - "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", "license": "MIT", "dependencies": { "balanced-match": "^1.0.0", @@ -8245,8 +6892,6 @@ }, "node_modules/@eslint/config-array/node_modules/minimatch": { "version": "3.1.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", - "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", "license": "ISC", "dependencies": { "brace-expansion": "^1.1.7" @@ -8257,8 +6902,6 @@ }, "node_modules/@eslint/config-helpers": { "version": "0.4.2", - "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.4.2.tgz", - "integrity": "sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw==", "license": "Apache-2.0", "dependencies": { "@eslint/core": "^0.17.0" @@ -8269,8 +6912,6 @@ }, "node_modules/@eslint/core": { "version": "0.17.0", - "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.17.0.tgz", - "integrity": "sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ==", "license": "Apache-2.0", "dependencies": { "@types/json-schema": "^7.0.15" @@ -8281,8 +6922,6 @@ }, "node_modules/@eslint/eslintrc": { "version": "3.3.4", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.4.tgz", - "integrity": "sha512-4h4MVF8pmBsncB60r0wSJiIeUKTSD4m7FmTFThG8RHlsg9ajqckLm9OraguFGZE4vVdpiI1Q4+hFnisopmG6gQ==", "license": "MIT", "dependencies": { "ajv": "^6.14.0", @@ -8304,8 +6943,6 @@ }, "node_modules/@eslint/eslintrc/node_modules/ajv": { "version": "6.14.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.14.0.tgz", - "integrity": "sha512-IWrosm/yrn43eiKqkfkHis7QioDleaXQHdDVPKg0FSwwd/DuvyX79TZnFOnYpB7dcsFAMmtFztZuXPDvSePkFw==", "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.1", @@ -8320,14 +6957,10 @@ }, "node_modules/@eslint/eslintrc/node_modules/balanced-match": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", "license": "MIT" }, "node_modules/@eslint/eslintrc/node_modules/brace-expansion": { "version": "1.1.12", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", - "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", "license": "MIT", "dependencies": { "balanced-match": "^1.0.0", @@ -8336,8 +6969,6 @@ }, "node_modules/@eslint/eslintrc/node_modules/globals": { "version": "14.0.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", - "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", "license": "MIT", "engines": { "node": ">=18" @@ -8348,14 +6979,10 @@ }, "node_modules/@eslint/eslintrc/node_modules/json-schema-traverse": { "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", "license": "MIT" }, "node_modules/@eslint/eslintrc/node_modules/minimatch": { "version": "3.1.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", - "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", "license": "ISC", "dependencies": { "brace-expansion": "^1.1.7" @@ -8366,8 +6993,6 @@ }, "node_modules/@eslint/js": { "version": "9.39.3", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.39.3.tgz", - "integrity": "sha512-1B1VkCq6FuUNlQvlBYb+1jDu/gV297TIs/OeiaSR9l1H27SVW55ONE1e1Vp16NqP683+xEGzxYtv4XCiDPaQiw==", "license": "MIT", "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -8378,8 +7003,6 @@ }, "node_modules/@eslint/object-schema": { "version": "2.1.7", - "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.7.tgz", - "integrity": "sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA==", "license": "Apache-2.0", "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -8387,8 +7010,6 @@ }, "node_modules/@eslint/plugin-kit": { "version": "0.4.1", - "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.4.1.tgz", - "integrity": "sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA==", "license": "Apache-2.0", "dependencies": { "@eslint/core": "^0.17.0", @@ -8400,8 +7021,6 @@ }, "node_modules/@fullstory/browser": { "version": "2.0.8", - "resolved": "https://registry.npmjs.org/@fullstory/browser/-/browser-2.0.8.tgz", - "integrity": "sha512-MOylRaBAs7y7xFLvBQo446/xbTZ9MbPZSn3B4go4+eXI1o/uY7F+30ow6CA1i8fVoE4ScXDYpRtffDBBFsd8CQ==", "license": "MIT", "dependencies": { "@fullstory/snippet": "2.0.6" @@ -8409,14 +7028,10 @@ }, "node_modules/@fullstory/snippet": { "version": "2.0.6", - "resolved": "https://registry.npmjs.org/@fullstory/snippet/-/snippet-2.0.6.tgz", - "integrity": "sha512-GECETOTiW8XhRAr4q94rXY8Uc315KGmSepZQvBKW1LONJiKFvKzKpm/6Lystw/8lHFsDT7hD5VIZntMNOO2VAQ==", "license": "ISC" }, "node_modules/@gar/promise-retry": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@gar/promise-retry/-/promise-retry-1.0.2.tgz", - "integrity": "sha512-Lm/ZLhDZcBECta3TmCQSngiQykFdfw+QtI1/GYMsZd4l3nG+P8WLB16XuS7WaBGLQ+9E+cOcWQsth9cayuGt8g==", "license": "MIT", "dependencies": { "retry": "^0.13.1" @@ -8427,8 +7042,6 @@ }, "node_modules/@google-cloud/bigquery": { "version": "8.1.1", - "resolved": "https://registry.npmjs.org/@google-cloud/bigquery/-/bigquery-8.1.1.tgz", - "integrity": "sha512-2GHlohfA/VJffTvibMazMsZi6jPRx8MmaMberyDTL8rnhVs/frKSXVVRtLU83uSAy2j/5SD4mOs4jMQgJPON2g==", "license": "Apache-2.0", "dependencies": { "@google-cloud/common": "^6.0.0", @@ -8448,8 +7061,6 @@ }, "node_modules/@google-cloud/common": { "version": "6.0.0", - "resolved": "https://registry.npmjs.org/@google-cloud/common/-/common-6.0.0.tgz", - "integrity": "sha512-IXh04DlkLMxWgYLIUYuHHKXKOUwPDzDgke1ykkkJPe48cGIS9kkL2U/o0pm4ankHLlvzLF/ma1eO86n/bkumIA==", "license": "Apache-2.0", "dependencies": { "@google-cloud/projectify": "^4.0.0", @@ -8468,8 +7079,6 @@ }, "node_modules/@google-cloud/common/node_modules/@google-cloud/promisify": { "version": "4.1.0", - "resolved": "https://registry.npmjs.org/@google-cloud/promisify/-/promisify-4.1.0.tgz", - "integrity": "sha512-G/FQx5cE/+DqBbOpA5jKsegGwdPniU6PuIEMt+qxWgFxvxuFOzVmp6zYchtYuwAWV5/8Dgs0yAmjvNZv3uXLQg==", "license": "Apache-2.0", "engines": { "node": ">=18" @@ -8477,8 +7086,6 @@ }, "node_modules/@google-cloud/common/node_modules/arrify": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/arrify/-/arrify-2.0.1.tgz", - "integrity": "sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==", "license": "MIT", "engines": { "node": ">=8" @@ -8486,8 +7093,6 @@ }, "node_modules/@google-cloud/functions-framework": { "version": "3.5.1", - "resolved": "https://registry.npmjs.org/@google-cloud/functions-framework/-/functions-framework-3.5.1.tgz", - "integrity": "sha512-J01F8mCAb9SEsEGOJjKR/1UHmZTzBWIBNjAETtiPx7Xie3WgeWTvMnfrbsZbaBG0oePkepRxo28R8Fi9B2J++A==", "license": "Apache-2.0", "peer": true, "dependencies": { @@ -8510,8 +7115,6 @@ }, "node_modules/@google-cloud/functions-framework/node_modules/@types/express": { "version": "4.17.25", - "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.25.tgz", - "integrity": "sha512-dVd04UKsfpINUnK0yBoYHDF3xu7xVH4BuDotC/xGuycx4CgbP48X/KF/586bcObxT0HENHXEU8Nqtu6NR+eKhw==", "license": "MIT", "peer": true, "dependencies": { @@ -8523,8 +7126,6 @@ }, "node_modules/@google-cloud/functions-framework/node_modules/@types/express-serve-static-core": { "version": "4.19.8", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.19.8.tgz", - "integrity": "sha512-02S5fmqeoKzVZCHPZid4b8JH2eM5HzQLZWN2FohQEy/0eXTq8VXZfSN6Pcr3F6N9R/vNrj7cpgbhjie6m/1tCA==", "license": "MIT", "peer": true, "dependencies": { @@ -8536,8 +7137,6 @@ }, "node_modules/@google-cloud/functions-framework/node_modules/@types/send": { "version": "0.17.6", - "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.6.tgz", - "integrity": "sha512-Uqt8rPBE8SY0RK8JB1EzVOIZ32uqy8HwdxCnoCOsYrvnswqmFZ/k+9Ikidlk/ImhsdvBsloHbAlewb2IEBV/Og==", "license": "MIT", "peer": true, "dependencies": { @@ -8547,8 +7146,6 @@ }, "node_modules/@google-cloud/functions-framework/node_modules/@types/serve-static": { "version": "1.15.10", - "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.10.tgz", - "integrity": "sha512-tRs1dB+g8Itk72rlSI2ZrW6vZg0YrLI81iQSTkMmOqnqCaNr/8Ek4VwWcN5vZgCYWbg/JJSGBlUaYGAOP73qBw==", "license": "MIT", "peer": true, "dependencies": { @@ -8559,8 +7156,6 @@ }, "node_modules/@google-cloud/paginator": { "version": "6.0.0", - "resolved": "https://registry.npmjs.org/@google-cloud/paginator/-/paginator-6.0.0.tgz", - "integrity": "sha512-g5nmMnzC+94kBxOKkLGpK1ikvolTFCC3s2qtE4F+1EuArcJ7HHC23RDQVt3Ra3CqpUYZ+oXNKZ8n5Cn5yug8DA==", "license": "Apache-2.0", "dependencies": { "extend": "^3.0.2" @@ -8571,8 +7166,6 @@ }, "node_modules/@google-cloud/precise-date": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@google-cloud/precise-date/-/precise-date-5.0.0.tgz", - "integrity": "sha512-9h0Gvw92EvPdE8AK8AgZPbMnH5ftDyPtKm7/KUfcJVaPEPjwGDsJd1QV0H8esBDV4II41R/2lDWH1epBqIoKUw==", "license": "Apache-2.0", "engines": { "node": ">=18" @@ -8580,8 +7173,6 @@ }, "node_modules/@google-cloud/projectify": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@google-cloud/projectify/-/projectify-4.0.0.tgz", - "integrity": "sha512-MmaX6HeSvyPbWGwFq7mXdo0uQZLGBYCwziiLIGq5JVX+/bdI3SAq6bP98trV5eTWfLuvsMcIC1YJOF2vfteLFA==", "license": "Apache-2.0", "engines": { "node": ">=14.0.0" @@ -8589,8 +7180,6 @@ }, "node_modules/@google-cloud/promisify": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@google-cloud/promisify/-/promisify-5.0.0.tgz", - "integrity": "sha512-N8qS6dlORGHwk7WjGXKOSsLjIjNINCPicsOX6gyyLiYk7mq3MtII96NZ9N2ahwA2vnkLmZODOIH9rlNniYWvCQ==", "license": "Apache-2.0", "engines": { "node": ">=18" @@ -8598,8 +7187,6 @@ }, "node_modules/@google-cloud/pubsub": { "version": "5.3.0", - "resolved": "https://registry.npmjs.org/@google-cloud/pubsub/-/pubsub-5.3.0.tgz", - "integrity": "sha512-hyUoE85Rj3rRUVk3VU+Selp4MorBwEzsQEqAj6+SE+WabR9LIFitYS6A4R+PyiwVaRk/tggGD8p7bNiIY5sk4w==", "license": "Apache-2.0", "dependencies": { "@google-cloud/paginator": "^6.0.0", @@ -8624,8 +7211,6 @@ }, "node_modules/@google-cloud/pubsub/node_modules/@google-cloud/projectify": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@google-cloud/projectify/-/projectify-5.0.0.tgz", - "integrity": "sha512-XXQLaIcLrOAMWvRrzz+mlUGtN6vlVNja3XQbMqRi/V7XJTAVwib3VcKd7oRwyZPkp7rBVlHGcaqdyGRrcnkhlA==", "license": "Apache-2.0", "engines": { "node": ">=18" @@ -8633,8 +7218,6 @@ }, "node_modules/@google-cloud/pubsub/node_modules/@opentelemetry/core": { "version": "1.30.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-1.30.1.tgz", - "integrity": "sha512-OOCM2C/QIURhJMuKaekP3TRBxBKxG/TWWA0TL2J6nXUtDnuCtccy49LUJF8xPFXMX+0LMcxFpCo8M9cGY1W6rQ==", "license": "Apache-2.0", "dependencies": { "@opentelemetry/semantic-conventions": "1.28.0" @@ -8648,8 +7231,6 @@ }, "node_modules/@google-cloud/pubsub/node_modules/@opentelemetry/core/node_modules/@opentelemetry/semantic-conventions": { "version": "1.28.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.28.0.tgz", - "integrity": "sha512-lp4qAiMTD4sNWW4DbKLBkfiMZ4jbAboJIGOQr5DvciMRI494OapieI9qiODpOt0XBr1LjIDy1xAGAnVs5supTA==", "license": "Apache-2.0", "engines": { "node": ">=14" @@ -8657,8 +7238,6 @@ }, "node_modules/@google-cloud/pubsub/node_modules/@opentelemetry/semantic-conventions": { "version": "1.39.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.39.0.tgz", - "integrity": "sha512-R5R9tb2AXs2IRLNKLBJDynhkfmx7mX0vi8NkhZb3gUkPWHn6HXk5J8iQ/dql0U3ApfWym4kXXmBDRGO+oeOfjg==", "license": "Apache-2.0", "engines": { "node": ">=14" @@ -8666,8 +7245,6 @@ }, "node_modules/@google-cloud/pubsub/node_modules/arrify": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/arrify/-/arrify-2.0.1.tgz", - "integrity": "sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==", "license": "MIT", "engines": { "node": ">=8" @@ -8675,8 +7252,6 @@ }, "node_modules/@grpc/grpc-js": { "version": "1.14.3", - "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.14.3.tgz", - "integrity": "sha512-Iq8QQQ/7X3Sac15oB6p0FmUg/klxQvXLeileoqrTRGJYLV+/9tubbr9ipz0GKHjmXVsgFPo/+W+2cA8eNcR+XA==", "license": "Apache-2.0", "dependencies": { "@grpc/proto-loader": "^0.8.0", @@ -8688,8 +7263,6 @@ }, "node_modules/@grpc/proto-loader": { "version": "0.8.0", - "resolved": "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.8.0.tgz", - "integrity": "sha512-rc1hOQtjIWGxcxpb9aHAfLpIctjEnsDehj0DAiVfBlmT84uvR0uUtN2hEi/ecvWVjXUGf5qPF4qEgiLOx1YIMQ==", "license": "Apache-2.0", "dependencies": { "lodash.camelcase": "^4.3.0", @@ -8706,14 +7279,10 @@ }, "node_modules/@hapi/hoek": { "version": "9.3.0", - "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.3.0.tgz", - "integrity": "sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ==", "license": "BSD-3-Clause" }, "node_modules/@hapi/topo": { "version": "5.1.0", - "resolved": "https://registry.npmjs.org/@hapi/topo/-/topo-5.1.0.tgz", - "integrity": "sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg==", "license": "BSD-3-Clause", "dependencies": { "@hapi/hoek": "^9.0.0" @@ -8721,8 +7290,6 @@ }, "node_modules/@heroicons/react": { "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@heroicons/react/-/react-2.2.0.tgz", - "integrity": "sha512-LMcepvRaS9LYHJGsF0zzmgKCUim/X3N/DQKc4jepAXJ7l8QxJ1PmxJzqplF2Z3FE4PqBAIGyJAQ/w4B5dsqbtQ==", "dev": true, "license": "MIT", "peerDependencies": { @@ -8731,8 +7298,6 @@ }, "node_modules/@hono/node-server": { "version": "1.19.9", - "resolved": "https://registry.npmjs.org/@hono/node-server/-/node-server-1.19.9.tgz", - "integrity": "sha512-vHL6w3ecZsky+8P5MD+eFfaGTyCeOHUIFYMGpQGbrBTSmNNoxv0if69rEZ5giu36weC5saFuznL411gRX7bJDw==", "license": "MIT", "engines": { "node": ">=18.14.1" @@ -8743,14 +7308,10 @@ }, "node_modules/@hotjar/browser": { "version": "1.0.9", - "resolved": "https://registry.npmjs.org/@hotjar/browser/-/browser-1.0.9.tgz", - "integrity": "sha512-n9akDMod8BLGpYEQCrHwlYWWd63c1HlhUSXNIDfClZtKYXbUjIUOFlNZNNcUxgHTCsi4l2i+SWKsGsO0t93S8w==", "license": "MIT" }, "node_modules/@hubspot/api-client": { "version": "13.5.0", - "resolved": "https://registry.npmjs.org/@hubspot/api-client/-/api-client-13.5.0.tgz", - "integrity": "sha512-zZ9ybOqudSgAZSow5dgYWRkslDPfqA2fWnERMqWQm6ASlM/XCFS6zoec0zD3d6OxeoLOfiovVo39gVpK+KWQ9Q==", "license": "ISC", "dependencies": { "@types/node": "*", @@ -8767,8 +7328,6 @@ }, "node_modules/@humanfs/core": { "version": "0.19.1", - "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz", - "integrity": "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==", "license": "Apache-2.0", "engines": { "node": ">=18.18.0" @@ -8776,8 +7335,6 @@ }, "node_modules/@humanfs/node": { "version": "0.16.7", - "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.7.tgz", - "integrity": "sha512-/zUx+yOsIrG4Y43Eh2peDeKCxlRt/gET6aHfaKpuq267qXdYDFViVHfMaLyygZOnl0kGWxFIgsBy8QFuTLUXEQ==", "license": "Apache-2.0", "dependencies": { "@humanfs/core": "^0.19.1", @@ -8789,8 +7346,6 @@ }, "node_modules/@humanwhocodes/module-importer": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", - "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", "license": "Apache-2.0", "engines": { "node": ">=12.22" @@ -8802,8 +7357,6 @@ }, "node_modules/@humanwhocodes/retry": { "version": "0.4.3", - "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.3.tgz", - "integrity": "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==", "license": "Apache-2.0", "engines": { "node": ">=18.18" @@ -8815,8 +7368,6 @@ }, "node_modules/@iconify/react": { "version": "6.0.2", - "resolved": "https://registry.npmjs.org/@iconify/react/-/react-6.0.2.tgz", - "integrity": "sha512-SMmC2sactfpJD427WJEDN6PMyznTFMhByK9yLW0gOTtnjzzbsi/Ke/XqsumsavFPwNiXs8jSiYeZTmLCLwO+Fg==", "license": "MIT", "dependencies": { "@iconify/types": "^2.0.0" @@ -8830,14 +7381,10 @@ }, "node_modules/@iconify/types": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@iconify/types/-/types-2.0.0.tgz", - "integrity": "sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg==", "license": "MIT" }, "node_modules/@iconify/utils": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@iconify/utils/-/utils-3.1.0.tgz", - "integrity": "sha512-Zlzem1ZXhI1iHeeERabLNzBHdOa4VhQbqAcOQaMKuTuyZCpwKbC2R4Dd0Zo3g9EAc+Y4fiarO8HIHRAth7+skw==", "license": "MIT", "dependencies": { "@antfu/install-pkg": "^1.1.0", @@ -8847,8 +7394,6 @@ }, "node_modules/@inquirer/ansi": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@inquirer/ansi/-/ansi-1.0.2.tgz", - "integrity": "sha512-S8qNSZiYzFd0wAcyG5AXCvUHC5Sr7xpZ9wZ2py9XR88jUz8wooStVx5M6dRzczbBWjic9NP7+rY0Xi7qqK/aMQ==", "dev": true, "license": "MIT", "engines": { @@ -8857,8 +7402,6 @@ }, "node_modules/@inquirer/confirm": { "version": "5.1.21", - "resolved": "https://registry.npmjs.org/@inquirer/confirm/-/confirm-5.1.21.tgz", - "integrity": "sha512-KR8edRkIsUayMXV+o3Gv+q4jlhENF9nMYUZs9PA2HzrXeHI8M5uDag70U7RJn9yyiMZSbtF5/UexBtAVtZGSbQ==", "dev": true, "license": "MIT", "dependencies": { @@ -8879,8 +7422,6 @@ }, "node_modules/@inquirer/core": { "version": "10.3.2", - "resolved": "https://registry.npmjs.org/@inquirer/core/-/core-10.3.2.tgz", - "integrity": "sha512-43RTuEbfP8MbKzedNqBrlhhNKVwoK//vUFNW3Q3vZ88BLcrs4kYpGg+B2mm5p2K/HfygoCxuKwJJiv8PbGmE0A==", "dev": true, "license": "MIT", "dependencies": { @@ -8907,8 +7448,6 @@ }, "node_modules/@inquirer/core/node_modules/ansi-styles": { "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "license": "MIT", "dependencies": { @@ -8923,15 +7462,11 @@ }, "node_modules/@inquirer/core/node_modules/emoji-regex": { "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", "dev": true, "license": "MIT" }, "node_modules/@inquirer/core/node_modules/is-fullwidth-code-point": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", "dev": true, "license": "MIT", "engines": { @@ -8940,8 +7475,6 @@ }, "node_modules/@inquirer/core/node_modules/string-width": { "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "dev": true, "license": "MIT", "dependencies": { @@ -8955,8 +7488,6 @@ }, "node_modules/@inquirer/core/node_modules/wrap-ansi": { "version": "6.2.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", - "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", "dev": true, "license": "MIT", "dependencies": { @@ -8970,8 +7501,6 @@ }, "node_modules/@inquirer/external-editor": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@inquirer/external-editor/-/external-editor-1.0.3.tgz", - "integrity": "sha512-RWbSrDiYmO4LbejWY7ttpxczuwQyZLBUyygsA9Nsv95hpzUWwnNTVQmAq3xuh7vNwCp07UTmE5i11XAEExx4RA==", "dev": true, "license": "MIT", "dependencies": { @@ -8992,8 +7521,6 @@ }, "node_modules/@inquirer/figures": { "version": "1.0.15", - "resolved": "https://registry.npmjs.org/@inquirer/figures/-/figures-1.0.15.tgz", - "integrity": "sha512-t2IEY+unGHOzAaVM5Xx6DEWKeXlDDcNPeDyUpsRc6CUhBfU3VQOEl+Vssh7VNp1dR8MdUJBWhuObjXCsVpjN5g==", "dev": true, "license": "MIT", "engines": { @@ -9002,8 +7529,6 @@ }, "node_modules/@inquirer/type": { "version": "3.0.10", - "resolved": "https://registry.npmjs.org/@inquirer/type/-/type-3.0.10.tgz", - "integrity": "sha512-BvziSRxfz5Ov8ch0z/n3oijRSEcEsHnhggm4xFZe93DHcUCTlutlq9Ox4SVENAfcRD22UQq7T/atg9Wr3k09eA==", "dev": true, "license": "MIT", "engines": { @@ -9020,14 +7545,10 @@ }, "node_modules/@ioredis/commands": { "version": "1.5.1", - "resolved": "https://registry.npmjs.org/@ioredis/commands/-/commands-1.5.1.tgz", - "integrity": "sha512-JH8ZL/ywcJyR9MmJ5BNqZllXNZQqQbnVZOqpPQqE1vHiFgAw4NHbvE0FOduNU8IX9babitBT46571OnPTT0Zcw==", "license": "MIT" }, "node_modules/@isaacs/cliui": { "version": "8.0.2", - "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", - "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", "license": "ISC", "dependencies": { "string-width": "^5.1.2", @@ -9043,8 +7564,6 @@ }, "node_modules/@isaacs/cliui/node_modules/ansi-regex": { "version": "6.2.2", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", - "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", "license": "MIT", "engines": { "node": ">=12" @@ -9055,14 +7574,10 @@ }, "node_modules/@isaacs/cliui/node_modules/emoji-regex": { "version": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", "license": "MIT" }, "node_modules/@isaacs/cliui/node_modules/string-width": { "version": "5.1.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", - "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", "license": "MIT", "dependencies": { "eastasianwidth": "^0.2.0", @@ -9078,8 +7593,6 @@ }, "node_modules/@isaacs/cliui/node_modules/strip-ansi": { "version": "7.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz", - "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", "license": "MIT", "dependencies": { "ansi-regex": "^6.2.2" @@ -9093,8 +7606,6 @@ }, "node_modules/@isaacs/cliui/node_modules/wrap-ansi": { "version": "8.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", - "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", "license": "MIT", "dependencies": { "ansi-styles": "^6.1.0", @@ -9110,8 +7621,6 @@ }, "node_modules/@isaacs/fs-minipass": { "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@isaacs/fs-minipass/-/fs-minipass-4.0.1.tgz", - "integrity": "sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==", "license": "ISC", "dependencies": { "minipass": "^7.0.4" @@ -9122,8 +7631,6 @@ }, "node_modules/@istanbuljs/load-nyc-config": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", - "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", "license": "ISC", "dependencies": { "camelcase": "^5.3.1", @@ -9138,8 +7645,6 @@ }, "node_modules/@istanbuljs/load-nyc-config/node_modules/argparse": { "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", "license": "MIT", "dependencies": { "sprintf-js": "~1.0.2" @@ -9147,8 +7652,6 @@ }, "node_modules/@istanbuljs/load-nyc-config/node_modules/camelcase": { "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", "license": "MIT", "engines": { "node": ">=6" @@ -9156,8 +7659,6 @@ }, "node_modules/@istanbuljs/load-nyc-config/node_modules/js-yaml": { "version": "3.14.2", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.2.tgz", - "integrity": "sha512-PMSmkqxr106Xa156c2M265Z+FTrPl+oxd/rgOQy2tijQeK5TxQ43psO1ZCwhVOSdnn+RzkzlRz/eY4BgJBYVpg==", "license": "MIT", "dependencies": { "argparse": "^1.0.7", @@ -9169,8 +7670,6 @@ }, "node_modules/@istanbuljs/schema": { "version": "0.1.3", - "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", - "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", "license": "MIT", "engines": { "node": ">=8" @@ -9178,8 +7677,6 @@ }, "node_modules/@jest/console": { "version": "30.2.0", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-30.2.0.tgz", - "integrity": "sha512-+O1ifRjkvYIkBqASKWgLxrpEhQAAE7hY77ALLUufSk5717KfOShg6IbqLmdsLMPdUiFvA2kTs0R7YZy+l0IzZQ==", "license": "MIT", "dependencies": { "@jest/types": "30.2.0", @@ -9195,8 +7692,6 @@ }, "node_modules/@jest/console/node_modules/ansi-styles": { "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "license": "MIT", "dependencies": { "color-convert": "^2.0.1" @@ -9210,8 +7705,6 @@ }, "node_modules/@jest/console/node_modules/chalk": { "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", @@ -9226,8 +7719,6 @@ }, "node_modules/@jest/core": { "version": "30.2.0", - "resolved": "https://registry.npmjs.org/@jest/core/-/core-30.2.0.tgz", - "integrity": "sha512-03W6IhuhjqTlpzh/ojut/pDB2LPRygyWX8ExpgHtQA8H/3K7+1vKmcINx5UzeOX1se6YEsBsOHQ1CRzf3fOwTQ==", "license": "MIT", "dependencies": { "@jest/console": "30.2.0", @@ -9273,8 +7764,6 @@ }, "node_modules/@jest/core/node_modules/ansi-escapes": { "version": "4.3.2", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", - "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", "license": "MIT", "dependencies": { "type-fest": "^0.21.3" @@ -9288,8 +7777,6 @@ }, "node_modules/@jest/core/node_modules/ansi-styles": { "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "license": "MIT", "dependencies": { "color-convert": "^2.0.1" @@ -9303,8 +7790,6 @@ }, "node_modules/@jest/core/node_modules/chalk": { "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", @@ -9319,8 +7804,6 @@ }, "node_modules/@jest/core/node_modules/ci-info": { "version": "4.4.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-4.4.0.tgz", - "integrity": "sha512-77PSwercCZU2Fc4sX94eF8k8Pxte6JAwL4/ICZLFjJLqegs7kCuAsqqj/70NQF6TvDpgFjkubQB2FW2ZZddvQg==", "funding": [ { "type": "github", @@ -9334,8 +7817,6 @@ }, "node_modules/@jest/core/node_modules/pretty-format": { "version": "30.2.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-30.2.0.tgz", - "integrity": "sha512-9uBdv/B4EefsuAL+pWqueZyZS2Ba+LxfFeQ9DN14HU4bN8bhaxKdkpjpB6fs9+pSjIBu+FXQHImEg8j/Lw0+vA==", "license": "MIT", "dependencies": { "@jest/schemas": "30.0.5", @@ -9348,8 +7829,6 @@ }, "node_modules/@jest/core/node_modules/pretty-format/node_modules/ansi-styles": { "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", "license": "MIT", "engines": { "node": ">=10" @@ -9360,8 +7839,6 @@ }, "node_modules/@jest/create-cache-key-function": { "version": "30.2.0", - "resolved": "https://registry.npmjs.org/@jest/create-cache-key-function/-/create-cache-key-function-30.2.0.tgz", - "integrity": "sha512-44F4l4Enf+MirJN8X/NhdGkl71k5rBYiwdVlo4HxOwbu0sHV8QKrGEedb1VUU4K3W7fBKE0HGfbn7eZm0Ti3zg==", "license": "MIT", "dependencies": { "@jest/types": "30.2.0" @@ -9372,8 +7849,6 @@ }, "node_modules/@jest/diff-sequences": { "version": "30.0.1", - "resolved": "https://registry.npmjs.org/@jest/diff-sequences/-/diff-sequences-30.0.1.tgz", - "integrity": "sha512-n5H8QLDJ47QqbCNn5SuFjCRDrOLEZ0h8vAHCK5RL9Ls7Xa8AQLa/YxAc9UjFqoEDM48muwtBGjtMY5cr0PLDCw==", "license": "MIT", "engines": { "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" @@ -9381,8 +7856,6 @@ }, "node_modules/@jest/environment": { "version": "30.2.0", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-30.2.0.tgz", - "integrity": "sha512-/QPTL7OBJQ5ac09UDRa3EQes4gt1FTEG/8jZ/4v5IVzx+Cv7dLxlVIvfvSVRiiX2drWyXeBjkMSR8hvOWSog5g==", "license": "MIT", "dependencies": { "@jest/fake-timers": "30.2.0", @@ -9396,8 +7869,6 @@ }, "node_modules/@jest/environment-jsdom-abstract": { "version": "30.2.0", - "resolved": "https://registry.npmjs.org/@jest/environment-jsdom-abstract/-/environment-jsdom-abstract-30.2.0.tgz", - "integrity": "sha512-kazxw2L9IPuZpQ0mEt9lu9Z98SqR74xcagANmMBU16X0lS23yPc0+S6hGLUz8kVRlomZEs/5S/Zlpqwf5yu6OQ==", "license": "MIT", "dependencies": { "@jest/environment": "30.2.0", @@ -9423,8 +7894,6 @@ }, "node_modules/@jest/expect": { "version": "30.2.0", - "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-30.2.0.tgz", - "integrity": "sha512-V9yxQK5erfzx99Sf+7LbhBwNWEZ9eZay8qQ9+JSC0TrMR1pMDHLMY+BnVPacWU6Jamrh252/IKo4F1Xn/zfiqA==", "license": "MIT", "dependencies": { "expect": "30.2.0", @@ -9436,8 +7905,6 @@ }, "node_modules/@jest/expect-utils": { "version": "30.2.0", - "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-30.2.0.tgz", - "integrity": "sha512-1JnRfhqpD8HGpOmQp180Fo9Zt69zNtC+9lR+kT7NVL05tNXIi+QC8Csz7lfidMoVLPD3FnOtcmp0CEFnxExGEA==", "license": "MIT", "dependencies": { "@jest/get-type": "30.1.0" @@ -9448,8 +7915,6 @@ }, "node_modules/@jest/fake-timers": { "version": "30.2.0", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-30.2.0.tgz", - "integrity": "sha512-HI3tRLjRxAbBy0VO8dqqm7Hb2mIa8d5bg/NJkyQcOk7V118ObQML8RC5luTF/Zsg4474a+gDvhce7eTnP4GhYw==", "license": "MIT", "dependencies": { "@jest/types": "30.2.0", @@ -9465,8 +7930,6 @@ }, "node_modules/@jest/get-type": { "version": "30.1.0", - "resolved": "https://registry.npmjs.org/@jest/get-type/-/get-type-30.1.0.tgz", - "integrity": "sha512-eMbZE2hUnx1WV0pmURZY9XoXPkUYjpc55mb0CrhtdWLtzMQPFvu/rZkTLZFTsdaVQa+Tr4eWAteqcUzoawq/uA==", "license": "MIT", "engines": { "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" @@ -9474,8 +7937,6 @@ }, "node_modules/@jest/globals": { "version": "30.2.0", - "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-30.2.0.tgz", - "integrity": "sha512-b63wmnKPaK+6ZZfpYhz9K61oybvbI1aMcIs80++JI1O1rR1vaxHUCNqo3ITu6NU0d4V34yZFoHMn/uoKr/Rwfw==", "license": "MIT", "dependencies": { "@jest/environment": "30.2.0", @@ -9489,8 +7950,6 @@ }, "node_modules/@jest/pattern": { "version": "30.0.1", - "resolved": "https://registry.npmjs.org/@jest/pattern/-/pattern-30.0.1.tgz", - "integrity": "sha512-gWp7NfQW27LaBQz3TITS8L7ZCQ0TLvtmI//4OwlQRx4rnWxcPNIYjxZpDcN4+UlGxgm3jS5QPz8IPTCkb59wZA==", "license": "MIT", "dependencies": { "@types/node": "*", @@ -9502,8 +7961,6 @@ }, "node_modules/@jest/reporters": { "version": "30.2.0", - "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-30.2.0.tgz", - "integrity": "sha512-DRyW6baWPqKMa9CzeiBjHwjd8XeAyco2Vt8XbcLFjiwCOEKOvy82GJ8QQnJE9ofsxCMPjH4MfH8fCWIHHDKpAQ==", "license": "MIT", "dependencies": { "@bcoe/v8-coverage": "^0.2.3", @@ -9544,8 +8001,6 @@ }, "node_modules/@jest/reporters/node_modules/ansi-styles": { "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "license": "MIT", "dependencies": { "color-convert": "^2.0.1" @@ -9559,14 +8014,10 @@ }, "node_modules/@jest/reporters/node_modules/balanced-match": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", "license": "MIT" }, "node_modules/@jest/reporters/node_modules/brace-expansion": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", - "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", "license": "MIT", "dependencies": { "balanced-match": "^1.0.0" @@ -9574,8 +8025,6 @@ }, "node_modules/@jest/reporters/node_modules/chalk": { "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", @@ -9590,9 +8039,6 @@ }, "node_modules/@jest/reporters/node_modules/glob": { "version": "10.5.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.5.0.tgz", - "integrity": "sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==", - "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", "license": "ISC", "dependencies": { "foreground-child": "^3.1.0", @@ -9611,8 +8057,6 @@ }, "node_modules/@jest/reporters/node_modules/jest-worker": { "version": "30.2.0", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-30.2.0.tgz", - "integrity": "sha512-0Q4Uk8WF7BUwqXHuAjc23vmopWJw5WH7w2tqBoUOZpOjW/ZnR44GXXd1r82RvnmI2GZge3ivrYXk/BE2+VtW2g==", "license": "MIT", "dependencies": { "@types/node": "*", @@ -9627,8 +8071,6 @@ }, "node_modules/@jest/reporters/node_modules/jest-worker/node_modules/supports-color": { "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", "license": "MIT", "dependencies": { "has-flag": "^4.0.0" @@ -9642,14 +8084,10 @@ }, "node_modules/@jest/reporters/node_modules/lru-cache": { "version": "10.4.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", - "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", "license": "ISC" }, "node_modules/@jest/reporters/node_modules/minimatch": { "version": "9.0.9", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.9.tgz", - "integrity": "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==", "license": "ISC", "dependencies": { "brace-expansion": "^2.0.2" @@ -9663,8 +8101,6 @@ }, "node_modules/@jest/reporters/node_modules/path-scurry": { "version": "1.11.1", - "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", - "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", "license": "BlueOak-1.0.0", "dependencies": { "lru-cache": "^10.2.0", @@ -9679,8 +8115,6 @@ }, "node_modules/@jest/schemas": { "version": "30.0.5", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-30.0.5.tgz", - "integrity": "sha512-DmdYgtezMkh3cpU8/1uyXakv3tJRcmcXxBOcO0tbaozPwpmh4YMsnWrQm9ZmZMfa5ocbxzbFk6O4bDPEc/iAnA==", "license": "MIT", "dependencies": { "@sinclair/typebox": "^0.34.0" @@ -9691,8 +8125,6 @@ }, "node_modules/@jest/snapshot-utils": { "version": "30.2.0", - "resolved": "https://registry.npmjs.org/@jest/snapshot-utils/-/snapshot-utils-30.2.0.tgz", - "integrity": "sha512-0aVxM3RH6DaiLcjj/b0KrIBZhSX1373Xci4l3cW5xiUWPctZ59zQ7jj4rqcJQ/Z8JuN/4wX3FpJSa3RssVvCug==", "license": "MIT", "dependencies": { "@jest/types": "30.2.0", @@ -9706,8 +8138,6 @@ }, "node_modules/@jest/snapshot-utils/node_modules/ansi-styles": { "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "license": "MIT", "dependencies": { "color-convert": "^2.0.1" @@ -9721,8 +8151,6 @@ }, "node_modules/@jest/snapshot-utils/node_modules/chalk": { "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", @@ -9737,8 +8165,6 @@ }, "node_modules/@jest/source-map": { "version": "30.0.1", - "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-30.0.1.tgz", - "integrity": "sha512-MIRWMUUR3sdbP36oyNyhbThLHyJ2eEDClPCiHVbrYAe5g3CHRArIVpBw7cdSB5fr+ofSfIb2Tnsw8iEHL0PYQg==", "license": "MIT", "dependencies": { "@jridgewell/trace-mapping": "^0.3.25", @@ -9751,8 +8177,6 @@ }, "node_modules/@jest/test-result": { "version": "30.2.0", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-30.2.0.tgz", - "integrity": "sha512-RF+Z+0CCHkARz5HT9mcQCBulb1wgCP3FBvl9VFokMX27acKphwyQsNuWH3c+ojd1LeWBLoTYoxF0zm6S/66mjg==", "license": "MIT", "dependencies": { "@jest/console": "30.2.0", @@ -9766,8 +8190,6 @@ }, "node_modules/@jest/test-sequencer": { "version": "30.2.0", - "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-30.2.0.tgz", - "integrity": "sha512-wXKgU/lk8fKXMu/l5Hog1R61bL4q5GCdT6OJvdAFz1P+QrpoFuLU68eoKuVc4RbrTtNnTL5FByhWdLgOPSph+Q==", "license": "MIT", "dependencies": { "@jest/test-result": "30.2.0", @@ -9781,8 +8203,6 @@ }, "node_modules/@jest/transform": { "version": "30.2.0", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-30.2.0.tgz", - "integrity": "sha512-XsauDV82o5qXbhalKxD7p4TZYYdwcaEXC77PPD2HixEFF+6YGppjrAAQurTl2ECWcEomHBMMNS9AH3kcCFx8jA==", "license": "MIT", "dependencies": { "@babel/core": "^7.27.4", @@ -9807,8 +8227,6 @@ }, "node_modules/@jest/transform/node_modules/ansi-styles": { "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "license": "MIT", "dependencies": { "color-convert": "^2.0.1" @@ -9822,8 +8240,6 @@ }, "node_modules/@jest/transform/node_modules/chalk": { "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", @@ -9838,8 +8254,6 @@ }, "node_modules/@jest/types": { "version": "30.2.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-30.2.0.tgz", - "integrity": "sha512-H9xg1/sfVvyfU7o3zMfBEjQ1gcsdeTMgqHoYdN79tuLqfTtuu7WckRA1R5whDwOzxaZAeMKTYWqP+WCAi0CHsg==", "license": "MIT", "dependencies": { "@jest/pattern": "30.0.1", @@ -9856,8 +8270,6 @@ }, "node_modules/@jest/types/node_modules/ansi-styles": { "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "license": "MIT", "dependencies": { "color-convert": "^2.0.1" @@ -9871,8 +8283,6 @@ }, "node_modules/@jest/types/node_modules/chalk": { "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", @@ -9887,8 +8297,6 @@ }, "node_modules/@joshwooding/vite-plugin-react-docgen-typescript": { "version": "0.6.4", - "resolved": "https://registry.npmjs.org/@joshwooding/vite-plugin-react-docgen-typescript/-/vite-plugin-react-docgen-typescript-0.6.4.tgz", - "integrity": "sha512-6PyZBYKnnVNqOSB0YFly+62R7dmov8segT27A+RVTBVd4iAE6kbW9QBJGlyR2yG4D4ohzhZSTIu7BK1UTtmFFA==", "dev": true, "license": "MIT", "dependencies": { @@ -9907,8 +8315,6 @@ }, "node_modules/@jridgewell/gen-mapping": { "version": "0.3.13", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", - "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", "license": "MIT", "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.0", @@ -9917,8 +8323,6 @@ }, "node_modules/@jridgewell/remapping": { "version": "2.3.5", - "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", - "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", "license": "MIT", "dependencies": { "@jridgewell/gen-mapping": "^0.3.5", @@ -9927,8 +8331,6 @@ }, "node_modules/@jridgewell/resolve-uri": { "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", - "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", "license": "MIT", "engines": { "node": ">=6.0.0" @@ -9936,8 +8338,6 @@ }, "node_modules/@jridgewell/source-map": { "version": "0.3.11", - "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.11.tgz", - "integrity": "sha512-ZMp1V8ZFcPG5dIWnQLr3NSI1MiCU7UETdS/A0G8V/XWHvJv3ZsFqutJn1Y5RPmAPX6F3BiE397OqveU/9NCuIA==", "license": "MIT", "dependencies": { "@jridgewell/gen-mapping": "^0.3.5", @@ -9946,14 +8346,10 @@ }, "node_modules/@jridgewell/sourcemap-codec": { "version": "1.5.5", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", - "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", "license": "MIT" }, "node_modules/@jridgewell/trace-mapping": { "version": "0.3.31", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", - "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", "license": "MIT", "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", @@ -9962,8 +8358,6 @@ }, "node_modules/@js-sdsl/ordered-map": { "version": "4.4.2", - "resolved": "https://registry.npmjs.org/@js-sdsl/ordered-map/-/ordered-map-4.4.2.tgz", - "integrity": "sha512-iUKgm52T8HOE/makSxjqoWhe95ZJA1/G1sYsGev2JDKUSS14KAgg1LHb+Ba+IPow0xflbnSkOsZcO08C7w1gYw==", "license": "MIT", "funding": { "type": "opencollective", @@ -9972,8 +8366,6 @@ }, "node_modules/@jsonjoy.com/base64": { "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@jsonjoy.com/base64/-/base64-1.1.2.tgz", - "integrity": "sha512-q6XAnWQDIMA3+FTiOYajoYqySkO+JSat0ytXGSuRdq9uXE7o92gzuQwQM14xaCRlBLGq3v5miDGC4vkVTn54xA==", "license": "Apache-2.0", "engines": { "node": ">=10.0" @@ -9988,8 +8380,6 @@ }, "node_modules/@jsonjoy.com/buffers": { "version": "17.67.0", - "resolved": "https://registry.npmjs.org/@jsonjoy.com/buffers/-/buffers-17.67.0.tgz", - "integrity": "sha512-tfExRpYxBvi32vPs9ZHaTjSP4fHAfzSmcahOfNxtvGHcyJel+aibkPlGeBB+7AoC6hL7lXIE++8okecBxx7lcw==", "license": "Apache-2.0", "engines": { "node": ">=10.0" @@ -10004,8 +8394,6 @@ }, "node_modules/@jsonjoy.com/codegen": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@jsonjoy.com/codegen/-/codegen-1.0.0.tgz", - "integrity": "sha512-E8Oy+08cmCf0EK/NMxpaJZmOxPqM+6iSe2S4nlSBrPZOORoDJILxtbSUEDKQyTamm/BVAhIGllOBNU79/dwf0g==", "license": "Apache-2.0", "engines": { "node": ">=10.0" @@ -10020,8 +8408,6 @@ }, "node_modules/@jsonjoy.com/fs-core": { "version": "4.56.10", - "resolved": "https://registry.npmjs.org/@jsonjoy.com/fs-core/-/fs-core-4.56.10.tgz", - "integrity": "sha512-PyAEA/3cnHhsGcdY+AmIU+ZPqTuZkDhCXQ2wkXypdLitSpd6d5Ivxhnq4wa2ETRWFVJGabYynBWxIijOswSmOw==", "license": "Apache-2.0", "dependencies": { "@jsonjoy.com/fs-node-builtins": "4.56.10", @@ -10041,8 +8427,6 @@ }, "node_modules/@jsonjoy.com/fs-fsa": { "version": "4.56.10", - "resolved": "https://registry.npmjs.org/@jsonjoy.com/fs-fsa/-/fs-fsa-4.56.10.tgz", - "integrity": "sha512-/FVK63ysNzTPOnCCcPoPHt77TOmachdMS422txM4KhxddLdbW1fIbFMYH0AM0ow/YchCyS5gqEjKLNyv71j/5Q==", "license": "Apache-2.0", "dependencies": { "@jsonjoy.com/fs-core": "4.56.10", @@ -10063,8 +8447,6 @@ }, "node_modules/@jsonjoy.com/fs-node": { "version": "4.56.10", - "resolved": "https://registry.npmjs.org/@jsonjoy.com/fs-node/-/fs-node-4.56.10.tgz", - "integrity": "sha512-7R4Gv3tkUdW3dXfXiOkqxkElxKNVdd8BDOWC0/dbERd0pXpPY+s2s1Mino+aTvkGrFPiY+mmVxA7zhskm4Ue4Q==", "license": "Apache-2.0", "dependencies": { "@jsonjoy.com/fs-core": "4.56.10", @@ -10088,8 +8470,6 @@ }, "node_modules/@jsonjoy.com/fs-node-builtins": { "version": "4.56.10", - "resolved": "https://registry.npmjs.org/@jsonjoy.com/fs-node-builtins/-/fs-node-builtins-4.56.10.tgz", - "integrity": "sha512-uUnKz8R0YJyKq5jXpZtkGV9U0pJDt8hmYcLRrPjROheIfjMXsz82kXMgAA/qNg0wrZ1Kv+hrg7azqEZx6XZCVw==", "license": "Apache-2.0", "engines": { "node": ">=10.0" @@ -10104,8 +8484,6 @@ }, "node_modules/@jsonjoy.com/fs-node-to-fsa": { "version": "4.56.10", - "resolved": "https://registry.npmjs.org/@jsonjoy.com/fs-node-to-fsa/-/fs-node-to-fsa-4.56.10.tgz", - "integrity": "sha512-oH+O6Y4lhn9NyG6aEoFwIBNKZeYy66toP5LJcDOMBgL99BKQMUf/zWJspdRhMdn/3hbzQsZ8EHHsuekbFLGUWw==", "license": "Apache-2.0", "dependencies": { "@jsonjoy.com/fs-fsa": "4.56.10", @@ -10125,8 +8503,6 @@ }, "node_modules/@jsonjoy.com/fs-node-utils": { "version": "4.56.10", - "resolved": "https://registry.npmjs.org/@jsonjoy.com/fs-node-utils/-/fs-node-utils-4.56.10.tgz", - "integrity": "sha512-8EuPBgVI2aDPwFdaNQeNpHsyqPi3rr+85tMNG/lHvQLiVjzoZsvxA//Xd8aB567LUhy4QS03ptT+unkD/DIsNg==", "license": "Apache-2.0", "dependencies": { "@jsonjoy.com/fs-node-builtins": "4.56.10" @@ -10144,8 +8520,6 @@ }, "node_modules/@jsonjoy.com/fs-print": { "version": "4.56.10", - "resolved": "https://registry.npmjs.org/@jsonjoy.com/fs-print/-/fs-print-4.56.10.tgz", - "integrity": "sha512-JW4fp5mAYepzFsSGrQ48ep8FXxpg4niFWHdF78wDrFGof7F3tKDJln72QFDEn/27M1yHd4v7sKHHVPh78aWcEw==", "license": "Apache-2.0", "dependencies": { "@jsonjoy.com/fs-node-utils": "4.56.10", @@ -10164,8 +8538,6 @@ }, "node_modules/@jsonjoy.com/fs-snapshot": { "version": "4.56.10", - "resolved": "https://registry.npmjs.org/@jsonjoy.com/fs-snapshot/-/fs-snapshot-4.56.10.tgz", - "integrity": "sha512-DkR6l5fj7+qj0+fVKm/OOXMGfDFCGXLfyHkORH3DF8hxkpDgIHbhf/DwncBMs2igu/ST7OEkexn1gIqoU6Y+9g==", "license": "Apache-2.0", "dependencies": { "@jsonjoy.com/buffers": "^17.65.0", @@ -10186,8 +8558,6 @@ }, "node_modules/@jsonjoy.com/fs-snapshot/node_modules/@jsonjoy.com/base64": { "version": "17.67.0", - "resolved": "https://registry.npmjs.org/@jsonjoy.com/base64/-/base64-17.67.0.tgz", - "integrity": "sha512-5SEsJGsm15aP8TQGkDfJvz9axgPwAEm98S5DxOuYe8e1EbfajcDmgeXXzccEjh+mLnjqEKrkBdjHWS5vFNwDdw==", "license": "Apache-2.0", "engines": { "node": ">=10.0" @@ -10202,8 +8572,6 @@ }, "node_modules/@jsonjoy.com/fs-snapshot/node_modules/@jsonjoy.com/codegen": { "version": "17.67.0", - "resolved": "https://registry.npmjs.org/@jsonjoy.com/codegen/-/codegen-17.67.0.tgz", - "integrity": "sha512-idnkUplROpdBOV0HMcwhsCUS5TRUi9poagdGs70A6S4ux9+/aPuKbh8+UYRTLYQHtXvAdNfQWXDqZEx5k4Dj2Q==", "license": "Apache-2.0", "engines": { "node": ">=10.0" @@ -10218,8 +8586,6 @@ }, "node_modules/@jsonjoy.com/fs-snapshot/node_modules/@jsonjoy.com/json-pack": { "version": "17.67.0", - "resolved": "https://registry.npmjs.org/@jsonjoy.com/json-pack/-/json-pack-17.67.0.tgz", - "integrity": "sha512-t0ejURcGaZsn1ClbJ/3kFqSOjlryd92eQY465IYrezsXmPcfHPE/av4twRSxf6WE+TkZgLY+71vCZbiIiFKA/w==", "license": "Apache-2.0", "dependencies": { "@jsonjoy.com/base64": "17.67.0", @@ -10244,8 +8610,6 @@ }, "node_modules/@jsonjoy.com/fs-snapshot/node_modules/@jsonjoy.com/json-pointer": { "version": "17.67.0", - "resolved": "https://registry.npmjs.org/@jsonjoy.com/json-pointer/-/json-pointer-17.67.0.tgz", - "integrity": "sha512-+iqOFInH+QZGmSuaybBUNdh7yvNrXvqR+h3wjXm0N/3JK1EyyFAeGJvqnmQL61d1ARLlk/wJdFKSL+LHJ1eaUA==", "license": "Apache-2.0", "dependencies": { "@jsonjoy.com/util": "17.67.0" @@ -10263,8 +8627,6 @@ }, "node_modules/@jsonjoy.com/fs-snapshot/node_modules/@jsonjoy.com/util": { "version": "17.67.0", - "resolved": "https://registry.npmjs.org/@jsonjoy.com/util/-/util-17.67.0.tgz", - "integrity": "sha512-6+8xBaz1rLSohlGh68D1pdw3AwDi9xydm8QNlAFkvnavCJYSze+pxoW2VKP8p308jtlMRLs5NTHfPlZLd4w7ew==", "license": "Apache-2.0", "dependencies": { "@jsonjoy.com/buffers": "17.67.0", @@ -10283,8 +8645,6 @@ }, "node_modules/@jsonjoy.com/json-pack": { "version": "1.21.0", - "resolved": "https://registry.npmjs.org/@jsonjoy.com/json-pack/-/json-pack-1.21.0.tgz", - "integrity": "sha512-+AKG+R2cfZMShzrF2uQw34v3zbeDYUqnQ+jg7ORic3BGtfw9p/+N6RJbq/kkV8JmYZaINknaEQ2m0/f693ZPpg==", "license": "Apache-2.0", "dependencies": { "@jsonjoy.com/base64": "^1.1.2", @@ -10309,8 +8669,6 @@ }, "node_modules/@jsonjoy.com/json-pack/node_modules/@jsonjoy.com/buffers": { "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@jsonjoy.com/buffers/-/buffers-1.2.1.tgz", - "integrity": "sha512-12cdlDwX4RUM3QxmUbVJWqZ/mrK6dFQH4Zxq6+r1YXKXYBNgZXndx2qbCJwh3+WWkCSn67IjnlG3XYTvmvYtgA==", "license": "Apache-2.0", "engines": { "node": ">=10.0" @@ -10325,8 +8683,6 @@ }, "node_modules/@jsonjoy.com/json-pointer": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@jsonjoy.com/json-pointer/-/json-pointer-1.0.2.tgz", - "integrity": "sha512-Fsn6wM2zlDzY1U+v4Nc8bo3bVqgfNTGcn6dMgs6FjrEnt4ZCe60o6ByKRjOGlI2gow0aE/Q41QOigdTqkyK5fg==", "license": "Apache-2.0", "dependencies": { "@jsonjoy.com/codegen": "^1.0.0", @@ -10345,8 +8701,6 @@ }, "node_modules/@jsonjoy.com/util": { "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@jsonjoy.com/util/-/util-1.9.0.tgz", - "integrity": "sha512-pLuQo+VPRnN8hfPqUTLTHk126wuYdXVxE6aDmjSeV4NCAgyxWbiOIeNJVtID3h1Vzpoi9m4jXezf73I6LgabgQ==", "license": "Apache-2.0", "dependencies": { "@jsonjoy.com/buffers": "^1.0.0", @@ -10365,8 +8719,6 @@ }, "node_modules/@jsonjoy.com/util/node_modules/@jsonjoy.com/buffers": { "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@jsonjoy.com/buffers/-/buffers-1.2.1.tgz", - "integrity": "sha512-12cdlDwX4RUM3QxmUbVJWqZ/mrK6dFQH4Zxq6+r1YXKXYBNgZXndx2qbCJwh3+WWkCSn67IjnlG3XYTvmvYtgA==", "license": "Apache-2.0", "engines": { "node": ">=10.0" @@ -10381,14 +8733,10 @@ }, "node_modules/@leichtgewicht/ip-codec": { "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.5.tgz", - "integrity": "sha512-Vo+PSpZG2/fmgmiNzYK9qWRh8h/CHrwD0mo1h1DzL4yzHNSfWYujGTYsWGreD000gcgmZ7K4Ys6Tx9TxtsKdDw==", "license": "MIT" }, "node_modules/@libsql/client": { "version": "0.14.0", - "resolved": "https://registry.npmjs.org/@libsql/client/-/client-0.14.0.tgz", - "integrity": "sha512-/9HEKfn6fwXB5aTEEoMeFh4CtG0ZzbncBb1e++OCdVpgKZ/xyMsIVYXm0w7Pv4RUel803vE6LwniB3PqD72R0Q==", "dev": true, "license": "MIT", "dependencies": { @@ -10401,46 +8749,14 @@ }, "node_modules/@libsql/core": { "version": "0.14.0", - "resolved": "https://registry.npmjs.org/@libsql/core/-/core-0.14.0.tgz", - "integrity": "sha512-nhbuXf7GP3PSZgdCY2Ecj8vz187ptHlZQ0VRc751oB2C1W8jQUXKKklvt7t1LJiUTQBVJuadF628eUk+3cRi4Q==", "dev": true, "license": "MIT", "dependencies": { "js-base64": "^3.7.5" } }, - "node_modules/@libsql/darwin-arm64": { - "version": "0.4.7", - "resolved": "https://registry.npmjs.org/@libsql/darwin-arm64/-/darwin-arm64-0.4.7.tgz", - "integrity": "sha512-yOL742IfWUlUevnI5PdnIT4fryY3LYTdLm56bnY0wXBw7dhFcnjuA7jrH3oSVz2mjZTHujxoITgAE7V6Z+eAbg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@libsql/darwin-x64": { - "version": "0.4.7", - "resolved": "https://registry.npmjs.org/@libsql/darwin-x64/-/darwin-x64-0.4.7.tgz", - "integrity": "sha512-ezc7V75+eoyyH07BO9tIyJdqXXcRfZMbKcLCeF8+qWK5nP8wWuMcfOVywecsXGRbT99zc5eNra4NEx6z5PkSsA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ] - }, "node_modules/@libsql/hrana-client": { "version": "0.7.0", - "resolved": "https://registry.npmjs.org/@libsql/hrana-client/-/hrana-client-0.7.0.tgz", - "integrity": "sha512-OF8fFQSkbL7vJY9rfuegK1R7sPgQ6kFMkDamiEccNUvieQ+3urzfDFI616oPl8V7T9zRmnTkSjMOImYCAVRVuw==", "dev": true, "license": "MIT", "dependencies": { @@ -10452,8 +8768,6 @@ }, "node_modules/@libsql/hrana-client/node_modules/node-fetch": { "version": "3.3.2", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-3.3.2.tgz", - "integrity": "sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==", "dev": true, "license": "MIT", "dependencies": { @@ -10471,8 +8785,6 @@ }, "node_modules/@libsql/isomorphic-fetch": { "version": "0.3.1", - "resolved": "https://registry.npmjs.org/@libsql/isomorphic-fetch/-/isomorphic-fetch-0.3.1.tgz", - "integrity": "sha512-6kK3SUK5Uu56zPq/Las620n5aS9xJq+jMBcNSOmjhNf/MUvdyji4vrMTqD7ptY7/4/CAVEAYDeotUz60LNQHtw==", "dev": true, "license": "MIT", "engines": { @@ -10481,8 +8793,6 @@ }, "node_modules/@libsql/isomorphic-ws": { "version": "0.1.5", - "resolved": "https://registry.npmjs.org/@libsql/isomorphic-ws/-/isomorphic-ws-0.1.5.tgz", - "integrity": "sha512-DtLWIH29onUYR00i0GlQ3UdcTRC6EP4u9w/h9LxpUZJWRMARk6dQwZ6Jkd+QdwVpuAOrdxt18v0K2uIYR3fwFg==", "dev": true, "license": "MIT", "dependencies": { @@ -10492,8 +8802,6 @@ }, "node_modules/@libsql/linux-arm64-gnu": { "version": "0.4.7", - "resolved": "https://registry.npmjs.org/@libsql/linux-arm64-gnu/-/linux-arm64-gnu-0.4.7.tgz", - "integrity": "sha512-WlX2VYB5diM4kFfNaYcyhw5y+UJAI3xcMkEUJZPtRDEIu85SsSFrQ+gvoKfcVh76B//ztSeEX2wl9yrjF7BBCA==", "cpu": [ "arm64" ], @@ -10506,8 +8814,6 @@ }, "node_modules/@libsql/linux-arm64-musl": { "version": "0.4.7", - "resolved": "https://registry.npmjs.org/@libsql/linux-arm64-musl/-/linux-arm64-musl-0.4.7.tgz", - "integrity": "sha512-6kK9xAArVRlTCpWeqnNMCoXW1pe7WITI378n4NpvU5EJ0Ok3aNTIC2nRPRjhro90QcnmLL1jPcrVwO4WD1U0xw==", "cpu": [ "arm64" ], @@ -10518,52 +8824,8 @@ "linux" ] }, - "node_modules/@libsql/linux-x64-gnu": { - "version": "0.4.7", - "resolved": "https://registry.npmjs.org/@libsql/linux-x64-gnu/-/linux-x64-gnu-0.4.7.tgz", - "integrity": "sha512-CMnNRCmlWQqqzlTw6NeaZXzLWI8bydaXDke63JTUCvu8R+fj/ENsLrVBtPDlxQ0wGsYdXGlrUCH8Qi9gJep0yQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@libsql/linux-x64-musl": { - "version": "0.4.7", - "resolved": "https://registry.npmjs.org/@libsql/linux-x64-musl/-/linux-x64-musl-0.4.7.tgz", - "integrity": "sha512-nI6tpS1t6WzGAt1Kx1n1HsvtBbZ+jHn0m7ogNNT6pQHZQj7AFFTIMeDQw/i/Nt5H38np1GVRNsFe99eSIMs9XA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@libsql/win32-x64-msvc": { - "version": "0.4.7", - "resolved": "https://registry.npmjs.org/@libsql/win32-x64-msvc/-/win32-x64-msvc-0.4.7.tgz", - "integrity": "sha512-7pJzOWzPm6oJUxml+PCDRzYQ4A1hTMHAciTAHfFK4fkbDZX33nWPVG7Y3vqdKtslcwAzwmrNDc6sXy2nwWnbiw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, "node_modules/@lukeed/csprng": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@lukeed/csprng/-/csprng-1.1.0.tgz", - "integrity": "sha512-Z7C/xXCiGWsg0KuKsHTKJxbWhpI3Vs5GwLfOean7MGyVFGqdRgBbAjOCh6u4bbjPc/8MJ2pZmK/0DLdCbivLDA==", "license": "MIT", "engines": { "node": ">=8" @@ -10571,8 +8833,6 @@ }, "node_modules/@lukeed/uuid": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@lukeed/uuid/-/uuid-2.0.1.tgz", - "integrity": "sha512-qC72D4+CDdjGqJvkFMMEAtancHUQ7/d/tAiHf64z8MopFDmcrtbcJuerDtFceuAfQJ2pDSfCKCtbqoGBNnwg0w==", "license": "MIT", "dependencies": { "@lukeed/csprng": "^1.1.0" @@ -10583,8 +8843,6 @@ }, "node_modules/@manypkg/find-root": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@manypkg/find-root/-/find-root-1.1.0.tgz", - "integrity": "sha512-mki5uBvhHzO8kYYix/WRy2WX8S3B5wdVSc9D6KcU5lQNglP2yt58/VfLuAK49glRXChosY8ap2oJ1qgma3GUVA==", "dev": true, "license": "MIT", "dependencies": { @@ -10596,8 +8854,6 @@ }, "node_modules/@manypkg/find-root/node_modules/fs-extra": { "version": "8.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", - "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", "dev": true, "license": "MIT", "dependencies": { @@ -10611,8 +8867,6 @@ }, "node_modules/@manypkg/get-packages": { "version": "1.1.3", - "resolved": "https://registry.npmjs.org/@manypkg/get-packages/-/get-packages-1.1.3.tgz", - "integrity": "sha512-fo+QhuU3qE/2TQMQmbVMqaQ6EWbMhi4ABWP+O4AM1NqPBuy0OrApV5LO6BrrgnhtAHS2NH6RrVk9OL181tTi8A==", "dev": true, "license": "MIT", "dependencies": { @@ -10626,15 +8880,11 @@ }, "node_modules/@manypkg/get-packages/node_modules/@changesets/types": { "version": "4.1.0", - "resolved": "https://registry.npmjs.org/@changesets/types/-/types-4.1.0.tgz", - "integrity": "sha512-LDQvVDv5Kb50ny2s25Fhm3d9QSZimsoUGBsUioj6MC3qbMUCuC8GPIvk/M6IvXx3lYhAs0lwWUQLb+VIEUCECw==", "dev": true, "license": "MIT" }, "node_modules/@manypkg/get-packages/node_modules/fs-extra": { "version": "8.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", - "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", "dev": true, "license": "MIT", "dependencies": { @@ -10648,8 +8898,6 @@ }, "node_modules/@mapbox/node-pre-gyp": { "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@mapbox/node-pre-gyp/-/node-pre-gyp-2.0.3.tgz", - "integrity": "sha512-uwPAhccfFJlsfCxMYTwOdVfOz3xqyj8xYL3zJj8f0pb30tLohnnFPhLuqp4/qoEz8sNxe4SESZedcBojRefIzg==", "license": "BSD-3-Clause", "dependencies": { "consola": "^3.2.3", @@ -10669,8 +8917,6 @@ }, "node_modules/@mapbox/node-pre-gyp/node_modules/abbrev": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-3.0.1.tgz", - "integrity": "sha512-AO2ac6pjRB3SJmGJo+v5/aK6Omggp6fsLrs6wN9bd35ulu4cCwaAU9+7ZhXjeqHVkaHThLuzH0nZr0YpCDhygg==", "license": "ISC", "engines": { "node": "^18.17.0 || >=20.5.0" @@ -10678,8 +8924,6 @@ }, "node_modules/@mapbox/node-pre-gyp/node_modules/agent-base": { "version": "7.1.4", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.4.tgz", - "integrity": "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==", "license": "MIT", "engines": { "node": ">= 14" @@ -10687,8 +8931,6 @@ }, "node_modules/@mapbox/node-pre-gyp/node_modules/https-proxy-agent": { "version": "7.0.6", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", - "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", "license": "MIT", "dependencies": { "agent-base": "^7.1.2", @@ -10700,8 +8942,6 @@ }, "node_modules/@mapbox/node-pre-gyp/node_modules/nopt": { "version": "8.1.0", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-8.1.0.tgz", - "integrity": "sha512-ieGu42u/Qsa4TFktmaKEwM6MQH0pOWnaB3htzh0JRtx84+Mebc0cbZYN5bC+6WTZ4+77xrL9Pn5m7CV6VIkV7A==", "license": "ISC", "dependencies": { "abbrev": "^3.0.0" @@ -10715,8 +8955,6 @@ }, "node_modules/@mdx-js/mdx": { "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@mdx-js/mdx/-/mdx-3.1.1.tgz", - "integrity": "sha512-f6ZO2ifpwAQIpzGWaBQT2TXxPv6z3RBzQKpVftEWN78Vl/YweF1uwussDx8ECAXVtr3Rs89fKyG9YlzUs9DyGQ==", "license": "MIT", "dependencies": { "@types/estree": "^1.0.0", @@ -10752,8 +8990,6 @@ }, "node_modules/@mdx-js/react": { "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@mdx-js/react/-/react-3.1.1.tgz", - "integrity": "sha512-f++rKLQgUVYDAtECQ6fn/is15GkEH9+nZPM3MS0RcxVqoTfawHvDlSCH7JbMhAM6uJ32v3eXLvLmLvjGu7PTQw==", "license": "MIT", "dependencies": { "@types/mdx": "^2.0.0" @@ -10769,8 +9005,6 @@ }, "node_modules/@mermaid-js/parser": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@mermaid-js/parser/-/parser-1.0.0.tgz", - "integrity": "sha512-vvK0Hi/VWndxoh03Mmz6wa1KDriSPjS2XMZL/1l19HFwygiObEEoEwSDxOqyLzzAI6J2PU3261JjTMTO7x+BPw==", "license": "MIT", "dependencies": { "langium": "^4.0.0" @@ -10778,14 +9012,10 @@ }, "node_modules/@microsoft/clarity": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@microsoft/clarity/-/clarity-1.0.2.tgz", - "integrity": "sha512-9EZYROFpJxEGmQpHvUFqvD3ZJ7QQSqnibYSWmS+1xusoZfG1QQ1/Al9yVBBc11DWMbJrs1pe1hLT273it/skJg==", "license": "MIT" }, "node_modules/@mixpanel/rrdom": { "version": "2.0.0-alpha.18.4", - "resolved": "https://registry.npmjs.org/@mixpanel/rrdom/-/rrdom-2.0.0-alpha.18.4.tgz", - "integrity": "sha512-58sWLQDPRU0VQn8VzB1tx4ujih9X327Vr6xAzbJ4zge9GENm2L696T4TbWvrRGWPW6w99tHIHbv6SvcLhjjmcQ==", "license": "MIT", "dependencies": { "@mixpanel/rrweb-snapshot": "^2.0.0-alpha.18" @@ -10793,8 +9023,6 @@ }, "node_modules/@mixpanel/rrweb": { "version": "2.0.0-alpha.18.4", - "resolved": "https://registry.npmjs.org/@mixpanel/rrweb/-/rrweb-2.0.0-alpha.18.4.tgz", - "integrity": "sha512-ICpEYDFEEiCoUuQg+de3VvQCsolF4lNHfEM9DBp5Pwuc7EgXqwWV4wUpiRF/NbhoKk+82X1Qe+oqqlKJb/CGFw==", "license": "MIT", "dependencies": { "@mixpanel/rrdom": "^2.0.0-alpha.18", @@ -10809,8 +9037,6 @@ }, "node_modules/@mixpanel/rrweb-plugin-console-record": { "version": "2.0.0-alpha.18.4", - "resolved": "https://registry.npmjs.org/@mixpanel/rrweb-plugin-console-record/-/rrweb-plugin-console-record-2.0.0-alpha.18.4.tgz", - "integrity": "sha512-gGxEnNpfWurQht+fpSJbwPV60ug0LAENlk4Ux3XRmYooNJGPBO1TiQHcM7g0yhrKf4tfbTiKKZ4EXzFlOZs/pw==", "license": "MIT", "peerDependencies": { "@mixpanel/rrweb": "^2.0.0-alpha.18", @@ -10819,8 +9045,6 @@ }, "node_modules/@mixpanel/rrweb-snapshot": { "version": "2.0.0-alpha.18.4", - "resolved": "https://registry.npmjs.org/@mixpanel/rrweb-snapshot/-/rrweb-snapshot-2.0.0-alpha.18.4.tgz", - "integrity": "sha512-ubLGwgPiMMi0rl7zJRh1uMScQ480lT95tkHkIAHkiZOemMY4JSkYZh2v9fpMNwJhaGwB5n/76KI7Cwy8F5qixQ==", "license": "MIT", "dependencies": { "postcss": "^8.4.38" @@ -10828,20 +9052,14 @@ }, "node_modules/@mixpanel/rrweb-types": { "version": "2.0.0-alpha.18.4", - "resolved": "https://registry.npmjs.org/@mixpanel/rrweb-types/-/rrweb-types-2.0.0-alpha.18.4.tgz", - "integrity": "sha512-7kRuk7pK6Firrb26Mm235Po7s/z+9k0gUKZU/DZkzg5U1yQRcsu4byIrnWTiTQr+LFLUrIiyRKnpGK/QneAhTw==", "license": "MIT" }, "node_modules/@mixpanel/rrweb-utils": { "version": "2.0.0-alpha.18.4", - "resolved": "https://registry.npmjs.org/@mixpanel/rrweb-utils/-/rrweb-utils-2.0.0-alpha.18.4.tgz", - "integrity": "sha512-c3nUbQl19kxHjf8nowFMeXlJw0ZqLesIVBb9t4g1nC4WtaNEPkFotWRdGt5V2cJNQ+aY38/v2uYb8Ren4IcdSQ==", "license": "MIT" }, "node_modules/@modelcontextprotocol/sdk": { "version": "1.29.0", - "resolved": "https://registry.npmjs.org/@modelcontextprotocol/sdk/-/sdk-1.29.0.tgz", - "integrity": "sha512-zo37mZA9hJWpULgkRpowewez1y6ML5GsXJPY8FI0tBBCd77HEvza4jDqRKOXgHNn867PVGCyTdzqpz0izu5ZjQ==", "license": "MIT", "dependencies": { "@hono/node-server": "^1.19.9", @@ -10880,8 +9098,6 @@ }, "node_modules/@modelcontextprotocol/sdk/node_modules/accepts": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-2.0.0.tgz", - "integrity": "sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==", "license": "MIT", "dependencies": { "mime-types": "^3.0.0", @@ -10893,8 +9109,6 @@ }, "node_modules/@modelcontextprotocol/sdk/node_modules/body-parser": { "version": "2.2.2", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-2.2.2.tgz", - "integrity": "sha512-oP5VkATKlNwcgvxi0vM0p/D3n2C3EReYVX+DNYs5TjZFn/oQt2j+4sVJtSMr18pdRr8wjTcBl6LoV+FUwzPmNA==", "license": "MIT", "dependencies": { "bytes": "^3.1.2", @@ -10917,8 +9131,6 @@ }, "node_modules/@modelcontextprotocol/sdk/node_modules/content-disposition": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-1.0.1.tgz", - "integrity": "sha512-oIXISMynqSqm241k6kcQ5UwttDILMK4BiurCfGEREw6+X9jkkpEe5T9FZaApyLGGOnFuyMWZpdolTXMtvEJ08Q==", "license": "MIT", "engines": { "node": ">=18" @@ -10930,8 +9142,6 @@ }, "node_modules/@modelcontextprotocol/sdk/node_modules/cookie-signature": { "version": "1.2.2", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.2.2.tgz", - "integrity": "sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==", "license": "MIT", "engines": { "node": ">=6.6.0" @@ -10939,8 +9149,6 @@ }, "node_modules/@modelcontextprotocol/sdk/node_modules/express": { "version": "5.2.1", - "resolved": "https://registry.npmjs.org/express/-/express-5.2.1.tgz", - "integrity": "sha512-hIS4idWWai69NezIdRt2xFVofaF4j+6INOpJlVOLDO8zXGpUVEVzIYk12UUi2JzjEzWL3IOAxcTubgz9Po0yXw==", "license": "MIT", "dependencies": { "accepts": "^2.0.0", @@ -10982,8 +9190,6 @@ }, "node_modules/@modelcontextprotocol/sdk/node_modules/finalhandler": { "version": "2.1.1", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-2.1.1.tgz", - "integrity": "sha512-S8KoZgRZN+a5rNwqTxlZZePjT/4cnm0ROV70LedRHZ0p8u9fRID0hJUZQpkKLzro8LfmC8sx23bY6tVNxv8pQA==", "license": "MIT", "dependencies": { "debug": "^4.4.0", @@ -11003,8 +9209,6 @@ }, "node_modules/@modelcontextprotocol/sdk/node_modules/fresh": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-2.0.0.tgz", - "integrity": "sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==", "license": "MIT", "engines": { "node": ">= 0.8" @@ -11012,8 +9216,6 @@ }, "node_modules/@modelcontextprotocol/sdk/node_modules/media-typer": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-1.1.0.tgz", - "integrity": "sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==", "license": "MIT", "engines": { "node": ">= 0.8" @@ -11021,8 +9223,6 @@ }, "node_modules/@modelcontextprotocol/sdk/node_modules/merge-descriptors": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-2.0.0.tgz", - "integrity": "sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==", "license": "MIT", "engines": { "node": ">=18" @@ -11033,8 +9233,6 @@ }, "node_modules/@modelcontextprotocol/sdk/node_modules/mime-db": { "version": "1.54.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", - "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", "license": "MIT", "engines": { "node": ">= 0.6" @@ -11042,8 +9240,6 @@ }, "node_modules/@modelcontextprotocol/sdk/node_modules/mime-types": { "version": "3.0.2", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.2.tgz", - "integrity": "sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A==", "license": "MIT", "dependencies": { "mime-db": "^1.54.0" @@ -11058,8 +9254,6 @@ }, "node_modules/@modelcontextprotocol/sdk/node_modules/negotiator": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-1.0.0.tgz", - "integrity": "sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==", "license": "MIT", "engines": { "node": ">= 0.6" @@ -11067,8 +9261,6 @@ }, "node_modules/@modelcontextprotocol/sdk/node_modules/send": { "version": "1.2.1", - "resolved": "https://registry.npmjs.org/send/-/send-1.2.1.tgz", - "integrity": "sha512-1gnZf7DFcoIcajTjTwjwuDjzuz4PPcY2StKPlsGAQ1+YH20IRVrBaXSWmdjowTJ6u8Rc01PoYOGHXfP1mYcZNQ==", "license": "MIT", "dependencies": { "debug": "^4.4.3", @@ -11093,8 +9285,6 @@ }, "node_modules/@modelcontextprotocol/sdk/node_modules/serve-static": { "version": "2.2.1", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-2.2.1.tgz", - "integrity": "sha512-xRXBn0pPqQTVQiC8wyQrKs2MOlX24zQ0POGaj0kultvoOCstBQM5yvOhAVSUwOMjQtTvsPWoNCHfPGwaaQJhTw==", "license": "MIT", "dependencies": { "encodeurl": "^2.0.0", @@ -11112,8 +9302,6 @@ }, "node_modules/@modelcontextprotocol/sdk/node_modules/type-is": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-2.0.1.tgz", - "integrity": "sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw==", "license": "MIT", "dependencies": { "content-type": "^1.0.5", @@ -11126,15 +9314,11 @@ }, "node_modules/@module-federation/error-codes": { "version": "0.22.0", - "resolved": "https://registry.npmjs.org/@module-federation/error-codes/-/error-codes-0.22.0.tgz", - "integrity": "sha512-xF9SjnEy7vTdx+xekjPCV5cIHOGCkdn3pIxo9vU7gEZMIw0SvAEdsy6Uh17xaCpm8V0FWvR0SZoK9Ik6jGOaug==", "devOptional": true, "license": "MIT" }, "node_modules/@module-federation/runtime": { "version": "0.22.0", - "resolved": "https://registry.npmjs.org/@module-federation/runtime/-/runtime-0.22.0.tgz", - "integrity": "sha512-38g5iPju2tPC3KHMPxRKmy4k4onNp6ypFPS1eKGsNLUkXgHsPMBFqAjDw96iEcjri91BrahG4XcdyKi97xZzlA==", "devOptional": true, "license": "MIT", "dependencies": { @@ -11145,8 +9329,6 @@ }, "node_modules/@module-federation/runtime-core": { "version": "0.22.0", - "resolved": "https://registry.npmjs.org/@module-federation/runtime-core/-/runtime-core-0.22.0.tgz", - "integrity": "sha512-GR1TcD6/s7zqItfhC87zAp30PqzvceoeDGYTgF3Vx2TXvsfDrhP6Qw9T4vudDQL3uJRne6t7CzdT29YyVxlgIA==", "devOptional": true, "license": "MIT", "dependencies": { @@ -11156,8 +9338,6 @@ }, "node_modules/@module-federation/runtime-tools": { "version": "0.22.0", - "resolved": "https://registry.npmjs.org/@module-federation/runtime-tools/-/runtime-tools-0.22.0.tgz", - "integrity": "sha512-4ScUJ/aUfEernb+4PbLdhM/c60VHl698Gn1gY21m9vyC1Ucn69fPCA1y2EwcCB7IItseRMoNhdcWQnzt/OPCNA==", "devOptional": true, "license": "MIT", "dependencies": { @@ -11167,15 +9347,11 @@ }, "node_modules/@module-federation/sdk": { "version": "0.22.0", - "resolved": "https://registry.npmjs.org/@module-federation/sdk/-/sdk-0.22.0.tgz", - "integrity": "sha512-x4aFNBKn2KVQRuNVC5A7SnrSCSqyfIWmm1DvubjbO9iKFe7ith5niw8dqSFBekYBg2Fwy+eMg4sEFNVvCAdo6g==", "devOptional": true, "license": "MIT" }, "node_modules/@module-federation/webpack-bundler-runtime": { "version": "0.22.0", - "resolved": "https://registry.npmjs.org/@module-federation/webpack-bundler-runtime/-/webpack-bundler-runtime-0.22.0.tgz", - "integrity": "sha512-aM8gCqXu+/4wBmJtVeMeeMN5guw3chf+2i6HajKtQv7SJfxV/f4IyNQJUeUQu9HfiAZHjqtMV5Lvq/Lvh8LdyA==", "devOptional": true, "license": "MIT", "dependencies": { @@ -11185,8 +9361,6 @@ }, "node_modules/@monaco-editor/loader": { "version": "1.7.0", - "resolved": "https://registry.npmjs.org/@monaco-editor/loader/-/loader-1.7.0.tgz", - "integrity": "sha512-gIwR1HrJrrx+vfyOhYmCZ0/JcWqG5kbfG7+d3f/C1LXk2EvzAbHSg3MQ5lO2sMlo9izoAZ04shohfKLVT6crVA==", "license": "MIT", "dependencies": { "state-local": "^1.0.6" @@ -11194,8 +9368,6 @@ }, "node_modules/@monaco-editor/react": { "version": "4.7.0", - "resolved": "https://registry.npmjs.org/@monaco-editor/react/-/react-4.7.0.tgz", - "integrity": "sha512-cyzXQCtO47ydzxpQtCGSQGOC8Gk3ZUeBXFAxD+CWXYFo5OqZyZUonFl0DwUlTyAfRHntBfw2p3w4s9R6oe1eCA==", "license": "MIT", "dependencies": { "@monaco-editor/loader": "^1.5.0" @@ -11247,8 +9419,6 @@ }, "node_modules/@msgpackr-extract/msgpackr-extract-linux-arm64": { "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-linux-arm64/-/msgpackr-extract-linux-arm64-3.0.3.tgz", - "integrity": "sha512-YxQL+ax0XqBJDZiKimS2XQaf+2wDGVa1enVRGzEvLLVFeqa5kx2bWbtcSXgsxjQB7nRqqIGFIcLteF/sHeVtQg==", "cpu": [ "arm64" ], @@ -11286,8 +9456,6 @@ }, "node_modules/@mswjs/interceptors": { "version": "0.41.3", - "resolved": "https://registry.npmjs.org/@mswjs/interceptors/-/interceptors-0.41.3.tgz", - "integrity": "sha512-cXu86tF4VQVfwz8W1SPbhoRyHJkti6mjH/XJIxp40jhO4j2k1m4KYrEykxqWPkFF3vrK4rgQppBh//AwyGSXPA==", "dev": true, "license": "MIT", "dependencies": { @@ -11302,29 +9470,13 @@ "node": ">=18" } }, - "node_modules/@napi-rs/wasm-runtime": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.0.7.tgz", - "integrity": "sha512-SeDnOO0Tk7Okiq6DbXmmBODgOAb9dp9gjlphokTUxmt8U3liIP1ZsozBahH69j/RJv+Rfs6IwUKHTgQYJ/HBAw==", - "license": "MIT", - "optional": true, - "dependencies": { - "@emnapi/core": "^1.5.0", - "@emnapi/runtime": "^1.5.0", - "@tybys/wasm-util": "^0.10.1" - } - }, "node_modules/@neon-rs/load": { "version": "0.0.4", - "resolved": "https://registry.npmjs.org/@neon-rs/load/-/load-0.0.4.tgz", - "integrity": "sha512-kTPhdZyTQxB+2wpiRcFWrDcejc4JI6tkPuS7UZCG4l6Zvc5kU/gGQ/ozvHTh1XR5tS+UlfAfGuPajjzQjCiHCw==", "dev": true, "license": "MIT" }, "node_modules/@noble/hashes": { "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.4.0.tgz", - "integrity": "sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg==", "license": "MIT", "engines": { "node": ">= 16" @@ -11335,8 +9487,6 @@ }, "node_modules/@nodable/entities": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@nodable/entities/-/entities-2.1.0.tgz", - "integrity": "sha512-nyT7T3nbMyBI/lvr6L5TyWbFJAI9FTgVRakNoBqCD+PmID8DzFrrNdLLtHMwMszOtqZa8PAOV24ZqDnQrhQINA==", "funding": [ { "type": "github", @@ -11347,8 +9497,6 @@ }, "node_modules/@node-rs/jieba": { "version": "1.10.4", - "resolved": "https://registry.npmjs.org/@node-rs/jieba/-/jieba-1.10.4.tgz", - "integrity": "sha512-GvDgi8MnBiyWd6tksojej8anIx18244NmIOc1ovEw8WKNUejcccLfyu8vj66LWSuoZuKILVtNsOy4jvg3aoxIw==", "license": "MIT", "engines": { "node": ">= 10" @@ -11472,8 +9620,6 @@ }, "node_modules/@node-rs/jieba-linux-arm64-gnu": { "version": "1.10.4", - "resolved": "https://registry.npmjs.org/@node-rs/jieba-linux-arm64-gnu/-/jieba-linux-arm64-gnu-1.10.4.tgz", - "integrity": "sha512-omIzNX1psUzPcsdnUhGU6oHeOaTCuCjUgOA/v/DGkvWC1jLcnfXe4vdYbtXMh4XOCuIgS1UCcvZEc8vQLXFbXQ==", "cpu": [ "arm64" ], @@ -11488,8 +9634,6 @@ }, "node_modules/@node-rs/jieba-linux-arm64-musl": { "version": "1.10.4", - "resolved": "https://registry.npmjs.org/@node-rs/jieba-linux-arm64-musl/-/jieba-linux-arm64-musl-1.10.4.tgz", - "integrity": "sha512-Y/tiJ1+HeS5nnmLbZOE+66LbsPOHZ/PUckAYVeLlQfpygLEpLYdlh0aPpS5uiaWMjAXYZYdFkpZHhxDmSLpwpw==", "cpu": [ "arm64" ], @@ -11534,34 +9678,6 @@ "node": ">= 10" } }, - "node_modules/@node-rs/jieba-wasm32-wasi": { - "version": "1.10.4", - "resolved": "https://registry.npmjs.org/@node-rs/jieba-wasm32-wasi/-/jieba-wasm32-wasi-1.10.4.tgz", - "integrity": "sha512-Y2umiKHjuIJy0uulNDz9SDYHdfq5Hmy7jY5nORO99B4pySKkcrMjpeVrmWXJLIsEKLJwcCXHxz8tjwU5/uhz0A==", - "cpu": [ - "wasm32" - ], - "license": "MIT", - "optional": true, - "dependencies": { - "@napi-rs/wasm-runtime": "^0.2.3" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@node-rs/jieba-wasm32-wasi/node_modules/@napi-rs/wasm-runtime": { - "version": "0.2.12", - "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-0.2.12.tgz", - "integrity": "sha512-ZVWUcfwY4E/yPitQJl481FjFo3K22D6qF0DuFH6Y/nbnE11GY5uguDxZMGXPQ8WQ0128MXQD7TnfHyK4oWoIJQ==", - "license": "MIT", - "optional": true, - "dependencies": { - "@emnapi/core": "^1.4.3", - "@emnapi/runtime": "^1.4.3", - "@tybys/wasm-util": "^0.10.0" - } - }, "node_modules/@node-rs/jieba-win32-arm64-msvc": { "version": "1.10.4", "resolved": "https://registry.npmjs.org/@node-rs/jieba-win32-arm64-msvc/-/jieba-win32-arm64-msvc-1.10.4.tgz", @@ -11612,8 +9728,6 @@ }, "node_modules/@nodelib/fs.scandir": { "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", "license": "MIT", "dependencies": { "@nodelib/fs.stat": "2.0.5", @@ -11625,8 +9739,6 @@ }, "node_modules/@nodelib/fs.stat": { "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", "license": "MIT", "engines": { "node": ">= 8" @@ -11634,8 +9746,6 @@ }, "node_modules/@nodelib/fs.walk": { "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", "license": "MIT", "dependencies": { "@nodelib/fs.scandir": "2.1.5", @@ -11647,8 +9757,6 @@ }, "node_modules/@npmcli/agent": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@npmcli/agent/-/agent-4.0.0.tgz", - "integrity": "sha512-kAQTcEN9E8ERLVg5AsGwLNoFb+oEG6engbqAU2P43gD4JEIkNGMHdVQ096FsOAAYpZPB0RSt0zgInKIAS1l5QA==", "license": "ISC", "dependencies": { "agent-base": "^7.1.0", @@ -11663,8 +9771,6 @@ }, "node_modules/@npmcli/agent/node_modules/agent-base": { "version": "7.1.4", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.4.tgz", - "integrity": "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==", "license": "MIT", "engines": { "node": ">= 14" @@ -11672,8 +9778,6 @@ }, "node_modules/@npmcli/agent/node_modules/https-proxy-agent": { "version": "7.0.6", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", - "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", "license": "MIT", "dependencies": { "agent-base": "^7.1.2", @@ -11685,8 +9789,6 @@ }, "node_modules/@npmcli/agent/node_modules/lru-cache": { "version": "11.2.6", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.2.6.tgz", - "integrity": "sha512-ESL2CrkS/2wTPfuend7Zhkzo2u0daGJ/A2VucJOgQ/C48S/zB8MMeMHSGKYpXhIjbPxfuezITkaBH1wqv00DDQ==", "license": "BlueOak-1.0.0", "engines": { "node": "20 || >=22" @@ -11694,8 +9796,6 @@ }, "node_modules/@npmcli/config": { "version": "8.3.4", - "resolved": "https://registry.npmjs.org/@npmcli/config/-/config-8.3.4.tgz", - "integrity": "sha512-01rtHedemDNhUXdicU7s+QYz/3JyV5Naj84cvdXGH4mgCdL+agmSYaLF4LUG4vMCLzhBO8YtS0gPpH1FGvbgAw==", "dev": true, "license": "ISC", "dependencies": { @@ -11714,8 +9814,6 @@ }, "node_modules/@npmcli/config/node_modules/@npmcli/git": { "version": "5.0.8", - "resolved": "https://registry.npmjs.org/@npmcli/git/-/git-5.0.8.tgz", - "integrity": "sha512-liASfw5cqhjNW9UFd+ruwwdEf/lbOAQjLL2XY2dFW/bkJheXDYZgOyul/4gVvEV4BWkTXjYGmDqMw9uegdbJNQ==", "dev": true, "license": "ISC", "dependencies": { @@ -11735,8 +9833,6 @@ }, "node_modules/@npmcli/config/node_modules/@npmcli/package-json": { "version": "5.2.1", - "resolved": "https://registry.npmjs.org/@npmcli/package-json/-/package-json-5.2.1.tgz", - "integrity": "sha512-f7zYC6kQautXHvNbLEWgD/uGu1+xCn9izgqBfgItWSx22U0ZDekxN08A1vM8cTxj/cRVe0Q94Ode+tdoYmIOOQ==", "dev": true, "license": "ISC", "dependencies": { @@ -11754,8 +9850,6 @@ }, "node_modules/@npmcli/config/node_modules/@npmcli/promise-spawn": { "version": "7.0.2", - "resolved": "https://registry.npmjs.org/@npmcli/promise-spawn/-/promise-spawn-7.0.2.tgz", - "integrity": "sha512-xhfYPXoV5Dy4UkY0D+v2KkwvnDfiA/8Mt3sWCGI/hM03NsYIH8ZaG6QzS9x7pje5vHZBZJ2v6VRFVTWACnqcmQ==", "dev": true, "license": "ISC", "dependencies": { @@ -11767,8 +9861,6 @@ }, "node_modules/@npmcli/config/node_modules/abbrev": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-2.0.0.tgz", - "integrity": "sha512-6/mh1E2u2YgEsCHdY0Yx5oW+61gZU+1vXaoiHHrpKeuRNNgFvS+/jrwHiQhB5apAf5oB7UB7E19ol2R2LKH8hQ==", "dev": true, "license": "ISC", "engines": { @@ -11777,15 +9869,11 @@ }, "node_modules/@npmcli/config/node_modules/balanced-match": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", "dev": true, "license": "MIT" }, "node_modules/@npmcli/config/node_modules/brace-expansion": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", - "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", "dev": true, "license": "MIT", "dependencies": { @@ -11794,8 +9882,6 @@ }, "node_modules/@npmcli/config/node_modules/ci-info": { "version": "4.4.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-4.4.0.tgz", - "integrity": "sha512-77PSwercCZU2Fc4sX94eF8k8Pxte6JAwL4/ICZLFjJLqegs7kCuAsqqj/70NQF6TvDpgFjkubQB2FW2ZZddvQg==", "dev": true, "funding": [ { @@ -11810,9 +9896,6 @@ }, "node_modules/@npmcli/config/node_modules/glob": { "version": "10.5.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.5.0.tgz", - "integrity": "sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==", - "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", "dev": true, "license": "ISC", "dependencies": { @@ -11832,8 +9915,6 @@ }, "node_modules/@npmcli/config/node_modules/hosted-git-info": { "version": "7.0.2", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-7.0.2.tgz", - "integrity": "sha512-puUZAUKT5m8Zzvs72XWy3HtvVbTWljRE66cP60bxJzAqf2DgICo7lYTY2IHUmLnNpjYvw5bvmoHvPc0QO2a62w==", "dev": true, "license": "ISC", "dependencies": { @@ -11845,8 +9926,6 @@ }, "node_modules/@npmcli/config/node_modules/ini": { "version": "4.1.3", - "resolved": "https://registry.npmjs.org/ini/-/ini-4.1.3.tgz", - "integrity": "sha512-X7rqawQBvfdjS10YU1y1YVreA3SsLrW9dX2CewP2EbBJM4ypVNLDkO5y04gejPwKIY9lR+7r9gn3rFPt/kmWFg==", "dev": true, "license": "ISC", "engines": { @@ -11855,8 +9934,6 @@ }, "node_modules/@npmcli/config/node_modules/isexe": { "version": "3.1.5", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-3.1.5.tgz", - "integrity": "sha512-6B3tLtFqtQS4ekarvLVMZ+X+VlvQekbe4taUkf/rhVO3d/h0M2rfARm/pXLcPEsjjMsFgrFgSrhQIxcSVrBz8w==", "dev": true, "license": "BlueOak-1.0.0", "engines": { @@ -11865,8 +9942,6 @@ }, "node_modules/@npmcli/config/node_modules/json-parse-even-better-errors": { "version": "3.0.2", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-3.0.2.tgz", - "integrity": "sha512-fi0NG4bPjCHunUJffmLd0gxssIgkNmArMvis4iNah6Owg1MCJjWhEcDLmsK6iGkJq3tHwbDkTlce70/tmXN4cQ==", "dev": true, "license": "MIT", "engines": { @@ -11875,15 +9950,11 @@ }, "node_modules/@npmcli/config/node_modules/lru-cache": { "version": "10.4.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", - "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", "dev": true, "license": "ISC" }, "node_modules/@npmcli/config/node_modules/minimatch": { "version": "9.0.9", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.9.tgz", - "integrity": "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==", "dev": true, "license": "ISC", "dependencies": { @@ -11898,8 +9969,6 @@ }, "node_modules/@npmcli/config/node_modules/nopt": { "version": "7.2.1", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-7.2.1.tgz", - "integrity": "sha512-taM24ViiimT/XntxbPyJQzCG+p4EKOpgD3mxFwW38mGjVUrfERQOeY4EDHjdnptttfHuHQXFx+lTP08Q+mLa/w==", "dev": true, "license": "ISC", "dependencies": { @@ -11914,8 +9983,6 @@ }, "node_modules/@npmcli/config/node_modules/normalize-package-data": { "version": "6.0.2", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-6.0.2.tgz", - "integrity": "sha512-V6gygoYb/5EmNI+MEGrWkC+e6+Rr7mTmfHrxDbLzxQogBkgzo76rkok0Am6thgSF7Mv2nLOajAJj5vDJZEFn7g==", "dev": true, "license": "BSD-2-Clause", "dependencies": { @@ -11929,8 +9996,6 @@ }, "node_modules/@npmcli/config/node_modules/npm-install-checks": { "version": "6.3.0", - "resolved": "https://registry.npmjs.org/npm-install-checks/-/npm-install-checks-6.3.0.tgz", - "integrity": "sha512-W29RiK/xtpCGqn6f3ixfRYGk+zRyr+Ew9F2E20BfXxT5/euLdA/Nm7fO7OeTGuAmTs30cpgInyJ0cYe708YTZw==", "dev": true, "license": "BSD-2-Clause", "dependencies": { @@ -11942,8 +10007,6 @@ }, "node_modules/@npmcli/config/node_modules/npm-normalize-package-bin": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-3.0.1.tgz", - "integrity": "sha512-dMxCf+zZ+3zeQZXKxmyuCKlIDPGuv8EF940xbkC4kQVDTtqoh6rJFO+JTKSA6/Rwi0getWmtuy4Itup0AMcaDQ==", "dev": true, "license": "ISC", "engines": { @@ -11952,8 +10015,6 @@ }, "node_modules/@npmcli/config/node_modules/npm-package-arg": { "version": "11.0.3", - "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-11.0.3.tgz", - "integrity": "sha512-sHGJy8sOC1YraBywpzQlIKBE4pBbGbiF95U6Auspzyem956E0+FtDtsx1ZxlOJkQCZ1AFXAY/yuvtFYrOxF+Bw==", "dev": true, "license": "ISC", "dependencies": { @@ -11968,8 +10029,6 @@ }, "node_modules/@npmcli/config/node_modules/npm-pick-manifest": { "version": "9.1.0", - "resolved": "https://registry.npmjs.org/npm-pick-manifest/-/npm-pick-manifest-9.1.0.tgz", - "integrity": "sha512-nkc+3pIIhqHVQr085X9d2JzPzLyjzQS96zbruppqC9aZRm/x8xx6xhI98gHtsfELP2bE+loHq8ZaHFHhe+NauA==", "dev": true, "license": "ISC", "dependencies": { @@ -11984,8 +10043,6 @@ }, "node_modules/@npmcli/config/node_modules/path-scurry": { "version": "1.11.1", - "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", - "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", "dev": true, "license": "BlueOak-1.0.0", "dependencies": { @@ -12001,8 +10058,6 @@ }, "node_modules/@npmcli/config/node_modules/proc-log": { "version": "4.2.0", - "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-4.2.0.tgz", - "integrity": "sha512-g8+OnU/L2v+wyiVK+D5fA34J7EH8jZ8DDlvwhRCMxmMj7UCBvxiO1mGeN+36JXIKF4zevU4kRBd8lVgG9vLelA==", "dev": true, "license": "ISC", "engines": { @@ -12011,8 +10066,6 @@ }, "node_modules/@npmcli/config/node_modules/validate-npm-package-name": { "version": "5.0.1", - "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-5.0.1.tgz", - "integrity": "sha512-OljLrQ9SQdOUqTaQxqL5dEfZWrXExyyWsozYlAWFawPVNuD83igl7uJD2RTkNMbniIYgt8l81eCJGIdQF7avLQ==", "dev": true, "license": "ISC", "engines": { @@ -12021,8 +10074,6 @@ }, "node_modules/@npmcli/config/node_modules/which": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/which/-/which-4.0.0.tgz", - "integrity": "sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg==", "dev": true, "license": "ISC", "dependencies": { @@ -12037,8 +10088,6 @@ }, "node_modules/@npmcli/fs": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-5.0.0.tgz", - "integrity": "sha512-7OsC1gNORBEawOa5+j2pXN9vsicaIOH5cPXxoR6fJOmH6/EXpJB2CajXOu1fPRFun2m1lktEFX11+P89hqO/og==", "license": "ISC", "dependencies": { "semver": "^7.3.5" @@ -12049,8 +10098,6 @@ }, "node_modules/@npmcli/git": { "version": "7.0.2", - "resolved": "https://registry.npmjs.org/@npmcli/git/-/git-7.0.2.tgz", - "integrity": "sha512-oeolHDjExNAJAnlYP2qzNjMX/Xi9bmu78C9dIGr4xjobrSKbuMYCph8lTzn4vnW3NjIqVmw/f8BCfouqyJXlRg==", "license": "ISC", "dependencies": { "@gar/promise-retry": "^1.0.0", @@ -12068,8 +10115,6 @@ }, "node_modules/@npmcli/git/node_modules/isexe": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-4.0.0.tgz", - "integrity": "sha512-FFUtZMpoZ8RqHS3XeXEmHWLA4thH+ZxCv2lOiPIn1Xc7CxrqhWzNSDzD+/chS/zbYezmiwWLdQC09JdQKmthOw==", "license": "BlueOak-1.0.0", "engines": { "node": ">=20" @@ -12077,8 +10122,6 @@ }, "node_modules/@npmcli/git/node_modules/lru-cache": { "version": "11.2.6", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.2.6.tgz", - "integrity": "sha512-ESL2CrkS/2wTPfuend7Zhkzo2u0daGJ/A2VucJOgQ/C48S/zB8MMeMHSGKYpXhIjbPxfuezITkaBH1wqv00DDQ==", "license": "BlueOak-1.0.0", "engines": { "node": "20 || >=22" @@ -12086,8 +10129,6 @@ }, "node_modules/@npmcli/git/node_modules/which": { "version": "6.0.1", - "resolved": "https://registry.npmjs.org/which/-/which-6.0.1.tgz", - "integrity": "sha512-oGLe46MIrCRqX7ytPUf66EAYvdeMIZYn3WaocqqKZAxrBpkqHfL/qvTyJ/bTk5+AqHCjXmrv3CEWgy368zhRUg==", "license": "ISC", "dependencies": { "isexe": "^4.0.0" @@ -12101,8 +10142,6 @@ }, "node_modules/@npmcli/installed-package-contents": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@npmcli/installed-package-contents/-/installed-package-contents-4.0.0.tgz", - "integrity": "sha512-yNyAdkBxB72gtZ4GrwXCM0ZUedo9nIbOMKfGjt6Cu6DXf0p8y1PViZAKDC8q8kv/fufx0WTjRBdSlyrvnP7hmA==", "license": "ISC", "dependencies": { "npm-bundled": "^5.0.0", @@ -12117,8 +10156,6 @@ }, "node_modules/@npmcli/map-workspaces": { "version": "3.0.6", - "resolved": "https://registry.npmjs.org/@npmcli/map-workspaces/-/map-workspaces-3.0.6.tgz", - "integrity": "sha512-tkYs0OYnzQm6iIRdfy+LcLBjcKuQCeE5YLb8KnrIlutJfheNaPvPpgoFEyEFgbjzl5PLZ3IA/BWAwRU0eHuQDA==", "dev": true, "license": "ISC", "dependencies": { @@ -12133,15 +10170,11 @@ }, "node_modules/@npmcli/map-workspaces/node_modules/balanced-match": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", "dev": true, "license": "MIT" }, "node_modules/@npmcli/map-workspaces/node_modules/brace-expansion": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", - "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", "dev": true, "license": "MIT", "dependencies": { @@ -12150,9 +10183,6 @@ }, "node_modules/@npmcli/map-workspaces/node_modules/glob": { "version": "10.5.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.5.0.tgz", - "integrity": "sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==", - "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", "dev": true, "license": "ISC", "dependencies": { @@ -12172,8 +10202,6 @@ }, "node_modules/@npmcli/map-workspaces/node_modules/json-parse-even-better-errors": { "version": "3.0.2", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-3.0.2.tgz", - "integrity": "sha512-fi0NG4bPjCHunUJffmLd0gxssIgkNmArMvis4iNah6Owg1MCJjWhEcDLmsK6iGkJq3tHwbDkTlce70/tmXN4cQ==", "dev": true, "license": "MIT", "engines": { @@ -12182,15 +10210,11 @@ }, "node_modules/@npmcli/map-workspaces/node_modules/lru-cache": { "version": "10.4.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", - "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", "dev": true, "license": "ISC" }, "node_modules/@npmcli/map-workspaces/node_modules/minimatch": { "version": "9.0.9", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.9.tgz", - "integrity": "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==", "dev": true, "license": "ISC", "dependencies": { @@ -12205,8 +10229,6 @@ }, "node_modules/@npmcli/map-workspaces/node_modules/npm-normalize-package-bin": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-3.0.1.tgz", - "integrity": "sha512-dMxCf+zZ+3zeQZXKxmyuCKlIDPGuv8EF940xbkC4kQVDTtqoh6rJFO+JTKSA6/Rwi0getWmtuy4Itup0AMcaDQ==", "dev": true, "license": "ISC", "engines": { @@ -12215,8 +10237,6 @@ }, "node_modules/@npmcli/map-workspaces/node_modules/path-scurry": { "version": "1.11.1", - "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", - "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", "dev": true, "license": "BlueOak-1.0.0", "dependencies": { @@ -12232,8 +10252,6 @@ }, "node_modules/@npmcli/map-workspaces/node_modules/read-package-json-fast": { "version": "3.0.2", - "resolved": "https://registry.npmjs.org/read-package-json-fast/-/read-package-json-fast-3.0.2.tgz", - "integrity": "sha512-0J+Msgym3vrLOUB3hzQCuZHII0xkNGCtz/HJH9xZshwv9DbDwkw1KaE3gx/e2J5rpEY5rtOy6cyhKOPrkP7FZw==", "dev": true, "license": "ISC", "dependencies": { @@ -12246,8 +10264,6 @@ }, "node_modules/@npmcli/name-from-folder": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@npmcli/name-from-folder/-/name-from-folder-2.0.0.tgz", - "integrity": "sha512-pwK+BfEBZJbKdNYpHHRTNBwBoqrN/iIMO0AiGvYsp3Hoaq0WbgGSWQR6SCldZovoDpY3yje5lkFUe6gsDgJ2vg==", "dev": true, "license": "ISC", "engines": { @@ -12256,8 +10272,6 @@ }, "node_modules/@npmcli/node-gyp": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@npmcli/node-gyp/-/node-gyp-5.0.0.tgz", - "integrity": "sha512-uuG5HZFXLfyFKqg8QypsmgLQW7smiRjVc45bqD/ofZZcR/uxEjgQU8qDPv0s9TEeMUiAAU/GC5bR6++UdTirIQ==", "license": "ISC", "engines": { "node": "^20.17.0 || >=22.9.0" @@ -12265,8 +10279,6 @@ }, "node_modules/@npmcli/package-json": { "version": "7.0.5", - "resolved": "https://registry.npmjs.org/@npmcli/package-json/-/package-json-7.0.5.tgz", - "integrity": "sha512-iVuTlG3ORq2iaVa1IWUxAO/jIp77tUKBhoMjuzYW2kL4MLN1bi/ofqkZ7D7OOwh8coAx1/S2ge0rMdGv8sLSOQ==", "license": "ISC", "dependencies": { "@npmcli/git": "^7.0.0", @@ -12283,8 +10295,6 @@ }, "node_modules/@npmcli/promise-spawn": { "version": "9.0.1", - "resolved": "https://registry.npmjs.org/@npmcli/promise-spawn/-/promise-spawn-9.0.1.tgz", - "integrity": "sha512-OLUaoqBuyxeTqUvjA3FZFiXUfYC1alp3Sa99gW3EUDz3tZ3CbXDdcZ7qWKBzicrJleIgucoWamWH1saAmH/l2Q==", "license": "ISC", "dependencies": { "which": "^6.0.0" @@ -12295,8 +10305,6 @@ }, "node_modules/@npmcli/promise-spawn/node_modules/isexe": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-4.0.0.tgz", - "integrity": "sha512-FFUtZMpoZ8RqHS3XeXEmHWLA4thH+ZxCv2lOiPIn1Xc7CxrqhWzNSDzD+/chS/zbYezmiwWLdQC09JdQKmthOw==", "license": "BlueOak-1.0.0", "engines": { "node": ">=20" @@ -12304,8 +10312,6 @@ }, "node_modules/@npmcli/promise-spawn/node_modules/which": { "version": "6.0.1", - "resolved": "https://registry.npmjs.org/which/-/which-6.0.1.tgz", - "integrity": "sha512-oGLe46MIrCRqX7ytPUf66EAYvdeMIZYn3WaocqqKZAxrBpkqHfL/qvTyJ/bTk5+AqHCjXmrv3CEWgy368zhRUg==", "license": "ISC", "dependencies": { "isexe": "^4.0.0" @@ -12319,8 +10325,6 @@ }, "node_modules/@npmcli/redact": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@npmcli/redact/-/redact-4.0.0.tgz", - "integrity": "sha512-gOBg5YHMfZy+TfHArfVogwgfBeQnKbbGo3pSUyK/gSI0AVu+pEiDVcKlQb0D8Mg1LNRZILZ6XG8I5dJ4KuAd9Q==", "license": "ISC", "engines": { "node": "^20.17.0 || >=22.9.0" @@ -12328,8 +10332,6 @@ }, "node_modules/@npmcli/run-script": { "version": "10.0.4", - "resolved": "https://registry.npmjs.org/@npmcli/run-script/-/run-script-10.0.4.tgz", - "integrity": "sha512-mGUWr1uMnf0le2TwfOZY4SFxZGXGfm4Jtay/nwAa2FLNAKXUoUwaGwBMNH36UHPtinWfTSJ3nqFQr0091CxVGg==", "license": "ISC", "dependencies": { "@npmcli/node-gyp": "^5.0.0", @@ -12344,8 +10346,6 @@ }, "node_modules/@octokit/auth-token": { "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@octokit/auth-token/-/auth-token-2.5.0.tgz", - "integrity": "sha512-r5FVUJCOLl19AxiuZD2VRZ/ORjp/4IN98Of6YJoJOkY75CIBuYfmiNHGrDwXr+aLGG55igl9QrxX3hbiXlLb+g==", "dev": true, "license": "MIT", "dependencies": { @@ -12354,8 +10354,6 @@ }, "node_modules/@octokit/core": { "version": "3.6.0", - "resolved": "https://registry.npmjs.org/@octokit/core/-/core-3.6.0.tgz", - "integrity": "sha512-7RKRKuA4xTjMhY+eG3jthb3hlZCsOwg3rztWh75Xc+ShDWOfDDATWbeZpAHBNRpm4Tv9WgBMOy1zEJYXG6NJ7Q==", "dev": true, "license": "MIT", "dependencies": { @@ -12370,8 +10368,6 @@ }, "node_modules/@octokit/endpoint": { "version": "6.0.12", - "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-6.0.12.tgz", - "integrity": "sha512-lF3puPwkQWGfkMClXb4k/eUT/nZKQfxinRWJrdZaJO85Dqwo/G0yOC434Jr2ojwafWJMYqFGFa5ms4jJUgujdA==", "dev": true, "license": "MIT", "dependencies": { @@ -12382,8 +10378,6 @@ }, "node_modules/@octokit/graphql": { "version": "4.8.0", - "resolved": "https://registry.npmjs.org/@octokit/graphql/-/graphql-4.8.0.tgz", - "integrity": "sha512-0gv+qLSBLKF0z8TKaSKTsS39scVKF9dbMxJpj3U0vC7wjNWFuIpL/z76Qe2fiuCbDRcJSavkXsVtMS6/dtQQsg==", "dev": true, "license": "MIT", "dependencies": { @@ -12394,15 +10388,11 @@ }, "node_modules/@octokit/openapi-types": { "version": "12.11.0", - "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-12.11.0.tgz", - "integrity": "sha512-VsXyi8peyRq9PqIz/tpqiL2w3w80OgVMwBHltTml3LmVvXiphgeqmY9mvBw9Wu7e0QWk/fqD37ux8yP5uVekyQ==", "dev": true, "license": "MIT" }, "node_modules/@octokit/plugin-enterprise-compatibility": { "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@octokit/plugin-enterprise-compatibility/-/plugin-enterprise-compatibility-1.3.0.tgz", - "integrity": "sha512-h34sMGdEOER/OKrZJ55v26ntdHb9OPfR1fwOx6Q4qYyyhWA104o11h9tFxnS/l41gED6WEI41Vu2G2zHDVC5lQ==", "dev": true, "license": "MIT", "dependencies": { @@ -12412,8 +10402,6 @@ }, "node_modules/@octokit/plugin-paginate-rest": { "version": "2.21.3", - "resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-2.21.3.tgz", - "integrity": "sha512-aCZTEf0y2h3OLbrgKkrfFdjRL6eSOo8komneVQJnYecAxIej7Bafor2xhuDJOIFau4pk0i/P28/XgtbyPF0ZHw==", "dev": true, "license": "MIT", "dependencies": { @@ -12425,8 +10413,6 @@ }, "node_modules/@octokit/plugin-request-log": { "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@octokit/plugin-request-log/-/plugin-request-log-1.0.4.tgz", - "integrity": "sha512-mLUsMkgP7K/cnFEw07kWqXGF5LKrOkD+lhCrKvPHXWDywAwuDUeDwWBpc69XK3pNX0uKiVt8g5z96PJ6z9xCFA==", "dev": true, "license": "MIT", "peerDependencies": { @@ -12435,8 +10421,6 @@ }, "node_modules/@octokit/plugin-rest-endpoint-methods": { "version": "5.16.2", - "resolved": "https://registry.npmjs.org/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-5.16.2.tgz", - "integrity": "sha512-8QFz29Fg5jDuTPXVtey05BLm7OB+M8fnvE64RNegzX7U+5NUXcOcnpTIK0YfSHBg8gYd0oxIq3IZTe9SfPZiRw==", "dev": true, "license": "MIT", "dependencies": { @@ -12449,8 +10433,6 @@ }, "node_modules/@octokit/plugin-retry": { "version": "3.0.9", - "resolved": "https://registry.npmjs.org/@octokit/plugin-retry/-/plugin-retry-3.0.9.tgz", - "integrity": "sha512-r+fArdP5+TG6l1Rv/C9hVoty6tldw6cE2pRHNGmFPdyfrc696R6JjrQ3d7HdVqGwuzfyrcaLAKD7K8TX8aehUQ==", "dev": true, "license": "MIT", "dependencies": { @@ -12460,8 +10442,6 @@ }, "node_modules/@octokit/plugin-throttling": { "version": "3.7.0", - "resolved": "https://registry.npmjs.org/@octokit/plugin-throttling/-/plugin-throttling-3.7.0.tgz", - "integrity": "sha512-qrKT1Yl/KuwGSC6/oHpLBot3ooC9rq0/ryDYBCpkRtoj+R8T47xTMDT6Tk2CxWopFota/8Pi/2SqArqwC0JPow==", "dev": true, "license": "MIT", "dependencies": { @@ -12474,8 +10454,6 @@ }, "node_modules/@octokit/request": { "version": "5.6.3", - "resolved": "https://registry.npmjs.org/@octokit/request/-/request-5.6.3.tgz", - "integrity": "sha512-bFJl0I1KVc9jYTe9tdGGpAMPy32dLBXXo1dS/YwSCTL/2nd9XeHsY616RE3HPXDVk+a+dBuzyz5YdlXwcDTr2A==", "dev": true, "license": "MIT", "dependencies": { @@ -12489,8 +10467,6 @@ }, "node_modules/@octokit/request-error": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-2.1.0.tgz", - "integrity": "sha512-1VIvgXxs9WHSjicsRwq8PlR2LR2x6DwsJAaFgzdi0JfJoGSO8mYI/cHJQ+9FbN21aa+DrgNLnwObmyeSC8Rmpg==", "dev": true, "license": "MIT", "dependencies": { @@ -12501,8 +10477,6 @@ }, "node_modules/@octokit/rest": { "version": "18.12.0", - "resolved": "https://registry.npmjs.org/@octokit/rest/-/rest-18.12.0.tgz", - "integrity": "sha512-gDPiOHlyGavxr72y0guQEhLsemgVjwRePayJ+FcKc2SJqKUbxbkvf5kAZEWA/MKvsfYlQAMVzNJE3ezQcxMJ2Q==", "dev": true, "license": "MIT", "dependencies": { @@ -12514,8 +10488,6 @@ }, "node_modules/@octokit/types": { "version": "6.41.0", - "resolved": "https://registry.npmjs.org/@octokit/types/-/types-6.41.0.tgz", - "integrity": "sha512-eJ2jbzjdijiL3B4PrSQaSjuF2sPEQPVCPzBvTHJD9Nz+9dw2SGH4K4xeQJ77YfTq5bRQ+bD8wT11JbeDPmxmGg==", "dev": true, "license": "MIT", "dependencies": { @@ -12524,15 +10496,11 @@ }, "node_modules/@open-draft/deferred-promise": { "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@open-draft/deferred-promise/-/deferred-promise-2.2.0.tgz", - "integrity": "sha512-CecwLWx3rhxVQF6V4bAgPS5t+So2sTbPgAzafKkVizyi7tlwpcFpdFqq+wqF2OwNBmqFuu6tOyouTuxgpMfzmA==", "dev": true, "license": "MIT" }, "node_modules/@open-draft/logger": { "version": "0.3.0", - "resolved": "https://registry.npmjs.org/@open-draft/logger/-/logger-0.3.0.tgz", - "integrity": "sha512-X2g45fzhxH238HKO4xbSr7+wBS8Fvw6ixhTDuvLd5mqh6bJJCFAPwU9mPDxbcrRtfxv4u5IHCEH77BmxvXmmxQ==", "dev": true, "license": "MIT", "dependencies": { @@ -12542,15 +10510,11 @@ }, "node_modules/@open-draft/until": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@open-draft/until/-/until-2.1.0.tgz", - "integrity": "sha512-U69T3ItWHvLwGg5eJ0n3I62nWuE6ilHlmz7zM0npLBRvPRd7e6NYmg54vvRtP5mZG7kZqZCFVdsTWo7BPtBujg==", "dev": true, "license": "MIT" }, "node_modules/@opentelemetry/api": { "version": "1.9.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/api/-/api-1.9.1.tgz", - "integrity": "sha512-gLyJlPHPZYdAk1JENA9LeHejZe1Ti77/pTeFm/nMXmQH/HFZlcS/O2XJB+L8fkbrNSqhdtlvjBVjxwUYanNH5Q==", "license": "Apache-2.0", "engines": { "node": ">=8.0.0" @@ -12558,8 +10522,6 @@ }, "node_modules/@opentelemetry/api-logs": { "version": "0.208.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/api-logs/-/api-logs-0.208.0.tgz", - "integrity": "sha512-CjruKY9V6NMssL/T1kAFgzosF1v9o6oeN+aX5JB/C/xPNtmgIJqcXHG7fA82Ou1zCpWGl4lROQUKwUNE1pMCyg==", "license": "Apache-2.0", "dependencies": { "@opentelemetry/api": "^1.3.0" @@ -12570,8 +10532,6 @@ }, "node_modules/@opentelemetry/core": { "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.2.0.tgz", - "integrity": "sha512-FuabnnUm8LflnieVxs6eP7Z383hgQU4W1e3KJS6aOG3RxWxcHyBxH8fDMHNgu/gFx/M2jvTOW/4/PHhLz6bjWw==", "license": "Apache-2.0", "dependencies": { "@opentelemetry/semantic-conventions": "^1.29.0" @@ -12585,8 +10545,6 @@ }, "node_modules/@opentelemetry/exporter-logs-otlp-http": { "version": "0.208.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-logs-otlp-http/-/exporter-logs-otlp-http-0.208.0.tgz", - "integrity": "sha512-jOv40Bs9jy9bZVLo/i8FwUiuCvbjWDI+ZW13wimJm4LjnlwJxGgB+N/VWOZUTpM+ah/awXeQqKdNlpLf2EjvYg==", "license": "Apache-2.0", "dependencies": { "@opentelemetry/api-logs": "0.208.0", @@ -12604,8 +10562,6 @@ }, "node_modules/@opentelemetry/otlp-exporter-base": { "version": "0.208.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/otlp-exporter-base/-/otlp-exporter-base-0.208.0.tgz", - "integrity": "sha512-gMd39gIfVb2OgxldxUtOwGJYSH8P1kVFFlJLuut32L6KgUC4gl1dMhn+YC2mGn0bDOiQYSk/uHOdSjuKp58vvA==", "license": "Apache-2.0", "dependencies": { "@opentelemetry/core": "2.2.0", @@ -12620,8 +10576,6 @@ }, "node_modules/@opentelemetry/otlp-transformer": { "version": "0.208.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/otlp-transformer/-/otlp-transformer-0.208.0.tgz", - "integrity": "sha512-DCFPY8C6lAQHUNkzcNT9R+qYExvsk6C5Bto2pbNxgicpcSWbe2WHShLxkOxIdNcBiYPdVHv/e7vH7K6TI+C+fQ==", "license": "Apache-2.0", "dependencies": { "@opentelemetry/api-logs": "0.208.0", @@ -12641,8 +10595,6 @@ }, "node_modules/@opentelemetry/otlp-transformer/node_modules/@opentelemetry/resources": { "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-2.2.0.tgz", - "integrity": "sha512-1pNQf/JazQTMA0BiO5NINUzH0cbLbbl7mntLa4aJNmCCXSj0q03T5ZXXL0zw4G55TjdL9Tz32cznGClf+8zr5A==", "license": "Apache-2.0", "dependencies": { "@opentelemetry/core": "2.2.0", @@ -12657,8 +10609,6 @@ }, "node_modules/@opentelemetry/resources": { "version": "2.6.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-2.6.1.tgz", - "integrity": "sha512-lID/vxSuKWXM55XhAKNoYXu9Cutoq5hFdkbTdI/zDKQktXzcWBVhNsOkiZFTMU9UtEWuGRNe0HUgmsFldIdxVA==", "license": "Apache-2.0", "dependencies": { "@opentelemetry/core": "2.6.1", @@ -12673,8 +10623,6 @@ }, "node_modules/@opentelemetry/resources/node_modules/@opentelemetry/core": { "version": "2.6.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.6.1.tgz", - "integrity": "sha512-8xHSGWpJP9wBxgBpnqGL0R3PbdWQndL1Qp50qrg71+B28zK5OQmUgcDKLJgzyAAV38t4tOyLMGDD60LneR5W8g==", "license": "Apache-2.0", "dependencies": { "@opentelemetry/semantic-conventions": "^1.29.0" @@ -12688,8 +10636,6 @@ }, "node_modules/@opentelemetry/sdk-logs": { "version": "0.208.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-logs/-/sdk-logs-0.208.0.tgz", - "integrity": "sha512-QlAyL1jRpOeaqx7/leG1vJMp84g0xKP6gJmfELBpnI4O/9xPX+Hu5m1POk9Kl+veNkyth5t19hRlN6tNY1sjbA==", "license": "Apache-2.0", "dependencies": { "@opentelemetry/api-logs": "0.208.0", @@ -12705,8 +10651,6 @@ }, "node_modules/@opentelemetry/sdk-logs/node_modules/@opentelemetry/resources": { "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-2.2.0.tgz", - "integrity": "sha512-1pNQf/JazQTMA0BiO5NINUzH0cbLbbl7mntLa4aJNmCCXSj0q03T5ZXXL0zw4G55TjdL9Tz32cznGClf+8zr5A==", "license": "Apache-2.0", "dependencies": { "@opentelemetry/core": "2.2.0", @@ -12721,8 +10665,6 @@ }, "node_modules/@opentelemetry/sdk-metrics": { "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-metrics/-/sdk-metrics-2.2.0.tgz", - "integrity": "sha512-G5KYP6+VJMZzpGipQw7Giif48h6SGQ2PFKEYCybeXJsOCB4fp8azqMAAzE5lnnHK3ZVwYQrgmFbsUJO/zOnwGw==", "license": "Apache-2.0", "dependencies": { "@opentelemetry/core": "2.2.0", @@ -12737,8 +10679,6 @@ }, "node_modules/@opentelemetry/sdk-metrics/node_modules/@opentelemetry/resources": { "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-2.2.0.tgz", - "integrity": "sha512-1pNQf/JazQTMA0BiO5NINUzH0cbLbbl7mntLa4aJNmCCXSj0q03T5ZXXL0zw4G55TjdL9Tz32cznGClf+8zr5A==", "license": "Apache-2.0", "dependencies": { "@opentelemetry/core": "2.2.0", @@ -12753,8 +10693,6 @@ }, "node_modules/@opentelemetry/sdk-trace-base": { "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-base/-/sdk-trace-base-2.2.0.tgz", - "integrity": "sha512-xWQgL0Bmctsalg6PaXExmzdedSp3gyKV8mQBwK/j9VGdCDu2fmXIb2gAehBKbkXCpJ4HPkgv3QfoJWRT4dHWbw==", "license": "Apache-2.0", "dependencies": { "@opentelemetry/core": "2.2.0", @@ -12770,8 +10708,6 @@ }, "node_modules/@opentelemetry/sdk-trace-base/node_modules/@opentelemetry/resources": { "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-2.2.0.tgz", - "integrity": "sha512-1pNQf/JazQTMA0BiO5NINUzH0cbLbbl7mntLa4aJNmCCXSj0q03T5ZXXL0zw4G55TjdL9Tz32cznGClf+8zr5A==", "license": "Apache-2.0", "dependencies": { "@opentelemetry/core": "2.2.0", @@ -12786,8 +10722,6 @@ }, "node_modules/@opentelemetry/semantic-conventions": { "version": "1.40.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.40.0.tgz", - "integrity": "sha512-cifvXDhcqMwwTlTK04GBNeIe7yyo28Mfby85QXFe1Yk8nmi36Ab/5UQwptOx84SsoGNRg+EVSjwzfSZMy6pmlw==", "license": "Apache-2.0", "engines": { "node": ">=14" @@ -12795,8 +10729,6 @@ }, "node_modules/@optimizely/optimizely-sdk": { "version": "6.3.1", - "resolved": "https://registry.npmjs.org/@optimizely/optimizely-sdk/-/optimizely-sdk-6.3.1.tgz", - "integrity": "sha512-K2yhFeNJmIonnmWAV6JjlKl9pTvL8JskQZ8l0tUUq8LPeGCIm7p3YZxot3Rf2PYw+J1JaSveGJNSGo1+Enpn7w==", "license": "Apache-2.0", "dependencies": { "decompress-response": "^7.0.0", @@ -12834,8 +10766,6 @@ }, "node_modules/@optimizely/optimizely-sdk/node_modules/decompress-response": { "version": "7.0.0", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-7.0.0.tgz", - "integrity": "sha512-6IvPrADQyyPGLpMnUh6kfKiqy7SrbXbjoUuZ90WMBJKErzv2pCiwlGEXjRX9/54OnTq+XFVnkOnOMzclLI5aEA==", "license": "MIT", "dependencies": { "mimic-response": "^3.1.0" @@ -12849,8 +10779,6 @@ }, "node_modules/@optimizely/optimizely-sdk/node_modules/mimic-response": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", - "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", "license": "MIT", "engines": { "node": ">=10" @@ -12861,8 +10789,6 @@ }, "node_modules/@parcel/watcher": { "version": "2.5.6", - "resolved": "https://registry.npmjs.org/@parcel/watcher/-/watcher-2.5.6.tgz", - "integrity": "sha512-tmmZ3lQxAe/k/+rNnXQRawJ4NjxO2hqiOLTHvWchtGZULp4RyFeh6aU4XdOYBFe2KE1oShQTv4AblOs2iOrNnQ==", "hasInstallScript": true, "license": "MIT", "optional": true, @@ -12975,26 +10901,6 @@ "url": "https://opencollective.com/parcel" } }, - "node_modules/@parcel/watcher-linux-arm-glibc": { - "version": "2.5.6", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-glibc/-/watcher-linux-arm-glibc-2.5.6.tgz", - "integrity": "sha512-9JiYfB6h6BgV50CCfasfLf/uvOcJskMSwcdH1PHH9rvS1IrNy8zad6IUVPVUfmXr+u+Km9IxcfMLzgdOudz9EQ==", - "cpu": [ - "arm" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, "node_modules/@parcel/watcher-linux-arm-musl": { "version": "2.5.6", "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-musl/-/watcher-linux-arm-musl-2.5.6.tgz", @@ -13017,8 +10923,6 @@ }, "node_modules/@parcel/watcher-linux-arm64-glibc": { "version": "2.5.6", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-glibc/-/watcher-linux-arm64-glibc-2.5.6.tgz", - "integrity": "sha512-f2g/DT3NhGPdBmMWYoxixqYr3v/UXcmLOYy16Bx0TM20Tchduwr4EaCbmxh1321TABqPGDpS8D/ggOTaljijOA==", "cpu": [ "arm64" ], @@ -13037,8 +10941,6 @@ }, "node_modules/@parcel/watcher-linux-arm64-musl": { "version": "2.5.6", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-musl/-/watcher-linux-arm64-musl-2.5.6.tgz", - "integrity": "sha512-qb6naMDGlbCwdhLj6hgoVKJl2odL34z2sqkC7Z6kzir8b5W65WYDpLB6R06KabvZdgoHI/zxke4b3zR0wAbDTA==", "cpu": [ "arm64" ], @@ -13055,26 +10957,6 @@ "url": "https://opencollective.com/parcel" } }, - "node_modules/@parcel/watcher-linux-x64-glibc": { - "version": "2.5.6", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-glibc/-/watcher-linux-x64-glibc-2.5.6.tgz", - "integrity": "sha512-kbT5wvNQlx7NaGjzPFu8nVIW1rWqV780O7ZtkjuWaPUgpv2NMFpjYERVi0UYj1msZNyCzGlaCWEtzc+exjMGbQ==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, "node_modules/@parcel/watcher-linux-x64-musl": { "version": "2.5.6", "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-musl/-/watcher-linux-x64-musl-2.5.6.tgz", @@ -13157,8 +11039,6 @@ }, "node_modules/@parcel/watcher/node_modules/picomatch": { "version": "4.0.3", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", - "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", "license": "MIT", "optional": true, "engines": { @@ -13170,8 +11050,6 @@ }, "node_modules/@peculiar/asn1-cms": { "version": "2.6.1", - "resolved": "https://registry.npmjs.org/@peculiar/asn1-cms/-/asn1-cms-2.6.1.tgz", - "integrity": "sha512-vdG4fBF6Lkirkcl53q6eOdn3XYKt+kJTG59edgRZORlg/3atWWEReRCx5rYE1ZzTTX6vLK5zDMjHh7vbrcXGtw==", "license": "MIT", "dependencies": { "@peculiar/asn1-schema": "^2.6.0", @@ -13183,8 +11061,6 @@ }, "node_modules/@peculiar/asn1-csr": { "version": "2.6.1", - "resolved": "https://registry.npmjs.org/@peculiar/asn1-csr/-/asn1-csr-2.6.1.tgz", - "integrity": "sha512-WRWnKfIocHyzFYQTka8O/tXCiBquAPSrRjXbOkHbO4qdmS6loffCEGs+rby6WxxGdJCuunnhS2duHURhjyio6w==", "license": "MIT", "dependencies": { "@peculiar/asn1-schema": "^2.6.0", @@ -13195,8 +11071,6 @@ }, "node_modules/@peculiar/asn1-ecc": { "version": "2.6.1", - "resolved": "https://registry.npmjs.org/@peculiar/asn1-ecc/-/asn1-ecc-2.6.1.tgz", - "integrity": "sha512-+Vqw8WFxrtDIN5ehUdvlN2m73exS2JVG0UAyfVB31gIfor3zWEAQPD+K9ydCxaj3MLen9k0JhKpu9LqviuCE1g==", "license": "MIT", "dependencies": { "@peculiar/asn1-schema": "^2.6.0", @@ -13207,8 +11081,6 @@ }, "node_modules/@peculiar/asn1-pfx": { "version": "2.6.1", - "resolved": "https://registry.npmjs.org/@peculiar/asn1-pfx/-/asn1-pfx-2.6.1.tgz", - "integrity": "sha512-nB5jVQy3MAAWvq0KY0R2JUZG8bO/bTLpnwyOzXyEh/e54ynGTatAR+csOnXkkVD9AFZ2uL8Z7EV918+qB1qDvw==", "license": "MIT", "dependencies": { "@peculiar/asn1-cms": "^2.6.1", @@ -13221,8 +11093,6 @@ }, "node_modules/@peculiar/asn1-pkcs8": { "version": "2.6.1", - "resolved": "https://registry.npmjs.org/@peculiar/asn1-pkcs8/-/asn1-pkcs8-2.6.1.tgz", - "integrity": "sha512-JB5iQ9Izn5yGMw3ZG4Nw3Xn/hb/G38GYF3lf7WmJb8JZUydhVGEjK/ZlFSWhnlB7K/4oqEs8HnfFIKklhR58Tw==", "license": "MIT", "dependencies": { "@peculiar/asn1-schema": "^2.6.0", @@ -13233,8 +11103,6 @@ }, "node_modules/@peculiar/asn1-pkcs9": { "version": "2.6.1", - "resolved": "https://registry.npmjs.org/@peculiar/asn1-pkcs9/-/asn1-pkcs9-2.6.1.tgz", - "integrity": "sha512-5EV8nZoMSxeWmcxWmmcolg22ojZRgJg+Y9MX2fnE2bGRo5KQLqV5IL9kdSQDZxlHz95tHvIq9F//bvL1OeNILw==", "license": "MIT", "dependencies": { "@peculiar/asn1-cms": "^2.6.1", @@ -13249,8 +11117,6 @@ }, "node_modules/@peculiar/asn1-rsa": { "version": "2.6.1", - "resolved": "https://registry.npmjs.org/@peculiar/asn1-rsa/-/asn1-rsa-2.6.1.tgz", - "integrity": "sha512-1nVMEh46SElUt5CB3RUTV4EG/z7iYc7EoaDY5ECwganibQPkZ/Y2eMsTKB/LeyrUJ+W/tKoD9WUqIy8vB+CEdA==", "license": "MIT", "dependencies": { "@peculiar/asn1-schema": "^2.6.0", @@ -13261,8 +11127,6 @@ }, "node_modules/@peculiar/asn1-schema": { "version": "2.6.0", - "resolved": "https://registry.npmjs.org/@peculiar/asn1-schema/-/asn1-schema-2.6.0.tgz", - "integrity": "sha512-xNLYLBFTBKkCzEZIw842BxytQQATQv+lDTCEMZ8C196iJcJJMBUZxrhSTxLaohMyKK8QlzRNTRkUmanucnDSqg==", "license": "MIT", "dependencies": { "asn1js": "^3.0.6", @@ -13272,8 +11136,6 @@ }, "node_modules/@peculiar/asn1-x509": { "version": "2.6.1", - "resolved": "https://registry.npmjs.org/@peculiar/asn1-x509/-/asn1-x509-2.6.1.tgz", - "integrity": "sha512-O9jT5F1A2+t3r7C4VT7LYGXqkGLK7Kj1xFpz7U0isPrubwU5PbDoyYtx6MiGst29yq7pXN5vZbQFKRCP+lLZlA==", "license": "MIT", "dependencies": { "@peculiar/asn1-schema": "^2.6.0", @@ -13284,8 +11146,6 @@ }, "node_modules/@peculiar/asn1-x509-attr": { "version": "2.6.1", - "resolved": "https://registry.npmjs.org/@peculiar/asn1-x509-attr/-/asn1-x509-attr-2.6.1.tgz", - "integrity": "sha512-tlW6cxoHwgcQghnJwv3YS+9OO1737zgPogZ+CgWRUK4roEwIPzRH4JEiG770xe5HX2ATfCpmX60gurfWIF9dcQ==", "license": "MIT", "dependencies": { "@peculiar/asn1-schema": "^2.6.0", @@ -13296,8 +11156,6 @@ }, "node_modules/@peculiar/x509": { "version": "1.14.3", - "resolved": "https://registry.npmjs.org/@peculiar/x509/-/x509-1.14.3.tgz", - "integrity": "sha512-C2Xj8FZ0uHWeCXXqX5B4/gVFQmtSkiuOolzAgutjTfseNOHT3pUjljDZsTSxXFGgio54bCzVFqmEOUrIVk8RDA==", "license": "MIT", "dependencies": { "@peculiar/asn1-cms": "^2.6.0", @@ -13318,8 +11176,6 @@ }, "node_modules/@philpl/buble": { "version": "0.19.7", - "resolved": "https://registry.npmjs.org/@philpl/buble/-/buble-0.19.7.tgz", - "integrity": "sha512-wKTA2DxAGEW+QffRQvOhRQ0VBiYU2h2p8Yc1oBNlqSKws48/8faxqKNIuub0q4iuyTuLwtB8EkwiKwhlfV1PBA==", "license": "MIT", "dependencies": { "acorn": "^6.1.1", @@ -13338,8 +11194,6 @@ }, "node_modules/@philpl/buble/node_modules/acorn": { "version": "6.4.2", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.2.tgz", - "integrity": "sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ==", "license": "MIT", "bin": { "acorn": "bin/acorn" @@ -13350,8 +11204,6 @@ }, "node_modules/@philpl/buble/node_modules/acorn-class-fields": { "version": "0.2.1", - "resolved": "https://registry.npmjs.org/acorn-class-fields/-/acorn-class-fields-0.2.1.tgz", - "integrity": "sha512-US/kqTe0H8M4LN9izoL+eykVAitE68YMuYZ3sHn3i1fjniqR7oQ3SPvuMK/VT1kjOQHrx5Q88b90TtOKgAv2hQ==", "license": "MIT", "engines": { "node": ">=4.8.2" @@ -13362,9 +11214,6 @@ }, "node_modules/@philpl/buble/node_modules/acorn-dynamic-import": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/acorn-dynamic-import/-/acorn-dynamic-import-4.0.0.tgz", - "integrity": "sha512-d3OEjQV4ROpoflsnUA8HozoIR504TFxNivYEUi6uwz0IYhBkTDXGuWlNdMtybRt3nqVx/L6XqMt0FxkXuWKZhw==", - "deprecated": "This is probably built in to whatever tool you're using. If you still need it... idk", "license": "MIT", "peerDependencies": { "acorn": "^6.0.0" @@ -13372,8 +11221,6 @@ }, "node_modules/@philpl/buble/node_modules/ansi-styles": { "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "license": "MIT", "dependencies": { "color-convert": "^1.9.0" @@ -13384,8 +11231,6 @@ }, "node_modules/@philpl/buble/node_modules/chalk": { "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "license": "MIT", "dependencies": { "ansi-styles": "^3.2.1", @@ -13398,8 +11243,6 @@ }, "node_modules/@philpl/buble/node_modules/color-convert": { "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", "license": "MIT", "dependencies": { "color-name": "1.1.3" @@ -13407,14 +11250,10 @@ }, "node_modules/@philpl/buble/node_modules/color-name": { "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", "license": "MIT" }, "node_modules/@philpl/buble/node_modules/escape-string-regexp": { "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", "license": "MIT", "engines": { "node": ">=0.8.0" @@ -13422,8 +11261,6 @@ }, "node_modules/@philpl/buble/node_modules/has-flag": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", "license": "MIT", "engines": { "node": ">=4" @@ -13431,16 +11268,12 @@ }, "node_modules/@philpl/buble/node_modules/jsesc": { "version": "0.5.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", - "integrity": "sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==", "bin": { "jsesc": "bin/jsesc" } }, "node_modules/@philpl/buble/node_modules/regenerate-unicode-properties": { "version": "9.0.0", - "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-9.0.0.tgz", - "integrity": "sha512-3E12UeNSPfjrgwjkR81m5J7Aw/T55Tu7nUyZVQYCKEOs+2dkxEY+DpPtZzO4YruuiPb7NkYLVcyJC4+zCbk5pA==", "license": "MIT", "dependencies": { "regenerate": "^1.4.2" @@ -13451,8 +11284,6 @@ }, "node_modules/@philpl/buble/node_modules/regexpu-core": { "version": "4.8.0", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.8.0.tgz", - "integrity": "sha512-1F6bYsoYiz6is+oz70NWur2Vlh9KWtswuRuzJOfeYUrfPX2o8n74AnUVaOGDbUqVGO9fNHu48/pjJO4sNVwsOg==", "license": "MIT", "dependencies": { "regenerate": "^1.4.2", @@ -13468,14 +11299,10 @@ }, "node_modules/@philpl/buble/node_modules/regjsgen": { "version": "0.5.2", - "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.5.2.tgz", - "integrity": "sha512-OFFT3MfrH90xIW8OOSyUrk6QHD5E9JOTeGodiJeBS3J6IwlgzJMNE/1bZklWz5oTg+9dCMyEetclvCVXOPoN3A==", "license": "MIT" }, "node_modules/@philpl/buble/node_modules/regjsparser": { "version": "0.7.0", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.7.0.tgz", - "integrity": "sha512-A4pcaORqmNMDVwUjWoTzuhwMGpP+NykpfqAsEgI1FSH/EzC7lrN5TMd+kN8YCovX+jMpu8eaqXgXPCa0g8FQNQ==", "license": "BSD-2-Clause", "dependencies": { "jsesc": "~0.5.0" @@ -13486,8 +11313,6 @@ }, "node_modules/@philpl/buble/node_modules/supports-color": { "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "license": "MIT", "dependencies": { "has-flag": "^3.0.0" @@ -13498,8 +11323,6 @@ }, "node_modules/@pkgjs/parseargs": { "version": "0.11.0", - "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", - "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", "license": "MIT", "optional": true, "engines": { @@ -13508,8 +11331,6 @@ }, "node_modules/@pkgr/core": { "version": "0.2.9", - "resolved": "https://registry.npmjs.org/@pkgr/core/-/core-0.2.9.tgz", - "integrity": "sha512-QNqXyfVS2wm9hweSYD2O7F0G06uurj9kZ96TRQE5Y9hU7+tgdZwIkbAKc5Ocy1HxEY2kuDQa6cQ1WRs/O5LFKA==", "license": "MIT", "engines": { "node": "^12.20.0 || ^14.18.0 || >=16.0.0" @@ -13520,8 +11341,6 @@ }, "node_modules/@pnpm/config.env-replace": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@pnpm/config.env-replace/-/config.env-replace-1.1.0.tgz", - "integrity": "sha512-htyl8TWnKL7K/ESFa1oW2UB5lVDxuF5DpM7tBi6Hu2LNL3mWkIzNLG6N4zoCUP1lCKNxWy/3iu8mS8MvToGd6w==", "license": "MIT", "engines": { "node": ">=12.22.0" @@ -13529,8 +11348,6 @@ }, "node_modules/@pnpm/network.ca-file": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@pnpm/network.ca-file/-/network.ca-file-1.0.2.tgz", - "integrity": "sha512-YcPQ8a0jwYU9bTdJDpXjMi7Brhkr1mXsXrUJvjqM2mQDgkRiz8jFaQGOdaLxgjtUfQgZhKy/O3cG/YwmgKaxLA==", "license": "MIT", "dependencies": { "graceful-fs": "4.2.10" @@ -13541,14 +11358,10 @@ }, "node_modules/@pnpm/network.ca-file/node_modules/graceful-fs": { "version": "4.2.10", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", - "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", "license": "ISC" }, "node_modules/@pnpm/npm-conf": { "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@pnpm/npm-conf/-/npm-conf-3.0.2.tgz", - "integrity": "sha512-h104Kh26rR8tm+a3Qkc5S4VLYint3FE48as7+/5oCEcKR2idC/pF1G6AhIXKI+eHPJa/3J9i5z0Al47IeGHPkA==", "license": "MIT", "dependencies": { "@pnpm/config.env-replace": "^1.1.0", @@ -13561,50 +11374,34 @@ }, "node_modules/@polka/url": { "version": "1.0.0-next.29", - "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.29.tgz", - "integrity": "sha512-wwQAWhWSuHaag8c4q/KN/vCoeOJYshAIvMQwD4GpSb3OiZklFfvAgmj0VCBBImRpuF/aFgIRzllXlVX93Jevww==", "license": "MIT" }, "node_modules/@posthog/core": { "version": "1.25.2", - "resolved": "https://registry.npmjs.org/@posthog/core/-/core-1.25.2.tgz", - "integrity": "sha512-h2FO7ut/BbfwpAXWpwdDHTzQgUo9ibDFEs6ZO+3cI3KPWQt5XwczK1OLAuPprcjm8T/jl0SH8jSFo5XdU4RbTg==", "license": "MIT" }, "node_modules/@posthog/types": { "version": "1.367.0", - "resolved": "https://registry.npmjs.org/@posthog/types/-/types-1.367.0.tgz", - "integrity": "sha512-FUcTEAeKhuHKyCcTQPx/sTN3s8S+PusPsiP8T/LrG/T7pDkwMfNZG0/P630JX6fT6qiW0moVvVSsaXgZDJF7wg==", "license": "MIT" }, "node_modules/@protobufjs/aspromise": { "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", - "integrity": "sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==", "license": "BSD-3-Clause" }, "node_modules/@protobufjs/base64": { "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz", - "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==", "license": "BSD-3-Clause" }, "node_modules/@protobufjs/codegen": { "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz", - "integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==", "license": "BSD-3-Clause" }, "node_modules/@protobufjs/eventemitter": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz", - "integrity": "sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==", "license": "BSD-3-Clause" }, "node_modules/@protobufjs/fetch": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz", - "integrity": "sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==", "license": "BSD-3-Clause", "dependencies": { "@protobufjs/aspromise": "^1.1.1", @@ -13613,38 +11410,26 @@ }, "node_modules/@protobufjs/float": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz", - "integrity": "sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==", "license": "BSD-3-Clause" }, "node_modules/@protobufjs/inquire": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz", - "integrity": "sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==", "license": "BSD-3-Clause" }, "node_modules/@protobufjs/path": { "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz", - "integrity": "sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==", "license": "BSD-3-Clause" }, "node_modules/@protobufjs/pool": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz", - "integrity": "sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==", "license": "BSD-3-Clause" }, "node_modules/@protobufjs/utf8": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz", - "integrity": "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==", "license": "BSD-3-Clause" }, "node_modules/@redocly/ajv": { "version": "8.11.2", - "resolved": "https://registry.npmjs.org/@redocly/ajv/-/ajv-8.11.2.tgz", - "integrity": "sha512-io1JpnwtIcvojV7QKDUSIuMN/ikdOUd1ReEnUnMKGfDVridQZ31J0MmIuqwuRjWDZfmvr+Q0MqCcfHM2gTivOg==", "dev": true, "license": "MIT", "dependencies": { @@ -13660,15 +11445,11 @@ }, "node_modules/@redocly/config": { "version": "0.22.0", - "resolved": "https://registry.npmjs.org/@redocly/config/-/config-0.22.0.tgz", - "integrity": "sha512-gAy93Ddo01Z3bHuVdPWfCwzgfaYgMdaZPcfL7JZ7hWJoK9V0lXDbigTWkhiPFAaLWzbOJ+kbUQG1+XwIm0KRGQ==", "dev": true, "license": "MIT" }, "node_modules/@redocly/openapi-core": { "version": "1.34.10", - "resolved": "https://registry.npmjs.org/@redocly/openapi-core/-/openapi-core-1.34.10.tgz", - "integrity": "sha512-XCBR/9WHJ0cpezuunHMZjuFMl4KqUo7eiFwzrQrvm7lTXt0EBd3No8UY+9OyzXpDfreGEMMtxmaLZ+ksVw378g==", "dev": true, "license": "MIT", "dependencies": { @@ -13689,8 +11470,6 @@ }, "node_modules/@redocly/openapi-core/node_modules/agent-base": { "version": "7.1.4", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.4.tgz", - "integrity": "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==", "dev": true, "license": "MIT", "engines": { @@ -13699,15 +11478,11 @@ }, "node_modules/@redocly/openapi-core/node_modules/balanced-match": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", "dev": true, "license": "MIT" }, "node_modules/@redocly/openapi-core/node_modules/brace-expansion": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", - "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", "dev": true, "license": "MIT", "dependencies": { @@ -13716,15 +11491,11 @@ }, "node_modules/@redocly/openapi-core/node_modules/colorette": { "version": "1.4.0", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.4.0.tgz", - "integrity": "sha512-Y2oEozpomLn7Q3HFP7dpww7AtMJplbM9lGZP6RDfHqmbeRjiwRg4n6VM6j4KLmRke85uWEI7JqF17f3pqdRA0g==", "dev": true, "license": "MIT" }, "node_modules/@redocly/openapi-core/node_modules/https-proxy-agent": { "version": "7.0.6", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", - "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", "dev": true, "license": "MIT", "dependencies": { @@ -13737,8 +11508,6 @@ }, "node_modules/@redocly/openapi-core/node_modules/minimatch": { "version": "5.1.9", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.9.tgz", - "integrity": "sha512-7o1wEA2RyMP7Iu7GNba9vc0RWWGACJOCZBJX2GJWip0ikV+wcOsgVuY9uE8CPiyQhkGFSlhuSkZPavN7u1c2Fw==", "dev": true, "license": "ISC", "dependencies": { @@ -13750,8 +11519,6 @@ }, "node_modules/@remix-run/router": { "version": "1.23.2", - "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.23.2.tgz", - "integrity": "sha512-Ic6m2U/rMjTkhERIa/0ZtXJP17QUi2CbWE7cqx4J58M8aA3QTfW+2UlQ4psvTX9IO1RfNVhK3pcpdjej7L+t2w==", "license": "MIT", "engines": { "node": ">=14.0.0" @@ -13759,8 +11526,6 @@ }, "node_modules/@rjsf/core": { "version": "6.3.1", - "resolved": "https://registry.npmjs.org/@rjsf/core/-/core-6.3.1.tgz", - "integrity": "sha512-LTjFz5Fk3FlbgFPJ+OJi1JdWJyiap9dSpx8W6u7JHNB7K5VbwzJe8gIU45XWLHzWFGDHKPm89VrUzjOs07TPtg==", "license": "Apache-2.0", "dependencies": { "lodash": "^4.17.23", @@ -13778,8 +11543,6 @@ }, "node_modules/@rjsf/utils": { "version": "6.3.1", - "resolved": "https://registry.npmjs.org/@rjsf/utils/-/utils-6.3.1.tgz", - "integrity": "sha512-ve2KHl1ITYG8QIonnuK83/T1k/5NuxP4D1egVqP9Hz2ub28kgl0rNMwmRSxXs3WIbCcMW9g3ox+daVrbSNc4Mw==", "license": "Apache-2.0", "dependencies": { "@x0k/json-schema-merge": "^1.0.2", @@ -13798,8 +11561,6 @@ }, "node_modules/@rjsf/validator-ajv8": { "version": "6.3.1", - "resolved": "https://registry.npmjs.org/@rjsf/validator-ajv8/-/validator-ajv8-6.3.1.tgz", - "integrity": "sha512-2RHDxBc0gBplPniau5UZj7aznpTelSBm1b3DNybok8L0NuIfmndbp9kNXgFuRvlyfsQSyYmZSBjbzeYqr0Hpcw==", "license": "Apache-2.0", "dependencies": { "ajv": "^8.17.1", @@ -13816,8 +11577,6 @@ }, "node_modules/@rjsf/validator-ajv8/node_modules/ajv-formats": { "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", - "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", "license": "MIT", "dependencies": { "ajv": "^8.0.0" @@ -13833,15 +11592,11 @@ }, "node_modules/@rolldown/pluginutils": { "version": "1.0.0-rc.3", - "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-rc.3.tgz", - "integrity": "sha512-eybk3TjzzzV97Dlj5c+XrBFW57eTNhzod66y9HrBlzJ6NsCrWCp/2kaPS3K9wJmurBC0Tdw4yPjXKZqlznim3Q==", "dev": true, "license": "MIT" }, "node_modules/@rollup/plugin-replace": { "version": "6.0.3", - "resolved": "https://registry.npmjs.org/@rollup/plugin-replace/-/plugin-replace-6.0.3.tgz", - "integrity": "sha512-J4RZarRvQAm5IF0/LwUUg+obsm+xZhYnbMXmXROyoSE1ATJe3oXSb9L5MMppdxP2ylNSjv6zFBwKYjcKMucVfA==", "license": "MIT", "dependencies": { "@rollup/pluginutils": "^5.0.1", @@ -13861,8 +11616,6 @@ }, "node_modules/@rollup/plugin-replace/node_modules/magic-string": { "version": "0.30.21", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", - "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", "license": "MIT", "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.5" @@ -13870,8 +11623,6 @@ }, "node_modules/@rollup/pluginutils": { "version": "5.3.0", - "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.3.0.tgz", - "integrity": "sha512-5EdhGZtnu3V88ces7s53hhfK5KSASnJZv8Lulpc04cWO3REESroJXg73DFsOmgbU2BhwV0E20bu2IDZb3VKW4Q==", "license": "MIT", "dependencies": { "@types/estree": "^1.0.0", @@ -13892,14 +11643,10 @@ }, "node_modules/@rollup/pluginutils/node_modules/estree-walker": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", - "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", "license": "MIT" }, "node_modules/@rollup/pluginutils/node_modules/picomatch": { "version": "4.0.3", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", - "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", "license": "MIT", "engines": { "node": ">=12" @@ -13999,23 +11746,8 @@ "linux" ] }, - "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.59.0.tgz", - "integrity": "sha512-CikFT7aYPA2ufMD086cVORBYGHffBo4K8MQ4uPS/ZnY54GKj36i196u8U+aDVT2LX4eSMbyHtyOh7D7Zvk2VvA==", - "cpu": [ - "arm" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, "node_modules/@rollup/rollup-linux-arm64-gnu": { "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.59.0.tgz", - "integrity": "sha512-jYgUGk5aLd1nUb1CtQ8E+t5JhLc9x5WdBKew9ZgAXg7DBk0ZHErLHdXM24rfX+bKrFe+Xp5YuJo54I5HFjGDAA==", "cpu": [ "arm64" ], @@ -14027,8 +11759,6 @@ }, "node_modules/@rollup/rollup-linux-arm64-musl": { "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.59.0.tgz", - "integrity": "sha512-peZRVEdnFWZ5Bh2KeumKG9ty7aCXzzEsHShOZEFiCQlDEepP1dpUl/SrUNXNg13UmZl+gzVDPsiCwnV1uI0RUA==", "cpu": [ "arm64" ], @@ -14155,32 +11885,6 @@ "linux" ] }, - "node_modules/@rollup/rollup-openbsd-x64": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.59.0.tgz", - "integrity": "sha512-M3bLRAVk6GOwFlPTIxVBSYKUaqfLrn8l0psKinkCFxl4lQvOSz8ZrKDz2gxcBwHFpci0B6rttydI4IpS4IS/jQ==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ] - }, - "node_modules/@rollup/rollup-openharmony-arm64": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.59.0.tgz", - "integrity": "sha512-tt9KBJqaqp5i5HUZzoafHZX8b5Q2Fe7UjYERADll83O4fGqJ49O1FsL6LpdzVFQcpwvnyd0i+K/VSwu/o/nWlA==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "openharmony" - ] - }, "node_modules/@rollup/rollup-win32-arm64-msvc": { "version": "4.59.0", "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.59.0.tgz", @@ -14235,8 +11939,6 @@ }, "node_modules/@rspack/binding": { "version": "1.7.6", - "resolved": "https://registry.npmjs.org/@rspack/binding/-/binding-1.7.6.tgz", - "integrity": "sha512-/NrEcfo8Gx22hLGysanrV6gHMuqZSxToSci/3M4kzEQtF5cPjfOv5pqeLK/+B6cr56ul/OmE96cCdWcXeVnFjQ==", "devOptional": true, "license": "MIT", "optionalDependencies": { @@ -14280,8 +11982,6 @@ }, "node_modules/@rspack/binding-linux-arm64-gnu": { "version": "1.7.6", - "resolved": "https://registry.npmjs.org/@rspack/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.7.6.tgz", - "integrity": "sha512-eQfcsaxhFrv5FmtaA7+O1F9/2yFDNIoPZzV/ZvqvFz5bBXVc4FAm/1fVpBg8Po/kX1h0chBc7Xkpry3cabFW8w==", "cpu": [ "arm64" ], @@ -14293,8 +11993,6 @@ }, "node_modules/@rspack/binding-linux-arm64-musl": { "version": "1.7.6", - "resolved": "https://registry.npmjs.org/@rspack/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.7.6.tgz", - "integrity": "sha512-DfQXKiyPIl7i1yECHy4eAkSmlUzzsSAbOjgMuKn7pudsWf483jg0UUYutNgXSlBjc/QSUp7906Cg8oty9OfwPA==", "cpu": [ "arm64" ], @@ -14330,19 +12028,6 @@ "linux" ] }, - "node_modules/@rspack/binding-wasm32-wasi": { - "version": "1.7.6", - "resolved": "https://registry.npmjs.org/@rspack/binding-wasm32-wasi/-/binding-wasm32-wasi-1.7.6.tgz", - "integrity": "sha512-YupOrz0daSG+YBbCIgpDgzfMM38YpChv+afZpaxx5Ml7xPeAZIIdgWmLHnQ2rts73N2M1NspAiBwV00Xx0N4Vg==", - "cpu": [ - "wasm32" - ], - "license": "MIT", - "optional": true, - "dependencies": { - "@napi-rs/wasm-runtime": "1.0.7" - } - }, "node_modules/@rspack/binding-win32-arm64-msvc": { "version": "1.7.6", "resolved": "https://registry.npmjs.org/@rspack/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.7.6.tgz", @@ -14384,8 +12069,6 @@ }, "node_modules/@rspack/core": { "version": "1.7.6", - "resolved": "https://registry.npmjs.org/@rspack/core/-/core-1.7.6.tgz", - "integrity": "sha512-Iax6UhrfZqJajA778c1d5DBFbSIqPOSrI34kpNIiNpWd8Jq7mFIa+Z60SQb5ZQDZuUxcCZikjz5BxinFjTkg7Q==", "devOptional": true, "license": "MIT", "dependencies": { @@ -14407,15 +12090,11 @@ }, "node_modules/@rspack/lite-tapable": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@rspack/lite-tapable/-/lite-tapable-1.1.0.tgz", - "integrity": "sha512-E2B0JhYFmVAwdDiG14+DW0Di4Ze4Jg10Pc4/lILUrd5DRCaklduz2OvJ5HYQ6G+hd+WTzqQb3QnDNfK4yvAFYw==", "devOptional": true, "license": "MIT" }, "node_modules/@rudderstack/rudder-sdk-node": { "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@rudderstack/rudder-sdk-node/-/rudder-sdk-node-3.0.3.tgz", - "integrity": "sha512-LSylL8aon3OGVZh0eLztzds0ofVM42Zty8ovuG40Vu/HtSjYi8VcOKhoXAx788C6RefX+jJI9Oqiep7rnkK5cg==", "dependencies": { "axios": "1.13.5", "axios-retry": "4.5.0", @@ -14435,8 +12114,6 @@ }, "node_modules/@rudderstack/rudder-sdk-node/node_modules/axios": { "version": "1.13.5", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.13.5.tgz", - "integrity": "sha512-cz4ur7Vb0xS4/KUN0tPWe44eqxrIu31me+fbang3ijiNscE129POzipJJA6zniq2C/Z6sJCjMimjS8Lc/GAs8Q==", "license": "MIT", "dependencies": { "follow-redirects": "^1.15.11", @@ -14446,14 +12123,10 @@ }, "node_modules/@rudderstack/rudder-sdk-node/node_modules/proxy-from-env": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", - "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", "license": "MIT" }, "node_modules/@rudderstack/rudder-sdk-node/node_modules/uuid": { "version": "11.1.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-11.1.0.tgz", - "integrity": "sha512-0/A9rDy9P7cJ+8w1c9WD9V//9Wj15Ce2MPz8Ri6032usz+NfePxx5AcN3bN+r6ZL6jEo066/yNYB3tn4pQEx+A==", "funding": [ "https://github.com/sponsors/broofa", "https://github.com/sponsors/ctavan" @@ -14465,8 +12138,6 @@ }, "node_modules/@segment/analytics-core": { "version": "1.8.2", - "resolved": "https://registry.npmjs.org/@segment/analytics-core/-/analytics-core-1.8.2.tgz", - "integrity": "sha512-5FDy6l8chpzUfJcNlIcyqYQq4+JTUynlVoCeCUuVz+l+6W0PXg+ljKp34R4yLVCcY5VVZohuW+HH0VLWdwYVAg==", "license": "MIT", "dependencies": { "@lukeed/uuid": "^2.0.0", @@ -14477,8 +12148,6 @@ }, "node_modules/@segment/analytics-generic-utils": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@segment/analytics-generic-utils/-/analytics-generic-utils-1.2.0.tgz", - "integrity": "sha512-DfnW6mW3YQOLlDQQdR89k4EqfHb0g/3XvBXkovH1FstUN93eL1kfW9CsDcVQyH3bAC5ZsFyjA/o/1Q2j0QeoWw==", "license": "MIT", "dependencies": { "tslib": "^2.4.1" @@ -14486,8 +12155,6 @@ }, "node_modules/@segment/analytics-next": { "version": "1.82.0", - "resolved": "https://registry.npmjs.org/@segment/analytics-next/-/analytics-next-1.82.0.tgz", - "integrity": "sha512-oFKpS9nASZC32/cjVVtqptTmsYRBh0v9ZH7EQgGyzyUhHJ6CDNVRSR8gt5G/POg7XBIIh8Tv9FC+ZRy2ByRocQ==", "license": "MIT", "dependencies": { "@lukeed/uuid": "^2.0.0", @@ -14505,8 +12172,6 @@ }, "node_modules/@segment/analytics-node": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@segment/analytics-node/-/analytics-node-3.0.0.tgz", - "integrity": "sha512-Qer+cXr/QH24QTau+NOcw47vuvfvze0xfZORTTKfAyG33thb5FRQvdg3txjGAf0TQKm0+l8qW1V+4jb9nlfAQg==", "license": "MIT", "dependencies": { "@lukeed/uuid": "^2.0.0", @@ -14522,8 +12187,6 @@ }, "node_modules/@segment/analytics-node/node_modules/jose": { "version": "5.10.0", - "resolved": "https://registry.npmjs.org/jose/-/jose-5.10.0.tgz", - "integrity": "sha512-s+3Al/p9g32Iq+oqXxkW//7jk2Vig6FF1CFqzVXoTUXt2qz89YWbL+OwS17NFYEvxC35n0FKeGO2LGYSxeM2Gg==", "license": "MIT", "funding": { "url": "https://github.com/sponsors/panva" @@ -14531,8 +12194,6 @@ }, "node_modules/@segment/analytics-page-tools": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@segment/analytics-page-tools/-/analytics-page-tools-1.0.0.tgz", - "integrity": "sha512-o9OVB91qLB9qb0Bw1HfjmWm5AnrMNULRjx++4lBqLt8InKRX1urrRBparVlpj+yJA0sckN5ZcsfazRLuPgBYDQ==", "license": "MIT", "dependencies": { "tslib": "^2.4.1" @@ -14540,8 +12201,6 @@ }, "node_modules/@segment/analytics.js-video-plugins": { "version": "0.2.1", - "resolved": "https://registry.npmjs.org/@segment/analytics.js-video-plugins/-/analytics.js-video-plugins-0.2.1.tgz", - "integrity": "sha512-lZwCyEXT4aaHBLNK433okEKdxGAuyrVmop4BpQqQSJuRz0DglPZgd9B/XjiiWs1UyOankg2aNYMN3VcS8t4eSQ==", "license": "ISC", "dependencies": { "unfetch": "^3.1.1" @@ -14549,14 +12208,10 @@ }, "node_modules/@segment/analytics.js-video-plugins/node_modules/unfetch": { "version": "3.1.2", - "resolved": "https://registry.npmjs.org/unfetch/-/unfetch-3.1.2.tgz", - "integrity": "sha512-L0qrK7ZeAudGiKYw6nzFjnJ2D5WHblUBwmHIqtPS6oKUd+Hcpk7/hKsSmcHsTlpd1TbTNsiRBUKRq3bHLNIqIw==", "license": "MIT" }, "node_modules/@segment/facade": { "version": "3.4.10", - "resolved": "https://registry.npmjs.org/@segment/facade/-/facade-3.4.10.tgz", - "integrity": "sha512-xVQBbB/lNvk/u8+ey0kC/+g8pT3l0gCT8O2y9Z+StMMn3KAFAQ9w8xfgef67tJybktOKKU7pQGRPolRM1i1pdA==", "license": "SEE LICENSE IN LICENSE", "dependencies": { "@segment/isodate-traverse": "^1.1.1", @@ -14567,14 +12222,10 @@ }, "node_modules/@segment/isodate": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@segment/isodate/-/isodate-1.0.3.tgz", - "integrity": "sha512-BtanDuvJqnACFkeeYje7pWULVv8RgZaqKHWwGFnL/g/TH/CcZjkIVTfGDp/MAxmilYHUkrX70SqwnYSTNEaN7A==", "license": "SEE LICENSE IN LICENSE" }, "node_modules/@segment/isodate-traverse": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@segment/isodate-traverse/-/isodate-traverse-1.1.1.tgz", - "integrity": "sha512-+G6e1SgAUkcq0EDMi+SRLfT48TNlLPF3QnSgFGVs0V9F3o3fq/woQ2rHFlW20W0yy5NnCUH0QGU3Am2rZy/E3w==", "license": "SEE LICENSE IN LICENSE", "dependencies": { "@segment/isodate": "^1.0.3" @@ -14582,8 +12233,6 @@ }, "node_modules/@shikijs/core": { "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@shikijs/core/-/core-4.0.2.tgz", - "integrity": "sha512-hxT0YF4ExEqB8G/qFdtJvpmHXBYJ2lWW7qTHDarVkIudPFE6iCIrqdgWxGn5s+ppkGXI0aEGlibI0PAyzP3zlw==", "license": "MIT", "dependencies": { "@shikijs/primitive": "4.0.2", @@ -14598,8 +12247,6 @@ }, "node_modules/@shikijs/engine-javascript": { "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@shikijs/engine-javascript/-/engine-javascript-4.0.2.tgz", - "integrity": "sha512-7PW0Nm49DcoUIQEXlJhNNBHyoGMjalRETTCcjMqEaMoJRLljy1Bi/EGV3/qLBgLKQejdspiiYuHGQW6dX94Nag==", "license": "MIT", "dependencies": { "@shikijs/types": "4.0.2", @@ -14612,8 +12259,6 @@ }, "node_modules/@shikijs/engine-oniguruma": { "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@shikijs/engine-oniguruma/-/engine-oniguruma-4.0.2.tgz", - "integrity": "sha512-UpCB9Y2sUKlS9z8juFSKz7ZtysmeXCgnRF0dlhXBkmQnek7lAToPte8DkxmEYGNTMii72zU/lyXiCB6StuZeJg==", "license": "MIT", "dependencies": { "@shikijs/types": "4.0.2", @@ -14625,8 +12270,6 @@ }, "node_modules/@shikijs/langs": { "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@shikijs/langs/-/langs-4.0.2.tgz", - "integrity": "sha512-KaXby5dvoeuZzN0rYQiPMjFoUrz4hgwIE+D6Du9owcHcl6/g16/yT5BQxSW5cGt2MZBz6Hl0YuRqf12omRfUUg==", "license": "MIT", "dependencies": { "@shikijs/types": "4.0.2" @@ -14637,8 +12280,6 @@ }, "node_modules/@shikijs/primitive": { "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@shikijs/primitive/-/primitive-4.0.2.tgz", - "integrity": "sha512-M6UMPrSa3fN5ayeJwFVl9qWofl273wtK1VG8ySDZ1mQBfhCpdd8nEx7nPZ/tk7k+TYcpqBZzj/AnwxT9lO+HJw==", "license": "MIT", "dependencies": { "@shikijs/types": "4.0.2", @@ -14651,8 +12292,6 @@ }, "node_modules/@shikijs/themes": { "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@shikijs/themes/-/themes-4.0.2.tgz", - "integrity": "sha512-mjCafwt8lJJaVSsQvNVrJumbnnj1RI8jbUKrPKgE6E3OvQKxnuRoBaYC51H4IGHePsGN/QtALglWBU7DoKDFnA==", "license": "MIT", "dependencies": { "@shikijs/types": "4.0.2" @@ -14663,8 +12302,6 @@ }, "node_modules/@shikijs/types": { "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@shikijs/types/-/types-4.0.2.tgz", - "integrity": "sha512-qzbeRooUTPnLE+sHD/Z8DStmaDgnbbc/pMrU203950aRqjX/6AFHeDYT+j00y2lPdz0ywJKx7o/7qnqTivtlXg==", "license": "MIT", "dependencies": { "@shikijs/vscode-textmate": "^10.0.2", @@ -14676,14 +12313,10 @@ }, "node_modules/@shikijs/vscode-textmate": { "version": "10.0.2", - "resolved": "https://registry.npmjs.org/@shikijs/vscode-textmate/-/vscode-textmate-10.0.2.tgz", - "integrity": "sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg==", "license": "MIT" }, "node_modules/@sideway/address": { "version": "4.1.5", - "resolved": "https://registry.npmjs.org/@sideway/address/-/address-4.1.5.tgz", - "integrity": "sha512-IqO/DUQHUkPeixNQ8n0JA6102hT9CmaljNTPmQ1u8MEhBo/R4Q8eKLN/vGZxuebwOroDB4cbpjheD4+/sKFK4Q==", "license": "BSD-3-Clause", "dependencies": { "@hapi/hoek": "^9.0.0" @@ -14691,20 +12324,14 @@ }, "node_modules/@sideway/formula": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@sideway/formula/-/formula-3.0.1.tgz", - "integrity": "sha512-/poHZJJVjx3L+zVD6g9KgHfYnb443oi7wLu/XKojDviHy6HOEOA6z1Trk5aR1dGcmPenJEgb2sK2I80LeS3MIg==", "license": "BSD-3-Clause" }, "node_modules/@sideway/pinpoint": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@sideway/pinpoint/-/pinpoint-2.0.0.tgz", - "integrity": "sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ==", "license": "BSD-3-Clause" }, "node_modules/@sigstore/bundle": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@sigstore/bundle/-/bundle-4.0.0.tgz", - "integrity": "sha512-NwCl5Y0V6Di0NexvkTqdoVfmjTaQwoLM236r89KEojGmq/jMls8S+zb7yOwAPdXvbwfKDlP+lmXgAL4vKSQT+A==", "license": "Apache-2.0", "dependencies": { "@sigstore/protobuf-specs": "^0.5.0" @@ -14715,8 +12342,6 @@ }, "node_modules/@sigstore/core": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@sigstore/core/-/core-3.1.0.tgz", - "integrity": "sha512-o5cw1QYhNQ9IroioJxpzexmPjfCe7gzafd2RY3qnMpxr4ZEja+Jad/U8sgFpaue6bOaF+z7RVkyKVV44FN+N8A==", "license": "Apache-2.0", "engines": { "node": "^20.17.0 || >=22.9.0" @@ -14724,8 +12349,6 @@ }, "node_modules/@sigstore/protobuf-specs": { "version": "0.5.0", - "resolved": "https://registry.npmjs.org/@sigstore/protobuf-specs/-/protobuf-specs-0.5.0.tgz", - "integrity": "sha512-MM8XIwUjN2bwvCg1QvrMtbBmpcSHrkhFSCu1D11NyPvDQ25HEc4oG5/OcQfd/Tlf/OxmKWERDj0zGE23jQaMwA==", "license": "Apache-2.0", "engines": { "node": "^18.17.0 || >=20.5.0" @@ -14733,8 +12356,6 @@ }, "node_modules/@sigstore/sign": { "version": "4.1.0", - "resolved": "https://registry.npmjs.org/@sigstore/sign/-/sign-4.1.0.tgz", - "integrity": "sha512-Vx1RmLxLGnSUqx/o5/VsCjkuN5L7y+vxEEwawvc7u+6WtX2W4GNa7b9HEjmcRWohw/d6BpATXmvOwc78m+Swdg==", "license": "Apache-2.0", "dependencies": { "@sigstore/bundle": "^4.0.0", @@ -14750,8 +12371,6 @@ }, "node_modules/@sigstore/tuf": { "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@sigstore/tuf/-/tuf-4.0.1.tgz", - "integrity": "sha512-OPZBg8y5Vc9yZjmWCHrlWPMBqW5yd8+wFNl+thMdtcWz3vjVSoJQutF8YkrzI0SLGnkuFof4HSsWUhXrf219Lw==", "license": "Apache-2.0", "dependencies": { "@sigstore/protobuf-specs": "^0.5.0", @@ -14763,8 +12382,6 @@ }, "node_modules/@sigstore/verify": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@sigstore/verify/-/verify-3.1.0.tgz", - "integrity": "sha512-mNe0Iigql08YupSOGv197YdHpPPr+EzDZmfCgMc7RPNaZTw5aLN01nBl6CHJOh3BGtnMIj83EeN4butBchc8Ag==", "license": "Apache-2.0", "dependencies": { "@sigstore/bundle": "^4.0.0", @@ -14777,14 +12394,10 @@ }, "node_modules/@sinclair/typebox": { "version": "0.34.48", - "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.34.48.tgz", - "integrity": "sha512-kKJTNuK3AQOrgjjotVxMrCn1sUJwM76wMszfq1kdU4uYVJjvEWuFQ6HgvLt4Xz3fSmZlTOxJ/Ie13KnIcWQXFA==", "license": "MIT" }, "node_modules/@sindresorhus/is": { "version": "4.6.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz", - "integrity": "sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==", "license": "MIT", "engines": { "node": ">=10" @@ -14795,8 +12408,6 @@ }, "node_modules/@sinonjs/commons": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.1.tgz", - "integrity": "sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==", "license": "BSD-3-Clause", "dependencies": { "type-detect": "4.0.8" @@ -14804,8 +12415,6 @@ }, "node_modules/@sinonjs/fake-timers": { "version": "13.0.5", - "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-13.0.5.tgz", - "integrity": "sha512-36/hTbH2uaWuGVERyC6da9YwGWnzUZXuPro/F2LfsdOsLnCojz/iSH8MxUt/FD2S5XBSVPhmArFUXcpCQ2Hkiw==", "license": "BSD-3-Clause", "dependencies": { "@sinonjs/commons": "^3.0.1" @@ -14813,8 +12422,6 @@ }, "node_modules/@slack/logger": { "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@slack/logger/-/logger-4.0.1.tgz", - "integrity": "sha512-6cmdPrV/RYfd2U0mDGiMK8S7OJqpCTm7enMLRR3edccsPX8j7zXTLnaEF4fhxxJJTAIOil6+qZrnUPTuaLvwrQ==", "license": "MIT", "dependencies": { "@types/node": ">=18" @@ -14826,8 +12433,6 @@ }, "node_modules/@slack/types": { "version": "2.20.1", - "resolved": "https://registry.npmjs.org/@slack/types/-/types-2.20.1.tgz", - "integrity": "sha512-eWX2mdt1ktpn8+40iiMc404uGrih+2fxiky3zBcPjtXKj6HLRdYlmhrPkJi7JTJm8dpXR6BWVWEDBXtaWMKD6A==", "license": "MIT", "engines": { "node": ">= 12.13.0", @@ -14836,8 +12441,6 @@ }, "node_modules/@slack/web-api": { "version": "7.15.0", - "resolved": "https://registry.npmjs.org/@slack/web-api/-/web-api-7.15.0.tgz", - "integrity": "sha512-va7zYIt3QHG1x9M/jqXXRPFMoOVlVSSRHC5YH+DzKYsrz5xUKOA3lR4THsu/Zxha9N1jOndbKFKLtr0WOPW1Vw==", "license": "MIT", "dependencies": { "@slack/logger": "^4.0.1", @@ -14860,14 +12463,10 @@ }, "node_modules/@slack/web-api/node_modules/@types/retry": { "version": "0.12.0", - "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.0.tgz", - "integrity": "sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==", "license": "MIT" }, "node_modules/@slack/web-api/node_modules/p-retry": { "version": "4.6.2", - "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-4.6.2.tgz", - "integrity": "sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ==", "license": "MIT", "dependencies": { "@types/retry": "0.12.0", @@ -14879,8 +12478,6 @@ }, "node_modules/@slorber/remark-comment": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@slorber/remark-comment/-/remark-comment-1.0.0.tgz", - "integrity": "sha512-RCE24n7jsOj1M0UPvIQCHTe7fI0sFL4S2nwKVWwHyVr/wI/H8GosgsJGyhnsZoGFnD/P2hLf1mSbrrgSLN93NA==", "license": "MIT", "dependencies": { "micromark-factory-space": "^1.0.0", @@ -14890,8 +12487,6 @@ }, "node_modules/@smithy/config-resolver": { "version": "4.4.17", - "resolved": "https://registry.npmjs.org/@smithy/config-resolver/-/config-resolver-4.4.17.tgz", - "integrity": "sha512-TzDZcAnhTyAHbXVxWZo7/tEcrIeFq20IBk8So3OLOetWpR8EwY/yEqBMBFaJMeyEiREDq4NfEl+qO3OAUD+vbQ==", "license": "Apache-2.0", "dependencies": { "@smithy/node-config-provider": "^4.3.14", @@ -14907,8 +12502,6 @@ }, "node_modules/@smithy/core": { "version": "3.23.17", - "resolved": "https://registry.npmjs.org/@smithy/core/-/core-3.23.17.tgz", - "integrity": "sha512-x7BlLbUFL8NWCGjMF9C+1N5cVCxcPa7g6Tv9B4A2luWx3be3oU8hQ96wIwxe/s7OhIzvoJH73HAUSg5JXVlEtQ==", "license": "Apache-2.0", "dependencies": { "@smithy/protocol-http": "^5.3.14", @@ -14928,8 +12521,6 @@ }, "node_modules/@smithy/credential-provider-imds": { "version": "4.2.14", - "resolved": "https://registry.npmjs.org/@smithy/credential-provider-imds/-/credential-provider-imds-4.2.14.tgz", - "integrity": "sha512-Au28zBN48ZAoXdooGUHemuVBrkE+Ie6RPmGNIAJsFqj33Vhb6xAgRifUydZ2aY+M+KaMAETAlKk5NC5h1G7wpg==", "license": "Apache-2.0", "dependencies": { "@smithy/node-config-provider": "^4.3.14", @@ -14944,8 +12535,6 @@ }, "node_modules/@smithy/fetch-http-handler": { "version": "5.3.17", - "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-5.3.17.tgz", - "integrity": "sha512-bXOvQzaSm6MnmLaWA1elgfQcAtN4UP3vXqV97bHuoOrHQOJiLT3ds6o9eo5bqd0TJfRFpzdGnDQdW3FACiAVdw==", "license": "Apache-2.0", "dependencies": { "@smithy/protocol-http": "^5.3.14", @@ -14960,8 +12549,6 @@ }, "node_modules/@smithy/hash-node": { "version": "4.2.14", - "resolved": "https://registry.npmjs.org/@smithy/hash-node/-/hash-node-4.2.14.tgz", - "integrity": "sha512-8ZBDY2DD4wr+GGjTpPtiglEsqr0lUP+KHqgZcWczFf6qeZ/YRjMIOoQWVQlmwu7EtxKTd8YXD8lblmYcpBIA1g==", "license": "Apache-2.0", "dependencies": { "@smithy/types": "^4.14.1", @@ -14975,8 +12562,6 @@ }, "node_modules/@smithy/invalid-dependency": { "version": "4.2.14", - "resolved": "https://registry.npmjs.org/@smithy/invalid-dependency/-/invalid-dependency-4.2.14.tgz", - "integrity": "sha512-c21qJiTSb25xvvOp+H2TNZzPCngrvl5vIPqPB8zQ/DmJF4QWXO19x1dWfMJZ6wZuuWUPPm0gV8C0cU3+ifcWuw==", "license": "Apache-2.0", "dependencies": { "@smithy/types": "^4.14.1", @@ -14988,8 +12573,6 @@ }, "node_modules/@smithy/is-array-buffer": { "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-4.2.2.tgz", - "integrity": "sha512-n6rQ4N8Jj4YTQO3YFrlgZuwKodf4zUFs7EJIWH86pSCWBaAtAGBFfCM7Wx6D2bBJ2xqFNxGBSrUWswT3M0VJow==", "license": "Apache-2.0", "dependencies": { "tslib": "^2.6.2" @@ -15000,8 +12583,6 @@ }, "node_modules/@smithy/md5-js": { "version": "4.2.14", - "resolved": "https://registry.npmjs.org/@smithy/md5-js/-/md5-js-4.2.14.tgz", - "integrity": "sha512-V2v0vx+h0iUSNG1Alt+GNBMSLGCrl9iVsdd+Ap67HPM9PN479x12V8LkuMoKImNZxn3MXeuyUjls+/7ZACZghA==", "license": "Apache-2.0", "dependencies": { "@smithy/types": "^4.14.1", @@ -15014,8 +12595,6 @@ }, "node_modules/@smithy/middleware-content-length": { "version": "4.2.14", - "resolved": "https://registry.npmjs.org/@smithy/middleware-content-length/-/middleware-content-length-4.2.14.tgz", - "integrity": "sha512-xhHq7fX4/3lv5NHxLUk3OeEvl0xZ+Ek3qIbWaCL4f9JwgDZEclPBElljaZCAItdGPQl/kSM4LPMOpy1MYgprpw==", "license": "Apache-2.0", "dependencies": { "@smithy/protocol-http": "^5.3.14", @@ -15028,8 +12607,6 @@ }, "node_modules/@smithy/middleware-endpoint": { "version": "4.4.32", - "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-4.4.32.tgz", - "integrity": "sha512-ZZkgyjnJppiZbIm6Qbx92pbXYi1uzenIvGhBSCDlc7NwuAkiqSgS75j1czAD25ZLs2FjMjYy1q7gyRVWG6JA0Q==", "license": "Apache-2.0", "dependencies": { "@smithy/core": "^3.23.17", @@ -15047,8 +12624,6 @@ }, "node_modules/@smithy/middleware-retry": { "version": "4.5.7", - "resolved": "https://registry.npmjs.org/@smithy/middleware-retry/-/middleware-retry-4.5.7.tgz", - "integrity": "sha512-bRt6ZImqVSeTk39Nm81K20ObIiAZ3WefY7G6+iz/0tZjs4dgRRjvRX2sgsH+zi6iDCRR/aQvQofLKxxz4rPBZg==", "license": "Apache-2.0", "dependencies": { "@smithy/core": "^3.23.17", @@ -15068,8 +12643,6 @@ }, "node_modules/@smithy/middleware-serde": { "version": "4.2.20", - "resolved": "https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-4.2.20.tgz", - "integrity": "sha512-Lx9JMO9vArPtiChE3wbEZ5akMIDQpWQtlu90lhACQmNOXcGXRbaDywMHDzuDZ2OkZzP+9wQfZi3YJT9F67zTQQ==", "license": "Apache-2.0", "dependencies": { "@smithy/core": "^3.23.17", @@ -15083,8 +12656,6 @@ }, "node_modules/@smithy/middleware-stack": { "version": "4.2.14", - "resolved": "https://registry.npmjs.org/@smithy/middleware-stack/-/middleware-stack-4.2.14.tgz", - "integrity": "sha512-2dvkUKLuFdKsCRmOE4Mn63co0Djtsm+JMh0bYZQupN1pJwMeE8FmQmRLLzzEMN0dnNi7CDCYYH8F0EVwWiPBeA==", "license": "Apache-2.0", "dependencies": { "@smithy/types": "^4.14.1", @@ -15096,8 +12667,6 @@ }, "node_modules/@smithy/node-config-provider": { "version": "4.3.14", - "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-4.3.14.tgz", - "integrity": "sha512-S+gFjyo/weSVL0P1b9Ts8C/CwIfNCgUPikk3sl6QVsfE/uUuO+QsF+NsE/JkpvWqqyz1wg7HFdiaZuj5CoBMRg==", "license": "Apache-2.0", "dependencies": { "@smithy/property-provider": "^4.2.14", @@ -15111,8 +12680,6 @@ }, "node_modules/@smithy/node-http-handler": { "version": "4.6.1", - "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-4.6.1.tgz", - "integrity": "sha512-iB+orM4x3xrr57X3YaXazfKnntl0LHlZB1kcXSGzMV1Tt0+YwEjGlbjk/44qEGtBzXAz6yFDzkYTKSV6Pj2HUg==", "license": "Apache-2.0", "dependencies": { "@smithy/protocol-http": "^5.3.14", @@ -15126,8 +12693,6 @@ }, "node_modules/@smithy/property-provider": { "version": "4.2.14", - "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-4.2.14.tgz", - "integrity": "sha512-WuM31CgfsnQ/10i7NYr0PyxqknD72Y5uMfUMVSniPjbEPceiTErb4eIqJQ+pdxNEAUEWrewrGjIRjVbVHsxZiQ==", "license": "Apache-2.0", "dependencies": { "@smithy/types": "^4.14.1", @@ -15139,8 +12704,6 @@ }, "node_modules/@smithy/protocol-http": { "version": "5.3.14", - "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-5.3.14.tgz", - "integrity": "sha512-dN5F8kHx8RNU0r+pCwNmFZyz6ChjMkzShy/zup6MtkRmmix4vZzJdW+di7x//b1LiynIev88FM18ie+wwPcQtQ==", "license": "Apache-2.0", "dependencies": { "@smithy/types": "^4.14.1", @@ -15152,8 +12715,6 @@ }, "node_modules/@smithy/querystring-builder": { "version": "4.2.14", - "resolved": "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-4.2.14.tgz", - "integrity": "sha512-XYA5Z0IqTeF+5XDdh4BBmSA0HvbgVZIyv4cmOoUheDNR57K1HgBp9ukUMx3Cr3XpDHHpLBnexPE3LAtDsZkj2A==", "license": "Apache-2.0", "dependencies": { "@smithy/types": "^4.14.1", @@ -15166,8 +12727,6 @@ }, "node_modules/@smithy/querystring-parser": { "version": "4.2.14", - "resolved": "https://registry.npmjs.org/@smithy/querystring-parser/-/querystring-parser-4.2.14.tgz", - "integrity": "sha512-hr+YyqBD23GVvRxGGrcc/oOeNlK3PzT5Fu4dzrDXxzS1LpFiuL2PQQqKPs87M79aW7ziMs+nvB3qdw77SqE7Lw==", "license": "Apache-2.0", "dependencies": { "@smithy/types": "^4.14.1", @@ -15179,8 +12738,6 @@ }, "node_modules/@smithy/service-error-classification": { "version": "4.3.1", - "resolved": "https://registry.npmjs.org/@smithy/service-error-classification/-/service-error-classification-4.3.1.tgz", - "integrity": "sha512-aUQuDGh760ts/8MU+APjIZhlLPKhIIfqyzZaJikLEIMrdxFvxuLYD0WxWzaYWpmLbQlXDe9p7EWM3HsBe0K6Gw==", "license": "Apache-2.0", "dependencies": { "@smithy/types": "^4.14.1" @@ -15191,8 +12748,6 @@ }, "node_modules/@smithy/shared-ini-file-loader": { "version": "4.4.9", - "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-4.4.9.tgz", - "integrity": "sha512-495/V2I15SHgedSJoDPD23JuSfKAp726ZI1V0wtjB07Wh7q/0tri/0e0DLefZCHgxZonrGKt/OCTpAtP1wE1kQ==", "license": "Apache-2.0", "dependencies": { "@smithy/types": "^4.14.1", @@ -15204,8 +12759,6 @@ }, "node_modules/@smithy/signature-v4": { "version": "5.3.14", - "resolved": "https://registry.npmjs.org/@smithy/signature-v4/-/signature-v4-5.3.14.tgz", - "integrity": "sha512-1D9Y/nmlVjCeSivCbhZ7hgEpmHyY1h0GvpSZt3l0xcD9JjmjVC1CHOozS6+Gh+/ldMH8JuJ6cujObQqfayAVFA==", "license": "Apache-2.0", "dependencies": { "@smithy/is-array-buffer": "^4.2.2", @@ -15223,8 +12776,6 @@ }, "node_modules/@smithy/smithy-client": { "version": "4.12.13", - "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-4.12.13.tgz", - "integrity": "sha512-y/Pcj1V9+qG98gyu1gvftHB7rDpdh+7kIBIggs55yGm3JdtBV8GT8IFF3a1qxZ79QnaJHX9GXzvBG6tAd+czJA==", "license": "Apache-2.0", "dependencies": { "@smithy/core": "^3.23.17", @@ -15241,8 +12792,6 @@ }, "node_modules/@smithy/types": { "version": "4.14.1", - "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.14.1.tgz", - "integrity": "sha512-59b5HtSVrVR/eYNei3BUj3DCPKD/G7EtDDe7OEJE7i7FtQFugYo6MxbotS8mVJkLNVf8gYaAlEBwwtJ9HzhWSg==", "license": "Apache-2.0", "dependencies": { "tslib": "^2.6.2" @@ -15253,8 +12802,6 @@ }, "node_modules/@smithy/url-parser": { "version": "4.2.14", - "resolved": "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-4.2.14.tgz", - "integrity": "sha512-p06BiBigJ8bTA3MgnOfCtDUWnAMY0YfedO/GRpmc7p+wg3KW8vbXy1xwSu5ASy0wV7rRYtlfZOIKH4XqfhjSQQ==", "license": "Apache-2.0", "dependencies": { "@smithy/querystring-parser": "^4.2.14", @@ -15267,8 +12814,6 @@ }, "node_modules/@smithy/util-base64": { "version": "4.3.2", - "resolved": "https://registry.npmjs.org/@smithy/util-base64/-/util-base64-4.3.2.tgz", - "integrity": "sha512-XRH6b0H/5A3SgblmMa5ErXQ2XKhfbQB+Fm/oyLZ2O2kCUrwgg55bU0RekmzAhuwOjA9qdN5VU2BprOvGGUkOOQ==", "license": "Apache-2.0", "dependencies": { "@smithy/util-buffer-from": "^4.2.2", @@ -15281,8 +12826,6 @@ }, "node_modules/@smithy/util-body-length-browser": { "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@smithy/util-body-length-browser/-/util-body-length-browser-4.2.2.tgz", - "integrity": "sha512-JKCrLNOup3OOgmzeaKQwi4ZCTWlYR5H4Gm1r2uTMVBXoemo1UEghk5vtMi1xSu2ymgKVGW631e2fp9/R610ZjQ==", "license": "Apache-2.0", "dependencies": { "tslib": "^2.6.2" @@ -15293,8 +12836,6 @@ }, "node_modules/@smithy/util-body-length-node": { "version": "4.2.3", - "resolved": "https://registry.npmjs.org/@smithy/util-body-length-node/-/util-body-length-node-4.2.3.tgz", - "integrity": "sha512-ZkJGvqBzMHVHE7r/hcuCxlTY8pQr1kMtdsVPs7ex4mMU+EAbcXppfo5NmyxMYi2XU49eqaz56j2gsk4dHHPG/g==", "license": "Apache-2.0", "dependencies": { "tslib": "^2.6.2" @@ -15305,8 +12846,6 @@ }, "node_modules/@smithy/util-buffer-from": { "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-4.2.2.tgz", - "integrity": "sha512-FDXD7cvUoFWwN6vtQfEta540Y/YBe5JneK3SoZg9bThSoOAC/eGeYEua6RkBgKjGa/sz6Y+DuBZj3+YEY21y4Q==", "license": "Apache-2.0", "dependencies": { "@smithy/is-array-buffer": "^4.2.2", @@ -15318,8 +12857,6 @@ }, "node_modules/@smithy/util-config-provider": { "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@smithy/util-config-provider/-/util-config-provider-4.2.2.tgz", - "integrity": "sha512-dWU03V3XUprJwaUIFVv4iOnS1FC9HnMHDfUrlNDSh4315v0cWyaIErP8KiqGVbf5z+JupoVpNM7ZB3jFiTejvQ==", "license": "Apache-2.0", "dependencies": { "tslib": "^2.6.2" @@ -15330,8 +12867,6 @@ }, "node_modules/@smithy/util-defaults-mode-browser": { "version": "4.3.49", - "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-4.3.49.tgz", - "integrity": "sha512-a5bNrdiONYB/qE2BuKegvUMd/+ZDwdg4vsNuuSzYE8qs2EYAdK9CynL+Rzn29PbPiUqoz/cbpRbcLzD5lEevHw==", "license": "Apache-2.0", "dependencies": { "@smithy/property-provider": "^4.2.14", @@ -15345,8 +12880,6 @@ }, "node_modules/@smithy/util-defaults-mode-node": { "version": "4.2.54", - "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-4.2.54.tgz", - "integrity": "sha512-g1cvrJvOnzeJgEdf7AE4luI7gp6L8weE0y9a9wQUSGtjb8QRHDbCJYuE4Sy0SD9N8RrnNPFsPltAz/OSoBR9Zw==", "license": "Apache-2.0", "dependencies": { "@smithy/config-resolver": "^4.4.17", @@ -15363,8 +12896,6 @@ }, "node_modules/@smithy/util-endpoints": { "version": "3.4.2", - "resolved": "https://registry.npmjs.org/@smithy/util-endpoints/-/util-endpoints-3.4.2.tgz", - "integrity": "sha512-a55Tr+3OKld4TTtnT+RhKOQHyPxm3j/xL4OR83WBUhLJaKDS9dnJ7arRMOp3t31dcLhApwG9bgvrRXBHlLdIkg==", "license": "Apache-2.0", "dependencies": { "@smithy/node-config-provider": "^4.3.14", @@ -15377,8 +12908,6 @@ }, "node_modules/@smithy/util-hex-encoding": { "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@smithy/util-hex-encoding/-/util-hex-encoding-4.2.2.tgz", - "integrity": "sha512-Qcz3W5vuHK4sLQdyT93k/rfrUwdJ8/HZ+nMUOyGdpeGA1Wxt65zYwi3oEl9kOM+RswvYq90fzkNDahPS8K0OIg==", "license": "Apache-2.0", "dependencies": { "tslib": "^2.6.2" @@ -15389,8 +12918,6 @@ }, "node_modules/@smithy/util-middleware": { "version": "4.2.14", - "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-4.2.14.tgz", - "integrity": "sha512-1Su2vj9RYNDEv/V+2E+jXkkwGsgR7dc4sfHn9Z7ruzQHJIEni9zzw5CauvRXlFJfmgcqYP8fWa0dkh2Q2YaQyw==", "license": "Apache-2.0", "dependencies": { "@smithy/types": "^4.14.1", @@ -15402,8 +12929,6 @@ }, "node_modules/@smithy/util-retry": { "version": "4.3.8", - "resolved": "https://registry.npmjs.org/@smithy/util-retry/-/util-retry-4.3.8.tgz", - "integrity": "sha512-LUIxbTBi+OpvXpg91poGA6BdyoleMDLnfXjVDqyi2RvZmTveY5loE/FgYUBCR5LU2BThW2SoZRh8dTIIy38IPw==", "license": "Apache-2.0", "dependencies": { "@smithy/service-error-classification": "^4.3.1", @@ -15416,8 +12941,6 @@ }, "node_modules/@smithy/util-stream": { "version": "4.5.25", - "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-4.5.25.tgz", - "integrity": "sha512-/PFpG4k8Ze8Ei+mMKj3oiPICYekthuzePZMgZbCqMiXIHHf4n2aZ4Ps0aSRShycFTGuj/J6XldmC0x0DwednIA==", "license": "Apache-2.0", "dependencies": { "@smithy/fetch-http-handler": "^5.3.17", @@ -15435,8 +12958,6 @@ }, "node_modules/@smithy/util-uri-escape": { "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@smithy/util-uri-escape/-/util-uri-escape-4.2.2.tgz", - "integrity": "sha512-2kAStBlvq+lTXHyAZYfJRb/DfS3rsinLiwb+69SstC9Vb0s9vNWkRwpnj918Pfi85mzi42sOqdV72OLxWAISnw==", "license": "Apache-2.0", "dependencies": { "tslib": "^2.6.2" @@ -15447,8 +12968,6 @@ }, "node_modules/@smithy/util-utf8": { "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-4.2.2.tgz", - "integrity": "sha512-75MeYpjdWRe8M5E3AW0O4Cx3UadweS+cwdXjwYGBW5h/gxxnbeZ877sLPX/ZJA9GVTlL/qG0dXP29JWFCD1Ayw==", "license": "Apache-2.0", "dependencies": { "@smithy/util-buffer-from": "^4.2.2", @@ -15460,8 +12979,6 @@ }, "node_modules/@smithy/uuid": { "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@smithy/uuid/-/uuid-1.1.2.tgz", - "integrity": "sha512-O/IEdcCUKkubz60tFbGA7ceITTAJsty+lBjNoorP4Z6XRqaFb/OjQjZODophEcuq68nKm6/0r+6/lLQ+XVpk8g==", "license": "Apache-2.0", "dependencies": { "tslib": "^2.6.2" @@ -15472,8 +12989,6 @@ }, "node_modules/@snowplow/browser-plugin-snowplow-ecommerce": { "version": "4.6.8", - "resolved": "https://registry.npmjs.org/@snowplow/browser-plugin-snowplow-ecommerce/-/browser-plugin-snowplow-ecommerce-4.6.8.tgz", - "integrity": "sha512-+rSCnsufFI9EilLu4vlkEgn3o9GO4QPi5Ys4MJOJy6CgYL+MYH0GI56PsZ8PAUeWK7CKGxqRHWpbwKgmQKaWaw==", "dev": true, "license": "BSD-3-Clause", "dependencies": { @@ -15487,8 +13002,6 @@ }, "node_modules/@snowplow/browser-tracker": { "version": "4.6.8", - "resolved": "https://registry.npmjs.org/@snowplow/browser-tracker/-/browser-tracker-4.6.8.tgz", - "integrity": "sha512-6MsXqzO3g1DvEuoPauY+xZqineIJlClq2JVQ3LlwCMeqK2Mu+bM6dhfTNwr4he7yf0ZmoZDKieM9Kwl43bpacg==", "dev": true, "license": "BSD-3-Clause", "peer": true, @@ -15500,8 +13013,6 @@ }, "node_modules/@snowplow/browser-tracker-core": { "version": "4.6.8", - "resolved": "https://registry.npmjs.org/@snowplow/browser-tracker-core/-/browser-tracker-core-4.6.8.tgz", - "integrity": "sha512-fHSSC0Ceyz5oxqei3rrxVWZtJX+nyu9y0F4dQos8osLHVqGspKuec1waZxN3z3TK9szF1rwf8qwdC6ZPCLisaw==", "dev": true, "license": "BSD-3-Clause", "dependencies": { @@ -15513,8 +13024,6 @@ }, "node_modules/@snowplow/tracker-core": { "version": "4.6.8", - "resolved": "https://registry.npmjs.org/@snowplow/tracker-core/-/tracker-core-4.6.8.tgz", - "integrity": "sha512-8r+ghEMN15tXnWORtIs90Q0d82rOrUDrPav7UQd+LhYXue6H2rpBwFx4dlHIlwhm1+2aUISUWN1Qoz0jd5Hz4g==", "dev": true, "license": "BSD-3-Clause", "dependencies": { @@ -15524,8 +13033,6 @@ }, "node_modules/@storybook/addon-docs": { "version": "10.2.14", - "resolved": "https://registry.npmjs.org/@storybook/addon-docs/-/addon-docs-10.2.14.tgz", - "integrity": "sha512-vUGw+zoodb91GIcDECZetXL8Bo0AJ/lYudcRBqtdw8taLXucss28Ev6u36dXggARYHPT8V0FhBkipzzJxssjUQ==", "dev": true, "license": "MIT", "dependencies": { @@ -15547,8 +13054,6 @@ }, "node_modules/@storybook/builder-vite": { "version": "10.2.14", - "resolved": "https://registry.npmjs.org/@storybook/builder-vite/-/builder-vite-10.2.14.tgz", - "integrity": "sha512-4b/opKbbTg+npeFXzj4GwZ7SDJdqsJbcJYxFpAznpl9FqMhP+ktH/7QSDs1DtOXpCanKcrmj6UQQgKR8OGypUQ==", "dev": true, "license": "MIT", "dependencies": { @@ -15566,8 +13071,6 @@ }, "node_modules/@storybook/csf-plugin": { "version": "10.2.14", - "resolved": "https://registry.npmjs.org/@storybook/csf-plugin/-/csf-plugin-10.2.14.tgz", - "integrity": "sha512-N4frSzhig3pkhaWdN0kAnhgEi9IGEy6rJnpuNAocS6d70fSahGQk958TMml2JCG3LLiVamuXySyUrVtFiHrxvg==", "dev": true, "license": "MIT", "dependencies": { @@ -15601,15 +13104,11 @@ }, "node_modules/@storybook/global": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@storybook/global/-/global-5.0.0.tgz", - "integrity": "sha512-FcOqPAXACP0I3oJ/ws6/rrPT9WGhu915Cg8D02a9YxLo0DE9zI+a9A5gRGvmQ09fiWPukqI8ZAEoQEdWUKMQdQ==", "dev": true, "license": "MIT" }, "node_modules/@storybook/icons": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@storybook/icons/-/icons-2.0.1.tgz", - "integrity": "sha512-/smVjw88yK3CKsiuR71vNgWQ9+NuY2L+e8X7IMrFjexjm6ZR8ULrV2DRkTA61aV6ryefslzHEGDInGpnNeIocg==", "license": "MIT", "peerDependencies": { "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", @@ -15618,8 +13117,6 @@ }, "node_modules/@storybook/react": { "version": "10.2.14", - "resolved": "https://registry.npmjs.org/@storybook/react/-/react-10.2.14.tgz", - "integrity": "sha512-GzbbsfyOeGpTqLoss6yyb9m7eYO7oXSV8cey+y0gxVplOmK8XISA8q0AtH7gWzw6pDUOaBpEfnrE/jgOOKwQlw==", "dev": true, "license": "MIT", "dependencies": { @@ -15645,8 +13142,6 @@ }, "node_modules/@storybook/react-dom-shim": { "version": "10.2.14", - "resolved": "https://registry.npmjs.org/@storybook/react-dom-shim/-/react-dom-shim-10.2.14.tgz", - "integrity": "sha512-hO/Yzhf3fX/HhB5MDc/ERM5QLA1+yLgnyt0a4NGDqeWeXQ90YSjEski1RppdAI9oNGyhNwWllZPUrozrL7ECyg==", "dev": true, "license": "MIT", "funding": { @@ -15661,8 +13156,6 @@ }, "node_modules/@storybook/react-vite": { "version": "10.2.14", - "resolved": "https://registry.npmjs.org/@storybook/react-vite/-/react-vite-10.2.14.tgz", - "integrity": "sha512-qfHkDjv0ElJFqhXN/uD+fuuMBVOI7xzJbMqLi9I4TKt4645B0P6X7s83oyLgU9y9xQEi4Dr2zSJq0VtNBe+VBg==", "dev": true, "license": "MIT", "dependencies": { @@ -15689,8 +13182,6 @@ }, "node_modules/@storybook/react-vite/node_modules/magic-string": { "version": "0.30.21", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", - "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", "dev": true, "license": "MIT", "dependencies": { @@ -15699,8 +13190,6 @@ }, "node_modules/@svgr/babel-plugin-add-jsx-attribute": { "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-8.0.0.tgz", - "integrity": "sha512-b9MIk7yhdS1pMCZM8VeNfUlSKVRhsHZNMl5O9SfaX0l0t5wjdgu4IDzGB8bpnGBBOjGST3rRFVsaaEtI4W6f7g==", "license": "MIT", "engines": { "node": ">=14" @@ -15715,8 +13204,6 @@ }, "node_modules/@svgr/babel-plugin-remove-jsx-attribute": { "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-attribute/-/babel-plugin-remove-jsx-attribute-8.0.0.tgz", - "integrity": "sha512-BcCkm/STipKvbCl6b7QFrMh/vx00vIP63k2eM66MfHJzPr6O2U0jYEViXkHJWqXqQYjdeA9cuCl5KWmlwjDvbA==", "license": "MIT", "engines": { "node": ">=14" @@ -15731,8 +13218,6 @@ }, "node_modules/@svgr/babel-plugin-remove-jsx-empty-expression": { "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-empty-expression/-/babel-plugin-remove-jsx-empty-expression-8.0.0.tgz", - "integrity": "sha512-5BcGCBfBxB5+XSDSWnhTThfI9jcO5f0Ai2V24gZpG+wXF14BzwxxdDb4g6trdOux0rhibGs385BeFMSmxtS3uA==", "license": "MIT", "engines": { "node": ">=14" @@ -15747,8 +13232,6 @@ }, "node_modules/@svgr/babel-plugin-replace-jsx-attribute-value": { "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-8.0.0.tgz", - "integrity": "sha512-KVQ+PtIjb1BuYT3ht8M5KbzWBhdAjjUPdlMtpuw/VjT8coTrItWX6Qafl9+ji831JaJcu6PJNKCV0bp01lBNzQ==", "license": "MIT", "engines": { "node": ">=14" @@ -15763,8 +13246,6 @@ }, "node_modules/@svgr/babel-plugin-svg-dynamic-title": { "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-8.0.0.tgz", - "integrity": "sha512-omNiKqwjNmOQJ2v6ge4SErBbkooV2aAWwaPFs2vUY7p7GhVkzRkJ00kILXQvRhA6miHnNpXv7MRnnSjdRjK8og==", "license": "MIT", "engines": { "node": ">=14" @@ -15779,8 +13260,6 @@ }, "node_modules/@svgr/babel-plugin-svg-em-dimensions": { "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-8.0.0.tgz", - "integrity": "sha512-mURHYnu6Iw3UBTbhGwE/vsngtCIbHE43xCRK7kCw4t01xyGqb2Pd+WXekRRoFOBIY29ZoOhUCTEweDMdrjfi9g==", "license": "MIT", "engines": { "node": ">=14" @@ -15795,8 +13274,6 @@ }, "node_modules/@svgr/babel-plugin-transform-react-native-svg": { "version": "8.1.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-8.1.0.tgz", - "integrity": "sha512-Tx8T58CHo+7nwJ+EhUwx3LfdNSG9R2OKfaIXXs5soiy5HtgoAEkDay9LIimLOcG8dJQH1wPZp/cnAv6S9CrR1Q==", "license": "MIT", "engines": { "node": ">=14" @@ -15811,8 +13288,6 @@ }, "node_modules/@svgr/babel-plugin-transform-svg-component": { "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-8.0.0.tgz", - "integrity": "sha512-DFx8xa3cZXTdb/k3kfPeaixecQLgKh5NVBMwD0AQxOzcZawK4oo1Jh9LbrcACUivsCA7TLG8eeWgrDXjTMhRmw==", "license": "MIT", "engines": { "node": ">=12" @@ -15827,8 +13302,6 @@ }, "node_modules/@svgr/babel-preset": { "version": "8.1.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-preset/-/babel-preset-8.1.0.tgz", - "integrity": "sha512-7EYDbHE7MxHpv4sxvnVPngw5fuR6pw79SkcrILHJ/iMpuKySNCl5W1qcwPEpU+LgyRXOaAFgH0KhwD18wwg6ug==", "license": "MIT", "dependencies": { "@svgr/babel-plugin-add-jsx-attribute": "8.0.0", @@ -15853,8 +13326,6 @@ }, "node_modules/@svgr/core": { "version": "8.1.0", - "resolved": "https://registry.npmjs.org/@svgr/core/-/core-8.1.0.tgz", - "integrity": "sha512-8QqtOQT5ACVlmsvKOJNEaWmRPmcojMOzCz4Hs2BGG/toAp/K38LcsMRyLp349glq5AzJbCEeimEoxaX6v/fLrA==", "license": "MIT", "dependencies": { "@babel/core": "^7.21.3", @@ -15873,8 +13344,6 @@ }, "node_modules/@svgr/hast-util-to-babel-ast": { "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-8.0.0.tgz", - "integrity": "sha512-EbDKwO9GpfWP4jN9sGdYwPBU0kdomaPIL2Eu4YwmgP+sJeXT+L7bMwJUBnhzfH8Q2qMBqZ4fJwpCyYsAN3mt2Q==", "license": "MIT", "dependencies": { "@babel/types": "^7.21.3", @@ -15890,8 +13359,6 @@ }, "node_modules/@svgr/plugin-jsx": { "version": "8.1.0", - "resolved": "https://registry.npmjs.org/@svgr/plugin-jsx/-/plugin-jsx-8.1.0.tgz", - "integrity": "sha512-0xiIyBsLlr8quN+WyuxooNW9RJ0Dpr8uOnH/xrCVO8GLUcwHISwj1AG0k+LFzteTkAA0GbX0kj9q6Dk70PTiPA==", "license": "MIT", "dependencies": { "@babel/core": "^7.21.3", @@ -15912,8 +13379,6 @@ }, "node_modules/@svgr/plugin-svgo": { "version": "8.1.0", - "resolved": "https://registry.npmjs.org/@svgr/plugin-svgo/-/plugin-svgo-8.1.0.tgz", - "integrity": "sha512-Ywtl837OGO9pTLIN/onoWLmDQ4zFUycI1g76vuKGEz6evR/ZTJlJuz3G/fIkb6OVBJ2g0o6CGJzaEjfmEo3AHA==", "license": "MIT", "dependencies": { "cosmiconfig": "^8.1.3", @@ -15933,8 +13398,6 @@ }, "node_modules/@svgr/webpack": { "version": "8.1.0", - "resolved": "https://registry.npmjs.org/@svgr/webpack/-/webpack-8.1.0.tgz", - "integrity": "sha512-LnhVjMWyMQV9ZmeEy26maJk+8HTIbd59cH4F2MJ439k9DqejRisfFNGAPvRYlKETuh9LrImlS8aKsBgKjMA8WA==", "license": "MIT", "dependencies": { "@babel/core": "^7.21.3", @@ -15956,8 +13419,6 @@ }, "node_modules/@swc/core": { "version": "1.15.18", - "resolved": "https://registry.npmjs.org/@swc/core/-/core-1.15.18.tgz", - "integrity": "sha512-z87aF9GphWp//fnkRsqvtY+inMVPgYW3zSlXH1kJFvRT5H/wiAn+G32qW5l3oEk63KSF1x3Ov0BfHCObAmT8RA==", "hasInstallScript": true, "license": "Apache-2.0", "dependencies": { @@ -16042,8 +13503,6 @@ }, "node_modules/@swc/core-linux-arm64-gnu": { "version": "1.15.18", - "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.15.18.tgz", - "integrity": "sha512-3xnctOBLIq3kj8PxOCgPrGjBLP/kNOddr6f5gukYt/1IZxsITQaU9TDyjeX6jG+FiCIHjCuWuffsyQDL5Ew1bg==", "cpu": [ "arm64" ], @@ -16058,8 +13517,6 @@ }, "node_modules/@swc/core-linux-arm64-musl": { "version": "1.15.18", - "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.15.18.tgz", - "integrity": "sha512-0a+Lix+FSSHBSBOA0XznCcHo5/1nA6oLLjcnocvzXeqtdjnPb+SvchItHI+lfeiuj1sClYPDvPMLSLyXFaiIKw==", "cpu": [ "arm64" ], @@ -16154,14 +13611,10 @@ }, "node_modules/@swc/counter": { "version": "0.1.3", - "resolved": "https://registry.npmjs.org/@swc/counter/-/counter-0.1.3.tgz", - "integrity": "sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==", "license": "Apache-2.0" }, "node_modules/@swc/helpers": { "version": "0.5.21", - "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.21.tgz", - "integrity": "sha512-jI/VAmtdjB/RnI8GTnokyX7Ug8c+g+ffD6QRLa6XQewtnGyukKkKSk3wLTM3b5cjt1jNh9x0jfVlagdN2gDKQg==", "license": "Apache-2.0", "dependencies": { "tslib": "^2.8.0" @@ -16169,8 +13622,6 @@ }, "node_modules/@swc/html": { "version": "1.15.18", - "resolved": "https://registry.npmjs.org/@swc/html/-/html-1.15.18.tgz", - "integrity": "sha512-7yT0LGv2eqVcgnKts1cHC/gDnDN8aRONO4FblhZxq+dWOQOP/WiDWcFHNOPGpS4/K0lWbDhEWmvEV2tO1k1prA==", "devOptional": true, "license": "Apache-2.0", "dependencies": { @@ -16242,8 +13693,6 @@ }, "node_modules/@swc/html-linux-arm64-gnu": { "version": "1.15.18", - "resolved": "https://registry.npmjs.org/@swc/html-linux-arm64-gnu/-/html-linux-arm64-gnu-1.15.18.tgz", - "integrity": "sha512-ZN1XAa3b+Z2+rXAXHH2uD91qP0nH+HdUuTwYzmXvl32NE3WrvDKzRnvVYGXnd/Ie4h0RN+pwidwx8xVdMqnf4A==", "cpu": [ "arm64" ], @@ -16258,8 +13707,6 @@ }, "node_modules/@swc/html-linux-arm64-musl": { "version": "1.15.18", - "resolved": "https://registry.npmjs.org/@swc/html-linux-arm64-musl/-/html-linux-arm64-musl-1.15.18.tgz", - "integrity": "sha512-k68qbhckqYLy7tFW+CsMN7Fw5LxCj2l+cbw1zB8g7rFzEP/19Yr9x8ZTNTSHQYk5b7Soe1fyug9JsIicqV4HQA==", "cpu": [ "arm64" ], @@ -16354,8 +13801,6 @@ }, "node_modules/@swc/jest": { "version": "0.2.39", - "resolved": "https://registry.npmjs.org/@swc/jest/-/jest-0.2.39.tgz", - "integrity": "sha512-eyokjOwYd0Q8RnMHri+8/FS1HIrIUKK/sRrFp8c1dThUOfNeCWbLmBP1P5VsKdvmkd25JaH+OKYwEYiAYg9YAA==", "license": "MIT", "dependencies": { "@jest/create-cache-key-function": "^30.0.0", @@ -16371,8 +13816,6 @@ }, "node_modules/@swc/types": { "version": "0.1.25", - "resolved": "https://registry.npmjs.org/@swc/types/-/types-0.1.25.tgz", - "integrity": "sha512-iAoY/qRhNH8a/hBvm3zKj9qQ4oc2+3w1unPJa2XvTK3XjeLXtzcCingVPw/9e5mn1+0yPqxcBGp9Jf0pkfMb1g==", "license": "Apache-2.0", "dependencies": { "@swc/counter": "^0.1.3" @@ -16380,8 +13823,6 @@ }, "node_modules/@szmarczak/http-timer": { "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-5.0.1.tgz", - "integrity": "sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw==", "license": "MIT", "dependencies": { "defer-to-connect": "^2.0.1" @@ -16392,8 +13833,6 @@ }, "node_modules/@tailwindcss/aspect-ratio": { "version": "0.4.2", - "resolved": "https://registry.npmjs.org/@tailwindcss/aspect-ratio/-/aspect-ratio-0.4.2.tgz", - "integrity": "sha512-8QPrypskfBa7QIMuKHg2TA7BqES6vhBrDLOv8Unb6FcFyd3TjKbc6lcmb9UPQHxfl24sXoJ41ux/H7qQQvfaSQ==", "dev": true, "license": "MIT", "peerDependencies": { @@ -16402,8 +13841,6 @@ }, "node_modules/@tailwindcss/forms": { "version": "0.5.11", - "resolved": "https://registry.npmjs.org/@tailwindcss/forms/-/forms-0.5.11.tgz", - "integrity": "sha512-h9wegbZDPurxG22xZSoWtdzc41/OlNEUQERNqI/0fOwa2aVlWGu7C35E/x6LDyD3lgtztFSSjKZyuVM0hxhbgA==", "dev": true, "license": "MIT", "dependencies": { @@ -16415,8 +13852,6 @@ }, "node_modules/@tailwindcss/node": { "version": "4.2.1", - "resolved": "https://registry.npmjs.org/@tailwindcss/node/-/node-4.2.1.tgz", - "integrity": "sha512-jlx6sLk4EOwO6hHe1oCGm1Q4AN/s0rSrTTPBGPM0/RQ6Uylwq17FuU8IeJJKEjtc6K6O07zsvP+gDO6MMWo7pg==", "dev": true, "license": "MIT", "dependencies": { @@ -16431,8 +13866,6 @@ }, "node_modules/@tailwindcss/node/node_modules/jiti": { "version": "2.6.1", - "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.6.1.tgz", - "integrity": "sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==", "dev": true, "license": "MIT", "bin": { @@ -16441,8 +13874,6 @@ }, "node_modules/@tailwindcss/node/node_modules/magic-string": { "version": "0.30.21", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", - "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", "dev": true, "license": "MIT", "dependencies": { @@ -16451,8 +13882,6 @@ }, "node_modules/@tailwindcss/oxide": { "version": "4.2.1", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide/-/oxide-4.2.1.tgz", - "integrity": "sha512-yv9jeEFWnjKCI6/T3Oq50yQEOqmpmpfzG1hcZsAOaXFQPfzWprWrlHSdGPEF3WQTi8zu8ohC9Mh9J470nT5pUw==", "dev": true, "license": "MIT", "engines": { @@ -16560,8 +13989,6 @@ }, "node_modules/@tailwindcss/oxide-linux-arm64-gnu": { "version": "4.2.1", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-gnu/-/oxide-linux-arm64-gnu-4.2.1.tgz", - "integrity": "sha512-CTrwomI+c7n6aSSQlsPL0roRiNMDQ/YzMD9EjcR+H4f0I1SQ8QqIuPnsVp7QgMkC1Qi8rtkekLkOFjo7OlEFRQ==", "cpu": [ "arm64" ], @@ -16577,8 +14004,6 @@ }, "node_modules/@tailwindcss/oxide-linux-arm64-musl": { "version": "4.2.1", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-musl/-/oxide-linux-arm64-musl-4.2.1.tgz", - "integrity": "sha512-WZA0CHRL/SP1TRbA5mp9htsppSEkWuQ4KsSUumYQnyl8ZdT39ntwqmz4IUHGN6p4XdSlYfJwM4rRzZLShHsGAQ==", "cpu": [ "arm64" ], @@ -16626,100 +14051,6 @@ "node": ">= 20" } }, - "node_modules/@tailwindcss/oxide-wasm32-wasi": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-wasm32-wasi/-/oxide-wasm32-wasi-4.2.1.tgz", - "integrity": "sha512-MGFB5cVPvshR85MTJkEvqDUnuNoysrsRxd6vnk1Lf2tbiqNlXpHYZqkqOQalydienEWOHHFyyuTSYRsLfxFJ2Q==", - "bundleDependencies": [ - "@napi-rs/wasm-runtime", - "@emnapi/core", - "@emnapi/runtime", - "@tybys/wasm-util", - "@emnapi/wasi-threads", - "tslib" - ], - "cpu": [ - "wasm32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "@emnapi/core": "^1.8.1", - "@emnapi/runtime": "^1.8.1", - "@emnapi/wasi-threads": "^1.1.0", - "@napi-rs/wasm-runtime": "^1.1.1", - "@tybys/wasm-util": "^0.10.1", - "tslib": "^2.8.1" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@tailwindcss/oxide-wasm32-wasi/node_modules/@emnapi/core": { - "version": "1.8.1", - "dev": true, - "inBundle": true, - "license": "MIT", - "optional": true, - "dependencies": { - "@emnapi/wasi-threads": "1.1.0", - "tslib": "^2.4.0" - } - }, - "node_modules/@tailwindcss/oxide-wasm32-wasi/node_modules/@emnapi/runtime": { - "version": "1.8.1", - "dev": true, - "inBundle": true, - "license": "MIT", - "optional": true, - "dependencies": { - "tslib": "^2.4.0" - } - }, - "node_modules/@tailwindcss/oxide-wasm32-wasi/node_modules/@emnapi/wasi-threads": { - "version": "1.1.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "optional": true, - "dependencies": { - "tslib": "^2.4.0" - } - }, - "node_modules/@tailwindcss/oxide-wasm32-wasi/node_modules/@napi-rs/wasm-runtime": { - "version": "1.1.1", - "dev": true, - "inBundle": true, - "license": "MIT", - "optional": true, - "dependencies": { - "@emnapi/core": "^1.7.1", - "@emnapi/runtime": "^1.7.1", - "@tybys/wasm-util": "^0.10.1" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/Brooooooklyn" - } - }, - "node_modules/@tailwindcss/oxide-wasm32-wasi/node_modules/@tybys/wasm-util": { - "version": "0.10.1", - "dev": true, - "inBundle": true, - "license": "MIT", - "optional": true, - "dependencies": { - "tslib": "^2.4.0" - } - }, - "node_modules/@tailwindcss/oxide-wasm32-wasi/node_modules/tslib": { - "version": "2.8.1", - "dev": true, - "inBundle": true, - "license": "0BSD", - "optional": true - }, "node_modules/@tailwindcss/oxide-win32-arm64-msvc": { "version": "4.2.1", "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-arm64-msvc/-/oxide-win32-arm64-msvc-4.2.1.tgz", @@ -16756,8 +14087,6 @@ }, "node_modules/@tailwindcss/postcss": { "version": "4.2.1", - "resolved": "https://registry.npmjs.org/@tailwindcss/postcss/-/postcss-4.2.1.tgz", - "integrity": "sha512-OEwGIBnXnj7zJeonOh6ZG9woofIjGrd2BORfvE5p9USYKDCZoQmfqLcfNiRWoJlRWLdNPn2IgVZuWAOM4iTYMw==", "dev": true, "license": "MIT", "dependencies": { @@ -16770,8 +14099,6 @@ }, "node_modules/@tailwindcss/typography": { "version": "0.5.19", - "resolved": "https://registry.npmjs.org/@tailwindcss/typography/-/typography-0.5.19.tgz", - "integrity": "sha512-w31dd8HOx3k9vPtcQh5QHP9GwKcgbMp87j58qi6xgiBnFFtKEAgCWnDw4qUT8aHwkCp8bKvb/KGKWWHedP0AAg==", "dev": true, "license": "MIT", "dependencies": { @@ -16783,8 +14110,6 @@ }, "node_modules/@testing-library/dom": { "version": "10.4.1", - "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-10.4.1.tgz", - "integrity": "sha512-o4PXJQidqJl82ckFaXUeoAW+XysPLauYI43Abki5hABd853iMhitooc6znOnczgbTYmEP6U6/y1ZyKAIsvMKGg==", "dev": true, "license": "MIT", "peer": true, @@ -16804,8 +14129,6 @@ }, "node_modules/@testing-library/jest-dom": { "version": "6.9.1", - "resolved": "https://registry.npmjs.org/@testing-library/jest-dom/-/jest-dom-6.9.1.tgz", - "integrity": "sha512-zIcONa+hVtVSSep9UT3jZ5rizo2BsxgyDYU7WFD5eICBE7no3881HGeb/QkGfsJs6JTkY1aQhT7rIPC7e+0nnA==", "license": "MIT", "dependencies": { "@adobe/css-tools": "^4.4.0", @@ -16823,14 +14146,10 @@ }, "node_modules/@testing-library/jest-dom/node_modules/dom-accessibility-api": { "version": "0.6.3", - "resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.6.3.tgz", - "integrity": "sha512-7ZgogeTnjuHbo+ct10G9Ffp0mif17idi0IyWNVA/wcwcm7NPOD/WEHVP3n7n3MhXqxoIYm8d6MuZohYWIZ4T3w==", "license": "MIT" }, "node_modules/@testing-library/react": { "version": "16.3.2", - "resolved": "https://registry.npmjs.org/@testing-library/react/-/react-16.3.2.tgz", - "integrity": "sha512-XU5/SytQM+ykqMnAnvB2umaJNIOsLF3PVv//1Ew4CTcpz0/BRyy/af40qqrt7SjKpDdT1saBMc42CUok5gaw+g==", "dev": true, "license": "MIT", "dependencies": { @@ -16857,8 +14176,6 @@ }, "node_modules/@testing-library/user-event": { "version": "14.6.1", - "resolved": "https://registry.npmjs.org/@testing-library/user-event/-/user-event-14.6.1.tgz", - "integrity": "sha512-vq7fv0rnt+QTXgPxr5Hjc210p6YKq2kmdziLgnsZGgLJ9e6VAShx1pACLuRjd/AS/sr7phAR58OIIpf0LlmQNw==", "dev": true, "license": "MIT", "engines": { @@ -16871,8 +14188,6 @@ }, "node_modules/@tootallnate/once": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", - "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==", "license": "MIT", "engines": { "node": ">= 10" @@ -16880,8 +14195,6 @@ }, "node_modules/@trysound/sax": { "version": "0.2.0", - "resolved": "https://registry.npmjs.org/@trysound/sax/-/sax-0.2.0.tgz", - "integrity": "sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==", "license": "ISC", "engines": { "node": ">=10.13.0" @@ -16889,36 +14202,26 @@ }, "node_modules/@tsconfig/node10": { "version": "1.0.12", - "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.12.tgz", - "integrity": "sha512-UCYBaeFvM11aU2y3YPZ//O5Rhj+xKyzy7mvcIoAjASbigy8mHMryP5cK7dgjlz2hWxh1g5pLw084E0a/wlUSFQ==", "devOptional": true, "license": "MIT" }, "node_modules/@tsconfig/node12": { "version": "1.0.11", - "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", - "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", "devOptional": true, "license": "MIT" }, "node_modules/@tsconfig/node14": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", - "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", "devOptional": true, "license": "MIT" }, "node_modules/@tsconfig/node16": { "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz", - "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==", "devOptional": true, "license": "MIT" }, "node_modules/@tufjs/canonical-json": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@tufjs/canonical-json/-/canonical-json-2.0.0.tgz", - "integrity": "sha512-yVtV8zsdo8qFHe+/3kw81dSLyF7D576A5cCFCi4X7B39tWT7SekaEFUnvnWJHz+9qO7qJTah1JbrDjWKqFtdWA==", "license": "MIT", "engines": { "node": "^16.14.0 || >=18.0.0" @@ -16926,8 +14229,6 @@ }, "node_modules/@tufjs/models": { "version": "4.1.0", - "resolved": "https://registry.npmjs.org/@tufjs/models/-/models-4.1.0.tgz", - "integrity": "sha512-Y8cK9aggNRsqJVaKUlEYs4s7CvQ1b1ta2DVPyAimb0I2qhzjNk+A+mxvll/klL0RlfuIUei8BF7YWiua4kQqww==", "license": "MIT", "dependencies": { "@tufjs/canonical-json": "2.0.0", @@ -16937,35 +14238,19 @@ "node": "^20.17.0 || >=22.9.0" } }, - "node_modules/@tybys/wasm-util": { - "version": "0.10.1", - "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.1.tgz", - "integrity": "sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg==", - "license": "MIT", - "optional": true, - "dependencies": { - "tslib": "^2.4.0" - } - }, "node_modules/@types/aria-query": { "version": "5.0.4", - "resolved": "https://registry.npmjs.org/@types/aria-query/-/aria-query-5.0.4.tgz", - "integrity": "sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==", "dev": true, "license": "MIT", "peer": true }, "node_modules/@types/aws-lambda": { "version": "8.10.161", - "resolved": "https://registry.npmjs.org/@types/aws-lambda/-/aws-lambda-8.10.161.tgz", - "integrity": "sha512-rUYdp+MQwSFocxIOcSsYSF3YYYC/uUpMbCY/mbO21vGqfrEYvNSoPyKYDj6RhXXpPfS0KstW9RwG3qXh9sL7FQ==", "dev": true, "license": "MIT" }, "node_modules/@types/babel__core": { "version": "7.20.5", - "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", - "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", "license": "MIT", "dependencies": { "@babel/parser": "^7.20.7", @@ -16977,8 +14262,6 @@ }, "node_modules/@types/babel__generator": { "version": "7.27.0", - "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.27.0.tgz", - "integrity": "sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==", "license": "MIT", "dependencies": { "@babel/types": "^7.0.0" @@ -16986,8 +14269,6 @@ }, "node_modules/@types/babel__template": { "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", - "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", "license": "MIT", "dependencies": { "@babel/parser": "^7.1.0", @@ -16996,8 +14277,6 @@ }, "node_modules/@types/babel__traverse": { "version": "7.28.0", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.28.0.tgz", - "integrity": "sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==", "license": "MIT", "dependencies": { "@babel/types": "^7.28.2" @@ -17005,8 +14284,6 @@ }, "node_modules/@types/better-sqlite3": { "version": "7.6.13", - "resolved": "https://registry.npmjs.org/@types/better-sqlite3/-/better-sqlite3-7.6.13.tgz", - "integrity": "sha512-NMv9ASNARoKksWtsq/SHakpYAYnhBrQgGD8zkLYk/jaK8jUGn08CfEdTRgYhMypUQAfzSP8W6gNLe0q19/t4VA==", "dev": true, "license": "MIT", "dependencies": { @@ -17015,8 +14292,6 @@ }, "node_modules/@types/body-parser": { "version": "1.19.6", - "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.6.tgz", - "integrity": "sha512-HLFeCYgz89uk22N5Qg3dvGvsv46B8GLvKKo1zKG4NybA8U2DiEO3w9lqGg29t/tfLRJpJ6iQxnVw4OnB7MoM9g==", "license": "MIT", "dependencies": { "@types/connect": "*", @@ -17025,8 +14300,6 @@ }, "node_modules/@types/bonjour": { "version": "3.5.13", - "resolved": "https://registry.npmjs.org/@types/bonjour/-/bonjour-3.5.13.tgz", - "integrity": "sha512-z9fJ5Im06zvUL548KvYNecEVlA7cVDkGUi6kZusb04mpyEFKCIZJvloCcmpmLaIahDpOQGHaHmG6imtPMmPXGQ==", "license": "MIT", "dependencies": { "@types/node": "*" @@ -17034,8 +14307,6 @@ }, "node_modules/@types/chai": { "version": "5.2.3", - "resolved": "https://registry.npmjs.org/@types/chai/-/chai-5.2.3.tgz", - "integrity": "sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA==", "dev": true, "license": "MIT", "dependencies": { @@ -17045,20 +14316,14 @@ }, "node_modules/@types/command-line-args": { "version": "5.2.3", - "resolved": "https://registry.npmjs.org/@types/command-line-args/-/command-line-args-5.2.3.tgz", - "integrity": "sha512-uv0aG6R0Y8WHZLTamZwtfsDLVRnOa+n+n5rEvFWL5Na5gZ8V2Teab/duDPFzIIIhs9qizDpcavCusCLJZu62Kw==", "license": "MIT" }, "node_modules/@types/command-line-usage": { "version": "5.0.4", - "resolved": "https://registry.npmjs.org/@types/command-line-usage/-/command-line-usage-5.0.4.tgz", - "integrity": "sha512-BwR5KP3Es/CSht0xqBcUXS3qCAUVXwpRKsV2+arxeb65atasuXG9LykC9Ab10Cw3s2raH92ZqOeILaQbsB2ACg==", "license": "MIT" }, "node_modules/@types/concat-stream": { "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@types/concat-stream/-/concat-stream-2.0.3.tgz", - "integrity": "sha512-3qe4oQAPNwVNwK4C9c8u+VJqv9kez+2MR4qJpoPFfXtgxxif1QbFusvXzK0/Wra2VX07smostI2VMmJNSpZjuQ==", "dev": true, "license": "MIT", "dependencies": { @@ -17067,8 +14332,6 @@ }, "node_modules/@types/connect": { "version": "3.4.38", - "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz", - "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==", "license": "MIT", "dependencies": { "@types/node": "*" @@ -17076,8 +14339,6 @@ }, "node_modules/@types/connect-history-api-fallback": { "version": "1.5.4", - "resolved": "https://registry.npmjs.org/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.5.4.tgz", - "integrity": "sha512-n6Cr2xS1h4uAulPRdlw6Jl6s1oG8KrVilPN2yUITEs+K48EzMJJ3W1xy8K5eWuFvjp3R74AOIGSmp2UfBJ8HFw==", "license": "MIT", "dependencies": { "@types/express-serve-static-core": "*", @@ -17086,8 +14347,6 @@ }, "node_modules/@types/cors": { "version": "2.8.19", - "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.19.tgz", - "integrity": "sha512-mFNylyeyqN93lfe/9CSxOGREz8cpzAhH+E93xJ4xWQf62V8sQ/24reV2nyzUWM6H6Xji+GGHpkbLe7pVoUEskg==", "dev": true, "license": "MIT", "dependencies": { @@ -17096,14 +14355,10 @@ }, "node_modules/@types/css-font-loading-module": { "version": "0.0.7", - "resolved": "https://registry.npmjs.org/@types/css-font-loading-module/-/css-font-loading-module-0.0.7.tgz", - "integrity": "sha512-nl09VhutdjINdWyXxHWN/w9zlNCfr60JUqJbd24YXUuCwgeL0TpFSdElCwb6cxfB6ybE19Gjj4g0jsgkXxKv1Q==", "license": "MIT" }, "node_modules/@types/d3": { "version": "7.4.3", - "resolved": "https://registry.npmjs.org/@types/d3/-/d3-7.4.3.tgz", - "integrity": "sha512-lZXZ9ckh5R8uiFVt8ogUNf+pIrK4EsWrx2Np75WvF/eTpJ0FMHNhjXk8CKEx/+gpHbNQyJWehbFaTvqmHWB3ww==", "license": "MIT", "dependencies": { "@types/d3-array": "*", @@ -17140,14 +14395,10 @@ }, "node_modules/@types/d3-array": { "version": "3.2.2", - "resolved": "https://registry.npmjs.org/@types/d3-array/-/d3-array-3.2.2.tgz", - "integrity": "sha512-hOLWVbm7uRza0BYXpIIW5pxfrKe0W+D5lrFiAEYR+pb6w3N2SwSMaJbXdUfSEv+dT4MfHBLtn5js0LAWaO6otw==", "license": "MIT" }, "node_modules/@types/d3-axis": { "version": "3.0.6", - "resolved": "https://registry.npmjs.org/@types/d3-axis/-/d3-axis-3.0.6.tgz", - "integrity": "sha512-pYeijfZuBd87T0hGn0FO1vQ/cgLk6E1ALJjfkC0oJ8cbwkZl3TpgS8bVBLZN+2jjGgg38epgxb2zmoGtSfvgMw==", "license": "MIT", "dependencies": { "@types/d3-selection": "*" @@ -17155,8 +14406,6 @@ }, "node_modules/@types/d3-brush": { "version": "3.0.6", - "resolved": "https://registry.npmjs.org/@types/d3-brush/-/d3-brush-3.0.6.tgz", - "integrity": "sha512-nH60IZNNxEcrh6L1ZSMNA28rj27ut/2ZmI3r96Zd+1jrZD++zD3LsMIjWlvg4AYrHn/Pqz4CF3veCxGjtbqt7A==", "license": "MIT", "dependencies": { "@types/d3-selection": "*" @@ -17164,20 +14413,14 @@ }, "node_modules/@types/d3-chord": { "version": "3.0.6", - "resolved": "https://registry.npmjs.org/@types/d3-chord/-/d3-chord-3.0.6.tgz", - "integrity": "sha512-LFYWWd8nwfwEmTZG9PfQxd17HbNPksHBiJHaKuY1XeqscXacsS2tyoo6OdRsjf+NQYeB6XrNL3a25E3gH69lcg==", "license": "MIT" }, "node_modules/@types/d3-color": { "version": "3.1.3", - "resolved": "https://registry.npmjs.org/@types/d3-color/-/d3-color-3.1.3.tgz", - "integrity": "sha512-iO90scth9WAbmgv7ogoq57O9YpKmFBbmoEoCHDB2xMBY0+/KVrqAaCDyCE16dUspeOvIxFFRI+0sEtqDqy2b4A==", "license": "MIT" }, "node_modules/@types/d3-contour": { "version": "3.0.6", - "resolved": "https://registry.npmjs.org/@types/d3-contour/-/d3-contour-3.0.6.tgz", - "integrity": "sha512-BjzLgXGnCWjUSYGfH1cpdo41/hgdWETu4YxpezoztawmqsvCeep+8QGfiY6YbDvfgHz/DkjeIkkZVJavB4a3rg==", "license": "MIT", "dependencies": { "@types/d3-array": "*", @@ -17186,20 +14429,14 @@ }, "node_modules/@types/d3-delaunay": { "version": "6.0.4", - "resolved": "https://registry.npmjs.org/@types/d3-delaunay/-/d3-delaunay-6.0.4.tgz", - "integrity": "sha512-ZMaSKu4THYCU6sV64Lhg6qjf1orxBthaC161plr5KuPHo3CNm8DTHiLw/5Eq2b6TsNP0W0iJrUOFscY6Q450Hw==", "license": "MIT" }, "node_modules/@types/d3-dispatch": { "version": "3.0.7", - "resolved": "https://registry.npmjs.org/@types/d3-dispatch/-/d3-dispatch-3.0.7.tgz", - "integrity": "sha512-5o9OIAdKkhN1QItV2oqaE5KMIiXAvDWBDPrD85e58Qlz1c1kI/J0NcqbEG88CoTwJrYe7ntUCVfeUl2UJKbWgA==", "license": "MIT" }, "node_modules/@types/d3-drag": { "version": "3.0.7", - "resolved": "https://registry.npmjs.org/@types/d3-drag/-/d3-drag-3.0.7.tgz", - "integrity": "sha512-HE3jVKlzU9AaMazNufooRJ5ZpWmLIoc90A37WU2JMmeq28w1FQqCZswHZ3xR+SuxYftzHq6WU6KJHvqxKzTxxQ==", "license": "MIT", "dependencies": { "@types/d3-selection": "*" @@ -17207,20 +14444,14 @@ }, "node_modules/@types/d3-dsv": { "version": "3.0.7", - "resolved": "https://registry.npmjs.org/@types/d3-dsv/-/d3-dsv-3.0.7.tgz", - "integrity": "sha512-n6QBF9/+XASqcKK6waudgL0pf/S5XHPPI8APyMLLUHd8NqouBGLsU8MgtO7NINGtPBtk9Kko/W4ea0oAspwh9g==", "license": "MIT" }, "node_modules/@types/d3-ease": { "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@types/d3-ease/-/d3-ease-3.0.2.tgz", - "integrity": "sha512-NcV1JjO5oDzoK26oMzbILE6HW7uVXOHLQvHshBUW4UMdZGfiY6v5BeQwh9a9tCzv+CeefZQHJt5SRgK154RtiA==", "license": "MIT" }, "node_modules/@types/d3-fetch": { "version": "3.0.7", - "resolved": "https://registry.npmjs.org/@types/d3-fetch/-/d3-fetch-3.0.7.tgz", - "integrity": "sha512-fTAfNmxSb9SOWNB9IoG5c8Hg6R+AzUHDRlsXsDZsNp6sxAEOP0tkP3gKkNSO/qmHPoBFTxNrjDprVHDQDvo5aA==", "license": "MIT", "dependencies": { "@types/d3-dsv": "*" @@ -17228,20 +14459,14 @@ }, "node_modules/@types/d3-force": { "version": "3.0.10", - "resolved": "https://registry.npmjs.org/@types/d3-force/-/d3-force-3.0.10.tgz", - "integrity": "sha512-ZYeSaCF3p73RdOKcjj+swRlZfnYpK1EbaDiYICEEp5Q6sUiqFaFQ9qgoshp5CzIyyb/yD09kD9o2zEltCexlgw==", "license": "MIT" }, "node_modules/@types/d3-format": { "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@types/d3-format/-/d3-format-3.0.4.tgz", - "integrity": "sha512-fALi2aI6shfg7vM5KiR1wNJnZ7r6UuggVqtDA+xiEdPZQwy/trcQaHnwShLuLdta2rTymCNpxYTiMZX/e09F4g==", "license": "MIT" }, "node_modules/@types/d3-geo": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@types/d3-geo/-/d3-geo-3.1.0.tgz", - "integrity": "sha512-856sckF0oP/diXtS4jNsiQw/UuK5fQG8l/a9VVLeSouf1/PPbBE1i1W852zVwKwYCBkFJJB7nCFTbk6UMEXBOQ==", "license": "MIT", "dependencies": { "@types/geojson": "*" @@ -17249,14 +14474,10 @@ }, "node_modules/@types/d3-hierarchy": { "version": "3.1.7", - "resolved": "https://registry.npmjs.org/@types/d3-hierarchy/-/d3-hierarchy-3.1.7.tgz", - "integrity": "sha512-tJFtNoYBtRtkNysX1Xq4sxtjK8YgoWUNpIiUee0/jHGRwqvzYxkq0hGVbbOGSz+JgFxxRu4K8nb3YpG3CMARtg==", "license": "MIT" }, "node_modules/@types/d3-interpolate": { "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@types/d3-interpolate/-/d3-interpolate-3.0.4.tgz", - "integrity": "sha512-mgLPETlrpVV1YRJIglr4Ez47g7Yxjl1lj7YKsiMCb27VJH9W8NVM6Bb9d8kkpG/uAQS5AmbA48q2IAolKKo1MA==", "license": "MIT", "dependencies": { "@types/d3-color": "*" @@ -17264,32 +14485,22 @@ }, "node_modules/@types/d3-path": { "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@types/d3-path/-/d3-path-3.1.1.tgz", - "integrity": "sha512-VMZBYyQvbGmWyWVea0EHs/BwLgxc+MKi1zLDCONksozI4YJMcTt8ZEuIR4Sb1MMTE8MMW49v0IwI5+b7RmfWlg==", "license": "MIT" }, "node_modules/@types/d3-polygon": { "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@types/d3-polygon/-/d3-polygon-3.0.2.tgz", - "integrity": "sha512-ZuWOtMaHCkN9xoeEMr1ubW2nGWsp4nIql+OPQRstu4ypeZ+zk3YKqQT0CXVe/PYqrKpZAi+J9mTs05TKwjXSRA==", "license": "MIT" }, "node_modules/@types/d3-quadtree": { "version": "3.0.6", - "resolved": "https://registry.npmjs.org/@types/d3-quadtree/-/d3-quadtree-3.0.6.tgz", - "integrity": "sha512-oUzyO1/Zm6rsxKRHA1vH0NEDG58HrT5icx/azi9MF1TWdtttWl0UIUsjEQBBh+SIkrpd21ZjEv7ptxWys1ncsg==", "license": "MIT" }, "node_modules/@types/d3-random": { "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@types/d3-random/-/d3-random-3.0.3.tgz", - "integrity": "sha512-Imagg1vJ3y76Y2ea0871wpabqp613+8/r0mCLEBfdtqC7xMSfj9idOnmBYyMoULfHePJyxMAw3nWhJxzc+LFwQ==", "license": "MIT" }, "node_modules/@types/d3-scale": { "version": "4.0.9", - "resolved": "https://registry.npmjs.org/@types/d3-scale/-/d3-scale-4.0.9.tgz", - "integrity": "sha512-dLmtwB8zkAeO/juAMfnV+sItKjlsw2lKdZVVy6LRr0cBmegxSABiLEpGVmSJJ8O08i4+sGR6qQtb6WtuwJdvVw==", "license": "MIT", "dependencies": { "@types/d3-time": "*" @@ -17297,20 +14508,14 @@ }, "node_modules/@types/d3-scale-chromatic": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@types/d3-scale-chromatic/-/d3-scale-chromatic-3.1.0.tgz", - "integrity": "sha512-iWMJgwkK7yTRmWqRB5plb1kadXyQ5Sj8V/zYlFGMUBbIPKQScw+Dku9cAAMgJG+z5GYDoMjWGLVOvjghDEFnKQ==", "license": "MIT" }, "node_modules/@types/d3-selection": { "version": "3.0.11", - "resolved": "https://registry.npmjs.org/@types/d3-selection/-/d3-selection-3.0.11.tgz", - "integrity": "sha512-bhAXu23DJWsrI45xafYpkQ4NtcKMwWnAC/vKrd2l+nxMFuvOT3XMYTIj2opv8vq8AO5Yh7Qac/nSeP/3zjTK0w==", "license": "MIT" }, "node_modules/@types/d3-shape": { "version": "3.1.8", - "resolved": "https://registry.npmjs.org/@types/d3-shape/-/d3-shape-3.1.8.tgz", - "integrity": "sha512-lae0iWfcDeR7qt7rA88BNiqdvPS5pFVPpo5OfjElwNaT2yyekbM0C9vK+yqBqEmHr6lDkRnYNoTBYlAgJa7a4w==", "license": "MIT", "dependencies": { "@types/d3-path": "*" @@ -17318,26 +14523,18 @@ }, "node_modules/@types/d3-time": { "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@types/d3-time/-/d3-time-3.0.4.tgz", - "integrity": "sha512-yuzZug1nkAAaBlBBikKZTgzCeA+k1uy4ZFwWANOfKw5z5LRhV0gNA7gNkKm7HoK+HRN0wX3EkxGk0fpbWhmB7g==", "license": "MIT" }, "node_modules/@types/d3-time-format": { "version": "4.0.3", - "resolved": "https://registry.npmjs.org/@types/d3-time-format/-/d3-time-format-4.0.3.tgz", - "integrity": "sha512-5xg9rC+wWL8kdDj153qZcsJ0FWiFt0J5RB6LYUNZjwSnesfblqrI/bJ1wBdJ8OQfncgbJG5+2F+qfqnqyzYxyg==", "license": "MIT" }, "node_modules/@types/d3-timer": { "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@types/d3-timer/-/d3-timer-3.0.2.tgz", - "integrity": "sha512-Ps3T8E8dZDam6fUyNiMkekK3XUsaUEik+idO9/YjPtfj2qruF8tFBXS7XhtE4iIXBLxhmLjP3SXpLhVf21I9Lw==", "license": "MIT" }, "node_modules/@types/d3-transition": { "version": "3.0.9", - "resolved": "https://registry.npmjs.org/@types/d3-transition/-/d3-transition-3.0.9.tgz", - "integrity": "sha512-uZS5shfxzO3rGlu0cC3bjmMFKsXv+SmZZcgp0KD22ts4uGXp5EVYGzu/0YdwZeKmddhcAccYtREJKkPfXkZuCg==", "license": "MIT", "dependencies": { "@types/d3-selection": "*" @@ -17345,8 +14542,6 @@ }, "node_modules/@types/d3-zoom": { "version": "3.0.8", - "resolved": "https://registry.npmjs.org/@types/d3-zoom/-/d3-zoom-3.0.8.tgz", - "integrity": "sha512-iqMC4/YlFCSlO8+2Ii1GGGliCAY4XdeG748w5vQUbevlbDu0zSjH/+jojorQVBK/se0j6DUFNPBGSqD3YWYnDw==", "license": "MIT", "dependencies": { "@types/d3-interpolate": "*", @@ -17355,8 +14550,6 @@ }, "node_modules/@types/debug": { "version": "4.1.12", - "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.12.tgz", - "integrity": "sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==", "license": "MIT", "dependencies": { "@types/ms": "*" @@ -17364,22 +14557,16 @@ }, "node_modules/@types/deep-eql": { "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@types/deep-eql/-/deep-eql-4.0.2.tgz", - "integrity": "sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==", "dev": true, "license": "MIT" }, "node_modules/@types/doctrine": { "version": "0.0.9", - "resolved": "https://registry.npmjs.org/@types/doctrine/-/doctrine-0.0.9.tgz", - "integrity": "sha512-eOIHzCUSH7SMfonMG1LsC2f8vxBFtho6NGBznK41R84YzPuvSBzrhEps33IsQiOW9+VL6NQ9DbjQJznk/S4uRA==", "dev": true, "license": "MIT" }, "node_modules/@types/eslint": { "version": "9.6.1", - "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-9.6.1.tgz", - "integrity": "sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag==", "license": "MIT", "dependencies": { "@types/estree": "*", @@ -17388,8 +14575,6 @@ }, "node_modules/@types/eslint-scope": { "version": "3.7.7", - "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.7.tgz", - "integrity": "sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==", "license": "MIT", "dependencies": { "@types/eslint": "*", @@ -17398,14 +14583,10 @@ }, "node_modules/@types/estree": { "version": "1.0.8", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", - "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", "license": "MIT" }, "node_modules/@types/estree-jsx": { "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@types/estree-jsx/-/estree-jsx-1.0.5.tgz", - "integrity": "sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg==", "license": "MIT", "dependencies": { "@types/estree": "*" @@ -17413,8 +14594,6 @@ }, "node_modules/@types/express": { "version": "5.0.6", - "resolved": "https://registry.npmjs.org/@types/express/-/express-5.0.6.tgz", - "integrity": "sha512-sKYVuV7Sv9fbPIt/442koC7+IIwK5olP1KWeD88e/idgoJqDm3JV/YUiPwkoKK92ylff2MGxSz1CSjsXelx0YA==", "license": "MIT", "dependencies": { "@types/body-parser": "*", @@ -17424,8 +14603,6 @@ }, "node_modules/@types/express-serve-static-core": { "version": "5.1.1", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-5.1.1.tgz", - "integrity": "sha512-v4zIMr/cX7/d2BpAEX3KNKL/JrT1s43s96lLvvdTmza1oEvDudCqK9aF/djc/SWgy8Yh0h30TZx5VpzqFCxk5A==", "license": "MIT", "dependencies": { "@types/node": "*", @@ -17436,15 +14613,11 @@ }, "node_modules/@types/facebook-pixel": { "version": "0.0.31", - "resolved": "https://registry.npmjs.org/@types/facebook-pixel/-/facebook-pixel-0.0.31.tgz", - "integrity": "sha512-NyfutSDY9Cabk7IUsEMy2pcVPGVVQjsFI3caZkeZvJ9lffz/CZjJA84mUhluTRM/iHjZ96VwBMPORpDSioNeyg==", "dev": true, "license": "MIT" }, "node_modules/@types/fs-extra": { "version": "11.0.4", - "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-11.0.4.tgz", - "integrity": "sha512-yTbItCNreRooED33qjunPthRcSjERP1r4MqCZc7wv0u2sUkzTFp45tgUfS5+r7FrZPdmCCNflLhVSP/o+SemsQ==", "dev": true, "license": "MIT", "dependencies": { @@ -17454,21 +14627,15 @@ }, "node_modules/@types/geojson": { "version": "7946.0.16", - "resolved": "https://registry.npmjs.org/@types/geojson/-/geojson-7946.0.16.tgz", - "integrity": "sha512-6C8nqWur3j98U6+lXDfTUWIfgvZU+EumvpHKcYjujKH7woYyLj2sUmff0tRhrqM7BohUw7Pz3ZB1jj2gW9Fvmg==", "license": "MIT" }, "node_modules/@types/gtag.js": { "version": "0.0.20", - "resolved": "https://registry.npmjs.org/@types/gtag.js/-/gtag.js-0.0.20.tgz", - "integrity": "sha512-wwAbk3SA2QeU67unN7zPxjEHmPmlXwZXZvQEpbEUQuMCRGgKyE1m6XDuTUA9b6pCGb/GqJmdfMOY5LuDjJSbbg==", "dev": true, "license": "MIT" }, "node_modules/@types/hast": { "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.4.tgz", - "integrity": "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==", "license": "MIT", "dependencies": { "@types/unist": "*" @@ -17476,32 +14643,22 @@ }, "node_modules/@types/history": { "version": "4.7.11", - "resolved": "https://registry.npmjs.org/@types/history/-/history-4.7.11.tgz", - "integrity": "sha512-qjDJRrmvBMiTx+jyLxvLfJU7UznFuokDv4f3WRuriHKERccVpFU+8XMQUAbDzoiJCsmexxRExQeMwwCdamSKDA==", "license": "MIT" }, "node_modules/@types/html-minifier-terser": { "version": "6.1.0", - "resolved": "https://registry.npmjs.org/@types/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz", - "integrity": "sha512-oh/6byDPnL1zeNXFrDXFLyZjkr1MsBG667IM792caf1L2UPOOMf65NFzjUH/ltyfwjAGfs1rsX1eftK0jC/KIg==", "license": "MIT" }, "node_modules/@types/http-cache-semantics": { "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.2.0.tgz", - "integrity": "sha512-L3LgimLHXtGkWikKnsPg0/VFx9OGZaC+eN1u4r+OB1XRqH3meBIAVC2zr1WdMH+RHmnRkqliQAOHNJ/E0j/e0Q==", "license": "MIT" }, "node_modules/@types/http-errors": { "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.5.tgz", - "integrity": "sha512-r8Tayk8HJnX0FztbZN7oVqGccWgw98T/0neJphO91KkmOzug1KkofZURD4UaD5uH8AqcFLfdPErnBod0u71/qg==", "license": "MIT" }, "node_modules/@types/http-proxy": { "version": "1.17.17", - "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.17.tgz", - "integrity": "sha512-ED6LB+Z1AVylNTu7hdzuBqOgMnvG/ld6wGCG8wFnAzKX5uyW2K3WD52v0gnLCTK/VLpXtKckgWuyScYK6cSPaw==", "license": "MIT", "dependencies": { "@types/node": "*" @@ -17509,21 +14666,15 @@ }, "node_modules/@types/is-empty": { "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@types/is-empty/-/is-empty-1.2.3.tgz", - "integrity": "sha512-4J1l5d79hoIvsrKh5VUKVRA1aIdsOb10Hu5j3J2VfP/msDnfTdGPmNp2E1Wg+vs97Bktzo+MZePFFXSGoykYJw==", "dev": true, "license": "MIT" }, "node_modules/@types/istanbul-lib-coverage": { "version": "2.0.6", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz", - "integrity": "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==", "license": "MIT" }, "node_modules/@types/istanbul-lib-report": { "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz", - "integrity": "sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==", "license": "MIT", "dependencies": { "@types/istanbul-lib-coverage": "*" @@ -17531,8 +14682,6 @@ }, "node_modules/@types/istanbul-reports": { "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz", - "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==", "license": "MIT", "dependencies": { "@types/istanbul-lib-report": "*" @@ -17540,8 +14689,6 @@ }, "node_modules/@types/jest": { "version": "30.0.0", - "resolved": "https://registry.npmjs.org/@types/jest/-/jest-30.0.0.tgz", - "integrity": "sha512-XTYugzhuwqWjws0CVz8QpM36+T+Dz5mTEBKhNs/esGLnCIlGdRy+Dq78NRjd7ls7r8BC8ZRMOrKlkO1hU0JOwA==", "license": "MIT", "dependencies": { "expect": "^30.0.0", @@ -17550,8 +14697,6 @@ }, "node_modules/@types/jest/node_modules/ansi-styles": { "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", "license": "MIT", "engines": { "node": ">=10" @@ -17562,8 +14707,6 @@ }, "node_modules/@types/jest/node_modules/pretty-format": { "version": "30.2.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-30.2.0.tgz", - "integrity": "sha512-9uBdv/B4EefsuAL+pWqueZyZS2Ba+LxfFeQ9DN14HU4bN8bhaxKdkpjpB6fs9+pSjIBu+FXQHImEg8j/Lw0+vA==", "license": "MIT", "dependencies": { "@jest/schemas": "30.0.5", @@ -17576,8 +14719,6 @@ }, "node_modules/@types/jsdom": { "version": "21.1.7", - "resolved": "https://registry.npmjs.org/@types/jsdom/-/jsdom-21.1.7.tgz", - "integrity": "sha512-yOriVnggzrnQ3a9OKOCxaVuSug3w3/SbOj5i7VwXWZEyUNl3bLF9V3MfxGbZKuwqJOQyRfqXyROBB1CoZLFWzA==", "license": "MIT", "dependencies": { "@types/node": "*", @@ -17587,20 +14728,14 @@ }, "node_modules/@types/json-logic-js": { "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@types/json-logic-js/-/json-logic-js-2.0.5.tgz", - "integrity": "sha512-hu/FTi0zwCjQEFfbPur275cNoZj6NsuOBhhYNzqoSdfmMhuxFr58OZ957lyIOWc9+kO+2tFlBthRjcxuytD4HA==", "license": "MIT" }, "node_modules/@types/json-schema": { "version": "7.0.15", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", - "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", "license": "MIT" }, "node_modules/@types/jsonfile": { "version": "6.1.4", - "resolved": "https://registry.npmjs.org/@types/jsonfile/-/jsonfile-6.1.4.tgz", - "integrity": "sha512-D5qGUYwjvnNNextdU59/+fI+spnwtTFmyQP0h+PfIOSkNfpU6AOICUOkm4i0OnSk+NyjdPJrxCDro0sJsWlRpQ==", "dev": true, "license": "MIT", "dependencies": { @@ -17609,8 +14744,6 @@ }, "node_modules/@types/mdast": { "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz", - "integrity": "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==", "license": "MIT", "dependencies": { "@types/unist": "*" @@ -17618,33 +14751,23 @@ }, "node_modules/@types/mdx": { "version": "2.0.13", - "resolved": "https://registry.npmjs.org/@types/mdx/-/mdx-2.0.13.tgz", - "integrity": "sha512-+OWZQfAYyio6YkJb3HLxDrvnx6SWWDbC0zVPfBRzUk0/nqoDyf6dNxQi3eArPe8rJ473nobTMQ/8Zk+LxJ+Yuw==", "license": "MIT" }, "node_modules/@types/mime": { "version": "1.3.5", - "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.5.tgz", - "integrity": "sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==", "license": "MIT" }, "node_modules/@types/mixpanel-browser": { "version": "2.60.0", - "resolved": "https://registry.npmjs.org/@types/mixpanel-browser/-/mixpanel-browser-2.60.0.tgz", - "integrity": "sha512-70oe8T3KdxHwsSo5aZphALdoqcsIorQBrlisnouIn9Do4dmC2C6/D56978CmSE/BO2QHgb85ojPGa4R8OFvVHA==", "dev": true, "license": "MIT" }, "node_modules/@types/ms": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@types/ms/-/ms-2.1.0.tgz", - "integrity": "sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==", "license": "MIT" }, "node_modules/@types/node": { "version": "20.19.35", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.19.35.tgz", - "integrity": "sha512-Uarfe6J91b9HAUXxjvSOdiO2UPOKLm07Q1oh0JHxoZ1y8HoqxDAu3gVrsrOHeiio0kSsoVBt4wFrKOm0dKxVPQ==", "license": "MIT", "dependencies": { "undici-types": "~6.21.0" @@ -17652,8 +14775,6 @@ }, "node_modules/@types/node-fetch": { "version": "2.6.13", - "resolved": "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.6.13.tgz", - "integrity": "sha512-QGpRVpzSaUs30JBSGPjOg4Uveu384erbHBoT1zeONvyCfwQxIkUshLAOqN/k9EjGviPRmWTTe6aH2qySWKTVSw==", "license": "MIT", "dependencies": { "@types/node": "*", @@ -17662,22 +14783,16 @@ }, "node_modules/@types/normalize-package-data": { "version": "2.4.4", - "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.4.tgz", - "integrity": "sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==", "license": "MIT", "peer": true }, "node_modules/@types/npm-package-arg": { "version": "6.1.4", - "resolved": "https://registry.npmjs.org/@types/npm-package-arg/-/npm-package-arg-6.1.4.tgz", - "integrity": "sha512-vDgdbMy2QXHnAruzlv68pUtXCjmqUk3WrBAsRboRovsOmxbfn/WiYCjmecyKjGztnMps5dWp4Uq2prp+Ilo17Q==", "dev": true, "license": "MIT" }, "node_modules/@types/npm-registry-fetch": { "version": "8.0.9", - "resolved": "https://registry.npmjs.org/@types/npm-registry-fetch/-/npm-registry-fetch-8.0.9.tgz", - "integrity": "sha512-7NxvodR5Yrop3pb6+n8jhJNyzwOX0+6F+iagNEoi9u1CGxruYAwZD8pvGc9prIkL0+FdX5Xp0p80J9QPrGUp/g==", "dev": true, "license": "MIT", "dependencies": { @@ -17690,8 +14805,6 @@ }, "node_modules/@types/npmlog": { "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@types/npmlog/-/npmlog-7.0.0.tgz", - "integrity": "sha512-hJWbrKFvxKyWwSUXjZMYTINsSOY6IclhvGOZ97M8ac2tmR9hMwmTnYaMdpGhvju9ctWLTPhCS+eLfQNluiEjQQ==", "dev": true, "license": "MIT", "dependencies": { @@ -17700,8 +14813,6 @@ }, "node_modules/@types/pacote": { "version": "11.1.8", - "resolved": "https://registry.npmjs.org/@types/pacote/-/pacote-11.1.8.tgz", - "integrity": "sha512-/XLR0VoTh2JEO0jJg1q/e6Rh9bxjBq9vorJuQmtT7rRrXSiWz7e7NsvXVYJQ0i8JxMlBMPPYDTnrRe7MZRFA8Q==", "dev": true, "license": "MIT", "dependencies": { @@ -17713,40 +14824,28 @@ }, "node_modules/@types/parse-json": { "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.2.tgz", - "integrity": "sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==", "dev": true, "license": "MIT" }, "node_modules/@types/picomatch": { "version": "4.0.3", - "resolved": "https://registry.npmjs.org/@types/picomatch/-/picomatch-4.0.3.tgz", - "integrity": "sha512-iG0T6+nYJ9FAPmx9SsUlnwcq1ZVRuCXcVEvWnntoPlrOpwtSTKNDC9uVAxTsC3PUvJ+99n4RpAcNgBbHX3JSnQ==", "dev": true, "license": "MIT" }, "node_modules/@types/prismjs": { "version": "1.26.6", - "resolved": "https://registry.npmjs.org/@types/prismjs/-/prismjs-1.26.6.tgz", - "integrity": "sha512-vqlvI7qlMvcCBbVe0AKAb4f97//Hy0EBTaiW8AalRnG/xAN5zOiWWyrNqNXeq8+KAuvRewjCVY1+IPxk4RdNYw==", "license": "MIT" }, "node_modules/@types/qs": { "version": "6.14.0", - "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.14.0.tgz", - "integrity": "sha512-eOunJqu0K1923aExK6y8p6fsihYEn/BYuQ4g0CxAAgFc4b/ZLN4CrsRZ55srTdqoiLzU2B2evC+apEIxprEzkQ==", "license": "MIT" }, "node_modules/@types/range-parser": { "version": "1.2.7", - "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.7.tgz", - "integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==", "license": "MIT" }, "node_modules/@types/react": { "version": "19.2.14", - "resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.14.tgz", - "integrity": "sha512-ilcTH/UniCkMdtexkoCN0bI7pMcJDvmQFPvuPvmEaYA/NSfFTAgdUSLAoVjaRJm7+6PvcM+q1zYOwS4wTYMF9w==", "license": "MIT", "dependencies": { "csstype": "^3.2.2" @@ -17754,8 +14853,6 @@ }, "node_modules/@types/react-dom": { "version": "19.2.3", - "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.2.3.tgz", - "integrity": "sha512-jp2L/eY6fn+KgVVQAOqYItbF0VY/YApe5Mz2F0aykSO8gx31bYCZyvSeYxCHKvzHG5eZjc+zyaS5BrBWya2+kQ==", "dev": true, "license": "MIT", "peerDependencies": { @@ -17764,8 +14861,6 @@ }, "node_modules/@types/react-router": { "version": "5.1.20", - "resolved": "https://registry.npmjs.org/@types/react-router/-/react-router-5.1.20.tgz", - "integrity": "sha512-jGjmu/ZqS7FjSH6owMcD5qpq19+1RS9DeVRqfl1FeBMxTDQAGwlMWOcs52NDoXaNKyG3d1cYQFMs9rCrb88o9Q==", "license": "MIT", "dependencies": { "@types/history": "^4.7.11", @@ -17774,8 +14869,6 @@ }, "node_modules/@types/react-router-config": { "version": "5.0.11", - "resolved": "https://registry.npmjs.org/@types/react-router-config/-/react-router-config-5.0.11.tgz", - "integrity": "sha512-WmSAg7WgqW7m4x8Mt4N6ZyKz0BubSj/2tVUMsAHp+Yd2AMwcSbeFq9WympT19p5heCFmF97R9eD5uUR/t4HEqw==", "license": "MIT", "dependencies": { "@types/history": "^4.7.11", @@ -17785,8 +14878,6 @@ }, "node_modules/@types/react-router-dom": { "version": "5.3.3", - "resolved": "https://registry.npmjs.org/@types/react-router-dom/-/react-router-dom-5.3.3.tgz", - "integrity": "sha512-kpqnYK4wcdm5UaWI3fLcELopqLrHgLqNsdpHauzlQktfkHL3npOSwtj1Uz9oKBAzs7lFtVkV8j83voAz2D8fhw==", "license": "MIT", "dependencies": { "@types/history": "^4.7.11", @@ -17796,21 +14887,15 @@ }, "node_modules/@types/resolve": { "version": "1.20.6", - "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-1.20.6.tgz", - "integrity": "sha512-A4STmOXPhMUtHH+S6ymgE2GiBSMqf4oTvcQZMcHzokuTLVYzXTB8ttjcgxOVaAp2lGwEdzZ0J+cRbbeevQj1UQ==", "dev": true, "license": "MIT" }, "node_modules/@types/retry": { "version": "0.12.2", - "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.2.tgz", - "integrity": "sha512-XISRgDJ2Tc5q4TRqvgJtzsRkFYNJzZrhTdtMoGVBttwzzQJkPnS3WWTFc7kuDRoPtPakl+T+OfdEUjYJj7Jbow==", "license": "MIT" }, "node_modules/@types/sax": { "version": "1.2.7", - "resolved": "https://registry.npmjs.org/@types/sax/-/sax-1.2.7.tgz", - "integrity": "sha512-rO73L89PJxeYM3s3pPPjiPgVVcymqU490g0YO5n5By0k2Erzj6tay/4lr1CHAAU4JyOWd1rpQ8bCf6cZfHU96A==", "license": "MIT", "dependencies": { "@types/node": "*" @@ -17818,15 +14903,11 @@ }, "node_modules/@types/semver": { "version": "7.7.1", - "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.7.1.tgz", - "integrity": "sha512-FmgJfu+MOcQ370SD0ev7EI8TlCAfKYU+B4m5T3yXc1CiRN94g/SZPtsCkk506aUDtlMnFZvasDwHHUcZUEaYuA==", "dev": true, "license": "MIT" }, "node_modules/@types/send": { "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@types/send/-/send-1.2.1.tgz", - "integrity": "sha512-arsCikDvlU99zl1g69TcAB3mzZPpxgw0UQnaHeC1Nwb015xp8bknZv5rIfri9xTOcMuaVgvabfIRA7PSZVuZIQ==", "license": "MIT", "dependencies": { "@types/node": "*" @@ -17834,8 +14915,6 @@ }, "node_modules/@types/serve-index": { "version": "1.9.4", - "resolved": "https://registry.npmjs.org/@types/serve-index/-/serve-index-1.9.4.tgz", - "integrity": "sha512-qLpGZ/c2fhSs5gnYsQxtDEq3Oy8SXPClIXkW5ghvAvsNuVSA8k+gCONcUCS/UjLEYvYps+e8uBtfgXgvhwfNug==", "license": "MIT", "dependencies": { "@types/express": "*" @@ -17843,8 +14922,6 @@ }, "node_modules/@types/serve-static": { "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-2.2.0.tgz", - "integrity": "sha512-8mam4H1NHLtu7nmtalF7eyBH14QyOASmcxHhSfEoRyr0nP/YdoesEtU+uSRvMe96TW/HPTtkoKqQLl53N7UXMQ==", "license": "MIT", "dependencies": { "@types/http-errors": "*", @@ -17853,8 +14930,6 @@ }, "node_modules/@types/sockjs": { "version": "0.3.36", - "resolved": "https://registry.npmjs.org/@types/sockjs/-/sockjs-0.3.36.tgz", - "integrity": "sha512-MK9V6NzAS1+Ud7JV9lJLFqW85VbC9dq3LmwZCuBe4wBDgKC0Kj/jd8Xl+nSviU+Qc3+m7umHHyHg//2KSa0a0Q==", "license": "MIT", "dependencies": { "@types/node": "*" @@ -17862,8 +14937,6 @@ }, "node_modules/@types/ssri": { "version": "7.1.5", - "resolved": "https://registry.npmjs.org/@types/ssri/-/ssri-7.1.5.tgz", - "integrity": "sha512-odD/56S3B51liILSk5aXJlnYt99S6Rt9EFDDqGtJM26rKHApHcwyU/UoYHrzKkdkHMAIquGWCuHtQTbes+FRQw==", "dev": true, "license": "MIT", "dependencies": { @@ -17872,54 +14945,38 @@ }, "node_modules/@types/stack-utils": { "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.3.tgz", - "integrity": "sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==", "license": "MIT" }, "node_modules/@types/statuses": { "version": "2.0.6", - "resolved": "https://registry.npmjs.org/@types/statuses/-/statuses-2.0.6.tgz", - "integrity": "sha512-xMAgYwceFhRA2zY+XbEA7mxYbA093wdiW8Vu6gZPGWy9cmOyU9XesH1tNcEWsKFd5Vzrqx5T3D38PWx1FIIXkA==", "dev": true, "license": "MIT" }, "node_modules/@types/supports-color": { "version": "8.1.3", - "resolved": "https://registry.npmjs.org/@types/supports-color/-/supports-color-8.1.3.tgz", - "integrity": "sha512-Hy6UMpxhE3j1tLpl27exp1XqHD7n8chAiNPzWfz16LPZoMMoSc4dzLl6w9qijkEb/r5O1ozdu1CWGA2L83ZeZg==", "dev": true, "license": "MIT" }, "node_modules/@types/text-table": { "version": "0.2.5", - "resolved": "https://registry.npmjs.org/@types/text-table/-/text-table-0.2.5.tgz", - "integrity": "sha512-hcZhlNvMkQG/k1vcZ6yHOl6WAYftQ2MLfTHcYRZ2xYZFD8tGVnE3qFV0lj1smQeDSR7/yY0PyuUalauf33bJeA==", "dev": true, "license": "MIT" }, "node_modules/@types/tough-cookie": { "version": "4.0.5", - "resolved": "https://registry.npmjs.org/@types/tough-cookie/-/tough-cookie-4.0.5.tgz", - "integrity": "sha512-/Ad8+nIOV7Rl++6f1BdKxFSMgmoqEoYbHRpPcx3JEfv8VRsQe9Z4mCXeJBzxs7mbHY/XOZZuXlRNfhpVPbs6ZA==", "license": "MIT" }, "node_modules/@types/trusted-types": { "version": "2.0.7", - "resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.7.tgz", - "integrity": "sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==", "license": "MIT", "optional": true }, "node_modules/@types/unist": { "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz", - "integrity": "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==", "license": "MIT" }, "node_modules/@types/ws": { "version": "8.18.1", - "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.18.1.tgz", - "integrity": "sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg==", "license": "MIT", "dependencies": { "@types/node": "*" @@ -17927,8 +14984,6 @@ }, "node_modules/@types/yargs": { "version": "17.0.35", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.35.tgz", - "integrity": "sha512-qUHkeCyQFxMXg79wQfTtfndEC+N9ZZg76HJftDJp+qH2tV7Gj4OJi7l+PiWwJ+pWtW8GwSmqsDj/oymhrTWXjg==", "license": "MIT", "dependencies": { "@types/yargs-parser": "*" @@ -17936,20 +14991,14 @@ }, "node_modules/@types/yargs-parser": { "version": "21.0.3", - "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.3.tgz", - "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==", "license": "MIT" }, "node_modules/@types/zen-observable": { "version": "0.8.3", - "resolved": "https://registry.npmjs.org/@types/zen-observable/-/zen-observable-0.8.3.tgz", - "integrity": "sha512-fbF6oTd4sGGy0xjHPKAt+eS2CrxJ3+6gQ3FGcBoIJR2TLAyCkCyI8JqZNy+FeON0AhVgNJoUumVoZQjBFUqHkw==", "license": "MIT" }, "node_modules/@typescript-eslint/eslint-plugin": { "version": "8.56.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.56.1.tgz", - "integrity": "sha512-Jz9ZztpB37dNC+HU2HI28Bs9QXpzCz+y/twHOwhyrIRdbuVDxSytJNDl6z/aAKlaRIwC7y8wJdkBv7FxYGgi0A==", "license": "MIT", "dependencies": { "@eslint-community/regexpp": "^4.12.2", @@ -17976,8 +15025,6 @@ }, "node_modules/@typescript-eslint/eslint-plugin/node_modules/ignore": { "version": "7.0.5", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz", - "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==", "license": "MIT", "engines": { "node": ">= 4" @@ -17985,8 +15032,6 @@ }, "node_modules/@typescript-eslint/parser": { "version": "8.56.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.56.1.tgz", - "integrity": "sha512-klQbnPAAiGYFyI02+znpBRLyjL4/BrBd0nyWkdC0s/6xFLkXYQ8OoRrSkqacS1ddVxf/LDyODIKbQ5TgKAf/Fg==", "license": "MIT", "dependencies": { "@typescript-eslint/scope-manager": "8.56.1", @@ -18009,8 +15054,6 @@ }, "node_modules/@typescript-eslint/project-service": { "version": "8.56.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.56.1.tgz", - "integrity": "sha512-TAdqQTzHNNvlVFfR+hu2PDJrURiwKsUvxFn1M0h95BB8ah5jejas08jUWG4dBA68jDMI988IvtfdAI53JzEHOQ==", "license": "MIT", "dependencies": { "@typescript-eslint/tsconfig-utils": "^8.56.1", @@ -18030,8 +15073,6 @@ }, "node_modules/@typescript-eslint/scope-manager": { "version": "8.56.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.56.1.tgz", - "integrity": "sha512-YAi4VDKcIZp0O4tz/haYKhmIDZFEUPOreKbfdAN3SzUDMcPhJ8QI99xQXqX+HoUVq8cs85eRKnD+rne2UAnj2w==", "license": "MIT", "dependencies": { "@typescript-eslint/types": "8.56.1", @@ -18047,8 +15088,6 @@ }, "node_modules/@typescript-eslint/tsconfig-utils": { "version": "8.56.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.56.1.tgz", - "integrity": "sha512-qOtCYzKEeyr3aR9f28mPJqBty7+DBqsdd63eO0yyDwc6vgThj2UjWfJIcsFeSucYydqcuudMOprZ+x1SpF3ZuQ==", "license": "MIT", "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -18063,8 +15102,6 @@ }, "node_modules/@typescript-eslint/type-utils": { "version": "8.56.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.56.1.tgz", - "integrity": "sha512-yB/7dxi7MgTtGhZdaHCemf7PuwrHMenHjmzgUW1aJpO+bBU43OycnM3Wn+DdvDO/8zzA9HlhaJ0AUGuvri4oGg==", "license": "MIT", "dependencies": { "@typescript-eslint/types": "8.56.1", @@ -18087,8 +15124,6 @@ }, "node_modules/@typescript-eslint/types": { "version": "8.56.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.56.1.tgz", - "integrity": "sha512-dbMkdIUkIkchgGDIv7KLUpa0Mda4IYjo4IAMJUZ+3xNoUXxMsk9YtKpTHSChRS85o+H9ftm51gsK1dZReY9CVw==", "license": "MIT", "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -18100,8 +15135,6 @@ }, "node_modules/@typescript-eslint/typescript-estree": { "version": "8.56.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.56.1.tgz", - "integrity": "sha512-qzUL1qgalIvKWAf9C1HpvBjif+Vm6rcT5wZd4VoMb9+Km3iS3Cv9DY6dMRMDtPnwRAFyAi7YXJpTIEXLvdfPxg==", "license": "MIT", "dependencies": { "@typescript-eslint/project-service": "8.56.1", @@ -18127,8 +15160,6 @@ }, "node_modules/@typescript-eslint/utils": { "version": "8.56.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.56.1.tgz", - "integrity": "sha512-HPAVNIME3tABJ61siYlHzSWCGtOoeP2RTIaHXFMPqjrQKCGB9OgUVdiNgH7TJS2JNIQ5qQ4RsAUDuGaGme/KOA==", "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.9.1", @@ -18150,8 +15181,6 @@ }, "node_modules/@typescript-eslint/visitor-keys": { "version": "8.56.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.56.1.tgz", - "integrity": "sha512-KiROIzYdEV85YygXw6BI/Dx4fnBlFQu6Mq4QE4MOH9fFnhohw6wX/OAvDY2/C+ut0I3RSPKenvZJIVYqJNkhEw==", "license": "MIT", "dependencies": { "@typescript-eslint/types": "8.56.1", @@ -18167,8 +15196,6 @@ }, "node_modules/@typescript-eslint/visitor-keys/node_modules/eslint-visitor-keys": { "version": "5.0.1", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz", - "integrity": "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==", "license": "Apache-2.0", "engines": { "node": "^20.19.0 || ^22.13.0 || >=24" @@ -18179,8 +15206,6 @@ }, "node_modules/@ungap/structured-clone": { "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.0.tgz", - "integrity": "sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==", "license": "ISC" }, "node_modules/@unrs/resolver-binding-android-arm-eabi": { @@ -18261,23 +15286,8 @@ "linux" ] }, - "node_modules/@unrs/resolver-binding-linux-arm-musleabihf": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm-musleabihf/-/resolver-binding-linux-arm-musleabihf-1.11.1.tgz", - "integrity": "sha512-cINaoY2z7LVCrfHkIcmvj7osTOtm6VVT16b5oQdS4beibX2SYBwgYLmqhBjA1t51CarSaBuX5YNsWLjsqfW5Cw==", - "cpu": [ - "arm" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, "node_modules/@unrs/resolver-binding-linux-arm64-gnu": { "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm64-gnu/-/resolver-binding-linux-arm64-gnu-1.11.1.tgz", - "integrity": "sha512-34gw7PjDGB9JgePJEmhEqBhWvCiiWCuXsL9hYphDF7crW7UgI05gyBAi6MF58uGcMOiOqSJ2ybEeCvHcq0BCmQ==", "cpu": [ "arm64" ], @@ -18289,8 +15299,6 @@ }, "node_modules/@unrs/resolver-binding-linux-arm64-musl": { "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm64-musl/-/resolver-binding-linux-arm64-musl-1.11.1.tgz", - "integrity": "sha512-RyMIx6Uf53hhOtJDIamSbTskA99sPHS96wxVE/bJtePJJtpdKGXO1wY90oRdXuYOGOTuqjT8ACccMc4K6QmT3w==", "cpu": [ "arm64" ], @@ -18378,34 +15386,6 @@ "linux" ] }, - "node_modules/@unrs/resolver-binding-wasm32-wasi": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-wasm32-wasi/-/resolver-binding-wasm32-wasi-1.11.1.tgz", - "integrity": "sha512-5u4RkfxJm+Ng7IWgkzi3qrFOvLvQYnPBmjmZQ8+szTK/b31fQCnleNl1GgEt7nIsZRIf5PLhPwT0WM+q45x/UQ==", - "cpu": [ - "wasm32" - ], - "license": "MIT", - "optional": true, - "dependencies": { - "@napi-rs/wasm-runtime": "^0.2.11" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@unrs/resolver-binding-wasm32-wasi/node_modules/@napi-rs/wasm-runtime": { - "version": "0.2.12", - "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-0.2.12.tgz", - "integrity": "sha512-ZVWUcfwY4E/yPitQJl481FjFo3K22D6qF0DuFH6Y/nbnE11GY5uguDxZMGXPQ8WQ0128MXQD7TnfHyK4oWoIJQ==", - "license": "MIT", - "optional": true, - "dependencies": { - "@emnapi/core": "^1.4.3", - "@emnapi/runtime": "^1.4.3", - "@tybys/wasm-util": "^0.10.0" - } - }, "node_modules/@unrs/resolver-binding-win32-arm64-msvc": { "version": "1.11.1", "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-arm64-msvc/-/resolver-binding-win32-arm64-msvc-1.11.1.tgz", @@ -18447,8 +15427,6 @@ }, "node_modules/@vercel/nft": { "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@vercel/nft/-/nft-1.5.0.tgz", - "integrity": "sha512-IWTDeIoWhQ7ZtRO/JRKH+jhmeQvZYhtGPmzw/QGDY+wDCQqfm25P9yIdoAFagu4fWsK4IwZXDFIjrmp5rRm/sA==", "license": "MIT", "dependencies": { "@mapbox/node-pre-gyp": "^2.0.0", @@ -18473,14 +15451,10 @@ }, "node_modules/@vercel/nft/node_modules/estree-walker": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", - "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", "license": "MIT" }, "node_modules/@vercel/nft/node_modules/picomatch": { "version": "4.0.4", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", - "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", "license": "MIT", "engines": { "node": ">=12" @@ -18491,8 +15465,6 @@ }, "node_modules/@vitejs/plugin-react": { "version": "5.1.4", - "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-5.1.4.tgz", - "integrity": "sha512-VIcFLdRi/VYRU8OL/puL7QXMYafHmqOnwTZY50U1JPlCNj30PxCMx65c494b1K9be9hX83KVt0+gTEwTWLqToA==", "dev": true, "license": "MIT", "dependencies": { @@ -18512,8 +15484,6 @@ }, "node_modules/@vitest/expect": { "version": "3.2.4", - "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-3.2.4.tgz", - "integrity": "sha512-Io0yyORnB6sikFlt8QW5K7slY4OjqNX9jmJQ02QDda8lyM6B5oNgVWoSoKPac8/kgnCUzuHQKrSLtu/uOqqrig==", "dev": true, "license": "MIT", "dependencies": { @@ -18529,8 +15499,6 @@ }, "node_modules/@vitest/pretty-format": { "version": "3.2.4", - "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-3.2.4.tgz", - "integrity": "sha512-IVNZik8IVRJRTr9fxlitMKeJeXFFFN0JaB9PHPGQ8NKQbGpfjlTx9zO4RefN8gp7eqjNy8nyK3NZmBzOPeIxtA==", "dev": true, "license": "MIT", "dependencies": { @@ -18542,8 +15510,6 @@ }, "node_modules/@vitest/spy": { "version": "3.2.4", - "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-3.2.4.tgz", - "integrity": "sha512-vAfasCOe6AIK70iP5UD11Ac4siNUNJ9i/9PZ3NKx07sG6sUxeag1LWdNrMWeKKYBLlzuK+Gn65Yd5nyL6ds+nw==", "dev": true, "license": "MIT", "dependencies": { @@ -18555,8 +15521,6 @@ }, "node_modules/@vitest/utils": { "version": "3.2.4", - "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-3.2.4.tgz", - "integrity": "sha512-fB2V0JFrQSMsCo9HiSq3Ezpdv4iYaXRG1Sx8edX3MwxfyNn83mKiGzOcH+Fkxt4MHxr3y42fQi1oeAInqgX2QA==", "dev": true, "license": "MIT", "dependencies": { @@ -18760,10 +15724,6 @@ "resolved": "packages/web/sources/demo", "link": true }, - "node_modules/@walkeros/store-memory": { - "resolved": "packages/stores/memory", - "link": true - }, "node_modules/@walkeros/storybook-addon": { "resolved": "apps/storybook-addon", "link": true @@ -18776,8 +15736,8 @@ "resolved": "packages/transformers/demo", "link": true }, - "node_modules/@walkeros/transformer-validator": { - "resolved": "packages/transformers/validator", + "node_modules/@walkeros/transformer-ga4": { + "resolved": "packages/transformers/ga4", "link": true }, "node_modules/@walkeros/walker.js": { @@ -18894,8 +15854,6 @@ }, "node_modules/@webassemblyjs/ast": { "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.14.1.tgz", - "integrity": "sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ==", "license": "MIT", "dependencies": { "@webassemblyjs/helper-numbers": "1.13.2", @@ -18904,26 +15862,18 @@ }, "node_modules/@webassemblyjs/floating-point-hex-parser": { "version": "1.13.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.13.2.tgz", - "integrity": "sha512-6oXyTOzbKxGH4steLbLNOu71Oj+C8Lg34n6CqRvqfS2O71BxY6ByfMDRhBytzknj9yGUPVJ1qIKhRlAwO1AovA==", "license": "MIT" }, "node_modules/@webassemblyjs/helper-api-error": { "version": "1.13.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.13.2.tgz", - "integrity": "sha512-U56GMYxy4ZQCbDZd6JuvvNV/WFildOjsaWD3Tzzvmw/mas3cXzRJPMjP83JqEsgSbyrmaGjBfDtV7KDXV9UzFQ==", "license": "MIT" }, "node_modules/@webassemblyjs/helper-buffer": { "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.14.1.tgz", - "integrity": "sha512-jyH7wtcHiKssDtFPRB+iQdxlDf96m0E39yb0k5uJVhFGleZFoNw1c4aeIcVUPPbXUVJ94wwnMOAqUHyzoEPVMA==", "license": "MIT" }, "node_modules/@webassemblyjs/helper-numbers": { "version": "1.13.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.13.2.tgz", - "integrity": "sha512-FE8aCmS5Q6eQYcV3gI35O4J789wlQA+7JrqTTpJqn5emA4U2hvwJmvFRC0HODS+3Ye6WioDklgd6scJ3+PLnEA==", "license": "MIT", "dependencies": { "@webassemblyjs/floating-point-hex-parser": "1.13.2", @@ -18933,14 +15883,10 @@ }, "node_modules/@webassemblyjs/helper-wasm-bytecode": { "version": "1.13.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.13.2.tgz", - "integrity": "sha512-3QbLKy93F0EAIXLh0ogEVR6rOubA9AoZ+WRYhNbFyuB70j3dRdwH9g+qXhLAO0kiYGlg3TxDV+I4rQTr/YNXkA==", "license": "MIT" }, "node_modules/@webassemblyjs/helper-wasm-section": { "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.14.1.tgz", - "integrity": "sha512-ds5mXEqTJ6oxRoqjhWDU83OgzAYjwsCV8Lo/N+oRsNDmx/ZDpqalmrtgOMkHwxsG0iI//3BwWAErYRHtgn0dZw==", "license": "MIT", "dependencies": { "@webassemblyjs/ast": "1.14.1", @@ -18951,8 +15897,6 @@ }, "node_modules/@webassemblyjs/ieee754": { "version": "1.13.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.13.2.tgz", - "integrity": "sha512-4LtOzh58S/5lX4ITKxnAK2USuNEvpdVV9AlgGQb8rJDHaLeHciwG4zlGr0j/SNWlr7x3vO1lDEsuePvtcDNCkw==", "license": "MIT", "dependencies": { "@xtuc/ieee754": "^1.2.0" @@ -18960,8 +15904,6 @@ }, "node_modules/@webassemblyjs/leb128": { "version": "1.13.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.13.2.tgz", - "integrity": "sha512-Lde1oNoIdzVzdkNEAWZ1dZ5orIbff80YPdHx20mrHwHrVNNTjNr8E3xz9BdpcGqRQbAEa+fkrCb+fRFTl/6sQw==", "license": "Apache-2.0", "dependencies": { "@xtuc/long": "4.2.2" @@ -18969,14 +15911,10 @@ }, "node_modules/@webassemblyjs/utf8": { "version": "1.13.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.13.2.tgz", - "integrity": "sha512-3NQWGjKTASY1xV5m7Hr0iPeXD9+RDobLll3T9d2AO+g3my8xy5peVyjSag4I50mR1bBSN/Ct12lo+R9tJk0NZQ==", "license": "MIT" }, "node_modules/@webassemblyjs/wasm-edit": { "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.14.1.tgz", - "integrity": "sha512-RNJUIQH/J8iA/1NzlE4N7KtyZNHi3w7at7hDjvRNm5rcUXa00z1vRz3glZoULfJ5mpvYhLybmVcwcjGrC1pRrQ==", "license": "MIT", "dependencies": { "@webassemblyjs/ast": "1.14.1", @@ -18991,8 +15929,6 @@ }, "node_modules/@webassemblyjs/wasm-gen": { "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.14.1.tgz", - "integrity": "sha512-AmomSIjP8ZbfGQhumkNvgC33AY7qtMCXnN6bL2u2Js4gVCg8fp735aEiMSBbDR7UQIj90n4wKAFUSEd0QN2Ukg==", "license": "MIT", "dependencies": { "@webassemblyjs/ast": "1.14.1", @@ -19004,8 +15940,6 @@ }, "node_modules/@webassemblyjs/wasm-opt": { "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.14.1.tgz", - "integrity": "sha512-PTcKLUNvBqnY2U6E5bdOQcSM+oVP/PmrDY9NzowJjislEjwP/C4an2303MCVS2Mg9d3AJpIGdUFIQQWbPds0Sw==", "license": "MIT", "dependencies": { "@webassemblyjs/ast": "1.14.1", @@ -19016,8 +15950,6 @@ }, "node_modules/@webassemblyjs/wasm-parser": { "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.14.1.tgz", - "integrity": "sha512-JLBl+KZ0R5qB7mCnud/yyX08jWFw5MsoalJ1pQ4EdFlgj9VdXKGuENGsiCIjegI1W7p91rUlcB/LB5yRJKNTcQ==", "license": "MIT", "dependencies": { "@webassemblyjs/ast": "1.14.1", @@ -19030,8 +15962,6 @@ }, "node_modules/@webassemblyjs/wast-printer": { "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.14.1.tgz", - "integrity": "sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw==", "license": "MIT", "dependencies": { "@webassemblyjs/ast": "1.14.1", @@ -19040,8 +15970,6 @@ }, "node_modules/@x0k/json-schema-merge": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@x0k/json-schema-merge/-/json-schema-merge-1.0.2.tgz", - "integrity": "sha512-1734qiJHNX3+cJGDMMw2yz7R+7kpbAtl5NdPs1c/0gO5kYT6s4dMbLXiIfpZNsOYhGZI3aH7FWrj4Zxz7epXNg==", "license": "MIT", "dependencies": { "@types/json-schema": "^7.0.15" @@ -19049,26 +15977,18 @@ }, "node_modules/@xstate/fsm": { "version": "1.6.5", - "resolved": "https://registry.npmjs.org/@xstate/fsm/-/fsm-1.6.5.tgz", - "integrity": "sha512-b5o1I6aLNeYlU/3CPlj/Z91ybk1gUsKT+5NAJI+2W4UjvS5KLG28K9v5UvNoFVjHV8PajVZ00RH3vnjyQO7ZAw==", "license": "MIT" }, "node_modules/@xtuc/ieee754": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", - "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", "license": "BSD-3-Clause" }, "node_modules/@xtuc/long": { "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", - "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", "license": "Apache-2.0" }, "node_modules/abbrev": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-4.0.0.tgz", - "integrity": "sha512-a1wflyaL0tHtJSmLSOVybYhy22vRih4eduhhrkcjgrWGnRfrZtovJ2FRjxuTtkkj47O/baf0R86QU5OuYpz8fA==", "license": "ISC", "engines": { "node": "^20.17.0 || >=22.9.0" @@ -19076,8 +15996,6 @@ }, "node_modules/accepts": { "version": "1.3.8", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", - "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", "license": "MIT", "dependencies": { "mime-types": "~2.1.34", @@ -19089,8 +16007,6 @@ }, "node_modules/acorn": { "version": "8.16.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.16.0.tgz", - "integrity": "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==", "license": "MIT", "bin": { "acorn": "bin/acorn" @@ -19101,8 +16017,6 @@ }, "node_modules/acorn-import-attributes": { "version": "1.9.5", - "resolved": "https://registry.npmjs.org/acorn-import-attributes/-/acorn-import-attributes-1.9.5.tgz", - "integrity": "sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ==", "license": "MIT", "peerDependencies": { "acorn": "^8" @@ -19110,8 +16024,6 @@ }, "node_modules/acorn-import-phases": { "version": "1.0.4", - "resolved": "https://registry.npmjs.org/acorn-import-phases/-/acorn-import-phases-1.0.4.tgz", - "integrity": "sha512-wKmbr/DDiIXzEOiWrTTUcDm24kQ2vGfZQvM2fwg2vXqR5uW6aapr7ObPtj1th32b9u90/Pf4AItvdTh42fBmVQ==", "license": "MIT", "engines": { "node": ">=10.13.0" @@ -19122,8 +16034,6 @@ }, "node_modules/acorn-jsx": { "version": "5.3.2", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", - "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", "license": "MIT", "peerDependencies": { "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" @@ -19131,8 +16041,6 @@ }, "node_modules/acorn-walk": { "version": "8.3.5", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.5.tgz", - "integrity": "sha512-HEHNfbars9v4pgpW6SO1KSPkfoS0xVOM/9UzkJltjlsHZmJasxg8aXkuZa7SMf8vKGIBhpUsPluQSqhJFCqebw==", "license": "MIT", "dependencies": { "acorn": "^8.11.0" @@ -19143,8 +16051,6 @@ }, "node_modules/address": { "version": "1.2.2", - "resolved": "https://registry.npmjs.org/address/-/address-1.2.2.tgz", - "integrity": "sha512-4B/qKCfeE/ODUaAUpSwfzazo5x29WD4r3vXiWsB7I2mSDAihwEqKO+g8GELZUQSSAo5e1XTYh3ZVfLyxBc12nA==", "license": "MIT", "engines": { "node": ">= 10.0.0" @@ -19152,8 +16058,6 @@ }, "node_modules/agent-base": { "version": "6.0.2", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", - "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", "license": "MIT", "dependencies": { "debug": "4" @@ -19164,8 +16068,6 @@ }, "node_modules/aggregate-error": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", - "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", "license": "MIT", "dependencies": { "clean-stack": "^2.0.0", @@ -19177,8 +16079,6 @@ }, "node_modules/ajv": { "version": "8.18.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.18.0.tgz", - "integrity": "sha512-PlXPeEWMXMZ7sPYOHqmDyCJzcfNrUr3fGNKtezX14ykXOEIvyK81d+qydx89KY5O71FKMPaQ2vBfBFI5NHR63A==", "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.3", @@ -19193,8 +16093,6 @@ }, "node_modules/ajv-formats": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-3.0.1.tgz", - "integrity": "sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==", "license": "MIT", "dependencies": { "ajv": "^8.0.0" @@ -19210,8 +16108,6 @@ }, "node_modules/ajv-keywords": { "version": "5.1.0", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", - "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.3" @@ -19222,8 +16118,6 @@ }, "node_modules/algoliasearch": { "version": "5.49.1", - "resolved": "https://registry.npmjs.org/algoliasearch/-/algoliasearch-5.49.1.tgz", - "integrity": "sha512-X3Pp2aRQhg4xUC6PQtkubn5NpRKuUPQ9FPDQlx36SmpFwwH2N0/tw4c+NXV3nw3PsgeUs+BuWGP0gjz3TvENLQ==", "license": "MIT", "dependencies": { "@algolia/abtesting": "1.15.1", @@ -19247,8 +16141,6 @@ }, "node_modules/algoliasearch-helper": { "version": "3.28.0", - "resolved": "https://registry.npmjs.org/algoliasearch-helper/-/algoliasearch-helper-3.28.0.tgz", - "integrity": "sha512-GBN0xsxGggaCPElZq24QzMdfphrjIiV2xA+hRXE4/UMpN3nsF2WrM8q+x80OGvGpJWtB7F+4Hq5eSfWwuejXrg==", "license": "MIT", "dependencies": { "@algolia/events": "^4.0.1" @@ -19259,8 +16151,6 @@ }, "node_modules/ansi-align": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.1.tgz", - "integrity": "sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==", "license": "ISC", "dependencies": { "string-width": "^4.1.0" @@ -19268,14 +16158,10 @@ }, "node_modules/ansi-align/node_modules/emoji-regex": { "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", "license": "MIT" }, "node_modules/ansi-align/node_modules/is-fullwidth-code-point": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", "license": "MIT", "engines": { "node": ">=8" @@ -19283,8 +16169,6 @@ }, "node_modules/ansi-align/node_modules/string-width": { "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "license": "MIT", "dependencies": { "emoji-regex": "^8.0.0", @@ -19297,8 +16181,6 @@ }, "node_modules/ansi-colors": { "version": "4.1.3", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", - "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==", "dev": true, "license": "MIT", "engines": { @@ -19307,8 +16189,6 @@ }, "node_modules/ansi-escapes": { "version": "7.3.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-7.3.0.tgz", - "integrity": "sha512-BvU8nYgGQBxcmMuEeUEmNTvrMVjJNSH7RgW24vXexN4Ven6qCvy4TntnvlnwnMLTVlcRQQdbRY8NKnaIoeWDNg==", "dev": true, "license": "MIT", "dependencies": { @@ -19323,8 +16203,6 @@ }, "node_modules/ansi-html-community": { "version": "0.0.8", - "resolved": "https://registry.npmjs.org/ansi-html-community/-/ansi-html-community-0.0.8.tgz", - "integrity": "sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==", "engines": [ "node >= 0.8.0" ], @@ -19335,8 +16213,6 @@ }, "node_modules/ansi-regex": { "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "license": "MIT", "engines": { "node": ">=8" @@ -19344,8 +16220,6 @@ }, "node_modules/ansi-styles": { "version": "6.2.3", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", - "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", "license": "MIT", "engines": { "node": ">=12" @@ -19356,14 +16230,10 @@ }, "node_modules/any-promise": { "version": "1.3.0", - "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", - "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==", "license": "MIT" }, "node_modules/anymatch": { "version": "3.1.3", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", - "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", "license": "ISC", "dependencies": { "normalize-path": "^3.0.0", @@ -19375,8 +16245,6 @@ }, "node_modules/apache-arrow": { "version": "19.0.1", - "resolved": "https://registry.npmjs.org/apache-arrow/-/apache-arrow-19.0.1.tgz", - "integrity": "sha512-APmMLzS4qbTivLrPdQXexGM4JRr+0g62QDaobzEvip/FdQIrv2qLy0mD5Qdmw4buydtVJgbFeKR8f59I6PPGDg==", "license": "Apache-2.0", "dependencies": { "@swc/helpers": "^0.5.11", @@ -19395,8 +16263,6 @@ }, "node_modules/apache-arrow/node_modules/array-back": { "version": "6.2.3", - "resolved": "https://registry.npmjs.org/array-back/-/array-back-6.2.3.tgz", - "integrity": "sha512-SGDvmg6QTYiTxCBkYVmThcoa67uLl35pyzRHdpCGBOcqFy6BtwnphoFPk7LhJshD+Yk1Kt35WGWeZPTgwR4Fhw==", "license": "MIT", "engines": { "node": ">=12.17" @@ -19404,8 +16270,6 @@ }, "node_modules/apache-arrow/node_modules/command-line-args": { "version": "6.0.2", - "resolved": "https://registry.npmjs.org/command-line-args/-/command-line-args-6.0.2.tgz", - "integrity": "sha512-AIjYVxrV9X752LmPDLbVYv8aMCuHPSLZJXEo2qo/xJfv+NYhaZ4sMSF01rM+gHPaMgvPM0l5D/F+Qx+i2WfSmQ==", "license": "MIT", "dependencies": { "array-back": "^6.2.3", @@ -19427,8 +16291,6 @@ }, "node_modules/apache-arrow/node_modules/command-line-usage": { "version": "7.0.4", - "resolved": "https://registry.npmjs.org/command-line-usage/-/command-line-usage-7.0.4.tgz", - "integrity": "sha512-85UdvzTNx/+s5CkSgBm/0hzP80RFHAa7PsfeADE5ezZF3uHz3/Tqj9gIKGT9PTtpycc3Ua64T0oVulGfKxzfqg==", "license": "MIT", "dependencies": { "array-back": "^6.2.2", @@ -19442,8 +16304,6 @@ }, "node_modules/apache-arrow/node_modules/find-replace": { "version": "5.0.2", - "resolved": "https://registry.npmjs.org/find-replace/-/find-replace-5.0.2.tgz", - "integrity": "sha512-Y45BAiE3mz2QsrN2fb5QEtO4qb44NcS7en/0y9PEVsg351HsLeVclP8QPMH79Le9sH3rs5RSwJu99W0WPZO43Q==", "license": "MIT", "engines": { "node": ">=14" @@ -19459,8 +16319,6 @@ }, "node_modules/apache-arrow/node_modules/table-layout": { "version": "4.1.1", - "resolved": "https://registry.npmjs.org/table-layout/-/table-layout-4.1.1.tgz", - "integrity": "sha512-iK5/YhZxq5GO5z8wb0bY1317uDF3Zjpha0QFFLA8/trAoiLbQD0HUbMesEaxyzUgDxi2QlcbM8IvqOlEjgoXBA==", "license": "MIT", "dependencies": { "array-back": "^6.2.2", @@ -19472,8 +16330,6 @@ }, "node_modules/apache-arrow/node_modules/typical": { "version": "7.3.0", - "resolved": "https://registry.npmjs.org/typical/-/typical-7.3.0.tgz", - "integrity": "sha512-ya4mg/30vm+DOWfBg4YK3j2WD6TWtRkCbasOJr40CseYENzCUby/7rIvXA99JGsQHeNxLbnXdyLLxKSv3tauFw==", "license": "MIT", "engines": { "node": ">=12.17" @@ -19481,8 +16337,6 @@ }, "node_modules/apache-arrow/node_modules/wordwrapjs": { "version": "5.1.1", - "resolved": "https://registry.npmjs.org/wordwrapjs/-/wordwrapjs-5.1.1.tgz", - "integrity": "sha512-0yweIbkINJodk27gX9LBGMzyQdBDan3s/dEAiwBOj+Mf0PPyWL6/rikalkv8EeD0E8jm4o5RXEOrFTP3NXbhJg==", "license": "MIT", "engines": { "node": ">=12.17" @@ -19490,20 +16344,14 @@ }, "node_modules/arg": { "version": "5.0.2", - "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", - "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", "license": "MIT" }, "node_modules/argparse": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", "license": "Python-2.0" }, "node_modules/aria-query": { "version": "5.3.0", - "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.0.tgz", - "integrity": "sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==", "license": "Apache-2.0", "dependencies": { "dequal": "^2.0.3" @@ -19511,8 +16359,6 @@ }, "node_modules/array-back": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/array-back/-/array-back-3.1.0.tgz", - "integrity": "sha512-TkuxA4UCOvxuDK6NZYXCalszEzj+TLszyASooky+i742l9TqsOdYCMJJupxRic61hwquNtppB3hgcuq9SVSH1Q==", "dev": true, "license": "MIT", "engines": { @@ -19521,8 +16367,6 @@ }, "node_modules/array-buffer-byte-length": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.2.tgz", - "integrity": "sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==", "license": "MIT", "dependencies": { "call-bound": "^1.0.3", @@ -19537,14 +16381,10 @@ }, "node_modules/array-flatten": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", "license": "MIT" }, "node_modules/array-includes": { "version": "3.1.9", - "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.9.tgz", - "integrity": "sha512-FmeCCAenzH0KH381SPT5FZmiA/TmpndpcaShhfgEN9eCVjnFBqq3l1xrI42y8+PPLI6hypzou4GXw00WHmPBLQ==", "license": "MIT", "dependencies": { "call-bind": "^1.0.8", @@ -19565,8 +16405,6 @@ }, "node_modules/array-union": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", "license": "MIT", "engines": { "node": ">=8" @@ -19574,8 +16412,6 @@ }, "node_modules/array-uniq": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", - "integrity": "sha512-MNha4BWQ6JbwhFhj03YK552f7cb3AzoE8SzeljgChvL1dl3IcvggXVz1DilzySZkCja+CXuZbdW7yATchWn8/Q==", "dev": true, "license": "MIT", "engines": { @@ -19584,8 +16420,6 @@ }, "node_modules/array.prototype.findlast": { "version": "1.2.5", - "resolved": "https://registry.npmjs.org/array.prototype.findlast/-/array.prototype.findlast-1.2.5.tgz", - "integrity": "sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==", "license": "MIT", "dependencies": { "call-bind": "^1.0.7", @@ -19604,8 +16438,6 @@ }, "node_modules/array.prototype.flat": { "version": "1.3.3", - "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.3.tgz", - "integrity": "sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg==", "license": "MIT", "dependencies": { "call-bind": "^1.0.8", @@ -19622,8 +16454,6 @@ }, "node_modules/array.prototype.flatmap": { "version": "1.3.3", - "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.3.tgz", - "integrity": "sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg==", "license": "MIT", "dependencies": { "call-bind": "^1.0.8", @@ -19640,8 +16470,6 @@ }, "node_modules/array.prototype.tosorted": { "version": "1.1.4", - "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.4.tgz", - "integrity": "sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA==", "license": "MIT", "dependencies": { "call-bind": "^1.0.7", @@ -19656,8 +16484,6 @@ }, "node_modules/arraybuffer.prototype.slice": { "version": "1.0.4", - "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.4.tgz", - "integrity": "sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==", "license": "MIT", "dependencies": { "array-buffer-byte-length": "^1.0.1", @@ -19677,8 +16503,6 @@ }, "node_modules/arrify": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/arrify/-/arrify-3.0.0.tgz", - "integrity": "sha512-tLkvA81vQG/XqE2mjDkGQHoOINtMHtysSnemrmoGe6PydDPMRbVugqyk4A6V/WDWEfm3l+0d8anA9r8cv/5Jaw==", "license": "MIT", "engines": { "node": ">=12" @@ -19689,8 +16513,6 @@ }, "node_modules/asn1js": { "version": "3.0.7", - "resolved": "https://registry.npmjs.org/asn1js/-/asn1js-3.0.7.tgz", - "integrity": "sha512-uLvq6KJu04qoQM6gvBfKFjlh6Gl0vOKQuR5cJMDHQkmwfMOQeN3F3SHCv9SNYSL+CRoHvOGFfllDlVz03GQjvQ==", "license": "BSD-3-Clause", "dependencies": { "pvtsutils": "^1.3.6", @@ -19703,8 +16525,6 @@ }, "node_modules/assertion-error": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-2.0.1.tgz", - "integrity": "sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==", "dev": true, "license": "MIT", "engines": { @@ -19713,8 +16533,6 @@ }, "node_modules/ast-types": { "version": "0.16.1", - "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.16.1.tgz", - "integrity": "sha512-6t10qk83GOG8p0vKmaCr8eiilZwO171AvbROMtvvNiwrTly62t+7XkA8RdIIVbpMhCASAsxgAzdRSwh6nw/5Dg==", "dev": true, "license": "MIT", "dependencies": { @@ -19726,8 +16544,6 @@ }, "node_modules/astring": { "version": "1.9.0", - "resolved": "https://registry.npmjs.org/astring/-/astring-1.9.0.tgz", - "integrity": "sha512-LElXdjswlqjWrPpJFg1Fx4wpkOCxj1TDHlSV4PlaRxHGWko024xICaa97ZkMfs6DRKlCguiAI+rbXv5GWwXIkg==", "license": "MIT", "bin": { "astring": "bin/astring" @@ -19735,8 +16551,6 @@ }, "node_modules/async-function": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/async-function/-/async-function-1.0.0.tgz", - "integrity": "sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==", "license": "MIT", "engines": { "node": ">= 0.4" @@ -19744,20 +16558,14 @@ }, "node_modules/async-sema": { "version": "3.1.1", - "resolved": "https://registry.npmjs.org/async-sema/-/async-sema-3.1.1.tgz", - "integrity": "sha512-tLRNUXati5MFePdAk8dw7Qt7DpxPB60ofAgn8WRhW6a2rcimZnYBP9oxHiv0OHy+Wz7kPMG+t4LGdt31+4EmGg==", "license": "MIT" }, "node_modules/asynckit": { "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", "license": "MIT" }, "node_modules/author-regex": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/author-regex/-/author-regex-1.0.0.tgz", - "integrity": "sha512-KbWgR8wOYRAPekEmMXrYYdc7BRyhn2Ftk7KWfMUnQ43hFdojWEFRxhhRUm3/OFEdPa1r0KAvTTg9YQK57xTe0g==", "dev": true, "license": "MIT", "engines": { @@ -19766,8 +16574,6 @@ }, "node_modules/auto": { "version": "11.3.6", - "resolved": "https://registry.npmjs.org/auto/-/auto-11.3.6.tgz", - "integrity": "sha512-Db13X4WVNPzPtWKSoiOzhfW2g3zNUTDR1X3wkQPdIW21xtajwm5Taqg3BXWR2u7/45W0bU+6YykVgioNRwrwIw==", "dev": true, "license": "MIT", "dependencies": { @@ -19793,8 +16599,6 @@ }, "node_modules/auto/node_modules/ansi-styles": { "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "license": "MIT", "dependencies": { @@ -19809,8 +16613,6 @@ }, "node_modules/auto/node_modules/chalk": { "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "license": "MIT", "dependencies": { @@ -19826,15 +16628,11 @@ }, "node_modules/auto/node_modules/tslib": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.1.0.tgz", - "integrity": "sha512-hcVC3wYEziELGGmEEXue7D75zbwIIVUMWAVbHItGPx0ziyXxrOMQx4rQEVEV45Ut/1IotuEvwqPopzIOkDMf0A==", "dev": true, "license": "0BSD" }, "node_modules/autoprefixer": { "version": "10.4.27", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.27.tgz", - "integrity": "sha512-NP9APE+tO+LuJGn7/9+cohklunJsXWiaWEfV3si4Gi/XHDwVNgkwr1J3RQYFIvPy76GmJ9/bW8vyoU1LcxwKHA==", "funding": [ { "type": "opencollective", @@ -19869,8 +16667,6 @@ }, "node_modules/available-typed-arrays": { "version": "1.0.7", - "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", - "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", "license": "MIT", "dependencies": { "possible-typed-array-names": "^1.0.0" @@ -19884,8 +16680,6 @@ }, "node_modules/await-to-js": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/await-to-js/-/await-to-js-3.0.0.tgz", - "integrity": "sha512-zJAaP9zxTcvTHRlejau3ZOY4V7SRpiByf3/dxx2uyKxxor19tpmpV2QRsTKikckwhaPmr2dVpxxMr7jOCYVp5g==", "dev": true, "license": "MIT", "engines": { @@ -19894,8 +16688,6 @@ }, "node_modules/axios": { "version": "1.15.0", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.15.0.tgz", - "integrity": "sha512-wWyJDlAatxk30ZJer+GeCWS209sA42X+N5jU2jy6oHTp7ufw8uzUTVFBX9+wTfAlhiJXGS0Bq7X6efruWjuK9Q==", "license": "MIT", "dependencies": { "follow-redirects": "^1.15.11", @@ -19905,8 +16697,6 @@ }, "node_modules/axios-retry": { "version": "4.5.0", - "resolved": "https://registry.npmjs.org/axios-retry/-/axios-retry-4.5.0.tgz", - "integrity": "sha512-aR99oXhpEDGo0UuAlYcn2iGRds30k366Zfa05XWScR9QaQD4JYiP3/1Qt1u7YlefUOK+cn0CcwoL1oefavQUlQ==", "license": "Apache-2.0", "dependencies": { "is-retry-allowed": "^2.2.0" @@ -19917,8 +16707,6 @@ }, "node_modules/babel-jest": { "version": "30.2.0", - "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-30.2.0.tgz", - "integrity": "sha512-0YiBEOxWqKkSQWL9nNGGEgndoeL0ZpWrbLMNL5u/Kaxrli3Eaxlt3ZtIDktEvXt4L/R9r3ODr2zKwGM/2BjxVw==", "license": "MIT", "dependencies": { "@jest/transform": "30.2.0", @@ -19938,8 +16726,6 @@ }, "node_modules/babel-jest/node_modules/ansi-styles": { "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "license": "MIT", "dependencies": { "color-convert": "^2.0.1" @@ -19953,8 +16739,6 @@ }, "node_modules/babel-jest/node_modules/chalk": { "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", @@ -19969,8 +16753,6 @@ }, "node_modules/babel-loader": { "version": "9.2.1", - "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-9.2.1.tgz", - "integrity": "sha512-fqe8naHt46e0yIdkjUZYqddSXfej3AHajX+CSO5X7oy0EmPc6o5Xh+RClNoHjnieWz9AW4kZxW9yyFMhVB1QLA==", "license": "MIT", "dependencies": { "find-cache-dir": "^4.0.0", @@ -19986,8 +16768,6 @@ }, "node_modules/babel-plugin-dynamic-import-node": { "version": "2.3.3", - "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz", - "integrity": "sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ==", "license": "MIT", "dependencies": { "object.assign": "^4.1.0" @@ -19995,8 +16775,6 @@ }, "node_modules/babel-plugin-istanbul": { "version": "7.0.1", - "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-7.0.1.tgz", - "integrity": "sha512-D8Z6Qm8jCvVXtIRkBnqNHX0zJ37rQcFJ9u8WOS6tkYOsRdHBzypCstaxWiu5ZIlqQtviRYbgnRLSoCEvjqcqbA==", "license": "BSD-3-Clause", "workspaces": [ "test/babel-8" @@ -20014,8 +16792,6 @@ }, "node_modules/babel-plugin-jest-hoist": { "version": "30.2.0", - "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-30.2.0.tgz", - "integrity": "sha512-ftzhzSGMUnOzcCXd6WHdBGMyuwy15Wnn0iyyWGKgBDLxf9/s5ABuraCSpBX2uG0jUg4rqJnxsLc5+oYBqoxVaA==", "license": "MIT", "dependencies": { "@types/babel__core": "^7.20.5" @@ -20026,8 +16802,6 @@ }, "node_modules/babel-plugin-polyfill-corejs2": { "version": "0.4.15", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.15.tgz", - "integrity": "sha512-hR3GwrRwHUfYwGfrisXPIDP3JcYfBrW7wKE7+Au6wDYl7fm/ka1NEII6kORzxNU556JjfidZeBsO10kYvtV1aw==", "license": "MIT", "dependencies": { "@babel/compat-data": "^7.28.6", @@ -20040,8 +16814,6 @@ }, "node_modules/babel-plugin-polyfill-corejs2/node_modules/semver": { "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "license": "ISC", "bin": { "semver": "bin/semver.js" @@ -20049,8 +16821,6 @@ }, "node_modules/babel-plugin-polyfill-corejs3": { "version": "0.13.0", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.13.0.tgz", - "integrity": "sha512-U+GNwMdSFgzVmfhNm8GJUX88AadB3uo9KpJqS3FaqNIPKgySuvMb+bHPsOmmuWyIcuqZj/pzt1RUIUZns4y2+A==", "license": "MIT", "dependencies": { "@babel/helper-define-polyfill-provider": "^0.6.5", @@ -20062,8 +16832,6 @@ }, "node_modules/babel-plugin-polyfill-regenerator": { "version": "0.6.6", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.6.tgz", - "integrity": "sha512-hYm+XLYRMvupxiQzrvXUj7YyvFFVfv5gI0R71AJzudg1g2AI2vyCPPIFEBjk162/wFzti3inBHo7isWFuEVS/A==", "license": "MIT", "dependencies": { "@babel/helper-define-polyfill-provider": "^0.6.6" @@ -20074,8 +16842,6 @@ }, "node_modules/babel-preset-current-node-syntax": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.2.0.tgz", - "integrity": "sha512-E/VlAEzRrsLEb2+dv8yp3bo4scof3l9nR4lrld+Iy5NyVqgVYUJnDAmunkhPMisRI32Qc4iRiz425d8vM++2fg==", "license": "MIT", "dependencies": { "@babel/plugin-syntax-async-generators": "^7.8.4", @@ -20100,8 +16866,6 @@ }, "node_modules/babel-preset-jest": { "version": "30.2.0", - "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-30.2.0.tgz", - "integrity": "sha512-US4Z3NOieAQumwFnYdUWKvUKh8+YSnS/gB3t6YBiz0bskpu7Pine8pPCheNxlPEW4wnUkma2a94YuW2q3guvCQ==", "license": "MIT", "dependencies": { "babel-plugin-jest-hoist": "30.2.0", @@ -20116,8 +16880,6 @@ }, "node_modules/bail": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/bail/-/bail-2.0.2.tgz", - "integrity": "sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==", "license": "MIT", "funding": { "type": "github", @@ -20126,8 +16888,6 @@ }, "node_modules/balanced-match": { "version": "4.0.4", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", - "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", "license": "MIT", "engines": { "node": "18 || 20 || >=22" @@ -20135,8 +16895,6 @@ }, "node_modules/base64-arraybuffer": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-1.0.2.tgz", - "integrity": "sha512-I3yl4r9QB5ZRY3XuJVEPfc2XhZO6YweFPI+UovAzn+8/hb3oJ6lnysaFcjVpkCPfVWFUDvoZ8kmVDP7WyRtYtQ==", "license": "MIT", "engines": { "node": ">= 0.6.0" @@ -20144,8 +16902,6 @@ }, "node_modules/base64-js": { "version": "1.5.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", "funding": [ { "type": "github", @@ -20164,8 +16920,6 @@ }, "node_modules/baseline-browser-mapping": { "version": "2.10.0", - "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.10.0.tgz", - "integrity": "sha512-lIyg0szRfYbiy67j9KN8IyeD7q7hcmqnJ1ddWmNt19ItGpNN64mnllmxUNFIOdOm6by97jlL6wfpTTJrmnjWAA==", "license": "Apache-2.0", "bin": { "baseline-browser-mapping": "dist/cli.cjs" @@ -20176,21 +16930,15 @@ }, "node_modules/batch": { "version": "0.6.1", - "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", - "integrity": "sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==", "license": "MIT" }, "node_modules/before-after-hook": { "version": "2.2.3", - "resolved": "https://registry.npmjs.org/before-after-hook/-/before-after-hook-2.2.3.tgz", - "integrity": "sha512-NzUnlZexiaH/46WDhANlyR2bXRopNg4F/zuSA3OpZnllCUgRaOF2znDioDWrmbNVsuZk6l9pMquQB38cfBZwkQ==", "dev": true, "license": "Apache-2.0" }, "node_modules/better-path-resolve": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/better-path-resolve/-/better-path-resolve-1.0.0.tgz", - "integrity": "sha512-pbnl5XzGBdrFU/wT4jqmJVPn2B6UHPBOhzMQkY/SPUPB6QtUXtmBHBIwCbXJol93mOpGMnQyP/+BB19q04xj7g==", "dev": true, "license": "MIT", "dependencies": { @@ -20202,8 +16950,6 @@ }, "node_modules/better-sqlite3": { "version": "11.10.0", - "resolved": "https://registry.npmjs.org/better-sqlite3/-/better-sqlite3-11.10.0.tgz", - "integrity": "sha512-EwhOpyXiOEL/lKzHz9AW1msWFNzGc/z+LzeB3/jnFJpxu+th2yqvzsSWas1v9jgs9+xiXJcD5A8CJxAG2TaghQ==", "dev": true, "hasInstallScript": true, "license": "MIT", @@ -20214,8 +16960,6 @@ }, "node_modules/big.js": { "version": "6.2.2", - "resolved": "https://registry.npmjs.org/big.js/-/big.js-6.2.2.tgz", - "integrity": "sha512-y/ie+Faknx7sZA5MfGA2xKlu0GDv8RWrXGsmlteyJQ2lvoKv9GBK/fpRMc2qlSoBAgNxrixICFCBefIq8WCQpQ==", "license": "MIT", "engines": { "node": "*" @@ -20227,8 +16971,6 @@ }, "node_modules/bignumber.js": { "version": "9.3.1", - "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.3.1.tgz", - "integrity": "sha512-Ko0uX15oIUS7wJ3Rb30Fs6SkVbLmPBAKdlm7q9+ak9bbIeFf0MwuBsQV6z7+X768/cHsfg+WlysDWJcmthjsjQ==", "license": "MIT", "engines": { "node": "*" @@ -20236,8 +16978,6 @@ }, "node_modules/binary-extensions": { "version": "2.3.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", - "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", "license": "MIT", "engines": { "node": ">=8" @@ -20248,8 +16988,6 @@ }, "node_modules/bindings": { "version": "1.5.0", - "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", - "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", "license": "MIT", "dependencies": { "file-uri-to-path": "1.0.0" @@ -20257,8 +16995,6 @@ }, "node_modules/bl": { "version": "4.1.0", - "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", - "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", "dev": true, "license": "MIT", "dependencies": { @@ -20269,8 +17005,6 @@ }, "node_modules/bl/node_modules/buffer": { "version": "5.7.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", - "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", "dev": true, "funding": [ { @@ -20294,8 +17028,6 @@ }, "node_modules/body-parser": { "version": "1.20.4", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.4.tgz", - "integrity": "sha512-ZTgYYLMOXY9qKU/57FAo8F+HA2dGX7bqGc71txDRC1rS4frdFI5R7NhluHxH6M0YItAP0sHB4uqAOcYKxO6uGA==", "license": "MIT", "dependencies": { "bytes": "~3.1.2", @@ -20318,8 +17050,6 @@ }, "node_modules/body-parser/node_modules/debug": { "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "license": "MIT", "dependencies": { "ms": "2.0.0" @@ -20327,8 +17057,6 @@ }, "node_modules/body-parser/node_modules/iconv-lite": { "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", "license": "MIT", "dependencies": { "safer-buffer": ">= 2.1.2 < 3" @@ -20339,14 +17067,10 @@ }, "node_modules/body-parser/node_modules/ms": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "license": "MIT" }, "node_modules/body-parser/node_modules/raw-body": { "version": "2.5.3", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.3.tgz", - "integrity": "sha512-s4VSOf6yN0rvbRZGxs8Om5CWj6seneMwK3oDb4lWDH0UPhWcxwOWw5+qk24bxq87szX1ydrwylIOp2uG1ojUpA==", "license": "MIT", "dependencies": { "bytes": "~3.1.2", @@ -20360,8 +17084,6 @@ }, "node_modules/bonjour-service": { "version": "1.3.0", - "resolved": "https://registry.npmjs.org/bonjour-service/-/bonjour-service-1.3.0.tgz", - "integrity": "sha512-3YuAUiSkWykd+2Azjgyxei8OWf8thdn8AITIog2M4UICzoqfjlqr64WIjEXZllf/W6vK1goqleSR6brGomxQqA==", "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.3", @@ -20370,26 +17092,18 @@ }, "node_modules/boolbase": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", - "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", "license": "ISC" }, "node_modules/bottleneck": { "version": "2.19.5", - "resolved": "https://registry.npmjs.org/bottleneck/-/bottleneck-2.19.5.tgz", - "integrity": "sha512-VHiNCbI1lKdl44tGrhNfU3lup0Tj/ZBMJB5/2ZbNXRCPuRCO7ed2mgcK4r17y+KB2EfuYuRaVlwNbAeaWGSpbw==", "license": "MIT" }, "node_modules/bowser": { "version": "2.14.1", - "resolved": "https://registry.npmjs.org/bowser/-/bowser-2.14.1.tgz", - "integrity": "sha512-tzPjzCxygAKWFOJP011oxFHs57HzIhOEracIgAePE4pqB3LikALKnSzUyU4MGs9/iCEUuHlAJTjTc5M+u7YEGg==", "license": "MIT" }, "node_modules/boxen": { "version": "8.0.1", - "resolved": "https://registry.npmjs.org/boxen/-/boxen-8.0.1.tgz", - "integrity": "sha512-F3PH5k5juxom4xktynS7MoFY+NUWH5LC4CnH11YB8NPew+HLpmBLCybSAEyb2F+4pRXhuhWqFesoQd6DAyc2hw==", "dev": true, "license": "MIT", "dependencies": { @@ -20411,8 +17125,6 @@ }, "node_modules/boxen/node_modules/ansi-regex": { "version": "6.2.2", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", - "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", "dev": true, "license": "MIT", "engines": { @@ -20424,8 +17136,6 @@ }, "node_modules/boxen/node_modules/camelcase": { "version": "8.0.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-8.0.0.tgz", - "integrity": "sha512-8WB3Jcas3swSvjIeA2yvCJ+Miyz5l1ZmB6HFb9R1317dt9LCQoswg/BGrmAmkWVEszSrrg4RwmO46qIm2OEnSA==", "dev": true, "license": "MIT", "engines": { @@ -20437,8 +17147,6 @@ }, "node_modules/boxen/node_modules/string-width": { "version": "7.2.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", - "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", "dev": true, "license": "MIT", "dependencies": { @@ -20455,8 +17163,6 @@ }, "node_modules/boxen/node_modules/strip-ansi": { "version": "7.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz", - "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", "dev": true, "license": "MIT", "dependencies": { @@ -20471,8 +17177,6 @@ }, "node_modules/boxen/node_modules/type-fest": { "version": "4.41.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.41.0.tgz", - "integrity": "sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==", "dev": true, "license": "(MIT OR CC0-1.0)", "engines": { @@ -20484,8 +17188,6 @@ }, "node_modules/brace-expansion": { "version": "5.0.4", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.4.tgz", - "integrity": "sha512-h+DEnpVvxmfVefa4jFbCf5HdH5YMDXRsmKflpf1pILZWRFlTbJpxeU55nJl4Smt5HQaGzg1o6RHFPJaOqnmBDg==", "license": "MIT", "dependencies": { "balanced-match": "^4.0.2" @@ -20496,8 +17198,6 @@ }, "node_modules/braces": { "version": "3.0.3", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", - "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", "license": "MIT", "dependencies": { "fill-range": "^7.1.1" @@ -20508,8 +17208,6 @@ }, "node_modules/browserslist": { "version": "4.28.1", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.1.tgz", - "integrity": "sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA==", "funding": [ { "type": "opencollective", @@ -20541,8 +17239,6 @@ }, "node_modules/bser": { "version": "2.1.1", - "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", - "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", "license": "Apache-2.0", "dependencies": { "node-int64": "^0.4.0" @@ -20550,8 +17246,6 @@ }, "node_modules/buffer": { "version": "6.0.3", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", - "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", "funding": [ { "type": "github", @@ -20574,20 +17268,14 @@ }, "node_modules/buffer-equal-constant-time": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", - "integrity": "sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==", "license": "BSD-3-Clause" }, "node_modules/buffer-from": { "version": "1.1.2", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", "license": "MIT" }, "node_modules/bull": { "version": "4.16.5", - "resolved": "https://registry.npmjs.org/bull/-/bull-4.16.5.tgz", - "integrity": "sha512-lDsx2BzkKe7gkCYiT5Acj02DpTwDznl/VNN7Psn7M3USPG7Vs/BaClZJJTAG+ufAR9++N1/NiUTdaFBWDIl5TQ==", "license": "MIT", "optional": true, "dependencies": { @@ -20605,8 +17293,6 @@ }, "node_modules/bull/node_modules/uuid": { "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", "license": "MIT", "optional": true, "bin": { @@ -20615,8 +17301,6 @@ }, "node_modules/bundle-name": { "version": "4.1.0", - "resolved": "https://registry.npmjs.org/bundle-name/-/bundle-name-4.1.0.tgz", - "integrity": "sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q==", "license": "MIT", "dependencies": { "run-applescript": "^7.0.0" @@ -20630,8 +17314,6 @@ }, "node_modules/bundle-require": { "version": "5.1.0", - "resolved": "https://registry.npmjs.org/bundle-require/-/bundle-require-5.1.0.tgz", - "integrity": "sha512-3WrrOuZiyaaZPWiEt4G3+IffISVC9HYlWueJEBWED4ZH4aIAC2PnkdnuRrR94M+w6yGWn4AglWtJtBI8YqvgoA==", "license": "MIT", "dependencies": { "load-tsconfig": "^0.2.3" @@ -20645,8 +17327,6 @@ }, "node_modules/bytes": { "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", "license": "MIT", "engines": { "node": ">= 0.8" @@ -20654,8 +17334,6 @@ }, "node_modules/bytestreamjs": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/bytestreamjs/-/bytestreamjs-2.0.1.tgz", - "integrity": "sha512-U1Z/ob71V/bXfVABvNr/Kumf5VyeQRBEm6Txb0PQ6S7V5GpBM3w4Cbqz/xPDicR5tN0uvDifng8C+5qECeGwyQ==", "license": "BSD-3-Clause", "engines": { "node": ">=6.0.0" @@ -20663,8 +17341,6 @@ }, "node_modules/cac": { "version": "6.7.14", - "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz", - "integrity": "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==", "license": "MIT", "engines": { "node": ">=8" @@ -20672,8 +17348,6 @@ }, "node_modules/cacache": { "version": "20.0.3", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-20.0.3.tgz", - "integrity": "sha512-3pUp4e8hv07k1QlijZu6Kn7c9+ZpWWk4j3F8N3xPuCExULobqJydKYOTj1FTq58srkJsXvO7LbGAH4C0ZU3WGw==", "license": "ISC", "dependencies": { "@npmcli/fs": "^5.0.0", @@ -20694,8 +17368,6 @@ }, "node_modules/cacache/node_modules/lru-cache": { "version": "11.2.6", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.2.6.tgz", - "integrity": "sha512-ESL2CrkS/2wTPfuend7Zhkzo2u0daGJ/A2VucJOgQ/C48S/zB8MMeMHSGKYpXhIjbPxfuezITkaBH1wqv00DDQ==", "license": "BlueOak-1.0.0", "engines": { "node": "20 || >=22" @@ -20703,8 +17375,6 @@ }, "node_modules/cacache/node_modules/p-map": { "version": "7.0.4", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-7.0.4.tgz", - "integrity": "sha512-tkAQEw8ysMzmkhgw8k+1U/iPhWNhykKnSk4Rd5zLoPJCuJaGRPo6YposrZgaxHKzDHdDWWZvE/Sk7hsL2X/CpQ==", "license": "MIT", "engines": { "node": ">=18" @@ -20715,8 +17385,6 @@ }, "node_modules/cacheable-lookup": { "version": "7.0.0", - "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-7.0.0.tgz", - "integrity": "sha512-+qJyx4xiKra8mZrcwhjMRMUhD5NR1R8esPkzIYxX96JiecFoxAXFuz/GpR3+ev4PE1WamHip78wV0vcmPQtp8w==", "license": "MIT", "engines": { "node": ">=14.16" @@ -20724,8 +17392,6 @@ }, "node_modules/cacheable-request": { "version": "10.2.14", - "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-10.2.14.tgz", - "integrity": "sha512-zkDT5WAF4hSSoUgyfg5tFIxz8XQK+25W/TLVojJTMKBaxevLBBtLxgqguAuVQB8PVW79FVjHcU+GJ9tVbDZ9mQ==", "license": "MIT", "dependencies": { "@types/http-cache-semantics": "^4.0.2", @@ -20742,8 +17408,6 @@ }, "node_modules/call-bind": { "version": "1.0.8", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz", - "integrity": "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==", "license": "MIT", "dependencies": { "call-bind-apply-helpers": "^1.0.0", @@ -20760,8 +17424,6 @@ }, "node_modules/call-bind-apply-helpers": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", - "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", "license": "MIT", "dependencies": { "es-errors": "^1.3.0", @@ -20773,8 +17435,6 @@ }, "node_modules/call-bound": { "version": "1.0.4", - "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", - "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", "license": "MIT", "dependencies": { "call-bind-apply-helpers": "^1.0.2", @@ -20789,8 +17449,6 @@ }, "node_modules/callsites": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", "license": "MIT", "engines": { "node": ">=6" @@ -20798,8 +17456,6 @@ }, "node_modules/camel-case": { "version": "4.1.2", - "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz", - "integrity": "sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==", "license": "MIT", "dependencies": { "pascal-case": "^3.1.2", @@ -20808,8 +17464,6 @@ }, "node_modules/camelcase": { "version": "6.3.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", - "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", "license": "MIT", "engines": { "node": ">=10" @@ -20820,8 +17474,6 @@ }, "node_modules/caniuse-api": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz", - "integrity": "sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==", "license": "MIT", "dependencies": { "browserslist": "^4.0.0", @@ -20832,8 +17484,6 @@ }, "node_modules/caniuse-lite": { "version": "1.0.30001775", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001775.tgz", - "integrity": "sha512-s3Qv7Lht9zbVKE9XoTyRG6wVDCKdtOFIjBGg3+Yhn6JaytuNKPIjBMTMIY1AnOH3seL5mvF+x33oGAyK3hVt3A==", "funding": [ { "type": "opencollective", @@ -20852,8 +17502,6 @@ }, "node_modules/ccount": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/ccount/-/ccount-2.0.1.tgz", - "integrity": "sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==", "license": "MIT", "funding": { "type": "github", @@ -20862,8 +17510,6 @@ }, "node_modules/chai": { "version": "5.3.3", - "resolved": "https://registry.npmjs.org/chai/-/chai-5.3.3.tgz", - "integrity": "sha512-4zNhdJD/iOjSH0A05ea+Ke6MU5mmpQcbQsSOkgdaUMJ9zTlDTD/GYlwohmIE2u0gaxHYiVHEn1Fw9mZ/ktJWgw==", "dev": true, "license": "MIT", "dependencies": { @@ -20879,8 +17525,6 @@ }, "node_modules/chalk": { "version": "5.6.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.6.2.tgz", - "integrity": "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==", "license": "MIT", "engines": { "node": "^12.17.0 || ^14.13 || >=16.0.0" @@ -20891,8 +17535,6 @@ }, "node_modules/chalk-template": { "version": "0.4.0", - "resolved": "https://registry.npmjs.org/chalk-template/-/chalk-template-0.4.0.tgz", - "integrity": "sha512-/ghrgmhfY8RaSdeo43hNXxpoHAtxdbskUHjPpfqUWGttFgycUhYPGx3YZBCnUCvOa7Doivn1IZec3DEGFoMgLg==", "license": "MIT", "dependencies": { "chalk": "^4.1.2" @@ -20906,8 +17548,6 @@ }, "node_modules/chalk-template/node_modules/ansi-styles": { "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "license": "MIT", "dependencies": { "color-convert": "^2.0.1" @@ -20921,8 +17561,6 @@ }, "node_modules/chalk-template/node_modules/chalk": { "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", @@ -20937,15 +17575,11 @@ }, "node_modules/change-case": { "version": "5.4.4", - "resolved": "https://registry.npmjs.org/change-case/-/change-case-5.4.4.tgz", - "integrity": "sha512-HRQyTk2/YPEkt9TnUPbOpr64Uw3KOicFWPVBb+xiHvd6eBx/qPr9xqfBFDT8P2vWsvvz4jbEkfDe71W3VyNu2w==", "dev": true, "license": "MIT" }, "node_modules/char-regex": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", - "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", "license": "MIT", "engines": { "node": ">=10" @@ -20953,8 +17587,6 @@ }, "node_modules/character-entities": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-2.0.2.tgz", - "integrity": "sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==", "license": "MIT", "funding": { "type": "github", @@ -20963,8 +17595,6 @@ }, "node_modules/character-entities-html4": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/character-entities-html4/-/character-entities-html4-2.1.0.tgz", - "integrity": "sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==", "license": "MIT", "funding": { "type": "github", @@ -20973,8 +17603,6 @@ }, "node_modules/character-entities-legacy": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-3.0.0.tgz", - "integrity": "sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==", "license": "MIT", "funding": { "type": "github", @@ -20983,8 +17611,6 @@ }, "node_modules/character-reference-invalid": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-2.0.1.tgz", - "integrity": "sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==", "license": "MIT", "funding": { "type": "github", @@ -20993,15 +17619,11 @@ }, "node_modules/chardet": { "version": "2.1.1", - "resolved": "https://registry.npmjs.org/chardet/-/chardet-2.1.1.tgz", - "integrity": "sha512-PsezH1rqdV9VvyNhxxOW32/d75r01NY7TQCmOqomRo15ZSOKbpTFVsfjghxo6JloQUCGnH4k1LGu0R4yCLlWQQ==", "dev": true, "license": "MIT" }, "node_modules/charenc": { "version": "0.0.2", - "resolved": "https://registry.npmjs.org/charenc/-/charenc-0.0.2.tgz", - "integrity": "sha512-yrLQ/yVUFXkzg7EDQsPieE/53+0RlaWTs+wBrvW36cyilJ2SaDWfl4Yj7MtLTXleV9uEKefbAGUPv2/iWSooRA==", "license": "BSD-3-Clause", "engines": { "node": "*" @@ -21009,8 +17631,6 @@ }, "node_modules/check-error": { "version": "2.1.3", - "resolved": "https://registry.npmjs.org/check-error/-/check-error-2.1.3.tgz", - "integrity": "sha512-PAJdDJusoxnwm1VwW07VWwUN1sl7smmC3OKggvndJFadxxDRyFJBX/ggnu/KE4kQAB7a3Dp8f/YXC1FlUprWmA==", "dev": true, "license": "MIT", "engines": { @@ -21019,8 +17639,6 @@ }, "node_modules/cheerio": { "version": "1.0.0-rc.12", - "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.12.tgz", - "integrity": "sha512-VqR8m68vM46BNnuZ5NtnGBKIE/DfN0cRIzg9n40EIq9NOv90ayxLBXA8fXC5gquFRGJSTRqBq25Jt2ECLR431Q==", "license": "MIT", "dependencies": { "cheerio-select": "^2.1.0", @@ -21040,8 +17658,6 @@ }, "node_modules/cheerio-select": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cheerio-select/-/cheerio-select-2.1.0.tgz", - "integrity": "sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g==", "license": "BSD-2-Clause", "dependencies": { "boolbase": "^1.0.0", @@ -21057,8 +17673,6 @@ }, "node_modules/chevrotain": { "version": "11.1.2", - "resolved": "https://registry.npmjs.org/chevrotain/-/chevrotain-11.1.2.tgz", - "integrity": "sha512-opLQzEVriiH1uUQ4Kctsd49bRoFDXGGSC4GUqj7pGyxM3RehRhvTlZJc1FL/Flew2p5uwxa1tUDWKzI4wNM8pg==", "license": "Apache-2.0", "dependencies": { "@chevrotain/cst-dts-gen": "11.1.2", @@ -21071,8 +17685,6 @@ }, "node_modules/chevrotain-allstar": { "version": "0.3.1", - "resolved": "https://registry.npmjs.org/chevrotain-allstar/-/chevrotain-allstar-0.3.1.tgz", - "integrity": "sha512-b7g+y9A0v4mxCW1qUhf3BSVPg+/NvGErk/dOkrDaHA0nQIQGAtrOjlX//9OQtRlSCy+x9rfB5N8yC71lH1nvMw==", "license": "MIT", "dependencies": { "lodash-es": "^4.17.21" @@ -21083,8 +17695,6 @@ }, "node_modules/chokidar": { "version": "3.6.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", - "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", "license": "MIT", "dependencies": { "anymatch": "~3.1.2", @@ -21107,8 +17717,6 @@ }, "node_modules/chownr": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-3.0.0.tgz", - "integrity": "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==", "license": "BlueOak-1.0.0", "engines": { "node": ">=18" @@ -21116,8 +17724,6 @@ }, "node_modules/chrome-trace-event": { "version": "1.0.4", - "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.4.tgz", - "integrity": "sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==", "license": "MIT", "engines": { "node": ">=6.0" @@ -21125,8 +17731,6 @@ }, "node_modules/ci-info": { "version": "3.9.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", - "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", "funding": [ { "type": "github", @@ -21140,14 +17744,10 @@ }, "node_modules/cjs-module-lexer": { "version": "2.2.0", - "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-2.2.0.tgz", - "integrity": "sha512-4bHTS2YuzUvtoLjdy+98ykbNB5jS0+07EvFNXerqZQJ89F7DI6ET7OQo/HJuW6K0aVsKA9hj9/RVb2kQVOrPDQ==", "license": "MIT" }, "node_modules/clean-css": { "version": "5.3.3", - "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-5.3.3.tgz", - "integrity": "sha512-D5J+kHaVb/wKSFcyyV75uCn8fiY4sV38XJoe4CUyGQ+mOU/fMVYUdH1hJC+CJQ5uY3EnW27SbJYS4X8BiLrAFg==", "license": "MIT", "dependencies": { "source-map": "~0.6.0" @@ -21158,8 +17758,6 @@ }, "node_modules/clean-css/node_modules/source-map": { "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" @@ -21167,8 +17765,6 @@ }, "node_modules/clean-stack": { "version": "2.2.0", - "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", - "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", "license": "MIT", "engines": { "node": ">=6" @@ -21176,8 +17772,6 @@ }, "node_modules/cli-boxes": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-3.0.0.tgz", - "integrity": "sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g==", "license": "MIT", "engines": { "node": ">=10" @@ -21188,8 +17782,6 @@ }, "node_modules/cli-cursor": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-5.0.0.tgz", - "integrity": "sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==", "dev": true, "license": "MIT", "dependencies": { @@ -21204,8 +17796,6 @@ }, "node_modules/cli-table3": { "version": "0.6.5", - "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.5.tgz", - "integrity": "sha512-+W/5efTR7y5HRD7gACw9yQjqMVvEMLBHmboM/kPWam+H+Hmyrgjh6YncVKK122YZkXrLudzTuAukUw9FnMf7IQ==", "license": "MIT", "dependencies": { "string-width": "^4.2.0" @@ -21219,14 +17809,10 @@ }, "node_modules/cli-table3/node_modules/emoji-regex": { "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", "license": "MIT" }, "node_modules/cli-table3/node_modules/is-fullwidth-code-point": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", "license": "MIT", "engines": { "node": ">=8" @@ -21234,8 +17820,6 @@ }, "node_modules/cli-table3/node_modules/string-width": { "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "license": "MIT", "dependencies": { "emoji-regex": "^8.0.0", @@ -21248,8 +17832,6 @@ }, "node_modules/cli-truncate": { "version": "5.2.0", - "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-5.2.0.tgz", - "integrity": "sha512-xRwvIOMGrfOAnM1JYtqQImuaNtDEv9v6oIYAs4LIHwTiKee8uwvIi363igssOC0O5U04i4AlENs79LQLu9tEMw==", "dev": true, "license": "MIT", "dependencies": { @@ -21265,8 +17847,6 @@ }, "node_modules/cli-width": { "version": "4.1.0", - "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-4.1.0.tgz", - "integrity": "sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==", "dev": true, "license": "ISC", "engines": { @@ -21275,8 +17855,6 @@ }, "node_modules/cliui": { "version": "8.0.1", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", - "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", "license": "ISC", "dependencies": { "string-width": "^4.2.0", @@ -21289,8 +17867,6 @@ }, "node_modules/cliui/node_modules/ansi-styles": { "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "license": "MIT", "dependencies": { "color-convert": "^2.0.1" @@ -21304,14 +17880,10 @@ }, "node_modules/cliui/node_modules/emoji-regex": { "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", "license": "MIT" }, "node_modules/cliui/node_modules/is-fullwidth-code-point": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", "license": "MIT", "engines": { "node": ">=8" @@ -21319,8 +17891,6 @@ }, "node_modules/cliui/node_modules/string-width": { "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "license": "MIT", "dependencies": { "emoji-regex": "^8.0.0", @@ -21333,8 +17903,6 @@ }, "node_modules/cliui/node_modules/wrap-ansi": { "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", "license": "MIT", "dependencies": { "ansi-styles": "^4.0.0", @@ -21350,8 +17918,6 @@ }, "node_modules/clone-deep": { "version": "4.0.1", - "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", - "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", "license": "MIT", "dependencies": { "is-plain-object": "^2.0.4", @@ -21364,8 +17930,6 @@ }, "node_modules/clone-deep/node_modules/is-plain-object": { "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", - "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", "license": "MIT", "dependencies": { "isobject": "^3.0.1" @@ -21376,8 +17940,6 @@ }, "node_modules/cloudevents": { "version": "8.0.3", - "resolved": "https://registry.npmjs.org/cloudevents/-/cloudevents-8.0.3.tgz", - "integrity": "sha512-wTixKNjfLeyj9HQpESvLVVO4xgdqdvX4dTeg1IZ2SCunu/fxVzCamcIZneEyj31V82YolFCKwVeSkr8zResB0Q==", "license": "Apache-2.0", "peer": true, "dependencies": { @@ -21394,8 +17956,6 @@ }, "node_modules/cloudevents/node_modules/ajv-formats": { "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", - "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", "license": "MIT", "peer": true, "dependencies": { @@ -21412,8 +17972,6 @@ }, "node_modules/cloudevents/node_modules/uuid": { "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", "license": "MIT", "peer": true, "bin": { @@ -21422,8 +17980,6 @@ }, "node_modules/clsx": { "version": "2.1.1", - "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", - "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", "license": "MIT", "engines": { "node": ">=6" @@ -21431,8 +17987,6 @@ }, "node_modules/cluster-key-slot": { "version": "1.1.2", - "resolved": "https://registry.npmjs.org/cluster-key-slot/-/cluster-key-slot-1.1.2.tgz", - "integrity": "sha512-RMr0FhtfXemyinomL4hrWcYJxmX6deFdCxpJzhDttxgO1+bcCnkk+9drydLVDmAMG7NE6aN/fl4F7ucU/90gAA==", "license": "Apache-2.0", "engines": { "node": ">=0.10.0" @@ -21440,8 +17994,6 @@ }, "node_modules/co": { "version": "4.6.0", - "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", - "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==", "license": "MIT", "engines": { "iojs": ">= 1.0.0", @@ -21450,8 +18002,6 @@ }, "node_modules/collapse-white-space": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/collapse-white-space/-/collapse-white-space-2.1.0.tgz", - "integrity": "sha512-loKTxY1zCOuG4j9f6EPnuyyYkf58RnhhWTvRoZEokgB+WbdXehfjFviyOVYkqzEWz1Q5kRiZdBYS5SwxbQYwzw==", "license": "MIT", "funding": { "type": "github", @@ -21460,14 +18010,10 @@ }, "node_modules/collect-v8-coverage": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.3.tgz", - "integrity": "sha512-1L5aqIkwPfiodaMgQunkF1zRhNqifHBmtbbbxcr6yVxxBnliw4TDOW6NxpO8DJLgJ16OT+Y4ztZqP6p/FtXnAw==", "license": "MIT" }, "node_modules/color-convert": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "license": "MIT", "dependencies": { "color-name": "~1.1.4" @@ -21478,26 +18024,18 @@ }, "node_modules/color-name": { "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "license": "MIT" }, "node_modules/colord": { "version": "2.9.3", - "resolved": "https://registry.npmjs.org/colord/-/colord-2.9.3.tgz", - "integrity": "sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==", "license": "MIT" }, "node_modules/colorette": { "version": "2.0.20", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", - "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", "license": "MIT" }, "node_modules/combine-promises": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/combine-promises/-/combine-promises-1.2.0.tgz", - "integrity": "sha512-VcQB1ziGD0NXrhKxiwyNbCDmRzs/OShMs2GqW2DlU2A/Sd0nQxE1oWDAE5O0ygSx5mgQOn9eIFh7yKPgFRVkPQ==", "license": "MIT", "engines": { "node": ">=10" @@ -21505,8 +18043,6 @@ }, "node_modules/combined-stream": { "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", "license": "MIT", "dependencies": { "delayed-stream": "~1.0.0" @@ -21517,14 +18053,10 @@ }, "node_modules/comlink": { "version": "4.4.2", - "resolved": "https://registry.npmjs.org/comlink/-/comlink-4.4.2.tgz", - "integrity": "sha512-OxGdvBmJuNKSCMO4NTl1L47VRp6xn2wG4F/2hYzB6tiCb709otOxtEYCSvK80PtjODfXXZu8ds+Nw5kVCjqd2g==", "license": "Apache-2.0" }, "node_modules/comma-separated-tokens": { "version": "2.0.3", - "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz", - "integrity": "sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==", "license": "MIT", "funding": { "type": "github", @@ -21533,8 +18065,6 @@ }, "node_modules/command-line-application": { "version": "0.10.1", - "resolved": "https://registry.npmjs.org/command-line-application/-/command-line-application-0.10.1.tgz", - "integrity": "sha512-PWZ4nRkz09MbBRocqEe/Fil3RjTaMNqw0didl1n/i3flDcw/vecVfvsw3r+ZHhGs4BOuW7sk3cEYSdfM3Wv5/Q==", "dev": true, "license": "MIT", "dependencies": { @@ -21550,8 +18080,6 @@ }, "node_modules/command-line-application/node_modules/ansi-styles": { "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, "license": "MIT", "dependencies": { @@ -21563,8 +18091,6 @@ }, "node_modules/command-line-application/node_modules/chalk": { "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, "license": "MIT", "dependencies": { @@ -21578,8 +18104,6 @@ }, "node_modules/command-line-application/node_modules/color-convert": { "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", "dev": true, "license": "MIT", "dependencies": { @@ -21588,15 +18112,11 @@ }, "node_modules/command-line-application/node_modules/color-name": { "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", "dev": true, "license": "MIT" }, "node_modules/command-line-application/node_modules/escape-string-regexp": { "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", "dev": true, "license": "MIT", "engines": { @@ -21605,8 +18125,6 @@ }, "node_modules/command-line-application/node_modules/has-flag": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", "dev": true, "license": "MIT", "engines": { @@ -21615,8 +18133,6 @@ }, "node_modules/command-line-application/node_modules/supports-color": { "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dev": true, "license": "MIT", "dependencies": { @@ -21628,15 +18144,11 @@ }, "node_modules/command-line-application/node_modules/tslib": { "version": "1.10.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.10.0.tgz", - "integrity": "sha512-qOebF53frne81cf0S9B41ByenJ3/IuH8yJKngAX35CmiZySA0khhkovshKK+jGCaMnVomla7gVlIcc3EvKPbTQ==", "dev": true, "license": "Apache-2.0" }, "node_modules/command-line-args": { "version": "5.2.1", - "resolved": "https://registry.npmjs.org/command-line-args/-/command-line-args-5.2.1.tgz", - "integrity": "sha512-H4UfQhZyakIjC74I9d34fGYDwk3XpSr17QhEd0Q3I9Xq1CETHo4Hcuo87WyWHpAF1aSLjLRf5lD9ZGX2qStUvg==", "dev": true, "license": "MIT", "dependencies": { @@ -21651,8 +18163,6 @@ }, "node_modules/command-line-usage": { "version": "6.1.3", - "resolved": "https://registry.npmjs.org/command-line-usage/-/command-line-usage-6.1.3.tgz", - "integrity": "sha512-sH5ZSPr+7UStsloltmDh7Ce5fb8XPlHyoPzTpyyMuYCtervL65+ubVZ6Q61cFtFl62UyJlc8/JwERRbAFPUqgw==", "dev": true, "license": "MIT", "dependencies": { @@ -21667,8 +18177,6 @@ }, "node_modules/command-line-usage/node_modules/ansi-styles": { "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, "license": "MIT", "dependencies": { @@ -21680,8 +18188,6 @@ }, "node_modules/command-line-usage/node_modules/array-back": { "version": "4.0.2", - "resolved": "https://registry.npmjs.org/array-back/-/array-back-4.0.2.tgz", - "integrity": "sha512-NbdMezxqf94cnNfWLL7V/im0Ub+Anbb0IoZhvzie8+4HJ4nMQuzHuy49FkGYCJK2yAloZ3meiB6AVMClbrI1vg==", "dev": true, "license": "MIT", "engines": { @@ -21690,8 +18196,6 @@ }, "node_modules/command-line-usage/node_modules/chalk": { "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, "license": "MIT", "dependencies": { @@ -21705,8 +18209,6 @@ }, "node_modules/command-line-usage/node_modules/color-convert": { "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", "dev": true, "license": "MIT", "dependencies": { @@ -21715,15 +18217,11 @@ }, "node_modules/command-line-usage/node_modules/color-name": { "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", "dev": true, "license": "MIT" }, "node_modules/command-line-usage/node_modules/escape-string-regexp": { "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", "dev": true, "license": "MIT", "engines": { @@ -21732,8 +18230,6 @@ }, "node_modules/command-line-usage/node_modules/has-flag": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", "dev": true, "license": "MIT", "engines": { @@ -21742,8 +18238,6 @@ }, "node_modules/command-line-usage/node_modules/supports-color": { "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dev": true, "license": "MIT", "dependencies": { @@ -21755,8 +18249,6 @@ }, "node_modules/command-line-usage/node_modules/typical": { "version": "5.2.0", - "resolved": "https://registry.npmjs.org/typical/-/typical-5.2.0.tgz", - "integrity": "sha512-dvdQgNDNJo+8B2uBQoqdb11eUCE1JQXhvjC/CZtgvZseVd5TYMXnq0+vuUemXbd/Se29cTaUuPX3YIc2xgbvIg==", "dev": true, "license": "MIT", "engines": { @@ -21765,8 +18257,6 @@ }, "node_modules/commander": { "version": "14.0.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-14.0.3.tgz", - "integrity": "sha512-H+y0Jo/T1RZ9qPP4Eh1pkcQcLRglraJaSLoyOtHxu6AapkjWVCy2Sit1QQ4x3Dng8qDlSsZEet7g5Pq06MvTgw==", "license": "MIT", "engines": { "node": ">=20" @@ -21774,14 +18264,10 @@ }, "node_modules/common-path-prefix": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/common-path-prefix/-/common-path-prefix-3.0.0.tgz", - "integrity": "sha512-QE33hToZseCH3jS0qN96O/bSh3kaw/h+Tq7ngyY9eWDUnTlTNUyqfqvCXioLe5Na5jFsL78ra/wuBU4iuEgd4w==", "license": "ISC" }, "node_modules/component-type": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/component-type/-/component-type-2.0.0.tgz", - "integrity": "sha512-/1+d/k0Al0uzg4rFAz9fbYOTnT20JYgN7SoaRr5x2cz7kH4Mtj+GQPh7W9UocpzFtxSL8flv6qAOOfJvQGqUjg==", "license": "MIT", "engines": { "node": ">=18" @@ -21792,8 +18278,6 @@ }, "node_modules/compressible": { "version": "2.0.18", - "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", - "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", "license": "MIT", "dependencies": { "mime-db": ">= 1.43.0 < 2" @@ -21804,8 +18288,6 @@ }, "node_modules/compression": { "version": "1.8.1", - "resolved": "https://registry.npmjs.org/compression/-/compression-1.8.1.tgz", - "integrity": "sha512-9mAqGPHLakhCLeNyxPkK4xVo746zQ/czLH1Ky+vkitMnWfWZps8r0qXuwhwizagCRttsL4lfG4pIOvaWLpAP0w==", "license": "MIT", "dependencies": { "bytes": "3.1.2", @@ -21822,8 +18304,6 @@ }, "node_modules/compression/node_modules/debug": { "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "license": "MIT", "dependencies": { "ms": "2.0.0" @@ -21831,14 +18311,10 @@ }, "node_modules/compression/node_modules/ms": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "license": "MIT" }, "node_modules/compression/node_modules/negotiator": { "version": "0.6.4", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.4.tgz", - "integrity": "sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w==", "license": "MIT", "engines": { "node": ">= 0.6" @@ -21846,14 +18322,10 @@ }, "node_modules/concat-map": { "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", "license": "MIT" }, "node_modules/concat-stream": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-2.0.0.tgz", - "integrity": "sha512-MWufYdFw53ccGjCA+Ol7XJYpAlW6/prSMzuPOTRnJGcGzuhLn4Scrz7qf6o8bROZ514ltazcIFJZevcfbo0x7A==", "dev": true, "engines": [ "node >= 6.0" @@ -21868,14 +18340,10 @@ }, "node_modules/confbox": { "version": "0.1.8", - "resolved": "https://registry.npmjs.org/confbox/-/confbox-0.1.8.tgz", - "integrity": "sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==", "license": "MIT" }, "node_modules/config-chain": { "version": "1.1.13", - "resolved": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.13.tgz", - "integrity": "sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==", "license": "MIT", "dependencies": { "ini": "^1.3.4", @@ -21884,14 +18352,10 @@ }, "node_modules/config-chain/node_modules/ini": { "version": "1.3.8", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", "license": "ISC" }, "node_modules/configstore": { "version": "6.0.0", - "resolved": "https://registry.npmjs.org/configstore/-/configstore-6.0.0.tgz", - "integrity": "sha512-cD31W1v3GqUlQvbBCGcXmd2Nj9SvLDOP1oQ0YFuLETufzSPaKp11rYBsSOm7rCsW3OnIRAFM3OxRhceaXNYHkA==", "license": "BSD-2-Clause", "dependencies": { "dot-prop": "^6.0.1", @@ -21909,14 +18373,10 @@ }, "node_modules/configstore/node_modules/signal-exit": { "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", "license": "ISC" }, "node_modules/configstore/node_modules/write-file-atomic": { "version": "3.0.3", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", - "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", "license": "ISC", "dependencies": { "imurmurhash": "^0.1.4", @@ -21927,8 +18387,6 @@ }, "node_modules/connect-history-api-fallback": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-2.0.0.tgz", - "integrity": "sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA==", "license": "MIT", "engines": { "node": ">=0.8" @@ -21936,8 +18394,6 @@ }, "node_modules/consola": { "version": "3.4.2", - "resolved": "https://registry.npmjs.org/consola/-/consola-3.4.2.tgz", - "integrity": "sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA==", "license": "MIT", "engines": { "node": "^14.18.0 || >=16.10.0" @@ -21945,8 +18401,6 @@ }, "node_modules/content-disposition": { "version": "0.5.4", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", - "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", "license": "MIT", "dependencies": { "safe-buffer": "5.2.1" @@ -21957,8 +18411,6 @@ }, "node_modules/content-type": { "version": "1.0.5", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", - "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", "license": "MIT", "engines": { "node": ">= 0.6" @@ -21966,14 +18418,10 @@ }, "node_modules/convert-source-map": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", - "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", "license": "MIT" }, "node_modules/cookie": { "version": "0.7.2", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz", - "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==", "license": "MIT", "engines": { "node": ">= 0.6" @@ -21981,14 +18429,10 @@ }, "node_modules/cookie-signature": { "version": "1.0.7", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.7.tgz", - "integrity": "sha512-NXdYc3dLr47pBkpUCHtKSwIOQXLVn8dZEuywboCOJY/osA0wFSLlSawr3KN8qXJEyX66FcONTH8EIlVuK0yyFA==", "license": "MIT" }, "node_modules/copy-webpack-plugin": { "version": "11.0.0", - "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-11.0.0.tgz", - "integrity": "sha512-fX2MWpamkW0hZxMEg0+mYnA40LTosOSa5TqZ9GYIBzyJa9C3QUaMPSE2xAi/buNr8u89SfD9wHSQVBzrRa/SOQ==", "license": "MIT", "dependencies": { "fast-glob": "^3.2.11", @@ -22011,8 +18455,6 @@ }, "node_modules/copy-webpack-plugin/node_modules/glob-parent": { "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", "license": "ISC", "dependencies": { "is-glob": "^4.0.3" @@ -22023,8 +18465,6 @@ }, "node_modules/copy-webpack-plugin/node_modules/globby": { "version": "13.2.2", - "resolved": "https://registry.npmjs.org/globby/-/globby-13.2.2.tgz", - "integrity": "sha512-Y1zNGV+pzQdh7H39l9zgB4PJqjRNqydvdYCDG4HFXM4XuvSaQQlEc91IU1yALL8gUTDomgBAfz3XJdmUS+oo0w==", "license": "MIT", "dependencies": { "dir-glob": "^3.0.1", @@ -22042,8 +18482,6 @@ }, "node_modules/copy-webpack-plugin/node_modules/slash": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", - "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==", "license": "MIT", "engines": { "node": ">=12" @@ -22054,8 +18492,6 @@ }, "node_modules/core-js": { "version": "3.48.0", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.48.0.tgz", - "integrity": "sha512-zpEHTy1fjTMZCKLHUZoVeylt9XrzaIN2rbPXEt0k+q7JE5CkCZdo6bNq55bn24a69CH7ErAVLKijxJja4fw+UQ==", "hasInstallScript": true, "license": "MIT", "funding": { @@ -22065,8 +18501,6 @@ }, "node_modules/core-js-compat": { "version": "3.48.0", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.48.0.tgz", - "integrity": "sha512-OM4cAF3D6VtH/WkLtWvyNC56EZVXsZdU3iqaMG2B4WvYrlqU831pc4UtG5yp0sE9z8Y02wVN7PjW5Zf9Gt0f1Q==", "license": "MIT", "dependencies": { "browserslist": "^4.28.1" @@ -22078,8 +18512,6 @@ }, "node_modules/core-js-pure": { "version": "3.48.0", - "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.48.0.tgz", - "integrity": "sha512-1slJgk89tWC51HQ1AEqG+s2VuwpTRr8ocu4n20QUcH1v9lAN0RXen0Q0AABa/DK1I7RrNWLucplOHMx8hfTGTw==", "hasInstallScript": true, "license": "MIT", "funding": { @@ -22089,14 +18521,10 @@ }, "node_modules/core-util-is": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", - "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", "license": "MIT" }, "node_modules/cors": { "version": "2.8.6", - "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.6.tgz", - "integrity": "sha512-tJtZBBHA6vjIAaF6EnIaq6laBBP9aq/Y3ouVJjEfoHbRBcHBAHYcMh/w8LDrk2PvIMMq8gmopa5D4V8RmbrxGw==", "license": "MIT", "dependencies": { "object-assign": "^4", @@ -22112,8 +18540,6 @@ }, "node_modules/cose-base": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/cose-base/-/cose-base-1.0.3.tgz", - "integrity": "sha512-s9whTXInMSgAp/NVXVNuVxVKzGH2qck3aQlVHxDCdAEPgtMKwc4Wq6/QKhgdEdgbLSi9rBTAcPoRa6JpiG4ksg==", "license": "MIT", "dependencies": { "layout-base": "^1.0.0" @@ -22121,8 +18547,6 @@ }, "node_modules/cosmiconfig": { "version": "8.3.6", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.3.6.tgz", - "integrity": "sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==", "license": "MIT", "dependencies": { "import-fresh": "^3.3.0", @@ -22147,15 +18571,11 @@ }, "node_modules/create-require": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", - "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", "devOptional": true, "license": "MIT" }, "node_modules/cron-parser": { "version": "4.9.0", - "resolved": "https://registry.npmjs.org/cron-parser/-/cron-parser-4.9.0.tgz", - "integrity": "sha512-p0SaNjrHOnQeR8/VnfGbmg9te2kfyYSQ7Sc/j/6DtPL3JQvKxmjO9TSjNFpujqV3vEYYBvNNvXSxzyksBWAx1Q==", "license": "MIT", "optional": true, "dependencies": { @@ -22167,8 +18587,6 @@ }, "node_modules/cross-spawn": { "version": "7.0.6", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", - "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", "license": "MIT", "dependencies": { "path-key": "^3.1.0", @@ -22181,8 +18599,6 @@ }, "node_modules/crypt": { "version": "0.0.2", - "resolved": "https://registry.npmjs.org/crypt/-/crypt-0.0.2.tgz", - "integrity": "sha512-mCxBlsHFYh9C+HVpiEacem8FEBnMXgU9gy4zmNC+SXAZNB/1idgp/aulFJ4FgCi7GPEVbfyng092GqL2k2rmow==", "license": "BSD-3-Clause", "engines": { "node": "*" @@ -22190,8 +18606,6 @@ }, "node_modules/crypto-random-string": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-4.0.0.tgz", - "integrity": "sha512-x8dy3RnvYdlUcPOjkEHqozhiwzKNSq7GcPuXFbnyMOCHxX8V3OgIg/pYuabl2sbUPfIJaeAQB7PMOK8DFIdoRA==", "license": "MIT", "dependencies": { "type-fest": "^1.0.1" @@ -22205,8 +18619,6 @@ }, "node_modules/crypto-random-string/node_modules/type-fest": { "version": "1.4.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-1.4.0.tgz", - "integrity": "sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==", "license": "(MIT OR CC0-1.0)", "engines": { "node": ">=10" @@ -22217,8 +18629,6 @@ }, "node_modules/css-blank-pseudo": { "version": "7.0.1", - "resolved": "https://registry.npmjs.org/css-blank-pseudo/-/css-blank-pseudo-7.0.1.tgz", - "integrity": "sha512-jf+twWGDf6LDoXDUode+nc7ZlrqfaNphrBIBrcmeP3D8yw1uPaix1gCC8LUQUGQ6CycuK2opkbFFWFuq/a94ag==", "funding": [ { "type": "github", @@ -22242,8 +18652,6 @@ }, "node_modules/css-blank-pseudo/node_modules/postcss-selector-parser": { "version": "7.1.1", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.1.tgz", - "integrity": "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==", "license": "MIT", "dependencies": { "cssesc": "^3.0.0", @@ -22255,8 +18663,6 @@ }, "node_modules/css-declaration-sorter": { "version": "7.3.1", - "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-7.3.1.tgz", - "integrity": "sha512-gz6x+KkgNCjxq3Var03pRYLhyNfwhkKF1g/yoLgDNtFvVu0/fOLV9C8fFEZRjACp/XQLumjAYo7JVjzH3wLbxA==", "license": "ISC", "engines": { "node": "^14 || ^16 || >=18" @@ -22267,8 +18673,6 @@ }, "node_modules/css-has-pseudo": { "version": "7.0.3", - "resolved": "https://registry.npmjs.org/css-has-pseudo/-/css-has-pseudo-7.0.3.tgz", - "integrity": "sha512-oG+vKuGyqe/xvEMoxAQrhi7uY16deJR3i7wwhBerVrGQKSqUC5GiOVxTpM9F9B9hw0J+eKeOWLH7E9gZ1Dr5rA==", "funding": [ { "type": "github", @@ -22294,8 +18698,6 @@ }, "node_modules/css-has-pseudo/node_modules/@csstools/selector-specificity": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-5.0.0.tgz", - "integrity": "sha512-PCqQV3c4CoVm3kdPhyeZ07VmBRdH2EpMFA/pd9OASpOEC3aXNGoqPDAZ80D0cLpMBxnmk0+yNhGsEx31hq7Gtw==", "funding": [ { "type": "github", @@ -22316,8 +18718,6 @@ }, "node_modules/css-has-pseudo/node_modules/postcss-selector-parser": { "version": "7.1.1", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.1.tgz", - "integrity": "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==", "license": "MIT", "dependencies": { "cssesc": "^3.0.0", @@ -22329,8 +18729,6 @@ }, "node_modules/css-loader": { "version": "7.1.4", - "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-7.1.4.tgz", - "integrity": "sha512-vv3J9tlOl04WjiMvHQI/9tmIrCxVrj6PFbHemBB1iihpeRbi/I4h033eoFIhwxBBqLhI0KYFS7yvynBFhIZfTw==", "license": "MIT", "dependencies": { "icss-utils": "^5.1.0", @@ -22364,8 +18762,6 @@ }, "node_modules/css-minimizer-webpack-plugin": { "version": "5.0.1", - "resolved": "https://registry.npmjs.org/css-minimizer-webpack-plugin/-/css-minimizer-webpack-plugin-5.0.1.tgz", - "integrity": "sha512-3caImjKFQkS+ws1TGcFn0V1HyDJFq1Euy589JlD6/3rV2kj+w7r5G9WDMgSHvpvXHNZ2calVypZWuEDQd9wfLg==", "license": "MIT", "dependencies": { "@jridgewell/trace-mapping": "^0.3.18", @@ -22408,8 +18804,6 @@ }, "node_modules/css-prefers-color-scheme": { "version": "10.0.0", - "resolved": "https://registry.npmjs.org/css-prefers-color-scheme/-/css-prefers-color-scheme-10.0.0.tgz", - "integrity": "sha512-VCtXZAWivRglTZditUfB4StnsWr6YVZ2PRtuxQLKTNRdtAf8tpzaVPE9zXIF3VaSc7O70iK/j1+NXxyQCqdPjQ==", "funding": [ { "type": "github", @@ -22430,8 +18824,6 @@ }, "node_modules/css-select": { "version": "5.2.2", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.2.2.tgz", - "integrity": "sha512-TizTzUddG/xYLA3NXodFM0fSbNizXjOKhqiQQwvhlspadZokn1KDy0NZFS0wuEubIYAV5/c1/lAr0TaaFXEXzw==", "license": "BSD-2-Clause", "dependencies": { "boolbase": "^1.0.0", @@ -22446,8 +18838,6 @@ }, "node_modules/css-tree": { "version": "2.3.1", - "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.3.1.tgz", - "integrity": "sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw==", "license": "MIT", "dependencies": { "mdn-data": "2.0.30", @@ -22459,8 +18849,6 @@ }, "node_modules/css-what": { "version": "6.2.2", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.2.2.tgz", - "integrity": "sha512-u/O3vwbptzhMs3L1fQE82ZSLHQQfto5gyZzwteVIEyeaY5Fc7R4dapF/BvRoSYFeqfBk4m0V1Vafq5Pjv25wvA==", "license": "BSD-2-Clause", "engines": { "node": ">= 6" @@ -22471,14 +18859,10 @@ }, "node_modules/css.escape": { "version": "1.5.1", - "resolved": "https://registry.npmjs.org/css.escape/-/css.escape-1.5.1.tgz", - "integrity": "sha512-YUifsXXuknHlUsmlgyY0PKzgPOr7/FjCePfHNt0jxm83wHZi44VDMQ7/fGNkjY3/jV1MC+1CmZbaHzugyeRtpg==", "license": "MIT" }, "node_modules/cssdb": { "version": "8.8.0", - "resolved": "https://registry.npmjs.org/cssdb/-/cssdb-8.8.0.tgz", - "integrity": "sha512-QbLeyz2Bgso1iRlh7IpWk6OKa3lLNGXsujVjDMPl9rOZpxKeiG69icLpbLCFxeURwmcdIfZqQyhlooKJYM4f8Q==", "funding": [ { "type": "opencollective", @@ -22493,8 +18877,6 @@ }, "node_modules/cssesc": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", - "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", "license": "MIT", "bin": { "cssesc": "bin/cssesc" @@ -22505,8 +18887,6 @@ }, "node_modules/cssnano": { "version": "6.1.2", - "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-6.1.2.tgz", - "integrity": "sha512-rYk5UeX7VAM/u0lNqewCdasdtPK81CgX8wJFLEIXHbV2oldWRgJAsZrdhRXkV1NJzA2g850KiFm9mMU2HxNxMA==", "license": "MIT", "dependencies": { "cssnano-preset-default": "^6.1.2", @@ -22525,8 +18905,6 @@ }, "node_modules/cssnano-preset-advanced": { "version": "6.1.2", - "resolved": "https://registry.npmjs.org/cssnano-preset-advanced/-/cssnano-preset-advanced-6.1.2.tgz", - "integrity": "sha512-Nhao7eD8ph2DoHolEzQs5CfRpiEP0xa1HBdnFZ82kvqdmbwVBUr2r1QuQ4t1pi+D1ZpqpcO4T+wy/7RxzJ/WPQ==", "license": "MIT", "dependencies": { "autoprefixer": "^10.4.19", @@ -22546,8 +18924,6 @@ }, "node_modules/cssnano-preset-default": { "version": "6.1.2", - "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-6.1.2.tgz", - "integrity": "sha512-1C0C+eNaeN8OcHQa193aRgYexyJtU8XwbdieEjClw+J9d94E41LwT6ivKH0WT+fYwYWB0Zp3I3IZ7tI/BbUbrg==", "license": "MIT", "dependencies": { "browserslist": "^4.23.0", @@ -22590,8 +18966,6 @@ }, "node_modules/cssnano-utils": { "version": "4.0.2", - "resolved": "https://registry.npmjs.org/cssnano-utils/-/cssnano-utils-4.0.2.tgz", - "integrity": "sha512-ZR1jHg+wZ8o4c3zqf1SIUSTIvm/9mU343FMR6Obe/unskbvpGhZOo1J6d/r8D1pzkRQYuwbcH3hToOuoA2G7oQ==", "license": "MIT", "engines": { "node": "^14 || ^16 || >=18.0" @@ -22602,8 +18976,6 @@ }, "node_modules/csso": { "version": "5.0.5", - "resolved": "https://registry.npmjs.org/csso/-/csso-5.0.5.tgz", - "integrity": "sha512-0LrrStPOdJj+SPCCrGhzryycLjwcgUSHBtxNA8aIDxf0GLsRh1cKYhB00Gd1lDOS4yGH69+SNn13+TWbVHETFQ==", "license": "MIT", "dependencies": { "css-tree": "~2.2.0" @@ -22615,8 +18987,6 @@ }, "node_modules/csso/node_modules/css-tree": { "version": "2.2.1", - "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.2.1.tgz", - "integrity": "sha512-OA0mILzGc1kCOCSJerOeqDxDQ4HOh+G8NbOJFOTgOCzpw7fCBubk0fEyxp8AgOL/jvLgYA/uV0cMbe43ElF1JA==", "license": "MIT", "dependencies": { "mdn-data": "2.0.28", @@ -22629,14 +18999,10 @@ }, "node_modules/csso/node_modules/mdn-data": { "version": "2.0.28", - "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.28.tgz", - "integrity": "sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g==", "license": "CC0-1.0" }, "node_modules/cssstyle": { "version": "4.6.0", - "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-4.6.0.tgz", - "integrity": "sha512-2z+rWdzbbSZv6/rhtvzvqeZQHrBaqgogqt85sqFNbabZOuFbCVFb8kPeEtZjiKkbrm395irpNKiYeFeLiQnFPg==", "license": "MIT", "dependencies": { "@asamuzakjp/css-color": "^3.2.0", @@ -22648,20 +19014,14 @@ }, "node_modules/csstype": { "version": "3.2.3", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", - "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", "license": "MIT" }, "node_modules/customerio-node": { "version": "4.3.0", - "resolved": "https://registry.npmjs.org/customerio-node/-/customerio-node-4.3.0.tgz", - "integrity": "sha512-umNxZzBNmyT+OQRQE1M7IgARgrgvnoY8bw+XGAuazB9QMfPTktkPnXImmyR8WAQHhnyfnsi8pqc1PzzToZmB5g==", "license": "MIT" }, "node_modules/cytoscape": { "version": "3.33.1", - "resolved": "https://registry.npmjs.org/cytoscape/-/cytoscape-3.33.1.tgz", - "integrity": "sha512-iJc4TwyANnOGR1OmWhsS9ayRS3s+XQ185FmuHObThD+5AeJCakAAbWv8KimMTt08xCCLNgneQwFp+JRJOr9qGQ==", "license": "MIT", "engines": { "node": ">=0.10" @@ -22669,8 +19029,6 @@ }, "node_modules/cytoscape-cose-bilkent": { "version": "4.1.0", - "resolved": "https://registry.npmjs.org/cytoscape-cose-bilkent/-/cytoscape-cose-bilkent-4.1.0.tgz", - "integrity": "sha512-wgQlVIUJF13Quxiv5e1gstZ08rnZj2XaLHGoFMYXz7SkNfCDOOteKBE6SYRfA9WxxI/iBc3ajfDoc6hb/MRAHQ==", "license": "MIT", "dependencies": { "cose-base": "^1.0.0" @@ -22681,8 +19039,6 @@ }, "node_modules/cytoscape-fcose": { "version": "2.2.0", - "resolved": "https://registry.npmjs.org/cytoscape-fcose/-/cytoscape-fcose-2.2.0.tgz", - "integrity": "sha512-ki1/VuRIHFCzxWNrsshHYPs6L7TvLu3DL+TyIGEsRcvVERmxokbf5Gdk7mFxZnTdiGtnA4cfSmjZJMviqSuZrQ==", "license": "MIT", "dependencies": { "cose-base": "^2.2.0" @@ -22693,8 +19049,6 @@ }, "node_modules/cytoscape-fcose/node_modules/cose-base": { "version": "2.2.0", - "resolved": "https://registry.npmjs.org/cose-base/-/cose-base-2.2.0.tgz", - "integrity": "sha512-AzlgcsCbUMymkADOJtQm3wO9S3ltPfYOFD5033keQn9NJzIbtnZj+UdBJe7DYml/8TdbtHJW3j58SOnKhWY/5g==", "license": "MIT", "dependencies": { "layout-base": "^2.0.0" @@ -22702,14 +19056,10 @@ }, "node_modules/cytoscape-fcose/node_modules/layout-base": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/layout-base/-/layout-base-2.0.1.tgz", - "integrity": "sha512-dp3s92+uNI1hWIpPGH3jK2kxE2lMjdXdr+DH8ynZHpd6PUlH6x6cbuXnoMmiNumznqaNO31xu9e79F0uuZ0JFg==", "license": "MIT" }, "node_modules/d3": { "version": "7.9.0", - "resolved": "https://registry.npmjs.org/d3/-/d3-7.9.0.tgz", - "integrity": "sha512-e1U46jVP+w7Iut8Jt8ri1YsPOvFpg46k+K8TpCb0P+zjCkjkPnV7WzfDJzMHy1LnA+wj5pLT1wjO901gLXeEhA==", "license": "ISC", "dependencies": { "d3-array": "3", @@ -22749,8 +19099,6 @@ }, "node_modules/d3-array": { "version": "3.2.4", - "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-3.2.4.tgz", - "integrity": "sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==", "license": "ISC", "dependencies": { "internmap": "1 - 2" @@ -22761,8 +19109,6 @@ }, "node_modules/d3-axis": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/d3-axis/-/d3-axis-3.0.0.tgz", - "integrity": "sha512-IH5tgjV4jE/GhHkRV0HiVYPDtvfjHQlQfJHs0usq7M30XcSBvOotpmH1IgkcXsO/5gEQZD43B//fc7SRT5S+xw==", "license": "ISC", "engines": { "node": ">=12" @@ -22770,8 +19116,6 @@ }, "node_modules/d3-brush": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/d3-brush/-/d3-brush-3.0.0.tgz", - "integrity": "sha512-ALnjWlVYkXsVIGlOsuWH1+3udkYFI48Ljihfnh8FZPF2QS9o+PzGLBslO0PjzVoHLZ2KCVgAM8NVkXPJB2aNnQ==", "license": "ISC", "dependencies": { "d3-dispatch": "1 - 3", @@ -22786,8 +19130,6 @@ }, "node_modules/d3-chord": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-chord/-/d3-chord-3.0.1.tgz", - "integrity": "sha512-VE5S6TNa+j8msksl7HwjxMHDM2yNK3XCkusIlpX5kwauBfXuyLAtNg9jCp/iHH61tgI4sb6R/EIMWCqEIdjT/g==", "license": "ISC", "dependencies": { "d3-path": "1 - 3" @@ -22798,8 +19140,6 @@ }, "node_modules/d3-color": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-3.1.0.tgz", - "integrity": "sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==", "license": "ISC", "engines": { "node": ">=12" @@ -22807,8 +19147,6 @@ }, "node_modules/d3-contour": { "version": "4.0.2", - "resolved": "https://registry.npmjs.org/d3-contour/-/d3-contour-4.0.2.tgz", - "integrity": "sha512-4EzFTRIikzs47RGmdxbeUvLWtGedDUNkTcmzoeyg4sP/dvCexO47AaQL7VKy/gul85TOxw+IBgA8US2xwbToNA==", "license": "ISC", "dependencies": { "d3-array": "^3.2.0" @@ -22819,8 +19157,6 @@ }, "node_modules/d3-delaunay": { "version": "6.0.4", - "resolved": "https://registry.npmjs.org/d3-delaunay/-/d3-delaunay-6.0.4.tgz", - "integrity": "sha512-mdjtIZ1XLAM8bm/hx3WwjfHt6Sggek7qH043O8KEjDXN40xi3vx/6pYSVTwLjEgiXQTbvaouWKynLBiUZ6SK6A==", "license": "ISC", "dependencies": { "delaunator": "5" @@ -22831,8 +19167,6 @@ }, "node_modules/d3-dispatch": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-dispatch/-/d3-dispatch-3.0.1.tgz", - "integrity": "sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg==", "license": "ISC", "engines": { "node": ">=12" @@ -22840,8 +19174,6 @@ }, "node_modules/d3-drag": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/d3-drag/-/d3-drag-3.0.0.tgz", - "integrity": "sha512-pWbUJLdETVA8lQNJecMxoXfH6x+mO2UQo8rSmZ+QqxcbyA3hfeprFgIT//HW2nlHChWeIIMwS2Fq+gEARkhTkg==", "license": "ISC", "dependencies": { "d3-dispatch": "1 - 3", @@ -22853,8 +19185,6 @@ }, "node_modules/d3-dsv": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-dsv/-/d3-dsv-3.0.1.tgz", - "integrity": "sha512-UG6OvdI5afDIFP9w4G0mNq50dSOsXHJaRE8arAS5o9ApWnIElp8GZw1Dun8vP8OyHOZ/QJUKUJwxiiCCnUwm+Q==", "license": "ISC", "dependencies": { "commander": "7", @@ -22878,8 +19208,6 @@ }, "node_modules/d3-dsv/node_modules/commander": { "version": "7.2.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", - "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", "license": "MIT", "engines": { "node": ">= 10" @@ -22887,8 +19215,6 @@ }, "node_modules/d3-dsv/node_modules/iconv-lite": { "version": "0.6.3", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", - "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", "license": "MIT", "dependencies": { "safer-buffer": ">= 2.1.2 < 3.0.0" @@ -22899,8 +19225,6 @@ }, "node_modules/d3-ease": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-ease/-/d3-ease-3.0.1.tgz", - "integrity": "sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==", "license": "BSD-3-Clause", "engines": { "node": ">=12" @@ -22908,8 +19232,6 @@ }, "node_modules/d3-fetch": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-fetch/-/d3-fetch-3.0.1.tgz", - "integrity": "sha512-kpkQIM20n3oLVBKGg6oHrUchHM3xODkTzjMoj7aWQFq5QEM+R6E4WkzT5+tojDY7yjez8KgCBRoj4aEr99Fdqw==", "license": "ISC", "dependencies": { "d3-dsv": "1 - 3" @@ -22920,8 +19242,6 @@ }, "node_modules/d3-force": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/d3-force/-/d3-force-3.0.0.tgz", - "integrity": "sha512-zxV/SsA+U4yte8051P4ECydjD/S+qeYtnaIyAs9tgHCqfguma/aAQDjo85A9Z6EKhBirHRJHXIgJUlffT4wdLg==", "license": "ISC", "dependencies": { "d3-dispatch": "1 - 3", @@ -22934,8 +19254,6 @@ }, "node_modules/d3-format": { "version": "3.1.2", - "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-3.1.2.tgz", - "integrity": "sha512-AJDdYOdnyRDV5b6ArilzCPPwc1ejkHcoyFarqlPqT7zRYjhavcT3uSrqcMvsgh2CgoPbK3RCwyHaVyxYcP2Arg==", "license": "ISC", "engines": { "node": ">=12" @@ -22943,8 +19261,6 @@ }, "node_modules/d3-geo": { "version": "3.1.1", - "resolved": "https://registry.npmjs.org/d3-geo/-/d3-geo-3.1.1.tgz", - "integrity": "sha512-637ln3gXKXOwhalDzinUgY83KzNWZRKbYubaG+fGVuc/dxO64RRljtCTnf5ecMyE1RIdtqpkVcq0IbtU2S8j2Q==", "license": "ISC", "dependencies": { "d3-array": "2.5.0 - 3" @@ -22955,8 +19271,6 @@ }, "node_modules/d3-hierarchy": { "version": "3.1.2", - "resolved": "https://registry.npmjs.org/d3-hierarchy/-/d3-hierarchy-3.1.2.tgz", - "integrity": "sha512-FX/9frcub54beBdugHjDCdikxThEqjnR93Qt7PvQTOHxyiNCAlvMrHhclk3cD5VeAaq9fxmfRp+CnWw9rEMBuA==", "license": "ISC", "engines": { "node": ">=12" @@ -22964,8 +19278,6 @@ }, "node_modules/d3-interpolate": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-3.0.1.tgz", - "integrity": "sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==", "license": "ISC", "dependencies": { "d3-color": "1 - 3" @@ -22976,8 +19288,6 @@ }, "node_modules/d3-path": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-3.1.0.tgz", - "integrity": "sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ==", "license": "ISC", "engines": { "node": ">=12" @@ -22985,8 +19295,6 @@ }, "node_modules/d3-polygon": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-polygon/-/d3-polygon-3.0.1.tgz", - "integrity": "sha512-3vbA7vXYwfe1SYhED++fPUQlWSYTTGmFmQiany/gdbiWgU/iEyQzyymwL9SkJjFFuCS4902BSzewVGsHHmHtXg==", "license": "ISC", "engines": { "node": ">=12" @@ -22994,8 +19302,6 @@ }, "node_modules/d3-quadtree": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-quadtree/-/d3-quadtree-3.0.1.tgz", - "integrity": "sha512-04xDrxQTDTCFwP5H6hRhsRcb9xxv2RzkcsygFzmkSIOJy3PeRJP7sNk3VRIbKXcog561P9oU0/rVH6vDROAgUw==", "license": "ISC", "engines": { "node": ">=12" @@ -23003,8 +19309,6 @@ }, "node_modules/d3-random": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-random/-/d3-random-3.0.1.tgz", - "integrity": "sha512-FXMe9GfxTxqd5D6jFsQ+DJ8BJS4E/fT5mqqdjovykEB2oFbTMDVdg1MGFxfQW+FBOGoB++k8swBrgwSHT1cUXQ==", "license": "ISC", "engines": { "node": ">=12" @@ -23012,8 +19316,6 @@ }, "node_modules/d3-sankey": { "version": "0.12.3", - "resolved": "https://registry.npmjs.org/d3-sankey/-/d3-sankey-0.12.3.tgz", - "integrity": "sha512-nQhsBRmM19Ax5xEIPLMY9ZmJ/cDvd1BG3UVvt5h3WRxKg5zGRbvnteTyWAbzeSvlh3tW7ZEmq4VwR5mB3tutmQ==", "license": "BSD-3-Clause", "dependencies": { "d3-array": "1 - 2", @@ -23022,8 +19324,6 @@ }, "node_modules/d3-sankey/node_modules/d3-array": { "version": "2.12.1", - "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-2.12.1.tgz", - "integrity": "sha512-B0ErZK/66mHtEsR1TkPEEkwdy+WDesimkM5gpZr5Dsg54BiTA5RXtYW5qTLIAcekaS9xfZrzBLF/OAkB3Qn1YQ==", "license": "BSD-3-Clause", "dependencies": { "internmap": "^1.0.0" @@ -23031,14 +19331,10 @@ }, "node_modules/d3-sankey/node_modules/d3-path": { "version": "1.0.9", - "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-1.0.9.tgz", - "integrity": "sha512-VLaYcn81dtHVTjEHd8B+pbe9yHWpXKZUC87PzoFmsFrJqgFwDe/qxfp5MlfsfM1V5E/iVt0MmEbWQ7FVIXh/bg==", "license": "BSD-3-Clause" }, "node_modules/d3-sankey/node_modules/d3-shape": { "version": "1.3.7", - "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-1.3.7.tgz", - "integrity": "sha512-EUkvKjqPFUAZyOlhY5gzCxCeI0Aep04LwIRpsZ/mLFelJiUfnK56jo5JMDSE7yyP2kLSb6LtF+S5chMk7uqPqw==", "license": "BSD-3-Clause", "dependencies": { "d3-path": "1" @@ -23046,14 +19342,10 @@ }, "node_modules/d3-sankey/node_modules/internmap": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/internmap/-/internmap-1.0.1.tgz", - "integrity": "sha512-lDB5YccMydFBtasVtxnZ3MRBHuaoE8GKsppq+EchKL2U4nK/DmEpPHNH8MZe5HkMtpSiTSOZwfN0tzYjO/lJEw==", "license": "ISC" }, "node_modules/d3-scale": { "version": "4.0.2", - "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-4.0.2.tgz", - "integrity": "sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==", "license": "ISC", "dependencies": { "d3-array": "2.10.0 - 3", @@ -23068,8 +19360,6 @@ }, "node_modules/d3-scale-chromatic": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/d3-scale-chromatic/-/d3-scale-chromatic-3.1.0.tgz", - "integrity": "sha512-A3s5PWiZ9YCXFye1o246KoscMWqf8BsD9eRiJ3He7C9OBaxKhAd5TFCdEx/7VbKtxxTsu//1mMJFrEt572cEyQ==", "license": "ISC", "dependencies": { "d3-color": "1 - 3", @@ -23081,8 +19371,6 @@ }, "node_modules/d3-selection": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-3.0.0.tgz", - "integrity": "sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==", "license": "ISC", "engines": { "node": ">=12" @@ -23090,8 +19378,6 @@ }, "node_modules/d3-shape": { "version": "3.2.0", - "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-3.2.0.tgz", - "integrity": "sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA==", "license": "ISC", "dependencies": { "d3-path": "^3.1.0" @@ -23102,8 +19388,6 @@ }, "node_modules/d3-time": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/d3-time/-/d3-time-3.1.0.tgz", - "integrity": "sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q==", "license": "ISC", "dependencies": { "d3-array": "2 - 3" @@ -23114,8 +19398,6 @@ }, "node_modules/d3-time-format": { "version": "4.1.0", - "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-4.1.0.tgz", - "integrity": "sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg==", "license": "ISC", "dependencies": { "d3-time": "1 - 3" @@ -23126,8 +19408,6 @@ }, "node_modules/d3-timer": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-3.0.1.tgz", - "integrity": "sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==", "license": "ISC", "engines": { "node": ">=12" @@ -23135,8 +19415,6 @@ }, "node_modules/d3-transition": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-transition/-/d3-transition-3.0.1.tgz", - "integrity": "sha512-ApKvfjsSR6tg06xrL434C0WydLr7JewBB3V+/39RMHsaXTOG0zmt/OAXeng5M5LBm0ojmxJrpomQVZ1aPvBL4w==", "license": "ISC", "dependencies": { "d3-color": "1 - 3", @@ -23154,8 +19432,6 @@ }, "node_modules/d3-zoom": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/d3-zoom/-/d3-zoom-3.0.0.tgz", - "integrity": "sha512-b8AmV3kfQaqWAuacbPuNbL6vahnOJflOhexLzMMNLga62+/nh0JzvJ0aO/5a5MVgUFGS7Hu1P9P03o3fJkDCyw==", "license": "ISC", "dependencies": { "d3-dispatch": "1 - 3", @@ -23170,8 +19446,6 @@ }, "node_modules/dagre-d3-es": { "version": "7.0.13", - "resolved": "https://registry.npmjs.org/dagre-d3-es/-/dagre-d3-es-7.0.13.tgz", - "integrity": "sha512-efEhnxpSuwpYOKRm/L5KbqoZmNNukHa/Flty4Wp62JRvgH2ojwVgPgdYyr4twpieZnyRDdIH7PY2mopX26+j2Q==", "license": "MIT", "dependencies": { "d3": "^7.9.0", @@ -23180,8 +19454,6 @@ }, "node_modules/daisyui": { "version": "5.5.19", - "resolved": "https://registry.npmjs.org/daisyui/-/daisyui-5.5.19.tgz", - "integrity": "sha512-pbFAkl1VCEh/MPCeclKL61I/MqRIFFhNU7yiXoDDRapXN4/qNCoMxeCCswyxEEhqL5eiTTfwHvucFtOE71C9sA==", "dev": true, "license": "MIT", "funding": { @@ -23190,8 +19462,6 @@ }, "node_modules/data-uri-to-buffer": { "version": "4.0.1", - "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-4.0.1.tgz", - "integrity": "sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==", "license": "MIT", "engines": { "node": ">= 12" @@ -23199,8 +19469,6 @@ }, "node_modules/data-urls": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-5.0.0.tgz", - "integrity": "sha512-ZYP5VBHshaDAiVZxjbRVcFJpc+4xGgT0bK3vzy1HLN8jTO975HEbuYzZJcHoQEY5K1a0z8YayJkyVETa08eNTg==", "license": "MIT", "dependencies": { "whatwg-mimetype": "^4.0.0", @@ -23212,8 +19480,6 @@ }, "node_modules/data-view-buffer": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.2.tgz", - "integrity": "sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==", "license": "MIT", "dependencies": { "call-bound": "^1.0.3", @@ -23229,8 +19495,6 @@ }, "node_modules/data-view-byte-length": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.2.tgz", - "integrity": "sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==", "license": "MIT", "dependencies": { "call-bound": "^1.0.3", @@ -23246,8 +19510,6 @@ }, "node_modules/data-view-byte-offset": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.1.tgz", - "integrity": "sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==", "license": "MIT", "dependencies": { "call-bound": "^1.0.2", @@ -23263,20 +19525,14 @@ }, "node_modules/dayjs": { "version": "1.11.19", - "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.19.tgz", - "integrity": "sha512-t5EcLVS6QPBNqM2z8fakk/NKel+Xzshgt8FFKAn+qwlD1pzZWxh0nVCrvFK7ZDb6XucZeF9z8C7CBWTRIVApAw==", "license": "MIT" }, "node_modules/debounce": { "version": "1.2.1", - "resolved": "https://registry.npmjs.org/debounce/-/debounce-1.2.1.tgz", - "integrity": "sha512-XRRe6Glud4rd/ZGQfiV1ruXSfbvfJedlV9Y6zOlP+2K04vBYiJEte6stfFkCP03aMnY5tsipamumUjL14fofug==", "license": "MIT" }, "node_modules/debug": { "version": "4.4.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", - "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", "license": "MIT", "dependencies": { "ms": "^2.1.3" @@ -23292,14 +19548,10 @@ }, "node_modules/decimal.js": { "version": "10.6.0", - "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.6.0.tgz", - "integrity": "sha512-YpgQiITW3JXGntzdUmyUR1V812Hn8T1YVXhCu+wO3OpS4eU9l4YdD3qjyiKdV6mvV29zapkMeD390UVEf2lkUg==", "license": "MIT" }, "node_modules/decode-named-character-reference": { "version": "1.3.0", - "resolved": "https://registry.npmjs.org/decode-named-character-reference/-/decode-named-character-reference-1.3.0.tgz", - "integrity": "sha512-GtpQYB283KrPp6nRw50q3U9/VfOutZOe103qlN7BPP6Ad27xYnOIWv4lPzo8HCAL+mMZofJ9KEy30fq6MfaK6Q==", "license": "MIT", "dependencies": { "character-entities": "^2.0.0" @@ -23311,8 +19563,6 @@ }, "node_modules/decompress-response": { "version": "6.0.0", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", - "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", "license": "MIT", "dependencies": { "mimic-response": "^3.1.0" @@ -23326,8 +19576,6 @@ }, "node_modules/decompress-response/node_modules/mimic-response": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", - "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", "license": "MIT", "engines": { "node": ">=10" @@ -23338,15 +19586,11 @@ }, "node_modules/dedent": { "version": "0.7.0", - "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz", - "integrity": "sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==", "dev": true, "license": "MIT" }, "node_modules/deep-eql": { "version": "5.0.2", - "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-5.0.2.tgz", - "integrity": "sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==", "dev": true, "license": "MIT", "engines": { @@ -23355,8 +19599,6 @@ }, "node_modules/deep-extend": { "version": "0.6.0", - "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", - "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", "license": "MIT", "engines": { "node": ">=4.0.0" @@ -23364,14 +19606,10 @@ }, "node_modules/deep-is": { "version": "0.1.4", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", - "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", "license": "MIT" }, "node_modules/deepmerge": { "version": "4.3.1", - "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", - "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", "license": "MIT", "engines": { "node": ">=0.10.0" @@ -23379,8 +19617,6 @@ }, "node_modules/default-browser": { "version": "5.5.0", - "resolved": "https://registry.npmjs.org/default-browser/-/default-browser-5.5.0.tgz", - "integrity": "sha512-H9LMLr5zwIbSxrmvikGuI/5KGhZ8E2zH3stkMgM5LpOWDutGM2JZaj460Udnf1a+946zc7YBgrqEWwbk7zHvGw==", "license": "MIT", "dependencies": { "bundle-name": "^4.1.0", @@ -23395,8 +19631,6 @@ }, "node_modules/default-browser-id": { "version": "5.0.1", - "resolved": "https://registry.npmjs.org/default-browser-id/-/default-browser-id-5.0.1.tgz", - "integrity": "sha512-x1VCxdX4t+8wVfd1so/9w+vQ4vx7lKd2Qp5tDRutErwmR85OgmfX7RlLRMWafRMY7hbEiXIbudNrjOAPa/hL8Q==", "license": "MIT", "engines": { "node": ">=18" @@ -23407,8 +19641,6 @@ }, "node_modules/defer-to-connect": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz", - "integrity": "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==", "license": "MIT", "engines": { "node": ">=10" @@ -23416,8 +19648,6 @@ }, "node_modules/define-data-property": { "version": "1.1.4", - "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", - "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", "license": "MIT", "dependencies": { "es-define-property": "^1.0.0", @@ -23433,8 +19663,6 @@ }, "node_modules/define-lazy-prop": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", - "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", "license": "MIT", "engines": { "node": ">=8" @@ -23442,8 +19670,6 @@ }, "node_modules/define-properties": { "version": "1.2.1", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", - "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", "license": "MIT", "dependencies": { "define-data-property": "^1.0.1", @@ -23459,8 +19685,6 @@ }, "node_modules/delaunator": { "version": "5.0.1", - "resolved": "https://registry.npmjs.org/delaunator/-/delaunator-5.0.1.tgz", - "integrity": "sha512-8nvh+XBe96aCESrGOqMp/84b13H9cdKbG5P2ejQCh4d4sK9RL4371qou9drQjMhvnPmhWl5hnmqbEE0fXr9Xnw==", "license": "ISC", "dependencies": { "robust-predicates": "^3.0.2" @@ -23468,8 +19692,6 @@ }, "node_modules/delayed-stream": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", "license": "MIT", "engines": { "node": ">=0.4.0" @@ -23477,8 +19699,6 @@ }, "node_modules/denque": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/denque/-/denque-2.1.0.tgz", - "integrity": "sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw==", "license": "Apache-2.0", "engines": { "node": ">=0.10" @@ -23486,8 +19706,6 @@ }, "node_modules/depd": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", - "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", "license": "MIT", "engines": { "node": ">= 0.8" @@ -23495,15 +19713,11 @@ }, "node_modules/deprecation": { "version": "2.3.1", - "resolved": "https://registry.npmjs.org/deprecation/-/deprecation-2.3.1.tgz", - "integrity": "sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ==", "dev": true, "license": "ISC" }, "node_modules/dequal": { "version": "2.0.3", - "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", - "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", "license": "MIT", "engines": { "node": ">=6" @@ -23511,8 +19725,6 @@ }, "node_modules/destroy": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", - "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", "license": "MIT", "engines": { "node": ">= 0.8", @@ -23521,8 +19733,6 @@ }, "node_modules/detect-indent": { "version": "6.1.0", - "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-6.1.0.tgz", - "integrity": "sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==", "dev": true, "license": "MIT", "engines": { @@ -23531,8 +19741,6 @@ }, "node_modules/detect-libc": { "version": "2.1.2", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", - "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", "license": "Apache-2.0", "engines": { "node": ">=8" @@ -23540,8 +19748,6 @@ }, "node_modules/detect-newline": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", - "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", "license": "MIT", "engines": { "node": ">=8" @@ -23549,14 +19755,10 @@ }, "node_modules/detect-node": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", - "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==", "license": "MIT" }, "node_modules/detect-port": { "version": "1.6.1", - "resolved": "https://registry.npmjs.org/detect-port/-/detect-port-1.6.1.tgz", - "integrity": "sha512-CmnVc+Hek2egPx1PeTFVta2W78xy2K/9Rkf6cC4T59S50tVnzKj+tnx5mmx5lwvCkujZ4uRrpRSuV+IVs3f90Q==", "license": "MIT", "dependencies": { "address": "^1.0.1", @@ -23572,8 +19774,6 @@ }, "node_modules/devlop": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/devlop/-/devlop-1.1.0.tgz", - "integrity": "sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==", "license": "MIT", "dependencies": { "dequal": "^2.0.0" @@ -23585,8 +19785,6 @@ }, "node_modules/diff": { "version": "4.0.4", - "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.4.tgz", - "integrity": "sha512-X07nttJQkwkfKfvTPG/KSnE2OMdcUCao6+eXF3wmnIQRn2aPAHH3VxDbDOdegkd6JbPsXqShpvEOHfAT+nCNwQ==", "devOptional": true, "license": "BSD-3-Clause", "engines": { @@ -23595,8 +19793,6 @@ }, "node_modules/diff-sequences": { "version": "29.6.3", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz", - "integrity": "sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==", "dev": true, "license": "MIT", "engines": { @@ -23605,8 +19801,6 @@ }, "node_modules/dir-glob": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", "license": "MIT", "dependencies": { "path-type": "^4.0.0" @@ -23617,8 +19811,6 @@ }, "node_modules/dns-packet": { "version": "5.6.1", - "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-5.6.1.tgz", - "integrity": "sha512-l4gcSouhcgIKRvyy99RNVOgxXiicE+2jZoNmaNmZ6JXiGajBOJAesk1OBlJuM5k2c+eudGdLxDqXuPCKIj6kpw==", "license": "MIT", "dependencies": { "@leichtgewicht/ip-codec": "^2.0.1" @@ -23629,8 +19821,6 @@ }, "node_modules/doctrine": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", - "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", "license": "Apache-2.0", "dependencies": { "esutils": "^2.0.2" @@ -23641,16 +19831,12 @@ }, "node_modules/dom-accessibility-api": { "version": "0.5.16", - "resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.5.16.tgz", - "integrity": "sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==", "dev": true, "license": "MIT", "peer": true }, "node_modules/dom-converter": { "version": "0.2.0", - "resolved": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.2.0.tgz", - "integrity": "sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==", "license": "MIT", "dependencies": { "utila": "~0.4" @@ -23658,8 +19844,6 @@ }, "node_modules/dom-serializer": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", - "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", "license": "MIT", "dependencies": { "domelementtype": "^2.3.0", @@ -23672,8 +19856,6 @@ }, "node_modules/domelementtype": { "version": "2.3.0", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", - "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", "funding": [ { "type": "github", @@ -23684,8 +19866,6 @@ }, "node_modules/domhandler": { "version": "5.0.3", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", - "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", "license": "BSD-2-Clause", "dependencies": { "domelementtype": "^2.3.0" @@ -23699,8 +19879,6 @@ }, "node_modules/dompurify": { "version": "3.3.3", - "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-3.3.3.tgz", - "integrity": "sha512-Oj6pzI2+RqBfFG+qOaOLbFXLQ90ARpcGG6UePL82bJLtdsa6CYJD7nmiU8MW9nQNOtCHV3lZ/Bzq1X0QYbBZCA==", "license": "(MPL-2.0 OR Apache-2.0)", "optionalDependencies": { "@types/trusted-types": "^2.0.7" @@ -23708,8 +19886,6 @@ }, "node_modules/domutils": { "version": "3.2.2", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.2.2.tgz", - "integrity": "sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==", "license": "BSD-2-Clause", "dependencies": { "dom-serializer": "^2.0.0", @@ -23722,8 +19898,6 @@ }, "node_modules/dot-case": { "version": "3.0.4", - "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz", - "integrity": "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==", "license": "MIT", "dependencies": { "no-case": "^3.0.4", @@ -23732,8 +19906,6 @@ }, "node_modules/dot-prop": { "version": "6.0.1", - "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-6.0.1.tgz", - "integrity": "sha512-tE7ztYzXHIeyvc7N+hR3oi7FIbf/NIjVP9hmAt3yMXzrQ072/fpjGLx2GxNxGxUl5V73MEqYzioOMoVhGMJ5cA==", "license": "MIT", "dependencies": { "is-obj": "^2.0.0" @@ -23747,8 +19919,6 @@ }, "node_modules/dot-prop/node_modules/is-obj": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", - "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", "license": "MIT", "engines": { "node": ">=8" @@ -23756,8 +19926,6 @@ }, "node_modules/dotenv": { "version": "8.6.0", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-8.6.0.tgz", - "integrity": "sha512-IrPdXQsk2BbzvCBGBOTmmSH5SodmqZNt4ERAZDmW4CT+tL8VtvinqywuANaFu4bOMWki16nqf0e4oC0QIaDr/g==", "dev": true, "license": "BSD-2-Clause", "engines": { @@ -23766,8 +19934,6 @@ }, "node_modules/dset": { "version": "3.1.4", - "resolved": "https://registry.npmjs.org/dset/-/dset-3.1.4.tgz", - "integrity": "sha512-2QF/g9/zTaPDc3BjNcVTGoBbXBgYfMTTceLaYcFJ/W9kggFUkhxD/hMEeuLKbugyef9SqAx8cpgwlIP/jinUTA==", "license": "MIT", "engines": { "node": ">=4" @@ -23775,8 +19941,6 @@ }, "node_modules/dunder-proto": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", - "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", "license": "MIT", "dependencies": { "call-bind-apply-helpers": "^1.0.1", @@ -23789,14 +19953,10 @@ }, "node_modules/duplexer": { "version": "0.1.2", - "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", - "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==", "license": "MIT" }, "node_modules/duplexify": { "version": "4.1.3", - "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-4.1.3.tgz", - "integrity": "sha512-M3BmBhwJRZsSx38lZyhE53Csddgzl5R7xGJNk7CVddZD6CcmwMCH8J+7AprIrQKH7TonKxaCjcv27Qmf+sQ+oA==", "license": "MIT", "dependencies": { "end-of-stream": "^1.4.1", @@ -23807,14 +19967,10 @@ }, "node_modules/eastasianwidth": { "version": "0.2.0", - "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", - "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", "license": "MIT" }, "node_modules/ecdsa-sig-formatter": { "version": "1.0.11", - "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", - "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==", "license": "Apache-2.0", "dependencies": { "safe-buffer": "^5.0.1" @@ -23822,20 +19978,14 @@ }, "node_modules/ee-first": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", "license": "MIT" }, "node_modules/electron-to-chromium": { "version": "1.5.302", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.302.tgz", - "integrity": "sha512-sM6HAN2LyK82IyPBpznDRqlTQAtuSaO+ShzFiWTvoMJLHyZ+Y39r8VMfHzwbU8MVBzQ4Wdn85+wlZl2TLGIlwg==", "license": "ISC" }, "node_modules/emittery": { "version": "0.13.1", - "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.13.1.tgz", - "integrity": "sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==", "license": "MIT", "engines": { "node": ">=12" @@ -23846,21 +19996,15 @@ }, "node_modules/emoji-regex": { "version": "10.6.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.6.0.tgz", - "integrity": "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==", "dev": true, "license": "MIT" }, "node_modules/emojilib": { "version": "2.4.0", - "resolved": "https://registry.npmjs.org/emojilib/-/emojilib-2.4.0.tgz", - "integrity": "sha512-5U0rVMU5Y2n2+ykNLQqMoqklN9ICBT/KsvC1Gz6vqHbz2AXXGkG+Pm5rMWk/8Vjrr/mY9985Hi8DYzn1F09Nyw==", "license": "MIT" }, "node_modules/emojis-list": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", - "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", "license": "MIT", "engines": { "node": ">= 4" @@ -23868,8 +20012,6 @@ }, "node_modules/emoticon": { "version": "4.1.0", - "resolved": "https://registry.npmjs.org/emoticon/-/emoticon-4.1.0.tgz", - "integrity": "sha512-VWZfnxqwNcc51hIy/sbOdEem6D+cVtpPzEEtVAFdaas30+1dgkyaOQ4sQ6Bp0tOMqWO1v+HQfYaoodOkdhK6SQ==", "license": "MIT", "funding": { "type": "github", @@ -23878,8 +20020,6 @@ }, "node_modules/empathic": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/empathic/-/empathic-2.0.0.tgz", - "integrity": "sha512-i6UzDscO/XfAcNYD75CfICkmfLedpyPDdozrLMmQc5ORaQcdMoc21OnlEylMIqI7U8eniKrPMxxtj8k0vhmJhA==", "dev": true, "license": "MIT", "engines": { @@ -23888,8 +20028,6 @@ }, "node_modules/encodeurl": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", - "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", "license": "MIT", "engines": { "node": ">= 0.8" @@ -23897,8 +20035,6 @@ }, "node_modules/encoding-sniffer": { "version": "0.2.1", - "resolved": "https://registry.npmjs.org/encoding-sniffer/-/encoding-sniffer-0.2.1.tgz", - "integrity": "sha512-5gvq20T6vfpekVtqrYQsSCFZ1wEg5+wW0/QaZMWkFr6BqD3NfKs0rLCx4rrVlSWJeZb5NBJgVLswK/w2MWU+Gw==", "license": "MIT", "dependencies": { "iconv-lite": "^0.6.3", @@ -23910,8 +20046,6 @@ }, "node_modules/encoding-sniffer/node_modules/iconv-lite": { "version": "0.6.3", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", - "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", "license": "MIT", "dependencies": { "safer-buffer": ">= 2.1.2 < 3.0.0" @@ -23922,8 +20056,6 @@ }, "node_modules/end-of-stream": { "version": "1.4.5", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.5.tgz", - "integrity": "sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==", "license": "MIT", "dependencies": { "once": "^1.4.0" @@ -23931,8 +20063,6 @@ }, "node_modules/endent": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/endent/-/endent-2.1.0.tgz", - "integrity": "sha512-r8VyPX7XL8U01Xgnb1CjZ3XV+z90cXIJ9JPE/R9SEC9vpw2P6CfsRPJmp20DppC5N7ZAMCmjYkJIa744Iyg96w==", "dev": true, "license": "MIT", "dependencies": { @@ -23943,8 +20073,6 @@ }, "node_modules/enhanced-resolve": { "version": "5.20.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.20.0.tgz", - "integrity": "sha512-/ce7+jQ1PQ6rVXwe+jKEg5hW5ciicHwIQUagZkp6IufBoY3YDgdTTY1azVs0qoRgVmvsNB+rbjLJxDAeHHtwsQ==", "license": "MIT", "dependencies": { "graceful-fs": "^4.2.4", @@ -23956,8 +20084,6 @@ }, "node_modules/enquirer": { "version": "2.4.1", - "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.4.1.tgz", - "integrity": "sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==", "dev": true, "license": "MIT", "dependencies": { @@ -23970,8 +20096,6 @@ }, "node_modules/entities": { "version": "4.5.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", - "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", "license": "BSD-2-Clause", "engines": { "node": ">=0.12" @@ -23982,8 +20106,6 @@ }, "node_modules/env-ci": { "version": "5.5.0", - "resolved": "https://registry.npmjs.org/env-ci/-/env-ci-5.5.0.tgz", - "integrity": "sha512-o0JdWIbOLP+WJKIUt36hz1ImQQFuN92nhsfTkHHap+J8CiI8WgGpH/a9jEGHh4/TU5BUUGjlnKXNoDb57+ne+A==", "dev": true, "license": "MIT", "dependencies": { @@ -23997,8 +20119,6 @@ }, "node_modules/env-paths": { "version": "2.2.1", - "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", - "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", "license": "MIT", "engines": { "node": ">=6" @@ -24006,8 +20126,6 @@ }, "node_modules/environment": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/environment/-/environment-1.1.0.tgz", - "integrity": "sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q==", "dev": true, "license": "MIT", "engines": { @@ -24019,14 +20137,10 @@ }, "node_modules/err-code": { "version": "2.0.3", - "resolved": "https://registry.npmjs.org/err-code/-/err-code-2.0.3.tgz", - "integrity": "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==", "license": "MIT" }, "node_modules/error-ex": { "version": "1.3.4", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.4.tgz", - "integrity": "sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==", "license": "MIT", "dependencies": { "is-arrayish": "^0.2.1" @@ -24034,8 +20148,6 @@ }, "node_modules/es-abstract": { "version": "1.24.1", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.24.1.tgz", - "integrity": "sha512-zHXBLhP+QehSSbsS9Pt23Gg964240DPd6QCf8WpkqEXxQ7fhdZzYsocOr5u7apWonsS5EjZDmTF+/slGMyasvw==", "license": "MIT", "dependencies": { "array-buffer-byte-length": "^1.0.2", @@ -24102,8 +20214,6 @@ }, "node_modules/es-define-property": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", - "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", "license": "MIT", "engines": { "node": ">= 0.4" @@ -24111,8 +20221,6 @@ }, "node_modules/es-errors": { "version": "1.3.0", - "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", - "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", "license": "MIT", "engines": { "node": ">= 0.4" @@ -24120,8 +20228,6 @@ }, "node_modules/es-iterator-helpers": { "version": "1.2.2", - "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.2.2.tgz", - "integrity": "sha512-BrUQ0cPTB/IwXj23HtwHjS9n7O4h9FX94b4xc5zlTHxeLgTAdzYUDyy6KdExAl9lbN5rtfe44xpjpmj9grxs5w==", "license": "MIT", "dependencies": { "call-bind": "^1.0.8", @@ -24147,14 +20253,10 @@ }, "node_modules/es-module-lexer": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-2.0.0.tgz", - "integrity": "sha512-5POEcUuZybH7IdmGsD8wlf0AI55wMecM9rVBTI/qEAy2c1kTOm3DjFYjrBdI2K3BaJjJYfYFeRtM0t9ssnRuxw==", "license": "MIT" }, "node_modules/es-object-atoms": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", - "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", "license": "MIT", "dependencies": { "es-errors": "^1.3.0" @@ -24165,8 +20267,6 @@ }, "node_modules/es-set-tostringtag": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", - "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", "license": "MIT", "dependencies": { "es-errors": "^1.3.0", @@ -24180,8 +20280,6 @@ }, "node_modules/es-shim-unscopables": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.1.0.tgz", - "integrity": "sha512-d9T8ucsEhh8Bi1woXCf+TIKDIROLG5WCkxg8geBCbvk22kzwC5G2OnXVMO6FUsvQlgUUXQ2itephWDLqDzbeCw==", "license": "MIT", "dependencies": { "hasown": "^2.0.2" @@ -24192,8 +20290,6 @@ }, "node_modules/es-to-primitive": { "version": "1.3.0", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.3.0.tgz", - "integrity": "sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==", "license": "MIT", "dependencies": { "is-callable": "^1.2.7", @@ -24209,14 +20305,10 @@ }, "node_modules/es6-promise": { "version": "4.2.8", - "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz", - "integrity": "sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==", "license": "MIT" }, "node_modules/esast-util-from-estree": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/esast-util-from-estree/-/esast-util-from-estree-2.0.0.tgz", - "integrity": "sha512-4CyanoAudUSBAn5K13H4JhsMH6L9ZP7XbLVe/dKybkxMO7eDyLsT8UHl9TRNrU2Gr9nz+FovfSIjuXWJ81uVwQ==", "license": "MIT", "dependencies": { "@types/estree-jsx": "^1.0.0", @@ -24231,8 +20323,6 @@ }, "node_modules/esast-util-from-js": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/esast-util-from-js/-/esast-util-from-js-2.0.1.tgz", - "integrity": "sha512-8Ja+rNJ0Lt56Pcf3TAmpBZjmx8ZcK5Ts4cAzIOjsjevg9oSXJnl6SUQ2EevU8tv3h6ZLWmoKL5H4fgWvdvfETw==", "license": "MIT", "dependencies": { "@types/estree-jsx": "^1.0.0", @@ -24247,8 +20337,6 @@ }, "node_modules/esbuild": { "version": "0.27.3", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.27.3.tgz", - "integrity": "sha512-8VwMnyGCONIs6cWue2IdpHxHnAjzxnw2Zr7MkVxB2vjmQ2ivqGFb4LEG3SMnv0Gb2F/G/2yA8zUaiL1gywDCCg==", "hasInstallScript": true, "license": "MIT", "bin": { @@ -24286,25 +20374,8 @@ "@esbuild/win32-x64": "0.27.3" } }, - "node_modules/esbuild/node_modules/@esbuild/darwin-arm64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.27.2.tgz", - "integrity": "sha512-davCD2Zc80nzDVRwXTcQP/28fiJbcOwvdolL0sOiOsbwBa72kegmVU0Wrh1MYrbuCL98Omp5dVhQFWRKR2ZAlg==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=18" - } - }, "node_modules/escalade": { "version": "3.2.0", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", - "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", "license": "MIT", "engines": { "node": ">=6" @@ -24312,8 +20383,6 @@ }, "node_modules/escape-goat": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-goat/-/escape-goat-4.0.0.tgz", - "integrity": "sha512-2Sd4ShcWxbx6OY1IHyla/CVNwvg7XwZVoXZHcSu9w9SReNP1EzzD5T8NWKIR38fIqEns9kDWKUQTXXAmlDrdPg==", "license": "MIT", "engines": { "node": ">=12" @@ -24324,14 +20393,10 @@ }, "node_modules/escape-html": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", "license": "MIT" }, "node_modules/escape-string-regexp": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", "license": "MIT", "engines": { "node": ">=10" @@ -24342,8 +20407,6 @@ }, "node_modules/eslint": { "version": "9.39.3", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.39.3.tgz", - "integrity": "sha512-VmQ+sifHUbI/IcSopBCF/HO3YiHQx/AVd3UVyYL6weuwW+HvON9VYn5l6Zl1WZzPWXPNZrSQpxwkkZ/VuvJZzg==", "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.8.0", @@ -24401,8 +20464,6 @@ }, "node_modules/eslint-config-prettier": { "version": "10.1.8", - "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-10.1.8.tgz", - "integrity": "sha512-82GZUjRS0p/jganf6q1rEO25VSoHH0hKPCTrgillPjdI/3bgBhAE1QzHrHTizjpRvy6pGAvKjDJtk2pF9NDq8w==", "license": "MIT", "bin": { "eslint-config-prettier": "bin/cli.js" @@ -24416,8 +20477,6 @@ }, "node_modules/eslint-plugin-jest": { "version": "28.14.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-28.14.0.tgz", - "integrity": "sha512-P9s/qXSMTpRTerE2FQ0qJet2gKbcGyFTPAJipoKxmWqR6uuFqIqk8FuEfg5yBieOezVrEfAMZrEwJ6yEp+1MFQ==", "license": "MIT", "dependencies": { "@typescript-eslint/utils": "^6.0.0 || ^7.0.0 || ^8.0.0" @@ -24441,14 +20500,10 @@ }, "node_modules/eslint-plugin-only-warn": { "version": "1.2.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-only-warn/-/eslint-plugin-only-warn-1.2.1.tgz", - "integrity": "sha512-j37hwfaQDEOfkZ1Dpvu/HnWLavlzQxQxfbrU/9Jb4R9qzrE1eTYuRJyrxq7LzLRI8miG5FOV6veoUVhx7AI84w==", "license": "MIT" }, "node_modules/eslint-plugin-react": { "version": "7.37.5", - "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.37.5.tgz", - "integrity": "sha512-Qteup0SqU15kdocexFNAJMvCJEfa2xUKNV4CC1xsVMrIIqEy3SQ/rqyxCWNzfrd3/ldy6HMlD2e0JDVpDg2qIA==", "license": "MIT", "dependencies": { "array-includes": "^3.1.8", @@ -24479,8 +20534,6 @@ }, "node_modules/eslint-plugin-react-hooks": { "version": "5.2.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-5.2.0.tgz", - "integrity": "sha512-+f15FfK64YQwZdJNELETdn5ibXEUQmW1DZL6KXhNnc2heoy/sg9VJJeT7n8TlMWouzWqSWavFkIhHyIbIAEapg==", "license": "MIT", "engines": { "node": ">=10" @@ -24491,8 +20544,6 @@ }, "node_modules/eslint-plugin-react-refresh": { "version": "0.4.26", - "resolved": "https://registry.npmjs.org/eslint-plugin-react-refresh/-/eslint-plugin-react-refresh-0.4.26.tgz", - "integrity": "sha512-1RETEylht2O6FM/MvgnyvT+8K21wLqDNg4qD51Zj3guhjt433XbnnkVttHMyaVyAFD03QSV4LPS5iE3VQmO7XQ==", "dev": true, "license": "MIT", "peerDependencies": { @@ -24501,14 +20552,10 @@ }, "node_modules/eslint-plugin-react/node_modules/balanced-match": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", "license": "MIT" }, "node_modules/eslint-plugin-react/node_modules/brace-expansion": { "version": "1.1.12", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", - "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", "license": "MIT", "dependencies": { "balanced-match": "^1.0.0", @@ -24517,8 +20564,6 @@ }, "node_modules/eslint-plugin-react/node_modules/minimatch": { "version": "3.1.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", - "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", "license": "ISC", "dependencies": { "brace-expansion": "^1.1.7" @@ -24529,8 +20574,6 @@ }, "node_modules/eslint-plugin-react/node_modules/resolve": { "version": "2.0.0-next.6", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.6.tgz", - "integrity": "sha512-3JmVl5hMGtJ3kMmB3zi3DL25KfkCEyy3Tw7Gmw7z5w8M9WlwoPFnIvwChzu1+cF3iaK3sp18hhPz8ANeimdJfA==", "license": "MIT", "dependencies": { "es-errors": "^1.3.0", @@ -24552,8 +20595,6 @@ }, "node_modules/eslint-plugin-react/node_modules/semver": { "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "license": "ISC", "bin": { "semver": "bin/semver.js" @@ -24561,8 +20602,6 @@ }, "node_modules/eslint-plugin-storybook": { "version": "10.2.14", - "resolved": "https://registry.npmjs.org/eslint-plugin-storybook/-/eslint-plugin-storybook-10.2.14.tgz", - "integrity": "sha512-iFHN+hs2DQsY0KZssb9Dse5MVFT22E/f6BK9bShGq21TXv/z2+ix72NfIFTWg3sLFoEXr18uGWZiM5e3jt1EqQ==", "dev": true, "license": "MIT", "dependencies": { @@ -24575,8 +20614,6 @@ }, "node_modules/eslint-plugin-turbo": { "version": "2.8.12", - "resolved": "https://registry.npmjs.org/eslint-plugin-turbo/-/eslint-plugin-turbo-2.8.12.tgz", - "integrity": "sha512-Q0LcIS2bRivRDZbtHOrtNFUSclnvfL8Qn1yM8I7+1LRerPmdcLF++SYOOCsF9COCEvoP6O66+bnupDqpC/W59w==", "license": "MIT", "dependencies": { "dotenv": "16.0.3" @@ -24588,8 +20625,6 @@ }, "node_modules/eslint-plugin-turbo/node_modules/dotenv": { "version": "16.0.3", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.0.3.tgz", - "integrity": "sha512-7GO6HghkA5fYG9TYnNxi14/7K9f5occMlp3zXAuSxn7CKCxt9xbNWG7yF8hTCSUchlfWSe3uLmlPfigevRItzQ==", "license": "BSD-2-Clause", "engines": { "node": ">=12" @@ -24597,8 +20632,6 @@ }, "node_modules/eslint-scope": { "version": "8.4.0", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.4.0.tgz", - "integrity": "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==", "license": "BSD-2-Clause", "dependencies": { "esrecurse": "^4.3.0", @@ -24613,8 +20646,6 @@ }, "node_modules/eslint-visitor-keys": { "version": "3.4.3", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", - "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", "license": "Apache-2.0", "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -24625,8 +20656,6 @@ }, "node_modules/eslint/node_modules/ajv": { "version": "6.14.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.14.0.tgz", - "integrity": "sha512-IWrosm/yrn43eiKqkfkHis7QioDleaXQHdDVPKg0FSwwd/DuvyX79TZnFOnYpB7dcsFAMmtFztZuXPDvSePkFw==", "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.1", @@ -24641,8 +20670,6 @@ }, "node_modules/eslint/node_modules/ansi-styles": { "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "license": "MIT", "dependencies": { "color-convert": "^2.0.1" @@ -24656,14 +20683,10 @@ }, "node_modules/eslint/node_modules/balanced-match": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", "license": "MIT" }, "node_modules/eslint/node_modules/brace-expansion": { "version": "1.1.12", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", - "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", "license": "MIT", "dependencies": { "balanced-match": "^1.0.0", @@ -24672,8 +20695,6 @@ }, "node_modules/eslint/node_modules/chalk": { "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", @@ -24688,8 +20709,6 @@ }, "node_modules/eslint/node_modules/eslint-visitor-keys": { "version": "4.2.1", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", - "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", "license": "Apache-2.0", "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -24700,8 +20719,6 @@ }, "node_modules/eslint/node_modules/find-up": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", "license": "MIT", "dependencies": { "locate-path": "^6.0.0", @@ -24716,8 +20733,6 @@ }, "node_modules/eslint/node_modules/glob-parent": { "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", "license": "ISC", "dependencies": { "is-glob": "^4.0.3" @@ -24728,14 +20743,10 @@ }, "node_modules/eslint/node_modules/json-schema-traverse": { "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", "license": "MIT" }, "node_modules/eslint/node_modules/locate-path": { "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", "license": "MIT", "dependencies": { "p-locate": "^5.0.0" @@ -24749,8 +20760,6 @@ }, "node_modules/eslint/node_modules/minimatch": { "version": "3.1.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", - "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", "license": "ISC", "dependencies": { "brace-expansion": "^1.1.7" @@ -24761,8 +20770,6 @@ }, "node_modules/eslint/node_modules/p-limit": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", "license": "MIT", "dependencies": { "yocto-queue": "^0.1.0" @@ -24776,8 +20783,6 @@ }, "node_modules/eslint/node_modules/p-locate": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", "license": "MIT", "dependencies": { "p-limit": "^3.0.2" @@ -24791,8 +20796,6 @@ }, "node_modules/espree": { "version": "10.4.0", - "resolved": "https://registry.npmjs.org/espree/-/espree-10.4.0.tgz", - "integrity": "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==", "license": "BSD-2-Clause", "dependencies": { "acorn": "^8.15.0", @@ -24808,8 +20811,6 @@ }, "node_modules/espree/node_modules/eslint-visitor-keys": { "version": "4.2.1", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", - "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", "license": "Apache-2.0", "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -24820,8 +20821,6 @@ }, "node_modules/esprima": { "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", "license": "BSD-2-Clause", "bin": { "esparse": "bin/esparse.js", @@ -24833,8 +20832,6 @@ }, "node_modules/esquery": { "version": "1.7.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.7.0.tgz", - "integrity": "sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==", "license": "BSD-3-Clause", "dependencies": { "estraverse": "^5.1.0" @@ -24845,8 +20842,6 @@ }, "node_modules/esrecurse": { "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", "license": "BSD-2-Clause", "dependencies": { "estraverse": "^5.2.0" @@ -24857,8 +20852,6 @@ }, "node_modules/estraverse": { "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", "license": "BSD-2-Clause", "engines": { "node": ">=4.0" @@ -24866,8 +20859,6 @@ }, "node_modules/estree-util-attach-comments": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/estree-util-attach-comments/-/estree-util-attach-comments-3.0.0.tgz", - "integrity": "sha512-cKUwm/HUcTDsYh/9FgnuFqpfquUbwIqwKM26BVCGDPVgvaCl/nDCCjUfiLlx6lsEZ3Z4RFxNbOQ60pkaEwFxGw==", "license": "MIT", "dependencies": { "@types/estree": "^1.0.0" @@ -24879,8 +20870,6 @@ }, "node_modules/estree-util-build-jsx": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/estree-util-build-jsx/-/estree-util-build-jsx-3.0.1.tgz", - "integrity": "sha512-8U5eiL6BTrPxp/CHbs2yMgP8ftMhR5ww1eIKoWRMlqvltHF8fZn5LRDvTKuxD3DUn+shRbLGqXemcP51oFCsGQ==", "license": "MIT", "dependencies": { "@types/estree-jsx": "^1.0.0", @@ -24895,8 +20884,6 @@ }, "node_modules/estree-util-is-identifier-name": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/estree-util-is-identifier-name/-/estree-util-is-identifier-name-3.0.0.tgz", - "integrity": "sha512-hFtqIDZTIUZ9BXLb8y4pYGyk6+wekIivNVTcmvk8NoOh+VeRn5y6cEHzbURrWbfp1fIqdVipilzj+lfaadNZmg==", "license": "MIT", "funding": { "type": "opencollective", @@ -24905,8 +20892,6 @@ }, "node_modules/estree-util-scope": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/estree-util-scope/-/estree-util-scope-1.0.0.tgz", - "integrity": "sha512-2CAASclonf+JFWBNJPndcOpA8EMJwa0Q8LUFJEKqXLW6+qBvbFZuF5gItbQOs/umBUkjviCSDCbBwU2cXbmrhQ==", "license": "MIT", "dependencies": { "@types/estree": "^1.0.0", @@ -24919,8 +20904,6 @@ }, "node_modules/estree-util-to-js": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/estree-util-to-js/-/estree-util-to-js-2.0.0.tgz", - "integrity": "sha512-WDF+xj5rRWmD5tj6bIqRi6CkLIXbbNQUcxQHzGysQzvHmdYG2G7p/Tf0J0gpxGgkeMZNTIjT/AoSvC9Xehcgdg==", "license": "MIT", "dependencies": { "@types/estree-jsx": "^1.0.0", @@ -24934,8 +20917,6 @@ }, "node_modules/estree-util-value-to-estree": { "version": "3.5.0", - "resolved": "https://registry.npmjs.org/estree-util-value-to-estree/-/estree-util-value-to-estree-3.5.0.tgz", - "integrity": "sha512-aMV56R27Gv3QmfmF1MY12GWkGzzeAezAX+UplqHVASfjc9wNzI/X6hC0S9oxq61WT4aQesLGslWP9tKk6ghRZQ==", "license": "MIT", "dependencies": { "@types/estree": "^1.0.0" @@ -24946,8 +20927,6 @@ }, "node_modules/estree-util-visit": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/estree-util-visit/-/estree-util-visit-2.0.0.tgz", - "integrity": "sha512-m5KgiH85xAhhW8Wta0vShLcUvOsh3LLPI2YVwcbio1l7E09NTLL1EyMZFM1OyWowoH0skScNbhOPl4kcBgzTww==", "license": "MIT", "dependencies": { "@types/estree-jsx": "^1.0.0", @@ -24960,8 +20939,6 @@ }, "node_modules/estree-walker": { "version": "3.0.3", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", - "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", "license": "MIT", "dependencies": { "@types/estree": "^1.0.0" @@ -24969,8 +20946,6 @@ }, "node_modules/esutils": { "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", "license": "BSD-2-Clause", "engines": { "node": ">=0.10.0" @@ -24978,8 +20953,6 @@ }, "node_modules/eta": { "version": "2.2.0", - "resolved": "https://registry.npmjs.org/eta/-/eta-2.2.0.tgz", - "integrity": "sha512-UVQ72Rqjy/ZKQalzV5dCCJP80GrmPrMxh6NlNf+erV6ObL0ZFkhCstWRawS85z3smdr3d2wXPsZEY7rDPfGd2g==", "license": "MIT", "engines": { "node": ">=6.0.0" @@ -24990,8 +20963,6 @@ }, "node_modules/etag": { "version": "1.8.1", - "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", "license": "MIT", "engines": { "node": ">= 0.6" @@ -24999,8 +20970,6 @@ }, "node_modules/eval": { "version": "0.1.8", - "resolved": "https://registry.npmjs.org/eval/-/eval-0.1.8.tgz", - "integrity": "sha512-EzV94NYKoO09GLXGjXj9JIlXijVck4ONSr5wiCWDvhsvj5jxSrzTmRU/9C1DyB6uToszLs8aifA6NQ7lEQdvFw==", "dependencies": { "@types/node": "*", "require-like": ">= 0.1.1" @@ -25011,14 +20980,10 @@ }, "node_modules/eventemitter3": { "version": "5.0.4", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.4.tgz", - "integrity": "sha512-mlsTRyGaPBjPedk6Bvw+aqbsXDtoAyAzm5MO7JgU+yVRyMQ5O8bD4Kcci7BS85f93veegeCPkL8R4GLClnjLFw==", "license": "MIT" }, "node_modules/events": { "version": "3.3.0", - "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", - "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", "license": "MIT", "engines": { "node": ">=0.8.x" @@ -25026,8 +20991,6 @@ }, "node_modules/eventsource": { "version": "3.0.7", - "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-3.0.7.tgz", - "integrity": "sha512-CRT1WTyuQoD771GW56XEZFQ/ZoSfWid1alKGDYMmkt2yl8UXrVR4pspqWNEcqKvVIzg6PAltWjxcSSPrboA4iA==", "license": "MIT", "dependencies": { "eventsource-parser": "^3.0.1" @@ -25038,8 +21001,6 @@ }, "node_modules/eventsource-parser": { "version": "3.0.6", - "resolved": "https://registry.npmjs.org/eventsource-parser/-/eventsource-parser-3.0.6.tgz", - "integrity": "sha512-Vo1ab+QXPzZ4tCa8SwIHJFaSzy4R6SHf7BY79rFBDf0idraZWAkYrDjDj8uWaSm3S2TK+hJ7/t1CEmZ7jXw+pg==", "license": "MIT", "engines": { "node": ">=18.0.0" @@ -25047,8 +21008,6 @@ }, "node_modules/execa": { "version": "5.1.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", - "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", "license": "MIT", "dependencies": { "cross-spawn": "^7.0.3", @@ -25070,8 +21029,6 @@ }, "node_modules/execa/node_modules/onetime": { "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", "license": "MIT", "dependencies": { "mimic-fn": "^2.1.0" @@ -25085,14 +21042,10 @@ }, "node_modules/execa/node_modules/signal-exit": { "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", "license": "ISC" }, "node_modules/exit-x": { "version": "0.2.2", - "resolved": "https://registry.npmjs.org/exit-x/-/exit-x-0.2.2.tgz", - "integrity": "sha512-+I6B/IkJc1o/2tiURyz/ivu/O0nKNEArIUB5O7zBrlDVJr22SCLH3xTeEry428LvFhRzIA1g8izguxJ/gbNcVQ==", "license": "MIT", "engines": { "node": ">= 0.8.0" @@ -25100,8 +21053,6 @@ }, "node_modules/expand-template": { "version": "2.0.3", - "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz", - "integrity": "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==", "dev": true, "license": "(MIT OR WTFPL)", "engines": { @@ -25110,8 +21061,6 @@ }, "node_modules/expect": { "version": "30.2.0", - "resolved": "https://registry.npmjs.org/expect/-/expect-30.2.0.tgz", - "integrity": "sha512-u/feCi0GPsI+988gU2FLcsHyAHTU0MX1Wg68NhAnN7z/+C5wqG+CY8J53N9ioe8RXgaoz0nBR/TYMf3AycUuPw==", "license": "MIT", "dependencies": { "@jest/expect-utils": "30.2.0", @@ -25127,14 +21076,10 @@ }, "node_modules/exponential-backoff": { "version": "3.1.3", - "resolved": "https://registry.npmjs.org/exponential-backoff/-/exponential-backoff-3.1.3.tgz", - "integrity": "sha512-ZgEeZXj30q+I0EN+CbSSpIyPaJ5HVQD18Z1m+u1FXbAeT94mr1zw50q4q6jiiC447Nl/YTcIYSAftiGqetwXCA==", "license": "Apache-2.0" }, "node_modules/express": { "version": "4.22.1", - "resolved": "https://registry.npmjs.org/express/-/express-4.22.1.tgz", - "integrity": "sha512-F2X8g9P1X7uCPZMA3MVf9wcTqlyNp7IhH5qPCI0izhaOIYXaW9L535tGA3qmjRzpH+bZczqq7hVKxTR4NWnu+g==", "license": "MIT", "dependencies": { "accepts": "~1.3.8", @@ -25179,8 +21124,6 @@ }, "node_modules/express-rate-limit": { "version": "8.2.1", - "resolved": "https://registry.npmjs.org/express-rate-limit/-/express-rate-limit-8.2.1.tgz", - "integrity": "sha512-PCZEIEIxqwhzw4KF0n7QF4QqruVTcF73O5kFKUnGOyjbCCgizBBiFaYpd/fnBLUMPw/BWw9OsiN7GgrNYr7j6g==", "license": "MIT", "dependencies": { "ip-address": "10.0.1" @@ -25197,8 +21140,6 @@ }, "node_modules/express/node_modules/debug": { "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "license": "MIT", "dependencies": { "ms": "2.0.0" @@ -25206,20 +21147,14 @@ }, "node_modules/express/node_modules/ms": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "license": "MIT" }, "node_modules/extend": { "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", "license": "MIT" }, "node_modules/extend-shallow": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", "license": "MIT", "dependencies": { "is-extendable": "^0.1.0" @@ -25230,21 +21165,15 @@ }, "node_modules/extendable-error": { "version": "0.1.7", - "resolved": "https://registry.npmjs.org/extendable-error/-/extendable-error-0.1.7.tgz", - "integrity": "sha512-UOiS2in6/Q0FK0R0q6UY9vYpQ21mr/Qn1KOnte7vsACuNJf514WvCCUHSRCPcgjPT2bAhNIJdlE6bVap1GKmeg==", "dev": true, "license": "MIT" }, "node_modules/fast-deep-equal": { "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", "license": "MIT" }, "node_modules/fast-glob": { "version": "3.3.3", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", - "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", "license": "MIT", "dependencies": { "@nodelib/fs.stat": "^2.0.2", @@ -25259,27 +21188,19 @@ }, "node_modules/fast-json-parse": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/fast-json-parse/-/fast-json-parse-1.0.3.tgz", - "integrity": "sha512-FRWsaZRWEJ1ESVNbDWmsAlqDk96gPQezzLghafp5J4GUKjbCz3OkAHuZs5TuPEtkbVQERysLp9xv6c24fBm8Aw==", "dev": true, "license": "MIT" }, "node_modules/fast-json-stable-stringify": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", "license": "MIT" }, "node_modules/fast-levenshtein": { "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", "license": "MIT" }, "node_modules/fast-uri": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.0.tgz", - "integrity": "sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA==", "funding": [ { "type": "github", @@ -25294,8 +21215,6 @@ }, "node_modules/fast-xml-builder": { "version": "1.1.9", - "resolved": "https://registry.npmjs.org/fast-xml-builder/-/fast-xml-builder-1.1.9.tgz", - "integrity": "sha512-jcyKVSEX13iseJqg7n/KWw+xnu/7fdrZ333Fac54KjHDIELVCfDDJXYIm6DTJ0Su4gSzrhqiK0DzY/wZbF40mw==", "funding": [ { "type": "github", @@ -25309,8 +21228,6 @@ }, "node_modules/fast-xml-parser": { "version": "5.7.2", - "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-5.7.2.tgz", - "integrity": "sha512-P7oW7tLbYnhOLQk/Gv7cZgzgMPP/XN03K02/Jy6Y/NHzyIAIpxuZIM/YqAkfiXFPxA2CTm7NtCijK9EDu09u2w==", "funding": [ { "type": "github", @@ -25330,8 +21247,6 @@ }, "node_modules/fastq": { "version": "1.20.1", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.20.1.tgz", - "integrity": "sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==", "license": "ISC", "dependencies": { "reusify": "^1.0.4" @@ -25339,8 +21254,6 @@ }, "node_modules/fault": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/fault/-/fault-2.0.1.tgz", - "integrity": "sha512-WtySTkS4OKev5JtpHXnib4Gxiurzh5NCGvWrFaZ34m6JehfTUhKZvn9njTfw48t6JumVQOmrKqpmGcdwxnhqBQ==", "license": "MIT", "dependencies": { "format": "^0.2.0" @@ -25352,8 +21265,6 @@ }, "node_modules/faye-websocket": { "version": "0.11.4", - "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz", - "integrity": "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==", "license": "Apache-2.0", "dependencies": { "websocket-driver": ">=0.5.1" @@ -25364,8 +21275,6 @@ }, "node_modules/fb-watchman": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz", - "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==", "license": "Apache-2.0", "dependencies": { "bser": "2.1.1" @@ -25373,8 +21282,6 @@ }, "node_modules/feed": { "version": "4.2.2", - "resolved": "https://registry.npmjs.org/feed/-/feed-4.2.2.tgz", - "integrity": "sha512-u5/sxGfiMfZNtJ3OvQpXcvotFpYkL0n9u9mM2vkui2nGo8b4wvDkJ8gAkYqbA8QpGyFCv3RK0Z+Iv+9veCS9bQ==", "license": "MIT", "dependencies": { "xml-js": "^1.6.11" @@ -25385,8 +21292,6 @@ }, "node_modules/fetch-blob": { "version": "3.2.0", - "resolved": "https://registry.npmjs.org/fetch-blob/-/fetch-blob-3.2.0.tgz", - "integrity": "sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==", "funding": [ { "type": "github", @@ -25408,14 +21313,10 @@ }, "node_modules/fflate": { "version": "0.4.8", - "resolved": "https://registry.npmjs.org/fflate/-/fflate-0.4.8.tgz", - "integrity": "sha512-FJqqoDBR00Mdj9ppamLa/Y7vxm+PRmNWA67N846RvsoYVMKB4q3y/de5PA7gUmRMYK/8CMz2GDZQmCRN1wBcWA==", "license": "MIT" }, "node_modules/figures": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", - "integrity": "sha512-Oa2M9atig69ZkfwiApY8F2Yy+tzMbazyvqv21R0NsSC8floSOC09BbT1ITWAdoMGQvJ/aZnR1KMwdx9tvHnTNA==", "dev": true, "license": "MIT", "dependencies": { @@ -25427,8 +21328,6 @@ }, "node_modules/figures/node_modules/escape-string-regexp": { "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", "dev": true, "license": "MIT", "engines": { @@ -25437,8 +21336,6 @@ }, "node_modules/file-entry-cache": { "version": "8.0.0", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", - "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", "license": "MIT", "dependencies": { "flat-cache": "^4.0.0" @@ -25449,8 +21346,6 @@ }, "node_modules/file-loader": { "version": "6.2.0", - "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-6.2.0.tgz", - "integrity": "sha512-qo3glqyTa61Ytg4u73GultjHGjdRyig3tG6lPtyX/jOEJvHif9uB0/OCI2Kif6ctF3caQTW2G5gym21oAsI4pw==", "license": "MIT", "dependencies": { "loader-utils": "^2.0.0", @@ -25469,8 +21364,6 @@ }, "node_modules/file-loader/node_modules/ajv": { "version": "6.14.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.14.0.tgz", - "integrity": "sha512-IWrosm/yrn43eiKqkfkHis7QioDleaXQHdDVPKg0FSwwd/DuvyX79TZnFOnYpB7dcsFAMmtFztZuXPDvSePkFw==", "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.1", @@ -25485,8 +21378,6 @@ }, "node_modules/file-loader/node_modules/ajv-keywords": { "version": "3.5.2", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", - "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", "license": "MIT", "peerDependencies": { "ajv": "^6.9.1" @@ -25494,14 +21385,10 @@ }, "node_modules/file-loader/node_modules/json-schema-traverse": { "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", "license": "MIT" }, "node_modules/file-loader/node_modules/schema-utils": { "version": "3.3.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", - "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", "license": "MIT", "dependencies": { "@types/json-schema": "^7.0.8", @@ -25518,14 +21405,10 @@ }, "node_modules/file-uri-to-path": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", - "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==", "license": "MIT" }, "node_modules/fill-range": { "version": "7.1.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", - "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", "license": "MIT", "dependencies": { "to-regex-range": "^5.0.1" @@ -25536,8 +21419,6 @@ }, "node_modules/finalhandler": { "version": "1.3.2", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.2.tgz", - "integrity": "sha512-aA4RyPcd3badbdABGDuTXCMTtOneUCAYH/gxoYRTZlIJdF0YPWuGqiAsIrhNnnqdXGswYk6dGujem4w80UJFhg==", "license": "MIT", "dependencies": { "debug": "2.6.9", @@ -25554,8 +21435,6 @@ }, "node_modules/finalhandler/node_modules/debug": { "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "license": "MIT", "dependencies": { "ms": "2.0.0" @@ -25563,14 +21442,10 @@ }, "node_modules/finalhandler/node_modules/ms": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "license": "MIT" }, "node_modules/find-cache-dir": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-4.0.0.tgz", - "integrity": "sha512-9ZonPT4ZAK4a+1pUPVPZJapbi7O5qbbJPdYw/NOQWZZbVLdDTYM3A4R9z/DpAM08IDaFGsvPgiGZ82WEwUDWjg==", "license": "MIT", "dependencies": { "common-path-prefix": "^3.0.0", @@ -25585,8 +21460,6 @@ }, "node_modules/find-replace": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-replace/-/find-replace-3.0.0.tgz", - "integrity": "sha512-6Tb2myMioCAgv5kfvP5/PkZZ/ntTpVK39fHY7WkWBgvbeE+VHd/tZuZ4mrC+bxh4cfOZeYKVPaJIZtZXV7GNCQ==", "dev": true, "license": "MIT", "dependencies": { @@ -25598,8 +21471,6 @@ }, "node_modules/find-up": { "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", "license": "MIT", "dependencies": { "locate-path": "^5.0.0", @@ -25611,8 +21482,6 @@ }, "node_modules/fix-dts-default-cjs-exports": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/fix-dts-default-cjs-exports/-/fix-dts-default-cjs-exports-1.0.1.tgz", - "integrity": "sha512-pVIECanWFC61Hzl2+oOCtoJ3F17kglZC/6N94eRWycFgBH35hHx0Li604ZIzhseh97mf2p0cv7vVrOZGoqhlEg==", "license": "MIT", "dependencies": { "magic-string": "^0.30.17", @@ -25622,8 +21491,6 @@ }, "node_modules/fix-dts-default-cjs-exports/node_modules/magic-string": { "version": "0.30.21", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", - "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", "license": "MIT", "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.5" @@ -25631,8 +21498,6 @@ }, "node_modules/flat": { "version": "5.0.2", - "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", - "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", "license": "BSD-3-Clause", "bin": { "flat": "cli.js" @@ -25640,8 +21505,6 @@ }, "node_modules/flat-cache": { "version": "4.0.1", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", - "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", "license": "MIT", "dependencies": { "flatted": "^3.2.9", @@ -25653,20 +21516,14 @@ }, "node_modules/flatbuffers": { "version": "24.12.23", - "resolved": "https://registry.npmjs.org/flatbuffers/-/flatbuffers-24.12.23.tgz", - "integrity": "sha512-dLVCAISd5mhls514keQzmEG6QHmUUsNuWsb4tFafIUwvvgDjXhtfAYSKOzt5SWOy+qByV5pbsDZ+Vb7HUOBEdA==", "license": "Apache-2.0" }, "node_modules/flatted": { "version": "3.3.4", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.4.tgz", - "integrity": "sha512-3+mMldrTAPdta5kjX2G2J7iX4zxtnwpdA8Tr2ZSjkyPSanvbZAcy6flmtnXbEybHrDcU9641lxrMfFuUxVz9vA==", "license": "ISC" }, "node_modules/follow-redirects": { "version": "1.15.11", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.11.tgz", - "integrity": "sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==", "funding": [ { "type": "individual", @@ -25685,8 +21542,6 @@ }, "node_modules/for-each": { "version": "0.3.5", - "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.5.tgz", - "integrity": "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==", "license": "MIT", "dependencies": { "is-callable": "^1.2.7" @@ -25700,8 +21555,6 @@ }, "node_modules/foreground-child": { "version": "3.3.1", - "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz", - "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==", "license": "ISC", "dependencies": { "cross-spawn": "^7.0.6", @@ -25716,8 +21569,6 @@ }, "node_modules/form-data": { "version": "4.0.5", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.5.tgz", - "integrity": "sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==", "license": "MIT", "dependencies": { "asynckit": "^0.4.0", @@ -25732,8 +21583,6 @@ }, "node_modules/form-data-encoder": { "version": "2.1.4", - "resolved": "https://registry.npmjs.org/form-data-encoder/-/form-data-encoder-2.1.4.tgz", - "integrity": "sha512-yDYSgNMraqvnxiEXO4hi88+YZxaHC6QKzb5N84iRCTDeRO7ZALpir/lVmf/uXUhnwUr2O4HU8s/n6x+yNjQkHw==", "license": "MIT", "engines": { "node": ">= 14.17" @@ -25741,16 +21590,12 @@ }, "node_modules/format": { "version": "0.2.2", - "resolved": "https://registry.npmjs.org/format/-/format-0.2.2.tgz", - "integrity": "sha512-wzsgA6WOq+09wrU1tsJ09udeR/YZRaeArL9e1wPbFg3GG2yDnC2ldKpxs4xunpFF9DgqCqOIra3bc1HWrJ37Ww==", "engines": { "node": ">=0.4.x" } }, "node_modules/formdata-polyfill": { "version": "4.0.10", - "resolved": "https://registry.npmjs.org/formdata-polyfill/-/formdata-polyfill-4.0.10.tgz", - "integrity": "sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==", "license": "MIT", "dependencies": { "fetch-blob": "^3.1.2" @@ -25761,8 +21606,6 @@ }, "node_modules/forwarded": { "version": "0.2.0", - "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", - "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", "license": "MIT", "engines": { "node": ">= 0.6" @@ -25770,15 +21613,11 @@ }, "node_modules/fp-ts": { "version": "2.16.11", - "resolved": "https://registry.npmjs.org/fp-ts/-/fp-ts-2.16.11.tgz", - "integrity": "sha512-LaI+KaX2NFkfn1ZGHoKCmcfv7yrZsC3b8NtWsTVQeHkq4F27vI5igUuO53sxqDEa2gNQMHFPmpojDw/1zmUK7w==", "dev": true, "license": "MIT" }, "node_modules/fraction.js": { "version": "5.3.4", - "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-5.3.4.tgz", - "integrity": "sha512-1X1NTtiJphryn/uLQz3whtY6jK3fTqoE3ohKs0tT+Ujr1W59oopxmoEh7Lu5p6vBaPbgoM0bzveAW4Qi5RyWDQ==", "license": "MIT", "engines": { "node": "*" @@ -25790,8 +21629,6 @@ }, "node_modules/fresh": { "version": "0.5.2", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", "license": "MIT", "engines": { "node": ">= 0.6" @@ -25799,8 +21636,6 @@ }, "node_modules/fromentries": { "version": "1.3.2", - "resolved": "https://registry.npmjs.org/fromentries/-/fromentries-1.3.2.tgz", - "integrity": "sha512-cHEpEQHUg0f8XdtZCc2ZAhrHzKzT0MrFUTcvx+hfxYu7rGMDc5SKoXFh+n4YigxsHXRzc6OrCshdR1bWH6HHyg==", "dev": true, "funding": [ { @@ -25820,15 +21655,11 @@ }, "node_modules/fs-constants": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", - "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", "dev": true, "license": "MIT" }, "node_modules/fs-extra": { "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", - "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", "dev": true, "license": "MIT", "dependencies": { @@ -25842,8 +21673,6 @@ }, "node_modules/fs-minipass": { "version": "3.0.3", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-3.0.3.tgz", - "integrity": "sha512-XUBA9XClHbnJWSfBzjkm6RvPsyg3sryZt06BEQoXcF7EK/xpGaQYJgQKDJSUH5SGZ76Y7pFx1QBnXz09rU5Fbw==", "license": "ISC", "dependencies": { "minipass": "^7.0.3" @@ -25854,28 +21683,10 @@ }, "node_modules/fs.realpath": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", "license": "ISC" }, - "node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "hasInstallScript": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, "node_modules/function-bind": { "version": "1.1.2", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", - "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" @@ -25883,8 +21694,6 @@ }, "node_modules/function.prototype.name": { "version": "1.1.8", - "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.8.tgz", - "integrity": "sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==", "license": "MIT", "dependencies": { "call-bind": "^1.0.8", @@ -25903,8 +21712,6 @@ }, "node_modules/functions-have-names": { "version": "1.2.3", - "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", - "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" @@ -25912,8 +21719,6 @@ }, "node_modules/gaxios": { "version": "7.1.3", - "resolved": "https://registry.npmjs.org/gaxios/-/gaxios-7.1.3.tgz", - "integrity": "sha512-YGGyuEdVIjqxkxVH1pUTMY/XtmmsApXrCVv5EU25iX6inEPbV+VakJfLealkBtJN69AQmh1eGOdCl9Sm1UP6XQ==", "license": "Apache-2.0", "dependencies": { "extend": "^3.0.2", @@ -25927,8 +21732,6 @@ }, "node_modules/gaxios/node_modules/agent-base": { "version": "7.1.4", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.4.tgz", - "integrity": "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==", "license": "MIT", "engines": { "node": ">= 14" @@ -25936,8 +21739,6 @@ }, "node_modules/gaxios/node_modules/https-proxy-agent": { "version": "7.0.6", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", - "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", "license": "MIT", "dependencies": { "agent-base": "^7.1.2", @@ -25949,8 +21750,6 @@ }, "node_modules/gaxios/node_modules/node-fetch": { "version": "3.3.2", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-3.3.2.tgz", - "integrity": "sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==", "license": "MIT", "dependencies": { "data-uri-to-buffer": "^4.0.0", @@ -25967,8 +21766,6 @@ }, "node_modules/gcp-metadata": { "version": "8.1.2", - "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-8.1.2.tgz", - "integrity": "sha512-zV/5HKTfCeKWnxG0Dmrw51hEWFGfcF2xiXqcA3+J90WDuP0SvoiSO5ORvcBsifmx/FoIjgQN3oNOGaQ5PhLFkg==", "license": "Apache-2.0", "dependencies": { "gaxios": "^7.0.0", @@ -25981,8 +21778,6 @@ }, "node_modules/generator-function": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/generator-function/-/generator-function-2.0.1.tgz", - "integrity": "sha512-SFdFmIJi+ybC0vjlHN0ZGVGHc3lgE0DxPAT0djjVg+kjOnSqclqmj0KQ7ykTOLP6YxoqOvuAODGdcHJn+43q3g==", "license": "MIT", "engines": { "node": ">= 0.4" @@ -25990,8 +21785,6 @@ }, "node_modules/gensync": { "version": "1.0.0-beta.2", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", - "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", "license": "MIT", "engines": { "node": ">=6.9.0" @@ -25999,8 +21792,6 @@ }, "node_modules/get-caller-file": { "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", "license": "ISC", "engines": { "node": "6.* || 8.* || >= 10.*" @@ -26008,8 +21799,6 @@ }, "node_modules/get-east-asian-width": { "version": "1.5.0", - "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.5.0.tgz", - "integrity": "sha512-CQ+bEO+Tva/qlmw24dCejulK5pMzVnUOFOijVogd3KQs07HnRIgp8TGipvCCRT06xeYEbpbgwaCxglFyiuIcmA==", "dev": true, "license": "MIT", "engines": { @@ -26021,8 +21810,6 @@ }, "node_modules/get-intrinsic": { "version": "1.3.0", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", - "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", "license": "MIT", "dependencies": { "call-bind-apply-helpers": "^1.0.2", @@ -26045,8 +21832,6 @@ }, "node_modules/get-monorepo-packages": { "version": "1.3.0", - "resolved": "https://registry.npmjs.org/get-monorepo-packages/-/get-monorepo-packages-1.3.0.tgz", - "integrity": "sha512-A/s881nNcKhoM7RgkvYFTOtGO+dy4EWbyRaatncPEhhlJAaZRlpfHwuT68p5GJenEt81nnjJOwGg0WKLkR5ZdQ==", "dev": true, "license": "MIT", "dependencies": { @@ -26056,8 +21841,6 @@ }, "node_modules/get-monorepo-packages/node_modules/array-union": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", - "integrity": "sha512-Dxr6QJj/RdU/hCaBjOfxW+q6lyuVE6JFWIrAUpuOOhoJJoQ99cUn3igRaHVB5P9WrgFVN0FfArM3x0cueOU8ng==", "dev": true, "license": "MIT", "dependencies": { @@ -26069,15 +21852,11 @@ }, "node_modules/get-monorepo-packages/node_modules/balanced-match": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", "dev": true, "license": "MIT" }, "node_modules/get-monorepo-packages/node_modules/brace-expansion": { "version": "1.1.12", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", - "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", "dev": true, "license": "MIT", "dependencies": { @@ -26087,8 +21866,6 @@ }, "node_modules/get-monorepo-packages/node_modules/dir-glob": { "version": "2.2.2", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-2.2.2.tgz", - "integrity": "sha512-f9LBi5QWzIW3I6e//uxZoLBlUt9kcp66qo0sSCxL6YZKc75R1c4MFCoe/LaZiBGmgujvQdxc5Bn3QhfyvK5Hsw==", "dev": true, "license": "MIT", "dependencies": { @@ -26100,9 +21877,6 @@ }, "node_modules/get-monorepo-packages/node_modules/glob": { "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", "dev": true, "license": "ISC", "dependencies": { @@ -26122,8 +21896,6 @@ }, "node_modules/get-monorepo-packages/node_modules/globby": { "version": "7.1.1", - "resolved": "https://registry.npmjs.org/globby/-/globby-7.1.1.tgz", - "integrity": "sha512-yANWAN2DUcBtuus5Cpd+SKROzXHs2iVXFZt/Ykrfz6SAXqacLX25NZpltE+39ceMexYF4TtEadjuSTw8+3wX4g==", "dev": true, "license": "MIT", "dependencies": { @@ -26140,15 +21912,11 @@ }, "node_modules/get-monorepo-packages/node_modules/ignore": { "version": "3.3.10", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.10.tgz", - "integrity": "sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug==", "dev": true, "license": "MIT" }, "node_modules/get-monorepo-packages/node_modules/minimatch": { "version": "3.1.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", - "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", "dev": true, "license": "ISC", "dependencies": { @@ -26160,8 +21928,6 @@ }, "node_modules/get-monorepo-packages/node_modules/path-type": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", - "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", "dev": true, "license": "MIT", "dependencies": { @@ -26173,8 +21939,6 @@ }, "node_modules/get-monorepo-packages/node_modules/pify": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==", "dev": true, "license": "MIT", "engines": { @@ -26183,8 +21947,6 @@ }, "node_modules/get-monorepo-packages/node_modules/slash": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", - "integrity": "sha512-3TYDR7xWt4dIqV2JauJr+EJeW356RXijHeUlO+8djJ+uBXPn8/2dpzBc8yQhh583sVvc9CvFAeQVgijsH+PNNg==", "dev": true, "license": "MIT", "engines": { @@ -26193,14 +21955,10 @@ }, "node_modules/get-own-enumerable-property-symbols": { "version": "3.0.2", - "resolved": "https://registry.npmjs.org/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz", - "integrity": "sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g==", "license": "ISC" }, "node_modules/get-package-type": { "version": "0.1.0", - "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", - "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", "license": "MIT", "engines": { "node": ">=8.0.0" @@ -26208,8 +21966,6 @@ }, "node_modules/get-port": { "version": "5.1.1", - "resolved": "https://registry.npmjs.org/get-port/-/get-port-5.1.1.tgz", - "integrity": "sha512-g/Q1aTSDOxFpchXC4i8ZWvxA1lnPqx/JHqcpIw0/LX9T8x/GBbi6YnlN5nhaKIFkT8oFsscUKgDJYxfwfS6QsQ==", "license": "MIT", "optional": true, "engines": { @@ -26221,8 +21977,6 @@ }, "node_modules/get-proto": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", - "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", "license": "MIT", "dependencies": { "dunder-proto": "^1.0.1", @@ -26234,8 +21988,6 @@ }, "node_modules/get-stream": { "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", "license": "MIT", "engines": { "node": ">=10" @@ -26246,8 +21998,6 @@ }, "node_modules/get-symbol-description": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.1.0.tgz", - "integrity": "sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==", "license": "MIT", "dependencies": { "call-bound": "^1.0.3", @@ -26263,8 +22013,6 @@ }, "node_modules/get-tsconfig": { "version": "4.13.6", - "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.13.6.tgz", - "integrity": "sha512-shZT/QMiSHc/YBLxxOkMtgSid5HFoauqCE3/exfsEcwg1WkeqjG+V40yBbBrsD+jW2HDXcs28xOfcbm2jI8Ddw==", "devOptional": true, "license": "MIT", "dependencies": { @@ -26276,21 +22024,15 @@ }, "node_modules/github-from-package": { "version": "0.0.0", - "resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz", - "integrity": "sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==", "dev": true, "license": "MIT" }, "node_modules/github-slugger": { "version": "1.5.0", - "resolved": "https://registry.npmjs.org/github-slugger/-/github-slugger-1.5.0.tgz", - "integrity": "sha512-wIh+gKBI9Nshz2o46B0B3f5k/W+WI9ZAv6y5Dn5WJ5SK1t0TnDimB4WE5rmTD05ZAIn8HALCZVmCsvj0w0v0lw==", "license": "ISC" }, "node_modules/gitlog": { "version": "4.0.8", - "resolved": "https://registry.npmjs.org/gitlog/-/gitlog-4.0.8.tgz", - "integrity": "sha512-FcTLP7Rc0H1vWXD+J/aj5JS1uiCEBblcYXlcacRAT73N26OMYFFzrBXYmDozmWlV2K7zwK5PrH16/nuRNhqSlQ==", "dev": true, "license": "BSD-3-Clause", "dependencies": { @@ -26303,8 +22045,6 @@ }, "node_modules/glob": { "version": "13.0.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-13.0.6.tgz", - "integrity": "sha512-Wjlyrolmm8uDpm/ogGyXZXb1Z+Ca2B8NbJwqBVg0axK9GbBeoS7yGV6vjXnYdGm6X53iehEuxxbyiKp8QmN4Vw==", "license": "BlueOak-1.0.0", "dependencies": { "minimatch": "^10.2.2", @@ -26320,8 +22060,6 @@ }, "node_modules/glob-parent": { "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", "license": "ISC", "dependencies": { "is-glob": "^4.0.1" @@ -26332,8 +22070,6 @@ }, "node_modules/glob-to-regex.js": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/glob-to-regex.js/-/glob-to-regex.js-1.2.0.tgz", - "integrity": "sha512-QMwlOQKU/IzqMUOAZWubUOT8Qft+Y0KQWnX9nK3ch0CJg0tTp4TvGZsTfudYKv2NzoQSyPcnA6TYeIQ3jGichQ==", "license": "Apache-2.0", "engines": { "node": ">=10.0" @@ -26348,14 +22084,10 @@ }, "node_modules/glob-to-regexp": { "version": "0.4.1", - "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", - "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", "license": "BSD-2-Clause" }, "node_modules/global-dirs": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-3.0.1.tgz", - "integrity": "sha512-NBcGGFbBA9s1VzD41QXDG+3++t9Mn5t1FpLdhESY6oKY4gYTFpX4wO3sqGUa0Srjtbfj3szX0RnemmrVRUdULA==", "license": "MIT", "dependencies": { "ini": "2.0.0" @@ -26369,8 +22101,6 @@ }, "node_modules/global-dirs/node_modules/ini": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ini/-/ini-2.0.0.tgz", - "integrity": "sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==", "license": "ISC", "engines": { "node": ">=10" @@ -26378,8 +22108,6 @@ }, "node_modules/globals": { "version": "16.5.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-16.5.0.tgz", - "integrity": "sha512-c/c15i26VrJ4IRt5Z89DnIzCGDn9EcebibhAOjw5ibqEHsE1wLUgkPn9RDmNcUKyU87GeaL633nyJ+pplFR2ZQ==", "license": "MIT", "engines": { "node": ">=18" @@ -26390,8 +22118,6 @@ }, "node_modules/globalthis": { "version": "1.0.4", - "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz", - "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==", "license": "MIT", "dependencies": { "define-properties": "^1.2.1", @@ -26406,8 +22132,6 @@ }, "node_modules/globby": { "version": "11.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", - "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", "license": "MIT", "dependencies": { "array-union": "^2.1.0", @@ -26426,8 +22150,6 @@ }, "node_modules/google-auth-library": { "version": "10.6.1", - "resolved": "https://registry.npmjs.org/google-auth-library/-/google-auth-library-10.6.1.tgz", - "integrity": "sha512-5awwuLrzNol+pFDmKJd0dKtZ0fPLAtoA5p7YO4ODsDu6ONJUVqbYwvv8y2ZBO5MBNp9TJXigB19710kYpBPdtA==", "license": "Apache-2.0", "dependencies": { "base64-js": "^1.3.0", @@ -26443,8 +22165,6 @@ }, "node_modules/google-gax": { "version": "5.0.6", - "resolved": "https://registry.npmjs.org/google-gax/-/google-gax-5.0.6.tgz", - "integrity": "sha512-1kGbqVQBZPAAu4+/R1XxPQKP0ydbNYoLAr4l0ZO2bMV0kLyLW4I1gAk++qBLWt7DPORTzmWRMsCZe86gDjShJA==", "license": "Apache-2.0", "dependencies": { "@grpc/grpc-js": "^1.12.6", @@ -26465,8 +22185,6 @@ }, "node_modules/google-gax/node_modules/node-fetch": { "version": "3.3.2", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-3.3.2.tgz", - "integrity": "sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==", "license": "MIT", "dependencies": { "data-uri-to-buffer": "^4.0.0", @@ -26483,8 +22201,6 @@ }, "node_modules/google-logging-utils": { "version": "1.1.3", - "resolved": "https://registry.npmjs.org/google-logging-utils/-/google-logging-utils-1.1.3.tgz", - "integrity": "sha512-eAmLkjDjAFCVXg7A1unxHsLf961m6y17QFqXqAXGj/gVkKFrEICfStRfwUlGNfeCEjNRa32JEWOUTlYXPyyKvA==", "license": "Apache-2.0", "engines": { "node": ">=14" @@ -26492,8 +22208,6 @@ }, "node_modules/gopd": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", - "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", "license": "MIT", "engines": { "node": ">= 0.4" @@ -26504,8 +22218,6 @@ }, "node_modules/got": { "version": "12.6.1", - "resolved": "https://registry.npmjs.org/got/-/got-12.6.1.tgz", - "integrity": "sha512-mThBblvlAF1d4O5oqyvN+ZxLAYwIJK7bpMxgYqPD9okW0C3qm5FFn7k811QrcuEBwaogR3ngOFoCfs6mRv7teQ==", "license": "MIT", "dependencies": { "@sindresorhus/is": "^5.2.0", @@ -26529,8 +22241,6 @@ }, "node_modules/got/node_modules/@sindresorhus/is": { "version": "5.6.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-5.6.0.tgz", - "integrity": "sha512-TV7t8GKYaJWsn00tFDqBw8+Uqmr8A0fRU1tvTQhyZzGv0sJCGRQL3JGMI3ucuKo3XIZdUP+Lx7/gh2t3lewy7g==", "license": "MIT", "engines": { "node": ">=14.16" @@ -26541,14 +22251,10 @@ }, "node_modules/graceful-fs": { "version": "4.2.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", "license": "ISC" }, "node_modules/graphql": { "version": "16.13.0", - "resolved": "https://registry.npmjs.org/graphql/-/graphql-16.13.0.tgz", - "integrity": "sha512-uSisMYERbaB9bkA9M4/4dnqyktaEkf1kMHNKq/7DHyxVeWqHQ2mBmVqm5u6/FVHwF3iCNalKcg82Zfl+tffWoA==", "dev": true, "license": "MIT", "engines": { @@ -26557,8 +22263,6 @@ }, "node_modules/gray-matter": { "version": "4.0.3", - "resolved": "https://registry.npmjs.org/gray-matter/-/gray-matter-4.0.3.tgz", - "integrity": "sha512-5v6yZd4JK3eMI3FqqCouswVqwugaA9r4dNZB1wwcmrD02QkV5H0y7XBQW8QwQqEaZY1pM9aqORSORhJRdNK44Q==", "license": "MIT", "dependencies": { "js-yaml": "^3.13.1", @@ -26572,8 +22276,6 @@ }, "node_modules/gray-matter/node_modules/argparse": { "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", "license": "MIT", "dependencies": { "sprintf-js": "~1.0.2" @@ -26581,8 +22283,6 @@ }, "node_modules/gray-matter/node_modules/js-yaml": { "version": "3.14.2", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.2.tgz", - "integrity": "sha512-PMSmkqxr106Xa156c2M265Z+FTrPl+oxd/rgOQy2tijQeK5TxQ43psO1ZCwhVOSdnn+RzkzlRz/eY4BgJBYVpg==", "license": "MIT", "dependencies": { "argparse": "^1.0.7", @@ -26594,8 +22294,6 @@ }, "node_modules/gzip-size": { "version": "6.0.0", - "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-6.0.0.tgz", - "integrity": "sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q==", "license": "MIT", "dependencies": { "duplexer": "^0.1.2" @@ -26609,27 +22307,19 @@ }, "node_modules/hachure-fill": { "version": "0.5.2", - "resolved": "https://registry.npmjs.org/hachure-fill/-/hachure-fill-0.5.2.tgz", - "integrity": "sha512-3GKBOn+m2LX9iq+JC1064cSFprJY4jL1jCXTcpnfER5HYE2l/4EfWSGzkPa/ZDBmYI0ZOEj5VHV/eKnPGkHuOg==", "license": "MIT" }, "node_modules/handle-thing": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz", - "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==", "license": "MIT" }, "node_modules/harmony-reflect": { "version": "1.6.2", - "resolved": "https://registry.npmjs.org/harmony-reflect/-/harmony-reflect-1.6.2.tgz", - "integrity": "sha512-HIp/n38R9kQjDEziXyDTuW3vvoxxyxjxFzXLrBr18uB47GnSt+G9D29fqrpM5ZkspMcPICud3XsBJQ4Y2URg8g==", "dev": true, "license": "(Apache-2.0 OR MPL-1.1)" }, "node_modules/has-bigints": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.1.0.tgz", - "integrity": "sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==", "license": "MIT", "engines": { "node": ">= 0.4" @@ -26640,8 +22330,6 @@ }, "node_modules/has-flag": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "license": "MIT", "engines": { "node": ">=8" @@ -26649,8 +22337,6 @@ }, "node_modules/has-property-descriptors": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", - "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", "license": "MIT", "dependencies": { "es-define-property": "^1.0.0" @@ -26661,8 +22347,6 @@ }, "node_modules/has-proto": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.2.0.tgz", - "integrity": "sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==", "license": "MIT", "dependencies": { "dunder-proto": "^1.0.0" @@ -26676,8 +22360,6 @@ }, "node_modules/has-symbols": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", - "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", "license": "MIT", "engines": { "node": ">= 0.4" @@ -26688,8 +22370,6 @@ }, "node_modules/has-tostringtag": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", - "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", "license": "MIT", "dependencies": { "has-symbols": "^1.0.3" @@ -26703,8 +22383,6 @@ }, "node_modules/has-yarn": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-yarn/-/has-yarn-3.0.0.tgz", - "integrity": "sha512-IrsVwUHhEULx3R8f/aA8AHuEzAorplsab/v8HBzEiIukwq5i/EC+xmOW+HfP1OaDP+2JkgT1yILHN2O3UFIbcA==", "license": "MIT", "engines": { "node": "^12.20.0 || ^14.13.1 || >=16.0.0" @@ -26715,8 +22393,6 @@ }, "node_modules/hasown": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", - "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", "license": "MIT", "dependencies": { "function-bind": "^1.1.2" @@ -26727,8 +22403,6 @@ }, "node_modules/hast-util-from-parse5": { "version": "8.0.3", - "resolved": "https://registry.npmjs.org/hast-util-from-parse5/-/hast-util-from-parse5-8.0.3.tgz", - "integrity": "sha512-3kxEVkEKt0zvcZ3hCRYI8rqrgwtlIOFMWkbclACvjlDw8Li9S2hk/d51OI0nr/gIpdMHNepwgOKqZ/sy0Clpyg==", "license": "MIT", "dependencies": { "@types/hast": "^3.0.0", @@ -26747,8 +22421,6 @@ }, "node_modules/hast-util-parse-selector": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/hast-util-parse-selector/-/hast-util-parse-selector-4.0.0.tgz", - "integrity": "sha512-wkQCkSYoOGCRKERFWcxMVMOcYE2K1AaNLU8DXS9arxnLOUEWbOXKXiJUNzEpqZ3JOKpnha3jkFrumEjVliDe7A==", "license": "MIT", "dependencies": { "@types/hast": "^3.0.0" @@ -26760,8 +22432,6 @@ }, "node_modules/hast-util-raw": { "version": "9.1.0", - "resolved": "https://registry.npmjs.org/hast-util-raw/-/hast-util-raw-9.1.0.tgz", - "integrity": "sha512-Y8/SBAHkZGoNkpzqqfCldijcuUKh7/su31kEBp67cFY09Wy0mTRgtsLYsiIxMJxlu0f6AA5SUTbDR8K0rxnbUw==", "license": "MIT", "dependencies": { "@types/hast": "^3.0.0", @@ -26785,8 +22455,6 @@ }, "node_modules/hast-util-to-estree": { "version": "3.1.3", - "resolved": "https://registry.npmjs.org/hast-util-to-estree/-/hast-util-to-estree-3.1.3.tgz", - "integrity": "sha512-48+B/rJWAp0jamNbAAf9M7Uf//UVqAoMmgXhBdxTDJLGKY+LRnZ99qcG+Qjl5HfMpYNzS5v4EAwVEF34LeAj7w==", "license": "MIT", "dependencies": { "@types/estree": "^1.0.0", @@ -26813,8 +22481,6 @@ }, "node_modules/hast-util-to-html": { "version": "9.0.5", - "resolved": "https://registry.npmjs.org/hast-util-to-html/-/hast-util-to-html-9.0.5.tgz", - "integrity": "sha512-OguPdidb+fbHQSU4Q4ZiLKnzWo8Wwsf5bZfbvu7//a9oTYoqD/fWpe96NuHkoS9h0ccGOTe0C4NGXdtS0iObOw==", "license": "MIT", "dependencies": { "@types/hast": "^3.0.0", @@ -26836,8 +22502,6 @@ }, "node_modules/hast-util-to-jsx-runtime": { "version": "2.3.6", - "resolved": "https://registry.npmjs.org/hast-util-to-jsx-runtime/-/hast-util-to-jsx-runtime-2.3.6.tgz", - "integrity": "sha512-zl6s8LwNyo1P9uw+XJGvZtdFF1GdAkOg8ujOw+4Pyb76874fLps4ueHXDhXWdk6YHQ6OgUtinliG7RsYvCbbBg==", "license": "MIT", "dependencies": { "@types/estree": "^1.0.0", @@ -26863,8 +22527,6 @@ }, "node_modules/hast-util-to-parse5": { "version": "8.0.1", - "resolved": "https://registry.npmjs.org/hast-util-to-parse5/-/hast-util-to-parse5-8.0.1.tgz", - "integrity": "sha512-MlWT6Pjt4CG9lFCjiz4BH7l9wmrMkfkJYCxFwKQic8+RTZgWPuWxwAfjJElsXkex7DJjfSJsQIt931ilUgmwdA==", "license": "MIT", "dependencies": { "@types/hast": "^3.0.0", @@ -26882,8 +22544,6 @@ }, "node_modules/hast-util-whitespace": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/hast-util-whitespace/-/hast-util-whitespace-3.0.0.tgz", - "integrity": "sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==", "license": "MIT", "dependencies": { "@types/hast": "^3.0.0" @@ -26895,8 +22555,6 @@ }, "node_modules/hastscript": { "version": "9.0.1", - "resolved": "https://registry.npmjs.org/hastscript/-/hastscript-9.0.1.tgz", - "integrity": "sha512-g7df9rMFX/SPi34tyGCyUBREQoKkapwdY/T04Qn9TDWfHhAYt4/I0gMVirzK5wEzeUqIjEB+LXC/ypb7Aqno5w==", "license": "MIT", "dependencies": { "@types/hast": "^3.0.0", @@ -26912,8 +22570,6 @@ }, "node_modules/he": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", - "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", "license": "MIT", "bin": { "he": "bin/he" @@ -26921,15 +22577,11 @@ }, "node_modules/headers-polyfill": { "version": "4.0.3", - "resolved": "https://registry.npmjs.org/headers-polyfill/-/headers-polyfill-4.0.3.tgz", - "integrity": "sha512-IScLbePpkvO846sIwOtOTDjutRMWdXdJmXdMvk6gCBHxFO8d+QKOQedyZSxFTTFYRSmlgSTDtXqqq4pcenBXLQ==", "dev": true, "license": "MIT" }, "node_modules/heap-js": { "version": "2.7.1", - "resolved": "https://registry.npmjs.org/heap-js/-/heap-js-2.7.1.tgz", - "integrity": "sha512-EQfezRg0NCZGNlhlDR3Evrw1FVL2G3LhU7EgPoxufQKruNBSYA8MiRPHeWbU+36o+Fhel0wMwM+sLEiBAlNLJA==", "license": "BSD-3-Clause", "engines": { "node": ">=10.0.0" @@ -26937,15 +22589,11 @@ }, "node_modules/hermes-estree": { "version": "0.25.1", - "resolved": "https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.25.1.tgz", - "integrity": "sha512-0wUoCcLp+5Ev5pDW2OriHC2MJCbwLwuRx+gAqMTOkGKJJiBCLjtrvy4PWUGn6MIVefecRpzoOZ/UV6iGdOr+Cw==", "dev": true, "license": "MIT" }, "node_modules/hermes-parser": { "version": "0.25.1", - "resolved": "https://registry.npmjs.org/hermes-parser/-/hermes-parser-0.25.1.tgz", - "integrity": "sha512-6pEjquH3rqaI6cYAXYPcz9MS4rY6R4ngRgrgfDshRptUZIc3lw0MCIJIGDj9++mfySOuPTHB4nrSW99BCvOPIA==", "dev": true, "license": "MIT", "dependencies": { @@ -26954,8 +22602,6 @@ }, "node_modules/history": { "version": "4.10.1", - "resolved": "https://registry.npmjs.org/history/-/history-4.10.1.tgz", - "integrity": "sha512-36nwAD620w12kuzPAsyINPWJqlNbij+hpK1k9XRloDtym8mxzGYl2c17LnV6IAGB2Dmg4tEa7G7DlawS0+qjew==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.1.2", @@ -26968,8 +22614,6 @@ }, "node_modules/hoist-non-react-statics": { "version": "3.3.2", - "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", - "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==", "license": "BSD-3-Clause", "dependencies": { "react-is": "^16.7.0" @@ -26977,14 +22621,10 @@ }, "node_modules/hoist-non-react-statics/node_modules/react-is": { "version": "16.13.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", "license": "MIT" }, "node_modules/hono": { "version": "4.12.3", - "resolved": "https://registry.npmjs.org/hono/-/hono-4.12.3.tgz", - "integrity": "sha512-SFsVSjp8sj5UumXOOFlkZOG6XS9SJDKw0TbwFeV+AJ8xlST8kxK5Z/5EYa111UY8732lK2S/xB653ceuaoGwpg==", "license": "MIT", "engines": { "node": ">=16.9.0" @@ -26992,8 +22632,6 @@ }, "node_modules/hosted-git-info": { "version": "9.0.2", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-9.0.2.tgz", - "integrity": "sha512-M422h7o/BR3rmCQ8UHi7cyyMqKltdP9Uo+J2fXK+RSAY+wTcKOIRyhTuKv4qn+DJf3g+PL890AzId5KZpX+CBg==", "license": "ISC", "dependencies": { "lru-cache": "^11.1.0" @@ -27004,8 +22642,6 @@ }, "node_modules/hosted-git-info/node_modules/lru-cache": { "version": "11.2.6", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.2.6.tgz", - "integrity": "sha512-ESL2CrkS/2wTPfuend7Zhkzo2u0daGJ/A2VucJOgQ/C48S/zB8MMeMHSGKYpXhIjbPxfuezITkaBH1wqv00DDQ==", "license": "BlueOak-1.0.0", "engines": { "node": "20 || >=22" @@ -27013,8 +22649,6 @@ }, "node_modules/hpack.js": { "version": "2.1.6", - "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", - "integrity": "sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==", "license": "MIT", "dependencies": { "inherits": "^2.0.1", @@ -27025,14 +22659,10 @@ }, "node_modules/hpack.js/node_modules/isarray": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", "license": "MIT" }, "node_modules/hpack.js/node_modules/readable-stream": { "version": "2.3.8", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", - "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", "license": "MIT", "dependencies": { "core-util-is": "~1.0.0", @@ -27046,14 +22676,10 @@ }, "node_modules/hpack.js/node_modules/safe-buffer": { "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", "license": "MIT" }, "node_modules/hpack.js/node_modules/string_decoder": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "license": "MIT", "dependencies": { "safe-buffer": "~5.1.0" @@ -27061,8 +22687,6 @@ }, "node_modules/html-encoding-sniffer": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-4.0.0.tgz", - "integrity": "sha512-Y22oTqIU4uuPgEemfz7NDJz6OeKf12Lsu+QC+s3BVpda64lTiMYCyGwg5ki4vFxkMwQdeZDl2adZoqUgdFuTgQ==", "license": "MIT", "dependencies": { "whatwg-encoding": "^3.1.1" @@ -27073,8 +22697,6 @@ }, "node_modules/html-entities": { "version": "2.6.0", - "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.6.0.tgz", - "integrity": "sha512-kig+rMn/QOVRvr7c86gQ8lWXq+Hkv6CbAH1hLu+RG338StTpE8Z0b44SDVaqVu7HGKf27frdmUYEs9hTUX/cLQ==", "funding": [ { "type": "github", @@ -27089,14 +22711,10 @@ }, "node_modules/html-escaper": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", - "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", "license": "MIT" }, "node_modules/html-minifier-terser": { "version": "7.2.0", - "resolved": "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-7.2.0.tgz", - "integrity": "sha512-tXgn3QfqPIpGl9o+K5tpcj3/MN4SfLtsx2GWwBC3SSd0tXQGyF3gsSqad8loJgKZGM3ZxbYDd5yhiBIdWpmvLA==", "license": "MIT", "dependencies": { "camel-case": "^4.1.2", @@ -27116,8 +22734,6 @@ }, "node_modules/html-minifier-terser/node_modules/commander": { "version": "10.0.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz", - "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==", "license": "MIT", "engines": { "node": ">=14" @@ -27125,8 +22741,6 @@ }, "node_modules/html-tags": { "version": "3.3.1", - "resolved": "https://registry.npmjs.org/html-tags/-/html-tags-3.3.1.tgz", - "integrity": "sha512-ztqyC3kLto0e9WbNp0aeP+M3kTt+nbaIveGmUxAtZa+8iFgKLUOD4YKM5j+f3QD89bra7UeumolZHKuOXnTmeQ==", "license": "MIT", "engines": { "node": ">=8" @@ -27137,8 +22751,6 @@ }, "node_modules/html-void-elements": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/html-void-elements/-/html-void-elements-3.0.0.tgz", - "integrity": "sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==", "license": "MIT", "funding": { "type": "github", @@ -27147,8 +22759,6 @@ }, "node_modules/html-webpack-plugin": { "version": "5.6.6", - "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-5.6.6.tgz", - "integrity": "sha512-bLjW01UTrvoWTJQL5LsMRo1SypHW80FTm12OJRSnr3v6YHNhfe+1r0MYUZJMACxnCHURVnBWRwAsWs2yPU9Ezw==", "license": "MIT", "dependencies": { "@types/html-minifier-terser": "^6.0.0", @@ -27179,8 +22789,6 @@ }, "node_modules/html-webpack-plugin/node_modules/commander": { "version": "8.3.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", - "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", "license": "MIT", "engines": { "node": ">= 12" @@ -27188,8 +22796,6 @@ }, "node_modules/html-webpack-plugin/node_modules/html-minifier-terser": { "version": "6.1.0", - "resolved": "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz", - "integrity": "sha512-YXxSlJBZTP7RS3tWnQw74ooKa6L9b9i9QYXY21eUEvhZ3u9XLfv6OnFsQq6RxkhHygsaUMvYsZRV5rU/OVNZxw==", "license": "MIT", "dependencies": { "camel-case": "^4.1.2", @@ -27209,8 +22815,6 @@ }, "node_modules/htmlparser2": { "version": "8.0.2", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-8.0.2.tgz", - "integrity": "sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA==", "funding": [ "https://github.com/fb55/htmlparser2?sponsor=1", { @@ -27228,20 +22832,14 @@ }, "node_modules/http-cache-semantics": { "version": "4.2.0", - "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.2.0.tgz", - "integrity": "sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ==", "license": "BSD-2-Clause" }, "node_modules/http-deceiver": { "version": "1.2.7", - "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", - "integrity": "sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==", "license": "MIT" }, "node_modules/http-errors": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.1.tgz", - "integrity": "sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==", "license": "MIT", "dependencies": { "depd": "~2.0.0", @@ -27260,14 +22858,10 @@ }, "node_modules/http-parser-js": { "version": "0.5.10", - "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.10.tgz", - "integrity": "sha512-Pysuw9XpUq5dVc/2SMHpuTY01RFl8fttgcyunjL7eEMhGM3cI4eOmiCycJDVCo/7O7ClfQD3SaI6ftDzqOXYMA==", "license": "MIT" }, "node_modules/http-proxy": { "version": "1.18.1", - "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", - "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", "license": "MIT", "dependencies": { "eventemitter3": "^4.0.0", @@ -27280,8 +22874,6 @@ }, "node_modules/http-proxy-agent": { "version": "7.0.2", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", - "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", "license": "MIT", "dependencies": { "agent-base": "^7.1.0", @@ -27293,8 +22885,6 @@ }, "node_modules/http-proxy-agent/node_modules/agent-base": { "version": "7.1.4", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.4.tgz", - "integrity": "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==", "license": "MIT", "engines": { "node": ">= 14" @@ -27302,14 +22892,10 @@ }, "node_modules/http-proxy/node_modules/eventemitter3": { "version": "4.0.7", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", - "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", "license": "MIT" }, "node_modules/http2-wrapper": { "version": "2.2.1", - "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-2.2.1.tgz", - "integrity": "sha512-V5nVw1PAOgfI3Lmeaj2Exmeg7fenjhRUgz1lPSezy1CuhPYbgQtbQj4jZfEAEMlaL+vupsvhjqCyjzob0yxsmQ==", "license": "MIT", "dependencies": { "quick-lru": "^5.1.1", @@ -27321,8 +22907,6 @@ }, "node_modules/https-proxy-agent": { "version": "5.0.1", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", - "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", "license": "MIT", "dependencies": { "agent-base": "6", @@ -27334,8 +22918,6 @@ }, "node_modules/human-id": { "version": "4.1.3", - "resolved": "https://registry.npmjs.org/human-id/-/human-id-4.1.3.tgz", - "integrity": "sha512-tsYlhAYpjCKa//8rXZ9DqKEawhPoSytweBC2eNvcaDK+57RZLHGqNs3PZTQO6yekLFSuvA6AlnAfrw1uBvtb+Q==", "dev": true, "license": "MIT", "bin": { @@ -27344,8 +22926,6 @@ }, "node_modules/human-signals": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", - "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", "license": "Apache-2.0", "engines": { "node": ">=10.17.0" @@ -27353,8 +22933,6 @@ }, "node_modules/husky": { "version": "9.1.7", - "resolved": "https://registry.npmjs.org/husky/-/husky-9.1.7.tgz", - "integrity": "sha512-5gs5ytaNjBrh5Ow3zrvdUUY+0VxIuWVL4i9irt6friV+BqdCfmV11CQTWMiBYWHbXhco+J1kHfTOUkePhCDvMA==", "dev": true, "license": "MIT", "bin": { @@ -27369,8 +22947,6 @@ }, "node_modules/hyperdyperid": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/hyperdyperid/-/hyperdyperid-1.2.0.tgz", - "integrity": "sha512-Y93lCzHYgGWdrJ66yIktxiaGULYc6oGiABxhcO5AufBeOyoIdZF7bIfLaOrbM0iGIOXQQgxxRrFEnb+Y6w1n4A==", "license": "MIT", "engines": { "node": ">=10.18" @@ -27378,8 +22954,6 @@ }, "node_modules/iconv-lite": { "version": "0.7.2", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.7.2.tgz", - "integrity": "sha512-im9DjEDQ55s9fL4EYzOAv0yMqmMBSZp6G0VvFyTMPKWxiSBHUj9NW/qqLmXUwXrrM7AvqSlTCfvqRb0cM8yYqw==", "license": "MIT", "dependencies": { "safer-buffer": ">= 2.1.2 < 3.0.0" @@ -27394,8 +22968,6 @@ }, "node_modules/icss-utils": { "version": "5.1.0", - "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz", - "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==", "license": "ISC", "engines": { "node": "^10 || ^12 || >= 14" @@ -27406,20 +22978,14 @@ }, "node_modules/idb": { "version": "8.0.0", - "resolved": "https://registry.npmjs.org/idb/-/idb-8.0.0.tgz", - "integrity": "sha512-l//qvlAKGmQO31Qn7xdzagVPPaHTxXx199MhrAFuVBTPqydcPYBWjkrbv4Y0ktB+GmWOiwHl237UUOrLmQxLvw==", "license": "ISC" }, "node_modules/idb-keyval": { "version": "6.2.2", - "resolved": "https://registry.npmjs.org/idb-keyval/-/idb-keyval-6.2.2.tgz", - "integrity": "sha512-yjD9nARJ/jb1g+CvD0tlhUHOrJ9Sy0P8T9MF3YaLlHnSRpwPfpTX0XIvpmw3gAJUmEu3FiICLBDPXVwyEvrleg==", "license": "Apache-2.0" }, "node_modules/identity-obj-proxy": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/identity-obj-proxy/-/identity-obj-proxy-3.0.0.tgz", - "integrity": "sha512-00n6YnVHKrinT9t0d9+5yZC6UBNJANpYEQvL2LlX6Ab9lnmxzIRcEmTPuyGScvl1+jKuCICX1Z0Ab1pPKKdikA==", "dev": true, "license": "MIT", "dependencies": { @@ -27431,8 +22997,6 @@ }, "node_modules/ieee754": { "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", "funding": [ { "type": "github", @@ -27451,8 +23015,6 @@ }, "node_modules/ignore": { "version": "5.3.2", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", - "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", "license": "MIT", "engines": { "node": ">= 4" @@ -27460,8 +23022,6 @@ }, "node_modules/ignore-walk": { "version": "8.0.0", - "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-8.0.0.tgz", - "integrity": "sha512-FCeMZT4NiRQGh+YkeKMtWrOmBgWjHjMJ26WQWrRQyoyzqevdaGSakUaJW5xQYmjLlUVk2qUnCjYVBax9EKKg8A==", "license": "ISC", "dependencies": { "minimatch": "^10.0.3" @@ -27472,8 +23032,6 @@ }, "node_modules/image-size": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/image-size/-/image-size-2.0.2.tgz", - "integrity": "sha512-IRqXKlaXwgSMAMtpNzZa1ZAe8m+Sa1770Dhk8VkSsP9LS+iHD62Zd8FQKs8fbPiagBE7BzoFX23cxFnwshpV6w==", "license": "MIT", "bin": { "image-size": "bin/image-size.js" @@ -27484,20 +23042,14 @@ }, "node_modules/immediate": { "version": "3.3.0", - "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.3.0.tgz", - "integrity": "sha512-HR7EVodfFUdQCTIeySw+WDRFJlPcLOJbXfwwZ7Oom6tjsvZ3bOkCDJHehQC3nxJrv7+f9XecwazynjU8e4Vw3Q==", "license": "MIT" }, "node_modules/immutable": { "version": "5.1.4", - "resolved": "https://registry.npmjs.org/immutable/-/immutable-5.1.4.tgz", - "integrity": "sha512-p6u1bG3YSnINT5RQmx/yRZBpenIl30kVxkTLDyHLIMk0gict704Q9n+thfDI7lTRm9vXdDYutVzXhzcThxTnXA==", "license": "MIT" }, "node_modules/import-cwd": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/import-cwd/-/import-cwd-3.0.0.tgz", - "integrity": "sha512-4pnzH16plW+hgvRECbDWpQl3cqtvSofHWh44met7ESfZ8UZOWWddm8hEyDTqREJ9RbYHY8gi8DqmaelApoOGMg==", "dev": true, "license": "MIT", "dependencies": { @@ -27509,8 +23061,6 @@ }, "node_modules/import-fresh": { "version": "3.3.1", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", - "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", "license": "MIT", "dependencies": { "parent-module": "^1.0.0", @@ -27525,8 +23075,6 @@ }, "node_modules/import-fresh/node_modules/resolve-from": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", "license": "MIT", "engines": { "node": ">=4" @@ -27534,8 +23082,6 @@ }, "node_modules/import-from": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/import-from/-/import-from-3.0.0.tgz", - "integrity": "sha512-CiuXOFFSzkU5x/CR0+z7T91Iht4CXgfCxVOFRhh2Zyhg5wOpWvvDLQUsWl+gcN+QscYBjez8hDCt85O7RLDttQ==", "dev": true, "license": "MIT", "dependencies": { @@ -27547,8 +23093,6 @@ }, "node_modules/import-lazy": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-4.0.0.tgz", - "integrity": "sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw==", "license": "MIT", "engines": { "node": ">=8" @@ -27556,8 +23100,6 @@ }, "node_modules/import-local": { "version": "3.2.0", - "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.2.0.tgz", - "integrity": "sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA==", "license": "MIT", "dependencies": { "pkg-dir": "^4.2.0", @@ -27575,8 +23117,6 @@ }, "node_modules/import-local/node_modules/pkg-dir": { "version": "4.2.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", - "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", "license": "MIT", "dependencies": { "find-up": "^4.0.0" @@ -27587,8 +23127,6 @@ }, "node_modules/import-meta-resolve": { "version": "4.2.0", - "resolved": "https://registry.npmjs.org/import-meta-resolve/-/import-meta-resolve-4.2.0.tgz", - "integrity": "sha512-Iqv2fzaTQN28s/FwZAoFq0ZSs/7hMAHJVX+w8PZl3cY19Pxk6jFFalxQoIfW2826i/fDLXv8IiEZRIT0lDuWcg==", "dev": true, "license": "MIT", "funding": { @@ -27598,8 +23136,6 @@ }, "node_modules/imurmurhash": { "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", "license": "MIT", "engines": { "node": ">=0.8.19" @@ -27607,8 +23143,6 @@ }, "node_modules/indent-string": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", - "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", "license": "MIT", "engines": { "node": ">=8" @@ -27616,8 +23150,6 @@ }, "node_modules/index-to-position": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/index-to-position/-/index-to-position-1.2.0.tgz", - "integrity": "sha512-Yg7+ztRkqslMAS2iFaU+Oa4KTSidr63OsFGlOrJoW981kIYO3CGCS3wA95P1mUi/IVSJkn0D479KTJpVpvFNuw==", "dev": true, "license": "MIT", "engines": { @@ -27629,8 +23161,6 @@ }, "node_modules/infima": { "version": "0.2.0-alpha.45", - "resolved": "https://registry.npmjs.org/infima/-/infima-0.2.0-alpha.45.tgz", - "integrity": "sha512-uyH0zfr1erU1OohLk0fT4Rrb94AOhguWNOcD9uGrSpRvNB+6gZXUoJX5J0NtvzBO10YZ9PgvA4NFgt+fYg8ojw==", "license": "MIT", "engines": { "node": ">=12" @@ -27638,9 +23168,6 @@ }, "node_modules/inflight": { "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "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.", "license": "ISC", "dependencies": { "once": "^1.3.0", @@ -27649,14 +23176,10 @@ }, "node_modules/inherits": { "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", "license": "ISC" }, "node_modules/ini": { "version": "6.0.0", - "resolved": "https://registry.npmjs.org/ini/-/ini-6.0.0.tgz", - "integrity": "sha512-IBTdIkzZNOpqm7q3dRqJvMaldXjDHWkEDfrwGEQTs5eaQMWV+djAhR+wahyNNMAa+qpbDUhBMVt4ZKNwpPm7xQ==", "license": "ISC", "engines": { "node": "^20.17.0 || >=22.9.0" @@ -27664,14 +23187,10 @@ }, "node_modules/inline-style-parser": { "version": "0.2.7", - "resolved": "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.2.7.tgz", - "integrity": "sha512-Nb2ctOyNR8DqQoR0OwRG95uNWIC0C1lCgf5Naz5H6Ji72KZ8OcFZLz2P5sNgwlyoJ8Yif11oMuYs5pBQa86csA==", "license": "MIT" }, "node_modules/internal-slot": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.1.0.tgz", - "integrity": "sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==", "license": "MIT", "dependencies": { "es-errors": "^1.3.0", @@ -27684,8 +23203,6 @@ }, "node_modules/internmap": { "version": "2.0.3", - "resolved": "https://registry.npmjs.org/internmap/-/internmap-2.0.3.tgz", - "integrity": "sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==", "license": "ISC", "engines": { "node": ">=12" @@ -27693,8 +23210,6 @@ }, "node_modules/invariant": { "version": "2.2.4", - "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", - "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", "license": "MIT", "dependencies": { "loose-envify": "^1.0.0" @@ -27702,8 +23217,6 @@ }, "node_modules/io-ts": { "version": "2.2.22", - "resolved": "https://registry.npmjs.org/io-ts/-/io-ts-2.2.22.tgz", - "integrity": "sha512-FHCCztTkHoV9mdBsHpocLpdTAfh956ZQcIkWQxxS0U5HT53vtrcuYdQneEJKH6xILaLNzXVl2Cvwtoy8XNN0AA==", "dev": true, "license": "MIT", "peerDependencies": { @@ -27712,8 +23225,6 @@ }, "node_modules/ioredis": { "version": "5.10.1", - "resolved": "https://registry.npmjs.org/ioredis/-/ioredis-5.10.1.tgz", - "integrity": "sha512-HuEDBTI70aYdx1v6U97SbNx9F1+svQKBDo30o0b9fw055LMepzpOOd0Ccg9Q6tbqmBSJaMuY0fB7yw9/vjBYCA==", "license": "MIT", "dependencies": { "@ioredis/commands": "1.5.1", @@ -27736,8 +23247,6 @@ }, "node_modules/ip-address": { "version": "10.0.1", - "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-10.0.1.tgz", - "integrity": "sha512-NWv9YLW4PoW2B7xtzaS3NCot75m6nK7Icdv0o3lfMceJVRfSoQwqD4wEH5rLwoKJwUiZ/rfpiVBhnaF0FK4HoA==", "license": "MIT", "engines": { "node": ">= 12" @@ -27745,8 +23254,6 @@ }, "node_modules/ipaddr.js": { "version": "1.9.1", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", - "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", "license": "MIT", "engines": { "node": ">= 0.10" @@ -27754,8 +23261,6 @@ }, "node_modules/is-alphabetical": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-2.0.1.tgz", - "integrity": "sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==", "license": "MIT", "funding": { "type": "github", @@ -27764,8 +23269,6 @@ }, "node_modules/is-alphanumerical": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-2.0.1.tgz", - "integrity": "sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==", "license": "MIT", "dependencies": { "is-alphabetical": "^2.0.0", @@ -27778,8 +23281,6 @@ }, "node_modules/is-arguments": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.2.0.tgz", - "integrity": "sha512-7bVbi0huj/wrIAOzb8U1aszg9kdi3KN/CyU19CTI7tAoZYEZoL9yCDXpbXN+uPsuWnP02cyug1gleqq+TU+YCA==", "license": "MIT", "peer": true, "dependencies": { @@ -27795,8 +23296,6 @@ }, "node_modules/is-array-buffer": { "version": "3.0.5", - "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.5.tgz", - "integrity": "sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==", "license": "MIT", "dependencies": { "call-bind": "^1.0.8", @@ -27812,14 +23311,10 @@ }, "node_modules/is-arrayish": { "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", "license": "MIT" }, "node_modules/is-async-function": { "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.1.1.tgz", - "integrity": "sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==", "license": "MIT", "dependencies": { "async-function": "^1.0.0", @@ -27837,8 +23332,6 @@ }, "node_modules/is-bigint": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.1.0.tgz", - "integrity": "sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==", "license": "MIT", "dependencies": { "has-bigints": "^1.0.2" @@ -27852,8 +23345,6 @@ }, "node_modules/is-binary-path": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", "license": "MIT", "dependencies": { "binary-extensions": "^2.0.0" @@ -27864,8 +23355,6 @@ }, "node_modules/is-boolean-object": { "version": "1.2.2", - "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.2.2.tgz", - "integrity": "sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==", "license": "MIT", "dependencies": { "call-bound": "^1.0.3", @@ -27880,14 +23369,10 @@ }, "node_modules/is-buffer": { "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", "license": "MIT" }, "node_modules/is-callable": { "version": "1.2.7", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", - "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", "license": "MIT", "engines": { "node": ">= 0.4" @@ -27898,8 +23383,6 @@ }, "node_modules/is-ci": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-3.0.1.tgz", - "integrity": "sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ==", "license": "MIT", "dependencies": { "ci-info": "^3.2.0" @@ -27910,8 +23393,6 @@ }, "node_modules/is-core-module": { "version": "2.16.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", - "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", "license": "MIT", "dependencies": { "hasown": "^2.0.2" @@ -27925,8 +23406,6 @@ }, "node_modules/is-data-view": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.2.tgz", - "integrity": "sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==", "license": "MIT", "dependencies": { "call-bound": "^1.0.2", @@ -27942,8 +23421,6 @@ }, "node_modules/is-date-object": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.1.0.tgz", - "integrity": "sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==", "license": "MIT", "dependencies": { "call-bound": "^1.0.2", @@ -27958,8 +23435,6 @@ }, "node_modules/is-decimal": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-2.0.1.tgz", - "integrity": "sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==", "license": "MIT", "funding": { "type": "github", @@ -27968,8 +23443,6 @@ }, "node_modules/is-docker": { "version": "2.2.1", - "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", - "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", "license": "MIT", "bin": { "is-docker": "cli.js" @@ -27983,21 +23456,15 @@ }, "node_modules/is-electron": { "version": "2.2.2", - "resolved": "https://registry.npmjs.org/is-electron/-/is-electron-2.2.2.tgz", - "integrity": "sha512-FO/Rhvz5tuw4MCWkpMzHFKWD2LsfHzIb7i6MdPYZ/KW7AlxawyLkqdy+jPZP1WubqEADE3O4FUENlJHDfQASRg==", "license": "MIT" }, "node_modules/is-empty": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/is-empty/-/is-empty-1.2.0.tgz", - "integrity": "sha512-F2FnH/otLNJv0J6wc73A5Xo7oHLNnqplYqZhUu01tD54DIPvxIRSTSLkrUB/M0nHO4vo1O9PDfN4KoTxCzLh/w==", "dev": true, "license": "MIT" }, "node_modules/is-extendable": { "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", "license": "MIT", "engines": { "node": ">=0.10.0" @@ -28005,8 +23472,6 @@ }, "node_modules/is-extglob": { "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", "license": "MIT", "engines": { "node": ">=0.10.0" @@ -28014,8 +23479,6 @@ }, "node_modules/is-finalizationregistry": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.1.1.tgz", - "integrity": "sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==", "license": "MIT", "dependencies": { "call-bound": "^1.0.3" @@ -28029,8 +23492,6 @@ }, "node_modules/is-fullwidth-code-point": { "version": "5.1.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-5.1.0.tgz", - "integrity": "sha512-5XHYaSyiqADb4RnZ1Bdad6cPp8Toise4TzEjcOYDHZkTCbKgiUl7WTUCpNWHuxmDt91wnsZBc9xinNzopv3JMQ==", "dev": true, "license": "MIT", "dependencies": { @@ -28045,8 +23506,6 @@ }, "node_modules/is-generator-fn": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", - "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", "license": "MIT", "engines": { "node": ">=6" @@ -28054,8 +23513,6 @@ }, "node_modules/is-generator-function": { "version": "1.1.2", - "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.1.2.tgz", - "integrity": "sha512-upqt1SkGkODW9tsGNG5mtXTXtECizwtS2kA161M+gJPc1xdb/Ax629af6YrTwcOeQHbewrPNlE5Dx7kzvXTizA==", "license": "MIT", "dependencies": { "call-bound": "^1.0.4", @@ -28073,8 +23530,6 @@ }, "node_modules/is-glob": { "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", "license": "MIT", "dependencies": { "is-extglob": "^2.1.1" @@ -28085,8 +23540,6 @@ }, "node_modules/is-hexadecimal": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-2.0.1.tgz", - "integrity": "sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==", "license": "MIT", "funding": { "type": "github", @@ -28095,8 +23548,6 @@ }, "node_modules/is-in-ssh": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-in-ssh/-/is-in-ssh-1.0.0.tgz", - "integrity": "sha512-jYa6Q9rH90kR1vKB6NM7qqd1mge3Fx4Dhw5TVlK1MUBqhEOuCagrEHMevNuCcbECmXZ0ThXkRm+Ymr51HwEPAw==", "license": "MIT", "engines": { "node": ">=20" @@ -28107,8 +23558,6 @@ }, "node_modules/is-inside-container": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-inside-container/-/is-inside-container-1.0.0.tgz", - "integrity": "sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==", "license": "MIT", "dependencies": { "is-docker": "^3.0.0" @@ -28125,8 +23574,6 @@ }, "node_modules/is-inside-container/node_modules/is-docker": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-3.0.0.tgz", - "integrity": "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==", "license": "MIT", "bin": { "is-docker": "cli.js" @@ -28140,8 +23587,6 @@ }, "node_modules/is-installed-globally": { "version": "0.4.0", - "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.4.0.tgz", - "integrity": "sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ==", "license": "MIT", "dependencies": { "global-dirs": "^3.0.0", @@ -28156,8 +23601,6 @@ }, "node_modules/is-map": { "version": "2.0.3", - "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz", - "integrity": "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==", "license": "MIT", "engines": { "node": ">= 0.4" @@ -28168,8 +23611,6 @@ }, "node_modules/is-negative-zero": { "version": "2.0.3", - "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz", - "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==", "license": "MIT", "engines": { "node": ">= 0.4" @@ -28180,8 +23621,6 @@ }, "node_modules/is-network-error": { "version": "1.3.1", - "resolved": "https://registry.npmjs.org/is-network-error/-/is-network-error-1.3.1.tgz", - "integrity": "sha512-6QCxa49rQbmUWLfk0nuGqzql9U8uaV2H6279bRErPBHe/109hCzsLUBUHfbEtvLIHBd6hyXbgedBSHevm43Edw==", "license": "MIT", "engines": { "node": ">=16" @@ -28192,15 +23631,11 @@ }, "node_modules/is-node-process": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/is-node-process/-/is-node-process-1.2.0.tgz", - "integrity": "sha512-Vg4o6/fqPxIjtxgUH5QLJhwZ7gW5diGCVlXpuUfELC62CuxM1iHcRe51f2W1FDy04Ai4KJkagKjx3XaqyfRKXw==", "dev": true, "license": "MIT" }, "node_modules/is-npm": { "version": "6.1.0", - "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-6.1.0.tgz", - "integrity": "sha512-O2z4/kNgyjhQwVR1Wpkbfc19JIhggF97NZNCpWTnjH7kVcZMUrnut9XSN7txI7VdyIYk5ZatOq3zvSuWpU8hoA==", "license": "MIT", "engines": { "node": "^12.20.0 || ^14.13.1 || >=16.0.0" @@ -28211,8 +23646,6 @@ }, "node_modules/is-number": { "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", "license": "MIT", "engines": { "node": ">=0.12.0" @@ -28220,8 +23653,6 @@ }, "node_modules/is-number-object": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.1.1.tgz", - "integrity": "sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==", "license": "MIT", "dependencies": { "call-bound": "^1.0.3", @@ -28236,8 +23667,6 @@ }, "node_modules/is-obj": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", - "integrity": "sha512-l4RyHgRqGN4Y3+9JHVrNqO+tN0rV5My76uW5/nuO4K1b6vw5G8d/cmFjP9tRfEsdhZNt0IFdZuK/c2Vr4Nb+Qg==", "license": "MIT", "engines": { "node": ">=0.10.0" @@ -28245,8 +23674,6 @@ }, "node_modules/is-path-inside": { "version": "3.0.3", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", - "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", "license": "MIT", "engines": { "node": ">=8" @@ -28254,8 +23681,6 @@ }, "node_modules/is-plain-obj": { "version": "4.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz", - "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==", "license": "MIT", "engines": { "node": ">=12" @@ -28266,8 +23691,6 @@ }, "node_modules/is-plain-object": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", - "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==", "dev": true, "license": "MIT", "engines": { @@ -28276,20 +23699,14 @@ }, "node_modules/is-potential-custom-element-name": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", - "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==", "license": "MIT" }, "node_modules/is-promise": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-4.0.0.tgz", - "integrity": "sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==", "license": "MIT" }, "node_modules/is-regex": { "version": "1.2.1", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz", - "integrity": "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==", "license": "MIT", "dependencies": { "call-bound": "^1.0.2", @@ -28306,8 +23723,6 @@ }, "node_modules/is-regexp": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-regexp/-/is-regexp-1.0.0.tgz", - "integrity": "sha512-7zjFAPO4/gwyQAAgRRmqeEeyIICSdmCqa3tsVHMdBzaXXRiqopZL4Cyghg/XulGWrtABTpbnYYzzIRffLkP4oA==", "license": "MIT", "engines": { "node": ">=0.10.0" @@ -28315,8 +23730,6 @@ }, "node_modules/is-retry-allowed": { "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-2.2.0.tgz", - "integrity": "sha512-XVm7LOeLpTW4jV19QSH38vkswxoLud8sQ57YwJVTPWdiaI9I8keEhGFpBlslyVsgdQy4Opg8QOLb8YRgsyZiQg==", "license": "MIT", "engines": { "node": ">=10" @@ -28327,8 +23740,6 @@ }, "node_modules/is-set": { "version": "2.0.3", - "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz", - "integrity": "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==", "license": "MIT", "engines": { "node": ">= 0.4" @@ -28339,8 +23750,6 @@ }, "node_modules/is-shared-array-buffer": { "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.4.tgz", - "integrity": "sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==", "license": "MIT", "dependencies": { "call-bound": "^1.0.3" @@ -28354,8 +23763,6 @@ }, "node_modules/is-stream": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", "license": "MIT", "engines": { "node": ">=8" @@ -28366,14 +23773,10 @@ }, "node_modules/is-stream-ended": { "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-stream-ended/-/is-stream-ended-0.1.4.tgz", - "integrity": "sha512-xj0XPvmr7bQFTvirqnFr50o0hQIh6ZItDqloxt5aJrR4NQsYeSsyFQERYGCAzfindAcnKjINnwEEgLx4IqVzQw==", "license": "MIT" }, "node_modules/is-string": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.1.1.tgz", - "integrity": "sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==", "license": "MIT", "dependencies": { "call-bound": "^1.0.3", @@ -28388,8 +23791,6 @@ }, "node_modules/is-subdir": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/is-subdir/-/is-subdir-1.2.0.tgz", - "integrity": "sha512-2AT6j+gXe/1ueqbW6fLZJiIw3F8iXGJtt0yDrZaBhAZEG1raiTxKWU+IPqMCzQAXOUCKdA4UDMgacKH25XG2Cw==", "dev": true, "license": "MIT", "dependencies": { @@ -28401,8 +23802,6 @@ }, "node_modules/is-symbol": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.1.1.tgz", - "integrity": "sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==", "license": "MIT", "dependencies": { "call-bound": "^1.0.2", @@ -28418,8 +23817,6 @@ }, "node_modules/is-typed-array": { "version": "1.1.15", - "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.15.tgz", - "integrity": "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==", "license": "MIT", "dependencies": { "which-typed-array": "^1.1.16" @@ -28433,14 +23830,10 @@ }, "node_modules/is-typedarray": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==", "license": "MIT" }, "node_modules/is-unicode-supported": { "version": "0.1.0", - "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", - "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", "dev": true, "license": "MIT", "engines": { @@ -28452,8 +23845,6 @@ }, "node_modules/is-weakmap": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz", - "integrity": "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==", "license": "MIT", "engines": { "node": ">= 0.4" @@ -28464,8 +23855,6 @@ }, "node_modules/is-weakref": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.1.1.tgz", - "integrity": "sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==", "license": "MIT", "dependencies": { "call-bound": "^1.0.3" @@ -28479,8 +23868,6 @@ }, "node_modules/is-weakset": { "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.4.tgz", - "integrity": "sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==", "license": "MIT", "dependencies": { "call-bound": "^1.0.3", @@ -28495,8 +23882,6 @@ }, "node_modules/is-windows": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", - "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", "dev": true, "license": "MIT", "engines": { @@ -28505,8 +23890,6 @@ }, "node_modules/is-wsl": { "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", - "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", "license": "MIT", "dependencies": { "is-docker": "^2.0.0" @@ -28517,8 +23900,6 @@ }, "node_modules/is-yarn-global": { "version": "0.4.1", - "resolved": "https://registry.npmjs.org/is-yarn-global/-/is-yarn-global-0.4.1.tgz", - "integrity": "sha512-/kppl+R+LO5VmhYSEWARUFjodS25D68gvj8W7z0I7OWhUla5xWu8KL6CtB2V0R6yqhnRgbcaREMr4EEM6htLPQ==", "license": "MIT", "engines": { "node": ">=12" @@ -28526,20 +23907,14 @@ }, "node_modules/isarray": { "version": "2.0.5", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", - "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", "license": "MIT" }, "node_modules/isexe": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", "license": "ISC" }, "node_modules/isobject": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", "license": "MIT", "engines": { "node": ">=0.10.0" @@ -28547,8 +23922,6 @@ }, "node_modules/istanbul-lib-coverage": { "version": "3.2.2", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", - "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==", "license": "BSD-3-Clause", "engines": { "node": ">=8" @@ -28556,8 +23929,6 @@ }, "node_modules/istanbul-lib-instrument": { "version": "6.0.3", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.3.tgz", - "integrity": "sha512-Vtgk7L/R2JHyyGW07spoFlB8/lpjiOLTjMdms6AFMraYt3BaJauod/NGrfnVG/y4Ix1JEuMRPDPEj2ua+zz1/Q==", "license": "BSD-3-Clause", "dependencies": { "@babel/core": "^7.23.9", @@ -28572,8 +23943,6 @@ }, "node_modules/istanbul-lib-report": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", - "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", "license": "BSD-3-Clause", "dependencies": { "istanbul-lib-coverage": "^3.0.0", @@ -28586,8 +23955,6 @@ }, "node_modules/istanbul-lib-source-maps": { "version": "5.0.6", - "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-5.0.6.tgz", - "integrity": "sha512-yg2d+Em4KizZC5niWhQaIomgf5WlL4vOOjZ5xGCmF8SnPE/mDWWXgvRExdcpCgh9lLRRa1/fSYp2ymmbJ1pI+A==", "license": "BSD-3-Clause", "dependencies": { "@jridgewell/trace-mapping": "^0.3.23", @@ -28600,8 +23967,6 @@ }, "node_modules/istanbul-reports": { "version": "3.2.0", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.2.0.tgz", - "integrity": "sha512-HGYWWS/ehqTV3xN10i23tkPkpH46MLCIMFNCaaKNavAXTF1RkqxawEPtnjnGZ6XKSInBKkiOA5BKS+aZiY3AvA==", "license": "BSD-3-Clause", "dependencies": { "html-escaper": "^2.0.0", @@ -28613,8 +23978,6 @@ }, "node_modules/iterator.prototype": { "version": "1.1.5", - "resolved": "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.5.tgz", - "integrity": "sha512-H0dkQoCa3b2VEeKQBOxFph+JAbcrQdE7KC0UkqwpLmv2EC4P41QXP+rqo9wYodACiG5/WM5s9oDApTU8utwj9g==", "license": "MIT", "dependencies": { "define-data-property": "^1.1.4", @@ -28630,8 +23993,6 @@ }, "node_modules/jackspeak": { "version": "3.4.3", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", - "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", "license": "BlueOak-1.0.0", "dependencies": { "@isaacs/cliui": "^8.0.2" @@ -28645,8 +24006,6 @@ }, "node_modules/java-properties": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/java-properties/-/java-properties-1.0.2.tgz", - "integrity": "sha512-qjdpeo2yKlYTH7nFdK0vbZWuTCesk4o63v5iVOlhMQPfuIZQfW/HI35SjfhA+4qpg36rnFSvUK5b1m+ckIblQQ==", "dev": true, "license": "MIT", "engines": { @@ -28655,8 +24014,6 @@ }, "node_modules/jest": { "version": "30.2.0", - "resolved": "https://registry.npmjs.org/jest/-/jest-30.2.0.tgz", - "integrity": "sha512-F26gjC0yWN8uAA5m5Ss8ZQf5nDHWGlN/xWZIh8S5SRbsEKBovwZhxGd6LJlbZYxBgCYOtreSUyb8hpXyGC5O4A==", "license": "MIT", "dependencies": { "@jest/core": "30.2.0", @@ -28681,8 +24038,6 @@ }, "node_modules/jest-changed-files": { "version": "30.2.0", - "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-30.2.0.tgz", - "integrity": "sha512-L8lR1ChrRnSdfeOvTrwZMlnWV8G/LLjQ0nG9MBclwWZidA2N5FviRki0Bvh20WRMOX31/JYvzdqTJrk5oBdydQ==", "license": "MIT", "dependencies": { "execa": "^5.1.1", @@ -28695,8 +24050,6 @@ }, "node_modules/jest-changed-files/node_modules/p-limit": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", "license": "MIT", "dependencies": { "yocto-queue": "^0.1.0" @@ -28710,8 +24063,6 @@ }, "node_modules/jest-circus": { "version": "30.2.0", - "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-30.2.0.tgz", - "integrity": "sha512-Fh0096NC3ZkFx05EP2OXCxJAREVxj1BcW/i6EWqqymcgYKWjyyDpral3fMxVcHXg6oZM7iULer9wGRFvfpl+Tg==", "license": "MIT", "dependencies": { "@jest/environment": "30.2.0", @@ -28741,8 +24092,6 @@ }, "node_modules/jest-circus/node_modules/ansi-styles": { "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "license": "MIT", "dependencies": { "color-convert": "^2.0.1" @@ -28756,8 +24105,6 @@ }, "node_modules/jest-circus/node_modules/chalk": { "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", @@ -28772,8 +24119,6 @@ }, "node_modules/jest-circus/node_modules/dedent": { "version": "1.7.2", - "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.7.2.tgz", - "integrity": "sha512-WzMx3mW98SN+zn3hgemf4OzdmyNhhhKz5Ay0pUfQiMQ3e1g+xmTJWp/pKdwKVXhdSkAEGIIzqeuWrL3mV/AXbA==", "license": "MIT", "peerDependencies": { "babel-plugin-macros": "^3.1.0" @@ -28786,8 +24131,6 @@ }, "node_modules/jest-circus/node_modules/p-limit": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", "license": "MIT", "dependencies": { "yocto-queue": "^0.1.0" @@ -28801,8 +24144,6 @@ }, "node_modules/jest-circus/node_modules/pretty-format": { "version": "30.2.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-30.2.0.tgz", - "integrity": "sha512-9uBdv/B4EefsuAL+pWqueZyZS2Ba+LxfFeQ9DN14HU4bN8bhaxKdkpjpB6fs9+pSjIBu+FXQHImEg8j/Lw0+vA==", "license": "MIT", "dependencies": { "@jest/schemas": "30.0.5", @@ -28815,8 +24156,6 @@ }, "node_modules/jest-circus/node_modules/pretty-format/node_modules/ansi-styles": { "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", "license": "MIT", "engines": { "node": ">=10" @@ -28827,8 +24166,6 @@ }, "node_modules/jest-cli": { "version": "30.2.0", - "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-30.2.0.tgz", - "integrity": "sha512-Os9ukIvADX/A9sLt6Zse3+nmHtHaE6hqOsjQtNiugFTbKRHYIYtZXNGNK9NChseXy7djFPjndX1tL0sCTlfpAA==", "license": "MIT", "dependencies": { "@jest/core": "30.2.0", @@ -28859,8 +24196,6 @@ }, "node_modules/jest-cli/node_modules/ansi-styles": { "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "license": "MIT", "dependencies": { "color-convert": "^2.0.1" @@ -28874,8 +24209,6 @@ }, "node_modules/jest-cli/node_modules/chalk": { "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", @@ -28890,8 +24223,6 @@ }, "node_modules/jest-config": { "version": "30.2.0", - "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-30.2.0.tgz", - "integrity": "sha512-g4WkyzFQVWHtu6uqGmQR4CQxz/CH3yDSlhzXMWzNjDx843gYjReZnMRanjRCq5XZFuQrGDxgUaiYWE8BRfVckA==", "license": "MIT", "dependencies": { "@babel/core": "^7.27.4", @@ -28941,8 +24272,6 @@ }, "node_modules/jest-config/node_modules/ansi-styles": { "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "license": "MIT", "dependencies": { "color-convert": "^2.0.1" @@ -28956,14 +24285,10 @@ }, "node_modules/jest-config/node_modules/balanced-match": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", "license": "MIT" }, "node_modules/jest-config/node_modules/brace-expansion": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", - "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", "license": "MIT", "dependencies": { "balanced-match": "^1.0.0" @@ -28971,8 +24296,6 @@ }, "node_modules/jest-config/node_modules/chalk": { "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", @@ -28987,8 +24310,6 @@ }, "node_modules/jest-config/node_modules/ci-info": { "version": "4.4.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-4.4.0.tgz", - "integrity": "sha512-77PSwercCZU2Fc4sX94eF8k8Pxte6JAwL4/ICZLFjJLqegs7kCuAsqqj/70NQF6TvDpgFjkubQB2FW2ZZddvQg==", "funding": [ { "type": "github", @@ -29002,9 +24323,6 @@ }, "node_modules/jest-config/node_modules/glob": { "version": "10.5.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.5.0.tgz", - "integrity": "sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==", - "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", "license": "ISC", "dependencies": { "foreground-child": "^3.1.0", @@ -29023,14 +24341,10 @@ }, "node_modules/jest-config/node_modules/lru-cache": { "version": "10.4.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", - "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", "license": "ISC" }, "node_modules/jest-config/node_modules/minimatch": { "version": "9.0.9", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.9.tgz", - "integrity": "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==", "license": "ISC", "dependencies": { "brace-expansion": "^2.0.2" @@ -29044,8 +24358,6 @@ }, "node_modules/jest-config/node_modules/path-scurry": { "version": "1.11.1", - "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", - "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", "license": "BlueOak-1.0.0", "dependencies": { "lru-cache": "^10.2.0", @@ -29060,8 +24372,6 @@ }, "node_modules/jest-config/node_modules/pretty-format": { "version": "30.2.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-30.2.0.tgz", - "integrity": "sha512-9uBdv/B4EefsuAL+pWqueZyZS2Ba+LxfFeQ9DN14HU4bN8bhaxKdkpjpB6fs9+pSjIBu+FXQHImEg8j/Lw0+vA==", "license": "MIT", "dependencies": { "@jest/schemas": "30.0.5", @@ -29074,8 +24384,6 @@ }, "node_modules/jest-config/node_modules/pretty-format/node_modules/ansi-styles": { "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", "license": "MIT", "engines": { "node": ">=10" @@ -29086,8 +24394,6 @@ }, "node_modules/jest-diff": { "version": "30.2.0", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-30.2.0.tgz", - "integrity": "sha512-dQHFo3Pt4/NLlG5z4PxZ/3yZTZ1C7s9hveiOj+GCN+uT109NC2QgsoVZsVOAvbJ3RgKkvyLGXZV9+piDpWbm6A==", "license": "MIT", "dependencies": { "@jest/diff-sequences": "30.0.1", @@ -29101,8 +24407,6 @@ }, "node_modules/jest-diff/node_modules/ansi-styles": { "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "license": "MIT", "dependencies": { "color-convert": "^2.0.1" @@ -29116,8 +24420,6 @@ }, "node_modules/jest-diff/node_modules/chalk": { "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", @@ -29132,8 +24434,6 @@ }, "node_modules/jest-diff/node_modules/pretty-format": { "version": "30.2.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-30.2.0.tgz", - "integrity": "sha512-9uBdv/B4EefsuAL+pWqueZyZS2Ba+LxfFeQ9DN14HU4bN8bhaxKdkpjpB6fs9+pSjIBu+FXQHImEg8j/Lw0+vA==", "license": "MIT", "dependencies": { "@jest/schemas": "30.0.5", @@ -29146,8 +24446,6 @@ }, "node_modules/jest-diff/node_modules/pretty-format/node_modules/ansi-styles": { "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", "license": "MIT", "engines": { "node": ">=10" @@ -29158,8 +24456,6 @@ }, "node_modules/jest-docblock": { "version": "30.2.0", - "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-30.2.0.tgz", - "integrity": "sha512-tR/FFgZKS1CXluOQzZvNH3+0z9jXr3ldGSD8bhyuxvlVUwbeLOGynkunvlTMxchC5urrKndYiwCFC0DLVjpOCA==", "license": "MIT", "dependencies": { "detect-newline": "^3.1.0" @@ -29170,8 +24466,6 @@ }, "node_modules/jest-each": { "version": "30.2.0", - "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-30.2.0.tgz", - "integrity": "sha512-lpWlJlM7bCUf1mfmuqTA8+j2lNURW9eNafOy99knBM01i5CQeY5UH1vZjgT9071nDJac1M4XsbyI44oNOdhlDQ==", "license": "MIT", "dependencies": { "@jest/get-type": "30.1.0", @@ -29186,8 +24480,6 @@ }, "node_modules/jest-each/node_modules/ansi-styles": { "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "license": "MIT", "dependencies": { "color-convert": "^2.0.1" @@ -29201,8 +24493,6 @@ }, "node_modules/jest-each/node_modules/chalk": { "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", @@ -29217,8 +24507,6 @@ }, "node_modules/jest-each/node_modules/pretty-format": { "version": "30.2.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-30.2.0.tgz", - "integrity": "sha512-9uBdv/B4EefsuAL+pWqueZyZS2Ba+LxfFeQ9DN14HU4bN8bhaxKdkpjpB6fs9+pSjIBu+FXQHImEg8j/Lw0+vA==", "license": "MIT", "dependencies": { "@jest/schemas": "30.0.5", @@ -29231,8 +24519,6 @@ }, "node_modules/jest-each/node_modules/pretty-format/node_modules/ansi-styles": { "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", "license": "MIT", "engines": { "node": ">=10" @@ -29243,8 +24529,6 @@ }, "node_modules/jest-environment-jsdom": { "version": "30.2.0", - "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-30.2.0.tgz", - "integrity": "sha512-zbBTiqr2Vl78pKp/laGBREYzbZx9ZtqPjOK4++lL4BNDhxRnahg51HtoDrk9/VjIy9IthNEWdKVd7H5bqBhiWQ==", "license": "MIT", "dependencies": { "@jest/environment": "30.2.0", @@ -29267,8 +24551,6 @@ }, "node_modules/jest-environment-node": { "version": "30.2.0", - "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-30.2.0.tgz", - "integrity": "sha512-ElU8v92QJ9UrYsKrxDIKCxu6PfNj4Hdcktcn0JX12zqNdqWHB0N+hwOnnBBXvjLd2vApZtuLUGs1QSY+MsXoNA==", "license": "MIT", "dependencies": { "@jest/environment": "30.2.0", @@ -29285,8 +24567,6 @@ }, "node_modules/jest-get-type": { "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz", - "integrity": "sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==", "dev": true, "license": "MIT", "engines": { @@ -29295,8 +24575,6 @@ }, "node_modules/jest-haste-map": { "version": "30.2.0", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-30.2.0.tgz", - "integrity": "sha512-sQA/jCb9kNt+neM0anSj6eZhLZUIhQgwDt7cPGjumgLM4rXsfb9kpnlacmvZz3Q5tb80nS+oG/if+NBKrHC+Xw==", "license": "MIT", "dependencies": { "@jest/types": "30.2.0", @@ -29319,8 +24597,6 @@ }, "node_modules/jest-haste-map/node_modules/jest-worker": { "version": "30.2.0", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-30.2.0.tgz", - "integrity": "sha512-0Q4Uk8WF7BUwqXHuAjc23vmopWJw5WH7w2tqBoUOZpOjW/ZnR44GXXd1r82RvnmI2GZge3ivrYXk/BE2+VtW2g==", "license": "MIT", "dependencies": { "@types/node": "*", @@ -29335,8 +24611,6 @@ }, "node_modules/jest-haste-map/node_modules/supports-color": { "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", "license": "MIT", "dependencies": { "has-flag": "^4.0.0" @@ -29350,8 +24624,6 @@ }, "node_modules/jest-leak-detector": { "version": "30.2.0", - "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-30.2.0.tgz", - "integrity": "sha512-M6jKAjyzjHG0SrQgwhgZGy9hFazcudwCNovY/9HPIicmNSBuockPSedAP9vlPK6ONFJ1zfyH/M2/YYJxOz5cdQ==", "license": "MIT", "dependencies": { "@jest/get-type": "30.1.0", @@ -29363,8 +24635,6 @@ }, "node_modules/jest-leak-detector/node_modules/ansi-styles": { "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", "license": "MIT", "engines": { "node": ">=10" @@ -29375,8 +24645,6 @@ }, "node_modules/jest-leak-detector/node_modules/pretty-format": { "version": "30.2.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-30.2.0.tgz", - "integrity": "sha512-9uBdv/B4EefsuAL+pWqueZyZS2Ba+LxfFeQ9DN14HU4bN8bhaxKdkpjpB6fs9+pSjIBu+FXQHImEg8j/Lw0+vA==", "license": "MIT", "dependencies": { "@jest/schemas": "30.0.5", @@ -29389,8 +24657,6 @@ }, "node_modules/jest-matcher-utils": { "version": "30.2.0", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-30.2.0.tgz", - "integrity": "sha512-dQ94Nq4dbzmUWkQ0ANAWS9tBRfqCrn0bV9AMYdOi/MHW726xn7eQmMeRTpX2ViC00bpNaWXq+7o4lIQ3AX13Hg==", "license": "MIT", "dependencies": { "@jest/get-type": "30.1.0", @@ -29404,8 +24670,6 @@ }, "node_modules/jest-matcher-utils/node_modules/ansi-styles": { "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "license": "MIT", "dependencies": { "color-convert": "^2.0.1" @@ -29419,8 +24683,6 @@ }, "node_modules/jest-matcher-utils/node_modules/chalk": { "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", @@ -29435,8 +24697,6 @@ }, "node_modules/jest-matcher-utils/node_modules/pretty-format": { "version": "30.2.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-30.2.0.tgz", - "integrity": "sha512-9uBdv/B4EefsuAL+pWqueZyZS2Ba+LxfFeQ9DN14HU4bN8bhaxKdkpjpB6fs9+pSjIBu+FXQHImEg8j/Lw0+vA==", "license": "MIT", "dependencies": { "@jest/schemas": "30.0.5", @@ -29449,8 +24709,6 @@ }, "node_modules/jest-matcher-utils/node_modules/pretty-format/node_modules/ansi-styles": { "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", "license": "MIT", "engines": { "node": ">=10" @@ -29461,8 +24719,6 @@ }, "node_modules/jest-message-util": { "version": "30.2.0", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-30.2.0.tgz", - "integrity": "sha512-y4DKFLZ2y6DxTWD4cDe07RglV88ZiNEdlRfGtqahfbIjfsw1nMCPx49Uev4IA/hWn3sDKyAnSPwoYSsAEdcimw==", "license": "MIT", "dependencies": { "@babel/code-frame": "^7.27.1", @@ -29481,8 +24737,6 @@ }, "node_modules/jest-message-util/node_modules/ansi-styles": { "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "license": "MIT", "dependencies": { "color-convert": "^2.0.1" @@ -29496,8 +24750,6 @@ }, "node_modules/jest-message-util/node_modules/chalk": { "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", @@ -29512,8 +24764,6 @@ }, "node_modules/jest-message-util/node_modules/pretty-format": { "version": "30.2.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-30.2.0.tgz", - "integrity": "sha512-9uBdv/B4EefsuAL+pWqueZyZS2Ba+LxfFeQ9DN14HU4bN8bhaxKdkpjpB6fs9+pSjIBu+FXQHImEg8j/Lw0+vA==", "license": "MIT", "dependencies": { "@jest/schemas": "30.0.5", @@ -29526,8 +24776,6 @@ }, "node_modules/jest-message-util/node_modules/pretty-format/node_modules/ansi-styles": { "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", "license": "MIT", "engines": { "node": ">=10" @@ -29538,8 +24786,6 @@ }, "node_modules/jest-mock": { "version": "30.2.0", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-30.2.0.tgz", - "integrity": "sha512-JNNNl2rj4b5ICpmAcq+WbLH83XswjPbjH4T7yvGzfAGCPh1rw+xVNbtk+FnRslvt9lkCcdn9i1oAoKUuFsOxRw==", "license": "MIT", "dependencies": { "@jest/types": "30.2.0", @@ -29552,8 +24798,6 @@ }, "node_modules/jest-pnp-resolver": { "version": "1.2.3", - "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz", - "integrity": "sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==", "license": "MIT", "engines": { "node": ">=6" @@ -29569,8 +24813,6 @@ }, "node_modules/jest-regex-util": { "version": "30.0.1", - "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-30.0.1.tgz", - "integrity": "sha512-jHEQgBXAgc+Gh4g0p3bCevgRCVRkB4VB70zhoAE48gxeSr1hfUOsM/C2WoJgVL7Eyg//hudYENbm3Ne+/dRVVA==", "license": "MIT", "engines": { "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" @@ -29578,8 +24820,6 @@ }, "node_modules/jest-resolve": { "version": "30.2.0", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-30.2.0.tgz", - "integrity": "sha512-TCrHSxPlx3tBY3hWNtRQKbtgLhsXa1WmbJEqBlTBrGafd5fiQFByy2GNCEoGR+Tns8d15GaL9cxEzKOO3GEb2A==", "license": "MIT", "dependencies": { "chalk": "^4.1.2", @@ -29597,8 +24837,6 @@ }, "node_modules/jest-resolve-dependencies": { "version": "30.2.0", - "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-30.2.0.tgz", - "integrity": "sha512-xTOIGug/0RmIe3mmCqCT95yO0vj6JURrn1TKWlNbhiAefJRWINNPgwVkrVgt/YaerPzY3iItufd80v3lOrFJ2w==", "license": "MIT", "dependencies": { "jest-regex-util": "30.0.1", @@ -29610,8 +24848,6 @@ }, "node_modules/jest-resolve/node_modules/ansi-styles": { "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "license": "MIT", "dependencies": { "color-convert": "^2.0.1" @@ -29625,8 +24861,6 @@ }, "node_modules/jest-resolve/node_modules/chalk": { "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", @@ -29641,8 +24875,6 @@ }, "node_modules/jest-runner": { "version": "30.2.0", - "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-30.2.0.tgz", - "integrity": "sha512-PqvZ2B2XEyPEbclp+gV6KO/F1FIFSbIwewRgmROCMBo/aZ6J1w8Qypoj2pEOcg3G2HzLlaP6VUtvwCI8dM3oqQ==", "license": "MIT", "dependencies": { "@jest/console": "30.2.0", @@ -29674,8 +24906,6 @@ }, "node_modules/jest-runner/node_modules/ansi-styles": { "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "license": "MIT", "dependencies": { "color-convert": "^2.0.1" @@ -29689,8 +24919,6 @@ }, "node_modules/jest-runner/node_modules/chalk": { "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", @@ -29705,8 +24933,6 @@ }, "node_modules/jest-runner/node_modules/jest-worker": { "version": "30.2.0", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-30.2.0.tgz", - "integrity": "sha512-0Q4Uk8WF7BUwqXHuAjc23vmopWJw5WH7w2tqBoUOZpOjW/ZnR44GXXd1r82RvnmI2GZge3ivrYXk/BE2+VtW2g==", "license": "MIT", "dependencies": { "@types/node": "*", @@ -29721,8 +24947,6 @@ }, "node_modules/jest-runner/node_modules/jest-worker/node_modules/supports-color": { "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", "license": "MIT", "dependencies": { "has-flag": "^4.0.0" @@ -29736,8 +24960,6 @@ }, "node_modules/jest-runner/node_modules/p-limit": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", "license": "MIT", "dependencies": { "yocto-queue": "^0.1.0" @@ -29751,8 +24973,6 @@ }, "node_modules/jest-runtime": { "version": "30.2.0", - "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-30.2.0.tgz", - "integrity": "sha512-p1+GVX/PJqTucvsmERPMgCPvQJpFt4hFbM+VN3n8TMo47decMUcJbt+rgzwrEme0MQUA/R+1de2axftTHkKckg==", "license": "MIT", "dependencies": { "@jest/environment": "30.2.0", @@ -29784,8 +25004,6 @@ }, "node_modules/jest-runtime/node_modules/ansi-styles": { "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "license": "MIT", "dependencies": { "color-convert": "^2.0.1" @@ -29799,14 +25017,10 @@ }, "node_modules/jest-runtime/node_modules/balanced-match": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", "license": "MIT" }, "node_modules/jest-runtime/node_modules/brace-expansion": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", - "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", "license": "MIT", "dependencies": { "balanced-match": "^1.0.0" @@ -29814,8 +25028,6 @@ }, "node_modules/jest-runtime/node_modules/chalk": { "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", @@ -29830,9 +25042,6 @@ }, "node_modules/jest-runtime/node_modules/glob": { "version": "10.5.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.5.0.tgz", - "integrity": "sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==", - "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", "license": "ISC", "dependencies": { "foreground-child": "^3.1.0", @@ -29851,14 +25060,10 @@ }, "node_modules/jest-runtime/node_modules/lru-cache": { "version": "10.4.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", - "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", "license": "ISC" }, "node_modules/jest-runtime/node_modules/minimatch": { "version": "9.0.9", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.9.tgz", - "integrity": "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==", "license": "ISC", "dependencies": { "brace-expansion": "^2.0.2" @@ -29872,8 +25077,6 @@ }, "node_modules/jest-runtime/node_modules/path-scurry": { "version": "1.11.1", - "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", - "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", "license": "BlueOak-1.0.0", "dependencies": { "lru-cache": "^10.2.0", @@ -29888,8 +25091,6 @@ }, "node_modules/jest-runtime/node_modules/strip-bom": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", - "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", "license": "MIT", "engines": { "node": ">=8" @@ -29897,8 +25098,6 @@ }, "node_modules/jest-snapshot": { "version": "30.2.0", - "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-30.2.0.tgz", - "integrity": "sha512-5WEtTy2jXPFypadKNpbNkZ72puZCa6UjSr/7djeecHWOu7iYhSXSnHScT8wBz3Rn8Ena5d5RYRcsyKIeqG1IyA==", "license": "MIT", "dependencies": { "@babel/core": "^7.27.4", @@ -29929,8 +25128,6 @@ }, "node_modules/jest-snapshot/node_modules/ansi-styles": { "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "license": "MIT", "dependencies": { "color-convert": "^2.0.1" @@ -29944,8 +25141,6 @@ }, "node_modules/jest-snapshot/node_modules/chalk": { "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", @@ -29960,8 +25155,6 @@ }, "node_modules/jest-snapshot/node_modules/pretty-format": { "version": "30.2.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-30.2.0.tgz", - "integrity": "sha512-9uBdv/B4EefsuAL+pWqueZyZS2Ba+LxfFeQ9DN14HU4bN8bhaxKdkpjpB6fs9+pSjIBu+FXQHImEg8j/Lw0+vA==", "license": "MIT", "dependencies": { "@jest/schemas": "30.0.5", @@ -29974,8 +25167,6 @@ }, "node_modules/jest-snapshot/node_modules/pretty-format/node_modules/ansi-styles": { "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", "license": "MIT", "engines": { "node": ">=10" @@ -29986,8 +25177,6 @@ }, "node_modules/jest-util": { "version": "30.2.0", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-30.2.0.tgz", - "integrity": "sha512-QKNsM0o3Xe6ISQU869e+DhG+4CK/48aHYdJZGlFQVTjnbvgpcKyxpzk29fGiO7i/J8VENZ+d2iGnSsvmuHywlA==", "license": "MIT", "dependencies": { "@jest/types": "30.2.0", @@ -30003,8 +25192,6 @@ }, "node_modules/jest-util/node_modules/ansi-styles": { "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "license": "MIT", "dependencies": { "color-convert": "^2.0.1" @@ -30018,8 +25205,6 @@ }, "node_modules/jest-util/node_modules/chalk": { "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", @@ -30034,8 +25219,6 @@ }, "node_modules/jest-util/node_modules/ci-info": { "version": "4.4.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-4.4.0.tgz", - "integrity": "sha512-77PSwercCZU2Fc4sX94eF8k8Pxte6JAwL4/ICZLFjJLqegs7kCuAsqqj/70NQF6TvDpgFjkubQB2FW2ZZddvQg==", "funding": [ { "type": "github", @@ -30049,8 +25232,6 @@ }, "node_modules/jest-util/node_modules/picomatch": { "version": "4.0.3", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", - "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", "license": "MIT", "engines": { "node": ">=12" @@ -30061,8 +25242,6 @@ }, "node_modules/jest-validate": { "version": "30.2.0", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-30.2.0.tgz", - "integrity": "sha512-FBGWi7dP2hpdi8nBoWxSsLvBFewKAg0+uSQwBaof4Y4DPgBabXgpSYC5/lR7VmnIlSpASmCi/ntRWPbv7089Pw==", "license": "MIT", "dependencies": { "@jest/get-type": "30.1.0", @@ -30078,8 +25257,6 @@ }, "node_modules/jest-validate/node_modules/ansi-styles": { "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "license": "MIT", "dependencies": { "color-convert": "^2.0.1" @@ -30093,8 +25270,6 @@ }, "node_modules/jest-validate/node_modules/chalk": { "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", @@ -30109,8 +25284,6 @@ }, "node_modules/jest-validate/node_modules/pretty-format": { "version": "30.2.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-30.2.0.tgz", - "integrity": "sha512-9uBdv/B4EefsuAL+pWqueZyZS2Ba+LxfFeQ9DN14HU4bN8bhaxKdkpjpB6fs9+pSjIBu+FXQHImEg8j/Lw0+vA==", "license": "MIT", "dependencies": { "@jest/schemas": "30.0.5", @@ -30123,8 +25296,6 @@ }, "node_modules/jest-validate/node_modules/pretty-format/node_modules/ansi-styles": { "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", "license": "MIT", "engines": { "node": ">=10" @@ -30135,8 +25306,6 @@ }, "node_modules/jest-watcher": { "version": "30.2.0", - "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-30.2.0.tgz", - "integrity": "sha512-PYxa28dxJ9g777pGm/7PrbnMeA0Jr7osHP9bS7eJy9DuAjMgdGtxgf0uKMyoIsTWAkIbUW5hSDdJ3urmgXBqxg==", "license": "MIT", "dependencies": { "@jest/test-result": "30.2.0", @@ -30154,8 +25323,6 @@ }, "node_modules/jest-watcher/node_modules/ansi-escapes": { "version": "4.3.2", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", - "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", "license": "MIT", "dependencies": { "type-fest": "^0.21.3" @@ -30169,8 +25336,6 @@ }, "node_modules/jest-watcher/node_modules/ansi-styles": { "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "license": "MIT", "dependencies": { "color-convert": "^2.0.1" @@ -30184,8 +25349,6 @@ }, "node_modules/jest-watcher/node_modules/chalk": { "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", @@ -30200,8 +25363,6 @@ }, "node_modules/jest-worker": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz", - "integrity": "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==", "license": "MIT", "dependencies": { "@types/node": "*", @@ -30215,8 +25376,6 @@ }, "node_modules/jest-worker/node_modules/@jest/schemas": { "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", - "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", "license": "MIT", "dependencies": { "@sinclair/typebox": "^0.27.8" @@ -30227,8 +25386,6 @@ }, "node_modules/jest-worker/node_modules/@jest/types": { "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", - "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", "license": "MIT", "dependencies": { "@jest/schemas": "^29.6.3", @@ -30244,14 +25401,10 @@ }, "node_modules/jest-worker/node_modules/@sinclair/typebox": { "version": "0.27.10", - "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.10.tgz", - "integrity": "sha512-MTBk/3jGLNB2tVxv6uLlFh1iu64iYOQ2PbdOSK3NW8JZsmlaOh2q6sdtKowBhfw8QFLmYNzTW4/oK4uATIi6ZA==", "license": "MIT" }, "node_modules/jest-worker/node_modules/ansi-styles": { "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "license": "MIT", "dependencies": { "color-convert": "^2.0.1" @@ -30265,8 +25418,6 @@ }, "node_modules/jest-worker/node_modules/chalk": { "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", @@ -30281,8 +25432,6 @@ }, "node_modules/jest-worker/node_modules/chalk/node_modules/supports-color": { "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "license": "MIT", "dependencies": { "has-flag": "^4.0.0" @@ -30293,8 +25442,6 @@ }, "node_modules/jest-worker/node_modules/jest-util": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", - "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", "license": "MIT", "dependencies": { "@jest/types": "^29.6.3", @@ -30310,8 +25457,6 @@ }, "node_modules/jest-worker/node_modules/supports-color": { "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", "license": "MIT", "dependencies": { "has-flag": "^4.0.0" @@ -30325,8 +25470,6 @@ }, "node_modules/jiti": { "version": "1.21.7", - "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.7.tgz", - "integrity": "sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A==", "license": "MIT", "bin": { "jiti": "bin/jiti.js" @@ -30334,8 +25477,6 @@ }, "node_modules/joi": { "version": "17.13.3", - "resolved": "https://registry.npmjs.org/joi/-/joi-17.13.3.tgz", - "integrity": "sha512-otDA4ldcIx+ZXsKHWmp0YizCweVRZG96J10b0FevjfuncLO1oX59THoAmHkNubYJ+9gWsYsp5k8v4ib6oDv1fA==", "license": "BSD-3-Clause", "dependencies": { "@hapi/hoek": "^9.3.0", @@ -30347,14 +25488,10 @@ }, "node_modules/join-component": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/join-component/-/join-component-1.1.0.tgz", - "integrity": "sha512-bF7vcQxbODoGK1imE2P9GS9aw4zD0Sd+Hni68IMZLj7zRnquH7dXUmMw9hDI5S/Jzt7q+IyTXN0rSg2GI0IKhQ==", "license": "MIT" }, "node_modules/jose": { "version": "6.1.3", - "resolved": "https://registry.npmjs.org/jose/-/jose-6.1.3.tgz", - "integrity": "sha512-0TpaTfihd4QMNwrz/ob2Bp7X04yuxJkjRGi4aKmOqwhov54i6u79oCv7T+C7lo70MKH6BesI3vscD1yb/yzKXQ==", "license": "MIT", "funding": { "url": "https://github.com/sponsors/panva" @@ -30362,8 +25499,6 @@ }, "node_modules/joycon": { "version": "3.1.1", - "resolved": "https://registry.npmjs.org/joycon/-/joycon-3.1.1.tgz", - "integrity": "sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==", "license": "MIT", "engines": { "node": ">=10" @@ -30371,14 +25506,10 @@ }, "node_modules/js-base64": { "version": "3.7.8", - "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-3.7.8.tgz", - "integrity": "sha512-hNngCeKxIUQiEUN3GPJOkz4wF/YvdUdbNL9hsBcMQTkKzboD7T/q3OYOuuPZLUE6dBxSGpwhk5mwuDud7JVAow==", "license": "BSD-3-Clause" }, "node_modules/js-cookie": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/js-cookie/-/js-cookie-3.0.1.tgz", - "integrity": "sha512-+0rgsUXZu4ncpPxRL+lNEptWMOWl9etvPHc/koSRp6MPwpRYAhmk0dUG00J4bxVV3r9uUzfo24wW0knS07SKSw==", "license": "MIT", "engines": { "node": ">=12" @@ -30386,8 +25517,6 @@ }, "node_modules/js-levenshtein": { "version": "1.1.6", - "resolved": "https://registry.npmjs.org/js-levenshtein/-/js-levenshtein-1.1.6.tgz", - "integrity": "sha512-X2BB11YZtrRqY4EnQcLX5Rh373zbK4alC1FW7D7MBhL2gtcC17cTnr6DmfHZeS0s2rTHjUTMMHfG7gO8SSdw+g==", "dev": true, "license": "MIT", "engines": { @@ -30396,14 +25525,10 @@ }, "node_modules/js-tokens": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", "license": "MIT" }, "node_modules/js-yaml": { "version": "4.1.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz", - "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==", "license": "MIT", "dependencies": { "argparse": "^2.0.1" @@ -30414,8 +25539,6 @@ }, "node_modules/jsdom": { "version": "26.1.0", - "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-26.1.0.tgz", - "integrity": "sha512-Cvc9WUhxSMEo4McES3P7oK3QaXldCfNWp7pl2NNeiIFlCoLr3kfq9kb1fxftiwk1FLV7CvpvDfonxtzUDeSOPg==", "license": "MIT", "dependencies": { "cssstyle": "^4.2.1", @@ -30453,8 +25576,6 @@ }, "node_modules/jsdom/node_modules/agent-base": { "version": "7.1.4", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.4.tgz", - "integrity": "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==", "license": "MIT", "engines": { "node": ">= 14" @@ -30462,8 +25583,6 @@ }, "node_modules/jsdom/node_modules/https-proxy-agent": { "version": "7.0.6", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", - "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", "license": "MIT", "dependencies": { "agent-base": "^7.1.2", @@ -30475,8 +25594,6 @@ }, "node_modules/jsesc": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", - "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", "license": "MIT", "bin": { "jsesc": "bin/jsesc" @@ -30487,8 +25604,6 @@ }, "node_modules/json-bigint": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-bigint/-/json-bigint-1.0.0.tgz", - "integrity": "sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ==", "license": "MIT", "dependencies": { "bignumber.js": "^9.0.0" @@ -30496,35 +25611,25 @@ }, "node_modules/json-bignum": { "version": "0.0.3", - "resolved": "https://registry.npmjs.org/json-bignum/-/json-bignum-0.0.3.tgz", - "integrity": "sha512-2WHyXj3OfHSgNyuzDbSxI1w2jgw5gkWSWhS7Qg4bWXx1nLk3jnbwfUeS0PSba3IzpTUWdHxBieELUzXRjQB2zg==", "engines": { "node": ">=0.8" } }, "node_modules/json-buffer": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", - "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", "license": "MIT" }, "node_modules/json-logic-js": { "version": "2.0.5", - "resolved": "https://registry.npmjs.org/json-logic-js/-/json-logic-js-2.0.5.tgz", - "integrity": "sha512-rTT2+lqcuUmj4DgWfmzupZqQDA64AdmYqizzMPWj3DxGdfFNsxPpcNVSaTj4l8W2tG/+hg7/mQhxjU3aPacO6g==", "license": "MIT" }, "node_modules/json-parse-better-errors": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", - "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", "dev": true, "license": "MIT" }, "node_modules/json-parse-even-better-errors": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-5.0.0.tgz", - "integrity": "sha512-ZF1nxZ28VhQouRWhUcVlUIN3qwSgPuswK05s/HIaoetAoE/9tngVmCHjSxmSQPav1nd+lPtTL0YZ/2AFdR/iYQ==", "license": "MIT", "engines": { "node": "^20.17.0 || >=22.9.0" @@ -30532,32 +25637,22 @@ }, "node_modules/json-schema": { "version": "0.4.0", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", - "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==", "license": "(AFL-2.1 OR BSD-3-Clause)" }, "node_modules/json-schema-traverse": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", "license": "MIT" }, "node_modules/json-schema-typed": { "version": "8.0.2", - "resolved": "https://registry.npmjs.org/json-schema-typed/-/json-schema-typed-8.0.2.tgz", - "integrity": "sha512-fQhoXdcvc3V28x7C7BMs4P5+kNlgUURe2jmUT1T//oBRMDrqy1QPelJimwZGo7Hg9VPV3EQV5Bnq4hbFy2vetA==", "license": "BSD-2-Clause" }, "node_modules/json-stable-stringify-without-jsonify": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", "license": "MIT" }, "node_modules/json5": { "version": "2.2.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", "license": "MIT", "bin": { "json5": "lib/cli.js" @@ -30568,14 +25663,10 @@ }, "node_modules/jsonc-parser": { "version": "3.3.1", - "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.3.1.tgz", - "integrity": "sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ==", "license": "MIT" }, "node_modules/jsonfile": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", - "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", "dev": true, "license": "MIT", "optionalDependencies": { @@ -30584,8 +25675,6 @@ }, "node_modules/jsonparse": { "version": "1.3.1", - "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", - "integrity": "sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==", "engines": [ "node >= 0.2.0" ], @@ -30593,8 +25682,6 @@ }, "node_modules/jsonpointer": { "version": "5.0.1", - "resolved": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-5.0.1.tgz", - "integrity": "sha512-p/nXbhSEcu3pZRdkW1OfJhpsVtW1gd4Wa1fnQc9YLiTfAjn0312eMKimbdIQzuZl9aa9xUGaRlP9T/CJE/ditQ==", "license": "MIT", "engines": { "node": ">=0.10.0" @@ -30602,8 +25689,6 @@ }, "node_modules/jsx-ast-utils": { "version": "3.3.5", - "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz", - "integrity": "sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==", "license": "MIT", "dependencies": { "array-includes": "^3.1.6", @@ -30617,8 +25702,6 @@ }, "node_modules/jwa": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/jwa/-/jwa-2.0.1.tgz", - "integrity": "sha512-hRF04fqJIP8Abbkq5NKGN0Bbr3JxlQ+qhZufXVr0DvujKy93ZCbXZMHDL4EOtodSbCWxOqR8MS1tXA5hwqCXDg==", "license": "MIT", "dependencies": { "buffer-equal-constant-time": "^1.0.1", @@ -30628,8 +25711,6 @@ }, "node_modules/jws": { "version": "4.0.1", - "resolved": "https://registry.npmjs.org/jws/-/jws-4.0.1.tgz", - "integrity": "sha512-EKI/M/yqPncGUUh44xz0PxSidXFr/+r0pA70+gIYhjv+et7yxM+s29Y+VGDkovRofQem0fs7Uvf4+YmAdyRduA==", "license": "MIT", "dependencies": { "jwa": "^2.0.1", @@ -30638,8 +25719,6 @@ }, "node_modules/kafkajs": { "version": "2.2.4", - "resolved": "https://registry.npmjs.org/kafkajs/-/kafkajs-2.2.4.tgz", - "integrity": "sha512-j/YeapB1vfPT2iOIUn/vxdyKEuhuY2PxMBvf5JWux6iSaukAccrMtXEY/Lb7OvavDhOWME589bpLrEdnVHjfjA==", "license": "MIT", "engines": { "node": ">=14.0.0" @@ -30647,8 +25726,6 @@ }, "node_modules/katex": { "version": "0.16.33", - "resolved": "https://registry.npmjs.org/katex/-/katex-0.16.33.tgz", - "integrity": "sha512-q3N5u+1sY9Bu7T4nlXoiRBXWfwSefNGoKeOwekV+gw0cAXQlz2Ww6BLcmBxVDeXBMUDQv6fK5bcNaJLxob3ZQA==", "funding": [ "https://opencollective.com/katex", "https://github.com/sponsors/katex" @@ -30663,8 +25740,6 @@ }, "node_modules/katex/node_modules/commander": { "version": "8.3.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", - "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", "license": "MIT", "engines": { "node": ">= 12" @@ -30672,22 +25747,16 @@ }, "node_modules/keyv": { "version": "4.5.4", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", - "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", "license": "MIT", "dependencies": { "json-buffer": "3.0.1" } }, "node_modules/khroma": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/khroma/-/khroma-2.1.0.tgz", - "integrity": "sha512-Ls993zuzfayK269Svk9hzpeGUKob/sIgZzyHYdjQoAdQetRKpOLj+k/QQQ/6Qi0Yz65mlROrfd+Ev+1+7dz9Kw==" + "version": "2.1.0" }, "node_modules/kind-of": { "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", "license": "MIT", "engines": { "node": ">=0.10.0" @@ -30695,8 +25764,6 @@ }, "node_modules/klaviyo-api": { "version": "22.0.0", - "resolved": "https://registry.npmjs.org/klaviyo-api/-/klaviyo-api-22.0.0.tgz", - "integrity": "sha512-aP215KKGGOeYWlIJiwoOAGXy1Mx7SeOP4vpA70uFXNrNFLPLvPwYt6YuU4LkMyDpGaCHoNRKpmziOfovjDb00w==", "license": "MIT", "dependencies": { "axios": "^1.7.7", @@ -30705,8 +25772,6 @@ }, "node_modules/klaw-sync": { "version": "6.0.0", - "resolved": "https://registry.npmjs.org/klaw-sync/-/klaw-sync-6.0.0.tgz", - "integrity": "sha512-nIeuVSzdCCs6TDPTqI8w1Yre34sSq7AkZ4B3sfOBbI2CgVSB4Du4aLQijFU2+lhAFCwt9+42Hel6lQNIv6AntQ==", "license": "MIT", "dependencies": { "graceful-fs": "^4.1.11" @@ -30714,8 +25779,6 @@ }, "node_modules/kleur": { "version": "3.0.3", - "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", - "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", "license": "MIT", "engines": { "node": ">=6" @@ -30723,8 +25786,6 @@ }, "node_modules/langium": { "version": "4.2.1", - "resolved": "https://registry.npmjs.org/langium/-/langium-4.2.1.tgz", - "integrity": "sha512-zu9QWmjpzJcomzdJQAHgDVhLGq5bLosVak1KVa40NzQHXfqr4eAHupvnPOVXEoLkg6Ocefvf/93d//SB7du4YQ==", "license": "MIT", "dependencies": { "chevrotain": "~11.1.1", @@ -30740,8 +25801,6 @@ }, "node_modules/latest-version": { "version": "7.0.0", - "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-7.0.0.tgz", - "integrity": "sha512-KvNT4XqAMzdcL6ka6Tl3i2lYeFDgXNCuIX+xNx6ZMVR1dFq+idXd9FLKNMOIx0t9mJ9/HudyX4oZWXZQ0UJHeg==", "license": "MIT", "dependencies": { "package-json": "^8.1.0" @@ -30755,8 +25814,6 @@ }, "node_modules/launch-editor": { "version": "2.13.1", - "resolved": "https://registry.npmjs.org/launch-editor/-/launch-editor-2.13.1.tgz", - "integrity": "sha512-lPSddlAAluRKJ7/cjRFoXUFzaX7q/YKI7yPHuEvSJVqoXvFnJov1/Ud87Aa4zULIbA9Nja4mSPK8l0z/7eV2wA==", "license": "MIT", "dependencies": { "picocolors": "^1.1.1", @@ -30765,14 +25822,10 @@ }, "node_modules/layout-base": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/layout-base/-/layout-base-1.0.2.tgz", - "integrity": "sha512-8h2oVEZNktL4BH2JCOI90iD1yXwL6iNW7KcCKT2QZgQJR2vbqDsldCTPRU9NifTCqHZci57XvQQ15YTu+sTYPg==", "license": "MIT" }, "node_modules/leven": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", - "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", "license": "MIT", "engines": { "node": ">=6" @@ -30780,8 +25833,6 @@ }, "node_modules/levn": { "version": "0.4.1", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", - "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", "license": "MIT", "dependencies": { "prelude-ls": "^1.2.1", @@ -30793,8 +25844,6 @@ }, "node_modules/libsql": { "version": "0.4.7", - "resolved": "https://registry.npmjs.org/libsql/-/libsql-0.4.7.tgz", - "integrity": "sha512-T9eIRCs6b0J1SHKYIvD8+KCJMcWZ900iZyxdnSCdqxN12Z1ijzT+jY5nrk72Jw4B0HGzms2NgpryArlJqvc3Lw==", "cpu": [ "x64", "arm64", @@ -30823,8 +25872,6 @@ }, "node_modules/libsql/node_modules/detect-libc": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.2.tgz", - "integrity": "sha512-UX6sGumvvqSaXgdKGUsgZWqcUyIXZ/vZTrlRT/iobiKhGL0zL4d3osHj3uqllWJK+i+sixDS/3COVEOFbupFyw==", "dev": true, "license": "Apache-2.0", "engines": { @@ -30833,8 +25880,6 @@ }, "node_modules/lightningcss": { "version": "1.31.1", - "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.31.1.tgz", - "integrity": "sha512-l51N2r93WmGUye3WuFoN5k10zyvrVs0qfKBhyC5ogUQ6Ew6JUSswh78mbSO+IU3nTWsyOArqPCcShdQSadghBQ==", "devOptional": true, "license": "MPL-2.0", "dependencies": { @@ -30968,8 +26013,6 @@ }, "node_modules/lightningcss-linux-arm64-gnu": { "version": "1.31.1", - "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.31.1.tgz", - "integrity": "sha512-WKyLWztD71rTnou4xAD5kQT+982wvca7E6QoLpoawZ1gP9JM0GJj4Tp5jMUh9B3AitHbRZ2/H3W5xQmdEOUlLg==", "cpu": [ "arm64" ], @@ -30989,8 +26032,6 @@ }, "node_modules/lightningcss-linux-arm64-musl": { "version": "1.31.1", - "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.31.1.tgz", - "integrity": "sha512-mVZ7Pg2zIbe3XlNbZJdjs86YViQFoJSpc41CbVmKBPiGmC4YrfeOyz65ms2qpAobVd7WQsbW4PdsSJEMymyIMg==", "cpu": [ "arm64" ], @@ -31094,8 +26135,6 @@ }, "node_modules/lilconfig": { "version": "3.1.3", - "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz", - "integrity": "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==", "license": "MIT", "engines": { "node": ">=14" @@ -31106,14 +26145,10 @@ }, "node_modules/lines-and-columns": { "version": "1.2.4", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", - "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", "license": "MIT" }, "node_modules/lint-staged": { "version": "16.3.1", - "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-16.3.1.tgz", - "integrity": "sha512-bqvvquXzFBAlSbluugR4KXAe4XnO/QZcKVszpkBtqLWa2KEiVy8n6Xp38OeUbv/gOJOX4Vo9u5pFt/ADvbm42Q==", "dev": true, "license": "MIT", "dependencies": { @@ -31136,8 +26171,6 @@ }, "node_modules/listr2": { "version": "9.0.5", - "resolved": "https://registry.npmjs.org/listr2/-/listr2-9.0.5.tgz", - "integrity": "sha512-ME4Fb83LgEgwNw96RKNvKV4VTLuXfoKudAmm2lP8Kk87KaMK0/Xrx/aAkMWmT8mDb+3MlFDspfbCs7adjRxA2g==", "dev": true, "license": "MIT", "dependencies": { @@ -31154,8 +26187,6 @@ }, "node_modules/load-json-file": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", - "integrity": "sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw==", "dev": true, "license": "MIT", "dependencies": { @@ -31170,8 +26201,6 @@ }, "node_modules/load-json-file/node_modules/parse-json": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==", "dev": true, "license": "MIT", "dependencies": { @@ -31184,8 +26213,6 @@ }, "node_modules/load-json-file/node_modules/pify": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==", "dev": true, "license": "MIT", "engines": { @@ -31194,8 +26221,6 @@ }, "node_modules/load-plugin": { "version": "6.0.3", - "resolved": "https://registry.npmjs.org/load-plugin/-/load-plugin-6.0.3.tgz", - "integrity": "sha512-kc0X2FEUZr145odl68frm+lMJuQ23+rTXYmR6TImqPtbpmXC4vVXbWKDQ9IzndA0HfyQamWfKLhzsqGSTxE63w==", "dev": true, "license": "MIT", "dependencies": { @@ -31209,8 +26234,6 @@ }, "node_modules/load-tsconfig": { "version": "0.2.5", - "resolved": "https://registry.npmjs.org/load-tsconfig/-/load-tsconfig-0.2.5.tgz", - "integrity": "sha512-IXO6OCs9yg8tMKzfPZ1YmheJbZCiEsnBdcB03l0OcfK9prKnJb96siuHCr5Fl37/yo9DnKU+TLpxzTUspw9shg==", "license": "MIT", "engines": { "node": "^12.20.0 || ^14.13.1 || >=16.0.0" @@ -31218,8 +26241,6 @@ }, "node_modules/loader-runner": { "version": "4.3.1", - "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.1.tgz", - "integrity": "sha512-IWqP2SCPhyVFTBtRcgMHdzlf9ul25NwaFx4wCEH/KjAXuuHY4yNjvPXsBokp8jCB936PyWRaPKUNh8NvylLp2Q==", "license": "MIT", "engines": { "node": ">=6.11.5" @@ -31231,8 +26252,6 @@ }, "node_modules/loader-utils": { "version": "2.0.4", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz", - "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==", "license": "MIT", "dependencies": { "big.js": "^5.2.2", @@ -31245,8 +26264,6 @@ }, "node_modules/loader-utils/node_modules/big.js": { "version": "5.2.2", - "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", - "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", "license": "MIT", "engines": { "node": "*" @@ -31254,8 +26271,6 @@ }, "node_modules/locate-path": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", "license": "MIT", "dependencies": { "p-locate": "^4.1.0" @@ -31266,102 +26281,69 @@ }, "node_modules/lodash": { "version": "4.17.23", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.23.tgz", - "integrity": "sha512-LgVTMpQtIopCi79SJeDiP0TfWi5CNEc/L/aRdTh3yIvmZXTnheWpKjSZhnvMl8iXbC1tFg9gdHHDMLoV7CnG+w==", "license": "MIT" }, "node_modules/lodash-es": { "version": "4.17.23", - "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.23.tgz", - "integrity": "sha512-kVI48u3PZr38HdYz98UmfPnXl2DXrpdctLrFLCd3kOx1xUkOmpFPx7gCWWM5MPkL/fD8zb+Ph0QzjGFs4+hHWg==", "license": "MIT" }, "node_modules/lodash.camelcase": { "version": "4.3.0", - "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", - "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==", "license": "MIT" }, "node_modules/lodash.chunk": { "version": "4.2.0", - "resolved": "https://registry.npmjs.org/lodash.chunk/-/lodash.chunk-4.2.0.tgz", - "integrity": "sha512-ZzydJKfUHJwHa+hF5X66zLFCBrWn5GeF28OHEr4WVWtNDXlQ/IjWKPBiikqKo2ne0+v6JgCgJ0GzJp8k8bHC7w==", "dev": true, "license": "MIT" }, "node_modules/lodash.clonedeep": { "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", - "integrity": "sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ==", "license": "MIT" }, "node_modules/lodash.debounce": { "version": "4.0.8", - "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", - "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==", "license": "MIT" }, "node_modules/lodash.defaults": { "version": "4.2.0", - "resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-4.2.0.tgz", - "integrity": "sha512-qjxPLHd3r5DnsdGacqOMU6pb/avJzdh9tFX2ymgoZE27BmjXrNy/y4LoaiTeAb+O3gL8AfpJGtqfX/ae2leYYQ==", "license": "MIT" }, "node_modules/lodash.get": { "version": "4.4.2", - "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", - "integrity": "sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==", - "deprecated": "This package is deprecated. Use the optional chaining (?.) operator instead.", "dev": true, "license": "MIT" }, "node_modules/lodash.isarguments": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz", - "integrity": "sha512-chi4NHZlZqZD18a0imDHnZPrDeBbTtVN7GXMwuGdRH9qotxAjYs3aVLKc7zNOG9eddR5Ksd8rvFEBc9SsggPpg==", "license": "MIT" }, "node_modules/lodash.isstring": { "version": "4.0.1", - "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", - "integrity": "sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==", "license": "MIT" }, "node_modules/lodash.memoize": { "version": "4.1.2", - "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", - "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==", "license": "MIT" }, "node_modules/lodash.merge": { "version": "4.6.2", - "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", "license": "MIT" }, "node_modules/lodash.snakecase": { "version": "4.1.1", - "resolved": "https://registry.npmjs.org/lodash.snakecase/-/lodash.snakecase-4.1.1.tgz", - "integrity": "sha512-QZ1d4xoBHYUeuouhEq3lk3Uq7ldgyFXGBhg04+oRLnIz8o9T65Eh+8YdroUwn846zchkA9yDsDl5CVVaV2nqYw==", "license": "MIT" }, "node_modules/lodash.startcase": { "version": "4.4.0", - "resolved": "https://registry.npmjs.org/lodash.startcase/-/lodash.startcase-4.4.0.tgz", - "integrity": "sha512-+WKqsK294HMSc2jEbNgpHpd0JfIBhp7rEV4aqXWqFr6AlXov+SlcgB1Fv01y2kGe3Gc8nMW7VA0SrGuSkRfIEg==", "dev": true, "license": "MIT" }, "node_modules/lodash.uniq": { "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", - "integrity": "sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==", "license": "MIT" }, "node_modules/log-symbols": { "version": "4.1.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", - "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", "dev": true, "license": "MIT", "dependencies": { @@ -31377,8 +26359,6 @@ }, "node_modules/log-symbols/node_modules/ansi-styles": { "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "license": "MIT", "dependencies": { @@ -31393,8 +26373,6 @@ }, "node_modules/log-symbols/node_modules/chalk": { "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "license": "MIT", "dependencies": { @@ -31410,8 +26388,6 @@ }, "node_modules/log-update": { "version": "6.1.0", - "resolved": "https://registry.npmjs.org/log-update/-/log-update-6.1.0.tgz", - "integrity": "sha512-9ie8ItPR6tjY5uYJh8K/Zrv/RMZ5VOlOWvtZdEHYSTFKZfIBPQa9tOAEeAWhd+AnIneLJ22w5fjOYtoutpWq5w==", "dev": true, "license": "MIT", "dependencies": { @@ -31430,8 +26406,6 @@ }, "node_modules/log-update/node_modules/ansi-regex": { "version": "6.2.2", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", - "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", "dev": true, "license": "MIT", "engines": { @@ -31443,8 +26417,6 @@ }, "node_modules/log-update/node_modules/slice-ansi": { "version": "7.1.2", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-7.1.2.tgz", - "integrity": "sha512-iOBWFgUX7caIZiuutICxVgX1SdxwAVFFKwt1EvMYYec/NWO5meOJ6K5uQxhrYBdQJne4KxiqZc+KptFOWFSI9w==", "dev": true, "license": "MIT", "dependencies": { @@ -31460,8 +26432,6 @@ }, "node_modules/log-update/node_modules/strip-ansi": { "version": "7.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz", - "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", "dev": true, "license": "MIT", "dependencies": { @@ -31476,14 +26446,10 @@ }, "node_modules/long": { "version": "5.3.2", - "resolved": "https://registry.npmjs.org/long/-/long-5.3.2.tgz", - "integrity": "sha512-mNAgZ1GmyNhD7AuqnTG3/VQ26o760+ZYBPKjPvugO8+nLbYfX6TVpJPseBvopbdY+qpZ/lKUnmEc1LeZYS3QAA==", "license": "Apache-2.0" }, "node_modules/longest-streak": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/longest-streak/-/longest-streak-3.1.0.tgz", - "integrity": "sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==", "license": "MIT", "funding": { "type": "github", @@ -31492,8 +26458,6 @@ }, "node_modules/loose-envify": { "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", - "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", "license": "MIT", "dependencies": { "js-tokens": "^3.0.0 || ^4.0.0" @@ -31504,15 +26468,11 @@ }, "node_modules/loupe": { "version": "3.2.1", - "resolved": "https://registry.npmjs.org/loupe/-/loupe-3.2.1.tgz", - "integrity": "sha512-CdzqowRJCeLU72bHvWqwRBBlLcMEtIvGrlvef74kMnV2AolS9Y8xUv1I0U/MNAWMhBlKIoyuEgoJ0t/bbwHbLQ==", "dev": true, "license": "MIT" }, "node_modules/lower-case": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", - "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==", "license": "MIT", "dependencies": { "tslib": "^2.0.3" @@ -31520,8 +26480,6 @@ }, "node_modules/lowercase-keys": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-3.0.0.tgz", - "integrity": "sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ==", "license": "MIT", "engines": { "node": "^12.20.0 || ^14.13.1 || >=16.0.0" @@ -31532,8 +26490,6 @@ }, "node_modules/lru-cache": { "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", "license": "ISC", "dependencies": { "yallist": "^3.0.2" @@ -31541,20 +26497,14 @@ }, "node_modules/lunr": { "version": "2.3.9", - "resolved": "https://registry.npmjs.org/lunr/-/lunr-2.3.9.tgz", - "integrity": "sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow==", "license": "MIT" }, "node_modules/lunr-languages": { "version": "1.14.0", - "resolved": "https://registry.npmjs.org/lunr-languages/-/lunr-languages-1.14.0.tgz", - "integrity": "sha512-hWUAb2KqM3L7J5bcrngszzISY4BxrXn/Xhbb9TTCJYEGqlR1nG67/M14sp09+PTIRklobrn57IAxcdcO/ZFyNA==", "license": "MPL-1.1" }, "node_modules/luxon": { "version": "3.7.2", - "resolved": "https://registry.npmjs.org/luxon/-/luxon-3.7.2.tgz", - "integrity": "sha512-vtEhXh/gNjI9Yg1u4jX/0YVPMvxzHuGgCm6tC5kZyb08yjGWGnqAjGJvcXbqQR2P3MyMEFnRbpcdFS6PBcLqew==", "license": "MIT", "optional": true, "engines": { @@ -31563,8 +26513,6 @@ }, "node_modules/lz-string": { "version": "1.5.0", - "resolved": "https://registry.npmjs.org/lz-string/-/lz-string-1.5.0.tgz", - "integrity": "sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==", "dev": true, "license": "MIT", "peer": true, @@ -31574,8 +26522,6 @@ }, "node_modules/magic-string": { "version": "0.25.9", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.9.tgz", - "integrity": "sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==", "license": "MIT", "dependencies": { "sourcemap-codec": "^1.4.8" @@ -31583,8 +26529,6 @@ }, "node_modules/make-dir": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", - "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", "license": "MIT", "dependencies": { "semver": "^7.5.3" @@ -31598,15 +26542,11 @@ }, "node_modules/make-error": { "version": "1.3.6", - "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", - "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", "devOptional": true, "license": "ISC" }, "node_modules/make-fetch-happen": { "version": "15.0.4", - "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-15.0.4.tgz", - "integrity": "sha512-vM2sG+wbVeVGYcCm16mM3d5fuem9oC28n436HjsGO3LcxoTI8LNVa4rwZDn3f76+cWyT4GGJDxjTYU1I2nr6zw==", "license": "ISC", "dependencies": { "@gar/promise-retry": "^1.0.0", @@ -31627,8 +26567,6 @@ }, "node_modules/make-fetch-happen/node_modules/negotiator": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-1.0.0.tgz", - "integrity": "sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==", "license": "MIT", "engines": { "node": ">= 0.6" @@ -31636,8 +26574,6 @@ }, "node_modules/makeerror": { "version": "1.0.12", - "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", - "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", "license": "BSD-3-Clause", "dependencies": { "tmpl": "1.0.5" @@ -31645,14 +26581,10 @@ }, "node_modules/mark.js": { "version": "8.11.1", - "resolved": "https://registry.npmjs.org/mark.js/-/mark.js-8.11.1.tgz", - "integrity": "sha512-1I+1qpDt4idfgLQG+BNWmrqku+7/2bi5nLf4YwF8y8zXvmfiTBY3PV3ZibfrjBueCByROpuBjLLFCajqkgYoLQ==", "license": "MIT" }, "node_modules/markdown-extensions": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/markdown-extensions/-/markdown-extensions-2.0.0.tgz", - "integrity": "sha512-o5vL7aDWatOTX8LzaS1WMoaoxIiLRQJuIKKe2wAw6IeULDHaqbiqiggmx+pKvZDb1Sj+pE46Sn1T7lCqfFtg1Q==", "license": "MIT", "engines": { "node": ">=16" @@ -31663,8 +26595,6 @@ }, "node_modules/markdown-table": { "version": "3.0.4", - "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-3.0.4.tgz", - "integrity": "sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw==", "license": "MIT", "funding": { "type": "github", @@ -31673,8 +26603,6 @@ }, "node_modules/markdown-to-jsx": { "version": "8.0.0", - "resolved": "https://registry.npmjs.org/markdown-to-jsx/-/markdown-to-jsx-8.0.0.tgz", - "integrity": "sha512-hWEaRxeCDjes1CVUQqU+Ov0mCqBqkGhLKjL98KdbwHSgEWZZSJQeGlJQatVfeZ3RaxrfTrZZ3eczl2dhp5c/pA==", "license": "MIT", "engines": { "node": ">= 10" @@ -31690,8 +26618,6 @@ }, "node_modules/marked": { "version": "16.4.2", - "resolved": "https://registry.npmjs.org/marked/-/marked-16.4.2.tgz", - "integrity": "sha512-TI3V8YYWvkVf3KJe1dRkpnjs68JUPyEa5vjKrp1XEEJUAOaQc+Qj+L1qWbPd0SJuAdQkFU0h73sXXqwDYxsiDA==", "license": "MIT", "bin": { "marked": "bin/marked.js" @@ -31702,8 +26628,6 @@ }, "node_modules/math-intrinsics": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", - "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", "license": "MIT", "engines": { "node": ">= 0.4" @@ -31711,8 +26635,6 @@ }, "node_modules/md5": { "version": "2.3.0", - "resolved": "https://registry.npmjs.org/md5/-/md5-2.3.0.tgz", - "integrity": "sha512-T1GITYmFaKuO91vxyoQMFETst+O71VUPEU3ze5GNzDm0OWdP8v1ziTaAEPUr/3kLsY3Sftgz242A1SetQiDL7g==", "license": "BSD-3-Clause", "dependencies": { "charenc": "0.0.2", @@ -31722,8 +26644,6 @@ }, "node_modules/mdast-comment-marker": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/mdast-comment-marker/-/mdast-comment-marker-3.0.0.tgz", - "integrity": "sha512-bt08sLmTNg00/UtVDiqZKocxqvQqqyQZAg1uaRuO/4ysXV5motg7RolF5o5yy/sY1rG0v2XgZEqFWho1+2UquA==", "dev": true, "license": "MIT", "dependencies": { @@ -31737,8 +26657,6 @@ }, "node_modules/mdast-util-directive": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/mdast-util-directive/-/mdast-util-directive-3.1.0.tgz", - "integrity": "sha512-I3fNFt+DHmpWCYAT7quoM6lHf9wuqtI+oCOfvILnoicNIqjh5E3dEJWiXuYME2gNe8vl1iMQwyUHa7bgFmak6Q==", "license": "MIT", "dependencies": { "@types/mdast": "^4.0.0", @@ -31758,8 +26676,6 @@ }, "node_modules/mdast-util-find-and-replace": { "version": "3.0.2", - "resolved": "https://registry.npmjs.org/mdast-util-find-and-replace/-/mdast-util-find-and-replace-3.0.2.tgz", - "integrity": "sha512-Tmd1Vg/m3Xz43afeNxDIhWRtFZgM2VLyaf4vSTYwudTyeuTneoL3qtWMA5jeLyz/O1vDJmmV4QuScFCA2tBPwg==", "license": "MIT", "dependencies": { "@types/mdast": "^4.0.0", @@ -31774,8 +26690,6 @@ }, "node_modules/mdast-util-find-and-replace/node_modules/escape-string-regexp": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", - "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", "license": "MIT", "engines": { "node": ">=12" @@ -31786,8 +26700,6 @@ }, "node_modules/mdast-util-from-markdown": { "version": "2.0.3", - "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-2.0.3.tgz", - "integrity": "sha512-W4mAWTvSlKvf8L6J+VN9yLSqQ9AOAAvHuoDAmPkz4dHf553m5gVj2ejadHJhoJmcmxEnOv6Pa8XJhpxE93kb8Q==", "license": "MIT", "dependencies": { "@types/mdast": "^4.0.0", @@ -31810,8 +26722,6 @@ }, "node_modules/mdast-util-from-markdown/node_modules/micromark-util-symbol": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", - "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", "funding": [ { "type": "GitHub Sponsors", @@ -31826,8 +26736,6 @@ }, "node_modules/mdast-util-frontmatter": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/mdast-util-frontmatter/-/mdast-util-frontmatter-2.0.1.tgz", - "integrity": "sha512-LRqI9+wdgC25P0URIJY9vwocIzCcksduHQ9OF2joxQoyTNVduwLAFUzjoopuRJbJAReaKrNQKAZKL3uCMugWJA==", "license": "MIT", "dependencies": { "@types/mdast": "^4.0.0", @@ -31844,8 +26752,6 @@ }, "node_modules/mdast-util-frontmatter/node_modules/escape-string-regexp": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", - "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", "license": "MIT", "engines": { "node": ">=12" @@ -31856,8 +26762,6 @@ }, "node_modules/mdast-util-gfm": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/mdast-util-gfm/-/mdast-util-gfm-3.1.0.tgz", - "integrity": "sha512-0ulfdQOM3ysHhCJ1p06l0b0VKlhU0wuQs3thxZQagjcjPrlFRqY215uZGHHJan9GEAXd9MbfPjFJz+qMkVR6zQ==", "license": "MIT", "dependencies": { "mdast-util-from-markdown": "^2.0.0", @@ -31875,8 +26779,6 @@ }, "node_modules/mdast-util-gfm-autolink-literal": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/mdast-util-gfm-autolink-literal/-/mdast-util-gfm-autolink-literal-2.0.1.tgz", - "integrity": "sha512-5HVP2MKaP6L+G6YaxPNjuL0BPrq9orG3TsrZ9YXbA3vDw/ACI4MEsnoDpn6ZNm7GnZgtAcONJyPhOP8tNJQavQ==", "license": "MIT", "dependencies": { "@types/mdast": "^4.0.0", @@ -31892,8 +26794,6 @@ }, "node_modules/mdast-util-gfm-autolink-literal/node_modules/micromark-util-character": { "version": "2.1.1", - "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", - "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", "funding": [ { "type": "GitHub Sponsors", @@ -31912,8 +26812,6 @@ }, "node_modules/mdast-util-gfm-autolink-literal/node_modules/micromark-util-symbol": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", - "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", "funding": [ { "type": "GitHub Sponsors", @@ -31928,8 +26826,6 @@ }, "node_modules/mdast-util-gfm-footnote": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mdast-util-gfm-footnote/-/mdast-util-gfm-footnote-2.1.0.tgz", - "integrity": "sha512-sqpDWlsHn7Ac9GNZQMeUzPQSMzR6Wv0WKRNvQRg0KqHh02fpTz69Qc1QSseNX29bhz1ROIyNyxExfawVKTm1GQ==", "license": "MIT", "dependencies": { "@types/mdast": "^4.0.0", @@ -31945,8 +26841,6 @@ }, "node_modules/mdast-util-gfm-strikethrough": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/mdast-util-gfm-strikethrough/-/mdast-util-gfm-strikethrough-2.0.0.tgz", - "integrity": "sha512-mKKb915TF+OC5ptj5bJ7WFRPdYtuHv0yTRxK2tJvi+BDqbkiG7h7u/9SI89nRAYcmap2xHQL9D+QG/6wSrTtXg==", "license": "MIT", "dependencies": { "@types/mdast": "^4.0.0", @@ -31960,8 +26854,6 @@ }, "node_modules/mdast-util-gfm-table": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/mdast-util-gfm-table/-/mdast-util-gfm-table-2.0.0.tgz", - "integrity": "sha512-78UEvebzz/rJIxLvE7ZtDd/vIQ0RHv+3Mh5DR96p7cS7HsBhYIICDBCu8csTNWNO6tBWfqXPWekRuj2FNOGOZg==", "license": "MIT", "dependencies": { "@types/mdast": "^4.0.0", @@ -31977,8 +26869,6 @@ }, "node_modules/mdast-util-gfm-task-list-item": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/mdast-util-gfm-task-list-item/-/mdast-util-gfm-task-list-item-2.0.0.tgz", - "integrity": "sha512-IrtvNvjxC1o06taBAVJznEnkiHxLFTzgonUdy8hzFVeDun0uTjxxrRGVaNFqkU1wJR3RBPEfsxmU6jDWPofrTQ==", "license": "MIT", "dependencies": { "@types/mdast": "^4.0.0", @@ -31993,8 +26883,6 @@ }, "node_modules/mdast-util-heading-style": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/mdast-util-heading-style/-/mdast-util-heading-style-3.0.0.tgz", - "integrity": "sha512-tsUfM9Kj9msjlemA/38Z3pvraQay880E3zP2NgIthMoGcpU9bcPX9oSM6QC/+eFXGGB4ba+VCB1dKAPHB7Veug==", "dev": true, "license": "MIT", "dependencies": { @@ -32007,8 +26895,6 @@ }, "node_modules/mdast-util-mdx": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/mdast-util-mdx/-/mdast-util-mdx-3.0.0.tgz", - "integrity": "sha512-JfbYLAW7XnYTTbUsmpu0kdBUVe+yKVJZBItEjwyYJiDJuZ9w4eeaqks4HQO+R7objWgS2ymV60GYpI14Ug554w==", "license": "MIT", "dependencies": { "mdast-util-from-markdown": "^2.0.0", @@ -32024,8 +26910,6 @@ }, "node_modules/mdast-util-mdx-expression": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/mdast-util-mdx-expression/-/mdast-util-mdx-expression-2.0.1.tgz", - "integrity": "sha512-J6f+9hUp+ldTZqKRSg7Vw5V6MqjATc+3E4gf3CFNcuZNWD8XdyI6zQ8GqH7f8169MM6P7hMBRDVGnn7oHB9kXQ==", "license": "MIT", "dependencies": { "@types/estree-jsx": "^1.0.0", @@ -32042,8 +26926,6 @@ }, "node_modules/mdast-util-mdx-jsx": { "version": "3.2.0", - "resolved": "https://registry.npmjs.org/mdast-util-mdx-jsx/-/mdast-util-mdx-jsx-3.2.0.tgz", - "integrity": "sha512-lj/z8v0r6ZtsN/cGNNtemmmfoLAFZnjMbNyLzBafjzikOM+glrjNHPlf6lQDOTccj9n5b0PPihEBbhneMyGs1Q==", "license": "MIT", "dependencies": { "@types/estree-jsx": "^1.0.0", @@ -32066,8 +26948,6 @@ }, "node_modules/mdast-util-mdxjs-esm": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/mdast-util-mdxjs-esm/-/mdast-util-mdxjs-esm-2.0.1.tgz", - "integrity": "sha512-EcmOpxsZ96CvlP03NghtH1EsLtr0n9Tm4lPUJUBccV9RwUOneqSycg19n5HGzCf+10LozMRSObtVr3ee1WoHtg==", "license": "MIT", "dependencies": { "@types/estree-jsx": "^1.0.0", @@ -32084,8 +26964,6 @@ }, "node_modules/mdast-util-phrasing": { "version": "4.1.0", - "resolved": "https://registry.npmjs.org/mdast-util-phrasing/-/mdast-util-phrasing-4.1.0.tgz", - "integrity": "sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w==", "license": "MIT", "dependencies": { "@types/mdast": "^4.0.0", @@ -32098,8 +26976,6 @@ }, "node_modules/mdast-util-to-hast": { "version": "13.2.1", - "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-13.2.1.tgz", - "integrity": "sha512-cctsq2wp5vTsLIcaymblUriiTcZd0CwWtCbLvrOzYCDZoWyMNV8sZ7krj09FSnsiJi3WVsHLM4k6Dq/yaPyCXA==", "license": "MIT", "dependencies": { "@types/hast": "^3.0.0", @@ -32119,8 +26995,6 @@ }, "node_modules/mdast-util-to-markdown": { "version": "2.1.2", - "resolved": "https://registry.npmjs.org/mdast-util-to-markdown/-/mdast-util-to-markdown-2.1.2.tgz", - "integrity": "sha512-xj68wMTvGXVOKonmog6LwyJKrYXZPvlwabaryTjLh9LuvovB/KAH+kvi8Gjj+7rJjsFi23nkUxRQv1KqSroMqA==", "license": "MIT", "dependencies": { "@types/mdast": "^4.0.0", @@ -32140,8 +27014,6 @@ }, "node_modules/mdast-util-to-string": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-4.0.0.tgz", - "integrity": "sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==", "license": "MIT", "dependencies": { "@types/mdast": "^4.0.0" @@ -32153,21 +27025,15 @@ }, "node_modules/mdn-data": { "version": "2.0.30", - "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.30.tgz", - "integrity": "sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==", "license": "CC0-1.0" }, "node_modules/meant": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/meant/-/meant-1.0.3.tgz", - "integrity": "sha512-88ZRGcNxAq4EH38cQ4D85PM57pikCwS8Z99EWHODxN7KBY+UuPiqzRTtZzS8KTXO/ywSWbdjjJST2Hly/EQxLw==", "dev": true, "license": "MIT" }, "node_modules/media-typer": { "version": "0.3.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", "license": "MIT", "engines": { "node": ">= 0.6" @@ -32175,8 +27041,6 @@ }, "node_modules/memfs": { "version": "4.56.10", - "resolved": "https://registry.npmjs.org/memfs/-/memfs-4.56.10.tgz", - "integrity": "sha512-eLvzyrwqLHnLYalJP7YZ3wBe79MXktMdfQbvMrVD80K+NhrIukCVBvgP30zTJYEEDh9hZ/ep9z0KOdD7FSHo7w==", "license": "Apache-2.0", "dependencies": { "@jsonjoy.com/fs-core": "4.56.10", @@ -32204,8 +27068,6 @@ }, "node_modules/memorystream": { "version": "0.3.1", - "resolved": "https://registry.npmjs.org/memorystream/-/memorystream-0.3.1.tgz", - "integrity": "sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw==", "dev": true, "engines": { "node": ">= 0.10.0" @@ -32213,8 +27075,6 @@ }, "node_modules/merge-descriptors": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz", - "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==", "license": "MIT", "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -32222,14 +27082,10 @@ }, "node_modules/merge-stream": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", "license": "MIT" }, "node_modules/merge2": { "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", "license": "MIT", "engines": { "node": ">= 8" @@ -32237,8 +27093,6 @@ }, "node_modules/mermaid": { "version": "11.12.3", - "resolved": "https://registry.npmjs.org/mermaid/-/mermaid-11.12.3.tgz", - "integrity": "sha512-wN5ZSgJQIC+CHJut9xaKWsknLxaFBwCPwPkGTSUYrTiHORWvpT8RxGk849HPnpUAQ+/9BPRqYb80jTpearrHzQ==", "license": "MIT", "dependencies": { "@braintree/sanitize-url": "^7.1.1", @@ -32265,8 +27119,6 @@ }, "node_modules/mermaid/node_modules/uuid": { "version": "11.1.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-11.1.0.tgz", - "integrity": "sha512-0/A9rDy9P7cJ+8w1c9WD9V//9Wj15Ce2MPz8Ri6032usz+NfePxx5AcN3bN+r6ZL6jEo066/yNYB3tn4pQEx+A==", "funding": [ "https://github.com/sponsors/broofa", "https://github.com/sponsors/ctavan" @@ -32278,8 +27130,6 @@ }, "node_modules/methods": { "version": "1.1.2", - "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", "license": "MIT", "engines": { "node": ">= 0.6" @@ -32287,8 +27137,6 @@ }, "node_modules/micromark": { "version": "4.0.2", - "resolved": "https://registry.npmjs.org/micromark/-/micromark-4.0.2.tgz", - "integrity": "sha512-zpe98Q6kvavpCr1NPVSCMebCKfD7CA2NqZ+rykeNhONIJBpc1tFKt9hucLGwha3jNTNI8lHpctWJWoimVF4PfA==", "funding": [ { "type": "GitHub Sponsors", @@ -32322,8 +27170,6 @@ }, "node_modules/micromark-core-commonmark": { "version": "2.0.3", - "resolved": "https://registry.npmjs.org/micromark-core-commonmark/-/micromark-core-commonmark-2.0.3.tgz", - "integrity": "sha512-RDBrHEMSxVFLg6xvnXmb1Ayr2WzLAWjeSATAoxwKYJV94TeNavgoIdA0a9ytzDSVzBy2YKFK+emCPOEibLeCrg==", "funding": [ { "type": "GitHub Sponsors", @@ -32356,8 +27202,6 @@ }, "node_modules/micromark-core-commonmark/node_modules/micromark-factory-space": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz", - "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==", "funding": [ { "type": "GitHub Sponsors", @@ -32376,8 +27220,6 @@ }, "node_modules/micromark-core-commonmark/node_modules/micromark-util-character": { "version": "2.1.1", - "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", - "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", "funding": [ { "type": "GitHub Sponsors", @@ -32396,8 +27238,6 @@ }, "node_modules/micromark-core-commonmark/node_modules/micromark-util-symbol": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", - "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", "funding": [ { "type": "GitHub Sponsors", @@ -32412,8 +27252,6 @@ }, "node_modules/micromark-extension-directive": { "version": "3.0.2", - "resolved": "https://registry.npmjs.org/micromark-extension-directive/-/micromark-extension-directive-3.0.2.tgz", - "integrity": "sha512-wjcXHgk+PPdmvR58Le9d7zQYWy+vKEU9Se44p2CrCDPiLr2FMyiT4Fyb5UFKFC66wGB3kPlgD7q3TnoqPS7SZA==", "license": "MIT", "dependencies": { "devlop": "^1.0.0", @@ -32431,8 +27269,6 @@ }, "node_modules/micromark-extension-directive/node_modules/micromark-factory-space": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz", - "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==", "funding": [ { "type": "GitHub Sponsors", @@ -32451,8 +27287,6 @@ }, "node_modules/micromark-extension-directive/node_modules/micromark-util-character": { "version": "2.1.1", - "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", - "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", "funding": [ { "type": "GitHub Sponsors", @@ -32471,8 +27305,6 @@ }, "node_modules/micromark-extension-directive/node_modules/micromark-util-symbol": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", - "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", "funding": [ { "type": "GitHub Sponsors", @@ -32487,8 +27319,6 @@ }, "node_modules/micromark-extension-frontmatter": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-extension-frontmatter/-/micromark-extension-frontmatter-2.0.0.tgz", - "integrity": "sha512-C4AkuM3dA58cgZha7zVnuVxBhDsbttIMiytjgsM2XbHAB2faRVaHRle40558FBN+DJcrLNCoqG5mlrpdU4cRtg==", "license": "MIT", "dependencies": { "fault": "^2.0.0", @@ -32503,8 +27333,6 @@ }, "node_modules/micromark-extension-frontmatter/node_modules/micromark-util-character": { "version": "2.1.1", - "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", - "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", "funding": [ { "type": "GitHub Sponsors", @@ -32523,8 +27351,6 @@ }, "node_modules/micromark-extension-frontmatter/node_modules/micromark-util-symbol": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", - "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", "funding": [ { "type": "GitHub Sponsors", @@ -32539,8 +27365,6 @@ }, "node_modules/micromark-extension-gfm": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm/-/micromark-extension-gfm-3.0.0.tgz", - "integrity": "sha512-vsKArQsicm7t0z2GugkCKtZehqUm31oeGBV/KVSorWSy8ZlNAv7ytjFhvaryUiCUJYqs+NoE6AFhpQvBTM6Q4w==", "license": "MIT", "dependencies": { "micromark-extension-gfm-autolink-literal": "^2.0.0", @@ -32559,8 +27383,6 @@ }, "node_modules/micromark-extension-gfm-autolink-literal": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm-autolink-literal/-/micromark-extension-gfm-autolink-literal-2.1.0.tgz", - "integrity": "sha512-oOg7knzhicgQ3t4QCjCWgTmfNhvQbDDnJeVu9v81r7NltNCVmhPy1fJRX27pISafdjL+SVc4d3l48Gb6pbRypw==", "license": "MIT", "dependencies": { "micromark-util-character": "^2.0.0", @@ -32575,8 +27397,6 @@ }, "node_modules/micromark-extension-gfm-autolink-literal/node_modules/micromark-util-character": { "version": "2.1.1", - "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", - "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", "funding": [ { "type": "GitHub Sponsors", @@ -32595,8 +27415,6 @@ }, "node_modules/micromark-extension-gfm-autolink-literal/node_modules/micromark-util-symbol": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", - "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", "funding": [ { "type": "GitHub Sponsors", @@ -32611,8 +27429,6 @@ }, "node_modules/micromark-extension-gfm-footnote": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm-footnote/-/micromark-extension-gfm-footnote-2.1.0.tgz", - "integrity": "sha512-/yPhxI1ntnDNsiHtzLKYnE3vf9JZ6cAisqVDauhp4CEHxlb4uoOTxOCJ+9s51bIB8U1N1FJ1RXOKTIlD5B/gqw==", "license": "MIT", "dependencies": { "devlop": "^1.0.0", @@ -32631,8 +27447,6 @@ }, "node_modules/micromark-extension-gfm-footnote/node_modules/micromark-factory-space": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz", - "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==", "funding": [ { "type": "GitHub Sponsors", @@ -32651,8 +27465,6 @@ }, "node_modules/micromark-extension-gfm-footnote/node_modules/micromark-util-character": { "version": "2.1.1", - "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", - "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", "funding": [ { "type": "GitHub Sponsors", @@ -32671,8 +27483,6 @@ }, "node_modules/micromark-extension-gfm-footnote/node_modules/micromark-util-symbol": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", - "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", "funding": [ { "type": "GitHub Sponsors", @@ -32687,8 +27497,6 @@ }, "node_modules/micromark-extension-gfm-strikethrough": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm-strikethrough/-/micromark-extension-gfm-strikethrough-2.1.0.tgz", - "integrity": "sha512-ADVjpOOkjz1hhkZLlBiYA9cR2Anf8F4HqZUO6e5eDcPQd0Txw5fxLzzxnEkSkfnD0wziSGiv7sYhk/ktvbf1uw==", "license": "MIT", "dependencies": { "devlop": "^1.0.0", @@ -32705,8 +27513,6 @@ }, "node_modules/micromark-extension-gfm-strikethrough/node_modules/micromark-util-symbol": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", - "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", "funding": [ { "type": "GitHub Sponsors", @@ -32721,8 +27527,6 @@ }, "node_modules/micromark-extension-gfm-table": { "version": "2.1.1", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm-table/-/micromark-extension-gfm-table-2.1.1.tgz", - "integrity": "sha512-t2OU/dXXioARrC6yWfJ4hqB7rct14e8f7m0cbI5hUmDyyIlwv5vEtooptH8INkbLzOatzKuVbQmAYcbWoyz6Dg==", "license": "MIT", "dependencies": { "devlop": "^1.0.0", @@ -32738,8 +27542,6 @@ }, "node_modules/micromark-extension-gfm-table/node_modules/micromark-factory-space": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz", - "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==", "funding": [ { "type": "GitHub Sponsors", @@ -32758,8 +27560,6 @@ }, "node_modules/micromark-extension-gfm-table/node_modules/micromark-util-character": { "version": "2.1.1", - "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", - "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", "funding": [ { "type": "GitHub Sponsors", @@ -32778,8 +27578,6 @@ }, "node_modules/micromark-extension-gfm-table/node_modules/micromark-util-symbol": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", - "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", "funding": [ { "type": "GitHub Sponsors", @@ -32794,8 +27592,6 @@ }, "node_modules/micromark-extension-gfm-tagfilter": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm-tagfilter/-/micromark-extension-gfm-tagfilter-2.0.0.tgz", - "integrity": "sha512-xHlTOmuCSotIA8TW1mDIM6X2O1SiX5P9IuDtqGonFhEK0qgRI4yeC6vMxEV2dgyr2TiD+2PQ10o+cOhdVAcwfg==", "license": "MIT", "dependencies": { "micromark-util-types": "^2.0.0" @@ -32807,8 +27603,6 @@ }, "node_modules/micromark-extension-gfm-task-list-item": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm-task-list-item/-/micromark-extension-gfm-task-list-item-2.1.0.tgz", - "integrity": "sha512-qIBZhqxqI6fjLDYFTBIa4eivDMnP+OZqsNwmQ3xNLE4Cxwc+zfQEfbs6tzAo2Hjq+bh6q5F+Z8/cksrLFYWQQw==", "license": "MIT", "dependencies": { "devlop": "^1.0.0", @@ -32824,8 +27618,6 @@ }, "node_modules/micromark-extension-gfm-task-list-item/node_modules/micromark-factory-space": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz", - "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==", "funding": [ { "type": "GitHub Sponsors", @@ -32844,8 +27636,6 @@ }, "node_modules/micromark-extension-gfm-task-list-item/node_modules/micromark-util-character": { "version": "2.1.1", - "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", - "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", "funding": [ { "type": "GitHub Sponsors", @@ -32864,8 +27654,6 @@ }, "node_modules/micromark-extension-gfm-task-list-item/node_modules/micromark-util-symbol": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", - "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", "funding": [ { "type": "GitHub Sponsors", @@ -32880,8 +27668,6 @@ }, "node_modules/micromark-extension-mdx-expression": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/micromark-extension-mdx-expression/-/micromark-extension-mdx-expression-3.0.1.tgz", - "integrity": "sha512-dD/ADLJ1AeMvSAKBwO22zG22N4ybhe7kFIZ3LsDI0GlsNr2A3KYxb0LdC1u5rj4Nw+CHKY0RVdnHX8vj8ejm4Q==", "funding": [ { "type": "GitHub Sponsors", @@ -32906,8 +27692,6 @@ }, "node_modules/micromark-extension-mdx-expression/node_modules/micromark-factory-space": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz", - "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==", "funding": [ { "type": "GitHub Sponsors", @@ -32926,8 +27710,6 @@ }, "node_modules/micromark-extension-mdx-expression/node_modules/micromark-util-character": { "version": "2.1.1", - "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", - "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", "funding": [ { "type": "GitHub Sponsors", @@ -32946,8 +27728,6 @@ }, "node_modules/micromark-extension-mdx-expression/node_modules/micromark-util-symbol": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", - "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", "funding": [ { "type": "GitHub Sponsors", @@ -32962,8 +27742,6 @@ }, "node_modules/micromark-extension-mdx-jsx": { "version": "3.0.2", - "resolved": "https://registry.npmjs.org/micromark-extension-mdx-jsx/-/micromark-extension-mdx-jsx-3.0.2.tgz", - "integrity": "sha512-e5+q1DjMh62LZAJOnDraSSbDMvGJ8x3cbjygy2qFEi7HCeUT4BDKCvMozPozcD6WmOt6sVvYDNBKhFSz3kjOVQ==", "license": "MIT", "dependencies": { "@types/estree": "^1.0.0", @@ -32984,8 +27762,6 @@ }, "node_modules/micromark-extension-mdx-jsx/node_modules/micromark-factory-space": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz", - "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==", "funding": [ { "type": "GitHub Sponsors", @@ -33004,8 +27780,6 @@ }, "node_modules/micromark-extension-mdx-jsx/node_modules/micromark-util-character": { "version": "2.1.1", - "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", - "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", "funding": [ { "type": "GitHub Sponsors", @@ -33024,8 +27798,6 @@ }, "node_modules/micromark-extension-mdx-jsx/node_modules/micromark-util-symbol": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", - "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", "funding": [ { "type": "GitHub Sponsors", @@ -33040,8 +27812,6 @@ }, "node_modules/micromark-extension-mdx-md": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-extension-mdx-md/-/micromark-extension-mdx-md-2.0.0.tgz", - "integrity": "sha512-EpAiszsB3blw4Rpba7xTOUptcFeBFi+6PY8VnJ2hhimH+vCQDirWgsMpz7w1XcZE7LVrSAUGb9VJpG9ghlYvYQ==", "license": "MIT", "dependencies": { "micromark-util-types": "^2.0.0" @@ -33053,8 +27823,6 @@ }, "node_modules/micromark-extension-mdxjs": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/micromark-extension-mdxjs/-/micromark-extension-mdxjs-3.0.0.tgz", - "integrity": "sha512-A873fJfhnJ2siZyUrJ31l34Uqwy4xIFmvPY1oj+Ean5PHcPBYzEsvqvWGaWcfEIr11O5Dlw3p2y0tZWpKHDejQ==", "license": "MIT", "dependencies": { "acorn": "^8.0.0", @@ -33073,8 +27841,6 @@ }, "node_modules/micromark-extension-mdxjs-esm": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/micromark-extension-mdxjs-esm/-/micromark-extension-mdxjs-esm-3.0.0.tgz", - "integrity": "sha512-DJFl4ZqkErRpq/dAPyeWp15tGrcrrJho1hKK5uBS70BCtfrIFg81sqcTVu3Ta+KD1Tk5vAtBNElWxtAa+m8K9A==", "license": "MIT", "dependencies": { "@types/estree": "^1.0.0", @@ -33094,8 +27860,6 @@ }, "node_modules/micromark-extension-mdxjs-esm/node_modules/micromark-util-character": { "version": "2.1.1", - "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", - "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", "funding": [ { "type": "GitHub Sponsors", @@ -33114,8 +27878,6 @@ }, "node_modules/micromark-extension-mdxjs-esm/node_modules/micromark-util-symbol": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", - "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", "funding": [ { "type": "GitHub Sponsors", @@ -33130,8 +27892,6 @@ }, "node_modules/micromark-factory-destination": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-factory-destination/-/micromark-factory-destination-2.0.1.tgz", - "integrity": "sha512-Xe6rDdJlkmbFRExpTOmRj9N3MaWmbAgdpSrBQvCFqhezUn4AHqJHbaEnfbVYYiexVSs//tqOdY/DxhjdCiJnIA==", "funding": [ { "type": "GitHub Sponsors", @@ -33151,8 +27911,6 @@ }, "node_modules/micromark-factory-destination/node_modules/micromark-util-character": { "version": "2.1.1", - "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", - "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", "funding": [ { "type": "GitHub Sponsors", @@ -33171,8 +27929,6 @@ }, "node_modules/micromark-factory-destination/node_modules/micromark-util-symbol": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", - "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", "funding": [ { "type": "GitHub Sponsors", @@ -33187,8 +27943,6 @@ }, "node_modules/micromark-factory-label": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-factory-label/-/micromark-factory-label-2.0.1.tgz", - "integrity": "sha512-VFMekyQExqIW7xIChcXn4ok29YE3rnuyveW3wZQWWqF4Nv9Wk5rgJ99KzPvHjkmPXF93FXIbBp6YdW3t71/7Vg==", "funding": [ { "type": "GitHub Sponsors", @@ -33209,8 +27963,6 @@ }, "node_modules/micromark-factory-label/node_modules/micromark-util-character": { "version": "2.1.1", - "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", - "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", "funding": [ { "type": "GitHub Sponsors", @@ -33229,8 +27981,6 @@ }, "node_modules/micromark-factory-label/node_modules/micromark-util-symbol": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", - "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", "funding": [ { "type": "GitHub Sponsors", @@ -33245,8 +27995,6 @@ }, "node_modules/micromark-factory-mdx-expression": { "version": "2.0.3", - "resolved": "https://registry.npmjs.org/micromark-factory-mdx-expression/-/micromark-factory-mdx-expression-2.0.3.tgz", - "integrity": "sha512-kQnEtA3vzucU2BkrIa8/VaSAsP+EJ3CKOvhMuJgOEGg9KDC6OAY6nSnNDVRiVNRqj7Y4SlSzcStaH/5jge8JdQ==", "funding": [ { "type": "GitHub Sponsors", @@ -33272,8 +28020,6 @@ }, "node_modules/micromark-factory-mdx-expression/node_modules/micromark-factory-space": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz", - "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==", "funding": [ { "type": "GitHub Sponsors", @@ -33292,8 +28038,6 @@ }, "node_modules/micromark-factory-mdx-expression/node_modules/micromark-util-character": { "version": "2.1.1", - "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", - "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", "funding": [ { "type": "GitHub Sponsors", @@ -33312,8 +28056,6 @@ }, "node_modules/micromark-factory-mdx-expression/node_modules/micromark-util-symbol": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", - "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", "funding": [ { "type": "GitHub Sponsors", @@ -33328,8 +28070,6 @@ }, "node_modules/micromark-factory-space": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-1.1.0.tgz", - "integrity": "sha512-cRzEj7c0OL4Mw2v6nwzttyOZe8XY/Z8G0rzmWQZTBi/jjwyw/U4uqKtUORXQrR5bAZZnbTI/feRV/R7hc4jQYQ==", "funding": [ { "type": "GitHub Sponsors", @@ -33348,8 +28088,6 @@ }, "node_modules/micromark-factory-space/node_modules/micromark-util-types": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-1.1.0.tgz", - "integrity": "sha512-ukRBgie8TIAcacscVHSiddHjO4k/q3pnedmzMQ4iwDcK0FtFCohKOlFbaOL/mPgfnPsL3C1ZyxJa4sbWrBl3jg==", "funding": [ { "type": "GitHub Sponsors", @@ -33364,8 +28102,6 @@ }, "node_modules/micromark-factory-title": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-factory-title/-/micromark-factory-title-2.0.1.tgz", - "integrity": "sha512-5bZ+3CjhAd9eChYTHsjy6TGxpOFSKgKKJPJxr293jTbfry2KDoWkhBb6TcPVB4NmzaPhMs1Frm9AZH7OD4Cjzw==", "funding": [ { "type": "GitHub Sponsors", @@ -33386,8 +28122,6 @@ }, "node_modules/micromark-factory-title/node_modules/micromark-factory-space": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz", - "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==", "funding": [ { "type": "GitHub Sponsors", @@ -33406,8 +28140,6 @@ }, "node_modules/micromark-factory-title/node_modules/micromark-util-character": { "version": "2.1.1", - "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", - "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", "funding": [ { "type": "GitHub Sponsors", @@ -33426,8 +28158,6 @@ }, "node_modules/micromark-factory-title/node_modules/micromark-util-symbol": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", - "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", "funding": [ { "type": "GitHub Sponsors", @@ -33442,8 +28172,6 @@ }, "node_modules/micromark-factory-whitespace": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-factory-whitespace/-/micromark-factory-whitespace-2.0.1.tgz", - "integrity": "sha512-Ob0nuZ3PKt/n0hORHyvoD9uZhr+Za8sFoP+OnMcnWK5lngSzALgQYKMr9RJVOWLqQYuyn6ulqGWSXdwf6F80lQ==", "funding": [ { "type": "GitHub Sponsors", @@ -33464,8 +28192,6 @@ }, "node_modules/micromark-factory-whitespace/node_modules/micromark-factory-space": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz", - "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==", "funding": [ { "type": "GitHub Sponsors", @@ -33484,8 +28210,6 @@ }, "node_modules/micromark-factory-whitespace/node_modules/micromark-util-character": { "version": "2.1.1", - "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", - "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", "funding": [ { "type": "GitHub Sponsors", @@ -33504,8 +28228,6 @@ }, "node_modules/micromark-factory-whitespace/node_modules/micromark-util-symbol": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", - "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", "funding": [ { "type": "GitHub Sponsors", @@ -33520,8 +28242,6 @@ }, "node_modules/micromark-util-character": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-1.2.0.tgz", - "integrity": "sha512-lXraTwcX3yH/vMDaFWCQJP1uIszLVebzUa3ZHdrgxr7KEU/9mL4mVgCpGbyhvNLNlauROiNUq7WN5u7ndbY6xg==", "funding": [ { "type": "GitHub Sponsors", @@ -33540,8 +28260,6 @@ }, "node_modules/micromark-util-character/node_modules/micromark-util-types": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-1.1.0.tgz", - "integrity": "sha512-ukRBgie8TIAcacscVHSiddHjO4k/q3pnedmzMQ4iwDcK0FtFCohKOlFbaOL/mPgfnPsL3C1ZyxJa4sbWrBl3jg==", "funding": [ { "type": "GitHub Sponsors", @@ -33556,8 +28274,6 @@ }, "node_modules/micromark-util-chunked": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-chunked/-/micromark-util-chunked-2.0.1.tgz", - "integrity": "sha512-QUNFEOPELfmvv+4xiNg2sRYeS/P84pTW0TCgP5zc9FpXetHY0ab7SxKyAQCNCc1eK0459uoLI1y5oO5Vc1dbhA==", "funding": [ { "type": "GitHub Sponsors", @@ -33575,8 +28291,6 @@ }, "node_modules/micromark-util-chunked/node_modules/micromark-util-symbol": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", - "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", "funding": [ { "type": "GitHub Sponsors", @@ -33591,8 +28305,6 @@ }, "node_modules/micromark-util-classify-character": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-classify-character/-/micromark-util-classify-character-2.0.1.tgz", - "integrity": "sha512-K0kHzM6afW/MbeWYWLjoHQv1sgg2Q9EccHEDzSkxiP/EaagNzCm7T/WMKZ3rjMbvIpvBiZgwR3dKMygtA4mG1Q==", "funding": [ { "type": "GitHub Sponsors", @@ -33612,8 +28324,6 @@ }, "node_modules/micromark-util-classify-character/node_modules/micromark-util-character": { "version": "2.1.1", - "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", - "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", "funding": [ { "type": "GitHub Sponsors", @@ -33632,8 +28342,6 @@ }, "node_modules/micromark-util-classify-character/node_modules/micromark-util-symbol": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", - "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", "funding": [ { "type": "GitHub Sponsors", @@ -33648,8 +28356,6 @@ }, "node_modules/micromark-util-combine-extensions": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-combine-extensions/-/micromark-util-combine-extensions-2.0.1.tgz", - "integrity": "sha512-OnAnH8Ujmy59JcyZw8JSbK9cGpdVY44NKgSM7E9Eh7DiLS2E9RNQf0dONaGDzEG9yjEl5hcqeIsj4hfRkLH/Bg==", "funding": [ { "type": "GitHub Sponsors", @@ -33668,8 +28374,6 @@ }, "node_modules/micromark-util-decode-numeric-character-reference": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-2.0.2.tgz", - "integrity": "sha512-ccUbYk6CwVdkmCQMyr64dXz42EfHGkPQlBj5p7YVGzq8I7CtjXZJrubAYezf7Rp+bjPseiROqe7G6foFd+lEuw==", "funding": [ { "type": "GitHub Sponsors", @@ -33687,8 +28391,6 @@ }, "node_modules/micromark-util-decode-numeric-character-reference/node_modules/micromark-util-symbol": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", - "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", "funding": [ { "type": "GitHub Sponsors", @@ -33703,8 +28405,6 @@ }, "node_modules/micromark-util-decode-string": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-decode-string/-/micromark-util-decode-string-2.0.1.tgz", - "integrity": "sha512-nDV/77Fj6eH1ynwscYTOsbK7rR//Uj0bZXBwJZRfaLEJ1iGBR6kIfNmlNqaqJf649EP0F3NWNdeJi03elllNUQ==", "funding": [ { "type": "GitHub Sponsors", @@ -33725,8 +28425,6 @@ }, "node_modules/micromark-util-decode-string/node_modules/micromark-util-character": { "version": "2.1.1", - "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", - "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", "funding": [ { "type": "GitHub Sponsors", @@ -33745,8 +28443,6 @@ }, "node_modules/micromark-util-decode-string/node_modules/micromark-util-symbol": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", - "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", "funding": [ { "type": "GitHub Sponsors", @@ -33761,8 +28457,6 @@ }, "node_modules/micromark-util-encode": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-2.0.1.tgz", - "integrity": "sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==", "funding": [ { "type": "GitHub Sponsors", @@ -33777,8 +28471,6 @@ }, "node_modules/micromark-util-events-to-acorn": { "version": "2.0.3", - "resolved": "https://registry.npmjs.org/micromark-util-events-to-acorn/-/micromark-util-events-to-acorn-2.0.3.tgz", - "integrity": "sha512-jmsiEIiZ1n7X1Rr5k8wVExBQCg5jy4UXVADItHmNk1zkwEVhBuIUKRu3fqv+hs4nxLISi2DQGlqIOGiFxgbfHg==", "funding": [ { "type": "GitHub Sponsors", @@ -33802,8 +28494,6 @@ }, "node_modules/micromark-util-events-to-acorn/node_modules/micromark-util-symbol": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", - "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", "funding": [ { "type": "GitHub Sponsors", @@ -33818,8 +28508,6 @@ }, "node_modules/micromark-util-html-tag-name": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-html-tag-name/-/micromark-util-html-tag-name-2.0.1.tgz", - "integrity": "sha512-2cNEiYDhCWKI+Gs9T0Tiysk136SnR13hhO8yW6BGNyhOC4qYFnwF1nKfD3HFAIXA5c45RrIG1ub11GiXeYd1xA==", "funding": [ { "type": "GitHub Sponsors", @@ -33834,8 +28522,6 @@ }, "node_modules/micromark-util-normalize-identifier": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-2.0.1.tgz", - "integrity": "sha512-sxPqmo70LyARJs0w2UclACPUUEqltCkJ6PhKdMIDuJ3gSf/Q+/GIe3WKl0Ijb/GyH9lOpUkRAO2wp0GVkLvS9Q==", "funding": [ { "type": "GitHub Sponsors", @@ -33853,8 +28539,6 @@ }, "node_modules/micromark-util-normalize-identifier/node_modules/micromark-util-symbol": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", - "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", "funding": [ { "type": "GitHub Sponsors", @@ -33869,8 +28553,6 @@ }, "node_modules/micromark-util-resolve-all": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-resolve-all/-/micromark-util-resolve-all-2.0.1.tgz", - "integrity": "sha512-VdQyxFWFT2/FGJgwQnJYbe1jjQoNTS4RjglmSjTUlpUMa95Htx9NHeYW4rGDJzbjvCsl9eLjMQwGeElsqmzcHg==", "funding": [ { "type": "GitHub Sponsors", @@ -33888,8 +28570,6 @@ }, "node_modules/micromark-util-sanitize-uri": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-2.0.1.tgz", - "integrity": "sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==", "funding": [ { "type": "GitHub Sponsors", @@ -33909,8 +28589,6 @@ }, "node_modules/micromark-util-sanitize-uri/node_modules/micromark-util-character": { "version": "2.1.1", - "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", - "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", "funding": [ { "type": "GitHub Sponsors", @@ -33929,8 +28607,6 @@ }, "node_modules/micromark-util-sanitize-uri/node_modules/micromark-util-symbol": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", - "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", "funding": [ { "type": "GitHub Sponsors", @@ -33945,8 +28621,6 @@ }, "node_modules/micromark-util-subtokenize": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-subtokenize/-/micromark-util-subtokenize-2.1.0.tgz", - "integrity": "sha512-XQLu552iSctvnEcgXw6+Sx75GflAPNED1qx7eBJ+wydBb2KCbRZe+NwvIEEMM83uml1+2WSXpBAcp9IUCgCYWA==", "funding": [ { "type": "GitHub Sponsors", @@ -33967,8 +28641,6 @@ }, "node_modules/micromark-util-subtokenize/node_modules/micromark-util-symbol": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", - "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", "funding": [ { "type": "GitHub Sponsors", @@ -33983,8 +28655,6 @@ }, "node_modules/micromark-util-symbol": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-1.1.0.tgz", - "integrity": "sha512-uEjpEYY6KMs1g7QfJ2eX1SQEV+ZT4rUD3UcF6l57acZvLNK7PBZL+ty82Z1qhK1/yXIY4bdx04FKMgR0g4IAag==", "funding": [ { "type": "GitHub Sponsors", @@ -33999,8 +28669,6 @@ }, "node_modules/micromark-util-types": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.2.tgz", - "integrity": "sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==", "funding": [ { "type": "GitHub Sponsors", @@ -34015,8 +28683,6 @@ }, "node_modules/micromark/node_modules/micromark-factory-space": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz", - "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==", "funding": [ { "type": "GitHub Sponsors", @@ -34035,8 +28701,6 @@ }, "node_modules/micromark/node_modules/micromark-util-character": { "version": "2.1.1", - "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", - "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", "funding": [ { "type": "GitHub Sponsors", @@ -34055,8 +28719,6 @@ }, "node_modules/micromark/node_modules/micromark-util-symbol": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", - "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", "funding": [ { "type": "GitHub Sponsors", @@ -34071,8 +28733,6 @@ }, "node_modules/micromatch": { "version": "4.0.8", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", - "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", "license": "MIT", "dependencies": { "braces": "^3.0.3", @@ -34084,8 +28744,6 @@ }, "node_modules/mime": { "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", "license": "MIT", "bin": { "mime": "cli.js" @@ -34096,8 +28754,6 @@ }, "node_modules/mime-db": { "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", "license": "MIT", "engines": { "node": ">= 0.6" @@ -34105,8 +28761,6 @@ }, "node_modules/mime-types": { "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", "license": "MIT", "dependencies": { "mime-db": "1.52.0" @@ -34117,8 +28771,6 @@ }, "node_modules/mimic-fn": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", "license": "MIT", "engines": { "node": ">=6" @@ -34126,8 +28778,6 @@ }, "node_modules/mimic-function": { "version": "5.0.1", - "resolved": "https://registry.npmjs.org/mimic-function/-/mimic-function-5.0.1.tgz", - "integrity": "sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==", "dev": true, "license": "MIT", "engines": { @@ -34139,8 +28789,6 @@ }, "node_modules/mimic-response": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-4.0.0.tgz", - "integrity": "sha512-e5ISH9xMYU0DzrT+jl8q2ze9D6eWBto+I8CNpe+VI+K2J/F/k3PdkdTdz4wvGVH4NTpo+NRYTVIuMQEMMcsLqg==", "license": "MIT", "engines": { "node": "^12.20.0 || ^14.13.1 || >=16.0.0" @@ -34151,8 +28799,6 @@ }, "node_modules/min-indent": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", - "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", "license": "MIT", "engines": { "node": ">=4" @@ -34160,8 +28806,6 @@ }, "node_modules/mini-css-extract-plugin": { "version": "2.10.0", - "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.10.0.tgz", - "integrity": "sha512-540P2c5dYnJlyJxTaSloliZexv8rji6rY8FhQN+WF/82iHQfA23j/xtJx97L+mXOML27EqksSek/g4eK7jaL3g==", "license": "MIT", "dependencies": { "schema-utils": "^4.0.0", @@ -34180,8 +28824,6 @@ }, "node_modules/mini-svg-data-uri": { "version": "1.4.4", - "resolved": "https://registry.npmjs.org/mini-svg-data-uri/-/mini-svg-data-uri-1.4.4.tgz", - "integrity": "sha512-r9deDe9p5FJUPZAk3A59wGH7Ii9YrjjWw0jmw/liSbHl2CHiyXj6FcDXDu2K3TjVAXqiJdaw3xxwlZZr9E6nHg==", "dev": true, "license": "MIT", "bin": { @@ -34190,14 +28832,10 @@ }, "node_modules/minimalistic-assert": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", - "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", "license": "ISC" }, "node_modules/minimatch": { "version": "10.2.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.4.tgz", - "integrity": "sha512-oRjTw/97aTBN0RHbYCdtF1MQfvusSIBQM0IZEgzl6426+8jSC0nF1a/GmnVLpfB9yyr6g6FTqWqiZVbxrtaCIg==", "license": "BlueOak-1.0.0", "dependencies": { "brace-expansion": "^5.0.2" @@ -34211,8 +28849,6 @@ }, "node_modules/minimist": { "version": "1.2.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", - "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" @@ -34220,8 +28856,6 @@ }, "node_modules/minipass": { "version": "7.1.3", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.3.tgz", - "integrity": "sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==", "license": "BlueOak-1.0.0", "engines": { "node": ">=16 || 14 >=14.17" @@ -34229,8 +28863,6 @@ }, "node_modules/minipass-collect": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-2.0.1.tgz", - "integrity": "sha512-D7V8PO9oaz7PWGLbCACuI1qEOsq7UKfLotx/C0Aet43fCUB/wfQ7DYeq2oR/svFJGYDHPr38SHATeaj/ZoKHKw==", "license": "ISC", "dependencies": { "minipass": "^7.0.3" @@ -34241,8 +28873,6 @@ }, "node_modules/minipass-fetch": { "version": "5.0.2", - "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-5.0.2.tgz", - "integrity": "sha512-2d0q2a8eCi2IRg/IGubCNRJoYbA1+YPXAzQVRFmB45gdGZafyivnZ5YSEfo3JikbjGxOdntGFvBQGqaSMXlAFQ==", "license": "MIT", "dependencies": { "minipass": "^7.0.3", @@ -34258,8 +28888,6 @@ }, "node_modules/minipass-flush": { "version": "1.0.5", - "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz", - "integrity": "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==", "license": "ISC", "dependencies": { "minipass": "^3.0.0" @@ -34270,8 +28898,6 @@ }, "node_modules/minipass-flush/node_modules/minipass": { "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", "license": "ISC", "dependencies": { "yallist": "^4.0.0" @@ -34282,14 +28908,10 @@ }, "node_modules/minipass-flush/node_modules/yallist": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", "license": "ISC" }, "node_modules/minipass-pipeline": { "version": "1.2.4", - "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz", - "integrity": "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==", "license": "ISC", "dependencies": { "minipass": "^3.0.0" @@ -34300,8 +28922,6 @@ }, "node_modules/minipass-pipeline/node_modules/minipass": { "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", "license": "ISC", "dependencies": { "yallist": "^4.0.0" @@ -34312,14 +28932,10 @@ }, "node_modules/minipass-pipeline/node_modules/yallist": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", "license": "ISC" }, "node_modules/minipass-sized": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/minipass-sized/-/minipass-sized-2.0.0.tgz", - "integrity": "sha512-zSsHhto5BcUVM2m1LurnXY6M//cGhVaegT71OfOXoprxT6o780GZd792ea6FfrQkuU4usHZIUczAQMRUE2plzA==", "license": "ISC", "dependencies": { "minipass": "^7.1.2" @@ -34330,8 +28946,6 @@ }, "node_modules/minizlib": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-3.1.0.tgz", - "integrity": "sha512-KZxYo1BUkWD2TVFLr0MQoM8vUUigWD3LlD83a/75BqC+4qE0Hb1Vo5v1FgcfaNXvfXzr+5EhQ6ing/CaBijTlw==", "license": "MIT", "dependencies": { "minipass": "^7.1.2" @@ -34342,14 +28956,10 @@ }, "node_modules/mitt": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/mitt/-/mitt-3.0.1.tgz", - "integrity": "sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==", "license": "MIT" }, "node_modules/mixpanel": { "version": "0.21.0", - "resolved": "https://registry.npmjs.org/mixpanel/-/mixpanel-0.21.0.tgz", - "integrity": "sha512-vi4LenewfZjbmpjdmKEIBHqqovyFKcYDqXFZrRYEmQ7vlYwRyzmZICMgA9KCd/624et2O2Um8Unra56zNhJgRA==", "license": "MIT", "dependencies": { "https-proxy-agent": "7.0.6", @@ -34361,8 +28971,6 @@ }, "node_modules/mixpanel-browser": { "version": "2.78.0", - "resolved": "https://registry.npmjs.org/mixpanel-browser/-/mixpanel-browser-2.78.0.tgz", - "integrity": "sha512-K2nsMLnTK0PXcQxhj1aJyGpKyEfo2u7wgZhVm532DTjkoCbJJkuSjDBWJFCH5agEM5oE0aVoCYKd0hZ+i8LsYw==", "license": "Apache-2.0", "dependencies": { "@mixpanel/rrweb": "2.0.0-alpha.18.4", @@ -34377,8 +28985,6 @@ }, "node_modules/mixpanel/node_modules/agent-base": { "version": "7.1.4", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.4.tgz", - "integrity": "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==", "license": "MIT", "engines": { "node": ">= 14" @@ -34386,8 +28992,6 @@ }, "node_modules/mixpanel/node_modules/https-proxy-agent": { "version": "7.0.6", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", - "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", "license": "MIT", "dependencies": { "agent-base": "^7.1.2", @@ -34399,15 +29003,11 @@ }, "node_modules/mkdirp-classic": { "version": "0.5.3", - "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", - "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==", "dev": true, "license": "MIT" }, "node_modules/mlly": { "version": "1.8.0", - "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.8.0.tgz", - "integrity": "sha512-l8D9ODSRWLe2KHJSifWGwBqpTZXIXTeo8mlKjY+E2HAakaTeNpqAyBZ8GSqLzHgw4XmHmC8whvpjJNMbFZN7/g==", "license": "MIT", "dependencies": { "acorn": "^8.15.0", @@ -34418,15 +29018,11 @@ }, "node_modules/module-alias": { "version": "2.3.4", - "resolved": "https://registry.npmjs.org/module-alias/-/module-alias-2.3.4.tgz", - "integrity": "sha512-bOclZt8hkpuGgSSoG07PKmvzTizROilUTvLNyrMqvlC9snhs7y7GzjNWAVbISIOlhCP1T14rH1PDAV9iNyBq/w==", "dev": true, "license": "MIT" }, "node_modules/monaco-editor": { "version": "0.55.1", - "resolved": "https://registry.npmjs.org/monaco-editor/-/monaco-editor-0.55.1.tgz", - "integrity": "sha512-jz4x+TJNFHwHtwuV9vA9rMujcZRb0CEilTEwG2rRSpe/A7Jdkuj8xPKttCgOh+v/lkHy7HsZ64oj+q3xoAFl9A==", "license": "MIT", "dependencies": { "dompurify": "3.2.7", @@ -34435,8 +29031,6 @@ }, "node_modules/monaco-editor/node_modules/dompurify": { "version": "3.2.7", - "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-3.2.7.tgz", - "integrity": "sha512-WhL/YuveyGXJaerVlMYGWhvQswa7myDG17P7Vu65EWC05o8vfeNbvNf4d/BOvH99+ZW+LlQsc1GDKMa1vNK6dw==", "license": "(MPL-2.0 OR Apache-2.0)", "optionalDependencies": { "@types/trusted-types": "^2.0.7" @@ -34444,8 +29038,6 @@ }, "node_modules/monaco-editor/node_modules/marked": { "version": "14.0.0", - "resolved": "https://registry.npmjs.org/marked/-/marked-14.0.0.tgz", - "integrity": "sha512-uIj4+faQ+MgHgwUW1l2PsPglZLOLOT1uErt06dAPtx2kjteLAkbsd/0FiYg/MGS+i7ZKLb7w2WClxHkzOOuryQ==", "license": "MIT", "bin": { "marked": "bin/marked.js" @@ -34456,8 +29048,6 @@ }, "node_modules/mri": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/mri/-/mri-1.2.0.tgz", - "integrity": "sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==", "dev": true, "license": "MIT", "engines": { @@ -34466,8 +29056,6 @@ }, "node_modules/mrmime": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-2.0.1.tgz", - "integrity": "sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ==", "license": "MIT", "engines": { "node": ">=10" @@ -34475,14 +29063,10 @@ }, "node_modules/ms": { "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", "license": "MIT" }, "node_modules/msgpackr": { "version": "1.11.9", - "resolved": "https://registry.npmjs.org/msgpackr/-/msgpackr-1.11.9.tgz", - "integrity": "sha512-FkoAAyyA6HM8wL882EcEyFZ9s7hVADSwG9xrVx3dxxNQAtgADTrJoEWivID82Iv1zWDsv/OtbrrcZAzGzOMdNw==", "license": "MIT", "optional": true, "optionalDependencies": { @@ -34491,8 +29075,6 @@ }, "node_modules/msgpackr-extract": { "version": "3.0.3", - "resolved": "https://registry.npmjs.org/msgpackr-extract/-/msgpackr-extract-3.0.3.tgz", - "integrity": "sha512-P0efT1C9jIdVRefqjzOQ9Xml57zpOXnIuS+csaB4MdZbTdmGDLo8XhzBG1N7aO11gKDDkJvBLULeFTo46wwreA==", "hasInstallScript": true, "license": "MIT", "optional": true, @@ -34513,8 +29095,6 @@ }, "node_modules/msw": { "version": "2.12.10", - "resolved": "https://registry.npmjs.org/msw/-/msw-2.12.10.tgz", - "integrity": "sha512-G3VUymSE0/iegFnuipujpwyTM2GuZAKXNeerUSrG2+Eg391wW63xFs5ixWsK9MWzr1AGoSkYGmyAzNgbR3+urw==", "dev": true, "hasInstallScript": true, "license": "MIT", @@ -34558,8 +29138,6 @@ }, "node_modules/msw/node_modules/cookie": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-1.1.1.tgz", - "integrity": "sha512-ei8Aos7ja0weRpFzJnEA9UHJ/7XQmqglbRwnf2ATjcB9Wq874VKH9kfjjirM6UhU2/E5fFYadylyhFldcqSidQ==", "dev": true, "license": "MIT", "engines": { @@ -34572,15 +29150,11 @@ }, "node_modules/msw/node_modules/path-to-regexp": { "version": "6.3.0", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-6.3.0.tgz", - "integrity": "sha512-Yhpw4T9C6hPpgPeA28us07OJeqZ5EzQTkbfwuhsUg0c237RomFoETJgmp2sa3F/41gfLE6G5cqcYwznmeEeOlQ==", "dev": true, "license": "MIT" }, "node_modules/msw/node_modules/tldts": { "version": "7.0.24", - "resolved": "https://registry.npmjs.org/tldts/-/tldts-7.0.24.tgz", - "integrity": "sha512-1r6vQTTt1rUiJkI5vX7KG8PR342Ru/5Oh13kEQP2SMbRSZpOey9SrBe27IDxkoWulx8ShWu4K6C0BkctP8Z1bQ==", "dev": true, "license": "MIT", "dependencies": { @@ -34592,15 +29166,11 @@ }, "node_modules/msw/node_modules/tldts-core": { "version": "7.0.24", - "resolved": "https://registry.npmjs.org/tldts-core/-/tldts-core-7.0.24.tgz", - "integrity": "sha512-pj7yygNMoMRqG7ML2SDQ0xNIOfN3IBDUcPVM2Sg6hP96oFNN2nqnzHreT3z9xLq85IWJyNTvD38O002DdOrPMw==", "dev": true, "license": "MIT" }, "node_modules/msw/node_modules/tough-cookie": { "version": "6.0.0", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-6.0.0.tgz", - "integrity": "sha512-kXuRi1mtaKMrsLUxz3sQYvVl37B0Ns6MzfrtV5DvJceE9bPyspOqk9xxv7XbZWcfLWbFmm997vl83qUWVJA64w==", "dev": true, "license": "BSD-3-Clause", "dependencies": { @@ -34612,8 +29182,6 @@ }, "node_modules/msw/node_modules/type-fest": { "version": "5.4.4", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-5.4.4.tgz", - "integrity": "sha512-JnTrzGu+zPV3aXIUhnyWJj4z/wigMsdYajGLIYakqyOW1nPllzXEJee0QQbHj+CTIQtXGlAjuK0UY+2xTyjVAw==", "dev": true, "license": "(MIT OR CC0-1.0)", "dependencies": { @@ -34628,8 +29196,6 @@ }, "node_modules/multicast-dns": { "version": "7.2.5", - "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-7.2.5.tgz", - "integrity": "sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg==", "license": "MIT", "dependencies": { "dns-packet": "^5.2.2", @@ -34641,14 +29207,10 @@ }, "node_modules/murmurhash": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/murmurhash/-/murmurhash-2.0.1.tgz", - "integrity": "sha512-5vQEh3y+DG/lMPM0mCGPDnyV8chYg/g7rl6v3Gd8WMF9S429ox3Xk8qrk174kWhG767KQMqqxLD1WnGd77hiew==", "license": "MIT" }, "node_modules/mute-stream": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-2.0.0.tgz", - "integrity": "sha512-WWdIxpyjEn+FhQJQQv9aQAYlHoNVdzIzUySNV1gHUPDSdZJ3yZn7pAAbQcV7B56Mvu881q9FZV+0Vx2xC44VWA==", "dev": true, "license": "ISC", "engines": { @@ -34657,8 +29219,6 @@ }, "node_modules/mz": { "version": "2.7.0", - "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", - "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", "license": "MIT", "dependencies": { "any-promise": "^1.0.0", @@ -34668,8 +29228,6 @@ }, "node_modules/nanoid": { "version": "3.3.11", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", - "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", "funding": [ { "type": "github", @@ -34686,15 +29244,11 @@ }, "node_modules/napi-build-utils": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-2.0.0.tgz", - "integrity": "sha512-GEbrYkbfF7MoNaoh2iGG84Mnf/WZfB0GdGEsM8wz7Expx/LlWf5U8t9nvJKXSp3qr5IsEbK04cBGhol/KwOsWA==", "dev": true, "license": "MIT" }, "node_modules/napi-postinstall": { "version": "0.3.4", - "resolved": "https://registry.npmjs.org/napi-postinstall/-/napi-postinstall-0.3.4.tgz", - "integrity": "sha512-PHI5f1O0EP5xJ9gQmFGMS6IZcrVvTjpXjz7Na41gTE7eE2hK11lg04CECCYEEjdc17EV4DO+fkGEtt7TpTaTiQ==", "license": "MIT", "bin": { "napi-postinstall": "lib/cli.js" @@ -34708,14 +29262,10 @@ }, "node_modules/natural-compare": { "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", "license": "MIT" }, "node_modules/negotiator": { "version": "0.6.3", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", - "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", "license": "MIT", "engines": { "node": ">= 0.6" @@ -34723,21 +29273,15 @@ }, "node_modules/neo-async": { "version": "2.6.2", - "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", - "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", "license": "MIT" }, "node_modules/nested-error-stacks": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/nested-error-stacks/-/nested-error-stacks-2.0.1.tgz", - "integrity": "sha512-SrQrok4CATudVzBS7coSz26QRSmlK9TzzoFbeKfcPBUFPjcQM9Rqvr/DlJkOrwI/0KcgvMub1n1g5Jt9EgRn4A==", "dev": true, "license": "MIT" }, "node_modules/new-date": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/new-date/-/new-date-1.0.3.tgz", - "integrity": "sha512-0fsVvQPbo2I18DT2zVHpezmeeNYV2JaJSrseiHLc17GNOxJzUdx5mvSigPu8LtIfZSij5i1wXnXFspEs2CD6hA==", "license": "SEE LICENSE IN LICENSE", "dependencies": { "@segment/isodate": "1.0.3" @@ -34745,8 +29289,6 @@ }, "node_modules/no-case": { "version": "3.0.4", - "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", - "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", "license": "MIT", "dependencies": { "lower-case": "^2.0.2", @@ -34755,8 +29297,6 @@ }, "node_modules/node-abi": { "version": "3.89.0", - "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.89.0.tgz", - "integrity": "sha512-6u9UwL0HlAl21+agMN3YAMXcKByMqwGx+pq+P76vii5f7hTPtKDp08/H9py6DY+cfDw7kQNTGEj/rly3IgbNQA==", "dev": true, "license": "MIT", "dependencies": { @@ -34768,16 +29308,11 @@ }, "node_modules/node-addon-api": { "version": "7.1.1", - "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-7.1.1.tgz", - "integrity": "sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==", "license": "MIT", "optional": true }, "node_modules/node-domexception": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz", - "integrity": "sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==", - "deprecated": "Use your platform's native DOMException instead", "funding": [ { "type": "github", @@ -34795,8 +29330,6 @@ }, "node_modules/node-emoji": { "version": "2.2.0", - "resolved": "https://registry.npmjs.org/node-emoji/-/node-emoji-2.2.0.tgz", - "integrity": "sha512-Z3lTE9pLaJF47NyMhd4ww1yFTAP8YhYI8SleJiHzM46Fgpm5cnNzSl9XfzFNqbaz+VlJrIj3fXQ4DeN1Rjm6cw==", "license": "MIT", "dependencies": { "@sindresorhus/is": "^4.6.0", @@ -34810,8 +29343,6 @@ }, "node_modules/node-exports-info": { "version": "1.6.0", - "resolved": "https://registry.npmjs.org/node-exports-info/-/node-exports-info-1.6.0.tgz", - "integrity": "sha512-pyFS63ptit/P5WqUkt+UUfe+4oevH+bFeIiPPdfb0pFeYEu/1ELnJu5l+5EcTKYL5M7zaAa7S8ddywgXypqKCw==", "license": "MIT", "dependencies": { "array.prototype.flatmap": "^1.3.3", @@ -34828,8 +29359,6 @@ }, "node_modules/node-exports-info/node_modules/semver": { "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "license": "ISC", "bin": { "semver": "bin/semver.js" @@ -34837,8 +29366,6 @@ }, "node_modules/node-fetch": { "version": "2.6.7", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", - "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", "license": "MIT", "dependencies": { "whatwg-url": "^5.0.0" @@ -34857,20 +29384,14 @@ }, "node_modules/node-fetch/node_modules/tr46": { "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", "license": "MIT" }, "node_modules/node-fetch/node_modules/webidl-conversions": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", "license": "BSD-2-Clause" }, "node_modules/node-fetch/node_modules/whatwg-url": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", - "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", "license": "MIT", "dependencies": { "tr46": "~0.0.3", @@ -34879,8 +29400,6 @@ }, "node_modules/node-gyp": { "version": "12.2.0", - "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-12.2.0.tgz", - "integrity": "sha512-q23WdzrQv48KozXlr0U1v9dwO/k59NHeSzn6loGcasyf0UnSrtzs8kRxM+mfwJSf0DkX0s43hcqgnSO4/VNthQ==", "license": "MIT", "dependencies": { "env-paths": "^2.2.0", @@ -34903,8 +29422,6 @@ }, "node_modules/node-gyp-build": { "version": "4.8.4", - "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.8.4.tgz", - "integrity": "sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ==", "license": "MIT", "bin": { "node-gyp-build": "bin.js", @@ -34914,8 +29431,6 @@ }, "node_modules/node-gyp-build-optional-packages": { "version": "5.2.2", - "resolved": "https://registry.npmjs.org/node-gyp-build-optional-packages/-/node-gyp-build-optional-packages-5.2.2.tgz", - "integrity": "sha512-s+w+rBWnpTMwSFbaE0UXsRlg7hU4FjekKU4eyAih5T8nJuNZT1nNsskXpxmeqSK9UzkBl6UgRlnKc8hz8IEqOw==", "license": "MIT", "optional": true, "dependencies": { @@ -34929,8 +29444,6 @@ }, "node_modules/node-gyp/node_modules/isexe": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-4.0.0.tgz", - "integrity": "sha512-FFUtZMpoZ8RqHS3XeXEmHWLA4thH+ZxCv2lOiPIn1Xc7CxrqhWzNSDzD+/chS/zbYezmiwWLdQC09JdQKmthOw==", "license": "BlueOak-1.0.0", "engines": { "node": ">=20" @@ -34938,8 +29451,6 @@ }, "node_modules/node-gyp/node_modules/which": { "version": "6.0.1", - "resolved": "https://registry.npmjs.org/which/-/which-6.0.1.tgz", - "integrity": "sha512-oGLe46MIrCRqX7ytPUf66EAYvdeMIZYn3WaocqqKZAxrBpkqHfL/qvTyJ/bTk5+AqHCjXmrv3CEWgy368zhRUg==", "license": "ISC", "dependencies": { "isexe": "^4.0.0" @@ -34953,20 +29464,14 @@ }, "node_modules/node-int64": { "version": "0.4.0", - "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", - "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==", "license": "MIT" }, "node_modules/node-releases": { "version": "2.0.27", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.27.tgz", - "integrity": "sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==", "license": "MIT" }, "node_modules/nopt": { "version": "9.0.0", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-9.0.0.tgz", - "integrity": "sha512-Zhq3a+yFKrYwSBluL4H9XP3m3y5uvQkB/09CwDruCiRmR/UJYnn9W4R48ry0uGC70aeTPKLynBtscP9efFFcPw==", "license": "ISC", "dependencies": { "abbrev": "^4.0.0" @@ -34980,8 +29485,6 @@ }, "node_modules/normalize-package-data": { "version": "2.5.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", - "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", "license": "BSD-2-Clause", "peer": true, "dependencies": { @@ -34993,15 +29496,11 @@ }, "node_modules/normalize-package-data/node_modules/hosted-git-info": { "version": "2.8.9", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", - "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", "license": "ISC", "peer": true }, "node_modules/normalize-package-data/node_modules/semver": { "version": "5.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", - "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", "license": "ISC", "peer": true, "bin": { @@ -35010,8 +29509,6 @@ }, "node_modules/normalize-path": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", "license": "MIT", "engines": { "node": ">=0.10.0" @@ -35019,8 +29516,6 @@ }, "node_modules/normalize-url": { "version": "8.1.1", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-8.1.1.tgz", - "integrity": "sha512-JYc0DPlpGWB40kH5g07gGTrYuMqV653k3uBKY6uITPWds3M0ov3GaWGp9lbE3Bzngx8+XkfzgvASb9vk9JDFXQ==", "license": "MIT", "engines": { "node": ">=14.16" @@ -35031,8 +29526,6 @@ }, "node_modules/npm-bundled": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-5.0.0.tgz", - "integrity": "sha512-JLSpbzh6UUXIEoqPsYBvVNVmyrjVZ1fzEFbqxKkTJQkWBO3xFzFT+KDnSKQWwOQNbuWRwt5LSD6HOTLGIWzfrw==", "license": "ISC", "dependencies": { "npm-normalize-package-bin": "^5.0.0" @@ -35043,8 +29536,6 @@ }, "node_modules/npm-install-checks": { "version": "8.0.0", - "resolved": "https://registry.npmjs.org/npm-install-checks/-/npm-install-checks-8.0.0.tgz", - "integrity": "sha512-ScAUdMpyzkbpxoNekQ3tNRdFI8SJ86wgKZSQZdUxT+bj0wVFpsEMWnkXP0twVe1gJyNF5apBWDJhhIbgrIViRA==", "license": "BSD-2-Clause", "dependencies": { "semver": "^7.1.1" @@ -35055,8 +29546,6 @@ }, "node_modules/npm-normalize-package-bin": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-5.0.0.tgz", - "integrity": "sha512-CJi3OS4JLsNMmr2u07OJlhcrPxCeOeP/4xq67aWNai6TNWWbTrlNDgl8NcFKVlcBKp18GPj+EzbNIgrBfZhsag==", "license": "ISC", "engines": { "node": "^20.17.0 || >=22.9.0" @@ -35064,8 +29553,6 @@ }, "node_modules/npm-package-arg": { "version": "13.0.2", - "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-13.0.2.tgz", - "integrity": "sha512-IciCE3SY3uE84Ld8WZU23gAPPV9rIYod4F+rc+vJ7h7cwAJt9Vk6TVsK60ry7Uj3SRS3bqRRIGuTp9YVlk6WNA==", "license": "ISC", "dependencies": { "hosted-git-info": "^9.0.0", @@ -35079,8 +29566,6 @@ }, "node_modules/npm-packlist": { "version": "10.0.4", - "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-10.0.4.tgz", - "integrity": "sha512-uMW73iajD8hiH4ZBxEV3HC+eTnppIqwakjOYuvgddnalIw2lJguKviK1pcUJDlIWm1wSJkchpDZDSVVsZEYRng==", "license": "ISC", "dependencies": { "ignore-walk": "^8.0.0", @@ -35092,8 +29577,6 @@ }, "node_modules/npm-pick-manifest": { "version": "11.0.3", - "resolved": "https://registry.npmjs.org/npm-pick-manifest/-/npm-pick-manifest-11.0.3.tgz", - "integrity": "sha512-buzyCfeoGY/PxKqmBqn1IUJrZnUi1VVJTdSSRPGI60tJdUhUoSQFhs0zycJokDdOznQentgrpf8LayEHyyYlqQ==", "license": "ISC", "dependencies": { "npm-install-checks": "^8.0.0", @@ -35107,8 +29590,6 @@ }, "node_modules/npm-registry-fetch": { "version": "19.1.1", - "resolved": "https://registry.npmjs.org/npm-registry-fetch/-/npm-registry-fetch-19.1.1.tgz", - "integrity": "sha512-TakBap6OM1w0H73VZVDf44iFXsOS3h+L4wVMXmbWOQroZgFhMch0juN6XSzBNlD965yIKvWg2dfu7NSiaYLxtw==", "license": "ISC", "dependencies": { "@npmcli/redact": "^4.0.0", @@ -35126,8 +29607,6 @@ }, "node_modules/npm-run-all2": { "version": "8.0.4", - "resolved": "https://registry.npmjs.org/npm-run-all2/-/npm-run-all2-8.0.4.tgz", - "integrity": "sha512-wdbB5My48XKp2ZfJUlhnLVihzeuA1hgBnqB2J9ahV77wLS+/YAJAlN8I+X3DIFIPZ3m5L7nplmlbhNiFDmXRDA==", "dev": true, "license": "MIT", "dependencies": { @@ -35153,8 +29632,6 @@ }, "node_modules/npm-run-all2/node_modules/isexe": { "version": "3.1.5", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-3.1.5.tgz", - "integrity": "sha512-6B3tLtFqtQS4ekarvLVMZ+X+VlvQekbe4taUkf/rhVO3d/h0M2rfARm/pXLcPEsjjMsFgrFgSrhQIxcSVrBz8w==", "dev": true, "license": "BlueOak-1.0.0", "engines": { @@ -35163,8 +29640,6 @@ }, "node_modules/npm-run-all2/node_modules/picomatch": { "version": "4.0.3", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", - "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", "dev": true, "license": "MIT", "engines": { @@ -35176,8 +29651,6 @@ }, "node_modules/npm-run-all2/node_modules/which": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/which/-/which-5.0.0.tgz", - "integrity": "sha512-JEdGzHwwkrbWoGOlIHqQ5gtprKGOenpDHpxE9zVR1bWbOtYRyPPHMe9FaP6x61CmNaTThSkb0DAJte5jD+DmzQ==", "dev": true, "license": "ISC", "dependencies": { @@ -35192,8 +29665,6 @@ }, "node_modules/npm-run-path": { "version": "4.0.1", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", - "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", "license": "MIT", "dependencies": { "path-key": "^3.0.0" @@ -35204,14 +29675,10 @@ }, "node_modules/nprogress": { "version": "0.2.0", - "resolved": "https://registry.npmjs.org/nprogress/-/nprogress-0.2.0.tgz", - "integrity": "sha512-I19aIingLgR1fmhftnbWWO3dXc0hSxqHQHQb3H8m+K3TnEn/iSeTZZOyvKXWqQESMwuUVnatlCnZdLBZZt2VSA==", "license": "MIT" }, "node_modules/nth-check": { "version": "2.1.1", - "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", - "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", "license": "BSD-2-Clause", "dependencies": { "boolbase": "^1.0.0" @@ -35222,8 +29689,6 @@ }, "node_modules/null-loader": { "version": "4.0.1", - "resolved": "https://registry.npmjs.org/null-loader/-/null-loader-4.0.1.tgz", - "integrity": "sha512-pxqVbi4U6N26lq+LmgIbB5XATP0VdZKOG25DhHi8btMmJJefGArFyDg1yc4U3hWCJbMqSrw0qyrz1UQX+qYXqg==", "license": "MIT", "dependencies": { "loader-utils": "^2.0.0", @@ -35242,8 +29707,6 @@ }, "node_modules/null-loader/node_modules/ajv": { "version": "6.14.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.14.0.tgz", - "integrity": "sha512-IWrosm/yrn43eiKqkfkHis7QioDleaXQHdDVPKg0FSwwd/DuvyX79TZnFOnYpB7dcsFAMmtFztZuXPDvSePkFw==", "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.1", @@ -35258,8 +29721,6 @@ }, "node_modules/null-loader/node_modules/ajv-keywords": { "version": "3.5.2", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", - "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", "license": "MIT", "peerDependencies": { "ajv": "^6.9.1" @@ -35267,14 +29728,10 @@ }, "node_modules/null-loader/node_modules/json-schema-traverse": { "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", "license": "MIT" }, "node_modules/null-loader/node_modules/schema-utils": { "version": "3.3.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", - "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", "license": "MIT", "dependencies": { "@types/json-schema": "^7.0.8", @@ -35291,26 +29748,18 @@ }, "node_modules/nwsapi": { "version": "2.2.23", - "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.23.tgz", - "integrity": "sha512-7wfH4sLbt4M0gCDzGE6vzQBo0bfTKjU7Sfpqy/7gs1qBfYz2vEJH6vXcBKpO3+6Yu1telwd0t9HpyOoLEQQbIQ==", "license": "MIT" }, "node_modules/oauth-1.0a": { "version": "2.2.6", - "resolved": "https://registry.npmjs.org/oauth-1.0a/-/oauth-1.0a-2.2.6.tgz", - "integrity": "sha512-6bkxv3N4Gu5lty4viIcIAnq5GbxECviMBeKR3WX/q87SPQ8E8aursPZUtsXDnxCs787af09WPRBLqYrf/lwoYQ==", "license": "MIT" }, "node_modules/obj-case": { "version": "0.2.1", - "resolved": "https://registry.npmjs.org/obj-case/-/obj-case-0.2.1.tgz", - "integrity": "sha512-PquYBBTy+Y6Ob/O2574XHhDtHJlV1cJHMCgW+rDRc9J5hhmRelJB3k5dTK/3cVmFVtzvAKuENeuLpoyTzMzkOg==", "license": "MIT" }, "node_modules/object-assign": { "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", "license": "MIT", "engines": { "node": ">=0.10.0" @@ -35318,8 +29767,6 @@ }, "node_modules/object-hash": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", - "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", "license": "MIT", "engines": { "node": ">= 6" @@ -35327,8 +29774,6 @@ }, "node_modules/object-inspect": { "version": "1.13.4", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", - "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", "license": "MIT", "engines": { "node": ">= 0.4" @@ -35339,8 +29784,6 @@ }, "node_modules/object-keys": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", "license": "MIT", "engines": { "node": ">= 0.4" @@ -35348,8 +29791,6 @@ }, "node_modules/object.assign": { "version": "4.1.7", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.7.tgz", - "integrity": "sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==", "license": "MIT", "dependencies": { "call-bind": "^1.0.8", @@ -35368,8 +29809,6 @@ }, "node_modules/object.entries": { "version": "1.1.9", - "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.9.tgz", - "integrity": "sha512-8u/hfXFRBD1O0hPUjioLhoWFHRmt6tKA4/vZPyckBr18l1KE9uHrFaFaUi8MDRTpi4uak2goyPTSNJLXX2k2Hw==", "license": "MIT", "dependencies": { "call-bind": "^1.0.8", @@ -35383,8 +29822,6 @@ }, "node_modules/object.fromentries": { "version": "2.0.8", - "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.8.tgz", - "integrity": "sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==", "license": "MIT", "dependencies": { "call-bind": "^1.0.7", @@ -35401,8 +29838,6 @@ }, "node_modules/object.values": { "version": "1.2.1", - "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.2.1.tgz", - "integrity": "sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA==", "license": "MIT", "dependencies": { "call-bind": "^1.0.8", @@ -35419,21 +29854,15 @@ }, "node_modules/objectorarray": { "version": "1.0.5", - "resolved": "https://registry.npmjs.org/objectorarray/-/objectorarray-1.0.5.tgz", - "integrity": "sha512-eJJDYkhJFFbBBAxeh8xW+weHlkI28n2ZdQV/J/DNfWfSKlGEf2xcfAbZTv3riEXHAhL9SVOTs2pRmXiSTf78xg==", "dev": true, "license": "ISC" }, "node_modules/obuf": { "version": "1.1.2", - "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", - "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==", "license": "MIT" }, "node_modules/on-finished": { "version": "2.4.1", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", - "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", "license": "MIT", "dependencies": { "ee-first": "1.1.1" @@ -35444,8 +29873,6 @@ }, "node_modules/on-headers": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.1.0.tgz", - "integrity": "sha512-737ZY3yNnXy37FHkQxPzt4UZ2UWPWiCZWLvFZ4fu5cueciegX0zGPnrlY6bwRg4FdQOe9YU8MkmJwGhoMybl8A==", "license": "MIT", "engines": { "node": ">= 0.8" @@ -35453,8 +29880,6 @@ }, "node_modules/once": { "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", "license": "ISC", "dependencies": { "wrappy": "1" @@ -35462,8 +29887,6 @@ }, "node_modules/onetime": { "version": "7.0.0", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-7.0.0.tgz", - "integrity": "sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==", "dev": true, "license": "MIT", "dependencies": { @@ -35478,14 +29901,10 @@ }, "node_modules/oniguruma-parser": { "version": "0.12.2", - "resolved": "https://registry.npmjs.org/oniguruma-parser/-/oniguruma-parser-0.12.2.tgz", - "integrity": "sha512-6HVa5oIrgMC6aA6WF6XyyqbhRPJrKR02L20+2+zpDtO5QAzGHAUGw5TKQvwi5vctNnRHkJYmjAhRVQF2EKdTQw==", "license": "MIT" }, "node_modules/oniguruma-to-es": { "version": "4.3.6", - "resolved": "https://registry.npmjs.org/oniguruma-to-es/-/oniguruma-to-es-4.3.6.tgz", - "integrity": "sha512-csuQ9x3Yr0cEIs/Zgx/OEt9iBw9vqIunAPQkx19R/fiMq2oGVTgcMqO/V3Ybqefr1TBvosI6jU539ksaBULJyA==", "license": "MIT", "dependencies": { "oniguruma-parser": "^0.12.2", @@ -35495,8 +29914,6 @@ }, "node_modules/open": { "version": "8.4.2", - "resolved": "https://registry.npmjs.org/open/-/open-8.4.2.tgz", - "integrity": "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==", "license": "MIT", "dependencies": { "define-lazy-prop": "^2.0.0", @@ -35512,8 +29929,6 @@ }, "node_modules/openapi-fetch": { "version": "0.17.0", - "resolved": "https://registry.npmjs.org/openapi-fetch/-/openapi-fetch-0.17.0.tgz", - "integrity": "sha512-PsbZR1wAPcG91eEthKhN+Zn92FMHxv+/faECIwjXdxfTODGSGegYv0sc1Olz+HYPvKOuoXfp+0pA2XVt2cI0Ig==", "license": "MIT", "dependencies": { "openapi-typescript-helpers": "^0.1.0" @@ -35521,8 +29936,6 @@ }, "node_modules/openapi-typescript": { "version": "7.13.0", - "resolved": "https://registry.npmjs.org/openapi-typescript/-/openapi-typescript-7.13.0.tgz", - "integrity": "sha512-EFP392gcqXS7ntPvbhBzbF8TyBA+baIYEm791Hy5YkjDYKTnk/Tn5OQeKm5BIZvJihpp8Zzr4hzx0Irde1LNGQ==", "dev": true, "license": "MIT", "dependencies": { @@ -35542,14 +29955,10 @@ }, "node_modules/openapi-typescript-helpers": { "version": "0.1.0", - "resolved": "https://registry.npmjs.org/openapi-typescript-helpers/-/openapi-typescript-helpers-0.1.0.tgz", - "integrity": "sha512-OKTGPthhivLw/fHz6c3OPtg72vi86qaMlqbJuVJ23qOvQ+53uw1n7HdmkJFibloF7QEjDrDkzJiOJuockM/ljw==", "license": "MIT" }, "node_modules/openapi-typescript/node_modules/parse-json": { "version": "8.3.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-8.3.0.tgz", - "integrity": "sha512-ybiGyvspI+fAoRQbIPRddCcSTV9/LsJbf0e/S85VLowVGzRmokfneg2kwVW/KU5rOXrPSbF1qAKPMgNTqqROQQ==", "dev": true, "license": "MIT", "dependencies": { @@ -35566,8 +29975,6 @@ }, "node_modules/openapi-typescript/node_modules/supports-color": { "version": "10.2.2", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-10.2.2.tgz", - "integrity": "sha512-SS+jx45GF1QjgEXQx4NJZV9ImqmO2NPz5FNsIHrsDjh2YsHnawpan7SNQ1o8NuhrbHZy9AZhIoCUiCeaW/C80g==", "dev": true, "license": "MIT", "engines": { @@ -35579,8 +29986,6 @@ }, "node_modules/openapi-typescript/node_modules/type-fest": { "version": "4.41.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.41.0.tgz", - "integrity": "sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==", "dev": true, "license": "(MIT OR CC0-1.0)", "engines": { @@ -35592,8 +29997,6 @@ }, "node_modules/opener": { "version": "1.5.2", - "resolved": "https://registry.npmjs.org/opener/-/opener-1.5.2.tgz", - "integrity": "sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A==", "license": "(WTFPL OR MIT)", "bin": { "opener": "bin/opener-bin.js" @@ -35601,8 +30004,6 @@ }, "node_modules/optionator": { "version": "0.9.4", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", - "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", "license": "MIT", "dependencies": { "deep-is": "^0.1.3", @@ -35618,8 +30019,6 @@ }, "node_modules/os-homedir": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", - "integrity": "sha512-B5JU3cabzk8c67mRRd3ECmROafjYMXbuzlwtqdM8IbS8ktlTix8aFGb2bAGKrSRIlnfKwovGUUr72JUPyOb6kQ==", "license": "MIT", "engines": { "node": ">=0.10.0" @@ -35627,22 +30026,16 @@ }, "node_modules/outdent": { "version": "0.5.0", - "resolved": "https://registry.npmjs.org/outdent/-/outdent-0.5.0.tgz", - "integrity": "sha512-/jHxFIzoMXdqPzTaCpFzAAWhpkSjZPF4Vsn6jAfNpmbH/ymsmd7Qc6VE9BGn0L6YMj6uwpQLxCECpus4ukKS9Q==", "dev": true, "license": "MIT" }, "node_modules/outvariant": { "version": "1.4.3", - "resolved": "https://registry.npmjs.org/outvariant/-/outvariant-1.4.3.tgz", - "integrity": "sha512-+Sl2UErvtsoajRDKCE5/dBz4DIvHXQQnAxtQTF04OJxY0+DyZXSo5P5Bb7XYWOh81syohlYL24hbDwxedPUJCA==", "dev": true, "license": "MIT" }, "node_modules/own-keys": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/own-keys/-/own-keys-1.0.1.tgz", - "integrity": "sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==", "license": "MIT", "dependencies": { "get-intrinsic": "^1.2.6", @@ -35658,8 +30051,6 @@ }, "node_modules/p-cancelable": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-3.0.0.tgz", - "integrity": "sha512-mlVgR3PGuzlo0MmTdk4cXqXWlwQDLnONTAg6sm62XkMJEiRxN3GL3SffkYvqwonbkJBcrI7Uvv5Zh9yjvn2iUw==", "license": "MIT", "engines": { "node": ">=12.20" @@ -35667,8 +30058,6 @@ }, "node_modules/p-defer": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-3.0.0.tgz", - "integrity": "sha512-ugZxsxmtTln604yeYd29EGrNhazN2lywetzpKhfmQjW/VJmhpDmWbiX+h0zL8V91R0UXkhb3KtPmyq9PZw3aYw==", "license": "MIT", "engines": { "node": ">=8" @@ -35676,8 +30065,6 @@ }, "node_modules/p-filter": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/p-filter/-/p-filter-2.1.0.tgz", - "integrity": "sha512-ZBxxZ5sL2HghephhpGAQdoskxplTwr7ICaehZwLIlfL6acuVgZPm8yBNuRAFBGEqtD/hmUeq9eqLg2ys9Xr/yw==", "dev": true, "license": "MIT", "dependencies": { @@ -35689,8 +30076,6 @@ }, "node_modules/p-finally": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", - "integrity": "sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==", "license": "MIT", "engines": { "node": ">=4" @@ -35698,8 +30083,6 @@ }, "node_modules/p-limit": { "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", "license": "MIT", "dependencies": { "p-try": "^2.0.0" @@ -35713,8 +30096,6 @@ }, "node_modules/p-locate": { "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", "license": "MIT", "dependencies": { "p-limit": "^2.2.0" @@ -35725,8 +30106,6 @@ }, "node_modules/p-map": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-2.1.0.tgz", - "integrity": "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==", "dev": true, "license": "MIT", "engines": { @@ -35735,8 +30114,6 @@ }, "node_modules/p-queue": { "version": "6.6.2", - "resolved": "https://registry.npmjs.org/p-queue/-/p-queue-6.6.2.tgz", - "integrity": "sha512-RwFpb72c/BhQLEXIZ5K2e+AhgNVmIejGlTgiB9MzZ0e93GRvqZ7uSi0dvRF7/XIXDeNkra2fNHBxTyPDGySpjQ==", "license": "MIT", "dependencies": { "eventemitter3": "^4.0.4", @@ -35751,14 +30128,10 @@ }, "node_modules/p-queue/node_modules/eventemitter3": { "version": "4.0.7", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", - "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", "license": "MIT" }, "node_modules/p-retry": { "version": "6.2.1", - "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-6.2.1.tgz", - "integrity": "sha512-hEt02O4hUct5wtwg4H4KcWgDdm+l1bOaEy/hWzd8xtXB9BqxTWBBhb+2ImAtH4Cv4rPjV76xN3Zumqk3k3AhhQ==", "license": "MIT", "dependencies": { "@types/retry": "0.12.2", @@ -35774,8 +30147,6 @@ }, "node_modules/p-timeout": { "version": "3.2.0", - "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-3.2.0.tgz", - "integrity": "sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg==", "license": "MIT", "dependencies": { "p-finally": "^1.0.0" @@ -35786,8 +30157,6 @@ }, "node_modules/p-try": { "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", "license": "MIT", "engines": { "node": ">=6" @@ -35795,8 +30164,6 @@ }, "node_modules/package-json": { "version": "8.1.1", - "resolved": "https://registry.npmjs.org/package-json/-/package-json-8.1.1.tgz", - "integrity": "sha512-cbH9IAIJHNj9uXi196JVsRlt7cHKak6u/e6AkL/bkRelZ7rlL3X1YKxsZwa36xipOEKAsdtmaG6aAJoM1fx2zA==", "license": "MIT", "dependencies": { "got": "^12.1.0", @@ -35813,14 +30180,10 @@ }, "node_modules/package-json-from-dist": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", - "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==", "license": "BlueOak-1.0.0" }, "node_modules/package-json/node_modules/registry-url": { "version": "6.0.1", - "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-6.0.1.tgz", - "integrity": "sha512-+crtS5QjFRqFCoQmvGduwYWEBng99ZvmFvF+cUJkGYF1L1BfU8C6Zp9T7f5vPAwyLkUExpvK+ANVZmGU49qi4Q==", "license": "MIT", "dependencies": { "rc": "1.2.8" @@ -35834,8 +30197,6 @@ }, "node_modules/package-manager-detector": { "version": "0.2.11", - "resolved": "https://registry.npmjs.org/package-manager-detector/-/package-manager-detector-0.2.11.tgz", - "integrity": "sha512-BEnLolu+yuz22S56CU1SUKq3XC3PkwD5wv4ikR4MfGvnRVcmzXR9DwSlW2fEamyTPyXHomBJRzgapeuBvRNzJQ==", "dev": true, "license": "MIT", "dependencies": { @@ -35844,8 +30205,6 @@ }, "node_modules/pacote": { "version": "21.4.0", - "resolved": "https://registry.npmjs.org/pacote/-/pacote-21.4.0.tgz", - "integrity": "sha512-DR7mn7HUOomAX1BORnpYy678qVIidbvOojkBscqy27dRKN+s/hLeQT1MeYYrx1Cxh62jyKjiWiDV7RTTqB+ZEQ==", "license": "ISC", "dependencies": { "@gar/promise-retry": "^1.0.0", @@ -35875,8 +30234,6 @@ }, "node_modules/param-case": { "version": "3.0.4", - "resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz", - "integrity": "sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==", "license": "MIT", "dependencies": { "dot-case": "^3.0.4", @@ -35885,8 +30242,6 @@ }, "node_modules/parent-module": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", "license": "MIT", "dependencies": { "callsites": "^3.0.0" @@ -35897,8 +30252,6 @@ }, "node_modules/parse-author": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/parse-author/-/parse-author-2.0.0.tgz", - "integrity": "sha512-yx5DfvkN8JsHL2xk2Os9oTia467qnvRgey4ahSm2X8epehBLx/gWLcy5KI+Y36ful5DzGbCS6RazqZGgy1gHNw==", "dev": true, "license": "MIT", "dependencies": { @@ -35910,8 +30263,6 @@ }, "node_modules/parse-entities": { "version": "4.0.2", - "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-4.0.2.tgz", - "integrity": "sha512-GG2AQYWoLgL877gQIKeRPGO1xF9+eG1ujIb5soS5gPvLQ1y2o8FL90w2QWNdf9I361Mpp7726c+lj3U0qK1uGw==", "license": "MIT", "dependencies": { "@types/unist": "^2.0.0", @@ -35929,14 +30280,10 @@ }, "node_modules/parse-entities/node_modules/@types/unist": { "version": "2.0.11", - "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.11.tgz", - "integrity": "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==", "license": "MIT" }, "node_modules/parse-github-url": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/parse-github-url/-/parse-github-url-1.0.2.tgz", - "integrity": "sha512-kgBf6avCbO3Cn6+RnzRGLkUsv4ZVqv/VfAYkRsyBcgkshNvVBkRn1FEZcW0Jb+npXQWm2vHPnnOqFteZxRRGNw==", "dev": true, "license": "MIT", "bin": { @@ -35948,8 +30295,6 @@ }, "node_modules/parse-json": { "version": "5.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", - "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", "license": "MIT", "dependencies": { "@babel/code-frame": "^7.0.0", @@ -35966,14 +30311,10 @@ }, "node_modules/parse-json/node_modules/json-parse-even-better-errors": { "version": "2.3.1", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", "license": "MIT" }, "node_modules/parse-ms": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/parse-ms/-/parse-ms-2.1.0.tgz", - "integrity": "sha512-kHt7kzLoS9VBZfUsiKjv43mr91ea+U05EyKkEtqp7vNbHxmaVuEqN7XxeEVnGrMtYOAxGrDElSi96K7EgO1zCA==", "dev": true, "license": "MIT", "engines": { @@ -35982,14 +30323,10 @@ }, "node_modules/parse-numeric-range": { "version": "1.3.0", - "resolved": "https://registry.npmjs.org/parse-numeric-range/-/parse-numeric-range-1.3.0.tgz", - "integrity": "sha512-twN+njEipszzlMJd4ONUYgSfZPDxgHhT9Ahed5uTigpQn90FggW4SA/AIPq/6a149fTbE9qBEcSwE3FAEp6wQQ==", "license": "ISC" }, "node_modules/parse5": { "version": "7.3.0", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.3.0.tgz", - "integrity": "sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==", "license": "MIT", "dependencies": { "entities": "^6.0.0" @@ -36000,8 +30337,6 @@ }, "node_modules/parse5-htmlparser2-tree-adapter": { "version": "7.1.0", - "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-7.1.0.tgz", - "integrity": "sha512-ruw5xyKs6lrpo9x9rCZqZZnIUntICjQAd0Wsmp396Ul9lN/h+ifgVV1x1gZHi8euej6wTfpqX8j+BFQxF0NS/g==", "license": "MIT", "dependencies": { "domhandler": "^5.0.3", @@ -36013,8 +30348,6 @@ }, "node_modules/parse5-parser-stream": { "version": "7.1.2", - "resolved": "https://registry.npmjs.org/parse5-parser-stream/-/parse5-parser-stream-7.1.2.tgz", - "integrity": "sha512-JyeQc9iwFLn5TbvvqACIF/VXG6abODeB3Fwmv/TGdLk2LfbWkaySGY72at4+Ty7EkPZj854u4CrICqNk2qIbow==", "license": "MIT", "dependencies": { "parse5": "^7.0.0" @@ -36025,8 +30358,6 @@ }, "node_modules/parse5/node_modules/entities": { "version": "6.0.1", - "resolved": "https://registry.npmjs.org/entities/-/entities-6.0.1.tgz", - "integrity": "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==", "license": "BSD-2-Clause", "engines": { "node": ">=0.12" @@ -36037,8 +30368,6 @@ }, "node_modules/parseurl": { "version": "1.3.3", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", - "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", "license": "MIT", "engines": { "node": ">= 0.8" @@ -36046,8 +30375,6 @@ }, "node_modules/pascal-case": { "version": "3.1.2", - "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz", - "integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==", "license": "MIT", "dependencies": { "no-case": "^3.0.4", @@ -36056,14 +30383,10 @@ }, "node_modules/path-data-parser": { "version": "0.1.0", - "resolved": "https://registry.npmjs.org/path-data-parser/-/path-data-parser-0.1.0.tgz", - "integrity": "sha512-NOnmBpt5Y2RWbuv0LMzsayp3lVylAHLPUTut412ZA3l+C4uw4ZVkQbjShYCQ8TCpUMdPapr4YjUqLYD6v68j+w==", "license": "MIT" }, "node_modules/path-exists": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", "license": "MIT", "engines": { "node": ">=8" @@ -36071,8 +30394,6 @@ }, "node_modules/path-expression-matcher": { "version": "1.5.0", - "resolved": "https://registry.npmjs.org/path-expression-matcher/-/path-expression-matcher-1.5.0.tgz", - "integrity": "sha512-cbrerZV+6rvdQrrD+iGMcZFEiiSrbv9Tfdkvnusy6y0x0GKBXREFg/Y65GhIfm0tnLntThhzCnfKwp1WRjeCyQ==", "funding": [ { "type": "github", @@ -36086,8 +30407,6 @@ }, "node_modules/path-is-absolute": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", "license": "MIT", "engines": { "node": ">=0.10.0" @@ -36095,14 +30414,10 @@ }, "node_modules/path-is-inside": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", - "integrity": "sha512-DUWJr3+ULp4zXmol/SZkFf3JGsS9/SIv+Y3Rt93/UjPpDpklB5f1er4O3POIbUuUJ3FXgqte2Q7SrU6zAqwk8w==", "license": "(WTFPL OR MIT)" }, "node_modules/path-key": { "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", "license": "MIT", "engines": { "node": ">=8" @@ -36110,14 +30425,10 @@ }, "node_modules/path-parse": { "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", "license": "MIT" }, "node_modules/path-scurry": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-2.0.2.tgz", - "integrity": "sha512-3O/iVVsJAPsOnpwWIeD+d6z/7PmqApyQePUtCndjatj/9I5LylHvt5qluFaBT3I5h3r1ejfR056c+FCv+NnNXg==", "license": "BlueOak-1.0.0", "dependencies": { "lru-cache": "^11.0.0", @@ -36132,8 +30443,6 @@ }, "node_modules/path-scurry/node_modules/lru-cache": { "version": "11.2.6", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.2.6.tgz", - "integrity": "sha512-ESL2CrkS/2wTPfuend7Zhkzo2u0daGJ/A2VucJOgQ/C48S/zB8MMeMHSGKYpXhIjbPxfuezITkaBH1wqv00DDQ==", "license": "BlueOak-1.0.0", "engines": { "node": "20 || >=22" @@ -36141,14 +30450,10 @@ }, "node_modules/path-to-regexp": { "version": "0.1.12", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.12.tgz", - "integrity": "sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==", "license": "MIT" }, "node_modules/path-type": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", "license": "MIT", "engines": { "node": ">=8" @@ -36156,14 +30461,10 @@ }, "node_modules/pathe": { "version": "2.0.3", - "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", - "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", "license": "MIT" }, "node_modules/pathval": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pathval/-/pathval-2.0.1.tgz", - "integrity": "sha512-//nshmD55c46FuFw26xV/xFAaB5HF9Xdap7HJBBnrKdAd6/GxDBaNA1870O79+9ueg61cZLSVc+OaFlfmObYVQ==", "dev": true, "license": "MIT", "engines": { @@ -36172,14 +30473,10 @@ }, "node_modules/picocolors": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", - "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", "license": "ISC" }, "node_modules/picomatch": { "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", "license": "MIT", "engines": { "node": ">=8.6" @@ -36190,8 +30487,6 @@ }, "node_modules/pidtree": { "version": "0.6.0", - "resolved": "https://registry.npmjs.org/pidtree/-/pidtree-0.6.0.tgz", - "integrity": "sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g==", "dev": true, "license": "MIT", "bin": { @@ -36203,8 +30498,6 @@ }, "node_modules/pify": { "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", "dev": true, "license": "MIT", "engines": { @@ -36213,8 +30506,6 @@ }, "node_modules/pirates": { "version": "4.0.7", - "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.7.tgz", - "integrity": "sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==", "license": "MIT", "engines": { "node": ">= 6" @@ -36222,8 +30513,6 @@ }, "node_modules/pkce-challenge": { "version": "5.0.1", - "resolved": "https://registry.npmjs.org/pkce-challenge/-/pkce-challenge-5.0.1.tgz", - "integrity": "sha512-wQ0b/W4Fr01qtpHlqSqspcj3EhBvimsdh0KlHhH8HRZnMsEa0ea2fTULOXOS9ccQr3om+GcGRk4e+isrZWV8qQ==", "license": "MIT", "engines": { "node": ">=16.20.0" @@ -36231,8 +30520,6 @@ }, "node_modules/pkg-conf": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/pkg-conf/-/pkg-conf-2.1.0.tgz", - "integrity": "sha512-C+VUP+8jis7EsQZIhDYmS5qlNtjv2yP4SNtjXK9AP1ZcTRlnSfuumaTnRfYZnYgUUYVIKqL0fRvmUGDV2fmp6g==", "dev": true, "license": "MIT", "dependencies": { @@ -36245,8 +30532,6 @@ }, "node_modules/pkg-conf/node_modules/find-up": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ==", "dev": true, "license": "MIT", "dependencies": { @@ -36258,8 +30543,6 @@ }, "node_modules/pkg-conf/node_modules/locate-path": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", - "integrity": "sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA==", "dev": true, "license": "MIT", "dependencies": { @@ -36272,8 +30555,6 @@ }, "node_modules/pkg-conf/node_modules/p-limit": { "version": "1.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", - "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", "dev": true, "license": "MIT", "dependencies": { @@ -36285,8 +30566,6 @@ }, "node_modules/pkg-conf/node_modules/p-locate": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", - "integrity": "sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg==", "dev": true, "license": "MIT", "dependencies": { @@ -36298,8 +30577,6 @@ }, "node_modules/pkg-conf/node_modules/p-try": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", - "integrity": "sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww==", "dev": true, "license": "MIT", "engines": { @@ -36308,8 +30585,6 @@ }, "node_modules/pkg-conf/node_modules/path-exists": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", "dev": true, "license": "MIT", "engines": { @@ -36318,8 +30593,6 @@ }, "node_modules/pkg-dir": { "version": "7.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-7.0.0.tgz", - "integrity": "sha512-Ie9z/WINcxxLp27BKOCHGde4ITq9UklYKDzVo1nhk5sqGEXU3FpkwP5GM2voTGJkGd9B3Otl+Q4uwSOeSUtOBA==", "license": "MIT", "dependencies": { "find-up": "^6.3.0" @@ -36333,8 +30606,6 @@ }, "node_modules/pkg-dir/node_modules/find-up": { "version": "6.3.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-6.3.0.tgz", - "integrity": "sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw==", "license": "MIT", "dependencies": { "locate-path": "^7.1.0", @@ -36349,8 +30620,6 @@ }, "node_modules/pkg-dir/node_modules/locate-path": { "version": "7.2.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-7.2.0.tgz", - "integrity": "sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==", "license": "MIT", "dependencies": { "p-locate": "^6.0.0" @@ -36364,8 +30633,6 @@ }, "node_modules/pkg-dir/node_modules/p-limit": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-4.0.0.tgz", - "integrity": "sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==", "license": "MIT", "dependencies": { "yocto-queue": "^1.0.0" @@ -36379,8 +30646,6 @@ }, "node_modules/pkg-dir/node_modules/p-locate": { "version": "6.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-6.0.0.tgz", - "integrity": "sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==", "license": "MIT", "dependencies": { "p-limit": "^4.0.0" @@ -36394,8 +30659,6 @@ }, "node_modules/pkg-dir/node_modules/path-exists": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-5.0.0.tgz", - "integrity": "sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==", "license": "MIT", "engines": { "node": "^12.20.0 || ^14.13.1 || >=16.0.0" @@ -36403,8 +30666,6 @@ }, "node_modules/pkg-dir/node_modules/yocto-queue": { "version": "1.2.2", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.2.2.tgz", - "integrity": "sha512-4LCcse/U2MHZ63HAJVE+v71o7yOdIe4cZ70Wpf8D/IyjDKYQLV5GD46B+hSTjJsvV5PztjvHoU580EftxjDZFQ==", "license": "MIT", "engines": { "node": ">=12.20" @@ -36415,8 +30676,6 @@ }, "node_modules/pkg-types": { "version": "1.3.1", - "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-1.3.1.tgz", - "integrity": "sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==", "license": "MIT", "dependencies": { "confbox": "^0.1.8", @@ -36426,8 +30685,6 @@ }, "node_modules/pkijs": { "version": "3.3.3", - "resolved": "https://registry.npmjs.org/pkijs/-/pkijs-3.3.3.tgz", - "integrity": "sha512-+KD8hJtqQMYoTuL1bbGOqxb4z+nZkTAwVdNtWwe8Tc2xNbEmdJYIYoc6Qt0uF55e6YW6KuTHw1DjQ18gMhzepw==", "license": "BSD-3-Clause", "dependencies": { "@noble/hashes": "1.4.0", @@ -36443,8 +30700,6 @@ }, "node_modules/pluralize": { "version": "8.0.0", - "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-8.0.0.tgz", - "integrity": "sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==", "dev": true, "license": "MIT", "engines": { @@ -36453,14 +30708,10 @@ }, "node_modules/points-on-curve": { "version": "0.2.0", - "resolved": "https://registry.npmjs.org/points-on-curve/-/points-on-curve-0.2.0.tgz", - "integrity": "sha512-0mYKnYYe9ZcqMCWhUjItv/oHjvgEsfKvnUTg8sAtnHr3GVy7rGkXCb6d5cSyqrWqL4k81b9CPg3urd+T7aop3A==", "license": "MIT" }, "node_modules/points-on-path": { "version": "0.2.1", - "resolved": "https://registry.npmjs.org/points-on-path/-/points-on-path-0.2.1.tgz", - "integrity": "sha512-25ClnWWuw7JbWZcgqY/gJ4FQWadKxGWk+3kR/7kD0tCaDtPPMj7oHu2ToLaVhfpnHrZzYby2w6tUA0eOIuUg8g==", "license": "MIT", "dependencies": { "path-data-parser": "0.1.0", @@ -36469,8 +30720,6 @@ }, "node_modules/possible-typed-array-names": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz", - "integrity": "sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==", "license": "MIT", "engines": { "node": ">= 0.4" @@ -36478,8 +30727,6 @@ }, "node_modules/postcss": { "version": "8.5.6", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz", - "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==", "funding": [ { "type": "opencollective", @@ -36506,8 +30753,6 @@ }, "node_modules/postcss-attribute-case-insensitive": { "version": "7.0.1", - "resolved": "https://registry.npmjs.org/postcss-attribute-case-insensitive/-/postcss-attribute-case-insensitive-7.0.1.tgz", - "integrity": "sha512-Uai+SupNSqzlschRyNx3kbCTWgY/2hcwtHEI/ej2LJWc9JJ77qKgGptd8DHwY1mXtZ7Aoh4z4yxfwMBue9eNgw==", "funding": [ { "type": "github", @@ -36531,8 +30776,6 @@ }, "node_modules/postcss-attribute-case-insensitive/node_modules/postcss-selector-parser": { "version": "7.1.1", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.1.tgz", - "integrity": "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==", "license": "MIT", "dependencies": { "cssesc": "^3.0.0", @@ -36544,8 +30787,6 @@ }, "node_modules/postcss-calc": { "version": "9.0.1", - "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-9.0.1.tgz", - "integrity": "sha512-TipgjGyzP5QzEhsOZUaIkeO5mKeMFpebWzRogWG/ysonUlnHcq5aJe0jOjpfzUU8PeSaBQnrE8ehR0QA5vs8PQ==", "license": "MIT", "dependencies": { "postcss-selector-parser": "^6.0.11", @@ -36560,8 +30801,6 @@ }, "node_modules/postcss-calc/node_modules/postcss-selector-parser": { "version": "6.1.2", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz", - "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==", "license": "MIT", "dependencies": { "cssesc": "^3.0.0", @@ -36573,8 +30812,6 @@ }, "node_modules/postcss-clamp": { "version": "4.1.0", - "resolved": "https://registry.npmjs.org/postcss-clamp/-/postcss-clamp-4.1.0.tgz", - "integrity": "sha512-ry4b1Llo/9zz+PKC+030KUnPITTJAHeOwjfAyyB60eT0AorGLdzp52s31OsPRHRf8NchkgFoG2y6fCfn1IV1Ow==", "license": "MIT", "dependencies": { "postcss-value-parser": "^4.2.0" @@ -36588,8 +30825,6 @@ }, "node_modules/postcss-color-functional-notation": { "version": "7.0.12", - "resolved": "https://registry.npmjs.org/postcss-color-functional-notation/-/postcss-color-functional-notation-7.0.12.tgz", - "integrity": "sha512-TLCW9fN5kvO/u38/uesdpbx3e8AkTYhMvDZYa9JpmImWuTE99bDQ7GU7hdOADIZsiI9/zuxfAJxny/khknp1Zw==", "funding": [ { "type": "github", @@ -36617,8 +30852,6 @@ }, "node_modules/postcss-color-hex-alpha": { "version": "10.0.0", - "resolved": "https://registry.npmjs.org/postcss-color-hex-alpha/-/postcss-color-hex-alpha-10.0.0.tgz", - "integrity": "sha512-1kervM2cnlgPs2a8Vt/Qbe5cQ++N7rkYo/2rz2BkqJZIHQwaVuJgQH38REHrAi4uM0b1fqxMkWYmese94iMp3w==", "funding": [ { "type": "github", @@ -36643,8 +30876,6 @@ }, "node_modules/postcss-color-rebeccapurple": { "version": "10.0.0", - "resolved": "https://registry.npmjs.org/postcss-color-rebeccapurple/-/postcss-color-rebeccapurple-10.0.0.tgz", - "integrity": "sha512-JFta737jSP+hdAIEhk1Vs0q0YF5P8fFcj+09pweS8ktuGuZ8pPlykHsk6mPxZ8awDl4TrcxUqJo9l1IhVr/OjQ==", "funding": [ { "type": "github", @@ -36669,8 +30900,6 @@ }, "node_modules/postcss-colormin": { "version": "6.1.0", - "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-6.1.0.tgz", - "integrity": "sha512-x9yX7DOxeMAR+BgGVnNSAxmAj98NX/YxEMNFP+SDCEeNLb2r3i6Hh1ksMsnW8Ub5SLCpbescQqn9YEbE9554Sw==", "license": "MIT", "dependencies": { "browserslist": "^4.23.0", @@ -36687,8 +30916,6 @@ }, "node_modules/postcss-convert-values": { "version": "6.1.0", - "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-6.1.0.tgz", - "integrity": "sha512-zx8IwP/ts9WvUM6NkVSkiU902QZL1bwPhaVaLynPtCsOTqp+ZKbNi+s6XJg3rfqpKGA/oc7Oxk5t8pOQJcwl/w==", "license": "MIT", "dependencies": { "browserslist": "^4.23.0", @@ -36703,8 +30930,6 @@ }, "node_modules/postcss-custom-media": { "version": "11.0.6", - "resolved": "https://registry.npmjs.org/postcss-custom-media/-/postcss-custom-media-11.0.6.tgz", - "integrity": "sha512-C4lD4b7mUIw+RZhtY7qUbf4eADmb7Ey8BFA2px9jUbwg7pjTZDl4KY4bvlUV+/vXQvzQRfiGEVJyAbtOsCMInw==", "funding": [ { "type": "github", @@ -36731,8 +30956,6 @@ }, "node_modules/postcss-custom-properties": { "version": "14.0.6", - "resolved": "https://registry.npmjs.org/postcss-custom-properties/-/postcss-custom-properties-14.0.6.tgz", - "integrity": "sha512-fTYSp3xuk4BUeVhxCSJdIPhDLpJfNakZKoiTDx7yRGCdlZrSJR7mWKVOBS4sBF+5poPQFMj2YdXx1VHItBGihQ==", "funding": [ { "type": "github", @@ -36760,8 +30983,6 @@ }, "node_modules/postcss-custom-selectors": { "version": "8.0.5", - "resolved": "https://registry.npmjs.org/postcss-custom-selectors/-/postcss-custom-selectors-8.0.5.tgz", - "integrity": "sha512-9PGmckHQswiB2usSO6XMSswO2yFWVoCAuih1yl9FVcwkscLjRKjwsjM3t+NIWpSU2Jx3eOiK2+t4vVTQaoCHHg==", "funding": [ { "type": "github", @@ -36788,8 +31009,6 @@ }, "node_modules/postcss-custom-selectors/node_modules/postcss-selector-parser": { "version": "7.1.1", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.1.tgz", - "integrity": "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==", "license": "MIT", "dependencies": { "cssesc": "^3.0.0", @@ -36801,8 +31020,6 @@ }, "node_modules/postcss-dir-pseudo-class": { "version": "9.0.1", - "resolved": "https://registry.npmjs.org/postcss-dir-pseudo-class/-/postcss-dir-pseudo-class-9.0.1.tgz", - "integrity": "sha512-tRBEK0MHYvcMUrAuYMEOa0zg9APqirBcgzi6P21OhxtJyJADo/SWBwY1CAwEohQ/6HDaa9jCjLRG7K3PVQYHEA==", "funding": [ { "type": "github", @@ -36826,8 +31043,6 @@ }, "node_modules/postcss-dir-pseudo-class/node_modules/postcss-selector-parser": { "version": "7.1.1", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.1.tgz", - "integrity": "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==", "license": "MIT", "dependencies": { "cssesc": "^3.0.0", @@ -36839,8 +31054,6 @@ }, "node_modules/postcss-discard-comments": { "version": "6.0.2", - "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-6.0.2.tgz", - "integrity": "sha512-65w/uIqhSBBfQmYnG92FO1mWZjJ4GL5b8atm5Yw2UgrwD7HiNiSSNwJor1eCFGzUgYnN/iIknhNRVqjrrpuglw==", "license": "MIT", "engines": { "node": "^14 || ^16 || >=18.0" @@ -36851,8 +31064,6 @@ }, "node_modules/postcss-discard-duplicates": { "version": "6.0.3", - "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-6.0.3.tgz", - "integrity": "sha512-+JA0DCvc5XvFAxwx6f/e68gQu/7Z9ud584VLmcgto28eB8FqSFZwtrLwB5Kcp70eIoWP/HXqz4wpo8rD8gpsTw==", "license": "MIT", "engines": { "node": "^14 || ^16 || >=18.0" @@ -36863,8 +31074,6 @@ }, "node_modules/postcss-discard-empty": { "version": "6.0.3", - "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-6.0.3.tgz", - "integrity": "sha512-znyno9cHKQsK6PtxL5D19Fj9uwSzC2mB74cpT66fhgOadEUPyXFkbgwm5tvc3bt3NAy8ltE5MrghxovZRVnOjQ==", "license": "MIT", "engines": { "node": "^14 || ^16 || >=18.0" @@ -36875,8 +31084,6 @@ }, "node_modules/postcss-discard-overridden": { "version": "6.0.2", - "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-6.0.2.tgz", - "integrity": "sha512-j87xzI4LUggC5zND7KdjsI25APtyMuynXZSujByMaav2roV6OZX+8AaCUcZSWqckZpjAjRyFDdpqybgjFO0HJQ==", "license": "MIT", "engines": { "node": "^14 || ^16 || >=18.0" @@ -36887,8 +31094,6 @@ }, "node_modules/postcss-discard-unused": { "version": "6.0.5", - "resolved": "https://registry.npmjs.org/postcss-discard-unused/-/postcss-discard-unused-6.0.5.tgz", - "integrity": "sha512-wHalBlRHkaNnNwfC8z+ppX57VhvS+HWgjW508esjdaEYr3Mx7Gnn2xA4R/CKf5+Z9S5qsqC+Uzh4ueENWwCVUA==", "license": "MIT", "dependencies": { "postcss-selector-parser": "^6.0.16" @@ -36902,8 +31107,6 @@ }, "node_modules/postcss-discard-unused/node_modules/postcss-selector-parser": { "version": "6.1.2", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz", - "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==", "license": "MIT", "dependencies": { "cssesc": "^3.0.0", @@ -36915,8 +31118,6 @@ }, "node_modules/postcss-double-position-gradients": { "version": "6.0.4", - "resolved": "https://registry.npmjs.org/postcss-double-position-gradients/-/postcss-double-position-gradients-6.0.4.tgz", - "integrity": "sha512-m6IKmxo7FxSP5nF2l63QbCC3r+bWpFUWmZXZf096WxG0m7Vl1Q1+ruFOhpdDRmKrRS+S3Jtk+TVk/7z0+BVK6g==", "funding": [ { "type": "github", @@ -36942,8 +31143,6 @@ }, "node_modules/postcss-focus-visible": { "version": "10.0.1", - "resolved": "https://registry.npmjs.org/postcss-focus-visible/-/postcss-focus-visible-10.0.1.tgz", - "integrity": "sha512-U58wyjS/I1GZgjRok33aE8juW9qQgQUNwTSdxQGuShHzwuYdcklnvK/+qOWX1Q9kr7ysbraQ6ht6r+udansalA==", "funding": [ { "type": "github", @@ -36967,8 +31166,6 @@ }, "node_modules/postcss-focus-visible/node_modules/postcss-selector-parser": { "version": "7.1.1", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.1.tgz", - "integrity": "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==", "license": "MIT", "dependencies": { "cssesc": "^3.0.0", @@ -36980,8 +31177,6 @@ }, "node_modules/postcss-focus-within": { "version": "9.0.1", - "resolved": "https://registry.npmjs.org/postcss-focus-within/-/postcss-focus-within-9.0.1.tgz", - "integrity": "sha512-fzNUyS1yOYa7mOjpci/bR+u+ESvdar6hk8XNK/TRR0fiGTp2QT5N+ducP0n3rfH/m9I7H/EQU6lsa2BrgxkEjw==", "funding": [ { "type": "github", @@ -37005,8 +31200,6 @@ }, "node_modules/postcss-focus-within/node_modules/postcss-selector-parser": { "version": "7.1.1", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.1.tgz", - "integrity": "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==", "license": "MIT", "dependencies": { "cssesc": "^3.0.0", @@ -37018,8 +31211,6 @@ }, "node_modules/postcss-font-variant": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/postcss-font-variant/-/postcss-font-variant-5.0.0.tgz", - "integrity": "sha512-1fmkBaCALD72CK2a9i468mA/+tr9/1cBxRRMXOUaZqO43oWPR5imcyPjXwuv7PXbCid4ndlP5zWhidQVVa3hmA==", "license": "MIT", "peerDependencies": { "postcss": "^8.1.0" @@ -37027,8 +31218,6 @@ }, "node_modules/postcss-gap-properties": { "version": "6.0.0", - "resolved": "https://registry.npmjs.org/postcss-gap-properties/-/postcss-gap-properties-6.0.0.tgz", - "integrity": "sha512-Om0WPjEwiM9Ru+VhfEDPZJAKWUd0mV1HmNXqp2C29z80aQ2uP9UVhLc7e3aYMIor/S5cVhoPgYQ7RtfeZpYTRw==", "funding": [ { "type": "github", @@ -37049,8 +31238,6 @@ }, "node_modules/postcss-image-set-function": { "version": "7.0.0", - "resolved": "https://registry.npmjs.org/postcss-image-set-function/-/postcss-image-set-function-7.0.0.tgz", - "integrity": "sha512-QL7W7QNlZuzOwBTeXEmbVckNt1FSmhQtbMRvGGqqU4Nf4xk6KUEQhAoWuMzwbSv5jxiRiSZ5Tv7eiDB9U87znA==", "funding": [ { "type": "github", @@ -37075,8 +31262,6 @@ }, "node_modules/postcss-lab-function": { "version": "7.0.12", - "resolved": "https://registry.npmjs.org/postcss-lab-function/-/postcss-lab-function-7.0.12.tgz", - "integrity": "sha512-tUcyRk1ZTPec3OuKFsqtRzW2Go5lehW29XA21lZ65XmzQkz43VY2tyWEC202F7W3mILOjw0voOiuxRGTsN+J9w==", "funding": [ { "type": "github", @@ -37104,8 +31289,6 @@ }, "node_modules/postcss-load-config": { "version": "6.0.1", - "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-6.0.1.tgz", - "integrity": "sha512-oPtTM4oerL+UXmx+93ytZVN82RrlY/wPUV8IeDxFrzIjXOLF1pN+EmKPLbubvKHT2HC20xXsCAH2Z+CKV6Oz/g==", "funding": [ { "type": "opencollective", @@ -37146,8 +31329,6 @@ }, "node_modules/postcss-loader": { "version": "7.3.4", - "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-7.3.4.tgz", - "integrity": "sha512-iW5WTTBSC5BfsBJ9daFMPVrLT36MrNiC6fqOZTTaHjBNX6Pfd5p+hSBqe/fEeNd7pc13QiAyGt7VdGMw4eRC4A==", "license": "MIT", "dependencies": { "cosmiconfig": "^8.3.5", @@ -37168,8 +31349,6 @@ }, "node_modules/postcss-logical": { "version": "8.1.0", - "resolved": "https://registry.npmjs.org/postcss-logical/-/postcss-logical-8.1.0.tgz", - "integrity": "sha512-pL1hXFQ2fEXNKiNiAgtfA005T9FBxky5zkX6s4GZM2D8RkVgRqz3f4g1JUoq925zXv495qk8UNldDwh8uGEDoA==", "funding": [ { "type": "github", @@ -37193,8 +31372,6 @@ }, "node_modules/postcss-merge-idents": { "version": "6.0.3", - "resolved": "https://registry.npmjs.org/postcss-merge-idents/-/postcss-merge-idents-6.0.3.tgz", - "integrity": "sha512-1oIoAsODUs6IHQZkLQGO15uGEbK3EAl5wi9SS8hs45VgsxQfMnxvt+L+zIr7ifZFIH14cfAeVe2uCTa+SPRa3g==", "license": "MIT", "dependencies": { "cssnano-utils": "^4.0.2", @@ -37209,8 +31386,6 @@ }, "node_modules/postcss-merge-longhand": { "version": "6.0.5", - "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-6.0.5.tgz", - "integrity": "sha512-5LOiordeTfi64QhICp07nzzuTDjNSO8g5Ksdibt44d+uvIIAE1oZdRn8y/W5ZtYgRH/lnLDlvi9F8btZcVzu3w==", "license": "MIT", "dependencies": { "postcss-value-parser": "^4.2.0", @@ -37225,8 +31400,6 @@ }, "node_modules/postcss-merge-rules": { "version": "6.1.1", - "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-6.1.1.tgz", - "integrity": "sha512-KOdWF0gju31AQPZiD+2Ar9Qjowz1LTChSjFFbS+e2sFgc4uHOp3ZvVX4sNeTlk0w2O31ecFGgrFzhO0RSWbWwQ==", "license": "MIT", "dependencies": { "browserslist": "^4.23.0", @@ -37243,8 +31416,6 @@ }, "node_modules/postcss-merge-rules/node_modules/postcss-selector-parser": { "version": "6.1.2", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz", - "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==", "license": "MIT", "dependencies": { "cssesc": "^3.0.0", @@ -37256,8 +31427,6 @@ }, "node_modules/postcss-minify-font-values": { "version": "6.1.0", - "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-6.1.0.tgz", - "integrity": "sha512-gklfI/n+9rTh8nYaSJXlCo3nOKqMNkxuGpTn/Qm0gstL3ywTr9/WRKznE+oy6fvfolH6dF+QM4nCo8yPLdvGJg==", "license": "MIT", "dependencies": { "postcss-value-parser": "^4.2.0" @@ -37271,8 +31440,6 @@ }, "node_modules/postcss-minify-gradients": { "version": "6.0.3", - "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-6.0.3.tgz", - "integrity": "sha512-4KXAHrYlzF0Rr7uc4VrfwDJ2ajrtNEpNEuLxFgwkhFZ56/7gaE4Nr49nLsQDZyUe+ds+kEhf+YAUolJiYXF8+Q==", "license": "MIT", "dependencies": { "colord": "^2.9.3", @@ -37288,8 +31455,6 @@ }, "node_modules/postcss-minify-params": { "version": "6.1.0", - "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-6.1.0.tgz", - "integrity": "sha512-bmSKnDtyyE8ujHQK0RQJDIKhQ20Jq1LYiez54WiaOoBtcSuflfK3Nm596LvbtlFcpipMjgClQGyGr7GAs+H1uA==", "license": "MIT", "dependencies": { "browserslist": "^4.23.0", @@ -37305,8 +31470,6 @@ }, "node_modules/postcss-minify-selectors": { "version": "6.0.4", - "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-6.0.4.tgz", - "integrity": "sha512-L8dZSwNLgK7pjTto9PzWRoMbnLq5vsZSTu8+j1P/2GB8qdtGQfn+K1uSvFgYvgh83cbyxT5m43ZZhUMTJDSClQ==", "license": "MIT", "dependencies": { "postcss-selector-parser": "^6.0.16" @@ -37320,8 +31483,6 @@ }, "node_modules/postcss-minify-selectors/node_modules/postcss-selector-parser": { "version": "6.1.2", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz", - "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==", "license": "MIT", "dependencies": { "cssesc": "^3.0.0", @@ -37333,8 +31494,6 @@ }, "node_modules/postcss-modules-extract-imports": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.1.0.tgz", - "integrity": "sha512-k3kNe0aNFQDAZGbin48pL2VNidTF0w4/eASDsxlyspobzU3wZQLOGj7L9gfRe0Jo9/4uud09DsjFNH7winGv8Q==", "license": "ISC", "engines": { "node": "^10 || ^12 || >= 14" @@ -37345,8 +31504,6 @@ }, "node_modules/postcss-modules-local-by-default": { "version": "4.2.0", - "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.2.0.tgz", - "integrity": "sha512-5kcJm/zk+GJDSfw+V/42fJ5fhjL5YbFDl8nVdXkJPLLW+Vf9mTD5Xe0wqIaDnLuL2U6cDNpTr+UQ+v2HWIBhzw==", "license": "MIT", "dependencies": { "icss-utils": "^5.0.0", @@ -37362,8 +31519,6 @@ }, "node_modules/postcss-modules-local-by-default/node_modules/postcss-selector-parser": { "version": "7.1.1", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.1.tgz", - "integrity": "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==", "license": "MIT", "dependencies": { "cssesc": "^3.0.0", @@ -37375,8 +31530,6 @@ }, "node_modules/postcss-modules-scope": { "version": "3.2.1", - "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.2.1.tgz", - "integrity": "sha512-m9jZstCVaqGjTAuny8MdgE88scJnCiQSlSrOWcTQgM2t32UBe+MUmFSO5t7VMSfAf/FJKImAxBav8ooCHJXCJA==", "license": "ISC", "dependencies": { "postcss-selector-parser": "^7.0.0" @@ -37390,8 +31543,6 @@ }, "node_modules/postcss-modules-scope/node_modules/postcss-selector-parser": { "version": "7.1.1", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.1.tgz", - "integrity": "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==", "license": "MIT", "dependencies": { "cssesc": "^3.0.0", @@ -37403,8 +31554,6 @@ }, "node_modules/postcss-modules-values": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz", - "integrity": "sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==", "license": "ISC", "dependencies": { "icss-utils": "^5.0.0" @@ -37418,8 +31567,6 @@ }, "node_modules/postcss-nesting": { "version": "13.0.2", - "resolved": "https://registry.npmjs.org/postcss-nesting/-/postcss-nesting-13.0.2.tgz", - "integrity": "sha512-1YCI290TX+VP0U/K/aFxzHzQWHWURL+CtHMSbex1lCdpXD1SoR2sYuxDu5aNI9lPoXpKTCggFZiDJbwylU0LEQ==", "funding": [ { "type": "github", @@ -37445,8 +31592,6 @@ }, "node_modules/postcss-nesting/node_modules/@csstools/selector-resolve-nested": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@csstools/selector-resolve-nested/-/selector-resolve-nested-3.1.0.tgz", - "integrity": "sha512-mf1LEW0tJLKfWyvn5KdDrhpxHyuxpbNwTIwOYLIvsTffeyOf85j5oIzfG0yosxDgx/sswlqBnESYUcQH0vgZ0g==", "funding": [ { "type": "github", @@ -37467,8 +31612,6 @@ }, "node_modules/postcss-nesting/node_modules/@csstools/selector-specificity": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-5.0.0.tgz", - "integrity": "sha512-PCqQV3c4CoVm3kdPhyeZ07VmBRdH2EpMFA/pd9OASpOEC3aXNGoqPDAZ80D0cLpMBxnmk0+yNhGsEx31hq7Gtw==", "funding": [ { "type": "github", @@ -37489,8 +31632,6 @@ }, "node_modules/postcss-nesting/node_modules/postcss-selector-parser": { "version": "7.1.1", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.1.tgz", - "integrity": "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==", "license": "MIT", "dependencies": { "cssesc": "^3.0.0", @@ -37502,8 +31643,6 @@ }, "node_modules/postcss-normalize-charset": { "version": "6.0.2", - "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-6.0.2.tgz", - "integrity": "sha512-a8N9czmdnrjPHa3DeFlwqst5eaL5W8jYu3EBbTTkI5FHkfMhFZh1EGbku6jhHhIzTA6tquI2P42NtZ59M/H/kQ==", "license": "MIT", "engines": { "node": "^14 || ^16 || >=18.0" @@ -37514,8 +31653,6 @@ }, "node_modules/postcss-normalize-display-values": { "version": "6.0.2", - "resolved": "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-6.0.2.tgz", - "integrity": "sha512-8H04Mxsb82ON/aAkPeq8kcBbAtI5Q2a64X/mnRRfPXBq7XeogoQvReqxEfc0B4WPq1KimjezNC8flUtC3Qz6jg==", "license": "MIT", "dependencies": { "postcss-value-parser": "^4.2.0" @@ -37529,8 +31666,6 @@ }, "node_modules/postcss-normalize-positions": { "version": "6.0.2", - "resolved": "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-6.0.2.tgz", - "integrity": "sha512-/JFzI441OAB9O7VnLA+RtSNZvQ0NCFZDOtp6QPFo1iIyawyXg0YI3CYM9HBy1WvwCRHnPep/BvI1+dGPKoXx/Q==", "license": "MIT", "dependencies": { "postcss-value-parser": "^4.2.0" @@ -37544,8 +31679,6 @@ }, "node_modules/postcss-normalize-repeat-style": { "version": "6.0.2", - "resolved": "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-6.0.2.tgz", - "integrity": "sha512-YdCgsfHkJ2jEXwR4RR3Tm/iOxSfdRt7jplS6XRh9Js9PyCR/aka/FCb6TuHT2U8gQubbm/mPmF6L7FY9d79VwQ==", "license": "MIT", "dependencies": { "postcss-value-parser": "^4.2.0" @@ -37559,8 +31692,6 @@ }, "node_modules/postcss-normalize-string": { "version": "6.0.2", - "resolved": "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-6.0.2.tgz", - "integrity": "sha512-vQZIivlxlfqqMp4L9PZsFE4YUkWniziKjQWUtsxUiVsSSPelQydwS8Wwcuw0+83ZjPWNTl02oxlIvXsmmG+CiQ==", "license": "MIT", "dependencies": { "postcss-value-parser": "^4.2.0" @@ -37574,8 +31705,6 @@ }, "node_modules/postcss-normalize-timing-functions": { "version": "6.0.2", - "resolved": "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-6.0.2.tgz", - "integrity": "sha512-a+YrtMox4TBtId/AEwbA03VcJgtyW4dGBizPl7e88cTFULYsprgHWTbfyjSLyHeBcK/Q9JhXkt2ZXiwaVHoMzA==", "license": "MIT", "dependencies": { "postcss-value-parser": "^4.2.0" @@ -37589,8 +31718,6 @@ }, "node_modules/postcss-normalize-unicode": { "version": "6.1.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-6.1.0.tgz", - "integrity": "sha512-QVC5TQHsVj33otj8/JD869Ndr5Xcc/+fwRh4HAsFsAeygQQXm+0PySrKbr/8tkDKzW+EVT3QkqZMfFrGiossDg==", "license": "MIT", "dependencies": { "browserslist": "^4.23.0", @@ -37605,8 +31732,6 @@ }, "node_modules/postcss-normalize-url": { "version": "6.0.2", - "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-6.0.2.tgz", - "integrity": "sha512-kVNcWhCeKAzZ8B4pv/DnrU1wNh458zBNp8dh4y5hhxih5RZQ12QWMuQrDgPRw3LRl8mN9vOVfHl7uhvHYMoXsQ==", "license": "MIT", "dependencies": { "postcss-value-parser": "^4.2.0" @@ -37620,8 +31745,6 @@ }, "node_modules/postcss-normalize-whitespace": { "version": "6.0.2", - "resolved": "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-6.0.2.tgz", - "integrity": "sha512-sXZ2Nj1icbJOKmdjXVT9pnyHQKiSAyuNQHSgRCUgThn2388Y9cGVDR+E9J9iAYbSbLHI+UUwLVl1Wzco/zgv0Q==", "license": "MIT", "dependencies": { "postcss-value-parser": "^4.2.0" @@ -37635,8 +31758,6 @@ }, "node_modules/postcss-opacity-percentage": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/postcss-opacity-percentage/-/postcss-opacity-percentage-3.0.0.tgz", - "integrity": "sha512-K6HGVzyxUxd/VgZdX04DCtdwWJ4NGLG212US4/LA1TLAbHgmAsTWVR86o+gGIbFtnTkfOpb9sCRBx8K7HO66qQ==", "funding": [ { "type": "kofi", @@ -37657,8 +31778,6 @@ }, "node_modules/postcss-ordered-values": { "version": "6.0.2", - "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-6.0.2.tgz", - "integrity": "sha512-VRZSOB+JU32RsEAQrO94QPkClGPKJEL/Z9PCBImXMhIeK5KAYo6slP/hBYlLgrCjFxyqvn5VC81tycFEDBLG1Q==", "license": "MIT", "dependencies": { "cssnano-utils": "^4.0.2", @@ -37673,8 +31792,6 @@ }, "node_modules/postcss-overflow-shorthand": { "version": "6.0.0", - "resolved": "https://registry.npmjs.org/postcss-overflow-shorthand/-/postcss-overflow-shorthand-6.0.0.tgz", - "integrity": "sha512-BdDl/AbVkDjoTofzDQnwDdm/Ym6oS9KgmO7Gr+LHYjNWJ6ExORe4+3pcLQsLA9gIROMkiGVjjwZNoL/mpXHd5Q==", "funding": [ { "type": "github", @@ -37698,8 +31815,6 @@ }, "node_modules/postcss-page-break": { "version": "3.0.4", - "resolved": "https://registry.npmjs.org/postcss-page-break/-/postcss-page-break-3.0.4.tgz", - "integrity": "sha512-1JGu8oCjVXLa9q9rFTo4MbeeA5FMe00/9C7lN4va606Rdb+HkxXtXsmEDrIraQ11fGz/WvKWa8gMuCKkrXpTsQ==", "license": "MIT", "peerDependencies": { "postcss": "^8" @@ -37707,8 +31822,6 @@ }, "node_modules/postcss-place": { "version": "10.0.0", - "resolved": "https://registry.npmjs.org/postcss-place/-/postcss-place-10.0.0.tgz", - "integrity": "sha512-5EBrMzat2pPAxQNWYavwAfoKfYcTADJ8AXGVPcUZ2UkNloUTWzJQExgrzrDkh3EKzmAx1evfTAzF9I8NGcc+qw==", "funding": [ { "type": "github", @@ -37732,8 +31845,6 @@ }, "node_modules/postcss-preset-env": { "version": "10.6.1", - "resolved": "https://registry.npmjs.org/postcss-preset-env/-/postcss-preset-env-10.6.1.tgz", - "integrity": "sha512-yrk74d9EvY+W7+lO9Aj1QmjWY9q5NsKjK2V9drkOPZB/X6KZ0B3igKsHUYakb7oYVhnioWypQX3xGuePf89f3g==", "funding": [ { "type": "github", @@ -37827,8 +31938,6 @@ }, "node_modules/postcss-pseudo-class-any-link": { "version": "10.0.1", - "resolved": "https://registry.npmjs.org/postcss-pseudo-class-any-link/-/postcss-pseudo-class-any-link-10.0.1.tgz", - "integrity": "sha512-3el9rXlBOqTFaMFkWDOkHUTQekFIYnaQY55Rsp8As8QQkpiSgIYEcF/6Ond93oHiDsGb4kad8zjt+NPlOC1H0Q==", "funding": [ { "type": "github", @@ -37852,8 +31961,6 @@ }, "node_modules/postcss-pseudo-class-any-link/node_modules/postcss-selector-parser": { "version": "7.1.1", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.1.tgz", - "integrity": "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==", "license": "MIT", "dependencies": { "cssesc": "^3.0.0", @@ -37865,8 +31972,6 @@ }, "node_modules/postcss-reduce-idents": { "version": "6.0.3", - "resolved": "https://registry.npmjs.org/postcss-reduce-idents/-/postcss-reduce-idents-6.0.3.tgz", - "integrity": "sha512-G3yCqZDpsNPoQgbDUy3T0E6hqOQ5xigUtBQyrmq3tn2GxlyiL0yyl7H+T8ulQR6kOcHJ9t7/9H4/R2tv8tJbMA==", "license": "MIT", "dependencies": { "postcss-value-parser": "^4.2.0" @@ -37880,8 +31985,6 @@ }, "node_modules/postcss-reduce-initial": { "version": "6.1.0", - "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-6.1.0.tgz", - "integrity": "sha512-RarLgBK/CrL1qZags04oKbVbrrVK2wcxhvta3GCxrZO4zveibqbRPmm2VI8sSgCXwoUHEliRSbOfpR0b/VIoiw==", "license": "MIT", "dependencies": { "browserslist": "^4.23.0", @@ -37896,8 +31999,6 @@ }, "node_modules/postcss-reduce-transforms": { "version": "6.0.2", - "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-6.0.2.tgz", - "integrity": "sha512-sB+Ya++3Xj1WaT9+5LOOdirAxP7dJZms3GRcYheSPi1PiTMigsxHAdkrbItHxwYHr4kt1zL7mmcHstgMYT+aiA==", "license": "MIT", "dependencies": { "postcss-value-parser": "^4.2.0" @@ -37911,8 +32012,6 @@ }, "node_modules/postcss-replace-overflow-wrap": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/postcss-replace-overflow-wrap/-/postcss-replace-overflow-wrap-4.0.0.tgz", - "integrity": "sha512-KmF7SBPphT4gPPcKZc7aDkweHiKEEO8cla/GjcBK+ckKxiZslIu3C4GCRW3DNfL0o7yW7kMQu9xlZ1kXRXLXtw==", "license": "MIT", "peerDependencies": { "postcss": "^8.0.3" @@ -37920,8 +32019,6 @@ }, "node_modules/postcss-selector-not": { "version": "8.0.1", - "resolved": "https://registry.npmjs.org/postcss-selector-not/-/postcss-selector-not-8.0.1.tgz", - "integrity": "sha512-kmVy/5PYVb2UOhy0+LqUYAhKj7DUGDpSWa5LZqlkWJaaAV+dxxsOG3+St0yNLu6vsKD7Dmqx+nWQt0iil89+WA==", "funding": [ { "type": "github", @@ -37945,8 +32042,6 @@ }, "node_modules/postcss-selector-not/node_modules/postcss-selector-parser": { "version": "7.1.1", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.1.tgz", - "integrity": "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==", "license": "MIT", "dependencies": { "cssesc": "^3.0.0", @@ -37958,8 +32053,6 @@ }, "node_modules/postcss-selector-parser": { "version": "6.0.10", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.10.tgz", - "integrity": "sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w==", "dev": true, "license": "MIT", "dependencies": { @@ -37972,8 +32065,6 @@ }, "node_modules/postcss-sort-media-queries": { "version": "5.2.0", - "resolved": "https://registry.npmjs.org/postcss-sort-media-queries/-/postcss-sort-media-queries-5.2.0.tgz", - "integrity": "sha512-AZ5fDMLD8SldlAYlvi8NIqo0+Z8xnXU2ia0jxmuhxAU+Lqt9K+AlmLNJ/zWEnE9x+Zx3qL3+1K20ATgNOr3fAA==", "license": "MIT", "dependencies": { "sort-css-media-queries": "2.2.0" @@ -37987,8 +32078,6 @@ }, "node_modules/postcss-svgo": { "version": "6.0.3", - "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-6.0.3.tgz", - "integrity": "sha512-dlrahRmxP22bX6iKEjOM+c8/1p+81asjKT+V5lrgOH944ryx/OHpclnIbGsKVd3uWOXFLYJwCVf0eEkJGvO96g==", "license": "MIT", "dependencies": { "postcss-value-parser": "^4.2.0", @@ -38003,8 +32092,6 @@ }, "node_modules/postcss-unique-selectors": { "version": "6.0.4", - "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-6.0.4.tgz", - "integrity": "sha512-K38OCaIrO8+PzpArzkLKB42dSARtC2tmG6PvD4b1o1Q2E9Os8jzfWFfSy/rixsHwohtsDdFtAWGjFVFUdwYaMg==", "license": "MIT", "dependencies": { "postcss-selector-parser": "^6.0.16" @@ -38018,8 +32105,6 @@ }, "node_modules/postcss-unique-selectors/node_modules/postcss-selector-parser": { "version": "6.1.2", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz", - "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==", "license": "MIT", "dependencies": { "cssesc": "^3.0.0", @@ -38031,14 +32116,10 @@ }, "node_modules/postcss-value-parser": { "version": "4.2.0", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", - "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", "license": "MIT" }, "node_modules/postcss-zindex": { "version": "6.0.2", - "resolved": "https://registry.npmjs.org/postcss-zindex/-/postcss-zindex-6.0.2.tgz", - "integrity": "sha512-5BxW9l1evPB/4ZIc+2GobEBoKC+h8gPGCMi+jxsYvd2x0mjq7wazk6DrP71pStqxE9Foxh5TVnonbWpFZzXaYg==", "license": "MIT", "engines": { "node": "^14 || ^16 || >=18.0" @@ -38049,8 +32130,6 @@ }, "node_modules/posthog-js": { "version": "1.367.0", - "resolved": "https://registry.npmjs.org/posthog-js/-/posthog-js-1.367.0.tgz", - "integrity": "sha512-jWNwB8XjlVUC9PbGaIlmsyohUDMBrwf7cvLuOY3lIOmWVO3L6VxTE3GZShjxpFKQtmWcPxFbf1hcbct1YCb6xg==", "license": "SEE LICENSE IN LICENSE", "dependencies": { "@opentelemetry/api": "^1.9.0", @@ -38070,8 +32149,6 @@ }, "node_modules/posthog-node": { "version": "5.29.2", - "resolved": "https://registry.npmjs.org/posthog-node/-/posthog-node-5.29.2.tgz", - "integrity": "sha512-rI7kkF0XqDc0G1qjx+Hb4iuY9NAlL+XQNoGOpnEpRNTUcXvjY6WlsRGZ9m2whgc39emrrYdszi/YT8wZkr2xsg==", "license": "MIT", "dependencies": { "@posthog/core": "1.25.2" @@ -38090,8 +32167,6 @@ }, "node_modules/powershell-utils": { "version": "0.1.0", - "resolved": "https://registry.npmjs.org/powershell-utils/-/powershell-utils-0.1.0.tgz", - "integrity": "sha512-dM0jVuXJPsDN6DvRpea484tCUaMiXWjuCn++HGTqUWzGDjv5tZkEZldAJ/UMlqRYGFrD/etByo4/xOuC/snX2A==", "license": "MIT", "engines": { "node": ">=20" @@ -38102,8 +32177,6 @@ }, "node_modules/preact": { "version": "10.29.1", - "resolved": "https://registry.npmjs.org/preact/-/preact-10.29.1.tgz", - "integrity": "sha512-gQCLc/vWroE8lIpleXtdJhTFDogTdZG9AjMUpVkDf2iTCNwYNWA+u16dL41TqUDJO4gm2IgrcMv3uTpjd4Pwmg==", "license": "MIT", "funding": { "type": "opencollective", @@ -38112,9 +32185,6 @@ }, "node_modules/prebuild-install": { "version": "7.1.3", - "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.1.3.tgz", - "integrity": "sha512-8Mf2cbV7x1cXPUILADGI3wuhfqWvtiLA1iclTDbFRZkgRQS0NqsPZphna9V+HyTEadheuPmjaJMsbzKQFOzLug==", - "deprecated": "No longer maintained. Please contact the author of the relevant native addon; alternatives are available.", "dev": true, "license": "MIT", "dependencies": { @@ -38140,8 +32210,6 @@ }, "node_modules/prelude-ls": { "version": "1.2.1", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", - "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", "license": "MIT", "engines": { "node": ">= 0.8.0" @@ -38149,8 +32217,6 @@ }, "node_modules/prettier": { "version": "3.8.1", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.8.1.tgz", - "integrity": "sha512-UOnG6LftzbdaHZcKoPFtOcCKztrQ57WkHDeRD9t/PTQtmT0NHSeWWepj6pS0z/N7+08BHFDQVUrfmfMRcZwbMg==", "license": "MIT", "bin": { "prettier": "bin/prettier.cjs" @@ -38164,8 +32230,6 @@ }, "node_modules/pretty-error": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-4.0.0.tgz", - "integrity": "sha512-AoJ5YMAcXKYxKhuJGdcvse+Voc6v1RgnsR3nWcYU7q4t6z0Q6T86sv5Zq8VIRbOWWFpvdGE83LtdSMNd+6Y0xw==", "license": "MIT", "dependencies": { "lodash": "^4.17.20", @@ -38174,8 +32238,6 @@ }, "node_modules/pretty-format": { "version": "27.5.1", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz", - "integrity": "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==", "dev": true, "license": "MIT", "peer": true, @@ -38190,8 +32252,6 @@ }, "node_modules/pretty-format/node_modules/ansi-styles": { "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", "dev": true, "license": "MIT", "peer": true, @@ -38204,16 +32264,12 @@ }, "node_modules/pretty-format/node_modules/react-is": { "version": "17.0.2", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", - "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", "dev": true, "license": "MIT", "peer": true }, "node_modules/pretty-ms": { "version": "7.0.1", - "resolved": "https://registry.npmjs.org/pretty-ms/-/pretty-ms-7.0.1.tgz", - "integrity": "sha512-973driJZvxiGOQ5ONsFhOF/DtzPMOMtgC11kCpUrPGMTgqp2q/1gwzCquocrN33is0VZ5GFHXZYMM9l6h67v2Q==", "dev": true, "license": "MIT", "dependencies": { @@ -38228,8 +32284,6 @@ }, "node_modules/pretty-time": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/pretty-time/-/pretty-time-1.1.0.tgz", - "integrity": "sha512-28iF6xPQrP8Oa6uxE6a1biz+lWeTOAPKggvjB8HAs6nVMKZwf5bG++632Dx614hIWgUPkgivRfG+a8uAXGTIbA==", "license": "MIT", "engines": { "node": ">=4" @@ -38237,8 +32291,6 @@ }, "node_modules/prism-react-renderer": { "version": "2.4.1", - "resolved": "https://registry.npmjs.org/prism-react-renderer/-/prism-react-renderer-2.4.1.tgz", - "integrity": "sha512-ey8Ls/+Di31eqzUxC46h8MksNuGx/n0AAC8uKpwFau4RPDYLuE3EXTp8N8G2vX2N7UC/+IXeNUnlWBGGcAG+Ig==", "license": "MIT", "dependencies": { "@types/prismjs": "^1.26.0", @@ -38250,8 +32302,6 @@ }, "node_modules/prismjs": { "version": "1.30.0", - "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.30.0.tgz", - "integrity": "sha512-DEvV2ZF2r2/63V+tK8hQvrR2ZGn10srHbXviTlcv7Kpzw8jWiNTqbVgjO3IY8RxrrOUF8VPMQQFysYYYv0YZxw==", "license": "MIT", "engines": { "node": ">=6" @@ -38259,8 +32309,6 @@ }, "node_modules/proc-log": { "version": "6.1.0", - "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-6.1.0.tgz", - "integrity": "sha512-iG+GYldRf2BQ0UDUAd6JQ/RwzaQy6mXmsk/IzlYyal4A4SNFw54MeH4/tLkF4I5WoWG9SQwuqWzS99jaFQHBuQ==", "license": "ISC", "engines": { "node": "^20.17.0 || >=22.9.0" @@ -38268,8 +32316,6 @@ }, "node_modules/process": { "version": "0.11.10", - "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", - "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", "license": "MIT", "peer": true, "engines": { @@ -38278,28 +32324,20 @@ }, "node_modules/process-nextick-args": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", "license": "MIT" }, "node_modules/promise-inflight": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", - "integrity": "sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==", "dev": true, "license": "ISC" }, "node_modules/promise-limit": { "version": "2.7.0", - "resolved": "https://registry.npmjs.org/promise-limit/-/promise-limit-2.7.0.tgz", - "integrity": "sha512-7nJ6v5lnJsXwGprnGXga4wx6d1POjvi5Qmf1ivTRxTjH4Z/9Czja/UCMLVmB9N93GeWOU93XaFaEt6jbuoagNw==", "dev": true, "license": "ISC" }, "node_modules/promise-retry": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-2.0.1.tgz", - "integrity": "sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==", "license": "MIT", "dependencies": { "err-code": "^2.0.2", @@ -38311,8 +32349,6 @@ }, "node_modules/promise-retry/node_modules/retry": { "version": "0.12.0", - "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", - "integrity": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==", "license": "MIT", "engines": { "node": ">= 4" @@ -38320,8 +32356,6 @@ }, "node_modules/prompts": { "version": "2.4.2", - "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", - "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", "license": "MIT", "dependencies": { "kleur": "^3.0.3", @@ -38333,8 +32367,6 @@ }, "node_modules/prop-types": { "version": "15.8.1", - "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", - "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", "license": "MIT", "dependencies": { "loose-envify": "^1.4.0", @@ -38344,14 +32376,10 @@ }, "node_modules/prop-types/node_modules/react-is": { "version": "16.13.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", "license": "MIT" }, "node_modules/property-information": { "version": "7.1.0", - "resolved": "https://registry.npmjs.org/property-information/-/property-information-7.1.0.tgz", - "integrity": "sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ==", "license": "MIT", "funding": { "type": "github", @@ -38360,14 +32388,10 @@ }, "node_modules/proto-list": { "version": "1.2.4", - "resolved": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz", - "integrity": "sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==", "license": "ISC" }, "node_modules/proto3-json-serializer": { "version": "3.0.4", - "resolved": "https://registry.npmjs.org/proto3-json-serializer/-/proto3-json-serializer-3.0.4.tgz", - "integrity": "sha512-E1sbAYg3aEbXrq0n1ojJkRHQJGE1kaE/O6GLA94y8rnJBfgvOPTOd1b9hOceQK1FFZI9qMh1vBERCyO2ifubcw==", "license": "Apache-2.0", "dependencies": { "protobufjs": "^7.4.0" @@ -38378,8 +32402,6 @@ }, "node_modules/protobufjs": { "version": "7.5.4", - "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.5.4.tgz", - "integrity": "sha512-CvexbZtbov6jW2eXAvLukXjXUW1TzFaivC46BpWc/3BpcCysb5Vffu+B3XHMm8lVEuy2Mm4XGex8hBSg1yapPg==", "hasInstallScript": true, "license": "BSD-3-Clause", "dependencies": { @@ -38402,8 +32424,6 @@ }, "node_modules/proxy-addr": { "version": "2.0.7", - "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", - "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", "license": "MIT", "dependencies": { "forwarded": "0.2.0", @@ -38415,8 +32435,6 @@ }, "node_modules/proxy-from-env": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-2.1.0.tgz", - "integrity": "sha512-cJ+oHTW1VAEa8cJslgmUZrc+sjRKgAKl3Zyse6+PV38hZe/V6Z14TbCuXcan9F9ghlz4QrFr2c92TNF82UkYHA==", "license": "MIT", "engines": { "node": ">=10" @@ -38424,8 +32442,6 @@ }, "node_modules/pump": { "version": "3.0.4", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.4.tgz", - "integrity": "sha512-VS7sjc6KR7e1ukRFhQSY5LM2uBWAUPiOPa/A3mkKmiMwSmRFUITt0xuj+/lesgnCv+dPIEYlkzrcyXgquIHMcA==", "dev": true, "license": "MIT", "dependencies": { @@ -38435,8 +32451,6 @@ }, "node_modules/punycode": { "version": "2.3.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", - "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", "license": "MIT", "engines": { "node": ">=6" @@ -38444,8 +32458,6 @@ }, "node_modules/pupa": { "version": "3.3.0", - "resolved": "https://registry.npmjs.org/pupa/-/pupa-3.3.0.tgz", - "integrity": "sha512-LjgDO2zPtoXP2wJpDjZrGdojii1uqO0cnwKoIoUzkfS98HDmbeiGmYiXo3lXeFlq2xvne1QFQhwYXSUCLKtEuA==", "license": "MIT", "dependencies": { "escape-goat": "^4.0.0" @@ -38459,8 +32471,6 @@ }, "node_modules/pure-rand": { "version": "7.0.1", - "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-7.0.1.tgz", - "integrity": "sha512-oTUZM/NAZS8p7ANR3SHh30kXB+zK2r2BPcEn/awJIbOvq82WoMN4p62AWWp3Hhw50G0xMsw1mhIBLqHw64EcNQ==", "funding": [ { "type": "individual", @@ -38475,8 +32485,6 @@ }, "node_modules/pvtsutils": { "version": "1.3.6", - "resolved": "https://registry.npmjs.org/pvtsutils/-/pvtsutils-1.3.6.tgz", - "integrity": "sha512-PLgQXQ6H2FWCaeRak8vvk1GW462lMxB5s3Jm673N82zI4vqtVUPuZdffdZbPDFRoU8kAhItWFtPCWiPpp4/EDg==", "license": "MIT", "dependencies": { "tslib": "^2.8.1" @@ -38484,8 +32492,6 @@ }, "node_modules/pvutils": { "version": "1.1.5", - "resolved": "https://registry.npmjs.org/pvutils/-/pvutils-1.1.5.tgz", - "integrity": "sha512-KTqnxsgGiQ6ZAzZCVlJH5eOjSnvlyEgx1m8bkRJfOhmGRqfo5KLvmAlACQkrjEtOQ4B7wF9TdSLIs9O90MX9xA==", "license": "MIT", "engines": { "node": ">=16.0.0" @@ -38493,8 +32499,6 @@ }, "node_modules/qs": { "version": "6.14.2", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.2.tgz", - "integrity": "sha512-V/yCWTTF7VJ9hIh18Ugr2zhJMP01MY7c5kh4J870L7imm6/DIzBsNLTXzMwUA3yZ5b/KBqLx8Kp3uRvd7xSe3Q==", "license": "BSD-3-Clause", "dependencies": { "side-channel": "^1.1.0" @@ -38508,8 +32512,6 @@ }, "node_modules/quansync": { "version": "0.2.11", - "resolved": "https://registry.npmjs.org/quansync/-/quansync-0.2.11.tgz", - "integrity": "sha512-AifT7QEbW9Nri4tAwR5M/uzpBuqfZf+zwaEM/QkzEjj7NBuFD2rBuy0K3dE+8wltbezDV7JMA0WfnCPYRSYbXA==", "dev": true, "funding": [ { @@ -38525,14 +32527,10 @@ }, "node_modules/query-selector-shadow-dom": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/query-selector-shadow-dom/-/query-selector-shadow-dom-1.0.1.tgz", - "integrity": "sha512-lT5yCqEBgfoMYpf3F2xQRK7zEr1rhIIZuceDK6+xRkJQ4NMbHTwXqk4NkwDwQMNqXgG9r9fyHnzwNVs6zV5KRw==", "license": "MIT" }, "node_modules/queue-microtask": { "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", "funding": [ { "type": "github", @@ -38551,8 +32549,6 @@ }, "node_modules/quick-lru": { "version": "5.1.1", - "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", - "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", "license": "MIT", "engines": { "node": ">=10" @@ -38563,8 +32559,6 @@ }, "node_modules/randombytes": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", - "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", "license": "MIT", "dependencies": { "safe-buffer": "^5.1.0" @@ -38572,8 +32566,6 @@ }, "node_modules/range-parser": { "version": "1.2.1", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", - "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", "license": "MIT", "engines": { "node": ">= 0.6" @@ -38581,8 +32573,6 @@ }, "node_modules/raw-body": { "version": "3.0.2", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-3.0.2.tgz", - "integrity": "sha512-K5zQjDllxWkf7Z5xJdV0/B0WTNqx6vxG70zJE4N0kBs4LovmEYWJzQGxC9bS9RAKu3bgM40lrd5zoLJ12MQ5BA==", "license": "MIT", "dependencies": { "bytes": "~3.1.2", @@ -38596,8 +32586,6 @@ }, "node_modules/rc": { "version": "1.2.8", - "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", - "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", "license": "(BSD-2-Clause OR MIT OR Apache-2.0)", "dependencies": { "deep-extend": "^0.6.0", @@ -38611,14 +32599,10 @@ }, "node_modules/rc/node_modules/ini": { "version": "1.3.8", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", "license": "ISC" }, "node_modules/rc/node_modules/strip-json-comments": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", "license": "MIT", "engines": { "node": ">=0.10.0" @@ -38626,8 +32610,6 @@ }, "node_modules/react": { "version": "19.2.4", - "resolved": "https://registry.npmjs.org/react/-/react-19.2.4.tgz", - "integrity": "sha512-9nfp2hYpCwOjAN+8TZFGhtWEwgvWHXqESH8qT89AT/lWklpLON22Lc8pEtnpsZz7VmawabSU0gCjnj8aC0euHQ==", "license": "MIT", "engines": { "node": ">=0.10.0" @@ -38635,8 +32617,6 @@ }, "node_modules/react-docgen": { "version": "8.0.2", - "resolved": "https://registry.npmjs.org/react-docgen/-/react-docgen-8.0.2.tgz", - "integrity": "sha512-+NRMYs2DyTP4/tqWz371Oo50JqmWltR1h2gcdgUMAWZJIAvrd0/SqlCfx7tpzpl/s36rzw6qH2MjoNrxtRNYhA==", "dev": true, "license": "MIT", "dependencies": { @@ -38657,8 +32637,6 @@ }, "node_modules/react-docgen-typescript": { "version": "2.4.0", - "resolved": "https://registry.npmjs.org/react-docgen-typescript/-/react-docgen-typescript-2.4.0.tgz", - "integrity": "sha512-ZtAp5XTO5HRzQctjPU0ybY0RRCQO19X/8fxn3w7y2VVTUbGHDKULPTL4ky3vB05euSgG5NpALhEhDPvQ56wvXg==", "dev": true, "license": "MIT", "peerDependencies": { @@ -38667,8 +32645,6 @@ }, "node_modules/react-docgen/node_modules/doctrine": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -38680,8 +32656,6 @@ }, "node_modules/react-dom": { "version": "19.2.4", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.2.4.tgz", - "integrity": "sha512-AXJdLo8kgMbimY95O2aKQqsz2iWi9jMgKJhRBAxECE4IFxfcazB2LmzloIoibJI3C12IlY20+KFaLv+71bUJeQ==", "license": "MIT", "dependencies": { "scheduler": "^0.27.0" @@ -38692,15 +32666,11 @@ }, "node_modules/react-fast-compare": { "version": "3.2.2", - "resolved": "https://registry.npmjs.org/react-fast-compare/-/react-fast-compare-3.2.2.tgz", - "integrity": "sha512-nsO+KSNgo1SbJqJEYRE9ERzo7YtYbou/OqjSQKxV7jcKox7+usiUVZOAC+XnDOABXggQTno0Y1CpVnuWEc1boQ==", "license": "MIT" }, "node_modules/react-helmet-async": { "name": "@slorber/react-helmet-async", "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@slorber/react-helmet-async/-/react-helmet-async-1.3.0.tgz", - "integrity": "sha512-e9/OK8VhwUSc67diWI8Rb3I0YgI9/SBQtnhe9aEuK6MhZm7ntZZimXgwXnd8W96YTmSOb9M4d8LwhRZyhWr/1A==", "license": "Apache-2.0", "dependencies": { "@babel/runtime": "^7.12.5", @@ -38716,14 +32686,10 @@ }, "node_modules/react-is": { "version": "18.3.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", - "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", "license": "MIT" }, "node_modules/react-json-view-lite": { "version": "2.5.0", - "resolved": "https://registry.npmjs.org/react-json-view-lite/-/react-json-view-lite-2.5.0.tgz", - "integrity": "sha512-tk7o7QG9oYyELWHL8xiMQ8x4WzjCzbWNyig3uexmkLb54r8jO0yH3WCWx8UZS0c49eSA4QUmG5caiRJ8fAn58g==", "license": "MIT", "engines": { "node": ">=18" @@ -38734,8 +32700,6 @@ }, "node_modules/react-live": { "version": "4.1.8", - "resolved": "https://registry.npmjs.org/react-live/-/react-live-4.1.8.tgz", - "integrity": "sha512-B2SgNqwPuS2ekqj4lcxi5TibEcjWkdVyYykBEUBshPAPDQ527x2zPEZg560n8egNtAjUpwXFQm7pcXV65aAYmg==", "license": "MIT", "dependencies": { "prism-react-renderer": "^2.4.0", @@ -38754,8 +32718,6 @@ "node_modules/react-loadable": { "name": "@docusaurus/react-loadable", "version": "6.0.0", - "resolved": "https://registry.npmjs.org/@docusaurus/react-loadable/-/react-loadable-6.0.0.tgz", - "integrity": "sha512-YMMxTUQV/QFSnbgrP3tjDzLHRg7vsbMn8e9HAa8o/1iXoiomo48b7sk/kkmWEuWNDPJVlKSJRB6Y2fHqdJk+SQ==", "license": "MIT", "dependencies": { "@types/react": "*" @@ -38766,8 +32728,6 @@ }, "node_modules/react-loadable-ssr-addon-v5-slorber": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/react-loadable-ssr-addon-v5-slorber/-/react-loadable-ssr-addon-v5-slorber-1.0.1.tgz", - "integrity": "sha512-lq3Lyw1lGku8zUEJPDxsNm1AfYHBrO9Y1+olAYwpUJ2IGFBskM0DMKok97A6LWUpHm+o7IvQBOWu9MLenp9Z+A==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.10.3" @@ -38782,8 +32742,6 @@ }, "node_modules/react-refresh": { "version": "0.18.0", - "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.18.0.tgz", - "integrity": "sha512-QgT5//D3jfjJb6Gsjxv0Slpj23ip+HtOpnNgnb2S5zU3CB26G/IDPGoy4RJB42wzFE46DRsstbW6tKHoKbhAxw==", "dev": true, "license": "MIT", "engines": { @@ -38792,8 +32750,6 @@ }, "node_modules/react-router": { "version": "5.3.4", - "resolved": "https://registry.npmjs.org/react-router/-/react-router-5.3.4.tgz", - "integrity": "sha512-Ys9K+ppnJah3QuaRiLxk+jDWOR1MekYQrlytiXxC1RyfbdsZkS5pvKAzCCr031xHixZwpnsYNT5xysdFHQaYsA==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.12.13", @@ -38812,8 +32768,6 @@ }, "node_modules/react-router-config": { "version": "5.1.1", - "resolved": "https://registry.npmjs.org/react-router-config/-/react-router-config-5.1.1.tgz", - "integrity": "sha512-DuanZjaD8mQp1ppHjgnnUnyOlqYXZVjnov/JzFhjLEwd3Z4dYjMSnqrEzzGThH47vpCOqPPwJM2FtthLeJ8Pbg==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.1.2" @@ -38825,8 +32779,6 @@ }, "node_modules/react-router-dom": { "version": "7.13.1", - "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-7.13.1.tgz", - "integrity": "sha512-UJnV3Rxc5TgUPJt2KJpo1Jpy0OKQr0AjgbZzBFjaPJcFOb2Y8jA5H3LT8HUJAiRLlWrEXWHbF1Z4SCZaQjWDHw==", "license": "MIT", "dependencies": { "react-router": "7.13.1" @@ -38841,8 +32793,6 @@ }, "node_modules/react-router-dom/node_modules/cookie": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-1.1.1.tgz", - "integrity": "sha512-ei8Aos7ja0weRpFzJnEA9UHJ/7XQmqglbRwnf2ATjcB9Wq874VKH9kfjjirM6UhU2/E5fFYadylyhFldcqSidQ==", "license": "MIT", "engines": { "node": ">=18" @@ -38854,8 +32804,6 @@ }, "node_modules/react-router-dom/node_modules/react-router": { "version": "7.13.1", - "resolved": "https://registry.npmjs.org/react-router/-/react-router-7.13.1.tgz", - "integrity": "sha512-td+xP4X2/6BJvZoX6xw++A2DdEi++YypA69bJUV5oVvqf6/9/9nNlD70YO1e9d3MyamJEBQFEzk6mbfDYbqrSA==", "license": "MIT", "dependencies": { "cookie": "^1.0.1", @@ -38876,14 +32824,10 @@ }, "node_modules/react-router/node_modules/isarray": { "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==", "license": "MIT" }, "node_modules/react-router/node_modules/path-to-regexp": { "version": "1.9.0", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.9.0.tgz", - "integrity": "sha512-xIp7/apCFJuUHdDLWe8O1HIkb0kQrOMb/0u6FXQjemHn/ii5LrIzU6bdECnsiTF/GjZkMEKg1xdiZwNqDYlZ6g==", "license": "MIT", "dependencies": { "isarray": "0.0.1" @@ -38891,14 +32835,10 @@ }, "node_modules/react-router/node_modules/react-is": { "version": "16.13.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", "license": "MIT" }, "node_modules/react-simple-code-editor": { "version": "0.14.1", - "resolved": "https://registry.npmjs.org/react-simple-code-editor/-/react-simple-code-editor-0.14.1.tgz", - "integrity": "sha512-BR5DtNRy+AswWJECyA17qhUDvrrCZ6zXOCfkQY5zSmb96BVUbpVAv03WpcjcwtCwiLbIANx3gebHOcXYn1EHow==", "license": "MIT", "peerDependencies": { "react": ">=16.8.0", @@ -38907,8 +32847,6 @@ }, "node_modules/read-package-json-fast": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/read-package-json-fast/-/read-package-json-fast-4.0.0.tgz", - "integrity": "sha512-qpt8EwugBWDw2cgE2W+/3oxC+KTez2uSVR8JU9Q36TXPAGCaozfQUs59v4j4GFpWTaw0i6hAZSvOmu1J0uOEUg==", "dev": true, "license": "ISC", "dependencies": { @@ -38921,8 +32859,6 @@ }, "node_modules/read-package-json-fast/node_modules/json-parse-even-better-errors": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-4.0.0.tgz", - "integrity": "sha512-lR4MXjGNgkJc7tkQ97kb2nuEMnNCyU//XYVH0MKTGcXEiSudQ5MKGKen3C5QubYy0vmq+JGitUg92uuywGEwIA==", "dev": true, "license": "MIT", "engines": { @@ -38931,8 +32867,6 @@ }, "node_modules/read-package-json-fast/node_modules/npm-normalize-package-bin": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-4.0.0.tgz", - "integrity": "sha512-TZKxPvItzai9kN9H/TkmCtx/ZN/hvr3vUycjlfmH0ootY9yFBzNOpiXAdIn1Iteqsvk4lQn6B5PTrt+n6h8k/w==", "dev": true, "license": "ISC", "engines": { @@ -38941,8 +32875,6 @@ }, "node_modules/read-pkg": { "version": "5.2.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", - "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", "license": "MIT", "peer": true, "dependencies": { @@ -38957,8 +32889,6 @@ }, "node_modules/read-pkg-up": { "version": "7.0.1", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", - "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", "license": "MIT", "peer": true, "dependencies": { @@ -38975,8 +32905,6 @@ }, "node_modules/read-pkg-up/node_modules/type-fest": { "version": "0.8.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", - "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", "license": "(MIT OR CC0-1.0)", "peer": true, "engines": { @@ -38985,8 +32913,6 @@ }, "node_modules/read-pkg/node_modules/type-fest": { "version": "0.6.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", - "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", "license": "(MIT OR CC0-1.0)", "peer": true, "engines": { @@ -38995,8 +32921,6 @@ }, "node_modules/read-yaml-file": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/read-yaml-file/-/read-yaml-file-1.1.0.tgz", - "integrity": "sha512-VIMnQi/Z4HT2Fxuwg5KrY174U1VdUIASQVWXXyqtNRtxSr9IYkn1rsI6Tb6HsrHCmB7gVpNwX6JxPTHcH6IoTA==", "dev": true, "license": "MIT", "dependencies": { @@ -39011,8 +32935,6 @@ }, "node_modules/read-yaml-file/node_modules/argparse": { "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", "dev": true, "license": "MIT", "dependencies": { @@ -39021,8 +32943,6 @@ }, "node_modules/read-yaml-file/node_modules/js-yaml": { "version": "3.14.2", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.2.tgz", - "integrity": "sha512-PMSmkqxr106Xa156c2M265Z+FTrPl+oxd/rgOQy2tijQeK5TxQ43psO1ZCwhVOSdnn+RzkzlRz/eY4BgJBYVpg==", "dev": true, "license": "MIT", "dependencies": { @@ -39035,8 +32955,6 @@ }, "node_modules/readable-stream": { "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", "license": "MIT", "dependencies": { "inherits": "^2.0.3", @@ -39049,8 +32967,6 @@ }, "node_modules/readdirp": { "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", "license": "MIT", "dependencies": { "picomatch": "^2.2.1" @@ -39061,8 +32977,6 @@ }, "node_modules/recast": { "version": "0.23.11", - "resolved": "https://registry.npmjs.org/recast/-/recast-0.23.11.tgz", - "integrity": "sha512-YTUo+Flmw4ZXiWfQKGcwwc11KnoRAYgzAE2E7mXKCjSviTKShtxBsN6YUUBB2gtaBzKzeKunxhUwNHQuRryhWA==", "dev": true, "license": "MIT", "dependencies": { @@ -39078,8 +32992,6 @@ }, "node_modules/recast/node_modules/source-map": { "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true, "license": "BSD-3-Clause", "engines": { @@ -39088,8 +33000,6 @@ }, "node_modules/recma-build-jsx": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/recma-build-jsx/-/recma-build-jsx-1.0.0.tgz", - "integrity": "sha512-8GtdyqaBcDfva+GUKDr3nev3VpKAhup1+RvkMvUxURHpW7QyIvk9F5wz7Vzo06CEMSilw6uArgRqhpiUcWp8ew==", "license": "MIT", "dependencies": { "@types/estree": "^1.0.0", @@ -39103,8 +33013,6 @@ }, "node_modules/recma-jsx": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/recma-jsx/-/recma-jsx-1.0.1.tgz", - "integrity": "sha512-huSIy7VU2Z5OLv6oFLosQGGDqPqdO1iq6bWNAdhzMxSJP7RAso4fCZ1cKu8j9YHCZf3TPrq4dw3okhrylgcd7w==", "license": "MIT", "dependencies": { "acorn-jsx": "^5.0.0", @@ -39123,8 +33031,6 @@ }, "node_modules/recma-parse": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/recma-parse/-/recma-parse-1.0.0.tgz", - "integrity": "sha512-OYLsIGBB5Y5wjnSnQW6t3Xg7q3fQ7FWbw/vcXtORTnyaSFscOtABg+7Pnz6YZ6c27fG1/aN8CjfwoUEUIdwqWQ==", "license": "MIT", "dependencies": { "@types/estree": "^1.0.0", @@ -39139,8 +33045,6 @@ }, "node_modules/recma-stringify": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/recma-stringify/-/recma-stringify-1.0.0.tgz", - "integrity": "sha512-cjwII1MdIIVloKvC9ErQ+OgAtwHBmcZ0Bg4ciz78FtbT8In39aAYbaA7zvxQ61xVMSPE8WxhLwLbhif4Js2C+g==", "license": "MIT", "dependencies": { "@types/estree": "^1.0.0", @@ -39155,8 +33059,6 @@ }, "node_modules/redent": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz", - "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==", "license": "MIT", "dependencies": { "indent-string": "^4.0.0", @@ -39168,8 +33070,6 @@ }, "node_modules/redent/node_modules/strip-indent": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", - "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", "license": "MIT", "dependencies": { "min-indent": "^1.0.0" @@ -39180,8 +33080,6 @@ }, "node_modules/redis-errors": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/redis-errors/-/redis-errors-1.2.0.tgz", - "integrity": "sha512-1qny3OExCf0UvUV/5wpYKf2YwPcOqXzkwKKSmKHiE6ZMQs5heeE/c8eXK+PNllPvmjgAbfnsbpkGZWy8cBpn9w==", "license": "MIT", "engines": { "node": ">=4" @@ -39189,8 +33087,6 @@ }, "node_modules/redis-parser": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/redis-parser/-/redis-parser-3.0.0.tgz", - "integrity": "sha512-DJnGAeenTdpMEH6uAJRK/uiyEIH9WVsUmoLwzudwGJUwZPp80PDBWPHXSAGNPwNvIXAbe7MSUB1zQFugFml66A==", "license": "MIT", "dependencies": { "redis-errors": "^1.0.0" @@ -39201,8 +33097,6 @@ }, "node_modules/reduce-flatten": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/reduce-flatten/-/reduce-flatten-2.0.0.tgz", - "integrity": "sha512-EJ4UNY/U1t2P/2k6oqotuX2Cc3T6nxJwsM0N0asT7dhrtH1ltUxDn4NalSYmPE2rCkVpcf/X6R0wDwcFpzhd4w==", "dev": true, "license": "MIT", "engines": { @@ -39211,14 +33105,10 @@ }, "node_modules/reflect-metadata": { "version": "0.2.2", - "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.2.2.tgz", - "integrity": "sha512-urBwgfrvVP/eAyXx4hluJivBKzuEbSQs9rKWCrCkbSxNv8mxPcUZKeuoF3Uy4mJl3Lwprp6yy5/39VWigZ4K6Q==", "license": "Apache-2.0" }, "node_modules/reflect.getprototypeof": { "version": "1.0.10", - "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.10.tgz", - "integrity": "sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==", "license": "MIT", "dependencies": { "call-bind": "^1.0.8", @@ -39239,14 +33129,10 @@ }, "node_modules/regenerate": { "version": "1.4.2", - "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", - "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==", "license": "MIT" }, "node_modules/regenerate-unicode-properties": { "version": "10.2.2", - "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.2.2.tgz", - "integrity": "sha512-m03P+zhBeQd1RGnYxrGyDAPpWX/epKirLrp8e3qevZdVkKtnCrjjWczIbYc8+xd6vcTStVlqfycTx1KR4LOr0g==", "license": "MIT", "dependencies": { "regenerate": "^1.4.2" @@ -39257,8 +33143,6 @@ }, "node_modules/regex": { "version": "6.1.0", - "resolved": "https://registry.npmjs.org/regex/-/regex-6.1.0.tgz", - "integrity": "sha512-6VwtthbV4o/7+OaAF9I5L5V3llLEsoPyq9P1JVXkedTP33c7MfCG0/5NOPcSJn0TzXcG9YUrR0gQSWioew3LDg==", "license": "MIT", "dependencies": { "regex-utilities": "^2.3.0" @@ -39266,8 +33150,6 @@ }, "node_modules/regex-recursion": { "version": "6.0.2", - "resolved": "https://registry.npmjs.org/regex-recursion/-/regex-recursion-6.0.2.tgz", - "integrity": "sha512-0YCaSCq2VRIebiaUviZNs0cBz1kg5kVS2UKUfNIx8YVs1cN3AV7NTctO5FOKBA+UT2BPJIWZauYHPqJODG50cg==", "license": "MIT", "dependencies": { "regex-utilities": "^2.3.0" @@ -39275,14 +33157,10 @@ }, "node_modules/regex-utilities": { "version": "2.3.0", - "resolved": "https://registry.npmjs.org/regex-utilities/-/regex-utilities-2.3.0.tgz", - "integrity": "sha512-8VhliFJAWRaUiVvREIiW2NXXTmHs4vMNnSzuJVhscgmGav3g9VDxLrQndI3dZZVVdp0ZO/5v0xmX516/7M9cng==", "license": "MIT" }, "node_modules/regexp.prototype.flags": { "version": "1.5.4", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.4.tgz", - "integrity": "sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==", "license": "MIT", "dependencies": { "call-bind": "^1.0.8", @@ -39301,8 +33179,6 @@ }, "node_modules/regexpu-core": { "version": "6.4.0", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-6.4.0.tgz", - "integrity": "sha512-0ghuzq67LI9bLXpOX/ISfve/Mq33a4aFRzoQYhnnok1JOFpmE/A2TBGkNVenOGEeSBCjIiWcc6MVOG5HEQv0sA==", "license": "MIT", "dependencies": { "regenerate": "^1.4.2", @@ -39318,8 +33194,6 @@ }, "node_modules/registry-auth-token": { "version": "5.1.1", - "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-5.1.1.tgz", - "integrity": "sha512-P7B4+jq8DeD2nMsAcdfaqHbssgHtZ7Z5+++a5ask90fvmJ8p5je4mOa+wzu+DB4vQ5tdJV/xywY+UnVFeQLV5Q==", "license": "MIT", "dependencies": { "@pnpm/npm-conf": "^3.0.2" @@ -39330,8 +33204,6 @@ }, "node_modules/registry-url": { "version": "5.1.0", - "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-5.1.0.tgz", - "integrity": "sha512-8acYXXTI0AkQv6RAOjE3vOaIXZkT9wo4LOFbBKYQEEnnMNBpKqdUrI6S4NT0KPIo/WVvJ5tE/X5LF/TQUf0ekw==", "dev": true, "license": "MIT", "dependencies": { @@ -39343,14 +33215,10 @@ }, "node_modules/regjsgen": { "version": "0.8.0", - "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.8.0.tgz", - "integrity": "sha512-RvwtGe3d7LvWiDQXeQw8p5asZUmfU1G/l6WbUXeHta7Y2PEIvBTwH6E2EfmYUK8pxcxEdEmaomqyp0vZZ7C+3Q==", "license": "MIT" }, "node_modules/regjsparser": { "version": "0.13.0", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.13.0.tgz", - "integrity": "sha512-NZQZdC5wOE/H3UT28fVGL+ikOZcEzfMGk/c3iN9UGxzWHMa1op7274oyiUVrAG4B2EuFhus8SvkaYnhvW92p9Q==", "license": "BSD-2-Clause", "dependencies": { "jsesc": "~3.1.0" @@ -39361,8 +33229,6 @@ }, "node_modules/rehype-raw": { "version": "7.0.0", - "resolved": "https://registry.npmjs.org/rehype-raw/-/rehype-raw-7.0.0.tgz", - "integrity": "sha512-/aE8hCfKlQeA8LmyeyQvQF3eBiLRGNlfBJEvWH7ivp9sBqs7TNqBL5X3v157rM4IFETqDnIOO+z5M/biZbo9Ww==", "license": "MIT", "dependencies": { "@types/hast": "^3.0.0", @@ -39376,8 +33242,6 @@ }, "node_modules/rehype-recma": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/rehype-recma/-/rehype-recma-1.0.0.tgz", - "integrity": "sha512-lqA4rGUf1JmacCNWWZx0Wv1dHqMwxzsDWYMTowuplHF3xH0N/MmrZ/G3BDZnzAkRmxDadujCjaKM2hqYdCBOGw==", "license": "MIT", "dependencies": { "@types/estree": "^1.0.0", @@ -39391,8 +33255,6 @@ }, "node_modules/relateurl": { "version": "0.2.7", - "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", - "integrity": "sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==", "license": "MIT", "engines": { "node": ">= 0.10" @@ -39400,8 +33262,6 @@ }, "node_modules/remark": { "version": "15.0.1", - "resolved": "https://registry.npmjs.org/remark/-/remark-15.0.1.tgz", - "integrity": "sha512-Eht5w30ruCXgFmxVUSlNWQ9iiimq07URKeFS3hNc8cUWy1llX4KDWfyEDZRycMc+znsN9Ux5/tJ/BFdgdOwA3A==", "dev": true, "license": "MIT", "dependencies": { @@ -39417,8 +33277,6 @@ }, "node_modules/remark-cli": { "version": "12.0.1", - "resolved": "https://registry.npmjs.org/remark-cli/-/remark-cli-12.0.1.tgz", - "integrity": "sha512-2NAEOACoTgo+e+YAaCTODqbrWyhMVmlUyjxNCkTrDRHHQvH6+NbrnqVvQaLH/Q8Ket3v90A43dgAJmXv8y5Tkw==", "dev": true, "license": "MIT", "dependencies": { @@ -39437,8 +33295,6 @@ }, "node_modules/remark-directive": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/remark-directive/-/remark-directive-3.0.1.tgz", - "integrity": "sha512-gwglrEQEZcZYgVyG1tQuA+h58EZfq5CSULw7J90AFuCTyib1thgHPoqQ+h9iFvU6R+vnZ5oNFQR5QKgGpk741A==", "license": "MIT", "dependencies": { "@types/mdast": "^4.0.0", @@ -39453,8 +33309,6 @@ }, "node_modules/remark-emoji": { "version": "4.0.1", - "resolved": "https://registry.npmjs.org/remark-emoji/-/remark-emoji-4.0.1.tgz", - "integrity": "sha512-fHdvsTR1dHkWKev9eNyhTo4EFwbUvJ8ka9SgeWkMPYFX4WoI7ViVBms3PjlQYgw5TLvNQso3GUB/b/8t3yo+dg==", "license": "MIT", "dependencies": { "@types/mdast": "^4.0.2", @@ -39469,8 +33323,6 @@ }, "node_modules/remark-frontmatter": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/remark-frontmatter/-/remark-frontmatter-5.0.0.tgz", - "integrity": "sha512-XTFYvNASMe5iPN0719nPrdItC9aU0ssC4v14mH1BCi1u0n1gAocqcujWUrByftZTbLhRtiKRyjYTSIOcr69UVQ==", "license": "MIT", "dependencies": { "@types/mdast": "^4.0.0", @@ -39485,8 +33337,6 @@ }, "node_modules/remark-gfm": { "version": "4.0.1", - "resolved": "https://registry.npmjs.org/remark-gfm/-/remark-gfm-4.0.1.tgz", - "integrity": "sha512-1quofZ2RQ9EWdeN34S79+KExV1764+wCUGop5CPL1WGdD0ocPpu91lzPGbwWMECpEpd42kJGQwzRfyov9j4yNg==", "license": "MIT", "dependencies": { "@types/mdast": "^4.0.0", @@ -39503,8 +33353,6 @@ }, "node_modules/remark-lint": { "version": "10.0.1", - "resolved": "https://registry.npmjs.org/remark-lint/-/remark-lint-10.0.1.tgz", - "integrity": "sha512-1+PYGFziOg4pH7DDf1uMd4AR3YuO2EMnds/SdIWMPGT7CAfDRSnAmpxPsJD0Ds3IKpn97h3d5KPGf1WFOg6hXQ==", "dev": true, "license": "MIT", "dependencies": { @@ -39519,8 +33367,6 @@ }, "node_modules/remark-lint-blockquote-indentation": { "version": "4.0.1", - "resolved": "https://registry.npmjs.org/remark-lint-blockquote-indentation/-/remark-lint-blockquote-indentation-4.0.1.tgz", - "integrity": "sha512-7BhOsImFgTD7IIliu2tt+yJbx5gbMbXCOspc3VdYf/87iLJdWKqJoMy2V6DZG7kBjBlBsIZi38fDDngJttXt4w==", "dev": true, "license": "MIT", "dependencies": { @@ -39538,8 +33384,6 @@ }, "node_modules/remark-lint-checkbox-character-style": { "version": "5.0.1", - "resolved": "https://registry.npmjs.org/remark-lint-checkbox-character-style/-/remark-lint-checkbox-character-style-5.0.1.tgz", - "integrity": "sha512-6qilm7XQXOcTvjFEqqNY57Ki7md9rkSdpMIfIzVXdEnI4Npl2BnUff6ANrGRM7qTgJTrloaf8H0eQ91urcU6Og==", "dev": true, "license": "MIT", "dependencies": { @@ -39557,8 +33401,6 @@ }, "node_modules/remark-lint-code-block-style": { "version": "4.0.1", - "resolved": "https://registry.npmjs.org/remark-lint-code-block-style/-/remark-lint-code-block-style-4.0.1.tgz", - "integrity": "sha512-d4mHsEpv1yqXWl2dd+28tGRX0Lzk5qw7cfxAQVkOXPUONhsMFwXJEBeeqZokeG4lOKtkKdIJR7ezScDfWR0X4w==", "dev": true, "license": "MIT", "dependencies": { @@ -39576,8 +33418,6 @@ }, "node_modules/remark-lint-emphasis-marker": { "version": "4.0.1", - "resolved": "https://registry.npmjs.org/remark-lint-emphasis-marker/-/remark-lint-emphasis-marker-4.0.1.tgz", - "integrity": "sha512-BF1WWsAxai3XoKk48sfiqT3L8m02AZLj3BnipWkHDRXuLfz6VwsHVaHWyNvvE0p6b2B3A5dSYbcfJu5RmPx4tQ==", "dev": true, "license": "MIT", "dependencies": { @@ -39594,8 +33434,6 @@ }, "node_modules/remark-lint-fenced-code-marker": { "version": "4.0.1", - "resolved": "https://registry.npmjs.org/remark-lint-fenced-code-marker/-/remark-lint-fenced-code-marker-4.0.1.tgz", - "integrity": "sha512-uI91OcVPKjNxV+vpjDW9T64hkE0a/CRn3JhwdMxUAJYpVsKnA7PFPSFJOx/abNsVZHNSe7ZFGgGdaH/lqgSizA==", "dev": true, "license": "MIT", "dependencies": { @@ -39613,8 +33451,6 @@ }, "node_modules/remark-lint-final-newline": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/remark-lint-final-newline/-/remark-lint-final-newline-3.0.1.tgz", - "integrity": "sha512-q5diKHD6BMbzqWqgvYPOB8AJgLrMzEMBAprNXjcpKoZ/uCRqly+gxjco+qVUMtMWSd+P+KXZZEqoa7Y6QiOudw==", "dev": true, "license": "MIT", "dependencies": { @@ -39630,8 +33466,6 @@ }, "node_modules/remark-lint-hard-break-spaces": { "version": "4.1.1", - "resolved": "https://registry.npmjs.org/remark-lint-hard-break-spaces/-/remark-lint-hard-break-spaces-4.1.1.tgz", - "integrity": "sha512-AKDPDt39fvmr3yk38OKZEWJxxCOOUBE+96AsBfs+ExS5LW6oLa9041X5ahFDQHvHGzdoremEIaaElursaPEkNg==", "dev": true, "license": "MIT", "dependencies": { @@ -39647,8 +33481,6 @@ }, "node_modules/remark-lint-heading-style": { "version": "4.0.1", - "resolved": "https://registry.npmjs.org/remark-lint-heading-style/-/remark-lint-heading-style-4.0.1.tgz", - "integrity": "sha512-+rUpJ/N2CGC5xPgZ18XgsCsUBtadgEhdTi0BJPrsFmHPzL22BUHajeg9im8Y7zphUcbi1qFiKuxZd2nzDgZSXQ==", "dev": true, "license": "MIT", "dependencies": { @@ -39667,8 +33499,6 @@ }, "node_modules/remark-lint-link-title-style": { "version": "4.0.1", - "resolved": "https://registry.npmjs.org/remark-lint-link-title-style/-/remark-lint-link-title-style-4.0.1.tgz", - "integrity": "sha512-MtmnYrhjhRXR0zeiyYf/7GBlUF5KAPypJb345KjyDluOhI4Wj4VAXvVQuov/MFc3y8p/1yVwv3QDYv6yue8/wQ==", "dev": true, "license": "MIT", "dependencies": { @@ -39685,8 +33515,6 @@ }, "node_modules/remark-lint-list-item-bullet-indent": { "version": "5.0.1", - "resolved": "https://registry.npmjs.org/remark-lint-list-item-bullet-indent/-/remark-lint-list-item-bullet-indent-5.0.1.tgz", - "integrity": "sha512-LKuTxkw5aYChzZoF3BkfaBheSCHs0T8n8dPHLQEuOLo6iC5wy98iyryz0KZ61GD8stlZgQO2KdWSdnP6vr40Iw==", "dev": true, "license": "MIT", "dependencies": { @@ -39702,8 +33530,6 @@ }, "node_modules/remark-lint-list-item-content-indent": { "version": "4.0.1", - "resolved": "https://registry.npmjs.org/remark-lint-list-item-content-indent/-/remark-lint-list-item-content-indent-4.0.1.tgz", - "integrity": "sha512-KSopxxp64O6dLuTQ2sWaTqgjKWr1+AoB1QCTektMJ3mfHfn0QyZzC2CZbBU22KGzBhiYXv9cIxlJlxUtq2NqHg==", "dev": true, "license": "MIT", "dependencies": { @@ -39722,8 +33548,6 @@ }, "node_modules/remark-lint-list-item-indent": { "version": "4.0.1", - "resolved": "https://registry.npmjs.org/remark-lint-list-item-indent/-/remark-lint-list-item-indent-4.0.1.tgz", - "integrity": "sha512-gJd1Q+jOAeTgmGRsdMpnRh01DUrAm0O5PCQxE8ttv1QZOV015p/qJH+B4N6QSmcUuPokHLAh9USuq05C73qpiA==", "dev": true, "license": "MIT", "dependencies": { @@ -39741,8 +33565,6 @@ }, "node_modules/remark-lint-no-blockquote-without-marker": { "version": "6.0.1", - "resolved": "https://registry.npmjs.org/remark-lint-no-blockquote-without-marker/-/remark-lint-no-blockquote-without-marker-6.0.1.tgz", - "integrity": "sha512-b4IOkNcG7C16HYAdKUeAhO7qPt45m+v7SeYbVrqvbSFtlD3EUBL8fgHRgLK1mdujFXDP1VguOEMx+Txv8JOT4w==", "dev": true, "license": "MIT", "dependencies": { @@ -39763,8 +33585,6 @@ }, "node_modules/remark-lint-no-duplicate-definitions": { "version": "4.0.1", - "resolved": "https://registry.npmjs.org/remark-lint-no-duplicate-definitions/-/remark-lint-no-duplicate-definitions-4.0.1.tgz", - "integrity": "sha512-Ek+A/xDkv5Nn+BXCFmf+uOrFSajCHj6CjhsHjtROgVUeEPj726yYekDBoDRA0Y3+z+U30AsJoHgf/9Jj1IFSug==", "dev": true, "license": "MIT", "dependencies": { @@ -39782,8 +33602,6 @@ }, "node_modules/remark-lint-no-heading-content-indent": { "version": "5.0.1", - "resolved": "https://registry.npmjs.org/remark-lint-no-heading-content-indent/-/remark-lint-no-heading-content-indent-5.0.1.tgz", - "integrity": "sha512-YIWktnZo7M9aw7PGnHdshvetSH3Y0qW+Fm143R66zsk5lLzn1XA5NEd/MtDzP8tSxxV+gcv+bDd5St1QUI4oSQ==", "dev": true, "license": "MIT", "dependencies": { @@ -39801,8 +33619,6 @@ }, "node_modules/remark-lint-no-literal-urls": { "version": "4.0.1", - "resolved": "https://registry.npmjs.org/remark-lint-no-literal-urls/-/remark-lint-no-literal-urls-4.0.1.tgz", - "integrity": "sha512-RhTANFkFFXE6bM+WxWcPo2TTPEfkWG3lJZU50ycW7tJJmxUzDNzRed/z80EVJIdGwFa0NntVooLUJp3xrogalQ==", "dev": true, "license": "MIT", "dependencies": { @@ -39820,8 +33636,6 @@ }, "node_modules/remark-lint-no-literal-urls/node_modules/micromark-util-character": { "version": "2.1.1", - "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", - "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", "dev": true, "funding": [ { @@ -39841,8 +33655,6 @@ }, "node_modules/remark-lint-no-literal-urls/node_modules/micromark-util-symbol": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", - "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", "dev": true, "funding": [ { @@ -39858,8 +33670,6 @@ }, "node_modules/remark-lint-no-shortcut-reference-image": { "version": "4.0.1", - "resolved": "https://registry.npmjs.org/remark-lint-no-shortcut-reference-image/-/remark-lint-no-shortcut-reference-image-4.0.1.tgz", - "integrity": "sha512-hQhJ3Dr8ZWRdj7qm6+9vcPpqtGchhENA2UHOmcTraLf6dN1cFATCgY/HbTbRIN6NkG/EEClTgRC1QCokWR2Mmw==", "dev": true, "license": "MIT", "dependencies": { @@ -39874,8 +33684,6 @@ }, "node_modules/remark-lint-no-shortcut-reference-link": { "version": "4.0.1", - "resolved": "https://registry.npmjs.org/remark-lint-no-shortcut-reference-link/-/remark-lint-no-shortcut-reference-link-4.0.1.tgz", - "integrity": "sha512-YxciuUZc90QaJYhayGO80lS3zxEOBgwwLW1MKYB7AfUdkrLcLVlS+DFloiq0MZ7EDVXuuGUEnIzyjyLSbI5BUA==", "dev": true, "license": "MIT", "dependencies": { @@ -39890,8 +33698,6 @@ }, "node_modules/remark-lint-no-undefined-references": { "version": "5.0.2", - "resolved": "https://registry.npmjs.org/remark-lint-no-undefined-references/-/remark-lint-no-undefined-references-5.0.2.tgz", - "integrity": "sha512-5prkVb1tKwJwr5+kct/UjsLjvMdEDO7uClPeGfrxfAcN59+pWU8OUSYiqYmpSKWJPIdyxPRS8Oyf1HtaYvg8VQ==", "dev": true, "license": "MIT", "dependencies": { @@ -39911,8 +33717,6 @@ }, "node_modules/remark-lint-no-unused-definitions": { "version": "4.0.2", - "resolved": "https://registry.npmjs.org/remark-lint-no-unused-definitions/-/remark-lint-no-unused-definitions-4.0.2.tgz", - "integrity": "sha512-KRzPmvfq6b3LSEcAQZobAn+5eDfPTle0dPyDEywgPSc3E7MIdRZQenL9UL8iIqHQWK4FvdUD0GX8FXGqu5EuCw==", "dev": true, "license": "MIT", "dependencies": { @@ -39928,8 +33732,6 @@ }, "node_modules/remark-lint-ordered-list-marker-style": { "version": "4.0.1", - "resolved": "https://registry.npmjs.org/remark-lint-ordered-list-marker-style/-/remark-lint-ordered-list-marker-style-4.0.1.tgz", - "integrity": "sha512-vZTAbstcBPbGwJacwldGzdGmKwy5/4r29SZ9nQkME4alEl5B1ReSBlYa8t7QnTSW7+tqvA9Sg71RPadgAKWa4w==", "dev": true, "license": "MIT", "dependencies": { @@ -39948,8 +33750,6 @@ }, "node_modules/remark-lint-ordered-list-marker-style/node_modules/micromark-util-character": { "version": "2.1.1", - "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", - "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", "dev": true, "funding": [ { @@ -39969,8 +33769,6 @@ }, "node_modules/remark-lint-ordered-list-marker-style/node_modules/micromark-util-symbol": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", - "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", "dev": true, "funding": [ { @@ -39986,8 +33784,6 @@ }, "node_modules/remark-lint-ordered-list-marker-value": { "version": "4.0.1", - "resolved": "https://registry.npmjs.org/remark-lint-ordered-list-marker-value/-/remark-lint-ordered-list-marker-value-4.0.1.tgz", - "integrity": "sha512-HQb1MrArvApREC1/I6bkiFlZVDjngsuII29n8E8StnAaHOMN3hVYy6wJ9Uk+O3+X9O8v7fDsZPqFUHSfJhERXQ==", "dev": true, "license": "MIT", "dependencies": { @@ -40007,8 +33803,6 @@ }, "node_modules/remark-lint-ordered-list-marker-value/node_modules/micromark-util-character": { "version": "2.1.1", - "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", - "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", "dev": true, "funding": [ { @@ -40028,8 +33822,6 @@ }, "node_modules/remark-lint-ordered-list-marker-value/node_modules/micromark-util-symbol": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", - "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", "dev": true, "funding": [ { @@ -40045,8 +33837,6 @@ }, "node_modules/remark-lint-rule-style": { "version": "4.0.1", - "resolved": "https://registry.npmjs.org/remark-lint-rule-style/-/remark-lint-rule-style-4.0.1.tgz", - "integrity": "sha512-gl1Ft13oTS3dJUCsWZzxD/5dAwI1HON67KU7uNfODD5gXJ8Y11deOWbun190ma7XbYdD7P0l8VT2HeRtEQzrWg==", "dev": true, "license": "MIT", "dependencies": { @@ -40064,8 +33854,6 @@ }, "node_modules/remark-lint-strong-marker": { "version": "4.0.1", - "resolved": "https://registry.npmjs.org/remark-lint-strong-marker/-/remark-lint-strong-marker-4.0.1.tgz", - "integrity": "sha512-KaGtj/OWEP4eoafevnlp3NsEVwC7yGEjBJ6uFMzfjNoXyjATdfZ2euB/AfKVt/A/FdZeeMeVoAUFH4DL+hScLQ==", "dev": true, "license": "MIT", "dependencies": { @@ -40082,8 +33870,6 @@ }, "node_modules/remark-lint-table-cell-padding": { "version": "5.1.1", - "resolved": "https://registry.npmjs.org/remark-lint-table-cell-padding/-/remark-lint-table-cell-padding-5.1.1.tgz", - "integrity": "sha512-6fgVA1iINBoAJaZMOnSsxrF9Qj9+hmCqrsrqZqgJJETjT1ODGH64iAN1/6vHR7dIwmy73d6ysB2WrGyKhVlK3A==", "dev": true, "license": "MIT", "dependencies": { @@ -40104,8 +33890,6 @@ }, "node_modules/remark-mdx": { "version": "3.1.1", - "resolved": "https://registry.npmjs.org/remark-mdx/-/remark-mdx-3.1.1.tgz", - "integrity": "sha512-Pjj2IYlUY3+D8x00UJsIOg5BEvfMyeI+2uLPn9VO9Wg4MEtN/VTIq2NEJQfde9PnX15KgtHyl9S0BcTnWrIuWg==", "license": "MIT", "dependencies": { "mdast-util-mdx": "^3.0.0", @@ -40118,8 +33902,6 @@ }, "node_modules/remark-message-control": { "version": "8.0.0", - "resolved": "https://registry.npmjs.org/remark-message-control/-/remark-message-control-8.0.0.tgz", - "integrity": "sha512-brpzOO+jdyE/mLqvqqvbogmhGxKygjpCUCG/PwSCU43+JZQ+RM+sSzkCWBcYvgF3KIAVNIoPsvXjBkzO7EdsYQ==", "dev": true, "license": "MIT", "dependencies": { @@ -40135,8 +33917,6 @@ }, "node_modules/remark-parse": { "version": "11.0.0", - "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-11.0.0.tgz", - "integrity": "sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA==", "license": "MIT", "dependencies": { "@types/mdast": "^4.0.0", @@ -40151,8 +33931,6 @@ }, "node_modules/remark-preset-lint-consistent": { "version": "6.0.1", - "resolved": "https://registry.npmjs.org/remark-preset-lint-consistent/-/remark-preset-lint-consistent-6.0.1.tgz", - "integrity": "sha512-SOLdA36UOU1hiGFm6HAqN9+DORGJPVWxU/EvPVkknTr9V4ULhlzHEJ8OVRMVX3jqoy4lrwb4IqiboVz0YLA7+Q==", "dev": true, "license": "MIT", "dependencies": { @@ -40179,8 +33957,6 @@ }, "node_modules/remark-preset-lint-recommended": { "version": "7.0.1", - "resolved": "https://registry.npmjs.org/remark-preset-lint-recommended/-/remark-preset-lint-recommended-7.0.1.tgz", - "integrity": "sha512-j1CY5u48PtZl872BQ40uWSQMT3R4gXKp0FUgevMu5gW7hFMtvaCiDq+BfhzeR8XKKiW9nIMZGfIMZHostz5X4g==", "dev": true, "license": "MIT", "dependencies": { @@ -40207,8 +33983,6 @@ }, "node_modules/remark-rehype": { "version": "11.1.2", - "resolved": "https://registry.npmjs.org/remark-rehype/-/remark-rehype-11.1.2.tgz", - "integrity": "sha512-Dh7l57ianaEoIpzbp0PC9UKAdCSVklD8E5Rpw7ETfbTl3FqcOOgq5q2LVDhgGCkaBv7p24JXikPdvhhmHvKMsw==", "license": "MIT", "dependencies": { "@types/hast": "^3.0.0", @@ -40224,8 +33998,6 @@ }, "node_modules/remark-stringify": { "version": "11.0.0", - "resolved": "https://registry.npmjs.org/remark-stringify/-/remark-stringify-11.0.0.tgz", - "integrity": "sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw==", "license": "MIT", "dependencies": { "@types/mdast": "^4.0.0", @@ -40239,21 +34011,15 @@ }, "node_modules/remove-markdown": { "version": "0.3.0", - "resolved": "https://registry.npmjs.org/remove-markdown/-/remove-markdown-0.3.0.tgz", - "integrity": "sha512-5392eIuy1mhjM74739VunOlsOYKjsH82rQcTBlJ1bkICVC3dQ3ksQzTHh4jGHQFnM+1xzLzcFOMH+BofqXhroQ==", "dev": true, "license": "MIT" }, "node_modules/remove-trailing-slash": { "version": "0.1.1", - "resolved": "https://registry.npmjs.org/remove-trailing-slash/-/remove-trailing-slash-0.1.1.tgz", - "integrity": "sha512-o4S4Qh6L2jpnCy83ysZDau+VORNvnFw07CKSAymkd6ICNVEPisMyzlc00KlvvicsxKck94SEwhDnMNdICzO+tA==", "license": "MIT" }, "node_modules/renderkid": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-3.0.0.tgz", - "integrity": "sha512-q/7VIQA8lmM1hF+jn+sFSPWGlMkSAeNYcPLmDQx2zzuiDfaLrOmumR8iaUKlenFgh0XRPIUeSPlH3A+AW3Z5pg==", "license": "MIT", "dependencies": { "css-select": "^4.1.3", @@ -40265,8 +34031,6 @@ }, "node_modules/renderkid/node_modules/css-select": { "version": "4.3.0", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz", - "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==", "license": "BSD-2-Clause", "dependencies": { "boolbase": "^1.0.0", @@ -40281,8 +34045,6 @@ }, "node_modules/renderkid/node_modules/dom-serializer": { "version": "1.4.1", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", - "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", "license": "MIT", "dependencies": { "domelementtype": "^2.0.1", @@ -40295,8 +34057,6 @@ }, "node_modules/renderkid/node_modules/domhandler": { "version": "4.3.1", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", - "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", "license": "BSD-2-Clause", "dependencies": { "domelementtype": "^2.2.0" @@ -40310,8 +34070,6 @@ }, "node_modules/renderkid/node_modules/domutils": { "version": "2.8.0", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", - "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", "license": "BSD-2-Clause", "dependencies": { "dom-serializer": "^1.0.1", @@ -40324,8 +34082,6 @@ }, "node_modules/renderkid/node_modules/entities": { "version": "2.2.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", - "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", "license": "BSD-2-Clause", "funding": { "url": "https://github.com/fb55/entities?sponsor=1" @@ -40333,8 +34089,6 @@ }, "node_modules/renderkid/node_modules/htmlparser2": { "version": "6.1.0", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-6.1.0.tgz", - "integrity": "sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==", "funding": [ "https://github.com/fb55/htmlparser2?sponsor=1", { @@ -40352,8 +34106,6 @@ }, "node_modules/repeat-string": { "version": "1.6.1", - "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", - "integrity": "sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==", "license": "MIT", "engines": { "node": ">=0.10" @@ -40361,8 +34113,6 @@ }, "node_modules/require-directory": { "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", "license": "MIT", "engines": { "node": ">=0.10.0" @@ -40370,8 +34120,6 @@ }, "node_modules/require-from-string": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", - "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", "license": "MIT", "engines": { "node": ">=0.10.0" @@ -40379,16 +34127,12 @@ }, "node_modules/require-like": { "version": "0.1.2", - "resolved": "https://registry.npmjs.org/require-like/-/require-like-0.1.2.tgz", - "integrity": "sha512-oyrU88skkMtDdauHDuKVrgR+zuItqr6/c//FXzvmxRGMexSDc6hNvJInGW3LL46n+8b50RykrvwSUIIQH2LQ5A==", "engines": { "node": "*" } }, "node_modules/requireg": { "version": "0.2.2", - "resolved": "https://registry.npmjs.org/requireg/-/requireg-0.2.2.tgz", - "integrity": "sha512-nYzyjnFcPNGR3lx9lwPPPnuQxv6JWEZd2Ci0u9opN7N5zUEPIhY/GbL3vMGOr2UXwEg9WwSyV9X9Y/kLFgPsOg==", "dev": true, "dependencies": { "nested-error-stacks": "~2.0.1", @@ -40401,8 +34145,6 @@ }, "node_modules/requireg/node_modules/resolve": { "version": "1.7.1", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.7.1.tgz", - "integrity": "sha512-c7rwLofp8g1U+h1KNyHL/jicrKg1Ek4q+Lr33AL65uZTinUZHe30D5HlyN5V9NW0JX1D5dXQ4jqW5l7Sy/kGfw==", "dev": true, "license": "MIT", "dependencies": { @@ -40411,14 +34153,10 @@ }, "node_modules/requires-port": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", - "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", "license": "MIT" }, "node_modules/resolve": { "version": "1.22.11", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.11.tgz", - "integrity": "sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ==", "license": "MIT", "dependencies": { "is-core-module": "^2.16.1", @@ -40437,14 +34175,10 @@ }, "node_modules/resolve-alpn": { "version": "1.2.1", - "resolved": "https://registry.npmjs.org/resolve-alpn/-/resolve-alpn-1.2.1.tgz", - "integrity": "sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==", "license": "MIT" }, "node_modules/resolve-cwd": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", - "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", "license": "MIT", "dependencies": { "resolve-from": "^5.0.0" @@ -40455,8 +34189,6 @@ }, "node_modules/resolve-from": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", "license": "MIT", "engines": { "node": ">=8" @@ -40464,14 +34196,10 @@ }, "node_modules/resolve-pathname": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-pathname/-/resolve-pathname-3.0.0.tgz", - "integrity": "sha512-C7rARubxI8bXFNB/hqcp/4iUeIXJhJZvFPFPiSPRnhU5UPxzMFIl+2E6yY6c4k9giDJAhtV+enfA+G89N6Csng==", "license": "MIT" }, "node_modules/resolve-pkg-maps": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", - "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==", "devOptional": true, "license": "MIT", "funding": { @@ -40480,8 +34208,6 @@ }, "node_modules/responselike": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/responselike/-/responselike-3.0.0.tgz", - "integrity": "sha512-40yHxbNcl2+rzXvZuVkrYohathsSJlMTXKryG5y8uciHv1+xDLHQpgjG64JUO9nrEq2jGLH6IZ8BcZyw3wrweg==", "license": "MIT", "dependencies": { "lowercase-keys": "^3.0.0" @@ -40495,8 +34221,6 @@ }, "node_modules/restore-cursor": { "version": "5.1.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-5.1.0.tgz", - "integrity": "sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==", "dev": true, "license": "MIT", "dependencies": { @@ -40512,8 +34236,6 @@ }, "node_modules/retry": { "version": "0.13.1", - "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", - "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==", "license": "MIT", "engines": { "node": ">= 4" @@ -40521,8 +34243,6 @@ }, "node_modules/retry-request": { "version": "8.0.2", - "resolved": "https://registry.npmjs.org/retry-request/-/retry-request-8.0.2.tgz", - "integrity": "sha512-JzFPAfklk1kjR1w76f0QOIhoDkNkSqW8wYKT08n9yysTmZfB+RQ2QoXoTAeOi1HD9ZipTyTAZg3c4pM/jeqgSw==", "license": "MIT", "dependencies": { "extend": "^3.0.2", @@ -40534,15 +34254,11 @@ }, "node_modules/rettime": { "version": "0.10.1", - "resolved": "https://registry.npmjs.org/rettime/-/rettime-0.10.1.tgz", - "integrity": "sha512-uyDrIlUEH37cinabq0AX4QbgV4HbFZ/gqoiunWQ1UqBtRvTTytwhNYjE++pO/MjPTZL5KQCf2bEoJ/BJNVQ5Kw==", "dev": true, "license": "MIT" }, "node_modules/reusify": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", - "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", "license": "MIT", "engines": { "iojs": ">=1.0.0", @@ -40551,15 +34267,11 @@ }, "node_modules/rfdc": { "version": "1.4.1", - "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.4.1.tgz", - "integrity": "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==", "dev": true, "license": "MIT" }, "node_modules/rimraf": { "version": "5.0.10", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-5.0.10.tgz", - "integrity": "sha512-l0OE8wL34P4nJH/H2ffoaniAokM2qSmrtXHmlpvYr5AVVX8msAyW0l8NVJFDxlSK4u3Uh/f41cQheDVdnYijwQ==", "license": "ISC", "dependencies": { "glob": "^10.3.7" @@ -40573,14 +34285,10 @@ }, "node_modules/rimraf/node_modules/balanced-match": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", "license": "MIT" }, "node_modules/rimraf/node_modules/brace-expansion": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", - "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", "license": "MIT", "dependencies": { "balanced-match": "^1.0.0" @@ -40588,9 +34296,6 @@ }, "node_modules/rimraf/node_modules/glob": { "version": "10.5.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.5.0.tgz", - "integrity": "sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==", - "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", "license": "ISC", "dependencies": { "foreground-child": "^3.1.0", @@ -40609,14 +34314,10 @@ }, "node_modules/rimraf/node_modules/lru-cache": { "version": "10.4.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", - "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", "license": "ISC" }, "node_modules/rimraf/node_modules/minimatch": { "version": "9.0.9", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.9.tgz", - "integrity": "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==", "license": "ISC", "dependencies": { "brace-expansion": "^2.0.2" @@ -40630,8 +34331,6 @@ }, "node_modules/rimraf/node_modules/path-scurry": { "version": "1.11.1", - "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", - "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", "license": "BlueOak-1.0.0", "dependencies": { "lru-cache": "^10.2.0", @@ -40646,14 +34345,10 @@ }, "node_modules/robust-predicates": { "version": "3.0.2", - "resolved": "https://registry.npmjs.org/robust-predicates/-/robust-predicates-3.0.2.tgz", - "integrity": "sha512-IXgzBWvWQwE6PrDI05OvmXUIruQTcoMDzRsOd5CDvHCVLcLHMTSYvOK5Cm46kWqlV3yAbuSpBZdJ5oP5OUoStg==", "license": "Unlicense" }, "node_modules/rollup": { "version": "4.59.0", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.59.0.tgz", - "integrity": "sha512-2oMpl67a3zCH9H79LeMcbDhXW/UmWG/y2zuqnF2jQq5uq9TbM9TVyXvA4+t+ne2IIkBdrLpAaRQAvo7YI/Yyeg==", "license": "MIT", "dependencies": { "@types/estree": "1.0.8" @@ -40696,8 +34391,6 @@ }, "node_modules/roughjs": { "version": "4.6.6", - "resolved": "https://registry.npmjs.org/roughjs/-/roughjs-4.6.6.tgz", - "integrity": "sha512-ZUz/69+SYpFN/g/lUlo2FXcIjRkSu3nDarreVdGGndHEBJ6cXPdKguS8JGxwj5HA5xIbVKSmLgr5b3AWxtRfvQ==", "license": "MIT", "dependencies": { "hachure-fill": "^0.5.2", @@ -40708,8 +34401,6 @@ }, "node_modules/router": { "version": "2.2.0", - "resolved": "https://registry.npmjs.org/router/-/router-2.2.0.tgz", - "integrity": "sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==", "license": "MIT", "dependencies": { "debug": "^4.4.0", @@ -40724,8 +34415,6 @@ }, "node_modules/router/node_modules/path-to-regexp": { "version": "8.3.0", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-8.3.0.tgz", - "integrity": "sha512-7jdwVIRtsP8MYpdXSwOS0YdD0Du+qOoF/AEPIt88PcCFrZCzx41oxku1jD88hZBwbNUIEfpqvuhjFaMAqMTWnA==", "license": "MIT", "funding": { "type": "opencollective", @@ -40734,14 +34423,10 @@ }, "node_modules/rrweb-cssom": { "version": "0.8.0", - "resolved": "https://registry.npmjs.org/rrweb-cssom/-/rrweb-cssom-0.8.0.tgz", - "integrity": "sha512-guoltQEx+9aMf2gDZ0s62EcV8lsXR+0w8915TC3ITdn2YueuNjdAYh/levpU9nFaoChh9RUS5ZdQMrKfVEN9tw==", "license": "MIT" }, "node_modules/rtlcss": { "version": "4.3.0", - "resolved": "https://registry.npmjs.org/rtlcss/-/rtlcss-4.3.0.tgz", - "integrity": "sha512-FI+pHEn7Wc4NqKXMXFM+VAYKEj/mRIcW4h24YVwVtyjI+EqGrLc2Hx/Ny0lrZ21cBWU2goLy36eqMcNj3AQJig==", "license": "MIT", "dependencies": { "escalade": "^3.1.1", @@ -40758,8 +34443,6 @@ }, "node_modules/run-applescript": { "version": "7.1.0", - "resolved": "https://registry.npmjs.org/run-applescript/-/run-applescript-7.1.0.tgz", - "integrity": "sha512-DPe5pVFaAsinSaV6QjQ6gdiedWDcRCbUuiQfQa2wmWV7+xC9bGulGI8+TdRmoFkAPaBXk8CrAbnlY2ISniJ47Q==", "license": "MIT", "engines": { "node": ">=18" @@ -40770,8 +34453,6 @@ }, "node_modules/run-parallel": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", "funding": [ { "type": "github", @@ -40793,14 +34474,10 @@ }, "node_modules/rw": { "version": "1.3.3", - "resolved": "https://registry.npmjs.org/rw/-/rw-1.3.3.tgz", - "integrity": "sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ==", "license": "BSD-3-Clause" }, "node_modules/s3mini": { "version": "0.9.1", - "resolved": "https://registry.npmjs.org/s3mini/-/s3mini-0.9.1.tgz", - "integrity": "sha512-aIsdMFbNEjA10KRRTWuEn52zX8kkB5ByrWOoyZg/WFrsMLqGbypTf0y2M7DdltoKkl+FYzl3g/SXJLvVZ54eXw==", "license": "MIT", "engines": { "node": ">=20" @@ -40808,8 +34485,6 @@ }, "node_modules/safe-array-concat": { "version": "1.1.3", - "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.3.tgz", - "integrity": "sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==", "license": "MIT", "dependencies": { "call-bind": "^1.0.8", @@ -40827,8 +34502,6 @@ }, "node_modules/safe-buffer": { "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", "funding": [ { "type": "github", @@ -40847,14 +34520,10 @@ }, "node_modules/safe-json-stringify": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/safe-json-stringify/-/safe-json-stringify-1.2.0.tgz", - "integrity": "sha512-gH8eh2nZudPQO6TytOvbxnuhYBOvDBBLW52tz5q6X58lJcd/tkmqFR+5Z9adS8aJtURSXWThWy/xJtJwixErvg==", "license": "MIT" }, "node_modules/safe-push-apply": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/safe-push-apply/-/safe-push-apply-1.0.0.tgz", - "integrity": "sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==", "license": "MIT", "dependencies": { "es-errors": "^1.3.0", @@ -40869,8 +34538,6 @@ }, "node_modules/safe-regex-test": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.1.0.tgz", - "integrity": "sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==", "license": "MIT", "dependencies": { "call-bound": "^1.0.2", @@ -40886,14 +34553,10 @@ }, "node_modules/safer-buffer": { "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", "license": "MIT" }, "node_modules/sass": { "version": "1.97.3", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.97.3.tgz", - "integrity": "sha512-fDz1zJpd5GycprAbu4Q2PV/RprsRtKC/0z82z0JLgdytmcq0+ujJbJ/09bPGDxCLkKY3Np5cRAOcWiVkLXJURg==", "license": "MIT", "dependencies": { "chokidar": "^4.0.0", @@ -40912,8 +34575,6 @@ }, "node_modules/sass-loader": { "version": "16.0.7", - "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-16.0.7.tgz", - "integrity": "sha512-w6q+fRHourZ+e+xA1kcsF27iGM6jdB8teexYCfdUw0sYgcDNeZESnDNT9sUmmPm3ooziwUJXGwZJSTF3kOdBfA==", "license": "MIT", "dependencies": { "neo-async": "^2.6.2" @@ -40952,8 +34613,6 @@ }, "node_modules/sass/node_modules/chokidar": { "version": "4.0.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", - "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", "license": "MIT", "dependencies": { "readdirp": "^4.0.1" @@ -40967,8 +34626,6 @@ }, "node_modules/sass/node_modules/readdirp": { "version": "4.1.2", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz", - "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==", "license": "MIT", "engines": { "node": ">= 14.18.0" @@ -40980,8 +34637,6 @@ }, "node_modules/sax": { "version": "1.5.0", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.5.0.tgz", - "integrity": "sha512-21IYA3Q5cQf089Z6tgaUTr7lDAyzoTPx5HRtbhsME8Udispad8dC/+sziTNugOEx54ilvatQ9YCzl4KQLPcRHA==", "license": "BlueOak-1.0.0", "engines": { "node": ">=11.0.0" @@ -40989,8 +34644,6 @@ }, "node_modules/saxes": { "version": "6.0.0", - "resolved": "https://registry.npmjs.org/saxes/-/saxes-6.0.0.tgz", - "integrity": "sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==", "license": "ISC", "dependencies": { "xmlchars": "^2.2.0" @@ -41001,20 +34654,14 @@ }, "node_modules/scheduler": { "version": "0.27.0", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.27.0.tgz", - "integrity": "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==", "license": "MIT" }, "node_modules/schema-dts": { "version": "1.1.5", - "resolved": "https://registry.npmjs.org/schema-dts/-/schema-dts-1.1.5.tgz", - "integrity": "sha512-RJr9EaCmsLzBX2NDiO5Z3ux2BVosNZN5jo0gWgsyKvxKIUL5R3swNvoorulAeL9kLB0iTSX7V6aokhla2m7xbg==", "license": "Apache-2.0" }, "node_modules/schema-utils": { "version": "4.3.3", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.3.3.tgz", - "integrity": "sha512-eflK8wEtyOE6+hsaRVPxvUKYCpRgzLqDTb8krvAsRIwOGlHoSgYLgBXoubGgLd2fT41/OUYdb48v4k4WWHQurA==", "license": "MIT", "dependencies": { "@types/json-schema": "^7.0.9", @@ -41032,8 +34679,6 @@ }, "node_modules/schema-utils/node_modules/ajv-formats": { "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", - "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", "license": "MIT", "dependencies": { "ajv": "^8.0.0" @@ -41049,15 +34694,11 @@ }, "node_modules/search-insights": { "version": "2.17.3", - "resolved": "https://registry.npmjs.org/search-insights/-/search-insights-2.17.3.tgz", - "integrity": "sha512-RQPdCYTa8A68uM2jwxoY842xDhvx3E5LFL1LxvxCNMev4o5mLuokczhzjAgGwUZBAmOKZknArSxLKmXtIi2AxQ==", "license": "MIT", "peer": true }, "node_modules/section-matter": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/section-matter/-/section-matter-1.0.0.tgz", - "integrity": "sha512-vfD3pmTzGpufjScBh50YHKzEu2lxBWhVEHsNGoEXmCmn2hKGfeNLYMzCJpe8cD7gqX7TJluOVpBkAequ6dgMmA==", "license": "MIT", "dependencies": { "extend-shallow": "^2.0.1", @@ -41069,14 +34710,10 @@ }, "node_modules/select-hose": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", - "integrity": "sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==", "license": "MIT" }, "node_modules/selfsigned": { "version": "5.5.0", - "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-5.5.0.tgz", - "integrity": "sha512-ftnu3TW4+3eBfLRFnDEkzGxSF/10BJBkaLJuBHZX0kiPS7bRdlpZGu6YGt4KngMkdTwJE6MbjavFpqHvqVt+Ew==", "license": "MIT", "dependencies": { "@peculiar/x509": "^1.14.2", @@ -41088,8 +34725,6 @@ }, "node_modules/semver": { "version": "7.7.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", - "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", "license": "ISC", "bin": { "semver": "bin/semver.js" @@ -41100,8 +34735,6 @@ }, "node_modules/semver-diff": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-4.0.0.tgz", - "integrity": "sha512-0Ju4+6A8iOnpL/Thra7dZsSlOHYAHIeMxfhWQRI1/VLcT3WDBZKKtQt/QkBOsiIN9ZpuvHE6cGZ0x4glCMmfiA==", "license": "MIT", "dependencies": { "semver": "^7.3.5" @@ -41115,8 +34748,6 @@ }, "node_modules/send": { "version": "0.19.2", - "resolved": "https://registry.npmjs.org/send/-/send-0.19.2.tgz", - "integrity": "sha512-VMbMxbDeehAxpOtWJXlcUS5E8iXh6QmN+BkRX1GARS3wRaXEEgzCcB10gTQazO42tpNIya8xIyNx8fll1OFPrg==", "license": "MIT", "dependencies": { "debug": "2.6.9", @@ -41139,8 +34770,6 @@ }, "node_modules/send/node_modules/debug": { "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "license": "MIT", "dependencies": { "ms": "2.0.0" @@ -41148,14 +34777,10 @@ }, "node_modules/send/node_modules/debug/node_modules/ms": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "license": "MIT" }, "node_modules/serialize-javascript": { "version": "6.0.2", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz", - "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==", "license": "BSD-3-Clause", "dependencies": { "randombytes": "^2.1.0" @@ -41163,8 +34788,6 @@ }, "node_modules/serve-handler": { "version": "6.1.6", - "resolved": "https://registry.npmjs.org/serve-handler/-/serve-handler-6.1.6.tgz", - "integrity": "sha512-x5RL9Y2p5+Sh3D38Fh9i/iQ5ZK+e4xuXRd/pGbM4D13tgo/MGwbttUk8emytcr1YYzBYs+apnUngBDFYfpjPuQ==", "license": "MIT", "dependencies": { "bytes": "3.0.0", @@ -41178,14 +34801,10 @@ }, "node_modules/serve-handler/node_modules/balanced-match": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", "license": "MIT" }, "node_modules/serve-handler/node_modules/brace-expansion": { "version": "1.1.12", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", - "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", "license": "MIT", "dependencies": { "balanced-match": "^1.0.0", @@ -41194,8 +34813,6 @@ }, "node_modules/serve-handler/node_modules/bytes": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", - "integrity": "sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==", "license": "MIT", "engines": { "node": ">= 0.8" @@ -41203,8 +34820,6 @@ }, "node_modules/serve-handler/node_modules/content-disposition": { "version": "0.5.2", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz", - "integrity": "sha512-kRGRZw3bLlFISDBgwTSA1TMBFN6J6GWDeubmDE3AF+3+yXL8hTWv8r5rkLbqYXY4RjPk/EzHnClI3zQf1cFmHA==", "license": "MIT", "engines": { "node": ">= 0.6" @@ -41212,8 +34827,6 @@ }, "node_modules/serve-handler/node_modules/mime-db": { "version": "1.33.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.33.0.tgz", - "integrity": "sha512-BHJ/EKruNIqJf/QahvxwQZXKygOQ256myeN/Ew+THcAa5q+PjyTTMMeNQC4DZw5AwfvelsUrA6B67NKMqXDbzQ==", "license": "MIT", "engines": { "node": ">= 0.6" @@ -41221,8 +34834,6 @@ }, "node_modules/serve-handler/node_modules/mime-types": { "version": "2.1.18", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.18.tgz", - "integrity": "sha512-lc/aahn+t4/SWV/qcmumYjymLsWfN3ELhpmVuUFjgsORruuZPVSwAQryq+HHGvO/SI2KVX26bx+En+zhM8g8hQ==", "license": "MIT", "dependencies": { "mime-db": "~1.33.0" @@ -41233,8 +34844,6 @@ }, "node_modules/serve-handler/node_modules/minimatch": { "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "license": "ISC", "dependencies": { "brace-expansion": "^1.1.7" @@ -41245,14 +34854,10 @@ }, "node_modules/serve-handler/node_modules/path-to-regexp": { "version": "3.3.0", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-3.3.0.tgz", - "integrity": "sha512-qyCH421YQPS2WFDxDjftfc1ZR5WKQzVzqsp4n9M2kQhVOo/ByahFoUNJfl58kOcEGfQ//7weFTDhm+ss8Ecxgw==", "license": "MIT" }, "node_modules/serve-handler/node_modules/range-parser": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz", - "integrity": "sha512-kA5WQoNVo4t9lNx2kQNFCxKeBl5IbbSNBl1M/tLkw9WCn+hxNBAW5Qh8gdhs63CJnhjJ2zQWFoqPJP2sK1AV5A==", "license": "MIT", "engines": { "node": ">= 0.6" @@ -41260,8 +34865,6 @@ }, "node_modules/serve-index": { "version": "1.9.2", - "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.2.tgz", - "integrity": "sha512-KDj11HScOaLmrPxl70KYNW1PksP4Nb/CLL2yvC+Qd2kHMPEEpfc4Re2e4FOay+bC/+XQl/7zAcWON3JVo5v3KQ==", "license": "MIT", "dependencies": { "accepts": "~1.3.8", @@ -41282,8 +34885,6 @@ }, "node_modules/serve-index/node_modules/debug": { "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "license": "MIT", "dependencies": { "ms": "2.0.0" @@ -41291,8 +34892,6 @@ }, "node_modules/serve-index/node_modules/depd": { "version": "1.1.2", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", "license": "MIT", "engines": { "node": ">= 0.6" @@ -41300,8 +34899,6 @@ }, "node_modules/serve-index/node_modules/http-errors": { "version": "1.8.1", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.8.1.tgz", - "integrity": "sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==", "license": "MIT", "dependencies": { "depd": "~1.1.2", @@ -41316,14 +34913,10 @@ }, "node_modules/serve-index/node_modules/ms": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "license": "MIT" }, "node_modules/serve-index/node_modules/statuses": { "version": "1.5.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", - "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", "license": "MIT", "engines": { "node": ">= 0.6" @@ -41331,8 +34924,6 @@ }, "node_modules/serve-static": { "version": "1.16.3", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.3.tgz", - "integrity": "sha512-x0RTqQel6g5SY7Lg6ZreMmsOzncHFU7nhnRWkKgWuMTu5NN0DR5oruckMqRvacAN9d5w6ARnRBXl9xhDCgfMeA==", "license": "MIT", "dependencies": { "encodeurl": "~2.0.0", @@ -41346,14 +34937,10 @@ }, "node_modules/set-cookie-parser": { "version": "2.7.2", - "resolved": "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-2.7.2.tgz", - "integrity": "sha512-oeM1lpU/UvhTxw+g3cIfxXHyJRc/uidd3yK1P242gzHds0udQBYzs3y8j4gCCW+ZJ7ad0yctld8RYO+bdurlvw==", "license": "MIT" }, "node_modules/set-function-length": { "version": "1.2.2", - "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", - "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", "license": "MIT", "dependencies": { "define-data-property": "^1.1.4", @@ -41369,8 +34956,6 @@ }, "node_modules/set-function-name": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", - "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", "license": "MIT", "dependencies": { "define-data-property": "^1.1.4", @@ -41384,8 +34969,6 @@ }, "node_modules/set-proto": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/set-proto/-/set-proto-1.0.0.tgz", - "integrity": "sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==", "license": "MIT", "dependencies": { "dunder-proto": "^1.0.1", @@ -41398,14 +34981,10 @@ }, "node_modules/setprototypeof": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", - "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", "license": "ISC" }, "node_modules/sha1": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/sha1/-/sha1-1.1.1.tgz", - "integrity": "sha512-dZBS6OrMjtgVkopB1Gmo4RQCDKiZsqcpAQpkV/aaj+FCrCg8r4I4qMkDPQjBgLIxlmu9k4nUbWq6ohXahOneYA==", "dev": true, "license": "BSD-3-Clause", "dependencies": { @@ -41418,8 +34997,6 @@ }, "node_modules/shallow-clone": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", - "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", "license": "MIT", "dependencies": { "kind-of": "^6.0.2" @@ -41430,14 +35007,10 @@ }, "node_modules/shallowequal": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/shallowequal/-/shallowequal-1.1.0.tgz", - "integrity": "sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ==", "license": "MIT" }, "node_modules/shebang-command": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", "license": "MIT", "dependencies": { "shebang-regex": "^3.0.0" @@ -41448,8 +35021,6 @@ }, "node_modules/shebang-regex": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", "license": "MIT", "engines": { "node": ">=8" @@ -41457,8 +35028,6 @@ }, "node_modules/shell-quote": { "version": "1.8.3", - "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.3.tgz", - "integrity": "sha512-ObmnIF4hXNg1BqhnHmgbDETF8dLPCggZWBjkQfhZpbszZnYur5DUljTcCHii5LC3J5E0yeO/1LIMyH+UvHQgyw==", "license": "MIT", "engines": { "node": ">= 0.4" @@ -41469,8 +35038,6 @@ }, "node_modules/shiki": { "version": "4.0.2", - "resolved": "https://registry.npmjs.org/shiki/-/shiki-4.0.2.tgz", - "integrity": "sha512-eAVKTMedR5ckPo4xne/PjYQYrU3qx78gtJZ+sHlXEg5IHhhoQhMfZVzetTYuaJS0L2Ef3AcCRzCHV8T0WI6nIQ==", "license": "MIT", "dependencies": { "@shikijs/core": "4.0.2", @@ -41488,8 +35055,6 @@ }, "node_modules/side-channel": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", - "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", "license": "MIT", "dependencies": { "es-errors": "^1.3.0", @@ -41507,8 +35072,6 @@ }, "node_modules/side-channel-list": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", - "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", "license": "MIT", "dependencies": { "es-errors": "^1.3.0", @@ -41523,8 +35086,6 @@ }, "node_modules/side-channel-map": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", - "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", "license": "MIT", "dependencies": { "call-bound": "^1.0.2", @@ -41541,8 +35102,6 @@ }, "node_modules/side-channel-weakmap": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", - "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", "license": "MIT", "dependencies": { "call-bound": "^1.0.2", @@ -41560,8 +35119,6 @@ }, "node_modules/signal-exit": { "version": "4.1.0", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", - "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", "license": "ISC", "engines": { "node": ">=14" @@ -41572,8 +35129,6 @@ }, "node_modules/signale": { "version": "1.4.0", - "resolved": "https://registry.npmjs.org/signale/-/signale-1.4.0.tgz", - "integrity": "sha512-iuh+gPf28RkltuJC7W5MRi6XAjTDCAPC/prJUpQoG4vIP3MJZ+GTydVnodXA7pwvTKb2cA0m9OFZW/cdWy/I/w==", "dev": true, "license": "MIT", "dependencies": { @@ -41587,8 +35142,6 @@ }, "node_modules/signale/node_modules/ansi-styles": { "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, "license": "MIT", "dependencies": { @@ -41600,8 +35153,6 @@ }, "node_modules/signale/node_modules/chalk": { "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, "license": "MIT", "dependencies": { @@ -41615,8 +35166,6 @@ }, "node_modules/signale/node_modules/color-convert": { "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", "dev": true, "license": "MIT", "dependencies": { @@ -41625,15 +35174,11 @@ }, "node_modules/signale/node_modules/color-name": { "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", "dev": true, "license": "MIT" }, "node_modules/signale/node_modules/escape-string-regexp": { "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", "dev": true, "license": "MIT", "engines": { @@ -41642,8 +35187,6 @@ }, "node_modules/signale/node_modules/has-flag": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", "dev": true, "license": "MIT", "engines": { @@ -41652,8 +35195,6 @@ }, "node_modules/signale/node_modules/supports-color": { "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dev": true, "license": "MIT", "dependencies": { @@ -41665,8 +35206,6 @@ }, "node_modules/sigstore": { "version": "4.1.0", - "resolved": "https://registry.npmjs.org/sigstore/-/sigstore-4.1.0.tgz", - "integrity": "sha512-/fUgUhYghuLzVT/gaJoeVehLCgZiUxPCPMcyVNY0lIf/cTCz58K/WTI7PefDarXxp9nUKpEwg1yyz3eSBMTtgA==", "license": "Apache-2.0", "dependencies": { "@sigstore/bundle": "^4.0.0", @@ -41682,8 +35221,6 @@ }, "node_modules/simple-concat": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", - "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==", "dev": true, "funding": [ { @@ -41703,8 +35240,6 @@ }, "node_modules/simple-get": { "version": "4.0.1", - "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-4.0.1.tgz", - "integrity": "sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==", "dev": true, "funding": [ { @@ -41729,8 +35264,6 @@ }, "node_modules/sirv": { "version": "2.0.4", - "resolved": "https://registry.npmjs.org/sirv/-/sirv-2.0.4.tgz", - "integrity": "sha512-94Bdh3cC2PKrbgSOUqTiGPWVZeSiXfKOVZNJniWoqrWrRkB1CJzBU3NEbiTsPcYy1lDsANA/THzS+9WBiy5nfQ==", "license": "MIT", "dependencies": { "@polka/url": "^1.0.0-next.24", @@ -41743,14 +35276,10 @@ }, "node_modules/sisteransi": { "version": "1.0.5", - "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", - "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", "license": "MIT" }, "node_modules/sitemap": { "version": "7.1.3", - "resolved": "https://registry.npmjs.org/sitemap/-/sitemap-7.1.3.tgz", - "integrity": "sha512-tAjEd+wt/YwnEbfNB2ht51ybBJxbEWwe5ki/Z//Wh0rpBFTCUSj46GnxUKEWzhfuJTsee8x3lybHxFgUMig2hw==", "license": "MIT", "dependencies": { "@types/node": "^17.0.5", @@ -41768,8 +35297,6 @@ }, "node_modules/skin-tone": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/skin-tone/-/skin-tone-2.0.0.tgz", - "integrity": "sha512-kUMbT1oBJCpgrnKoSr0o6wPtvRWT9W9UKvGLwfJYO2WuahZRHOpEyL1ckyMGgMWh0UdpmaoFqKKD29WTomNEGA==", "license": "MIT", "dependencies": { "unicode-emoji-modifier-base": "^1.0.0" @@ -41780,8 +35307,6 @@ }, "node_modules/slash": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", "license": "MIT", "engines": { "node": ">=8" @@ -41789,8 +35314,6 @@ }, "node_modules/slice-ansi": { "version": "8.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-8.0.0.tgz", - "integrity": "sha512-stxByr12oeeOyY2BlviTNQlYV5xOj47GirPr4yA1hE9JCtxfQN0+tVbkxwCtYDQWhEKWFHsEK48ORg5jrouCAg==", "dev": true, "license": "MIT", "dependencies": { @@ -41806,8 +35329,6 @@ }, "node_modules/smart-buffer": { "version": "4.2.0", - "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", - "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", "license": "MIT", "engines": { "node": ">= 6.0.0", @@ -41816,8 +35337,6 @@ }, "node_modules/snake-case": { "version": "3.0.4", - "resolved": "https://registry.npmjs.org/snake-case/-/snake-case-3.0.4.tgz", - "integrity": "sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg==", "license": "MIT", "dependencies": { "dot-case": "^3.0.4", @@ -41826,8 +35345,6 @@ }, "node_modules/sockjs": { "version": "0.3.24", - "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.24.tgz", - "integrity": "sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ==", "license": "MIT", "dependencies": { "faye-websocket": "^0.11.3", @@ -41837,8 +35354,6 @@ }, "node_modules/sockjs/node_modules/uuid": { "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", "license": "MIT", "bin": { "uuid": "dist/bin/uuid" @@ -41846,8 +35361,6 @@ }, "node_modules/socks": { "version": "2.8.7", - "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.7.tgz", - "integrity": "sha512-HLpt+uLy/pxB+bum/9DzAgiKS8CX1EvbWxI4zlmgGCExImLdiad2iCwXT5Z4c9c3Eq8rP2318mPW2c+QbtjK8A==", "license": "MIT", "dependencies": { "ip-address": "^10.0.1", @@ -41860,8 +35373,6 @@ }, "node_modules/socks-proxy-agent": { "version": "8.0.5", - "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-8.0.5.tgz", - "integrity": "sha512-HehCEsotFqbPW9sJ8WVYB6UbmIMv7kUUORIF2Nncq4VQvBfNBLibW9YZR5dlYCSUhwcD628pRllm7n+E+YTzJw==", "license": "MIT", "dependencies": { "agent-base": "^7.1.2", @@ -41874,8 +35385,6 @@ }, "node_modules/socks-proxy-agent/node_modules/agent-base": { "version": "7.1.4", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.4.tgz", - "integrity": "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==", "license": "MIT", "engines": { "node": ">= 14" @@ -41883,8 +35392,6 @@ }, "node_modules/sort-css-media-queries": { "version": "2.2.0", - "resolved": "https://registry.npmjs.org/sort-css-media-queries/-/sort-css-media-queries-2.2.0.tgz", - "integrity": "sha512-0xtkGhWCC9MGt/EzgnvbbbKhqWjl1+/rncmhTh5qCpbYguXh6S/qwePfv/JQ8jePXXmqingylxoC49pCkSPIbA==", "license": "MIT", "engines": { "node": ">= 6.3.0" @@ -41892,8 +35399,6 @@ }, "node_modules/source-map": { "version": "0.7.6", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.6.tgz", - "integrity": "sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ==", "license": "BSD-3-Clause", "engines": { "node": ">= 12" @@ -41901,8 +35406,6 @@ }, "node_modules/source-map-js": { "version": "1.2.1", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", - "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" @@ -41910,8 +35413,6 @@ }, "node_modules/source-map-support": { "version": "0.5.13", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz", - "integrity": "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==", "license": "MIT", "dependencies": { "buffer-from": "^1.0.0", @@ -41920,8 +35421,6 @@ }, "node_modules/source-map-support/node_modules/source-map": { "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" @@ -41929,15 +35428,10 @@ }, "node_modules/sourcemap-codec": { "version": "1.4.8", - "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", - "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==", - "deprecated": "Please use @jridgewell/sourcemap-codec instead", "license": "MIT" }, "node_modules/space-separated-tokens": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-2.0.2.tgz", - "integrity": "sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==", "license": "MIT", "funding": { "type": "github", @@ -41946,8 +35440,6 @@ }, "node_modules/spawndamnit": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/spawndamnit/-/spawndamnit-3.0.1.tgz", - "integrity": "sha512-MmnduQUuHCoFckZoWnXsTg7JaiLBJrKFj9UI2MbRPGaJeVpsLcVBu6P/IGZovziM/YBsellCmsprgNA+w0CzVg==", "dev": true, "license": "SEE LICENSE IN LICENSE", "dependencies": { @@ -41957,8 +35449,6 @@ }, "node_modules/spdx-correct": { "version": "3.2.0", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", - "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", "license": "Apache-2.0", "dependencies": { "spdx-expression-parse": "^3.0.0", @@ -41967,8 +35457,6 @@ }, "node_modules/spdx-correct/node_modules/spdx-expression-parse": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", - "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", "license": "MIT", "dependencies": { "spdx-exceptions": "^2.1.0", @@ -41977,14 +35465,10 @@ }, "node_modules/spdx-exceptions": { "version": "2.5.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz", - "integrity": "sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==", "license": "CC-BY-3.0" }, "node_modules/spdx-expression-parse": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-4.0.0.tgz", - "integrity": "sha512-Clya5JIij/7C6bRR22+tnGXbc4VKlibKSVj2iHvVeX5iMW7s1SIQlqu699JkODJJIhh/pUu8L0/VLh8xflD+LQ==", "license": "MIT", "dependencies": { "spdx-exceptions": "^2.1.0", @@ -41993,14 +35477,10 @@ }, "node_modules/spdx-license-ids": { "version": "3.0.23", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.23.tgz", - "integrity": "sha512-CWLcCCH7VLu13TgOH+r8p1O/Znwhqv/dbb6lqWy67G+pT1kHmeD/+V36AVb/vq8QMIQwVShJ6Ssl5FPh0fuSdw==", "license": "CC0-1.0" }, "node_modules/spdy": { "version": "4.0.2", - "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz", - "integrity": "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==", "license": "MIT", "dependencies": { "debug": "^4.1.0", @@ -42015,8 +35495,6 @@ }, "node_modules/spdy-transport": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz", - "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==", "license": "MIT", "dependencies": { "debug": "^4.1.0", @@ -42029,14 +35507,10 @@ }, "node_modules/sprintf-js": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", "license": "BSD-3-Clause" }, "node_modules/srcset": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/srcset/-/srcset-4.0.0.tgz", - "integrity": "sha512-wvLeHgcVHKO8Sc/H/5lkGreJQVeYMm9rlmt8PuR1xE31rIuXhuzznUUqAt8MqLhB3MqJdFzlNAfpcWnxiFUcPw==", "license": "MIT", "engines": { "node": ">=12" @@ -42047,8 +35521,6 @@ }, "node_modules/ssri": { "version": "13.0.1", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-13.0.1.tgz", - "integrity": "sha512-QUiRf1+u9wPTL/76GTYlKttDEBWV1ga9ZXW8BG6kfdeyyM8LGPix9gROyg9V2+P0xNyF3X2Go526xKFdMZrHSQ==", "license": "ISC", "dependencies": { "minipass": "^7.0.3" @@ -42059,8 +35531,6 @@ }, "node_modules/stack-utils": { "version": "2.0.6", - "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", - "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", "license": "MIT", "dependencies": { "escape-string-regexp": "^2.0.0" @@ -42071,8 +35541,6 @@ }, "node_modules/stack-utils/node_modules/escape-string-regexp": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", - "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", "license": "MIT", "engines": { "node": ">=8" @@ -42080,20 +35548,14 @@ }, "node_modules/standard-as-callback": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/standard-as-callback/-/standard-as-callback-2.1.0.tgz", - "integrity": "sha512-qoRRSyROncaz1z0mvYqIE4lCd9p2R90i6GxW3uZv5ucSu8tU7B5HXUP1gG8pVZsYNVaXjk8ClXHPttLyxAL48A==", "license": "MIT" }, "node_modules/state-local": { "version": "1.0.7", - "resolved": "https://registry.npmjs.org/state-local/-/state-local-1.0.7.tgz", - "integrity": "sha512-HTEHMNieakEnoe33shBYcZ7NX83ACUjCu8c40iOGEZsngj9zRnkqS9j1pqQPXwobB0ZcVTk27REb7COQ0UR59w==", "license": "MIT" }, "node_modules/statuses": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz", - "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==", "license": "MIT", "engines": { "node": ">= 0.8" @@ -42101,14 +35563,10 @@ }, "node_modules/std-env": { "version": "3.10.0", - "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.10.0.tgz", - "integrity": "sha512-5GS12FdOZNliM5mAOxFRg7Ir0pWz8MdpYm6AY6VPkGpbA7ZzmbzNcBJQ0GPvvyWgcY7QAhCgf9Uy89I03faLkg==", "license": "MIT" }, "node_modules/stop-iteration-iterator": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.1.0.tgz", - "integrity": "sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==", "license": "MIT", "dependencies": { "es-errors": "^1.3.0", @@ -42120,8 +35578,6 @@ }, "node_modules/storybook": { "version": "10.2.14", - "resolved": "https://registry.npmjs.org/storybook/-/storybook-10.2.14.tgz", - "integrity": "sha512-HGAgLbDAAbLOgjERsBXPpHUMxynHumYgoCRNBnAH57HfKuHL9LA3nKvKpbhFbYb/8PSG5X3hiKukki0R6Op7Aw==", "dev": true, "license": "MIT", "dependencies": { @@ -42156,8 +35612,6 @@ }, "node_modules/storybook/node_modules/define-lazy-prop": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-3.0.0.tgz", - "integrity": "sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==", "dev": true, "license": "MIT", "engines": { @@ -42169,8 +35623,6 @@ }, "node_modules/storybook/node_modules/open": { "version": "10.2.0", - "resolved": "https://registry.npmjs.org/open/-/open-10.2.0.tgz", - "integrity": "sha512-YgBpdJHPyQ2UE5x+hlSXcnejzAvD0b22U2OuAP+8OnlJT+PjWPxtgmGqKKc+RgTM63U9gN0YzrYc71R2WT/hTA==", "dev": true, "license": "MIT", "dependencies": { @@ -42188,8 +35640,6 @@ }, "node_modules/stream-events": { "version": "1.0.5", - "resolved": "https://registry.npmjs.org/stream-events/-/stream-events-1.0.5.tgz", - "integrity": "sha512-E1GUzBSgvct8Jsb3v2X15pjzN1tYebtbLaMg+eBOUOAxgbLoSbT2NS91ckc5lJD1KfLjId+jXJRgo0qnV5Nerg==", "license": "MIT", "dependencies": { "stubs": "^3.0.0" @@ -42197,21 +35647,15 @@ }, "node_modules/stream-shift": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.3.tgz", - "integrity": "sha512-76ORR0DO1o1hlKwTbi/DM3EXWGf3ZJYO8cXX5RJwnul2DEg2oyoZyjLNoQM8WsvZiFKCRfC1O0J7iCvie3RZmQ==", "license": "MIT" }, "node_modules/strict-event-emitter": { "version": "0.5.1", - "resolved": "https://registry.npmjs.org/strict-event-emitter/-/strict-event-emitter-0.5.1.tgz", - "integrity": "sha512-vMgjE/GGEPEFnhFub6pa4FmJBRBVOLpIII2hvCZ8Kzb7K0hlHo7mQv6xYrBvCL2LtAIBwFUK8wvuJgTVSQ5MFQ==", "dev": true, "license": "MIT" }, "node_modules/string_decoder": { "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", "license": "MIT", "dependencies": { "safe-buffer": "~5.2.0" @@ -42219,8 +35663,6 @@ }, "node_modules/string-argv": { "version": "0.3.2", - "resolved": "https://registry.npmjs.org/string-argv/-/string-argv-0.3.2.tgz", - "integrity": "sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==", "dev": true, "license": "MIT", "engines": { @@ -42229,8 +35671,6 @@ }, "node_modules/string-length": { "version": "4.0.2", - "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", - "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", "license": "MIT", "dependencies": { "char-regex": "^1.0.2", @@ -42242,8 +35682,6 @@ }, "node_modules/string-width": { "version": "8.2.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-8.2.0.tgz", - "integrity": "sha512-6hJPQ8N0V0P3SNmP6h2J99RLuzrWz2gvT7VnK5tKvrNqJoyS9W4/Fb8mo31UiPvy00z7DQXkP2hnKBVav76thw==", "dev": true, "license": "MIT", "dependencies": { @@ -42260,8 +35698,6 @@ "node_modules/string-width-cjs": { "name": "string-width", "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "license": "MIT", "dependencies": { "emoji-regex": "^8.0.0", @@ -42274,14 +35710,10 @@ }, "node_modules/string-width-cjs/node_modules/emoji-regex": { "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", "license": "MIT" }, "node_modules/string-width-cjs/node_modules/is-fullwidth-code-point": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", "license": "MIT", "engines": { "node": ">=8" @@ -42289,8 +35721,6 @@ }, "node_modules/string-width/node_modules/ansi-regex": { "version": "6.2.2", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", - "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", "dev": true, "license": "MIT", "engines": { @@ -42302,8 +35732,6 @@ }, "node_modules/string-width/node_modules/strip-ansi": { "version": "7.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz", - "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", "dev": true, "license": "MIT", "dependencies": { @@ -42318,8 +35746,6 @@ }, "node_modules/string.prototype.matchall": { "version": "4.0.12", - "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.12.tgz", - "integrity": "sha512-6CC9uyBL+/48dYizRf7H7VAYCMCNTBeM78x/VTUe9bFEaxBepPJDa1Ow99LqI/1yF7kuy7Q3cQsYMrcjGUcskA==", "license": "MIT", "dependencies": { "call-bind": "^1.0.8", @@ -42345,8 +35771,6 @@ }, "node_modules/string.prototype.repeat": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/string.prototype.repeat/-/string.prototype.repeat-1.0.0.tgz", - "integrity": "sha512-0u/TldDbKD8bFCQ/4f5+mNRrXwZ8hg2w7ZR8wa16e8z9XpePWl3eGEcUD0OXpEH/VJH/2G3gjUtR3ZOiBe2S/w==", "license": "MIT", "dependencies": { "define-properties": "^1.1.3", @@ -42355,8 +35779,6 @@ }, "node_modules/string.prototype.trim": { "version": "1.2.10", - "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.10.tgz", - "integrity": "sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==", "license": "MIT", "dependencies": { "call-bind": "^1.0.8", @@ -42376,8 +35798,6 @@ }, "node_modules/string.prototype.trimend": { "version": "1.0.9", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.9.tgz", - "integrity": "sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==", "license": "MIT", "dependencies": { "call-bind": "^1.0.8", @@ -42394,8 +35814,6 @@ }, "node_modules/string.prototype.trimstart": { "version": "1.0.8", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz", - "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==", "license": "MIT", "dependencies": { "call-bind": "^1.0.7", @@ -42411,8 +35829,6 @@ }, "node_modules/stringify-entities": { "version": "4.0.4", - "resolved": "https://registry.npmjs.org/stringify-entities/-/stringify-entities-4.0.4.tgz", - "integrity": "sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==", "license": "MIT", "dependencies": { "character-entities-html4": "^2.0.0", @@ -42425,8 +35841,6 @@ }, "node_modules/stringify-object": { "version": "3.3.0", - "resolved": "https://registry.npmjs.org/stringify-object/-/stringify-object-3.3.0.tgz", - "integrity": "sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw==", "license": "BSD-2-Clause", "dependencies": { "get-own-enumerable-property-symbols": "^3.0.0", @@ -42439,8 +35853,6 @@ }, "node_modules/strip-ansi": { "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "license": "MIT", "dependencies": { "ansi-regex": "^5.0.1" @@ -42452,8 +35864,6 @@ "node_modules/strip-ansi-cjs": { "name": "strip-ansi", "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "license": "MIT", "dependencies": { "ansi-regex": "^5.0.1" @@ -42464,8 +35874,6 @@ }, "node_modules/strip-bom": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", "dev": true, "license": "MIT", "engines": { @@ -42474,8 +35882,6 @@ }, "node_modules/strip-bom-string": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/strip-bom-string/-/strip-bom-string-1.0.0.tgz", - "integrity": "sha512-uCC2VHvQRYu+lMh4My/sFNmF2klFymLX1wHJeXnbEJERpV/ZsVuonzerjfrGpIGF7LBVa1O7i9kjiWvJiFck8g==", "license": "MIT", "engines": { "node": ">=0.10.0" @@ -42483,8 +35889,6 @@ }, "node_modules/strip-final-newline": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", - "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", "license": "MIT", "engines": { "node": ">=6" @@ -42492,8 +35896,6 @@ }, "node_modules/strip-indent": { "version": "4.1.1", - "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-4.1.1.tgz", - "integrity": "sha512-SlyRoSkdh1dYP0PzclLE7r0M9sgbFKKMFXpFRUMNuKhQSbC6VQIGzq3E0qsfvGJaUFJPGv6Ws1NZ/haTAjfbMA==", "dev": true, "license": "MIT", "engines": { @@ -42505,8 +35907,6 @@ }, "node_modules/strip-json-comments": { "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", "license": "MIT", "engines": { "node": ">=8" @@ -42517,8 +35917,6 @@ }, "node_modules/strnum": { "version": "2.3.0", - "resolved": "https://registry.npmjs.org/strnum/-/strnum-2.3.0.tgz", - "integrity": "sha512-ums3KNd42PGyx5xaoVTO1mjU1bH3NpY4vsrVlnv9PNGqQj8wd7rJ6nEypLrJ7z5vxK5RP0yMLo6J/Gsm62DI5Q==", "funding": [ { "type": "github", @@ -42529,14 +35927,10 @@ }, "node_modules/stubs": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/stubs/-/stubs-3.0.0.tgz", - "integrity": "sha512-PdHt7hHUJKxvTCgbKX9C1V/ftOcjJQgz8BZwNfV5c4B6dcGqlpelTbJ999jBGZ2jYiPAwcX5dP6oBwVlBlUbxw==", "license": "MIT" }, "node_modules/style-loader": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-4.0.0.tgz", - "integrity": "sha512-1V4WqhhZZgjVAVJyt7TdDPZoPBPNHbekX4fWnCJL1yQukhCeZhJySUL+gL9y6sNdN95uEOS83Y55SqHcP7MzLA==", "license": "MIT", "engines": { "node": ">= 18.12.0" @@ -42551,8 +35945,6 @@ }, "node_modules/style-to-js": { "version": "1.1.21", - "resolved": "https://registry.npmjs.org/style-to-js/-/style-to-js-1.1.21.tgz", - "integrity": "sha512-RjQetxJrrUJLQPHbLku6U/ocGtzyjbJMP9lCNK7Ag0CNh690nSH8woqWH9u16nMjYBAok+i7JO1NP2pOy8IsPQ==", "license": "MIT", "dependencies": { "style-to-object": "1.0.14" @@ -42560,8 +35952,6 @@ }, "node_modules/style-to-object": { "version": "1.0.14", - "resolved": "https://registry.npmjs.org/style-to-object/-/style-to-object-1.0.14.tgz", - "integrity": "sha512-LIN7rULI0jBscWQYaSswptyderlarFkjQ+t79nzty8tcIAceVomEVlLzH5VP4Cmsv6MtKhs7qaAiwlcp+Mgaxw==", "license": "MIT", "dependencies": { "inline-style-parser": "0.2.7" @@ -42569,8 +35959,6 @@ }, "node_modules/stylehacks": { "version": "6.1.1", - "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-6.1.1.tgz", - "integrity": "sha512-gSTTEQ670cJNoaeIp9KX6lZmm8LJ3jPB5yJmX8Zq/wQxOsAFXV3qjWzHas3YYk1qesuVIyYWWUpZ0vSE/dTSGg==", "license": "MIT", "dependencies": { "browserslist": "^4.23.0", @@ -42585,8 +35973,6 @@ }, "node_modules/stylehacks/node_modules/postcss-selector-parser": { "version": "6.1.2", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz", - "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==", "license": "MIT", "dependencies": { "cssesc": "^3.0.0", @@ -42598,14 +35984,10 @@ }, "node_modules/stylis": { "version": "4.3.6", - "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.3.6.tgz", - "integrity": "sha512-yQ3rwFWRfwNUY7H5vpU0wfdkNSnvnJinhF9830Swlaxl03zsOjCfmX0ugac+3LtK0lYSgwL/KXc8oYL3mG4YFQ==", "license": "MIT" }, "node_modules/sucrase": { "version": "3.35.1", - "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.35.1.tgz", - "integrity": "sha512-DhuTmvZWux4H1UOnWMB3sk0sbaCVOoQZjv8u1rDoTV0HTdGem9hkAZtl4JZy8P2z4Bg0nT+YMeOFyVr4zcG5Tw==", "license": "MIT", "dependencies": { "@jridgewell/gen-mapping": "^0.3.2", @@ -42626,8 +36008,6 @@ }, "node_modules/sucrase/node_modules/commander": { "version": "4.1.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", - "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", "license": "MIT", "engines": { "node": ">= 6" @@ -42635,8 +36015,6 @@ }, "node_modules/supports-color": { "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "license": "MIT", "dependencies": { "has-flag": "^4.0.0" @@ -42647,8 +36025,6 @@ }, "node_modules/supports-hyperlinks": { "version": "2.3.0", - "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.3.0.tgz", - "integrity": "sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA==", "dev": true, "license": "MIT", "dependencies": { @@ -42661,8 +36037,6 @@ }, "node_modules/supports-preserve-symlinks-flag": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", "license": "MIT", "engines": { "node": ">= 0.4" @@ -42673,14 +36047,10 @@ }, "node_modules/svg-parser": { "version": "2.0.4", - "resolved": "https://registry.npmjs.org/svg-parser/-/svg-parser-2.0.4.tgz", - "integrity": "sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ==", "license": "MIT" }, "node_modules/svgo": { "version": "3.3.2", - "resolved": "https://registry.npmjs.org/svgo/-/svgo-3.3.2.tgz", - "integrity": "sha512-OoohrmuUlBs8B8o6MB2Aevn+pRIH9zDALSR+6hhqVfa6fRwG/Qw9VUMSMW9VNg2CFc/MTIfabtdOVl9ODIJjpw==", "license": "MIT", "dependencies": { "@trysound/sax": "0.2.0", @@ -42704,8 +36074,6 @@ }, "node_modules/svgo/node_modules/commander": { "version": "7.2.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", - "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", "license": "MIT", "engines": { "node": ">= 10" @@ -42713,8 +36081,6 @@ }, "node_modules/swc-loader": { "version": "0.2.7", - "resolved": "https://registry.npmjs.org/swc-loader/-/swc-loader-0.2.7.tgz", - "integrity": "sha512-nwYWw3Fh9ame3Rtm7StS9SBLpHRRnYcK7bnpF3UKZmesAK0gw2/ADvlURFAINmPvKtDLzp+GBiP9yLoEjg6S9w==", "devOptional": true, "license": "MIT", "dependencies": { @@ -42727,14 +36093,10 @@ }, "node_modules/symbol-tree": { "version": "3.2.4", - "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", - "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", "license": "MIT" }, "node_modules/synckit": { "version": "0.11.12", - "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.11.12.tgz", - "integrity": "sha512-Bh7QjT8/SuKUIfObSXNHNSK6WHo6J1tHCqJsuaFDP7gP0fkzSfTxI8y85JrppZ0h8l0maIgc2tfuZQ6/t3GtnQ==", "license": "MIT", "dependencies": { "@pkgr/core": "^0.2.9" @@ -42748,8 +36110,6 @@ }, "node_modules/table-layout": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/table-layout/-/table-layout-1.0.2.tgz", - "integrity": "sha512-qd/R7n5rQTRFi+Zf2sk5XVVd9UQl6ZkduPFC3S7WEGJAmetDTjY3qPN50eSKzwuzEyQKy5TN2TiZdkIjos2L6A==", "dev": true, "license": "MIT", "dependencies": { @@ -42764,8 +36124,6 @@ }, "node_modules/table-layout/node_modules/array-back": { "version": "4.0.2", - "resolved": "https://registry.npmjs.org/array-back/-/array-back-4.0.2.tgz", - "integrity": "sha512-NbdMezxqf94cnNfWLL7V/im0Ub+Anbb0IoZhvzie8+4HJ4nMQuzHuy49FkGYCJK2yAloZ3meiB6AVMClbrI1vg==", "dev": true, "license": "MIT", "engines": { @@ -42774,8 +36132,6 @@ }, "node_modules/table-layout/node_modules/typical": { "version": "5.2.0", - "resolved": "https://registry.npmjs.org/typical/-/typical-5.2.0.tgz", - "integrity": "sha512-dvdQgNDNJo+8B2uBQoqdb11eUCE1JQXhvjC/CZtgvZseVd5TYMXnq0+vuUemXbd/Se29cTaUuPX3YIc2xgbvIg==", "dev": true, "license": "MIT", "engines": { @@ -42784,8 +36140,6 @@ }, "node_modules/tagged-tag": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/tagged-tag/-/tagged-tag-1.0.0.tgz", - "integrity": "sha512-yEFYrVhod+hdNyx7g5Bnkkb0G6si8HJurOoOEgC8B/O0uXLHlaey/65KRv6cuWBNhBgHKAROVpc7QyYqE5gFng==", "dev": true, "license": "MIT", "engines": { @@ -42797,8 +36151,6 @@ }, "node_modules/tailwind-merge": { "version": "3.5.0", - "resolved": "https://registry.npmjs.org/tailwind-merge/-/tailwind-merge-3.5.0.tgz", - "integrity": "sha512-I8K9wewnVDkL1NTGoqWmVEIlUcB9gFriAEkXkfCjX5ib8ezGxtR3xD7iZIxrfArjEsH7F1CHD4RFUtxefdqV/A==", "license": "MIT", "funding": { "type": "github", @@ -42807,15 +36159,11 @@ }, "node_modules/tailwindcss": { "version": "4.2.1", - "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.2.1.tgz", - "integrity": "sha512-/tBrSQ36vCleJkAOsy9kbNTgaxvGbyOamC30PRePTQe/o1MFwEKHQk4Cn7BNGaPtjp+PuUrByJehM1hgxfq4sw==", "dev": true, "license": "MIT" }, "node_modules/tapable": { "version": "2.3.0", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.3.0.tgz", - "integrity": "sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg==", "license": "MIT", "engines": { "node": ">=6" @@ -42827,8 +36175,6 @@ }, "node_modules/tar": { "version": "7.5.9", - "resolved": "https://registry.npmjs.org/tar/-/tar-7.5.9.tgz", - "integrity": "sha512-BTLcK0xsDh2+PUe9F6c2TlRp4zOOBMTkoQHQIWSIzI0R7KG46uEwq4OPk2W7bZcprBMsuaeFsqwYr7pjh6CuHg==", "license": "BlueOak-1.0.0", "dependencies": { "@isaacs/fs-minipass": "^4.0.0", @@ -42843,8 +36189,6 @@ }, "node_modules/tar-fs": { "version": "2.1.4", - "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.4.tgz", - "integrity": "sha512-mDAjwmZdh7LTT6pNleZ05Yt65HC3E+NiQzl672vQG38jIrehtJk/J3mNwIg+vShQPcLF/LV7CMnDW6vjj6sfYQ==", "dev": true, "license": "MIT", "dependencies": { @@ -42856,15 +36200,11 @@ }, "node_modules/tar-fs/node_modules/chownr": { "version": "1.1.4", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", - "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", "dev": true, "license": "ISC" }, "node_modules/tar-stream": { "version": "2.2.0", - "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", - "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", "dev": true, "license": "MIT", "dependencies": { @@ -42880,8 +36220,6 @@ }, "node_modules/tar/node_modules/yallist": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-5.0.0.tgz", - "integrity": "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==", "license": "BlueOak-1.0.0", "engines": { "node": ">=18" @@ -42889,8 +36227,6 @@ }, "node_modules/teeny-request": { "version": "10.1.0", - "resolved": "https://registry.npmjs.org/teeny-request/-/teeny-request-10.1.0.tgz", - "integrity": "sha512-3ZnLvgWF29jikg1sAQ1g0o+lr5JX6sVgYvfUJazn7ZjJroDBUTWp44/+cFVX0bULjv4vci+rBD+oGVAkWqhUbw==", "license": "Apache-2.0", "dependencies": { "http-proxy-agent": "^5.0.0", @@ -42904,8 +36240,6 @@ }, "node_modules/teeny-request/node_modules/http-proxy-agent": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", - "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", "license": "MIT", "dependencies": { "@tootallnate/once": "2", @@ -42918,8 +36252,6 @@ }, "node_modules/teeny-request/node_modules/node-fetch": { "version": "3.3.2", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-3.3.2.tgz", - "integrity": "sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==", "license": "MIT", "dependencies": { "data-uri-to-buffer": "^4.0.0", @@ -42936,8 +36268,6 @@ }, "node_modules/term-size": { "version": "2.2.1", - "resolved": "https://registry.npmjs.org/term-size/-/term-size-2.2.1.tgz", - "integrity": "sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg==", "dev": true, "license": "MIT", "engines": { @@ -42949,8 +36279,6 @@ }, "node_modules/terminal-link": { "version": "2.1.1", - "resolved": "https://registry.npmjs.org/terminal-link/-/terminal-link-2.1.1.tgz", - "integrity": "sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ==", "dev": true, "license": "MIT", "dependencies": { @@ -42966,8 +36294,6 @@ }, "node_modules/terminal-link/node_modules/ansi-escapes": { "version": "4.3.2", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", - "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", "dev": true, "license": "MIT", "dependencies": { @@ -42982,8 +36308,6 @@ }, "node_modules/terser": { "version": "5.46.0", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.46.0.tgz", - "integrity": "sha512-jTwoImyr/QbOWFFso3YoU3ik0jBBDJ6JTOQiy/J2YxVJdZCc+5u7skhNwiOR3FQIygFqVUPHl7qbbxtjW2K3Qg==", "license": "BSD-2-Clause", "dependencies": { "@jridgewell/source-map": "^0.3.3", @@ -43000,8 +36324,6 @@ }, "node_modules/terser-webpack-plugin": { "version": "5.3.16", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.16.tgz", - "integrity": "sha512-h9oBFCWrq78NyWWVcSwZarJkZ01c2AyGrzs1crmHZO3QUg9D61Wu4NPjBy69n7JqylFF5y+CsUZYmYEIZ3mR+Q==", "license": "MIT", "dependencies": { "@jridgewell/trace-mapping": "^0.3.25", @@ -43034,8 +36356,6 @@ }, "node_modules/terser-webpack-plugin/node_modules/jest-worker": { "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", - "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", "license": "MIT", "dependencies": { "@types/node": "*", @@ -43048,8 +36368,6 @@ }, "node_modules/terser-webpack-plugin/node_modules/supports-color": { "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", "license": "MIT", "dependencies": { "has-flag": "^4.0.0" @@ -43063,14 +36381,10 @@ }, "node_modules/terser/node_modules/commander": { "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", "license": "MIT" }, "node_modules/terser/node_modules/source-map": { "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" @@ -43078,8 +36392,6 @@ }, "node_modules/terser/node_modules/source-map-support": { "version": "0.5.21", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", - "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", "license": "MIT", "dependencies": { "buffer-from": "^1.0.0", @@ -43088,8 +36400,6 @@ }, "node_modules/test-exclude": { "version": "6.0.0", - "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", - "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", "license": "ISC", "dependencies": { "@istanbuljs/schema": "^0.1.2", @@ -43102,14 +36412,10 @@ }, "node_modules/test-exclude/node_modules/balanced-match": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", "license": "MIT" }, "node_modules/test-exclude/node_modules/brace-expansion": { "version": "1.1.12", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", - "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", "license": "MIT", "dependencies": { "balanced-match": "^1.0.0", @@ -43118,9 +36424,6 @@ }, "node_modules/test-exclude/node_modules/glob": { "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", "license": "ISC", "dependencies": { "fs.realpath": "^1.0.0", @@ -43139,8 +36442,6 @@ }, "node_modules/test-exclude/node_modules/minimatch": { "version": "3.1.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", - "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", "license": "ISC", "dependencies": { "brace-expansion": "^1.1.7" @@ -43151,15 +36452,11 @@ }, "node_modules/text-table": { "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", "dev": true, "license": "MIT" }, "node_modules/thenify": { "version": "3.3.1", - "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", - "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", "license": "MIT", "dependencies": { "any-promise": "^1.0.0" @@ -43167,8 +36464,6 @@ }, "node_modules/thenify-all": { "version": "1.6.0", - "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", - "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", "license": "MIT", "dependencies": { "thenify": ">= 3.1.0 < 4" @@ -43179,8 +36474,6 @@ }, "node_modules/thingies": { "version": "2.5.0", - "resolved": "https://registry.npmjs.org/thingies/-/thingies-2.5.0.tgz", - "integrity": "sha512-s+2Bwztg6PhWUD7XMfeYm5qliDdSiZm7M7n8KjTkIsm3l/2lgVRc2/Gx/v+ZX8lT4FMA+i8aQvhcWylldc+ZNw==", "license": "MIT", "engines": { "node": ">=10.18" @@ -43195,33 +36488,23 @@ }, "node_modules/thunky": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", - "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==", "license": "MIT" }, "node_modules/tiny-invariant": { "version": "1.3.3", - "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.3.3.tgz", - "integrity": "sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==", "license": "MIT" }, "node_modules/tiny-warning": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/tiny-warning/-/tiny-warning-1.0.3.tgz", - "integrity": "sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA==", "license": "MIT" }, "node_modules/tinycolor2": { "version": "1.6.0", - "resolved": "https://registry.npmjs.org/tinycolor2/-/tinycolor2-1.6.0.tgz", - "integrity": "sha512-XPaBkWQJdsf3pLKJV9p4qN/S+fm2Oj8AIPo1BTUhg5oxkvm9+SVEGFdhyOz7tTdUTfvxMiAs4sp6/eZO2Ew+pw==", "dev": true, "license": "MIT" }, "node_modules/tinyexec": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.0.2.tgz", - "integrity": "sha512-W/KYk+NFhkmsYpuHq5JykngiOCnxeVL8v8dFnqxSD8qEEdRfXk1SDM6JzNqcERbcGYj9tMrDQBYV9cjgnunFIg==", "license": "MIT", "engines": { "node": ">=18" @@ -43229,8 +36512,6 @@ }, "node_modules/tinyglobby": { "version": "0.2.15", - "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz", - "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==", "license": "MIT", "dependencies": { "fdir": "^6.5.0", @@ -43245,8 +36526,6 @@ }, "node_modules/tinyglobby/node_modules/fdir": { "version": "6.5.0", - "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", - "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", "license": "MIT", "engines": { "node": ">=12.0.0" @@ -43262,8 +36541,6 @@ }, "node_modules/tinyglobby/node_modules/picomatch": { "version": "4.0.3", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", - "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", "license": "MIT", "engines": { "node": ">=12" @@ -43274,8 +36551,6 @@ }, "node_modules/tinypool": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-1.1.1.tgz", - "integrity": "sha512-Zba82s87IFq9A9XmjiX5uZA/ARWDrB03OHlq+Vw1fSdt0I+4/Kutwy8BP4Y/y/aORMo61FQ0vIb5j44vSo5Pkg==", "license": "MIT", "engines": { "node": "^18.0.0 || >=20.0.0" @@ -43283,8 +36558,6 @@ }, "node_modules/tinyrainbow": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-2.0.0.tgz", - "integrity": "sha512-op4nsTR47R6p0vMUUoYl/a+ljLFVtlfaXkLQmqfLR1qHma1h/ysYk4hEXZ880bf2CYgTskvTa/e196Vd5dDQXw==", "dev": true, "license": "MIT", "engines": { @@ -43293,8 +36566,6 @@ }, "node_modules/tinyspy": { "version": "4.0.4", - "resolved": "https://registry.npmjs.org/tinyspy/-/tinyspy-4.0.4.tgz", - "integrity": "sha512-azl+t0z7pw/z958Gy9svOTuzqIk6xq+NSheJzn5MMWtWTFywIacg2wUlzKFGtt3cthx0r2SxMK0yzJOR0IES7Q==", "dev": true, "license": "MIT", "engines": { @@ -43303,8 +36574,6 @@ }, "node_modules/tldts": { "version": "6.1.86", - "resolved": "https://registry.npmjs.org/tldts/-/tldts-6.1.86.tgz", - "integrity": "sha512-WMi/OQ2axVTf/ykqCQgXiIct+mSQDFdH2fkwhPwgEwvJ1kSzZRiinb0zF2Xb8u4+OqPChmyI6MEu4EezNJz+FQ==", "license": "MIT", "dependencies": { "tldts-core": "^6.1.86" @@ -43315,20 +36584,14 @@ }, "node_modules/tldts-core": { "version": "6.1.86", - "resolved": "https://registry.npmjs.org/tldts-core/-/tldts-core-6.1.86.tgz", - "integrity": "sha512-Je6p7pkk+KMzMv2XXKmAE3McmolOQFdxkKw0R8EYNr7sELW46JqnNeTX8ybPiQgvg1ymCoF8LXs5fzFaZvJPTA==", "license": "MIT" }, "node_modules/tmpl": { "version": "1.0.5", - "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", - "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", "license": "BSD-3-Clause" }, "node_modules/to-regex-range": { "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", "license": "MIT", "dependencies": { "is-number": "^7.0.0" @@ -43339,8 +36602,6 @@ }, "node_modules/toidentifier": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", - "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", "license": "MIT", "engines": { "node": ">=0.6" @@ -43348,8 +36609,6 @@ }, "node_modules/totalist": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/totalist/-/totalist-3.0.1.tgz", - "integrity": "sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==", "license": "MIT", "engines": { "node": ">=6" @@ -43357,8 +36616,6 @@ }, "node_modules/tough-cookie": { "version": "5.1.2", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-5.1.2.tgz", - "integrity": "sha512-FVDYdxtnj0G6Qm/DhNPSb8Ju59ULcup3tuJxkFb5K8Bv2pUXILbf0xZWU8PX8Ov19OXljbUyveOFwRMwkXzO+A==", "license": "BSD-3-Clause", "dependencies": { "tldts": "^6.1.32" @@ -43369,8 +36626,6 @@ }, "node_modules/tr46": { "version": "5.1.1", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-5.1.1.tgz", - "integrity": "sha512-hdF5ZgjTqgAntKkklYw0R03MG2x/bSzTtkxmIRw/sTNV8YXsCJ1tfLAX23lhxhHJlEf3CRCOCGGWw3vI3GaSPw==", "license": "MIT", "dependencies": { "punycode": "^2.3.1" @@ -43381,8 +36636,6 @@ }, "node_modules/tree-dump": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/tree-dump/-/tree-dump-1.1.0.tgz", - "integrity": "sha512-rMuvhU4MCDbcbnleZTFezWsaZXRFemSqAM+7jPnzUl1fo9w3YEKOxAeui0fz3OI4EU4hf23iyA7uQRVko+UaBA==", "license": "Apache-2.0", "engines": { "node": ">=10.0" @@ -43397,8 +36650,6 @@ }, "node_modules/tree-kill": { "version": "1.2.2", - "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", - "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==", "license": "MIT", "bin": { "tree-kill": "cli.js" @@ -43406,8 +36657,6 @@ }, "node_modules/trim-lines": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/trim-lines/-/trim-lines-3.0.1.tgz", - "integrity": "sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==", "license": "MIT", "funding": { "type": "github", @@ -43416,8 +36665,6 @@ }, "node_modules/trough": { "version": "2.2.0", - "resolved": "https://registry.npmjs.org/trough/-/trough-2.2.0.tgz", - "integrity": "sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==", "license": "MIT", "funding": { "type": "github", @@ -43426,8 +36673,6 @@ }, "node_modules/ts-api-utils": { "version": "2.4.0", - "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.4.0.tgz", - "integrity": "sha512-3TaVTaAv2gTiMB35i3FiGJaRfwb3Pyn/j3m/bfAvGe8FB7CF6u+LMYqYlDh7reQf7UNvoTvdfAqHGmPGOSsPmA==", "license": "MIT", "engines": { "node": ">=18.12" @@ -43438,8 +36683,6 @@ }, "node_modules/ts-dedent": { "version": "2.2.0", - "resolved": "https://registry.npmjs.org/ts-dedent/-/ts-dedent-2.2.0.tgz", - "integrity": "sha512-q5W7tVM71e2xjHZTlgfTDoPF/SmqKG5hddq9SzR49CH2hayqRKJtQ4mtRlSxKaJlR/+9rEM+mnBHf7I2/BQcpQ==", "license": "MIT", "engines": { "node": ">=6.10" @@ -43447,14 +36690,10 @@ }, "node_modules/ts-interface-checker": { "version": "0.1.13", - "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", - "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==", "license": "Apache-2.0" }, "node_modules/ts-node": { "version": "10.9.2", - "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.2.tgz", - "integrity": "sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==", "devOptional": true, "license": "MIT", "dependencies": { @@ -43497,15 +36736,11 @@ }, "node_modules/ts-node/node_modules/arg": { "version": "4.1.3", - "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", - "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", "devOptional": true, "license": "MIT" }, "node_modules/tsconfig-paths": { "version": "4.2.0", - "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-4.2.0.tgz", - "integrity": "sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg==", "dev": true, "license": "MIT", "dependencies": { @@ -43519,14 +36754,10 @@ }, "node_modules/tslib": { "version": "2.8.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", - "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", "license": "0BSD" }, "node_modules/tsup": { "version": "8.5.1", - "resolved": "https://registry.npmjs.org/tsup/-/tsup-8.5.1.tgz", - "integrity": "sha512-xtgkqwdhpKWr3tKPmCkvYmS9xnQK3m3XgxZHwSUjvfTjp7YfXe5tT3GgWi0F2N+ZSMsOeWeZFh7ZZFg5iPhing==", "license": "MIT", "dependencies": { "bundle-require": "^5.1.0", @@ -43577,8 +36808,6 @@ }, "node_modules/tsup/node_modules/chokidar": { "version": "4.0.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", - "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", "license": "MIT", "dependencies": { "readdirp": "^4.0.1" @@ -43592,8 +36821,6 @@ }, "node_modules/tsup/node_modules/readdirp": { "version": "4.1.2", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz", - "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==", "license": "MIT", "engines": { "node": ">= 14.18.0" @@ -43605,14 +36832,10 @@ }, "node_modules/tsup/node_modules/tinyexec": { "version": "0.3.2", - "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-0.3.2.tgz", - "integrity": "sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==", "license": "MIT" }, "node_modules/tsx": { "version": "4.21.0", - "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.21.0.tgz", - "integrity": "sha512-5C1sg4USs1lfG0GFb2RLXsdpXqBSEhAaA/0kPL01wxzpMqLILNxIxIOKiILz+cdg/pLnOUxFYOR5yhHU666wbw==", "devOptional": true, "license": "MIT", "dependencies": { @@ -43631,8 +36854,6 @@ }, "node_modules/tsyringe": { "version": "4.10.0", - "resolved": "https://registry.npmjs.org/tsyringe/-/tsyringe-4.10.0.tgz", - "integrity": "sha512-axr3IdNuVIxnaK5XGEUFTu3YmAQ6lllgrvqfEoR16g/HGnYY/6We4oWENtAnzK6/LpJ2ur9PAb80RBt7/U4ugw==", "license": "MIT", "dependencies": { "tslib": "^1.9.3" @@ -43643,14 +36864,10 @@ }, "node_modules/tsyringe/node_modules/tslib": { "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", "license": "0BSD" }, "node_modules/tuf-js": { "version": "4.1.0", - "resolved": "https://registry.npmjs.org/tuf-js/-/tuf-js-4.1.0.tgz", - "integrity": "sha512-50QV99kCKH5P/Vs4E2Gzp7BopNV+KzTXqWeaxrfu5IQJBOULRsTIS9seSsOVT8ZnGXzCyx55nYWAi4qJzpZKEQ==", "license": "MIT", "dependencies": { "@tufjs/models": "4.1.0", @@ -43663,8 +36880,6 @@ }, "node_modules/tunnel-agent": { "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -43676,8 +36891,6 @@ }, "node_modules/turbo": { "version": "2.8.12", - "resolved": "https://registry.npmjs.org/turbo/-/turbo-2.8.12.tgz", - "integrity": "sha512-auUAMLmi0eJhxDhQrxzvuhfEbICnVt0CTiYQYY8WyRJ5nwCDZxD0JG8bCSxT4nusI2CwJzmZAay5BfF6LmK7Hw==", "license": "MIT", "bin": { "turbo": "bin/turbo" @@ -43691,19 +36904,6 @@ "turbo-windows-arm64": "2.8.12" } }, - "node_modules/turbo-darwin-64": { - "version": "2.8.12", - "resolved": "https://registry.npmjs.org/turbo-darwin-64/-/turbo-darwin-64-2.8.12.tgz", - "integrity": "sha512-EiHJmW2MeQQx+21x8hjMHw/uPhXt9PIxvDrxzOtyVwrXzL0tQmsxtO4qHf2l7uA+K6PUJ4+TjY1MHZDuCvWXrw==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ] - }, "node_modules/turbo-darwin-arm64": { "version": "2.8.12", "resolved": "https://registry.npmjs.org/turbo-darwin-arm64/-/turbo-darwin-arm64-2.8.12.tgz", @@ -43717,23 +36917,8 @@ "darwin" ] }, - "node_modules/turbo-linux-64": { - "version": "2.8.12", - "resolved": "https://registry.npmjs.org/turbo-linux-64/-/turbo-linux-64-2.8.12.tgz", - "integrity": "sha512-jXKw9j4r4q6s0goSXuKI3aKbQK2qiNeP25lGGEnq018TM6SWRW1CCpPMxyG91aCKrub7wDm/K45sGNT4ZFBcFQ==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, "node_modules/turbo-linux-arm64": { "version": "2.8.12", - "resolved": "https://registry.npmjs.org/turbo-linux-arm64/-/turbo-linux-arm64-2.8.12.tgz", - "integrity": "sha512-BRJCMdyXjyBoL0GYpvj9d2WNfMHwc3tKmJG5ATn2Efvil9LsiOsd/93/NxDqW0jACtHFNVOPnd/CBwXRPiRbwA==", "cpu": [ "arm64" ], @@ -43743,36 +36928,8 @@ "linux" ] }, - "node_modules/turbo-windows-64": { - "version": "2.8.12", - "resolved": "https://registry.npmjs.org/turbo-windows-64/-/turbo-windows-64-2.8.12.tgz", - "integrity": "sha512-vyFOlpFFzQFkikvSVhVkESEfzIopgs2J7J1rYvtSwSHQ4zmHxkC95Q8Kjkus8gg+8X2mZyP1GS5jirmaypGiPw==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/turbo-windows-arm64": { - "version": "2.8.12", - "resolved": "https://registry.npmjs.org/turbo-windows-arm64/-/turbo-windows-arm64-2.8.12.tgz", - "integrity": "sha512-9nRnlw5DF0LkJClkIws1evaIF36dmmMEO84J5Uj4oQ8C0QTHwlH7DNe5Kq2Jdmu8GXESCNDNuUYG8Cx6W/vm3g==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, "node_modules/type-check": { "version": "0.4.0", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", - "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", "license": "MIT", "dependencies": { "prelude-ls": "^1.2.1" @@ -43783,8 +36940,6 @@ }, "node_modules/type-detect": { "version": "4.0.8", - "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", - "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", "license": "MIT", "engines": { "node": ">=4" @@ -43792,8 +36947,6 @@ }, "node_modules/type-fest": { "version": "0.21.3", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", - "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", "license": "(MIT OR CC0-1.0)", "engines": { "node": ">=10" @@ -43804,8 +36957,6 @@ }, "node_modules/type-is": { "version": "1.6.18", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", - "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", "license": "MIT", "dependencies": { "media-typer": "0.3.0", @@ -43817,8 +36968,6 @@ }, "node_modules/typed-array-buffer": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz", - "integrity": "sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==", "license": "MIT", "dependencies": { "call-bound": "^1.0.3", @@ -43831,8 +36980,6 @@ }, "node_modules/typed-array-byte-length": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.3.tgz", - "integrity": "sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==", "license": "MIT", "dependencies": { "call-bind": "^1.0.8", @@ -43850,8 +36997,6 @@ }, "node_modules/typed-array-byte-offset": { "version": "1.0.4", - "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.4.tgz", - "integrity": "sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==", "license": "MIT", "dependencies": { "available-typed-arrays": "^1.0.7", @@ -43871,8 +37016,6 @@ }, "node_modules/typed-array-length": { "version": "1.0.7", - "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.7.tgz", - "integrity": "sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==", "license": "MIT", "dependencies": { "call-bind": "^1.0.7", @@ -43891,15 +37034,11 @@ }, "node_modules/typedarray": { "version": "0.0.6", - "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", - "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==", "dev": true, "license": "MIT" }, "node_modules/typedarray-to-buffer": { "version": "3.1.5", - "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", - "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", "license": "MIT", "dependencies": { "is-typedarray": "^1.0.0" @@ -43907,8 +37046,6 @@ }, "node_modules/typescript": { "version": "5.9.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", - "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", "license": "Apache-2.0", "bin": { "tsc": "bin/tsc", @@ -43920,8 +37057,6 @@ }, "node_modules/typescript-eslint": { "version": "8.56.1", - "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.56.1.tgz", - "integrity": "sha512-U4lM6pjmBX7J5wk4szltF7I1cGBHXZopnAXCMXb3+fZ3B/0Z3hq3wS/CCUB2NZBNAExK92mCU2tEohWuwVMsDQ==", "dev": true, "license": "MIT", "dependencies": { @@ -43944,15 +37079,11 @@ }, "node_modules/typescript-memoize": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/typescript-memoize/-/typescript-memoize-1.1.1.tgz", - "integrity": "sha512-GQ90TcKpIH4XxYTI2F98yEQYZgjNMOGPpOgdjIBhaLaWji5HPWlRnZ4AeA1hfBxtY7bCGDJsqDDHk/KaHOl5bA==", "dev": true, "license": "MIT" }, "node_modules/typical": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/typical/-/typical-4.0.0.tgz", - "integrity": "sha512-VAH4IvQ7BDFYglMd7BPRDfLgxZZX4O4TFcRDA6EN5X7erNJJq+McIEp8np9aVtxrCJ6qx4GTYVfOWNjcqwZgRw==", "dev": true, "license": "MIT", "engines": { @@ -43961,14 +37092,10 @@ }, "node_modules/ufo": { "version": "1.6.3", - "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.6.3.tgz", - "integrity": "sha512-yDJTmhydvl5lJzBmy/hyOAA0d+aqCBuwl818haVdYCRrWV84o7YyeVm4QlVHStqNrrJSTb6jKuFAVqAFsr+K3Q==", "license": "MIT" }, "node_modules/unbox-primitive": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.1.0.tgz", - "integrity": "sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==", "license": "MIT", "dependencies": { "call-bound": "^1.0.3", @@ -43985,8 +37112,6 @@ }, "node_modules/undici": { "version": "7.22.0", - "resolved": "https://registry.npmjs.org/undici/-/undici-7.22.0.tgz", - "integrity": "sha512-RqslV2Us5BrllB+JeiZnK4peryVTndy9Dnqq62S3yYRRTj0tFQCwEniUy2167skdGOy3vqRzEvl1Dm4sV2ReDg==", "license": "MIT", "engines": { "node": ">=20.18.1" @@ -43994,20 +37119,14 @@ }, "node_modules/undici-types": { "version": "6.21.0", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", - "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", "license": "MIT" }, "node_modules/unfetch": { "version": "4.1.0", - "resolved": "https://registry.npmjs.org/unfetch/-/unfetch-4.1.0.tgz", - "integrity": "sha512-crP/n3eAPUJxZXM9T80/yv0YhkTEx2K1D3h7D1AJM6fzsWZrxdyRuLN0JH/dkZh1LNH8LxCnBzoPFCPbb2iGpg==", "license": "MIT" }, "node_modules/unicode-canonical-property-names-ecmascript": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.1.tgz", - "integrity": "sha512-dA8WbNeb2a6oQzAQ55YlT5vQAWGV9WXOsi3SskE3bcCdM0P4SDd+24zS/OCacdRq5BkdsRj9q3Pg6YyQoxIGqg==", "license": "MIT", "engines": { "node": ">=4" @@ -44015,8 +37134,6 @@ }, "node_modules/unicode-emoji-modifier-base": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unicode-emoji-modifier-base/-/unicode-emoji-modifier-base-1.0.0.tgz", - "integrity": "sha512-yLSH4py7oFH3oG/9K+XWrz1pSi3dfUrWEnInbxMfArOfc1+33BlGPQtLsOYwvdMy11AwUBetYuaRxSPqgkq+8g==", "license": "MIT", "engines": { "node": ">=4" @@ -44024,8 +37141,6 @@ }, "node_modules/unicode-match-property-ecmascript": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", - "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", "license": "MIT", "dependencies": { "unicode-canonical-property-names-ecmascript": "^2.0.0", @@ -44037,8 +37152,6 @@ }, "node_modules/unicode-match-property-value-ecmascript": { "version": "2.2.1", - "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.2.1.tgz", - "integrity": "sha512-JQ84qTuMg4nVkx8ga4A16a1epI9H6uTXAknqxkGF/aFfRLw1xC/Bp24HNLaZhHSkWd3+84t8iXnp1J0kYcZHhg==", "license": "MIT", "engines": { "node": ">=4" @@ -44046,8 +37159,6 @@ }, "node_modules/unicode-property-aliases-ecmascript": { "version": "2.2.0", - "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.2.0.tgz", - "integrity": "sha512-hpbDzxUY9BFwX+UeBnxv3Sh1q7HFxj48DTmXchNgRa46lO8uj3/1iEn3MiNUYTg1g9ctIqXCCERn8gYZhHC5lQ==", "license": "MIT", "engines": { "node": ">=4" @@ -44055,8 +37166,6 @@ }, "node_modules/unified": { "version": "11.0.5", - "resolved": "https://registry.npmjs.org/unified/-/unified-11.0.5.tgz", - "integrity": "sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA==", "license": "MIT", "dependencies": { "@types/unist": "^3.0.0", @@ -44074,8 +37183,6 @@ }, "node_modules/unified-args": { "version": "11.0.1", - "resolved": "https://registry.npmjs.org/unified-args/-/unified-args-11.0.1.tgz", - "integrity": "sha512-WEQghE91+0s3xPVs0YW6a5zUduNLjmANswX7YbBfksHNDGMjHxaWCql4SR7c9q0yov/XiIEdk6r/LqfPjaYGcw==", "dev": true, "license": "MIT", "dependencies": { @@ -44096,8 +37203,6 @@ }, "node_modules/unified-args/node_modules/ansi-regex": { "version": "6.2.2", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", - "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", "dev": true, "license": "MIT", "engines": { @@ -44109,8 +37214,6 @@ }, "node_modules/unified-args/node_modules/strip-ansi": { "version": "7.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz", - "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", "dev": true, "license": "MIT", "dependencies": { @@ -44125,8 +37228,6 @@ }, "node_modules/unified-engine": { "version": "11.2.2", - "resolved": "https://registry.npmjs.org/unified-engine/-/unified-engine-11.2.2.tgz", - "integrity": "sha512-15g/gWE7qQl9tQ3nAEbMd5h9HV1EACtFs6N9xaRBZICoCwnNGbal1kOs++ICf4aiTdItZxU2s/kYWhW7htlqJg==", "dev": true, "license": "MIT", "dependencies": { @@ -44159,15 +37260,11 @@ }, "node_modules/unified-engine/node_modules/balanced-match": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", "dev": true, "license": "MIT" }, "node_modules/unified-engine/node_modules/brace-expansion": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", - "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", "dev": true, "license": "MIT", "dependencies": { @@ -44176,9 +37273,6 @@ }, "node_modules/unified-engine/node_modules/glob": { "version": "10.5.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.5.0.tgz", - "integrity": "sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==", - "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", "dev": true, "license": "ISC", "dependencies": { @@ -44198,8 +37292,6 @@ }, "node_modules/unified-engine/node_modules/ignore": { "version": "6.0.2", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-6.0.2.tgz", - "integrity": "sha512-InwqeHHN2XpumIkMvpl/DCJVrAHgCsG5+cn1XlnLWGwtZBm8QJfSusItfrwx81CTp5agNZqpKU2J/ccC5nGT4A==", "dev": true, "license": "MIT", "engines": { @@ -44208,8 +37300,6 @@ }, "node_modules/unified-engine/node_modules/json-parse-even-better-errors": { "version": "3.0.2", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-3.0.2.tgz", - "integrity": "sha512-fi0NG4bPjCHunUJffmLd0gxssIgkNmArMvis4iNah6Owg1MCJjWhEcDLmsK6iGkJq3tHwbDkTlce70/tmXN4cQ==", "dev": true, "license": "MIT", "engines": { @@ -44218,8 +37308,6 @@ }, "node_modules/unified-engine/node_modules/lines-and-columns": { "version": "2.0.4", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-2.0.4.tgz", - "integrity": "sha512-wM1+Z03eypVAVUCE7QdSqpVIvelbOakn1M0bPDoA4SGWPx3sNDVUiMo3L6To6WWGClB7VyXnhQ4Sn7gxiJbE6A==", "dev": true, "license": "MIT", "engines": { @@ -44228,15 +37316,11 @@ }, "node_modules/unified-engine/node_modules/lru-cache": { "version": "10.4.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", - "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", "dev": true, "license": "ISC" }, "node_modules/unified-engine/node_modules/minimatch": { "version": "9.0.9", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.9.tgz", - "integrity": "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==", "dev": true, "license": "ISC", "dependencies": { @@ -44251,8 +37335,6 @@ }, "node_modules/unified-engine/node_modules/parse-json": { "version": "7.1.1", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-7.1.1.tgz", - "integrity": "sha512-SgOTCX/EZXtZxBE5eJ97P4yGM5n37BwRU+YMsH4vNzFqJV/oWFXXCmwFlgWUM4PrakybVOueJJ6pwHqSVhTFDw==", "dev": true, "license": "MIT", "dependencies": { @@ -44271,8 +37353,6 @@ }, "node_modules/unified-engine/node_modules/path-scurry": { "version": "1.11.1", - "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", - "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", "dev": true, "license": "BlueOak-1.0.0", "dependencies": { @@ -44288,8 +37368,6 @@ }, "node_modules/unified-engine/node_modules/type-fest": { "version": "3.13.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-3.13.1.tgz", - "integrity": "sha512-tLq3bSNx+xSpwvAJnzrK0Ep5CLNWjvFTOp71URMaAEWBfRb9nnJiBoUe0tF8bI4ZFO3omgBR6NvnbzVUT3Ly4g==", "dev": true, "license": "(MIT OR CC0-1.0)", "engines": { @@ -44301,8 +37379,6 @@ }, "node_modules/unified-lint-rule": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/unified-lint-rule/-/unified-lint-rule-3.0.1.tgz", - "integrity": "sha512-HxIeQOmwL19DGsxHXbeyzKHBsoSCFO7UtRVUvT2v61ptw/G+GbysWcrpHdfs5jqbIFDA11MoKngIhQK0BeTVjA==", "dev": true, "license": "MIT", "dependencies": { @@ -44318,8 +37394,6 @@ }, "node_modules/unified-message-control": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/unified-message-control/-/unified-message-control-5.0.0.tgz", - "integrity": "sha512-B2cSAkpuMVVmPP90KCfKdBhm1e9KYJ+zK3x5BCa0N65zpq1Ybkc9C77+M5qwR8FWO7RF3LM5QRRPZtgjW6DUCw==", "dev": true, "license": "MIT", "dependencies": { @@ -44339,8 +37413,6 @@ }, "node_modules/unique-filename": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-5.0.0.tgz", - "integrity": "sha512-2RaJTAvAb4owyjllTfXzFClJ7WsGxlykkPvCr9pA//LD9goVq+m4PPAeBgNodGZ7nSrntT/auWpJ6Y5IFXcfjg==", "license": "ISC", "dependencies": { "unique-slug": "^6.0.0" @@ -44351,8 +37423,6 @@ }, "node_modules/unique-slug": { "version": "6.0.0", - "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-6.0.0.tgz", - "integrity": "sha512-4Lup7Ezn8W3d52/xBhZBVdx323ckxa7DEvd9kPQHppTkLoJXw6ltrBCyj5pnrxj0qKDxYMJ56CoxNuFCscdTiw==", "license": "ISC", "dependencies": { "imurmurhash": "^0.1.4" @@ -44363,8 +37433,6 @@ }, "node_modules/unique-string": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-3.0.0.tgz", - "integrity": "sha512-VGXBUVwxKMBUznyffQweQABPRRW1vHZAbadFZud4pLFAqRGvv/96vafgjWFqzourzr8YonlQiPgH0YCJfawoGQ==", "license": "MIT", "dependencies": { "crypto-random-string": "^4.0.0" @@ -44378,8 +37446,6 @@ }, "node_modules/unist-util-inspect": { "version": "8.1.0", - "resolved": "https://registry.npmjs.org/unist-util-inspect/-/unist-util-inspect-8.1.0.tgz", - "integrity": "sha512-mOlg8Mp33pR0eeFpo5d2902ojqFFOKMMG2hF8bmH7ZlhnmjFgh0NI3/ZDwdaBJNbvrS7LZFVrBVtIE9KZ9s7vQ==", "dev": true, "license": "MIT", "dependencies": { @@ -44392,8 +37458,6 @@ }, "node_modules/unist-util-is": { "version": "6.0.1", - "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-6.0.1.tgz", - "integrity": "sha512-LsiILbtBETkDz8I9p1dQ0uyRUWuaQzd/cuEeS1hoRSyW5E5XGmTzlwY1OrNzzakGowI9Dr/I8HVaw4hTtnxy8g==", "license": "MIT", "dependencies": { "@types/unist": "^3.0.0" @@ -44405,8 +37469,6 @@ }, "node_modules/unist-util-position": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/unist-util-position/-/unist-util-position-5.0.0.tgz", - "integrity": "sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==", "license": "MIT", "dependencies": { "@types/unist": "^3.0.0" @@ -44418,8 +37480,6 @@ }, "node_modules/unist-util-position-from-estree": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unist-util-position-from-estree/-/unist-util-position-from-estree-2.0.0.tgz", - "integrity": "sha512-KaFVRjoqLyF6YXCbVLNad/eS4+OfPQQn2yOd7zF/h5T/CSL2v8NpN6a5TPvtbXthAGw5nG+PuTtq+DdIZr+cRQ==", "license": "MIT", "dependencies": { "@types/unist": "^3.0.0" @@ -44431,8 +37491,6 @@ }, "node_modules/unist-util-stringify-position": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz", - "integrity": "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==", "license": "MIT", "dependencies": { "@types/unist": "^3.0.0" @@ -44444,8 +37502,6 @@ }, "node_modules/unist-util-visit": { "version": "5.1.0", - "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-5.1.0.tgz", - "integrity": "sha512-m+vIdyeCOpdr/QeQCu2EzxX/ohgS8KbnPDgFni4dQsfSCtpz8UqDyY5GjRru8PDKuYn7Fq19j1CQ+nJSsGKOzg==", "license": "MIT", "dependencies": { "@types/unist": "^3.0.0", @@ -44459,8 +37515,6 @@ }, "node_modules/unist-util-visit-parents": { "version": "6.0.2", - "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-6.0.2.tgz", - "integrity": "sha512-goh1s1TBrqSqukSc8wrjwWhL0hiJxgA8m4kFxGlQ+8FYQ3C/m11FcTs4YYem7V664AhHVvgoQLk890Ssdsr2IQ==", "license": "MIT", "dependencies": { "@types/unist": "^3.0.0", @@ -44473,15 +37527,11 @@ }, "node_modules/universal-user-agent": { "version": "6.0.1", - "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-6.0.1.tgz", - "integrity": "sha512-yCzhz6FN2wU1NiiQRogkTQszlQSlpWaw8SvVegAc+bDxbzHgh1vX8uIe8OYyMH6DwH+sdTJsgMl36+mSMdRJIQ==", "dev": true, "license": "ISC" }, "node_modules/universalify": { "version": "0.1.2", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", "dev": true, "license": "MIT", "engines": { @@ -44490,8 +37540,6 @@ }, "node_modules/unpipe": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", "license": "MIT", "engines": { "node": ">= 0.8" @@ -44499,8 +37547,6 @@ }, "node_modules/unplugin": { "version": "2.3.11", - "resolved": "https://registry.npmjs.org/unplugin/-/unplugin-2.3.11.tgz", - "integrity": "sha512-5uKD0nqiYVzlmCRs01Fhs2BdkEgBS3SAVP6ndrBsuK42iC2+JHyxM05Rm9G8+5mkmRtzMZGY8Ct5+mliZxU/Ww==", "dev": true, "license": "MIT", "dependencies": { @@ -44515,8 +37561,6 @@ }, "node_modules/unplugin/node_modules/picomatch": { "version": "4.0.3", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", - "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", "dev": true, "license": "MIT", "engines": { @@ -44528,8 +37572,6 @@ }, "node_modules/unrs-resolver": { "version": "1.11.1", - "resolved": "https://registry.npmjs.org/unrs-resolver/-/unrs-resolver-1.11.1.tgz", - "integrity": "sha512-bSjt9pjaEBnNiGgc9rUiHGKv5l4/TGzDmYw3RhnkJGtLhbnnA/5qJj7x3dNDCRx/PJxu774LlH8lCOlB4hEfKg==", "hasInstallScript": true, "license": "MIT", "dependencies": { @@ -44562,8 +37604,6 @@ }, "node_modules/until-async": { "version": "3.0.2", - "resolved": "https://registry.npmjs.org/until-async/-/until-async-3.0.2.tgz", - "integrity": "sha512-IiSk4HlzAMqTUseHHe3VhIGyuFmN90zMTpD3Z3y8jeQbzLIq500MVM7Jq2vUAnTKAFPJrqwkzr6PoTcPhGcOiw==", "dev": true, "license": "MIT", "funding": { @@ -44572,8 +37612,6 @@ }, "node_modules/update-browserslist-db": { "version": "1.2.3", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz", - "integrity": "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==", "funding": [ { "type": "opencollective", @@ -44602,8 +37640,6 @@ }, "node_modules/update-notifier": { "version": "6.0.2", - "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-6.0.2.tgz", - "integrity": "sha512-EDxhTEVPZZRLWYcJ4ZXjGFN0oP7qYvbXWzEgRm/Yql4dHX5wDbvh89YHP6PK1lzZJYrMtXUuZZz8XGK+U6U1og==", "license": "BSD-2-Clause", "dependencies": { "boxen": "^7.0.0", @@ -44630,8 +37666,6 @@ }, "node_modules/update-notifier/node_modules/ansi-regex": { "version": "6.2.2", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", - "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", "license": "MIT", "engines": { "node": ">=12" @@ -44642,8 +37676,6 @@ }, "node_modules/update-notifier/node_modules/boxen": { "version": "7.1.1", - "resolved": "https://registry.npmjs.org/boxen/-/boxen-7.1.1.tgz", - "integrity": "sha512-2hCgjEmP8YLWQ130n2FerGv7rYpfBmnmp9Uy2Le1vge6X3gZIfSmEzP5QTDElFxcvVcXlEn8Aq6MU/PZygIOog==", "license": "MIT", "dependencies": { "ansi-align": "^3.0.1", @@ -44664,8 +37696,6 @@ }, "node_modules/update-notifier/node_modules/camelcase": { "version": "7.0.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-7.0.1.tgz", - "integrity": "sha512-xlx1yCK2Oc1APsPXDL2LdlNP6+uu8OCDdhOBSVT279M/S+y75O30C2VuD8T2ogdePBBl7PfPF4504tnLgX3zfw==", "license": "MIT", "engines": { "node": ">=14.16" @@ -44676,14 +37706,10 @@ }, "node_modules/update-notifier/node_modules/emoji-regex": { "version": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", "license": "MIT" }, "node_modules/update-notifier/node_modules/string-width": { "version": "5.1.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", - "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", "license": "MIT", "dependencies": { "eastasianwidth": "^0.2.0", @@ -44699,8 +37725,6 @@ }, "node_modules/update-notifier/node_modules/strip-ansi": { "version": "7.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz", - "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", "license": "MIT", "dependencies": { "ansi-regex": "^6.2.2" @@ -44714,8 +37738,6 @@ }, "node_modules/update-notifier/node_modules/type-fest": { "version": "2.19.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz", - "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==", "license": "(MIT OR CC0-1.0)", "engines": { "node": ">=12.20" @@ -44726,8 +37748,6 @@ }, "node_modules/update-notifier/node_modules/widest-line": { "version": "4.0.1", - "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-4.0.1.tgz", - "integrity": "sha512-o0cyEG0e8GPzT4iGHphIOh0cJOV8fivsXxddQasHPHfoZf1ZexrfeA21w2NaEN1RHE+fXlfISmOE8R9N3u3Qig==", "license": "MIT", "dependencies": { "string-width": "^5.0.1" @@ -44741,8 +37761,6 @@ }, "node_modules/update-notifier/node_modules/wrap-ansi": { "version": "8.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", - "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", "license": "MIT", "dependencies": { "ansi-styles": "^6.1.0", @@ -44758,8 +37776,6 @@ }, "node_modules/uri-js": { "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", "license": "BSD-2-Clause", "dependencies": { "punycode": "^2.1.0" @@ -44767,22 +37783,16 @@ }, "node_modules/uri-js-replace": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/uri-js-replace/-/uri-js-replace-1.0.1.tgz", - "integrity": "sha512-W+C9NWNLFOoBI2QWDp4UT9pv65r2w5Cx+3sTYFvtMdDBxkKt1syCqsUdSFAChbEe1uK5TfS04wt/nGwmaeIQ0g==", "dev": true, "license": "MIT" }, "node_modules/url-join": { "version": "4.0.1", - "resolved": "https://registry.npmjs.org/url-join/-/url-join-4.0.1.tgz", - "integrity": "sha512-jk1+QP6ZJqyOiuEI9AEWQfju/nB2Pw466kbA0LEZljHwKeMgd9WrAEgEGxjPDD2+TNbbb37rTyhEfrCXfuKXnA==", "dev": true, "license": "MIT" }, "node_modules/url-loader": { "version": "4.1.1", - "resolved": "https://registry.npmjs.org/url-loader/-/url-loader-4.1.1.tgz", - "integrity": "sha512-3BTV812+AVHHOJQO8O5MkWgZ5aosP7GnROJwvzLS9hWDj00lZ6Z0wNak423Lp9PBZN05N+Jk/N5Si8jRAlGyWA==", "license": "MIT", "dependencies": { "loader-utils": "^2.0.0", @@ -44808,8 +37818,6 @@ }, "node_modules/url-loader/node_modules/ajv": { "version": "6.14.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.14.0.tgz", - "integrity": "sha512-IWrosm/yrn43eiKqkfkHis7QioDleaXQHdDVPKg0FSwwd/DuvyX79TZnFOnYpB7dcsFAMmtFztZuXPDvSePkFw==", "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.1", @@ -44824,8 +37832,6 @@ }, "node_modules/url-loader/node_modules/ajv-keywords": { "version": "3.5.2", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", - "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", "license": "MIT", "peerDependencies": { "ajv": "^6.9.1" @@ -44833,14 +37839,10 @@ }, "node_modules/url-loader/node_modules/json-schema-traverse": { "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", "license": "MIT" }, "node_modules/url-loader/node_modules/schema-utils": { "version": "3.3.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", - "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", "license": "MIT", "dependencies": { "@types/json-schema": "^7.0.8", @@ -44857,8 +37859,6 @@ }, "node_modules/use-editable": { "version": "2.3.3", - "resolved": "https://registry.npmjs.org/use-editable/-/use-editable-2.3.3.tgz", - "integrity": "sha512-7wVD2JbfAFJ3DK0vITvXBdpd9JAz5BcKAAolsnLBuBn6UDDwBGuCIAGvR3yA2BNKm578vAMVHFCWaOcA+BhhiA==", "license": "MIT", "peerDependencies": { "react": ">= 16.8.0" @@ -44866,8 +37866,6 @@ }, "node_modules/use-sync-external-store": { "version": "1.6.0", - "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.6.0.tgz", - "integrity": "sha512-Pp6GSwGP/NrPIrxVFAIkOQeyw8lFenOHijQWkUTrDvrF4ALqylP2C/KCkeS9dpUM3KvYRQhna5vt7IL95+ZQ9w==", "dev": true, "license": "MIT", "peerDependencies": { @@ -44876,8 +37874,6 @@ }, "node_modules/user-home": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/user-home/-/user-home-2.0.0.tgz", - "integrity": "sha512-KMWqdlOcjCYdtIJpicDSFBQ8nFwS2i9sslAd6f4+CBGcU4gist2REnr2fxj2YocvJFxSF3ZOHLYLVZnUxv4BZQ==", "dev": true, "license": "MIT", "dependencies": { @@ -44889,8 +37885,6 @@ }, "node_modules/util": { "version": "0.12.5", - "resolved": "https://registry.npmjs.org/util/-/util-0.12.5.tgz", - "integrity": "sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==", "license": "MIT", "peer": true, "dependencies": { @@ -44903,20 +37897,14 @@ }, "node_modules/util-deprecate": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", "license": "MIT" }, "node_modules/utila": { "version": "0.4.0", - "resolved": "https://registry.npmjs.org/utila/-/utila-0.4.0.tgz", - "integrity": "sha512-Z0DbgELS9/L/75wZbro8xAnT50pBVFQZ+hUEueGDU5FN51YSCYM+jdxsfCiHjwNP/4LCDD0i/graKpeBnOXKRA==", "license": "MIT" }, "node_modules/utility-types": { "version": "3.11.0", - "resolved": "https://registry.npmjs.org/utility-types/-/utility-types-3.11.0.tgz", - "integrity": "sha512-6Z7Ma2aVEWisaL6TvBCy7P8rm2LQoPv6dJ7ecIaIixHcwfbJ0x7mWdbcwlIM5IGQxPZSFYeqRCqlOOeKoJYMkw==", "license": "MIT", "engines": { "node": ">= 4" @@ -44924,8 +37912,6 @@ }, "node_modules/utils-merge": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", - "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", "license": "MIT", "engines": { "node": ">= 0.4.0" @@ -44933,8 +37919,6 @@ }, "node_modules/uuid": { "version": "10.0.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-10.0.0.tgz", - "integrity": "sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ==", "funding": [ "https://github.com/sponsors/broofa", "https://github.com/sponsors/ctavan" @@ -44946,15 +37930,11 @@ }, "node_modules/v8-compile-cache-lib": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", - "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", "devOptional": true, "license": "MIT" }, "node_modules/v8-to-istanbul": { "version": "9.3.0", - "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.3.0.tgz", - "integrity": "sha512-kiGUalWN+rgBJ/1OHZsBtU4rXZOfj/7rKQxULKlIzwzQSvMJUUNgPwJEEh7gU6xEVxC0ahoOBvN2YI8GH6FNgA==", "license": "ISC", "dependencies": { "@jridgewell/trace-mapping": "^0.3.12", @@ -44967,8 +37947,6 @@ }, "node_modules/validate-npm-package-license": { "version": "3.0.4", - "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", - "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", "license": "Apache-2.0", "dependencies": { "spdx-correct": "^3.0.0", @@ -44977,8 +37955,6 @@ }, "node_modules/validate-npm-package-license/node_modules/spdx-expression-parse": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", - "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", "license": "MIT", "dependencies": { "spdx-exceptions": "^2.1.0", @@ -44987,8 +37963,6 @@ }, "node_modules/validate-npm-package-name": { "version": "7.0.2", - "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-7.0.2.tgz", - "integrity": "sha512-hVDIBwsRruT73PbK7uP5ebUt+ezEtCmzZz3F59BSr2F6OVFnJ/6h8liuvdLrQ88Xmnk6/+xGGuq+pG9WwTuy3A==", "license": "ISC", "engines": { "node": "^20.17.0 || >=22.9.0" @@ -44996,14 +37970,10 @@ }, "node_modules/value-equal": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/value-equal/-/value-equal-1.0.1.tgz", - "integrity": "sha512-NOJ6JZCAWr0zlxZt+xqCHNTEKOsrks2HQd4MqhP1qy4z1SkbEP467eNx6TgDKXMvUOb+OENfJCZwM+16n7fRfw==", "license": "MIT" }, "node_modules/vary": { "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", "license": "MIT", "engines": { "node": ">= 0.8" @@ -45011,8 +37981,6 @@ }, "node_modules/vfile": { "version": "6.0.3", - "resolved": "https://registry.npmjs.org/vfile/-/vfile-6.0.3.tgz", - "integrity": "sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==", "license": "MIT", "dependencies": { "@types/unist": "^3.0.0", @@ -45025,8 +37993,6 @@ }, "node_modules/vfile-location": { "version": "5.0.3", - "resolved": "https://registry.npmjs.org/vfile-location/-/vfile-location-5.0.3.tgz", - "integrity": "sha512-5yXvWDEgqeiYiBe1lbxYF7UMAIm/IcopxMHrMQDq3nvKcjPKIhZklUKL+AE7J7uApI4kwe2snsK+eI6UTj9EHg==", "license": "MIT", "dependencies": { "@types/unist": "^3.0.0", @@ -45039,8 +38005,6 @@ }, "node_modules/vfile-message": { "version": "4.0.3", - "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-4.0.3.tgz", - "integrity": "sha512-QTHzsGd1EhbZs4AsQ20JX1rC3cOlt/IWJruk893DfLRr57lcnOeMaWG4K0JrRta4mIJZKth2Au3mM3u03/JWKw==", "license": "MIT", "dependencies": { "@types/unist": "^3.0.0", @@ -45053,8 +38017,6 @@ }, "node_modules/vfile-reporter": { "version": "8.1.1", - "resolved": "https://registry.npmjs.org/vfile-reporter/-/vfile-reporter-8.1.1.tgz", - "integrity": "sha512-qxRZcnFSQt6pWKn3PAk81yLK2rO2i7CDXpy8v8ZquiEOMLSnPw6BMSi9Y1sUCwGGl7a9b3CJT1CKpnRF7pp66g==", "dev": true, "license": "MIT", "dependencies": { @@ -45074,8 +38036,6 @@ }, "node_modules/vfile-reporter/node_modules/ansi-regex": { "version": "6.2.2", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", - "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", "dev": true, "license": "MIT", "engines": { @@ -45087,8 +38047,6 @@ }, "node_modules/vfile-reporter/node_modules/string-width": { "version": "6.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-6.1.0.tgz", - "integrity": "sha512-k01swCJAgQmuADB0YIc+7TuatfNvTBVOoaUWJjTB9R4VJzR5vNWzf5t42ESVZFPS8xTySF7CAdV4t/aaIm3UnQ==", "dev": true, "license": "MIT", "dependencies": { @@ -45105,8 +38063,6 @@ }, "node_modules/vfile-reporter/node_modules/strip-ansi": { "version": "7.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz", - "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", "dev": true, "license": "MIT", "dependencies": { @@ -45121,8 +38077,6 @@ }, "node_modules/vfile-reporter/node_modules/supports-color": { "version": "9.4.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-9.4.0.tgz", - "integrity": "sha512-VL+lNrEoIXww1coLPOmiEmK/0sGigko5COxI09KzHc2VJXJsQ37UaQ+8quuxjDeA7+KnLGTWRyOXSLLR2Wb4jw==", "dev": true, "license": "MIT", "engines": { @@ -45134,8 +38088,6 @@ }, "node_modules/vfile-sort": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/vfile-sort/-/vfile-sort-4.0.0.tgz", - "integrity": "sha512-lffPI1JrbHDTToJwcq0rl6rBmkjQmMuXkAxsZPRS9DXbaJQvc642eCg6EGxcX2i1L+esbuhq+2l9tBll5v8AeQ==", "dev": true, "license": "MIT", "dependencies": { @@ -45149,8 +38101,6 @@ }, "node_modules/vfile-statistics": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/vfile-statistics/-/vfile-statistics-3.0.0.tgz", - "integrity": "sha512-/qlwqwWBWFOmpXujL/20P+Iuydil0rZZNglR+VNm6J0gpLHwuVM5s7g2TfVoswbXjZ4HuIhLMySEyIw5i7/D8w==", "dev": true, "license": "MIT", "dependencies": { @@ -45164,8 +38114,6 @@ }, "node_modules/vite": { "version": "7.3.1", - "resolved": "https://registry.npmjs.org/vite/-/vite-7.3.1.tgz", - "integrity": "sha512-w+N7Hifpc3gRjZ63vYBXA56dvvRlNWRczTdmCBBa+CotUzAPf5b7YMdMR/8CQoeYE5LX3W4wj6RYTgonm1b9DA==", "dev": true, "license": "MIT", "dependencies": { @@ -45239,8 +38187,6 @@ }, "node_modules/vite/node_modules/fdir": { "version": "6.5.0", - "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", - "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", "dev": true, "license": "MIT", "engines": { @@ -45257,8 +38203,6 @@ }, "node_modules/vite/node_modules/picomatch": { "version": "4.0.3", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", - "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", "dev": true, "license": "MIT", "engines": { @@ -45270,8 +38214,6 @@ }, "node_modules/vscode-jsonrpc": { "version": "8.2.0", - "resolved": "https://registry.npmjs.org/vscode-jsonrpc/-/vscode-jsonrpc-8.2.0.tgz", - "integrity": "sha512-C+r0eKJUIfiDIfwJhria30+TYWPtuHJXHtI7J0YlOmKAo7ogxP20T0zxB7HZQIFhIyvoBPwWskjxrvAtfjyZfA==", "license": "MIT", "engines": { "node": ">=14.0.0" @@ -45279,8 +38221,6 @@ }, "node_modules/vscode-languageserver": { "version": "9.0.1", - "resolved": "https://registry.npmjs.org/vscode-languageserver/-/vscode-languageserver-9.0.1.tgz", - "integrity": "sha512-woByF3PDpkHFUreUa7Hos7+pUWdeWMXRd26+ZX2A8cFx6v/JPTtd4/uN0/jB6XQHYaOlHbio03NTHCqrgG5n7g==", "license": "MIT", "dependencies": { "vscode-languageserver-protocol": "3.17.5" @@ -45291,8 +38231,6 @@ }, "node_modules/vscode-languageserver-protocol": { "version": "3.17.5", - "resolved": "https://registry.npmjs.org/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.17.5.tgz", - "integrity": "sha512-mb1bvRJN8SVznADSGWM9u/b07H7Ecg0I3OgXDuLdn307rl/J3A9YD6/eYOssqhecL27hK1IPZAsaqh00i/Jljg==", "license": "MIT", "dependencies": { "vscode-jsonrpc": "8.2.0", @@ -45301,26 +38239,18 @@ }, "node_modules/vscode-languageserver-textdocument": { "version": "1.0.12", - "resolved": "https://registry.npmjs.org/vscode-languageserver-textdocument/-/vscode-languageserver-textdocument-1.0.12.tgz", - "integrity": "sha512-cxWNPesCnQCcMPeenjKKsOCKQZ/L6Tv19DTRIGuLWe32lyzWhihGVJ/rcckZXJxfdKCFvRLS3fpBIsV/ZGX4zA==", "license": "MIT" }, "node_modules/vscode-languageserver-types": { "version": "3.17.5", - "resolved": "https://registry.npmjs.org/vscode-languageserver-types/-/vscode-languageserver-types-3.17.5.tgz", - "integrity": "sha512-Ld1VelNuX9pdF39h2Hgaeb5hEZM2Z3jUrrMgWQAu82jMtZp7p3vJT3BzToKtZI7NgQssZje5o0zryOrhQvzQAg==", "license": "MIT" }, "node_modules/vscode-uri": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-3.1.0.tgz", - "integrity": "sha512-/BpdSx+yCQGnCvecbyXdxHDkuk55/G3xwnC0GqY4gmQ3j+A+g8kzzgB4Nk/SINjqn6+waqw3EgbVF2QKExkRxQ==", "license": "MIT" }, "node_modules/w3c-xmlserializer": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-5.0.0.tgz", - "integrity": "sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA==", "license": "MIT", "dependencies": { "xml-name-validator": "^5.0.0" @@ -45331,15 +38261,11 @@ }, "node_modules/walk-up-path": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/walk-up-path/-/walk-up-path-3.0.1.tgz", - "integrity": "sha512-9YlCL/ynK3CTlrSRrDxZvUauLzAswPCrsaCgilqFevUYpeEW0/3ScEjaa3kbW/T0ghhkEr7mv+fpjqn1Y1YuTA==", "dev": true, "license": "ISC" }, "node_modules/walker": { "version": "1.0.8", - "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", - "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", "license": "Apache-2.0", "dependencies": { "makeerror": "1.0.12" @@ -45355,8 +38281,6 @@ }, "node_modules/watchpack": { "version": "2.5.1", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.5.1.tgz", - "integrity": "sha512-Zn5uXdcFNIA1+1Ei5McRd+iRzfhENPCe7LeABkJtNulSxjma+l7ltNx55BWZkRlwRnpOgHqxnjyaDgJnNXnqzg==", "license": "MIT", "dependencies": { "glob-to-regexp": "^0.4.1", @@ -45368,8 +38292,6 @@ }, "node_modules/wbuf": { "version": "1.7.3", - "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz", - "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==", "license": "MIT", "dependencies": { "minimalistic-assert": "^1.0.0" @@ -45377,8 +38299,6 @@ }, "node_modules/web-namespaces": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/web-namespaces/-/web-namespaces-2.0.1.tgz", - "integrity": "sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==", "license": "MIT", "funding": { "type": "github", @@ -45387,8 +38307,6 @@ }, "node_modules/web-streams-polyfill": { "version": "3.3.3", - "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.3.3.tgz", - "integrity": "sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==", "license": "MIT", "engines": { "node": ">= 8" @@ -45396,14 +38314,10 @@ }, "node_modules/web-vitals": { "version": "5.1.0", - "resolved": "https://registry.npmjs.org/web-vitals/-/web-vitals-5.1.0.tgz", - "integrity": "sha512-ArI3kx5jI0atlTtmV0fWU3fjpLmq/nD3Zr1iFFlJLaqa5wLBkUSzINwBPySCX/8jRyjlmy1Volw1kz1g9XE4Jg==", "license": "Apache-2.0" }, "node_modules/webidl-conversions": { "version": "7.0.0", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", - "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==", "license": "BSD-2-Clause", "engines": { "node": ">=12" @@ -45411,8 +38325,6 @@ }, "node_modules/webpack": { "version": "5.105.3", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.105.3.tgz", - "integrity": "sha512-LLBBA4oLmT7sZdHiYE/PeVuifOxYyE2uL/V+9VQP7YSYdJU7bSf7H8bZRRxW8kEPMkmVjnrXmoR3oejIdX0xbg==", "license": "MIT", "dependencies": { "@types/eslint-scope": "^3.7.7", @@ -45459,8 +38371,6 @@ }, "node_modules/webpack-bundle-analyzer": { "version": "4.10.2", - "resolved": "https://registry.npmjs.org/webpack-bundle-analyzer/-/webpack-bundle-analyzer-4.10.2.tgz", - "integrity": "sha512-vJptkMm9pk5si4Bv922ZbKLV8UTT4zib4FPgXMhgzUny0bfDDkLXAVQs3ly3fS4/TN9ROFtb0NFrm04UXFE/Vw==", "license": "MIT", "dependencies": { "@discoveryjs/json-ext": "0.5.7", @@ -45485,8 +38395,6 @@ }, "node_modules/webpack-bundle-analyzer/node_modules/commander": { "version": "7.2.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", - "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", "license": "MIT", "engines": { "node": ">= 10" @@ -45494,8 +38402,6 @@ }, "node_modules/webpack-bundle-analyzer/node_modules/ws": { "version": "7.5.10", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz", - "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", "license": "MIT", "engines": { "node": ">=8.3.0" @@ -45515,8 +38421,6 @@ }, "node_modules/webpack-dev-middleware": { "version": "7.4.5", - "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-7.4.5.tgz", - "integrity": "sha512-uxQ6YqGdE4hgDKNf7hUiPXOdtkXvBJXrfEGYSx7P7LC8hnUYGK70X6xQXUvXeNyBDDcsiQXpG2m3G9vxowaEuA==", "license": "MIT", "dependencies": { "colorette": "^2.0.10", @@ -45544,8 +38448,6 @@ }, "node_modules/webpack-dev-middleware/node_modules/mime-db": { "version": "1.54.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", - "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", "license": "MIT", "engines": { "node": ">= 0.6" @@ -45553,8 +38455,6 @@ }, "node_modules/webpack-dev-middleware/node_modules/mime-types": { "version": "3.0.2", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.2.tgz", - "integrity": "sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A==", "license": "MIT", "dependencies": { "mime-db": "^1.54.0" @@ -45569,8 +38469,6 @@ }, "node_modules/webpack-dev-server": { "version": "5.2.3", - "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-5.2.3.tgz", - "integrity": "sha512-9Gyu2F7+bg4Vv+pjbovuYDhHX+mqdqITykfzdM9UyKqKHlsE5aAjRhR+oOEfXW5vBeu8tarzlJFIZva4ZjAdrQ==", "license": "MIT", "dependencies": { "@types/bonjour": "^3.5.13", @@ -45626,8 +38524,6 @@ }, "node_modules/webpack-dev-server/node_modules/@types/express": { "version": "4.17.25", - "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.25.tgz", - "integrity": "sha512-dVd04UKsfpINUnK0yBoYHDF3xu7xVH4BuDotC/xGuycx4CgbP48X/KF/586bcObxT0HENHXEU8Nqtu6NR+eKhw==", "license": "MIT", "dependencies": { "@types/body-parser": "*", @@ -45638,8 +38534,6 @@ }, "node_modules/webpack-dev-server/node_modules/@types/express-serve-static-core": { "version": "4.19.8", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.19.8.tgz", - "integrity": "sha512-02S5fmqeoKzVZCHPZid4b8JH2eM5HzQLZWN2FohQEy/0eXTq8VXZfSN6Pcr3F6N9R/vNrj7cpgbhjie6m/1tCA==", "license": "MIT", "dependencies": { "@types/node": "*", @@ -45650,8 +38544,6 @@ }, "node_modules/webpack-dev-server/node_modules/@types/send": { "version": "0.17.6", - "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.6.tgz", - "integrity": "sha512-Uqt8rPBE8SY0RK8JB1EzVOIZ32uqy8HwdxCnoCOsYrvnswqmFZ/k+9Ikidlk/ImhsdvBsloHbAlewb2IEBV/Og==", "license": "MIT", "dependencies": { "@types/mime": "^1", @@ -45660,8 +38552,6 @@ }, "node_modules/webpack-dev-server/node_modules/@types/serve-static": { "version": "1.15.10", - "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.10.tgz", - "integrity": "sha512-tRs1dB+g8Itk72rlSI2ZrW6vZg0YrLI81iQSTkMmOqnqCaNr/8Ek4VwWcN5vZgCYWbg/JJSGBlUaYGAOP73qBw==", "license": "MIT", "dependencies": { "@types/http-errors": "*", @@ -45671,8 +38561,6 @@ }, "node_modules/webpack-dev-server/node_modules/define-lazy-prop": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-3.0.0.tgz", - "integrity": "sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==", "license": "MIT", "engines": { "node": ">=12" @@ -45683,8 +38571,6 @@ }, "node_modules/webpack-dev-server/node_modules/http-proxy-middleware": { "version": "2.0.9", - "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.9.tgz", - "integrity": "sha512-c1IyJYLYppU574+YI7R4QyX2ystMtVXZwIdzazUIPIJsHuWNd+mho2j+bKoHftndicGj9yh+xjd+l0yj7VeT1Q==", "license": "MIT", "dependencies": { "@types/http-proxy": "^1.17.8", @@ -45707,8 +38593,6 @@ }, "node_modules/webpack-dev-server/node_modules/ipaddr.js": { "version": "2.3.0", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.3.0.tgz", - "integrity": "sha512-Zv/pA+ciVFbCSBBjGfaKUya/CcGmUHzTydLMaTwrUUEM2DIEO3iZvueGxmacvmN50fGpGVKeTXpb2LcYQxeVdg==", "license": "MIT", "engines": { "node": ">= 10" @@ -45716,8 +38600,6 @@ }, "node_modules/webpack-dev-server/node_modules/is-plain-obj": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz", - "integrity": "sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==", "license": "MIT", "engines": { "node": ">=10" @@ -45728,8 +38610,6 @@ }, "node_modules/webpack-dev-server/node_modules/open": { "version": "10.2.0", - "resolved": "https://registry.npmjs.org/open/-/open-10.2.0.tgz", - "integrity": "sha512-YgBpdJHPyQ2UE5x+hlSXcnejzAvD0b22U2OuAP+8OnlJT+PjWPxtgmGqKKc+RgTM63U9gN0YzrYc71R2WT/hTA==", "license": "MIT", "dependencies": { "default-browser": "^5.2.1", @@ -45746,8 +38626,6 @@ }, "node_modules/webpack-merge": { "version": "6.0.1", - "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-6.0.1.tgz", - "integrity": "sha512-hXXvrjtx2PLYx4qruKl+kyRSLc52V+cCvMxRjmKwoA+CBbbF5GfIBtR6kCvl0fYGqTUPKB+1ktVmTHqMOzgCBg==", "license": "MIT", "dependencies": { "clone-deep": "^4.0.1", @@ -45760,8 +38638,6 @@ }, "node_modules/webpack-sources": { "version": "3.3.4", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.3.4.tgz", - "integrity": "sha512-7tP1PdV4vF+lYPnkMR0jMY5/la2ub5Fc/8VQrrU+lXkiM6C4TjVfGw7iKfyhnTQOsD+6Q/iKw0eFciziRgD58Q==", "license": "MIT", "engines": { "node": ">=10.13.0" @@ -45769,15 +38645,11 @@ }, "node_modules/webpack-virtual-modules": { "version": "0.6.2", - "resolved": "https://registry.npmjs.org/webpack-virtual-modules/-/webpack-virtual-modules-0.6.2.tgz", - "integrity": "sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ==", "dev": true, "license": "MIT" }, "node_modules/webpack/node_modules/eslint-scope": { "version": "5.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", - "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", "license": "BSD-2-Clause", "dependencies": { "esrecurse": "^4.3.0", @@ -45789,8 +38661,6 @@ }, "node_modules/webpack/node_modules/estraverse": { "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", "license": "BSD-2-Clause", "engines": { "node": ">=4.0" @@ -45798,14 +38668,10 @@ }, "node_modules/webpack/node_modules/json-parse-even-better-errors": { "version": "2.3.1", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", "license": "MIT" }, "node_modules/webpackbar": { "version": "6.0.1", - "resolved": "https://registry.npmjs.org/webpackbar/-/webpackbar-6.0.1.tgz", - "integrity": "sha512-TnErZpmuKdwWBdMoexjio3KKX6ZtoKHRVvLIU0A47R0VVBDtx3ZyOJDktgYixhoJokZTYTt1Z37OkO9pnGJa9Q==", "license": "MIT", "dependencies": { "ansi-escapes": "^4.3.2", @@ -45826,8 +38692,6 @@ }, "node_modules/webpackbar/node_modules/ansi-escapes": { "version": "4.3.2", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", - "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", "license": "MIT", "dependencies": { "type-fest": "^0.21.3" @@ -45841,8 +38705,6 @@ }, "node_modules/webpackbar/node_modules/ansi-styles": { "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "license": "MIT", "dependencies": { "color-convert": "^2.0.1" @@ -45856,8 +38718,6 @@ }, "node_modules/webpackbar/node_modules/chalk": { "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", @@ -45872,14 +38732,10 @@ }, "node_modules/webpackbar/node_modules/emoji-regex": { "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", "license": "MIT" }, "node_modules/webpackbar/node_modules/escape-string-regexp": { "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", "license": "MIT", "engines": { "node": ">=0.8.0" @@ -45887,8 +38743,6 @@ }, "node_modules/webpackbar/node_modules/figures": { "version": "3.2.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", - "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", "license": "MIT", "dependencies": { "escape-string-regexp": "^1.0.5" @@ -45902,8 +38756,6 @@ }, "node_modules/webpackbar/node_modules/is-fullwidth-code-point": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", "license": "MIT", "engines": { "node": ">=8" @@ -45911,8 +38763,6 @@ }, "node_modules/webpackbar/node_modules/markdown-table": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-2.0.0.tgz", - "integrity": "sha512-Ezda85ToJUBhM6WGaG6veasyym+Tbs3cMAw/ZhOPqXiYsr0jgocBV3j3nx+4lk47plLlIqjwuTm/ywVI+zjJ/A==", "license": "MIT", "dependencies": { "repeat-string": "^1.0.0" @@ -45924,8 +38774,6 @@ }, "node_modules/webpackbar/node_modules/string-width": { "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "license": "MIT", "dependencies": { "emoji-regex": "^8.0.0", @@ -45938,8 +38786,6 @@ }, "node_modules/webpackbar/node_modules/wrap-ansi": { "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", "license": "MIT", "dependencies": { "ansi-styles": "^4.0.0", @@ -45955,8 +38801,6 @@ }, "node_modules/websocket-driver": { "version": "0.7.4", - "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz", - "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==", "license": "Apache-2.0", "dependencies": { "http-parser-js": ">=0.5.1", @@ -45969,8 +38813,6 @@ }, "node_modules/websocket-extensions": { "version": "0.1.4", - "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz", - "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==", "license": "Apache-2.0", "engines": { "node": ">=0.8.0" @@ -45978,9 +38820,6 @@ }, "node_modules/whatwg-encoding": { "version": "3.1.1", - "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-3.1.1.tgz", - "integrity": "sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==", - "deprecated": "Use @exodus/bytes instead for a more spec-conformant and faster implementation", "license": "MIT", "dependencies": { "iconv-lite": "0.6.3" @@ -45991,8 +38830,6 @@ }, "node_modules/whatwg-encoding/node_modules/iconv-lite": { "version": "0.6.3", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", - "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", "license": "MIT", "dependencies": { "safer-buffer": ">= 2.1.2 < 3.0.0" @@ -46003,8 +38840,6 @@ }, "node_modules/whatwg-mimetype": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-4.0.0.tgz", - "integrity": "sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==", "license": "MIT", "engines": { "node": ">=18" @@ -46012,8 +38847,6 @@ }, "node_modules/whatwg-url": { "version": "14.2.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-14.2.0.tgz", - "integrity": "sha512-De72GdQZzNTUBBChsXueQUnPKDkg/5A5zp7pFDuQAj5UFoENpiACU0wlCvzpAGnTkj++ihpKwKyYewn/XNUbKw==", "license": "MIT", "dependencies": { "tr46": "^5.1.0", @@ -46025,8 +38858,6 @@ }, "node_modules/which": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", "license": "ISC", "dependencies": { "isexe": "^2.0.0" @@ -46040,8 +38871,6 @@ }, "node_modules/which-boxed-primitive": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.1.1.tgz", - "integrity": "sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==", "license": "MIT", "dependencies": { "is-bigint": "^1.1.0", @@ -46059,8 +38888,6 @@ }, "node_modules/which-builtin-type": { "version": "1.2.1", - "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.2.1.tgz", - "integrity": "sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==", "license": "MIT", "dependencies": { "call-bound": "^1.0.2", @@ -46086,8 +38913,6 @@ }, "node_modules/which-collection": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.2.tgz", - "integrity": "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==", "license": "MIT", "dependencies": { "is-map": "^2.0.3", @@ -46104,8 +38929,6 @@ }, "node_modules/which-typed-array": { "version": "1.1.20", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.20.tgz", - "integrity": "sha512-LYfpUkmqwl0h9A2HL09Mms427Q1RZWuOHsukfVcKRq9q95iQxdw0ix1JQrqbcDR9PH1QDwf5Qo8OZb5lksZ8Xg==", "license": "MIT", "dependencies": { "available-typed-arrays": "^1.0.7", @@ -46125,8 +38948,6 @@ }, "node_modules/widest-line": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-5.0.0.tgz", - "integrity": "sha512-c9bZp7b5YtRj2wOe6dlj32MK+Bx/M/d+9VB2SHM1OtsUHR0aV0tdP6DWh/iMt0kWi1t5g1Iudu6hQRNd1A4PVA==", "dev": true, "license": "MIT", "dependencies": { @@ -46141,8 +38962,6 @@ }, "node_modules/widest-line/node_modules/ansi-regex": { "version": "6.2.2", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", - "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", "dev": true, "license": "MIT", "engines": { @@ -46154,8 +38973,6 @@ }, "node_modules/widest-line/node_modules/string-width": { "version": "7.2.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", - "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", "dev": true, "license": "MIT", "dependencies": { @@ -46172,8 +38989,6 @@ }, "node_modules/widest-line/node_modules/strip-ansi": { "version": "7.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz", - "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", "dev": true, "license": "MIT", "dependencies": { @@ -46188,14 +39003,10 @@ }, "node_modules/wildcard": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.1.tgz", - "integrity": "sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ==", "license": "MIT" }, "node_modules/word-wrap": { "version": "1.2.5", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", - "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", "license": "MIT", "engines": { "node": ">=0.10.0" @@ -46203,8 +39014,6 @@ }, "node_modules/wordwrapjs": { "version": "4.0.1", - "resolved": "https://registry.npmjs.org/wordwrapjs/-/wordwrapjs-4.0.1.tgz", - "integrity": "sha512-kKlNACbvHrkpIw6oPeYDSmdCTu2hdMHoyXLTcUKala++lx5Y+wjJ/e474Jqv5abnVmwxw08DiTuHmw69lJGksA==", "dev": true, "license": "MIT", "dependencies": { @@ -46217,8 +39026,6 @@ }, "node_modules/wordwrapjs/node_modules/typical": { "version": "5.2.0", - "resolved": "https://registry.npmjs.org/typical/-/typical-5.2.0.tgz", - "integrity": "sha512-dvdQgNDNJo+8B2uBQoqdb11eUCE1JQXhvjC/CZtgvZseVd5TYMXnq0+vuUemXbd/Se29cTaUuPX3YIc2xgbvIg==", "dev": true, "license": "MIT", "engines": { @@ -46227,8 +39034,6 @@ }, "node_modules/wrap-ansi": { "version": "9.0.2", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.2.tgz", - "integrity": "sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww==", "dev": true, "license": "MIT", "dependencies": { @@ -46246,8 +39051,6 @@ "node_modules/wrap-ansi-cjs": { "name": "wrap-ansi", "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", "license": "MIT", "dependencies": { "ansi-styles": "^4.0.0", @@ -46263,8 +39066,6 @@ }, "node_modules/wrap-ansi-cjs/node_modules/ansi-styles": { "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "license": "MIT", "dependencies": { "color-convert": "^2.0.1" @@ -46278,14 +39079,10 @@ }, "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": { "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", "license": "MIT" }, "node_modules/wrap-ansi-cjs/node_modules/is-fullwidth-code-point": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", "license": "MIT", "engines": { "node": ">=8" @@ -46293,8 +39090,6 @@ }, "node_modules/wrap-ansi-cjs/node_modules/string-width": { "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "license": "MIT", "dependencies": { "emoji-regex": "^8.0.0", @@ -46307,8 +39102,6 @@ }, "node_modules/wrap-ansi/node_modules/ansi-regex": { "version": "6.2.2", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", - "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", "dev": true, "license": "MIT", "engines": { @@ -46320,8 +39113,6 @@ }, "node_modules/wrap-ansi/node_modules/string-width": { "version": "7.2.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", - "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", "dev": true, "license": "MIT", "dependencies": { @@ -46338,8 +39129,6 @@ }, "node_modules/wrap-ansi/node_modules/strip-ansi": { "version": "7.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz", - "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", "dev": true, "license": "MIT", "dependencies": { @@ -46354,14 +39143,10 @@ }, "node_modules/wrappy": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", "license": "ISC" }, "node_modules/write-file-atomic": { "version": "5.0.1", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-5.0.1.tgz", - "integrity": "sha512-+QU2zd6OTD8XWIJCbffaiQeH9U73qIqafo1x6V1snCWYGJf6cVE0cDR4D8xRzcEnfI21IFrUPzPGtcPf8AC+Rw==", "license": "ISC", "dependencies": { "imurmurhash": "^0.1.4", @@ -46373,8 +39158,6 @@ }, "node_modules/ws": { "version": "8.19.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.19.0.tgz", - "integrity": "sha512-blAT2mjOEIi0ZzruJfIhb3nps74PRWTCz1IjglWEEpQl5XS/UNama6u2/rjFkDDouqr4L67ry+1aGIALViWjDg==", "license": "MIT", "engines": { "node": ">=10.0.0" @@ -46394,8 +39177,6 @@ }, "node_modules/wsl-utils": { "version": "0.1.0", - "resolved": "https://registry.npmjs.org/wsl-utils/-/wsl-utils-0.1.0.tgz", - "integrity": "sha512-h3Fbisa2nKGPxCpm89Hk33lBLsnaGBvctQopaBSOW/uIs6FTe1ATyAnKFJrzVs9vpGdsTe73WF3V4lIsk4Gacw==", "license": "MIT", "dependencies": { "is-wsl": "^3.1.0" @@ -46409,8 +39190,6 @@ }, "node_modules/wsl-utils/node_modules/is-wsl": { "version": "3.1.1", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-3.1.1.tgz", - "integrity": "sha512-e6rvdUCiQCAuumZslxRJWR/Doq4VpPR82kqclvcS0efgt430SlGIk05vdCN58+VrzgtIcfNODjozVielycD4Sw==", "license": "MIT", "dependencies": { "is-inside-container": "^1.0.0" @@ -46424,8 +39203,6 @@ }, "node_modules/xdg-basedir": { "version": "5.1.0", - "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-5.1.0.tgz", - "integrity": "sha512-GCPAHLvrIH13+c0SuacwvRYj2SxJXQ4kaVTT5xgL3kPrz56XxkF21IGhjSE1+W0aw7gpBWRGXLCPnPby6lSpmQ==", "license": "MIT", "engines": { "node": ">=12" @@ -46436,8 +39213,6 @@ }, "node_modules/xml-js": { "version": "1.6.11", - "resolved": "https://registry.npmjs.org/xml-js/-/xml-js-1.6.11.tgz", - "integrity": "sha512-7rVi2KMfwfWFl+GpPg6m80IVMWXLRjO+PxTq7V2CDhoGak0wzYzFgUY2m4XJ47OGdXd8eLE8EmwfAmdjw7lC1g==", "license": "MIT", "dependencies": { "sax": "^1.2.4" @@ -46448,8 +39223,6 @@ }, "node_modules/xml-name-validator": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-5.0.0.tgz", - "integrity": "sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg==", "license": "Apache-2.0", "engines": { "node": ">=18" @@ -46457,14 +39230,10 @@ }, "node_modules/xmlchars": { "version": "2.2.0", - "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", - "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", "license": "MIT" }, "node_modules/y18n": { "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", "license": "ISC", "engines": { "node": ">=10" @@ -46472,14 +39241,10 @@ }, "node_modules/yallist": { "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", "license": "ISC" }, "node_modules/yaml": { "version": "2.8.2", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.2.tgz", - "integrity": "sha512-mplynKqc1C2hTVYxd0PU2xQAc22TI1vShAYGksCCfxbn/dFwnHTNi1bvYsBTkhdUNtGIf5xNOg938rrSSYvS9A==", "devOptional": true, "license": "ISC", "bin": { @@ -46494,15 +39259,11 @@ }, "node_modules/yaml-ast-parser": { "version": "0.0.43", - "resolved": "https://registry.npmjs.org/yaml-ast-parser/-/yaml-ast-parser-0.0.43.tgz", - "integrity": "sha512-2PTINUwsRqSd+s8XxKaJWQlUuEMHJQyEuh2edBbW8KNJz0SJPwUSD2zRWqezFEdN7IzAgeuYHFUCF7o8zRdZ0A==", "dev": true, "license": "Apache-2.0" }, "node_modules/yargs": { "version": "17.7.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", - "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", "license": "MIT", "dependencies": { "cliui": "^8.0.1", @@ -46519,8 +39280,6 @@ }, "node_modules/yargs-parser": { "version": "21.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", - "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", "license": "ISC", "engines": { "node": ">=12" @@ -46528,14 +39287,10 @@ }, "node_modules/yargs/node_modules/emoji-regex": { "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", "license": "MIT" }, "node_modules/yargs/node_modules/is-fullwidth-code-point": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", "license": "MIT", "engines": { "node": ">=8" @@ -46543,8 +39298,6 @@ }, "node_modules/yargs/node_modules/string-width": { "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "license": "MIT", "dependencies": { "emoji-regex": "^8.0.0", @@ -46557,8 +39310,6 @@ }, "node_modules/yn": { "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", - "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", "devOptional": true, "license": "MIT", "engines": { @@ -46567,8 +39318,6 @@ }, "node_modules/yocto-queue": { "version": "0.1.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", "license": "MIT", "engines": { "node": ">=10" @@ -46579,8 +39328,6 @@ }, "node_modules/yoctocolors-cjs": { "version": "2.1.3", - "resolved": "https://registry.npmjs.org/yoctocolors-cjs/-/yoctocolors-cjs-2.1.3.tgz", - "integrity": "sha512-U/PBtDf35ff0D8X8D0jfdzHYEPFxAI7jJlxZXwCSez5M3190m+QobIfh+sWDWSHMCWWJN2AWamkegn6vr6YBTw==", "dev": true, "license": "MIT", "engines": { @@ -46592,14 +39339,10 @@ }, "node_modules/zen-observable": { "version": "0.10.0", - "resolved": "https://registry.npmjs.org/zen-observable/-/zen-observable-0.10.0.tgz", - "integrity": "sha512-iI3lT0iojZhKwT5DaFy2Ce42n3yFcLdFyOh01G7H0flMY60P8MJuVFEoJoNwXlmAyQ45GrjL6AcZmmlv8A5rbw==", "license": "MIT" }, "node_modules/zod": { "version": "4.3.6", - "resolved": "https://registry.npmjs.org/zod/-/zod-4.3.6.tgz", - "integrity": "sha512-rftlrkhHZOcjDwkGlnUtZZkvaPHCsDATp4pGpuOOMDaTdDDXF91wuVDJoWoPsKX/3YPQ5fHuF3STjcYyKr+Qhg==", "license": "MIT", "funding": { "url": "https://github.com/sponsors/colinhacks" @@ -46607,8 +39350,6 @@ }, "node_modules/zod-to-json-schema": { "version": "3.25.1", - "resolved": "https://registry.npmjs.org/zod-to-json-schema/-/zod-to-json-schema-3.25.1.tgz", - "integrity": "sha512-pM/SU9d3YAggzi6MtR4h7ruuQlqKtad8e9S0fmxcMi+ueAK5Korys/aWcV9LIIHTVbj01NdzxcnXSN+O74ZIVA==", "license": "ISC", "peerDependencies": { "zod": "^3.25 || ^4" @@ -46616,8 +39357,6 @@ }, "node_modules/zod-validation-error": { "version": "4.0.2", - "resolved": "https://registry.npmjs.org/zod-validation-error/-/zod-validation-error-4.0.2.tgz", - "integrity": "sha512-Q6/nZLe6jxuU80qb/4uJ4t5v2VEZ44lzQjPDhYJNztRQ4wyWc6VF3D3Kb/fAuPetZQnhS3hnajCf9CsWesghLQ==", "dev": true, "license": "MIT", "engines": { @@ -46629,8 +39368,6 @@ }, "node_modules/zwitch": { "version": "2.0.4", - "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-2.0.4.tgz", - "integrity": "sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==", "license": "MIT", "funding": { "type": "github", @@ -46639,8 +39376,6 @@ }, "node_modules/zx": { "version": "8.8.5", - "resolved": "https://registry.npmjs.org/zx/-/zx-8.8.5.tgz", - "integrity": "sha512-SNgDF5L0gfN7FwVOdEFguY3orU5AkfFZm9B5YSHog/UDHv+lvmd82ZAsOenOkQixigwH2+yyH198AwNdKhj+RA==", "dev": true, "license": "Apache-2.0", "bin": { @@ -46697,8 +39432,6 @@ }, "packages/cli/node_modules/ci-info": { "version": "4.4.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-4.4.0.tgz", - "integrity": "sha512-77PSwercCZU2Fc4sX94eF8k8Pxte6JAwL4/ICZLFjJLqegs7kCuAsqqj/70NQF6TvDpgFjkubQB2FW2ZZddvQg==", "funding": [ { "type": "github", @@ -46712,8 +39445,6 @@ }, "packages/cli/node_modules/define-lazy-prop": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-3.0.0.tgz", - "integrity": "sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==", "license": "MIT", "engines": { "node": ">=12" @@ -46736,8 +39467,6 @@ }, "packages/cli/node_modules/is-wsl": { "version": "3.1.1", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-3.1.1.tgz", - "integrity": "sha512-e6rvdUCiQCAuumZslxRJWR/Doq4VpPR82kqclvcS0efgt430SlGIk05vdCN58+VrzgtIcfNODjozVielycD4Sw==", "license": "MIT", "dependencies": { "is-inside-container": "^1.0.0" @@ -46779,8 +39508,6 @@ }, "packages/cli/node_modules/p-limit": { "version": "7.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-7.3.0.tgz", - "integrity": "sha512-7cIXg/Z0M5WZRblrsOla88S4wAK+zOQQWeBYfV3qJuJXMr+LnbYjaadrFaS0JILfEDPVqHyKnZ1Z/1d6J9VVUw==", "license": "MIT", "dependencies": { "yocto-queue": "^1.2.1" @@ -46815,8 +39542,6 @@ }, "packages/cli/node_modules/yocto-queue": { "version": "1.2.2", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.2.2.tgz", - "integrity": "sha512-4LCcse/U2MHZ63HAJVE+v71o7yOdIe4cZ70Wpf8D/IyjDKYQLV5GD46B+hSTjJsvV5PztjvHoU580EftxjDZFQ==", "license": "MIT", "engines": { "node": ">=12.20" @@ -46897,206 +39622,6 @@ "@walkeros/core": "4.0.2" } }, - "packages/mcp/api": { - "name": "@walkeros/mcp-api", - "version": "2.1.1", - "extraneous": true, - "license": "MIT", - "dependencies": { - "@modelcontextprotocol/sdk": "^1.26.0", - "@walkeros/cli": "^2.1.1", - "@walkeros/core": "^2.1.1" - }, - "bin": { - "walkeros-mcp-api": "dist/index.js" - }, - "devDependencies": { - "@types/node": "^20.0.0", - "@walkeros/config": "*" - }, - "engines": { - "node": ">=18.0.0" - }, - "peerDependencies": { - "zod": "^4.0" - } - }, - "packages/mcp/cli": { - "name": "@walkeros/mcp-cli", - "version": "2.1.1", - "extraneous": true, - "license": "MIT", - "dependencies": { - "@modelcontextprotocol/sdk": "^1.26.0", - "@walkeros/cli": "^2.1.1", - "@walkeros/core": "^2.1.1" - }, - "bin": { - "walkeros-mcp-cli": "dist/index.js" - }, - "devDependencies": { - "@types/node": "^20.0.0", - "@walkeros/config": "*" - }, - "engines": { - "node": ">=18.0.0" - }, - "peerDependencies": { - "zod": "^4.0" - } - }, - "packages/mcp/flow": { - "name": "@walkeros/mcp", - "version": "2.1.1", - "extraneous": true, - "license": "MIT", - "dependencies": { - "@modelcontextprotocol/sdk": "^1.26.0", - "@walkeros/cli": "^2.1.1", - "@walkeros/core": "^2.1.1" - }, - "bin": { - "walkeros-mcp": "dist/index.js" - }, - "devDependencies": { - "@types/node": "^20.0.0", - "@walkeros/config": "*" - }, - "engines": { - "node": ">=18.0.0" - }, - "peerDependencies": { - "zod": "^4.0" - } - }, - "packages/mcp/mcp-api": { - "name": "@walkeros/mcp-api", - "version": "1.0.0", - "extraneous": true, - "license": "MIT", - "dependencies": { - "@modelcontextprotocol/sdk": "^1.26.0", - "@walkeros/cli": "^2.0.0", - "@walkeros/core": "^2.0.0" - }, - "bin": { - "walkeros-mcp-api": "dist/index.js" - }, - "devDependencies": { - "@types/node": "^20.0.0", - "@walkeros/config": "*" - }, - "engines": { - "node": ">=18.0.0" - }, - "peerDependencies": { - "zod": "^4.0" - } - }, - "packages/mcp/mcp-cli": { - "name": "@walkeros/mcp-cli", - "version": "1.0.0", - "extraneous": true, - "license": "MIT", - "dependencies": { - "@modelcontextprotocol/sdk": "^1.26.0", - "@walkeros/cli": "^2.0.0", - "@walkeros/core": "^2.0.0" - }, - "bin": { - "walkeros-mcp-cli": "dist/index.js" - }, - "devDependencies": { - "@types/node": "^20.0.0", - "@walkeros/config": "*" - }, - "engines": { - "node": ">=18.0.0" - }, - "peerDependencies": { - "zod": "^4.0" - } - }, - "packages/mcp/mcp-source-browser": { - "name": "@walkeros/mcp-source-browser", - "version": "0.1.0", - "extraneous": true, - "license": "MIT", - "dependencies": { - "@modelcontextprotocol/sdk": "^1.26.0", - "@walkeros/core": "^2.0.0", - "jsdom": "^26.0.0" - }, - "bin": { - "walkeros-mcp-source-browser": "dist/index.js" - }, - "devDependencies": { - "@types/jsdom": "^21.0.0", - "@types/node": "^20.0.0", - "@walkeros/collector": "^2.0.0", - "@walkeros/config": "*", - "@walkeros/web-core": "^2.0.0", - "@walkeros/web-source-browser": "^2.0.0" - }, - "engines": { - "node": ">=18.0.0" - }, - "peerDependencies": { - "zod": "^4.0" - } - }, - "packages/mcp/source-browser": { - "name": "@walkeros/mcp-source-browser", - "version": "0.1.0", - "extraneous": true, - "license": "MIT", - "dependencies": { - "@modelcontextprotocol/sdk": "^1.26.0", - "@walkeros/core": "^2.0.0", - "jsdom": "^26.0.0" - }, - "bin": { - "walkeros-mcp-source-browser": "dist/index.js" - }, - "devDependencies": { - "@types/jsdom": "^21.0.0", - "@types/node": "^20.0.0", - "@walkeros/collector": "^2.0.0", - "@walkeros/config": "*", - "@walkeros/web-core": "^2.0.0", - "@walkeros/web-source-browser": "^2.0.0" - }, - "engines": { - "node": ">=18.0.0" - }, - "peerDependencies": { - "zod": "^4.0" - } - }, - "packages/mcps/flow": { - "name": "@walkeros/mcp", - "version": "2.1.1", - "extraneous": true, - "license": "MIT", - "dependencies": { - "@modelcontextprotocol/sdk": "^1.26.0", - "@walkeros/cli": "^2.1.1", - "@walkeros/core": "^2.1.1" - }, - "bin": { - "walkeros-mcp": "dist/index.js" - }, - "devDependencies": { - "@types/node": "^20.0.0", - "@walkeros/config": "*" - }, - "engines": { - "node": ">=18.0.0" - }, - "peerDependencies": { - "zod": "^4.0" - } - }, "packages/mcps/mcp": { "name": "@walkeros/mcp", "version": "4.0.2", @@ -47214,6 +39739,7 @@ "@aws-sdk/client-firehose": "^3.952.0", "@aws-sdk/client-sns": "^3.952.0", "@aws-sdk/client-sts": "^3.952.0", + "@walkeros/core": "4.0.2", "@walkeros/server-core": "4.0.2" }, "devDependencies": {} @@ -47324,14 +39850,13 @@ "@google-cloud/bigquery": "^8.1.1", "@google-cloud/bigquery-storage": "^5.1.0", "@google-cloud/pubsub": "^5.3.0", + "@walkeros/core": "4.0.2", "@walkeros/server-core": "4.0.2" }, "devDependencies": {} }, "packages/server/destinations/gcp/node_modules/@google-cloud/bigquery-storage": { "version": "5.1.0", - "resolved": "https://registry.npmjs.org/@google-cloud/bigquery-storage/-/bigquery-storage-5.1.0.tgz", - "integrity": "sha512-5y8SuC4vcYZmw0Ehp8fxyTYefCNAIHOgCNiBb5YC6OpjmooU9EyjR/msbgF2B4u9lDiVOdzYUww0QaP86bPEFw==", "license": "Apache-2.0", "dependencies": { "@google-cloud/paginator": "^6.0.0", @@ -47351,8 +39876,6 @@ }, "packages/server/destinations/gcp/node_modules/protobufjs": { "version": "7.5.0", - "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.5.0.tgz", - "integrity": "sha512-Z2E/kOY1QjoMlCytmexzYfDm/w5fKAiRwpSzGtdnXW1zC88Z2yXazHHrOtwCzn+7wSxyE8PYM4rvVcMphF9sOA==", "hasInstallScript": true, "license": "BSD-3-Clause", "peer": true, @@ -48076,25 +40599,6 @@ }, "devDependencies": {} }, - "packages/server/transformers/cache": { - "name": "@walkeros/server-transformer-cache", - "version": "3.1.1", - "extraneous": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/elbwalker" - } - ], - "license": "MIT", - "dependencies": { - "@walkeros/core": "^3.1.1", - "@walkeros/store-memory": "^3.1.1" - }, - "devDependencies": { - "@walkeros/core": "^3.1.1" - } - }, "packages/server/transformers/file": { "name": "@walkeros/server-transformer-file", "version": "4.0.2", @@ -48109,8 +40613,7 @@ "@walkeros/core": "4.0.2" }, "devDependencies": { - "@walkeros/core": "4.0.2", - "@walkeros/store-memory": "4.0.2" + "@walkeros/core": "4.0.2" } }, "packages/server/transformers/fingerprint": { @@ -48132,23 +40635,6 @@ "@walkeros/server-core": "4.0.2" } }, - "packages/stores/memory": { - "name": "@walkeros/store-memory", - "version": "4.0.2", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/elbwalker" - } - ], - "license": "MIT", - "dependencies": { - "@walkeros/core": "4.0.2" - }, - "devDependencies": { - "@walkeros/core": "4.0.2" - } - }, "packages/transformers/demo": { "name": "@walkeros/transformer-demo", "version": "4.0.2", @@ -48157,35 +40643,12 @@ "@walkeros/core": "4.0.2" } }, - "packages/transformers/router": { - "name": "@walkeros/transformer-router", - "version": "3.1.1", - "extraneous": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/elbwalker" - } - ], - "license": "MIT", - "dependencies": { - "@walkeros/core": "^3.1.1" - }, - "devDependencies": {} - }, - "packages/transformers/validator": { - "name": "@walkeros/transformer-validator", + "packages/transformers/ga4": { + "name": "@walkeros/transformer-ga4", "version": "4.0.2", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/elbwalker" - } - ], "license": "MIT", "dependencies": { - "@walkeros/core": "4.0.2", - "ajv": "^8.17.1" + "@walkeros/core": "4.0.2" }, "devDependencies": { "@walkeros/core": "4.0.2" @@ -48220,6 +40683,7 @@ "license": "MIT", "dependencies": { "@amplitude/unified": "^1.0.16", + "@walkeros/core": "4.0.2", "@walkeros/web-core": "4.0.2" }, "devDependencies": { @@ -48237,6 +40701,7 @@ ], "license": "MIT", "dependencies": { + "@walkeros/core": "4.0.2", "@walkeros/web-core": "4.0.2" }, "devDependencies": { @@ -48255,21 +40720,13 @@ "license": "MIT", "dependencies": { "@microsoft/clarity": "^1.0.2", + "@walkeros/core": "4.0.2", "@walkeros/web-core": "4.0.2" }, "devDependencies": { "@walkeros/collector": "4.0.2" } }, - "packages/web/destinations/demo": { - "name": "@walkeros/destination-demo", - "version": "4.0.1", - "extraneous": true, - "license": "MIT", - "dependencies": { - "@walkeros/core": "4.0.1" - } - }, "packages/web/destinations/fullstory": { "name": "@walkeros/web-destination-fullstory", "version": "4.0.2", @@ -48282,6 +40739,7 @@ "license": "MIT", "dependencies": { "@fullstory/browser": "^2.0.8", + "@walkeros/core": "4.0.2", "@walkeros/web-core": "4.0.2" }, "devDependencies": { @@ -48299,6 +40757,7 @@ ], "license": "MIT", "dependencies": { + "@walkeros/core": "4.0.2", "@walkeros/web-core": "4.0.2" } }, @@ -48313,6 +40772,7 @@ ], "license": "MIT", "dependencies": { + "@walkeros/core": "4.0.2", "@walkeros/web-core": "4.0.2" }, "devDependencies": { @@ -48331,6 +40791,7 @@ "license": "MIT", "dependencies": { "@hotjar/browser": "^1.0.9", + "@walkeros/core": "4.0.2", "@walkeros/web-core": "4.0.2" }, "devDependencies": { @@ -48348,6 +40809,7 @@ ], "license": "MIT", "dependencies": { + "@walkeros/core": "4.0.2", "@walkeros/web-core": "4.0.2" }, "devDependencies": { @@ -48383,6 +40845,7 @@ ], "license": "MIT", "dependencies": { + "@walkeros/core": "4.0.2", "@walkeros/web-core": "4.0.2" }, "devDependencies": { @@ -48401,6 +40864,7 @@ ], "license": "MIT", "dependencies": { + "@walkeros/core": "4.0.2", "@walkeros/web-core": "4.0.2", "mixpanel-browser": "^2.78.0" }, @@ -48421,6 +40885,7 @@ "license": "MIT", "dependencies": { "@optimizely/optimizely-sdk": "^6.0.0", + "@walkeros/core": "4.0.2", "@walkeros/web-core": "4.0.2" }, "devDependencies": { @@ -48438,6 +40903,7 @@ ], "license": "MIT", "dependencies": { + "@walkeros/core": "4.0.2", "@walkeros/web-core": "4.0.2" }, "devDependencies": { @@ -48473,6 +40939,7 @@ ], "license": "MIT", "dependencies": { + "@walkeros/core": "4.0.2", "@walkeros/web-core": "4.0.2" }, "devDependencies": { @@ -48490,6 +40957,7 @@ ], "license": "MIT", "dependencies": { + "@walkeros/core": "4.0.2", "@walkeros/web-core": "4.0.2", "posthog-js": "^1.367.0" }, @@ -48509,6 +40977,7 @@ "license": "MIT", "dependencies": { "@segment/analytics-next": "^1.82.0", + "@walkeros/core": "4.0.2", "@walkeros/web-core": "4.0.2" }, "devDependencies": { @@ -48526,6 +40995,7 @@ ], "license": "MIT", "dependencies": { + "@walkeros/core": "4.0.2", "@walkeros/web-core": "4.0.2" }, "devDependencies": { @@ -48546,6 +41016,7 @@ ], "license": "MIT", "dependencies": { + "@walkeros/core": "4.0.2", "@walkeros/web-core": "4.0.2" }, "devDependencies": { @@ -48564,6 +41035,7 @@ "license": "MIT", "dependencies": { "@walkeros/collector": "4.0.2", + "@walkeros/core": "4.0.2", "@walkeros/web-core": "4.0.2" } }, @@ -48704,8 +41176,7 @@ "@walkeros/server-store-sheets": "^4.0.2", "@walkeros/server-transformer-file": "^4.0.2", "@walkeros/server-transformer-fingerprint": "^4.0.2", - "@walkeros/store-memory": "^4.0.2", - "@walkeros/transformer-validator": "^4.0.2", + "@walkeros/transformer-ga4": "^4.0.2", "@walkeros/walker.js": "^4.0.2", "@walkeros/web-destination-amplitude": "^4.0.2", "@walkeros/web-destination-api": "^4.0.2", @@ -48730,6 +41201,8 @@ "@walkeros/web-source-cmp-cookiefirst": "^4.0.2", "@walkeros/web-source-cmp-cookiepro": "^4.0.2", "@walkeros/web-source-cmp-usercentrics": "^4.0.2", + "@walkeros/web-source-datalayer": "^4.0.2", + "@walkeros/web-source-session": "^4.0.2", "css-loader": "^7.1.2", "prism-react-renderer": "^2.4.1", "react": "^19.2.4", diff --git a/packages/cli/examples/README.md b/packages/cli/examples/README.md index 3ccc5b50d..dba83e538 100644 --- a/packages/cli/examples/README.md +++ b/packages/cli/examples/README.md @@ -47,7 +47,7 @@ devcontainer. features **Features**: 51 features including variables, mapping (key, map, loop, set), -transformers (validator, fingerprint), consent gating, wildcards, ingest +transformers (enricher, fingerprint), consent gating, wildcards, ingest metadata, and more. **Architecture**: Two named flows (`web` and `server`) showing full event diff --git a/packages/cli/examples/flow-complete.json b/packages/cli/examples/flow-complete.json index 9e6595002..151c7e1d1 100644 --- a/packages/cli/examples/flow-complete.json +++ b/packages/cli/examples/flow-complete.json @@ -42,24 +42,29 @@ "contract": { "default": { "description": "Web shop tracking contract", - "globals": { + "schema": { "type": "object", "properties": { - "environment": { - "type": "string" + "globals": { + "type": "object", + "properties": { + "environment": { + "type": "string" + }, + "version": { + "type": "string" + } + } }, - "version": { - "type": "string" - } - } - }, - "consent": { - "type": "object", - "required": ["functional"], - "properties": { - "functional": { - "type": "boolean", - "const": true + "consent": { + "type": "object", + "required": ["functional"], + "properties": { + "functional": { + "type": "boolean", + "const": true + } + } } } }, @@ -277,22 +282,23 @@ "type": "enricher", "push": "$code:(event) => ({ ...event, context: { ...event.context, enrichedAt: Date.now() } })" }, - "next": "dataLayerValidator", "config": {} - }, - "dataLayerValidator": { - "package": "@walkeros/transformer-validator", - "config": { - "settings": { - "events": "$contract.default.events", - "globals": "$contract.default.globals" - } - } } }, "destinations": { "ga4": { "package": "@walkeros/web-destination-gtag", + "validate": { + "events": { + "order": { + "complete": { + "properties": { + "data": { "required": ["id", "total"] } + } + } + } + } + }, "config": { "require": ["consent", "user"], "consent": { @@ -584,8 +590,7 @@ "@walkeros/web-source-datalayer": {}, "@walkeros/source-demo": {}, "@walkeros/web-destination-gtag": {}, - "@walkeros/web-destination-api": {}, - "@walkeros/transformer-validator": {} + "@walkeros/web-destination-api": {} } } } @@ -595,24 +600,12 @@ "metaPixelId": "$env.META_PIXEL_ID:123456789012345", "metaAccessToken": "$env.META_ACCESS_TOKEN:demo_token" }, - "stores": { - "cache": { - "package": "@walkeros/store-memory", - "config": { - "settings": { - "maxSize": 10485760, - "maxEntries": 1000 - } - } - } - }, "sources": { "http": { "package": "@walkeros/server-source-express", "primary": true, "next": ["filter"], "cache": { - "store": "cache", "rules": [ { "match": { @@ -684,9 +677,6 @@ "push": "$code:(event) => event.name.startsWith('internal_') || event.name.startsWith('debug_') ? false : event" }, "next": "fingerprint", - "env": { - "store": "$store.cache" - }, "config": {}, "examples": { "passes-normal": { @@ -720,7 +710,6 @@ }, "fingerprint": { "package": "@walkeros/server-transformer-fingerprint", - "next": "serverValidator", "config": { "settings": { "fields": [ @@ -735,23 +724,12 @@ "length": 16 } } - }, - "serverValidator": { - "package": "@walkeros/transformer-validator", - "config": { - "settings": { - "format": true, - "events": "$contract.default.events", - "globals": "$contract.default.globals", - "consent": "$contract.default.consent" - } - } } }, "destinations": { "meta": { "package": "@walkeros/server-destination-meta", - "before": ["fingerprint", "serverValidator"], + "before": "fingerprint", "config": { "settings": { "pixelId": "$var.metaPixelId", @@ -939,11 +917,7 @@ "@walkeros/server-source-express": {}, "@walkeros/server-destination-meta": {}, "@walkeros/destination-demo": {}, - "@walkeros/transformer-validator": {}, - "@walkeros/server-transformer-fingerprint": {}, - "@walkeros/store-memory": { - "path": "../../stores/memory" - } + "@walkeros/server-transformer-fingerprint": {} } } } diff --git a/packages/cli/examples/flow-complete.md b/packages/cli/examples/flow-complete.md index e19d17725..793a08a6e 100644 --- a/packages/cli/examples/flow-complete.md +++ b/packages/cli/examples/flow-complete.md @@ -11,24 +11,23 @@ complete event tracking architecture. │ WEB FLOW │ │ │ │ Browser Source ─┐ │ -│ DataLayer Source ──▶ [Enricher] ──▶ [Validator] ──▶ Collector ──▶ GA4 │ -│ Demo Source ────┘ ├──▶ API │ -│ └──▶ Debug │ +│ DataLayer Source ──▶ [Enricher] ──▶ Collector ──▶ GA4 │ +│ Demo Source ────┘ ├──▶ API │ +│ └──▶ Debug │ └─────────────────────────────────────────────────────────────────────────────┘ ┌─────────────────────────────────────────────────────────────────────────────┐ │ SERVER FLOW │ │ │ -│ HTTP Source ──▶ [Filter] ──▶ [Fingerprint] ──▶ [Validator] ──▶ Collector │ -│ │ │ │ │ -│ │ ingest: │ env: before: ▼ │ -│ │ IP, UA, │ $store.cache [Fingerprint]+[Validator] │ -│ │ lang, ref, │ │ │ -│ │ anon-IP(fn) │ ▼ │ -│ │ │ Meta Destination │ -│ └──────────────┘ Demo Destination │ +│ HTTP Source ──▶ [Filter] ──▶ [Fingerprint] ──▶ Collector │ +│ │ │ │ │ +│ │ ingest: │ env: ▼ │ +│ │ IP, UA, │ filter rules Meta Destination │ +│ │ lang, ref, │ Demo Destination │ +│ │ anon-IP(fn) │ │ +│ └──────────────┘ │ │ │ -│ Store: cache (memory, 10MB, 1000 entries) │ +│ Source cache: built-in tier (ttl 300s, on GET ingest.method+path) │ └─────────────────────────────────────────────────────────────────────────────┘ ``` @@ -111,15 +110,13 @@ npx walkeros run packages/cli/examples/flow-complete.json --flow web #### Variables -| Feature | Location | Example | -| -------------------- | ------------------ | ---------------------------------------------- | -| Root-level variables | Root | `"currency": "EUR"` | -| Flow-level variables | server.variables | `"metaPixelId": "$env.META_PIXEL_ID:..."` | -| Environment variable | Variables | `"$env.GA4_MEASUREMENT_ID:G-DEMO123456"` | -| Env with default | Variables | `"$env.API_URL:http://localhost:8080/collect"` | -| $var reference | GA4 settings | `"$var.ga4MeasurementId"` | -| $contract reference | serverValidator | `"$contract.default.events"` | -| $store reference | filter transformer | `"env": { "store": "$store.cache" }` | +| Feature | Location | Example | +| -------------------- | ---------------- | ---------------------------------------------- | +| Root-level variables | Root | `"currency": "EUR"` | +| Flow-level variables | server.variables | `"metaPixelId": "$env.META_PIXEL_ID:..."` | +| Environment variable | Variables | `"$env.GA4_MEASUREMENT_ID:G-DEMO123456"` | +| Env with default | Variables | `"$env.API_URL:http://localhost:8080/collect"` | +| $var reference | GA4 settings | `"$var.ga4MeasurementId"` | #### Sources @@ -135,26 +132,24 @@ npx walkeros run packages/cli/examples/flow-complete.json --flow web #### Transformers -| Feature | Location | Example | -| ----------------------- | ------------------ | ---------------------------------------------- | -| Validator transformer | dataLayerValidator | JSON Schema validation | -| Fingerprint transformer | server | Hash context fields to `user.hash` | -| Transformer chaining | server | `"next": "serverValidator"` | -| Post-collector chain | Meta | `"before": ["fingerprint", "serverValidator"]` | -| Contract validation | serverValidator | Entity/action schemas | -| Format option | serverValidator | `"format": true` | +| Feature | Location | Example | +| ----------------------- | --------- | ---------------------------------- | +| Fingerprint transformer | server | Hash context fields to `user.hash` | +| Post-collector chain | Meta | `"before": "fingerprint"` | +| Pre-collector chain | dataLayer | `"next": "enricher"` | #### Destinations -| Feature | Location | Example | -| ----------------------- | ---------------- | --------------------------------------- | -| Require (deferred init) | GA4 | `"require": ["consent", "user"]` | -| Destination consent | GA4 | `"consent": { "marketing": true }` | -| Destination mapping | All destinations | Entity/action to vendor events | -| Multiple destinations | Both flows | GA4 + API, Meta + Demo | -| Batch option | API | `"batch": 5` | -| Transform function | API | `"transform": "$code:(data) => ..."` | -| Empty consent (always) | debug | `"consent": {}` (fires without consent) | +| Feature | Location | Example | +| ----------------------- | ---------------- | ------------------------------------------- | +| Require (deferred init) | GA4 | `"require": ["consent", "user"]` | +| Destination consent | GA4 | `"consent": { "marketing": true }` | +| Destination mapping | All destinations | Entity/action to vendor events | +| Multiple destinations | Both flows | GA4 + API, Meta + Demo | +| Batch option | API | `"batch": 5` | +| Transform function | API | `"transform": "$code:(data) => ..."` | +| Empty consent (always) | debug | `"consent": {}` (fires without consent) | +| Inline `validate:` | GA4 | Step-level schema check on `order complete` | #### Collector @@ -178,12 +173,10 @@ npx walkeros run packages/cli/examples/flow-complete.json --flow web | Policy consent-gated | Meta | `"user_data.em"` with consent | | Policy nested map | Meta | `"custom_data.request_meta": { "map": {...} }` | | Local package path | server packages | `"path": "../../core"` (resolve from filesystem) | -| Source cache | http source | `"cache": { "store": "cache", "rules": [...] }` | +| Source cache | http source | `"cache": { "rules": [...] }` (built-in tier) | | Cache match rule | http source | `"match": { "key": "ingest.method", "operator": "eq", "value": "GET" }` | | Cache TTL | http source | `"ttl": 300` (seconds) | | Cache response update | http source | `"update": { "headers.X-Cache": { "key": "cache.status" } }` | -| Store definition | server stores | `"cache": { "package": "@walkeros/store-memory", ... }` | -| Store settings | cache store | `"maxSize": 10485760, "maxEntries": 1000` | #### Browser Source @@ -203,26 +196,24 @@ npx walkeros run packages/cli/examples/flow-complete.json --flow web These features are now fully supported in JSON via `$code:` prefix (and ARE used in this example): -| Feature | Status | -| --------------------------- | --------------------------------- | -| `fn:` function | ✅ Used via `$code:` in GA4 value | -| `condition:` | ✅ Used via `$code:` in variables | -| Conditional mapping (array) | ✅ Used in serverValidator | -| Custom transformer code | ✅ Used in enricher, filter | -| Custom destination code | ✅ Used in debug logger | +| Feature | Status | +| ----------------------- | --------------------------------- | +| `fn:` function | ✅ Used via `$code:` in GA4 value | +| `condition:` | ✅ Used via `$code:` in variables | +| Custom transformer code | ✅ Used in enricher, filter | +| Custom destination code | ✅ Used in debug logger | #### Omitted for Clarity (6) These features could be added but were omitted to keep the example focused: -| Feature | Why Omitted | -| ------------------------- | ------------------------------ | -| Multiple named flows (3+) | Two flows sufficient for demo | -| Queue config | Advanced batching scenario | -| Retry config | Advanced error handling | -| Custom fetch options | API destination advanced | -| Custom headers in API | Would add complexity | -| `validate:` function | Could add via $code: if needed | +| Feature | Why Omitted | +| ------------------------- | ----------------------------- | +| Multiple named flows (3+) | Two flows sufficient for demo | +| Queue config | Advanced batching scenario | +| Retry config | Advanced error handling | +| Custom fetch options | API destination advanced | +| Custom headers in API | Would add complexity | --- @@ -238,8 +229,7 @@ These features could be added but were omitted to keep the example focused: - `custom_data.server_processed` = `true` - `custom_data.request_meta` = `{ ip, ua }` from context 3. **Fingerprint**: Hashes context fields to `user.hash` -4. **Validator**: Checks products have `data.id` -5. **Mapping**: Transforms to Meta format: +4. **Mapping**: Transforms to Meta format: - `"name": "Purchase"` - `value`, `currency`, `order_id` extracted - `contents` via `$ref` to definition loop @@ -248,7 +238,7 @@ These features could be added but were omitted to keep the example focused: 1. **DataLayer Source**: Captures `add_to_cart` event 2. **Source Mapping**: Transforms to `product add` with walkerOS structure -3. **Validator**: Checks `id` and `name` present +3. **Enricher**: Adds enrichedAt timestamp to context 4. **Collector**: Adds globals, consent, user data 5. **GA4 Mapping**: Transforms to `add_to_cart` with items array 6. **API Destination**: Batches and sends to server (if batch size reached) diff --git a/packages/cli/src/__tests__/unit/bundle/bundler-codegen.test.ts b/packages/cli/src/__tests__/unit/bundle/bundler-codegen.test.ts index 5fab7066d..b0c556e34 100644 --- a/packages/cli/src/__tests__/unit/bundle/bundler-codegen.test.ts +++ b/packages/cli/src/__tests__/unit/bundle/bundler-codegen.test.ts @@ -191,7 +191,7 @@ describe('createEntryPoint integration', () => { '@walkeros/collector': { imports: ['startFlow'] }, '@walkeros/server-source-express': {}, '@walkeros/server-transformer-fingerprint': {}, - '@walkeros/store-memory': {}, + '@walkeros/server-store-fs': {}, }, }, }, @@ -207,16 +207,15 @@ describe('createEntryPoint integration', () => { transformers: { fp: { package: '@walkeros/server-transformer-fingerprint', - code: 'transformerFingerprint', config: {}, env: { store: '$store.cache' }, }, }, stores: { cache: { - package: '@walkeros/store-memory', - code: 'storeMemory', - config: { settings: { maxSize: 1000 } }, + package: '@walkeros/server-store-fs', + code: 'storeFs', + config: { settings: { basePath: './data' } }, }, }, } as Flow; @@ -228,7 +227,7 @@ describe('createEntryPoint integration', () => { '@walkeros/collector': { imports: ['startFlow'] }, '@walkeros/server-source-express': {}, '@walkeros/server-transformer-fingerprint': {}, - '@walkeros/store-memory': {}, + '@walkeros/server-store-fs': {}, }, output: './dist/bundle.mjs', code: '', @@ -393,13 +392,13 @@ describe('detectStepPackages', () => { sources: {}, destinations: {}, transformers: { - fingerprint: { + fingerprintServer: { package: '@walkeros/server-transformer-fingerprint', code: 'transformerFingerprint', config: { settings: { output: 'user.hash' } }, }, - validate: { - package: '@walkeros/transformer-validator', + fingerprint: { + package: '@walkeros/transformer-fingerprint', }, }, }; @@ -409,7 +408,7 @@ describe('detectStepPackages', () => { expect(result).toEqual( new Set([ '@walkeros/server-transformer-fingerprint', - '@walkeros/transformer-validator', + '@walkeros/transformer-fingerprint', ]), ); }); @@ -469,16 +468,15 @@ describe('$store. prefix', () => { transformers: { fp: { package: '@walkeros/server-transformer-fingerprint', - code: 'transformerFingerprint', config: {}, env: { store: '$store.cache' }, }, }, stores: { cache: { - package: '@walkeros/store-memory', - code: 'storeMemory', - config: { settings: { maxSize: 1000 } }, + package: '@walkeros/server-store-fs', + code: 'storeFs', + config: { settings: { basePath: './data' } }, }, }, } as Flow; @@ -488,14 +486,14 @@ describe('$store. prefix', () => { '@walkeros/server-transformer-fingerprint', new Set(['transformerFingerprint']), ], - ['@walkeros/store-memory', new Set(['storeMemory'])], + ['@walkeros/server-store-fs', new Set(['storeFs'])], ]); const result = buildSplitConfigObject(flowSettings, explicitCodeImports); // stores must be a separate declaration, not inside the config object expect(result.storesDeclaration).toContain('const stores = {'); - expect(result.storesDeclaration).toContain('code: storeMemory'); + expect(result.storesDeclaration).toContain('code: storeFs'); // Code config object should reference stores via shorthand property expect(result.codeConfigObject).toMatch(/,\n\s+stores/); @@ -503,7 +501,7 @@ describe('$store. prefix', () => { expect(result.codeConfigObject).toContain('stores.cache'); // stores section should NOT be inlined in the config object expect(result.codeConfigObject).not.toMatch( - /stores:\s*\{[\s\S]*code: storeMemory/, + /stores:\s*\{[\s\S]*code: storeFs/, ); }); }); @@ -653,7 +651,7 @@ describe('buildSplitConfigObject', () => { destinations: {}, stores: { memory: { - package: '@walkeros/store-memory', + package: '@walkeros/server-store-fs', config: { settings: { maxSize: 1000 } }, }, }, @@ -729,7 +727,7 @@ describe('buildSplitConfigObject', () => { package: '@walkeros/server-source-express', config: {}, next: ['validate', 'enrich'], - cache: { rules: [{ match: '*', key: ['entity'], ttl: 60 }] }, + cache: { rules: [{ key: ['entity'], ttl: 60 }] }, primary: true, }, }, diff --git a/packages/cli/src/__tests__/unit/bundle/inline-code.test.ts b/packages/cli/src/__tests__/unit/bundle/inline-code.test.ts index d1f71270c..779ead0ea 100644 --- a/packages/cli/src/__tests__/unit/bundle/inline-code.test.ts +++ b/packages/cli/src/__tests__/unit/bundle/inline-code.test.ts @@ -8,7 +8,7 @@ describe('Validation', () => { config: { platform: 'server' }, transformers: { invalid: { - package: '@walkeros/transformer-validator', + package: '@walkeros/transformer-fingerprint', code: { type: 'inline', push: '$code:(e) => e', @@ -20,14 +20,16 @@ describe('Validation', () => { const explicitCodeImports = new Map>(); expect(() => buildSplitConfigObject(flowSettings, explicitCodeImports), - ).toThrow(/both package and code/i); + ).toThrow(/both .*code.* and .*package/i); }); - it('should error when neither package nor code are specified', () => { + it('accepts a transformer entry with neither package nor code (pass-through)', () => { + // Pass-through is the default for transformer steps. An entry with no + // operative field is a no-op step. The bundler must accept it. const flowSettings: Flow = { config: { platform: 'server' }, transformers: { - invalid: { + passthrough: { config: {}, }, }, @@ -36,7 +38,7 @@ describe('Validation', () => { const explicitCodeImports = new Map>(); expect(() => buildSplitConfigObject(flowSettings, explicitCodeImports), - ).toThrow(/package or code/i); + ).not.toThrow(); }); }); @@ -79,7 +81,7 @@ describe('Inline Code Bundling', () => { code: { type: 'validator', push: '$code:(event) => event.data?.valid ? event : null', - init: '$code:() => console.log("Validator initialized")', + init: '$code:() => console.log("transformer initialized")', }, config: { strict: true }, }, @@ -164,8 +166,8 @@ describe('Integration', () => { bundle: { packages: { '@walkeros/collector': { imports: ['startFlow'] }, - '@walkeros/transformer-validator': { - imports: ['transformerValidator'], + '@walkeros/transformer-fingerprint': { + imports: ['transformerFingerprint'], }, }, }, @@ -180,15 +182,15 @@ describe('Integration', () => { }, }, transformers: { - validate: { - package: '@walkeros/transformer-validator', + fingerprint: { + package: '@walkeros/transformer-fingerprint', }, enrich: { code: { type: 'enricher', push: '$code:(event) => ({ ...event, data: { ...event.data, enriched: true } })', }, - next: 'validate', + next: 'fingerprint', config: {}, }, }, @@ -210,8 +212,8 @@ describe('Integration', () => { ); // Package-based transformer should reference the import variable - expect(result).toContain('validate'); - expect(result).toContain('_walkerosTransformerValidator'); + expect(result).toContain('fingerprint'); + expect(result).toContain('_walkerosTransformerFingerprint'); // Inline code should be present expect(result).toContain('manual'); diff --git a/packages/cli/src/__tests__/unit/validate/flow.test.ts b/packages/cli/src/__tests__/unit/validate/flow.test.ts index 43ffd875c..6c05b2515 100644 --- a/packages/cli/src/__tests__/unit/validate/flow.test.ts +++ b/packages/cli/src/__tests__/unit/validate/flow.test.ts @@ -523,7 +523,7 @@ describe('validateFlow', () => { transformers: { enrich: { package: '@walkeros/transformer-enricher', - next: 'validate', + next: 'fingerprint', examples: { event: { in: { name: 'page view', data: {} }, @@ -531,8 +531,8 @@ describe('validateFlow', () => { }, }, }, - validate: { - package: '@walkeros/transformer-validator', + fingerprint: { + package: '@walkeros/transformer-fingerprint', examples: { event: { in: { name: 'page view', data: { enriched: true } }, diff --git a/packages/cli/src/commands/bundle/__tests__/bundler.test.ts b/packages/cli/src/commands/bundle/__tests__/bundler.test.ts index cf9fdeac9..2a7f75966 100644 --- a/packages/cli/src/commands/bundle/__tests__/bundler.test.ts +++ b/packages/cli/src/commands/bundle/__tests__/bundler.test.ts @@ -375,7 +375,7 @@ describe('buildSplitConfigObject string code references', () => { }, }, stores: { - cache: { package: '@walkeros/store-memory' }, + cache: { package: '@walkeros/server-store-fs' }, }, } as unknown as Flow; @@ -413,7 +413,7 @@ describe('buildSplitConfigObject string code references', () => { }, }, stores: { - cache: { package: '@walkeros/store-memory' }, + cache: { package: '@walkeros/server-store-fs' }, }, } as unknown as Flow; diff --git a/packages/cli/src/commands/bundle/bundler.ts b/packages/cli/src/commands/bundle/bundler.ts index 2c4f740f1..813dd51ef 100644 --- a/packages/cli/src/commands/bundle/bundler.ts +++ b/packages/cli/src/commands/bundle/bundler.ts @@ -4,7 +4,12 @@ import { builtinModules } from 'module'; import path from 'path'; import fs from 'fs-extra'; import type { Flow, Transformer } from '@walkeros/core'; -import { packageNameToVariable, ENV_MARKER_PREFIX } from '@walkeros/core'; +import { + packageNameToVariable, + ENV_MARKER_PREFIX, + validateTransformerEntry, + isPathTransformerEntry, +} from '@walkeros/core'; import { classifyStepProperties, containsCodeMarkers, @@ -62,22 +67,26 @@ function hasCodeReference(code: unknown): boolean { } function validateReference( - type: string, + type: Flow.StepKind, name: string, - ref: { package?: string; code?: unknown }, + ref: Flow.Step, ): void { + if (type === 'Transformer') { + const r = validateTransformerEntry({ ...ref }); + if (!r.ok) { + throw new Error(`Transformer "${name}": ${r.reason ?? 'invalid entry.'}`); + } + return; + } + // Sources / Destinations / Stores keep their existing two-rule check const hasPackage = !!ref.package; const hasInlineCode = isInlineCode(ref.code); const hasCode = hasCodeReference(ref.code); - - // Inline code object + package is invalid (ambiguous) if (hasPackage && hasInlineCode) { throw new Error( `${type} "${name}": Cannot specify both package and code. Use one or the other.`, ); } - // String code + package is valid (named import from package) - // Neither package nor code is invalid if (!hasPackage && !hasCode) { throw new Error(`${type} "${name}": Must specify either package or code.`); } @@ -99,7 +108,7 @@ function generateInlineCode( inline: Flow.Code, config: object, env?: object, - chains?: { before?: Transformer.RouteSpec; next?: Transformer.RouteSpec }, + chains?: { before?: Transformer.Route; next?: Transformer.Route }, isDestination?: boolean, ): string { const pushFn = inline.push.replace('$code:', ''); @@ -1579,12 +1588,34 @@ export function buildSplitConfigObject( const transformersEntries = Object.entries(transformers) .filter( ([, transformer]) => - transformer.package || hasCodeReference(transformer.code), + transformer.package || + hasCodeReference(transformer.code) || + isPathTransformerEntry({ ...transformer }), ) .map(([key, transformer]) => { if (isInlineCode(transformer.code)) { return ` ${key}: ${generateInlineCode(transformer.code, (transformer.config as object) || {}, transformer.env as object, { before: transformer.before, next: transformer.next })}`; } + if (isPathTransformerEntry({ ...transformer })) { + // Path: code-less passthrough. Emit only wiring fields; the runtime + // synthesizes the push function. + const chainLines: string[] = []; + if (transformer.before !== undefined) { + chainLines.push(`before: ${JSON.stringify(transformer.before)}`); + } + if (transformer.next !== undefined) { + chainLines.push(`next: ${JSON.stringify(transformer.next)}`); + } + if (transformer.cache !== undefined) { + chainLines.push(`cache: ${JSON.stringify(transformer.cache)}`); + } + if (transformer.config !== undefined) { + chainLines.push( + `config: ${processConfigValue(transformer.config as object)}`, + ); + } + return ` ${key}: {\n ${chainLines.join(',\n ')}\n }`; + } return buildSplitStepEntry('transformers', key, transformer); }); diff --git a/packages/cli/src/commands/push/__tests__/simulate-isolation.test.ts b/packages/cli/src/commands/push/__tests__/simulate-isolation.test.ts index dd20602c9..75090ce79 100644 --- a/packages/cli/src/commands/push/__tests__/simulate-isolation.test.ts +++ b/packages/cli/src/commands/push/__tests__/simulate-isolation.test.ts @@ -4,40 +4,80 @@ import type { Transformer, WalkerOS, } from '@walkeros/core'; -import { createIngest, createMockLogger } from '@walkeros/core'; +import { createIngest, createMockLogger, getNextSteps } from '@walkeros/core'; import { destinationInit, destinationPush, transformerInit, transformerPush, runTransformerChain, - walkChain, - extractTransformerNextMap, } from '@walkeros/collector'; -import { isRouteArray } from '@walkeros/core'; /** - * Narrow a `RouteSpec` to the static form expected by `walkChain` in these - * static-fixture tests. Throws if a future fixture accidentally uses - * conditional routing, surfacing the mistake instead of silently casting. + * Local mirror of the collector's internal chain walker. The collector no + * longer exports `walkChain` from its public surface (Task 5.1 hard cut), so + * these fixture tests carry their own minimal walker for resolving before + * chains to ordered transformer-id arrays. */ -function staticChain( - spec: Transformer.RouteSpec | undefined, -): string | string[] | undefined { - if (spec === undefined) return undefined; - if (isRouteArray(spec)) { - throw new Error( - 'test fixture uses conditional routing, not supported here', - ); +function localWalkChain( + startId: string | string[] | undefined, + transformers: Transformer.Transformers, +): string[] { + if (!startId) return []; + if (Array.isArray(startId)) return startId; + + const chain: string[] = []; + const visited = new Set(); + let current: string | undefined = startId; + + while (current && transformers[current]) { + if (visited.has(current)) break; + visited.add(current); + chain.push(current); + + const next: Transformer.Route | undefined = + transformers[current].config?.next; + if (typeof next === 'string') { + current = next; + continue; + } + if ( + Array.isArray(next) && + next.every((entry) => typeof entry === 'string') + ) { + for (const id of next) chain.push(id); + break; + } + break; + } + + return chain; +} + +/** + * Resolve a Route to an ordered chain of transformer ids. Uses the public + * `getNextSteps` to compute entry points, then walks `.next` links. + */ +function resolveChain( + spec: Transformer.Route | undefined, + transformers: Transformer.Transformers, +): string[] { + if (spec === undefined) return []; + if (typeof spec === 'string') return localWalkChain(spec, transformers); + if (Array.isArray(spec) && spec.every((entry) => typeof entry === 'string')) { + return localWalkChain(spec, transformers); } - return spec; + const ids = getNextSteps(spec); + if (ids.length === 0) return []; + if (ids.length === 1) return localWalkChain(ids[0], transformers); + return ids; } /** * Tests for before-chain execution in transformer simulation. * - * Validates the pattern: resolve before chain -> run via runTransformerChain - * -> then call transformerPush on the main transformer. + * Validates the pattern: resolve before chain (via `resolveChain`) -> run via + * runTransformerChain -> then call transformerPush on the main transformer. * * This mirrors the logic in simulateTransformer without requiring * a real ESM bundle. @@ -116,10 +156,7 @@ describe('transformer simulation isolation — before chain', () => { // Step 1: Resolve before chain const before = transformer.config.before; - const beforeChainIds = walkChain( - staticChain(before), - extractTransformerNextMap(transformers), - ); + const beforeChainIds = resolveChain(before, transformers); expect(beforeChainIds).toEqual(['enrich']); // Step 2: Run before chain @@ -246,10 +283,7 @@ describe('transformer simulation isolation — before chain', () => { // Resolve before chain const before = transformer.config.before; - const beforeChainIds = walkChain( - staticChain(before), - extractTransformerNextMap(transformers), - ); + const beforeChainIds = resolveChain(before, transformers); expect(beforeChainIds).toEqual(['gate']); // Run before chain — gate drops the event @@ -317,10 +351,7 @@ describe('transformer simulation isolation — before chain', () => { // Resolve before chain — should follow validate -> enrich via next link const before = transformer.config.before; - const beforeChainIds = walkChain( - staticChain(before), - extractTransformerNextMap(transformers), - ); + const beforeChainIds = resolveChain(before, transformers); expect(beforeChainIds).toEqual(['validate', 'enrich']); // Run before chain @@ -492,10 +523,7 @@ describe('destination simulation with before chain', () => { const before = destination.config.before; let processedEvent: WalkerOS.Event = inputEvent; if (before && collector.transformers) { - const beforeChainIds = walkChain( - staticChain(before), - extractTransformerNextMap(collector.transformers), - ); + const beforeChainIds = resolveChain(before, collector.transformers); expect(beforeChainIds).toEqual(['enrich']); const beforeResult = await runTransformerChain( @@ -568,10 +596,7 @@ describe('destination simulation with before chain', () => { // Resolve and run before chain const before = destination.config.before; - const beforeChainIds = walkChain( - staticChain(before), - extractTransformerNextMap(collector.transformers!), - ); + const beforeChainIds = resolveChain(before, collector.transformers!); expect(beforeChainIds).toEqual(['gate']); const beforeResult = await runTransformerChain( diff --git a/packages/cli/src/commands/push/index.ts b/packages/cli/src/commands/push/index.ts index abc7068c7..4df1d8c06 100644 --- a/packages/cli/src/commands/push/index.ts +++ b/packages/cli/src/commands/push/index.ts @@ -3,17 +3,13 @@ import fs from 'fs-extra'; import { createIngest, getPlatform, - compileNext, - resolveNext, - isRouteArray, + getNextSteps, buildCacheContext, } from '@walkeros/core'; import { transformerInit, transformerPush, runTransformerChain, - walkChain, - extractTransformerNextMap, wrapEnv, } from '@walkeros/collector'; import { createCLILogger } from '../../core/cli-logger.js'; @@ -47,29 +43,66 @@ function isRecord(value: unknown): value is Record { return value !== null && typeof value === 'object'; } +function isString(value: unknown): value is string { + return typeof value === 'string'; +} + +/** + * Walk a transformer chain via static `.next` links starting at `startId`. + * Mirrors the collector's internal `walkChain` for the case where the + * simulator already knows the entry-point id and the underlying chain is + * static. Conditional `.next` shapes terminate the walk at this hop. + */ +function walkStaticChain( + startId: string, + transformers: import('@walkeros/core').Transformer.Transformers, +): string[] { + const chain: string[] = []; + const visited = new Set(); + let current: string | undefined = startId; + + while (current && transformers[current]) { + if (visited.has(current)) break; + visited.add(current); + chain.push(current); + + const next: import('@walkeros/core').Transformer.Route | undefined = + transformers[current].config?.next; + if (typeof next === 'string') { + current = next; + continue; + } + if (Array.isArray(next) && next.every(isString)) { + chain.push(...next); + break; + } + // Conditional / undefined → terminate walk. + break; + } + + return chain; +} + /** * Resolve a before chain config to an ordered array of transformer IDs. - * Handles both static (string/string[]) and conditional (Route[]) chains, - * matching the pattern used by source.ts in the collector. + * Uses `getNextSteps` for the entry points and follows static `.next` + * links via `walkStaticChain`. */ function resolveBeforeChain( - before: unknown, + before: import('@walkeros/core').Transformer.Route | undefined, transformers: import('@walkeros/core').Transformer.Transformers, ingest?: import('@walkeros/core').Ingest, event?: WalkerOS.DeepPartialEvent, ): string[] { if (!before) return []; - - const next = before as import('@walkeros/core').Transformer.RouteSpec; - - if (isRouteArray(next)) { - const compiled = compileNext(next); - const resolved = resolveNext(compiled!, buildCacheContext(ingest, event)); - if (!resolved) return []; - return walkChain(resolved, extractTransformerNextMap(transformers)); + // Explicit string[] chain — use as-is. + if (Array.isArray(before) && before.every(isString)) { + return before; } - - return walkChain(next, extractTransformerNextMap(transformers)); + const ids = getNextSteps(before, buildCacheContext(ingest, event)); + if (ids.length === 0) return []; + if (ids.length === 1) return walkStaticChain(ids[0], transformers); + return ids; } /** diff --git a/packages/cli/src/commands/setup/__tests__/resolve.test.ts b/packages/cli/src/commands/setup/__tests__/resolve.test.ts index 78f63d070..14ff757e8 100644 --- a/packages/cli/src/commands/setup/__tests__/resolve.test.ts +++ b/packages/cli/src/commands/setup/__tests__/resolve.test.ts @@ -13,7 +13,7 @@ const flow: Flow = { }, }, stores: { - cache: { package: '@walkeros/store-memory', config: {} }, + cache: { package: '@walkeros/server-store-fs', config: {} }, }, }; @@ -35,7 +35,7 @@ describe('resolveComponent', () => { target: 'store.cache', kind: 'store', id: 'cache', - pkg: '@walkeros/store-memory', + pkg: '@walkeros/server-store-fs', }, ])('finds $kind by .', ({ target, kind, id, pkg }) => { const r = resolveComponent(flow, target); diff --git a/packages/cli/src/commands/validate/__tests__/flow-routes.test.ts b/packages/cli/src/commands/validate/__tests__/flow-routes.test.ts new file mode 100644 index 000000000..0c3349d2c --- /dev/null +++ b/packages/cli/src/commands/validate/__tests__/flow-routes.test.ts @@ -0,0 +1,425 @@ +/** + * Tests for the flow validator: route flattening and empty-transformer rule. + * + * Indirectly exercises the private `flattenRouteTargets` helper inside + * `validators/flow.ts` by inspecting `details.connectionsChecked`, which counts + * connections enumerated by the static graph builder. The graph builder calls + * `flattenRouteTargets` to resolve each step's `next`/`before` route spec into + * concrete downstream target IDs and only records a connection when both + * endpoints expose `examples`. + * + * Also asserts the CLI-specific closed-schema rules (`UNKNOWN_KEY`, + * `CONFLICT`) on transformer entries. Empty entries are accepted — + * pass-through is the default and a no-op step causes no harm. + */ + +import { validateFlow } from '../validators/flow.js'; + +describe('validateFlow — route flattening (flattenRouteTargets)', () => { + it('flattens a one route to all downstream targets', () => { + // Source.next is a `one` (first-match dispatch) route fanning out to two + // transformers, each with examples. The graph builder should enumerate + // 2 source→transformer connections — proof that `one` was flattened + // correctly as a reachability over-approximation. + const flow = { + version: 4, + flows: { + default: { + config: { platform: 'web' as const }, + sources: { + browser: { + package: '@walkeros/web-source-browser', + examples: { + pageview: { + in: { event: 'page view' }, + out: { entity: 'page', action: 'view' }, + }, + }, + next: { + one: ['toEnricher', 'toRedactor'], + }, + }, + }, + transformers: { + toEnricher: { + package: '@walkeros/transformer-enricher', + examples: { + pass: { + in: { entity: 'page', action: 'view' }, + out: { entity: 'page', action: 'view' }, + }, + }, + }, + toRedactor: { + package: '@walkeros/transformer-redactor', + examples: { + pass: { + in: { entity: 'page', action: 'view' }, + out: { entity: 'page', action: 'view' }, + }, + }, + }, + }, + }, + }, + }; + + const result = validateFlow(flow); + + // No closed-schema errors — both transformers declare `package`. + expect(result.errors.some((e) => e.code === 'UNKNOWN_KEY')).toBe(false); + expect(result.errors.some((e) => e.code === 'CONFLICT')).toBe(false); + + // Two connections enumerated, one per branch of the one. + expect(result.details.connectionsChecked).toBe(2); + }); + + it('flattens a many route to all reachable targets', () => { + // Source.next is a `many` (all-match terminal fan-out) route. Like `one`, + // every branch is reachable from a static-graph perspective, so the + // builder should enumerate one connection per branch. + const flow = { + version: 4, + flows: { + default: { + config: { platform: 'web' as const }, + sources: { + browser: { + package: '@walkeros/web-source-browser', + examples: { + pageview: { + in: { event: 'page view' }, + out: { entity: 'page', action: 'view' }, + }, + }, + next: { + many: ['toEnricher', 'toRedactor'], + }, + }, + }, + transformers: { + toEnricher: { + package: '@walkeros/transformer-enricher', + examples: { + pass: { + in: { entity: 'page', action: 'view' }, + out: { entity: 'page', action: 'view' }, + }, + }, + }, + toRedactor: { + package: '@walkeros/transformer-redactor', + examples: { + pass: { + in: { entity: 'page', action: 'view' }, + out: { entity: 'page', action: 'view' }, + }, + }, + }, + }, + }, + }, + }; + + const result = validateFlow(flow); + + // No closed-schema errors — both transformers declare `package`. + expect(result.errors.some((e) => e.code === 'UNKNOWN_KEY')).toBe(false); + expect(result.errors.some((e) => e.code === 'CONFLICT')).toBe(false); + + // Every branch is reachable: two source→transformer connections. + expect(result.details.connectionsChecked).toBe(2); + }); + + it('flattens a bare-gate route to no targets', () => { + // Source.next is a bare gate (only `match`, no `next`/`case`). The graph + // builder should enumerate 0 connections from the source — proof that a + // gate without targets is correctly flattened to an empty list. + const flow = { + version: 4, + flows: { + default: { + config: { platform: 'web' as const }, + sources: { + browser: { + package: '@walkeros/web-source-browser', + examples: { + pageview: { + in: { event: 'page view' }, + out: { entity: 'page', action: 'view' }, + }, + }, + next: { + match: { key: 'event', operator: 'eq', value: 'page view' }, + }, + }, + }, + // A transformer is defined but is unreachable via the bare gate. + // It must not be wired up via source.next flattening. + transformers: { + toEnricher: { + package: '@walkeros/transformer-enricher', + examples: { + pass: { + in: { entity: 'page', action: 'view' }, + out: { entity: 'page', action: 'view' }, + }, + }, + }, + }, + }, + }, + }; + + const result = validateFlow(flow); + + // No schema errors for a valid bare-gate route. + expect( + result.errors.filter((e) => e.code === 'SCHEMA_VALIDATION'), + ).toHaveLength(0); + + // Bare gate has no downstream targets, so no connections are checked. + expect(result.details.connectionsChecked).toBe(0); + }); +}); + +describe('validateFlow — closed-schema rules', () => { + it('accepts an empty transformer entry (pass-through is the default)', () => { + // An entry with no fields is a no-op step. Causes no harm; not an error. + // The closed-schema check (UNKNOWN_KEY) is what catches real typos. + const flow = { + version: 4, + flows: { + default: { + config: { platform: 'web' as const }, + transformers: { + empty: {}, + }, + }, + }, + }; + + const result = validateFlow(flow); + + expect( + result.errors.some((e) => e.path === 'flows.default.transformers.empty'), + ).toBe(false); + }); + + it('rejects misrouted cache keys at the top of a transformer step', () => { + // The author forgot the `cache:` wrapper and placed `rules`/`stop` at the + // top of the transformer entry. Closed schema must reject the unknown keys. + const flow = { + version: 4, + flows: { + default: { + config: { platform: 'web' as const }, + transformers: { + dedupe: { rules: [], stop: true }, + }, + }, + }, + }; + + const result = validateFlow(flow); + + expect(result.errors.some((e) => e.code === 'UNKNOWN_KEY')).toBe(true); + }); + + it('rejects a transformer with both code and package', () => { + // `code` and `package` are mutually exclusive ways to provide a transformer + // implementation. The closed-schema check must surface a CONFLICT error. + const flow = { + version: 4, + flows: { + default: { + config: { platform: 'web' as const }, + transformers: { + confused: { + code: '$code:(e) => ({ event: e })', + package: '@walkeros/x', + }, + }, + }, + }, + }; + + const result = validateFlow(flow); + + expect(result.errors.some((e) => e.code === 'CONFLICT')).toBe(true); + }); + + it('accepts a pass-through step with only `before`', () => { + // A pass-through step (no code/package) declares only `before` to name a + // shared chain. Closed-schema rule must not flag it. + const flow = { + version: 4, + flows: { + default: { + config: { platform: 'web' as const }, + transformers: { + chainHead: { + before: ['toEnricher'], + }, + toEnricher: { + package: '@walkeros/transformer-enricher', + }, + }, + }, + }, + }; + + const result = validateFlow(flow); + + expect( + result.errors.some( + (e) => e.path === 'flows.default.transformers.chainHead', + ), + ).toBe(false); + }); +}); + +describe('validateFlow — many operator lint warnings', () => { + it('warns on empty many: []', () => { + // `many: []` is structurally valid but useless: the main chain terminates + // with no branches spawned. Almost always a typo. Lint surfaces it as a + // warning, not a hard error. + const flow = { + version: 4, + flows: { + default: { + config: { platform: 'web' as const }, + sources: { + browser: { + package: '@walkeros/web-source-browser', + next: { + many: [], + }, + }, + }, + }, + }, + }; + + const result = validateFlow(flow); + + expect(result.warnings.some((w) => /empty many/i.test(w.message))).toBe( + true, + ); + // Schema accepts it, so no errors. + expect( + result.errors.filter((e) => e.code === 'SCHEMA_VALIDATION'), + ).toHaveLength(0); + }); + + it('warns on single-entry many: ["x"]', () => { + // A single-entry `many` is a useless fan-out. Author should use `next` for + // clarity. + const flow = { + version: 4, + flows: { + default: { + config: { platform: 'web' as const }, + sources: { + browser: { + package: '@walkeros/web-source-browser', + next: { + many: ['toEnricher'], + }, + }, + }, + transformers: { + toEnricher: { + package: '@walkeros/transformer-enricher', + }, + }, + }, + }, + }; + + const result = validateFlow(flow); + + expect( + result.warnings.some((w) => + /single-entry many|use.*next/i.test(w.message), + ), + ).toBe(true); + expect( + result.errors.filter((e) => e.code === 'SCHEMA_VALIDATION'), + ).toHaveLength(0); + }); + + it('warns on main-chain steps after many (dead code)', () => { + // `many` terminates the main chain. Anything sequenced after it is dead + // code and never runs. + const flow = { + version: 4, + flows: { + default: { + config: { platform: 'web' as const }, + sources: { + browser: { + package: '@walkeros/web-source-browser', + next: [{ many: ['toEnricher', 'toRedactor'] }, 'toTrailing'], + }, + }, + transformers: { + toEnricher: { + package: '@walkeros/transformer-enricher', + }, + toRedactor: { + package: '@walkeros/transformer-redactor', + }, + toTrailing: { + package: '@walkeros/transformer-enricher', + }, + }, + }, + }, + }; + + const result = validateFlow(flow); + + expect( + result.warnings.some((w) => + /dead code|unreachable|after.*many/i.test(w.message), + ), + ).toBe(true); + expect( + result.errors.filter((e) => e.code === 'SCHEMA_VALIDATION'), + ).toHaveLength(0); + }); + + it('does not warn on well-formed many', () => { + // Multi-entry `many` in terminal position is correct usage. + const flow = { + version: 4, + flows: { + default: { + config: { platform: 'web' as const }, + sources: { + browser: { + package: '@walkeros/web-source-browser', + next: { + many: ['toEnricher', 'toRedactor'], + }, + }, + }, + transformers: { + toEnricher: { + package: '@walkeros/transformer-enricher', + }, + toRedactor: { + package: '@walkeros/transformer-redactor', + }, + }, + }, + }, + }; + + const result = validateFlow(flow); + + const manyWarnings = result.warnings.filter((w) => /many/i.test(w.message)); + expect(manyWarnings).toEqual([]); + }); +}); diff --git a/packages/cli/src/commands/validate/validators/flow.ts b/packages/cli/src/commands/validate/validators/flow.ts index 618d5bc8f..7fdc87a3a 100644 --- a/packages/cli/src/commands/validate/validators/flow.ts +++ b/packages/cli/src/commands/validate/validators/flow.ts @@ -1,7 +1,11 @@ // walkerOS/packages/cli/src/commands/validate/validators/flow.ts import type { Flow } from '@walkeros/core'; -import { getFlowSettings, isObject } from '@walkeros/core'; +import { + getFlowSettings, + isObject, + validateTransformerEntry, +} from '@walkeros/core'; import { schemas } from '@walkeros/core/dev'; import type { ValidateResult, @@ -82,6 +86,29 @@ export function validateFlow( }); } + // 5b. CLI-specific: closed-schema check on every transformer entry. + // Delegates to @walkeros/core for a single source of truth. + if (flows) { + for (const [flowName, flowValue] of Object.entries(flows)) { + if (!isObject(flowValue)) continue; + const transformersValue = flowValue.transformers; + if (!isObject(transformersValue)) continue; + for (const [name, transformerValue] of Object.entries( + transformersValue, + )) { + if (!isObject(transformerValue)) continue; + const result = validateTransformerEntry(transformerValue); + if (!result.ok) { + errors.push({ + path: `flows.${flowName}.transformers.${name}`, + message: result.reason || 'Invalid transformer entry.', + code: result.code, + }); + } + } + } + } + // 6. Extract flow details if (flows) { const flowNames = Object.keys(flows); @@ -187,6 +214,25 @@ export function validateFlow( } } + // 10b. CLI-specific: lint warnings on Route shapes that the schema accepts + // but the author probably didn't intend. Non-blocking — informational. + // Runs only when there are no schema errors so we operate on shapes + // core has already validated. + if (errors.length === 0 && isFlowJson(input)) { + const typedFlows: Record = input.flows; + const flowsToLint = options.flow + ? options.flow in typedFlows + ? [options.flow] + : [] + : Object.keys(typedFlows); + + for (const name of flowsToLint) { + const flowSettings = typedFlows[name]; + if (!flowSettings) continue; + lintFlowRoutes(name, flowSettings, warnings); + } + } + // 11. Soft-resolve $flow refs to surface warnings (does NOT throw on missing // keys / unknown flows; cycles still throw and become errors). if (errors.length === 0 && isFlowJson(input)) { @@ -245,25 +291,87 @@ interface StepConnection { } /** - * Flatten a RouteSpec into the unique step IDs it can target. - * For string and string[] forms, returns the IDs directly. - * For Route[] form, recursively unwraps each rule's next. - * Used by the connection-graph builder to enumerate static-graph edges - * for example-compatibility checks; runtime routing remains dynamic. + * Type predicate: narrow a `Route` to its `RouteConfig` variant. + * `Route` is `string | Route[] | RouteConfig`; eliminating the first two + * leaves `RouteConfig`. TS will not infer this from inline checks. + */ +function isRouteConfig( + spec: import('@walkeros/core').Transformer.Route, +): spec is import('@walkeros/core').Transformer.RouteConfig { + return typeof spec === 'object' && spec !== null && !Array.isArray(spec); +} + +/** + * Type predicate: narrow a `RouteConfig` to its `RouteNextConfig` variant. + * Property-presence + value-shape check; siblings declare `next?: never`, + * which TS cannot disambiguate via `in` alone. + */ +function isRouteNext( + spec: import('@walkeros/core').Transformer.RouteConfig, +): spec is import('@walkeros/core').Transformer.RouteNextConfig { + if (!('next' in spec)) return false; + const value: unknown = spec.next; + return value !== undefined; +} + +/** + * Type predicate: narrow a `RouteConfig` to its `RouteOneConfig` variant. + */ +function isRouteOne( + spec: import('@walkeros/core').Transformer.RouteConfig, +): spec is import('@walkeros/core').Transformer.RouteOneConfig { + if (!('one' in spec)) return false; + const value: unknown = spec.one; + return Array.isArray(value); +} + +/** + * Type predicate: narrow a `RouteConfig` to its `RouteManyConfig` variant. + */ +function isRouteMany( + spec: import('@walkeros/core').Transformer.RouteConfig, +): spec is import('@walkeros/core').Transformer.RouteManyConfig { + if (!('many' in spec)) return false; + const value: unknown = spec.many; + return Array.isArray(value); +} + +/** + * Reachability enumeration: returns POSSIBLE downstream targets under + * "match may pass or fail" semantics. NOT a deterministic path predictor — + * actual routing requires a real event. Used for static-graph validation + * (example-compatibility), where over-approximation is correct. + * + * Handles all Route shapes: + * - string transformer ID + * - string[] sugar for chained .next + * - RouteConfig with `next` (recursive) + * - RouteConfig with `one` (first-match dispatch — every branch reachable) + * - RouteConfig with `many` (all-match fan-out — every branch reachable) + * - bare gate RouteConfig (no targets) + * - Route[] of mixed RouteConfig entries */ function flattenRouteTargets( - spec: import('@walkeros/core').Transformer.RouteSpec | undefined, + spec: import('@walkeros/core').Transformer.Route | undefined, ): string[] { if (!spec) return []; if (typeof spec === 'string') return [spec]; - if (!Array.isArray(spec) || spec.length === 0) return []; + if (isRouteConfig(spec)) { + if (isRouteNext(spec)) return flattenRouteTargets(spec.next); + if (isRouteOne(spec)) { + return Array.from(new Set(spec.one.flatMap(flattenRouteTargets))); + } + if (isRouteMany(spec)) { + return Array.from(new Set(spec.many.flatMap(flattenRouteTargets))); + } + return []; // bare gate + } + if (spec.length === 0) return []; if (typeof spec[0] === 'string') { return spec.filter((s): s is string => typeof s === 'string'); } - const routes = spec as import('@walkeros/core').Transformer.Route[]; - return Array.from( - new Set(routes.flatMap((r) => flattenRouteTargets(r.next))), - ); + // Array of RouteConfig (or mixed Route entries) + return Array.from(new Set(spec.flatMap(flattenRouteTargets))); } function buildConnectionGraph(config: Flow): StepConnection[] { @@ -391,6 +499,144 @@ function isStructurallyCompatible(a: unknown, b: unknown): boolean { return true; } +/** + * Walk every Route spec on a flow's sources/transformers/destinations and + * emit lint warnings for `many` shapes that are structurally valid but + * almost certainly unintended: + * + * - `many: []` — main chain terminates with no branches. + * - `many: ["x"]` — single-entry fan-out is just `next: "x"`. + * - `[..., { many }, trailing]` — mixed-array dead code after `many`. + * + * Non-blocking. Warnings only. + */ +function lintFlowRoutes( + flowName: string, + flow: Flow, + warnings: ValidationWarning[], +): void { + for (const [name, source] of Object.entries(flow.sources || {})) { + lintRoute(source.next, `flows.${flowName}.sources.${name}.next`, warnings); + lintRoute( + source.before, + `flows.${flowName}.sources.${name}.before`, + warnings, + ); + } + + for (const [name, transformer] of Object.entries(flow.transformers || {})) { + lintRoute( + transformer.next, + `flows.${flowName}.transformers.${name}.next`, + warnings, + ); + lintRoute( + transformer.before, + `flows.${flowName}.transformers.${name}.before`, + warnings, + ); + } + + for (const [name, dest] of Object.entries(flow.destinations || {})) { + // `many` is rejected at schema level for destination.before/next, but other + // operators are still valid here — keep the walker active for nested gates. + lintRoute( + dest.before, + `flows.${flowName}.destinations.${name}.before`, + warnings, + ); + lintRoute( + dest.next, + `flows.${flowName}.destinations.${name}.next`, + warnings, + ); + } +} + +/** + * Recursive Route walker. Emits warnings for the three `many` lint cases. + * `position` is a human-readable label of where this Route lives in the flow + * (e.g. `flows.default.sources.browser.next`) so warnings are actionable. + */ +function lintRoute( + spec: import('@walkeros/core').Transformer.Route | undefined, + position: string, + warnings: ValidationWarning[], +): void { + if (!spec) return; + + // A bare string is a target ID — nothing to lint. + if (typeof spec === 'string') return; + + if (Array.isArray(spec)) { + // Mixed-array sequence (sugar for chained .next). Check for a `many` + // entry in non-final position: anything after `many` is dead code + // because the main chain terminates at the fan-out. + for (let i = 0; i < spec.length; i++) { + const entry = spec[i]; + if ( + i < spec.length - 1 && + typeof entry === 'object' && + entry !== null && + !Array.isArray(entry) && + isRouteMany(entry) + ) { + warnings.push({ + path: position, + message: `dead code after many at ${position}: main chain terminates at the many operator`, + suggestion: + 'Remove entries after the many operator; move them into each many branch if they should still run.', + }); + } + // Recurse into each array entry so we still catch nested issues + // (e.g. an inner `one` with a single-entry many branch). + lintRoute(entry, `${position}[${i}]`, warnings); + } + return; + } + + // RouteConfig — narrow by operator. + if (isRouteNext(spec)) { + lintRoute(spec.next, `${position}.next`, warnings); + return; + } + + if (isRouteOne(spec)) { + for (let i = 0; i < spec.one.length; i++) { + lintRoute(spec.one[i], `${position}.one[${i}]`, warnings); + } + return; + } + + if (isRouteMany(spec)) { + if (spec.many.length === 0) { + warnings.push({ + path: position, + message: `empty many at ${position}: main chain terminates with no branches; use next or remove`, + suggestion: + 'Add one or more branch targets to many, or replace many with next if no fan-out is needed.', + }); + } else if (spec.many.length === 1) { + const only = spec.many[0]; + const hint = + typeof only === 'string' + ? `use 'next: "${only}"' for clarity` + : `use 'next' for clarity`; + warnings.push({ + path: position, + message: `single-entry many at ${position}: ${hint}`, + suggestion: 'Replace many with next when only one branch exists.', + }); + } + for (let i = 0; i < spec.many.length; i++) { + lintRoute(spec.many[i], `${position}.many[${i}]`, warnings); + } + return; + } + + // Bare gate: nothing else to recurse into. +} + function checkContractCompliance( config: Flow, contract: Flow.Contract, diff --git a/packages/cli/src/config/loader.ts b/packages/cli/src/config/loader.ts index 88dbbc063..4f6b27870 100644 --- a/packages/cli/src/config/loader.ts +++ b/packages/cli/src/config/loader.ts @@ -106,6 +106,7 @@ export function loadBundleConfig( flowSettings = getFlowSettings(config, flowName); } + // Auto-inject validator transformers for any step-level `validate?:` // Get static build defaults based on platform const buildDefaults = getBuildDefaults(platform); diff --git a/packages/collector/src/__tests__/cache-store-defaults.test.ts b/packages/collector/src/__tests__/cache-store-defaults.test.ts new file mode 100644 index 000000000..bde3554fe --- /dev/null +++ b/packages/collector/src/__tests__/cache-store-defaults.test.ts @@ -0,0 +1,191 @@ +import { createCacheStore } from '../cache-store'; + +describe('__cache defaults (upgraded cache store)', () => { + afterEach(() => { + jest.useRealTimers(); + }); + + it('default maxEntries is 10000', () => { + const store = createCacheStore(); + try { + // Fill to maxEntries — none should be evicted yet. + for (let i = 0; i < 10000; i++) { + store.set(`k${i}`, i); + } + expect(store.counters.evictions_entries).toBe(0); + // First key still present. + expect(store.get('k0')).toBe(0); + + // Insert one more — triggers batched eviction. + store.set('k10000', 10000); + // After eviction, map should be at 0.8 * 10000 = 8000. + // The freshly-inserted key plus any survivors stays. + expect(store.counters.evictions_entries).toBeGreaterThan(0); + } finally { + store.destroy(); + } + }); + + it('FIFO when no LRU access: oldest-inserted evicts first', () => { + const store = createCacheStore({ maxEntries: 10 }); + try { + for (let i = 0; i < 10; i++) { + store.set(`k${i}`, i); + } + // Trigger overflow by inserting one more. + store.set('k10', 10); + // Batched eviction trims to 80% (8 entries). The four oldest (k0..k3) + // should be evicted plus we have one survivor space. + // Actually: size hit 11, evict down to 8, so 3 oldest go (k0, k1, k2). + expect(store.get('k0')).toBeUndefined(); + expect(store.get('k1')).toBeUndefined(); + expect(store.get('k2')).toBeUndefined(); + // k3 should survive. + expect(store.get('k3')).toBe(3); + // Latest inserted survives. + expect(store.get('k10')).toBe(10); + } finally { + store.destroy(); + } + }); + + it('LRU: get moves entry to most-recent (older entry evicts first under pressure)', () => { + const store = createCacheStore({ maxEntries: 10 }); + try { + for (let i = 0; i < 10; i++) { + store.set(`k${i}`, i); + } + // Touch k0 — it becomes most-recently-used. + expect(store.get('k0')).toBe(0); + // Trigger overflow. + store.set('k10', 10); + // After eviction to 80%, k0 should survive (was just accessed), + // k1, k2, k3 should be the oldest insertion-order candidates. + expect(store.get('k0')).toBe(0); + expect(store.get('k1')).toBeUndefined(); + expect(store.get('k2')).toBeUndefined(); + expect(store.get('k3')).toBeUndefined(); + // k4 should survive (less old than k1-k3 after k0 moved). + expect(store.get('k4')).toBe(4); + } finally { + store.destroy(); + } + }); + + it('batched eviction drops to 80% on overflow (not 1-by-1)', () => { + const store = createCacheStore({ maxEntries: 100 }); + try { + for (let i = 0; i < 100; i++) { + store.set(`k${i}`, i); + } + // No eviction yet — size at cap. + expect(store.counters.evictions_entries).toBe(0); + // Trigger overflow. + store.set('k100', 100); + // Expect ~20% evicted in one batch (size hits 101, evict to 80). + // After the batch the new key is inserted, so resulting size = 80 + 1 + // OR the implementation may evict BEFORE the new insert; in that case + // size = 80 then +1 = 81. Both are acceptable: assert at most 81. + expect(store.counters.evictions_entries).toBeGreaterThanOrEqual(20); + expect(store.counters.evictions_entries).toBeLessThanOrEqual(21); + } finally { + store.destroy(); + } + }); + + it('active TTL sweep removes expired unread entries', () => { + jest.useFakeTimers(); + const store = createCacheStore(); + try { + store.set('a', 1, 1000); // expires in 1 second + store.set('b', 2, 1000); + store.set('c', 3, 120000); // expires in 2 minutes — outlives the sweep + + // Advance past TTL but before the first sweep interval. + jest.advanceTimersByTime(2000); + // No sweep yet — entries still present in raw map (not accessed via get). + expect(store.counters.evictions_ttl).toBe(0); + + // Advance past the sweep interval (60s default). + jest.advanceTimersByTime(60000); + // The sweep should have run and removed a and b. + expect(store.counters.evictions_ttl).toBeGreaterThanOrEqual(2); + // Accessing a/b should now miss (sweep removed them). + expect(store.get('a')).toBeUndefined(); + expect(store.get('b')).toBeUndefined(); + // c should survive. + expect(store.get('c')).toBe(3); + } finally { + store.destroy(); + } + }); + + it('counters: hits, misses, populates, writes, deletes, evictions_entries, evictions_ttl increment correctly', () => { + const store = createCacheStore({ maxEntries: 5 }); + try { + // Initial counters all zero. + expect(store.counters).toEqual({ + hits: 0, + misses: 0, + populates: 0, + writes: 0, + deletes: 0, + evictions_entries: 0, + evictions_ttl: 0, + }); + + // Miss. + expect(store.get('absent')).toBeUndefined(); + expect(store.counters.misses).toBe(1); + + // Write (populate, since key didn't exist before). + store.set('k1', 'v1'); + expect(store.counters.populates).toBe(1); + expect(store.counters.writes).toBe(1); + + // Hit. + expect(store.get('k1')).toBe('v1'); + expect(store.counters.hits).toBe(1); + + // Overwrite (write but not populate, since key existed). + store.set('k1', 'v1b'); + expect(store.counters.writes).toBe(2); + expect(store.counters.populates).toBe(1); + + // Delete. + store.delete('k1'); + expect(store.counters.deletes).toBe(1); + + // Fill + overflow to trigger evictions_entries. + for (let i = 0; i < 6; i++) { + store.set(`f${i}`, i); + } + expect(store.counters.evictions_entries).toBeGreaterThan(0); + } finally { + store.destroy(); + } + }); + + it('destroy() clears the sweep interval', () => { + jest.useFakeTimers(); + const store = createCacheStore(); + const clearSpy = jest.spyOn(global, 'clearInterval'); + store.destroy(); + expect(clearSpy).toHaveBeenCalled(); + clearSpy.mockRestore(); + }); + + it('get on expired entry deletes lazily and counts evictions_ttl', () => { + jest.useFakeTimers(); + const store = createCacheStore(); + try { + store.set('a', 1, 100); + jest.advanceTimersByTime(200); + expect(store.get('a')).toBeUndefined(); + // Lazy TTL eviction counted. + expect(store.counters.evictions_ttl).toBeGreaterThanOrEqual(1); + } finally { + store.destroy(); + } + }); +}); diff --git a/packages/collector/src/__tests__/destination-before-passthrough.test.ts b/packages/collector/src/__tests__/destination-before-passthrough.test.ts new file mode 100644 index 000000000..fa1376f59 --- /dev/null +++ b/packages/collector/src/__tests__/destination-before-passthrough.test.ts @@ -0,0 +1,125 @@ +// Destination's `before` chain references a pass-through transformer that +// has its own `before` chain. Confirms the inner chain runs. +// +// Bug 2: a pass-through transformer like +// `enrichServer: { before: ["filterBots", "sessionLookup", "productEnrich"] }` +// is referenced as `destination.before: "enrichServer"`. The destination's +// chain walker runs `enrichServer`'s push (synthesized passthrough), but the +// inner `before` chain never invokes unless `initTransformers` propagates the +// def-level `before` to the synthesized instance's `config.before`. + +import { startFlow } from '..'; +import type { Transformer } from '@walkeros/core'; + +describe('destination.before references pass-through with own before chain', () => { + it("runs the pass-through's before chain before reaching the destination", async () => { + const order: string[] = []; + const { collector, elb } = await startFlow({ + transformers: { + spyA: { + code: async (context): Promise => ({ + type: 'spy', + config: context.config, + push: async (event) => { + order.push('a'); + return { event }; + }, + }), + }, + spyB: { + code: async (context): Promise => ({ + type: 'spy', + config: context.config, + push: async (event) => { + order.push('b'); + return { event }; + }, + }), + }, + spyC: { + code: async (context): Promise => ({ + type: 'spy', + config: context.config, + push: async (event) => { + order.push('c'); + return { event }; + }, + }), + }, + enrichChain: { before: ['spyA', 'spyB', 'spyC'] }, + }, + destinations: { + capture: { + code: { + type: 'test', + config: {}, + push: async () => { + order.push('dest'); + }, + }, + before: ['enrichChain'], + }, + }, + }); + + await elb('page view', {}); + + expect(order).toEqual(['a', 'b', 'c', 'dest']); + }); + + it("preserves a user-supplied code's own config.before over the def-level before", async () => { + const order: string[] = []; + const { collector, elb } = await startFlow({ + transformers: { + spyA: { + code: async (context): Promise => ({ + type: 'spy', + config: context.config, + push: async (event) => { + order.push('a'); + return { event }; + }, + }), + }, + spyB: { + code: async (context): Promise => ({ + type: 'spy', + config: context.config, + push: async (event) => { + order.push('b'); + return { event }; + }, + }), + }, + // user-supplied code returns its own config including before + custom: { + code: async (context): Promise => ({ + type: 'custom', + config: { ...context.config, before: ['spyB'] }, // user-set before should win + push: async (event) => { + order.push('custom'); + return { event }; + }, + }), + before: ['spyA'], // def-level before — should be overridden by user's config.before + }, + }, + destinations: { + capture: { + code: { + type: 'test', + config: {}, + push: async () => { + order.push('dest'); + }, + }, + before: ['custom'], + }, + }, + }); + + await elb('page view', {}); + + expect(order).toEqual(['b', 'custom', 'dest']); + }); +}); diff --git a/packages/collector/src/__tests__/destination-cache-integration.test.ts b/packages/collector/src/__tests__/destination-cache-integration.test.ts index fb721ad85..e2a130229 100644 --- a/packages/collector/src/__tests__/destination-cache-integration.test.ts +++ b/packages/collector/src/__tests__/destination-cache-integration.test.ts @@ -16,7 +16,7 @@ describe('destination cache integration', () => { }, }, cache: { - rules: [{ match: '*', key: ['event.name'], ttl: 60 }], + rules: [{ key: ['event.name'], ttl: 60 }], }, }, }, @@ -88,7 +88,7 @@ describe('destination cache integration', () => { }, }, cache: { - rules: [{ match: '*', key: ['event.name'], ttl: 60 }], + rules: [{ key: ['event.name'], ttl: 60 }], }, }, spy2: { @@ -125,9 +125,7 @@ describe('destination cache integration', () => { }, }, cache: { - rules: [ - { match: '*', key: ['event.name', 'event.data.id'], ttl: 60 }, - ], + rules: [{ key: ['event.name', 'event.data.id'], ttl: 60 }], }, }, }, @@ -144,7 +142,7 @@ describe('destination cache integration', () => { ]); }); - it('should skip before chain on HIT when full=true', async () => { + it('should skip before chain on HIT when stop=true', async () => { let transformerCalls = 0; let pushCount = 0; @@ -176,8 +174,8 @@ describe('destination cache integration', () => { }, }, cache: { - full: true, - rules: [{ match: '*', key: ['event.name'], ttl: 60 }], + stop: true, + rules: [{ key: ['event.name'], ttl: 60 }], }, }, }, @@ -188,13 +186,13 @@ describe('destination cache integration', () => { expect(transformerCalls).toBe(1); expect(pushCount).toBe(1); - // Second push: HIT with full=true — transformer skipped, push skipped + // Second push: HIT with stop=true — transformer skipped, push skipped await elb({ name: 'page view', data: {} }); expect(transformerCalls).toBe(1); // NOT called again expect(pushCount).toBe(1); // NOT called again }); - it('should still run before chain on HIT when full=false (default)', async () => { + it('should still run before chain on HIT when stop=false (default)', async () => { let transformerCalls = 0; let pushCount = 0; @@ -224,7 +222,7 @@ describe('destination cache integration', () => { }, }, cache: { - rules: [{ match: '*', key: ['event.name'], ttl: 60 }], + rules: [{ key: ['event.name'], ttl: 60 }], }, }, }, @@ -235,7 +233,7 @@ describe('destination cache integration', () => { expect(transformerCalls).toBe(1); expect(pushCount).toBe(1); - // Second push: HIT with full=false — push skipped but transformer still runs + // Second push: HIT with stop=false — push skipped but transformer still runs await elb({ name: 'page view', data: {} }); expect(transformerCalls).toBe(2); // Still runs expect(pushCount).toBe(1); // Skipped — cached diff --git a/packages/collector/src/__tests__/destination-modes.test.ts b/packages/collector/src/__tests__/destination-modes.test.ts index 8015b6611..f2bb747cb 100644 --- a/packages/collector/src/__tests__/destination-modes.test.ts +++ b/packages/collector/src/__tests__/destination-modes.test.ts @@ -283,7 +283,7 @@ describe('destination modes (disabled/mock)', () => { }, }, cache: { - rules: [{ match: '*', key: ['event.name'], ttl: 60 }], + rules: [{ key: ['event.name'], ttl: 60 }], }, }, }, @@ -317,7 +317,7 @@ describe('destination modes (disabled/mock)', () => { }, }, cache: { - rules: [{ match: '*', key: ['event.name'], ttl: 60 }], + rules: [{ key: ['event.name'], ttl: 60 }], }, }, }, diff --git a/packages/collector/src/__tests__/router-integration.test.ts b/packages/collector/src/__tests__/router-integration.test.ts index 2c7c1efa5..7167f3912 100644 --- a/packages/collector/src/__tests__/router-integration.test.ts +++ b/packages/collector/src/__tests__/router-integration.test.ts @@ -40,7 +40,7 @@ describe('native next routing', () => { match: { key: 'ingest.path', operator: 'prefix', value: '/gtag' }, next: 'gtag-parser', }, - { match: '*', next: [] }, + { next: [] }, ], config: { ingest: { @@ -153,7 +153,7 @@ describe('native next routing', () => { push: env.push as Elb.Fn, }; }, - next: [{ match: '*', next: 'a' }], + next: [{ next: 'a' }], }, }, transformers: { diff --git a/packages/collector/src/__tests__/source-before-fanout.test.ts b/packages/collector/src/__tests__/source-before-fanout.test.ts new file mode 100644 index 000000000..e8ba45c11 --- /dev/null +++ b/packages/collector/src/__tests__/source-before-fanout.test.ts @@ -0,0 +1,53 @@ +import { startFlow } from '..'; +import type { Source, Transformer, WalkerOS, Elb } from '@walkeros/core'; + +describe('source.before fan-out', () => { + it('emits N events when a before-transformer returns an array of N events', async () => { + const captured: WalkerOS.Event[] = []; + + const { collector } = await startFlow({ + sources: { + testSource: { + code: async (context): Promise => ({ + type: 'test', + config: context.config as Source.Config, + push: context.env.push as Elb.Fn, + }), + before: 'fanout', + }, + }, + transformers: { + fanout: { + code: async (context): Promise => ({ + type: 'fanout', + config: context.config, + push: async () => [ + { event: { name: 'a 1', entity: 'a', action: '1' } }, + { event: { name: 'a 2', entity: 'a', action: '2' } }, + { event: { name: 'a 3', entity: 'a', action: '3' } }, + ], + }), + }, + }, + destinations: { + d: { + code: { + type: 'test', + config: {}, + push: async (event) => { + captured.push(event); + }, + }, + }, + }, + }); + + await collector.sources.testSource.push({ + name: 'wire payload', + data: {}, + }); + + expect(captured).toHaveLength(3); + expect(captured.map((e) => e.name)).toEqual(['a 1', 'a 2', 'a 3']); + }); +}); diff --git a/packages/collector/src/__tests__/source-cache-integration.test.ts b/packages/collector/src/__tests__/source-cache-integration.test.ts index a911dd31d..32f22a472 100644 --- a/packages/collector/src/__tests__/source-cache-integration.test.ts +++ b/packages/collector/src/__tests__/source-cache-integration.test.ts @@ -296,7 +296,7 @@ describe('Source cache integration', () => { expect(transformerCalls).toEqual(['enrich']); // No new transformer call }); - it('should continue pipeline on HIT when full=false', async () => { + it('should continue pipeline on HIT when stop=false', async () => { const destinationCalls: string[] = []; const { collector } = await startFlow({ @@ -315,7 +315,7 @@ describe('Source cache integration', () => { }; }, cache: { - full: false, + stop: false, rules: [ { match: { @@ -349,7 +349,7 @@ describe('Source cache integration', () => { }); expect(destinationCalls).toHaveLength(1); - // Second request: HIT with full=false — pipeline still runs (source step skipped) + // Second request: HIT with stop=false — pipeline still runs (source step skipped) await (collector.sources.testSource.push as any)({ method: 'GET', path: '/api/data', diff --git a/packages/collector/src/__tests__/source-cache-miss-race.test.ts b/packages/collector/src/__tests__/source-cache-miss-race.test.ts index 14fa511a5..5e9683e99 100644 --- a/packages/collector/src/__tests__/source-cache-miss-race.test.ts +++ b/packages/collector/src/__tests__/source-cache-miss-race.test.ts @@ -95,7 +95,7 @@ describe('Source cache MISS race (collector)', () => { }; }, cache: { - // full: true is the default for sources. MISS with update rule + // stop: true is the default for sources. MISS with update rule // forces the async applyUpdate path inside the MISS wrapper. rules: [ { diff --git a/packages/collector/src/__tests__/source-chain-integration.test.ts b/packages/collector/src/__tests__/source-chain-integration.test.ts index c0498926e..1b2785874 100644 --- a/packages/collector/src/__tests__/source-chain-integration.test.ts +++ b/packages/collector/src/__tests__/source-chain-integration.test.ts @@ -270,7 +270,7 @@ describe('Source Transformer Chains (source.next)', () => { }, next: 'gtag-parser', }, - { match: '*', next: 'default-parser' }, + { next: 'default-parser' }, ], config: { ingest: { diff --git a/packages/collector/src/__tests__/store-cache-hooks.test.ts b/packages/collector/src/__tests__/store-cache-hooks.test.ts new file mode 100644 index 000000000..c66a5275b --- /dev/null +++ b/packages/collector/src/__tests__/store-cache-hooks.test.ts @@ -0,0 +1,220 @@ +import type { Cache, Collector, Store } from '@walkeros/core'; +import { createMockLogger } from '@walkeros/core'; +import { initStores } from '../store'; + +/** + * Minimal collector instance for store init. Tests assign `hooks` after + * construction (or replace with a fresh object) so each case is independent. + */ +function createMockCollector(): Collector.Instance { + return { + logger: createMockLogger(), + stores: {}, + hooks: {}, + } as unknown as Collector.Instance; +} + +/** + * Build a backing `Store.Init` whose returned instance is Map-backed and + * exposes call counters so tests can verify whether the hook fired before or + * after the cache wrapper resolved a HIT. + */ +function createBackingInit(): { + init: Store.Init; + data: Map; + calls: { get: number; set: number; delete: number }; +} { + const data = new Map(); + const calls = { get: 0, set: 0, delete: 0 }; + const init: Store.Init = (context) => ({ + type: 'backing', + config: context.config as Store.Config, + get(key: string) { + calls.get++; + return data.get(key); + }, + set(key: string, value: unknown) { + calls.set++; + data.set(key, value); + }, + delete(key: string) { + calls.delete++; + data.delete(key); + }, + }); + return { init, data, calls }; +} + +describe('store-cache: hooks compose with wrapper', () => { + it('hook intercepts wrapped.get on HIT and MISS at the boundary', async () => { + const collector = createMockCollector(); + const preStoreGet = jest.fn(({ fn }, key) => fn(key)); + collector.hooks = { preStoreGet } as Collector.Instance['hooks']; + + const { init, data, calls } = createBackingInit(); + + const cacheConfig: Cache.Cache = { + rules: [{ ttl: 60 }], + }; + + const stores = await initStores(collector, { + api: { + code: init, + cache: cacheConfig, + } as Store.InitStore, + }); + + // First read: cache MISS — backing.get fires. + data.set('user', 'alice'); + const first = await stores.api.get('user'); + expect(first).toBe('alice'); + expect(calls.get).toBe(1); + // Hook must have fired once at the consumer boundary. + expect(preStoreGet).toHaveBeenCalledTimes(1); + + // Second read: cache HIT — backing.get must NOT fire, but the hook MUST + // fire because the consumer-facing boundary still ran. + const second = await stores.api.get('user'); + expect(second).toBe('alice'); + expect(calls.get).toBe(1); + expect(preStoreGet).toHaveBeenCalledTimes(2); + }); + + it('hook fires once per consumer get (not twice from wrapper + backing)', async () => { + const collector = createMockCollector(); + const preStoreGet = jest.fn(({ fn }, key) => fn(key)); + collector.hooks = { preStoreGet } as Collector.Instance['hooks']; + + const { init, data } = createBackingInit(); + + const cacheConfig: Cache.Cache = { + rules: [{ ttl: 60 }], + }; + + const stores = await initStores(collector, { + api: { + code: init, + cache: cacheConfig, + } as Store.InitStore, + }); + + data.set('user', 'alice'); + await stores.api.get('user'); + // Exactly one hook call per consumer get: hook wraps the wrapper, not the + // bare backing. Double-firing here would indicate hooks were installed on + // both layers. + expect(preStoreGet).toHaveBeenCalledTimes(1); + }); + + it('postStoreGet sees the cached value on HIT', async () => { + const collector = createMockCollector(); + const postStoreGet = jest.fn(({ result }) => result); + collector.hooks = { postStoreGet } as Collector.Instance['hooks']; + + const { init, data } = createBackingInit(); + + const cacheConfig: Cache.Cache = { + rules: [{ ttl: 60 }], + }; + + const stores = await initStores(collector, { + api: { + code: init, + cache: cacheConfig, + } as Store.InitStore, + }); + + data.set('user', 'alice'); + await stores.api.get('user'); + // HIT path — postStoreGet must fire even when the backing was not + // called. `useHooks` is synchronous: it observes whatever the wrapped + // function returned (a Promise here), so callers must `await` the + // recorded `result` to inspect the resolved value. + const hit = await stores.api.get('user'); + expect(hit).toBe('alice'); + expect(postStoreGet).toHaveBeenCalledTimes(2); + const lastResult = await postStoreGet.mock.calls[1][0].result; + expect(lastResult).toBe('alice'); + }); + + it('hook on storeSet fires once per wrapped.set at the boundary', async () => { + const collector = createMockCollector(); + const preStoreSet = jest.fn(({ fn }, key, value, ttl) => + fn(key, value, ttl), + ); + collector.hooks = { preStoreSet } as Collector.Instance['hooks']; + + const { init, data, calls } = createBackingInit(); + + const cacheConfig: Cache.Cache = { + rules: [{ ttl: 60 }], + }; + + const stores = await initStores(collector, { + api: { + code: init, + cache: cacheConfig, + } as Store.InitStore, + }); + + await stores.api.set('user', 'alice'); + + // Backing recorded the write. + expect(calls.set).toBe(1); + expect(data.get('user')).toBe('alice'); + // Hook fired exactly once at the consumer-facing wrapper boundary — + // not also when the wrapper internally writes into cacheStore. + expect(preStoreSet).toHaveBeenCalledTimes(1); + }); + + it('hook is NOT called on internal cache-side writes', async () => { + // When the wrapper populates the internal cacheStore (memory) after a + // backing MISS, the hook must NOT fire for that internal cacheStore.set — + // only the consumer-facing wrapped.set should be intercepted. + const collector = createMockCollector(); + const preStoreSet = jest.fn(({ fn }, key, value, ttl) => + fn(key, value, ttl), + ); + collector.hooks = { preStoreSet } as Collector.Instance['hooks']; + + const { init, data } = createBackingInit(); + + const cacheConfig: Cache.Cache = { + rules: [{ ttl: 60 }], + }; + + const stores = await initStores(collector, { + api: { + code: init, + cache: cacheConfig, + } as Store.InitStore, + }); + + // Trigger a backing MISS; the wrapper will write into the internal + // __cache store as a side effect. The hook must NOT fire for that + // internal write. + data.set('user', 'alice'); + await stores.api.get('user'); + + expect(preStoreSet).not.toHaveBeenCalled(); + }); + + it('stores without a cache wrapper still have hooks installed (bare backing observable)', async () => { + // Stores that opt out of cache wrapping must still be hook-wrapped so + // the collector retains the legacy observability contract. + const collector = createMockCollector(); + const preStoreGet = jest.fn(({ fn }, key) => fn(key)); + collector.hooks = { preStoreGet } as Collector.Instance['hooks']; + + const { init, data } = createBackingInit(); + + const stores = await initStores(collector, { + bare: { code: init }, + }); + + data.set('key', 'v'); + const value = await stores.bare.get('key'); + expect(value).toBe('v'); + expect(preStoreGet).toHaveBeenCalledTimes(1); + }); +}); diff --git a/packages/collector/src/__tests__/store-cache-namespace.test.ts b/packages/collector/src/__tests__/store-cache-namespace.test.ts new file mode 100644 index 000000000..d547b20c7 --- /dev/null +++ b/packages/collector/src/__tests__/store-cache-namespace.test.ts @@ -0,0 +1,203 @@ +import type { Collector, Store } from '@walkeros/core'; +import { createMockLogger } from '@walkeros/core'; +import type { MockLogger } from '@walkeros/core'; +import { initStores } from '../store'; + +/** + * Tests for Task 11 of the store-cache plan: namespace defaulting and the + * single startup log line emitted per wrapped store. The wrapper itself is + * exercised through `initStores` so we get the full phase 2 wiring — that is + * the only path that resolves `cacheConfig.namespace ?? storeId` and emits the + * startup log. + */ + +interface MockCollectorWithLogger extends Collector.Instance { + logger: MockLogger; + stores: Store.Stores; +} + +function createMockCollector(): MockCollectorWithLogger { + return { + logger: createMockLogger(), + stores: {}, + hooks: {}, + } as unknown as MockCollectorWithLogger; +} + +interface TrackedBacking { + data: Map; + get: jest.Mock; + set: jest.Mock; + delete: jest.Mock; +} + +/** + * Minimal in-memory `Store.Init` paired with the raw data map and mocks the + * test body asserts against. Mirrors the helper in + * `store-cache-tier-skipping.test.ts` — duplicated rather than shared to keep + * each test file self-contained (per repo policy in AGENT.md, strict modularity + * over cross-test coupling). + */ +function createTrackedStoreLayer(typeName: string): { + backing: TrackedBacking; + init: Store.Init; +} { + const data = new Map(); + const get = jest.fn((key: string) => data.get(key)); + const set = jest.fn( + (key: string, value: unknown) => { + data.set(key, value); + }, + ); + const del = jest.fn((key: string) => { + data.delete(key); + }); + const backing: TrackedBacking = { data, get, set, delete: del }; + const init: Store.Init = () => ({ + type: typeName, + config: {}, + get, + set, + delete: del, + }); + return { backing, init }; +} + +/** + * Walk `MockLogger.scopedLoggers` recursively and concatenate every `info` + * call's first argument. Phase 2 reaches the leaf logger via + * `collector.logger.scope('store-cache').scope(storeId).info(...)`, so the + * messages live two levels deep. Flattening here keeps assertions simple. + */ +function collectInfoMessages(logger: MockLogger): string[] { + const messages: string[] = []; + const visit = (l: MockLogger): void => { + for (const call of l.info.mock.calls) { + if (typeof call[0] === 'string') messages.push(call[0]); + } + for (const child of l.scopedLoggers) visit(child); + }; + visit(logger); + return messages; +} + +describe('store-cache: namespace defaulting + startup log', () => { + it('omitted namespace defaults to host store id (keys stored under ":K")', async () => { + const collector = createMockCollector(); + const memory = createTrackedStoreLayer('memory-mock'); + const api = createTrackedStoreLayer('api-mock'); + + const stores = await initStores(collector, { + api: { + code: api.init, + cache: { store: 'memory', rules: [{ ttl: 60 }] }, + } as Store.InitStore, + memory: { code: memory.init } as Store.InitStore, + }); + + api.backing.data.set('K', 'V'); + await stores.api.get('K'); + + // The wrapped-api forwarded its set to wrapped-memory using `api:K` as the + // key. Since memory has no cache wrapper of its own, the raw backing map + // records the same key directly. This proves the namespace defaulted to + // the host store id. + expect(memory.backing.data.get('api:K')).toBe('V'); + expect(memory.backing.data.get('K')).toBeUndefined(); + }); + + it('explicit namespace overrides default', async () => { + const collector = createMockCollector(); + const memory = createTrackedStoreLayer('memory-mock'); + const api = createTrackedStoreLayer('api-mock'); + + const stores = await initStores(collector, { + api: { + code: api.init, + cache: { + store: 'memory', + namespace: 'custom', + rules: [{ ttl: 60 }], + }, + } as Store.InitStore, + memory: { code: memory.init } as Store.InitStore, + }); + + api.backing.data.set('K', 'V'); + await stores.api.get('K'); + + expect(memory.backing.data.get('custom:K')).toBe('V'); + // Neither the default (storeId) nor the bare key should be set. + expect(memory.backing.data.get('api:K')).toBeUndefined(); + expect(memory.backing.data.get('K')).toBeUndefined(); + }); + + it('emits one startup log line per wrapped store', async () => { + const collector = createMockCollector(); + const memory = createTrackedStoreLayer('memory-mock'); + const redis = createTrackedStoreLayer('redis-mock'); + const api = createTrackedStoreLayer('api-mock'); + + await initStores(collector, { + api: { + code: api.init, + cache: { store: 'redis', rules: [{ ttl: 86400 }] }, + } as Store.InitStore, + redis: { + code: redis.init, + cache: { store: 'memory', rules: [{ ttl: 300 }] }, + } as Store.InitStore, + memory: { code: memory.init } as Store.InitStore, + }); + + const messages = collectInfoMessages(collector.logger); + expect(messages).toEqual( + expect.arrayContaining([ + 'store "api" caches with namespace "api:" via redis', + 'store "redis" caches with namespace "redis:" via memory', + ]), + ); + // Memory is the terminal — no cache config, no startup line. + expect(messages.some((m) => m.includes('store "memory" caches'))).toBe( + false, + ); + }); + + it('emits startup log naming __cache when cache.store is omitted', async () => { + const collector = createMockCollector(); + const api = createTrackedStoreLayer('api-mock'); + + await initStores(collector, { + api: { + code: api.init, + cache: { rules: [{ ttl: 60 }] }, + } as Store.InitStore, + }); + + const messages = collectInfoMessages(collector.logger); + expect(messages).toEqual( + expect.arrayContaining([ + 'store "api" caches with namespace "api:" via __cache', + ]), + ); + }); + + it('emits startup log reflecting an explicit namespace override', async () => { + const collector = createMockCollector(); + const api = createTrackedStoreLayer('api-mock'); + + await initStores(collector, { + api: { + code: api.init, + cache: { namespace: 'custom', rules: [{ ttl: 60 }] }, + } as Store.InitStore, + }); + + const messages = collectInfoMessages(collector.logger); + expect(messages).toEqual( + expect.arrayContaining([ + 'store "api" caches with namespace "custom:" via __cache', + ]), + ); + }); +}); diff --git a/packages/collector/src/__tests__/store-cache-tier-skipping.test.ts b/packages/collector/src/__tests__/store-cache-tier-skipping.test.ts new file mode 100644 index 000000000..02812a2ab --- /dev/null +++ b/packages/collector/src/__tests__/store-cache-tier-skipping.test.ts @@ -0,0 +1,223 @@ +import type { Collector, Store } from '@walkeros/core'; +import { createMockLogger } from '@walkeros/core'; +import { initStores } from '../store'; + +/** + * Integration test for 3-tier recursive store-cache composition. + * + * Layout under test (caller wires `$store.api`): + * + * wrapped-api ← cache.store = redis + * wrapped-redis ← cache.store = memory + * memory ← no cache (terminal / bare in-memory layer) + * + * The phase 2 init in `store.ts` walks the `cache.store` graph in topological + * order (terminals first) and replaces `result[storeId]` with a wrapped + * instance. The wrapper's `cacheStore` resolves against the in-progress + * `result` map, which means: when `api` is wrapped, the `redis` entry has + * already been replaced with the wrapped redis instance. That referential + * identity is what makes tier-skipping repopulation automatic — a get on the + * outer api delegates to the wrapped redis (which itself probes memory before + * its own backing), and a get on the wrapped redis populates the memory layer + * via the same code path that any other wrapped store would use. + */ + +interface MockCollectorWithStores extends Collector.Instance { + stores: Store.Stores; +} + +function createMockCollector(): MockCollectorWithStores { + return { + logger: createMockLogger(), + stores: {}, + hooks: {}, + } as unknown as MockCollectorWithStores; +} + +interface TrackedBacking { + data: Map; + get: jest.Mock; + set: jest.Mock; + delete: jest.Mock; +} + +/** + * Create a deferred record of `{ backing, init }`. The backing's data map and + * jest mocks are captured at module scope so the test body can assert on call + * counts after `initStores` runs. Returning the backing alongside the init + * keeps the closure unambiguous — there is exactly one Map per layer, and the + * Init function returns a `Store.Instance` whose methods read/write that Map. + * + * Note: `applyStoreHooks` in `store.ts` reassigns `instance.get/set/delete` + * after phase 1. The wrappers it installs call the originals captured here, so + * the jest mocks still record every call — they sit at the bottom of the + * wrap stack (hook wrapper → cache wrapper → these jest mocks). + */ +function createTrackedStoreLayer(typeName: string): { + backing: TrackedBacking; + init: Store.Init; +} { + const data = new Map(); + const get = jest.fn((key: string) => data.get(key)); + const set = jest.fn( + (key: string, value: unknown) => { + data.set(key, value); + }, + ); + const del = jest.fn((key: string) => { + data.delete(key); + }); + const backing: TrackedBacking = { data, get, set, delete: del }; + const init: Store.Init = () => ({ + type: typeName, + config: {}, + get, + set, + delete: del, + }); + return { backing, init }; +} + +describe('store-cache: 3-tier recursive composition', () => { + it('memory MISS, redis HIT → memory repopulates, api never touched', async () => { + const collector = createMockCollector(); + const memory = createTrackedStoreLayer('memory-mock'); + const redis = createTrackedStoreLayer('redis-mock'); + const api = createTrackedStoreLayer('api-mock'); + + // Pre-populate redis-mock backing only. Note the key shape: the wrapper + // forwards `prefixed(key)` to its `cacheStore`, so when wrapped-api probes + // wrapped-redis with the user key `K`, wrapped-redis (and its backing) + // receives `api:K` — the api wrapper's namespace prefix. The bare backing + // therefore stores `api:K`, not `K`. (`namespace` defaults to `storeId`.) + redis.backing.data.set('api:K', 'V_from_redis'); + + const stores = await initStores(collector, { + api: { + code: api.init, + cache: { store: 'redis', rules: [{ ttl: 86400 }] }, + } as Store.InitStore, + redis: { + code: redis.init, + cache: { store: 'memory', rules: [{ ttl: 300 }] }, + } as Store.InitStore, + memory: { code: memory.init } as Store.InitStore, + }); + + // First call: cold cache. Expect memory MISS, redis HIT, api never called. + const first = await stores.api.get('K'); + expect(first).toBe('V_from_redis'); + expect(api.backing.get).toHaveBeenCalledTimes(0); + expect(redis.backing.get).toHaveBeenCalledTimes(1); + // wrapped-redis populates its own cache layer (memory) on a backing hit, + // using its `redis:` namespace prefix on top of the already-prefixed key + // it received from wrapped-api. So memory ends up with `redis:api:K`. + expect(memory.backing.data.get('redis:api:K')).toBe('V_from_redis'); + + // Second call: memory now has the value. Expect zero new backing calls. + api.backing.get.mockClear(); + redis.backing.get.mockClear(); + const memoryGetCallsBefore = memory.backing.get.mock.calls.length; + + const second = await stores.api.get('K'); + expect(second).toBe('V_from_redis'); + expect(api.backing.get).toHaveBeenCalledTimes(0); + expect(redis.backing.get).toHaveBeenCalledTimes(0); + // memory.get is called exactly once on the second pass — wrapped-redis's + // outer cache probe for `redis:api:K` hits and short-circuits before its + // own backing is consulted. (If memory.get were called more than once, + // tier-skipping is broken.) + expect(memory.backing.get.mock.calls.length).toBe(memoryGetCallsBefore + 1); + }); + + it('memory MISS, redis MISS, api HIT → both intermediate tiers populate', async () => { + const collector = createMockCollector(); + const memory = createTrackedStoreLayer('memory-mock'); + const redis = createTrackedStoreLayer('redis-mock'); + const api = createTrackedStoreLayer('api-mock'); + + // Pre-populate only the terminal source-of-truth. + api.backing.data.set('K', 'V_from_api'); + + const stores = await initStores(collector, { + api: { + code: api.init, + cache: { store: 'redis', rules: [{ ttl: 86400 }] }, + } as Store.InitStore, + redis: { + code: redis.init, + cache: { store: 'memory', rules: [{ ttl: 300 }] }, + } as Store.InitStore, + memory: { code: memory.init } as Store.InitStore, + }); + + // Cold pass: every layer's backing.get is called exactly once. + const first = await stores.api.get('K'); + expect(first).toBe('V_from_api'); + expect(api.backing.get).toHaveBeenCalledTimes(1); + expect(redis.backing.get).toHaveBeenCalledTimes(1); + + // Both intermediate tiers now hold the value. wrapped-api's MISS-path + // populates its cacheStore (wrapped-redis) via `cacheStore.set(prefixed, + // ...)`, which lands as `redis.backing.set('api:K', V)`. wrapped-redis's + // write-through then forwards the value into memory as + // `redis:api:K`. (Naming intuition: each wrapper layer prepends its own + // `namespace` prefix on top of whatever key it received.) + expect(redis.backing.data.get('api:K')).toBe('V_from_api'); + expect(memory.backing.data.get('redis:api:K')).toBe('V_from_api'); + + // Warm pass: api and redis are untouched; memory serves directly. + api.backing.get.mockClear(); + redis.backing.get.mockClear(); + const second = await stores.api.get('K'); + expect(second).toBe('V_from_api'); + expect(api.backing.get).toHaveBeenCalledTimes(0); + expect(redis.backing.get).toHaveBeenCalledTimes(0); + }); + + it('write-through propagates through all tiers', async () => { + const collector = createMockCollector(); + const memory = createTrackedStoreLayer('memory-mock'); + const redis = createTrackedStoreLayer('redis-mock'); + const api = createTrackedStoreLayer('api-mock'); + + const stores = await initStores(collector, { + api: { + code: api.init, + cache: { store: 'redis', rules: [{ ttl: 86400 }] }, + } as Store.InitStore, + redis: { + code: redis.init, + cache: { store: 'memory', rules: [{ ttl: 300 }] }, + } as Store.InitStore, + memory: { code: memory.init } as Store.InitStore, + }); + + await stores.api.set('K', 'V_written'); + + // Write-through policy: backing first, then cacheStore (best-effort). Each + // wrapped layer follows the same pattern, so all three backings record the + // write. The key shape at each layer mirrors the read-path traversal: + // api-backing: 'K' (the original user key) + // redis-backing: 'api:K' (wrapped-api prefixed the cacheStore + // set with its namespace before + // delegating to wrapped-redis.set) + // memory: 'redis:api:K' (wrapped-redis prefixed its own + // cacheStore set with `redis:` on top) + expect(api.backing.set).toHaveBeenCalledTimes(1); + expect(redis.backing.set).toHaveBeenCalledTimes(1); + expect(api.backing.data.get('K')).toBe('V_written'); + expect(redis.backing.data.get('api:K')).toBe('V_written'); + expect(memory.backing.data.get('redis:api:K')).toBe('V_written'); + + // A subsequent get is fully served by the memory layer: wrapped-redis's + // cache probe for `redis:api:K` hits memory immediately, so neither + // wrapped-redis's backing nor wrapped-api's backing is consulted. + api.backing.get.mockClear(); + redis.backing.get.mockClear(); + const readBack = await stores.api.get('K'); + expect(readBack).toBe('V_written'); + expect(api.backing.get).toHaveBeenCalledTimes(0); + expect(redis.backing.get).toHaveBeenCalledTimes(0); + }); +}); diff --git a/packages/collector/src/__tests__/store-cache-wrapper.test.ts b/packages/collector/src/__tests__/store-cache-wrapper.test.ts new file mode 100644 index 000000000..7a30cc86d --- /dev/null +++ b/packages/collector/src/__tests__/store-cache-wrapper.test.ts @@ -0,0 +1,790 @@ +import type { Cache, Logger, Store } from '@walkeros/core'; +import { createCacheStore } from '../cache-store'; +import { wrapStoreWithCache } from '../store-cache-wrapper'; + +interface MockLogger extends Logger.Instance { + error: jest.Mock; + warn: jest.Mock; + info: jest.Mock; + debug: jest.Mock; + json: jest.Mock; + scope: jest.Mock; +} + +/** + * Build a stub `Logger.Instance` whose `warn` and other methods are jest mocks. + * `scope` returns the same instance so chained scoping does not change the spy + * surface — tests assert on `warn` directly. `throw` is typed via a function + * that always throws so the `never` return type is honored. + */ +function createMockLogger(): MockLogger { + const throwFn: Logger.Instance['throw'] = (message) => { + throw message instanceof Error ? message : new Error(String(message)); + }; + + const instance: MockLogger = { + error: jest.fn(), + warn: jest.fn(), + info: jest.fn(), + debug: jest.fn(), + throw: throwFn, + json: jest.fn(), + scope: jest.fn(), + }; + instance.scope.mockReturnValue(instance); + return instance; +} + +/** + * Build a minimal `Store.Instance` backed by a Map. Captures call counts so + * tests can assert pass-through versus cache-hit behavior. Synchronous get/set + * is fine — the `Store.Instance` interface allows both sync and async returns. + */ +function createBackingStore(): Store.Instance & { + calls: { get: number; set: number; delete: number }; + data: Map; +} { + const data = new Map(); + const calls = { get: 0, set: 0, delete: 0 }; + return { + type: 'test-backing', + config: {}, + data, + calls, + get(key: string) { + calls.get++; + return data.get(key); + }, + set(key: string, value: unknown) { + calls.set++; + data.set(key, value); + }, + delete(key: string) { + calls.delete++; + data.delete(key); + }, + }; +} + +describe('store-cache wrapper: read path', () => { + it('cache HIT: returns cached value without calling backing.get', async () => { + const backing = createBackingStore(); + const cacheStore = createCacheStore(); + try { + const cacheConfig: Cache.Cache = { + rules: [{ ttl: 60 }], + }; + const wrapped = wrapStoreWithCache(backing, { + storeId: 'foo', + cacheConfig, + cacheStore, + namespace: 'foo', + }); + + // Prime the cache via a first read (backing returns the seeded value). + backing.data.set('user', 'alice'); + const first = await wrapped.get('user'); + expect(first).toBe('alice'); + expect(backing.calls.get).toBe(1); + + // Second read should be a cache HIT — no additional backing.get call. + const second = await wrapped.get('user'); + expect(second).toBe('alice'); + expect(backing.calls.get).toBe(1); + } finally { + cacheStore.destroy(); + } + }); + + it('cache MISS: calls backing.get, returns its value, populates cache with rule TTL', async () => { + const backing = createBackingStore(); + const cacheStore = createCacheStore(); + try { + const cacheConfig: Cache.Cache = { + rules: [{ ttl: 60 }], + }; + const wrapped = wrapStoreWithCache(backing, { + storeId: 'foo', + cacheConfig, + cacheStore, + namespace: 'foo', + }); + + backing.data.set('user', 'alice'); + const value = await wrapped.get('user'); + expect(value).toBe('alice'); + expect(backing.calls.get).toBe(1); + + // The cache layer should now hold the value under the namespaced key. + // ttl=60s, cacheStore stores ms internally. + expect(cacheStore.get('foo:user')).toBe('alice'); + } finally { + cacheStore.destroy(); + } + }); + + it('cache MISS where backing returns undefined: returns undefined, does NOT populate cache (no negative caching)', async () => { + const backing = createBackingStore(); + const cacheStore = createCacheStore(); + try { + const cacheConfig: Cache.Cache = { + rules: [{ ttl: 60 }], + }; + const wrapped = wrapStoreWithCache(backing, { + storeId: 'foo', + cacheConfig, + cacheStore, + namespace: 'foo', + }); + + const value = await wrapped.get('missing'); + expect(value).toBeUndefined(); + // The cache must not have populated. + expect(cacheStore.get('foo:missing')).toBeUndefined(); + // A second read goes back to backing (still no negative cache). + const second = await wrapped.get('missing'); + expect(second).toBeUndefined(); + expect(backing.calls.get).toBe(2); + } finally { + cacheStore.destroy(); + } + }); + + it('cache MISS where no rule matches: returns from backing but does NOT populate', async () => { + const backing = createBackingStore(); + const cacheStore = createCacheStore(); + try { + const cacheConfig: Cache.Cache = { + rules: [ + { + match: { key: 'key', operator: 'prefix', value: 'user:' }, + ttl: 60, + }, + ], + }; + const wrapped = wrapStoreWithCache(backing, { + storeId: 'foo', + cacheConfig, + cacheStore, + namespace: 'foo', + }); + + backing.data.set('account:42', { id: 42 }); + const value = await wrapped.get('account:42'); + expect(value).toEqual({ id: 42 }); + // No rule matched — backing.get ran, but cache did not populate. + expect(cacheStore.get('foo:account:42')).toBeUndefined(); + + // Confirm second call still hits backing (no cache). + await wrapped.get('account:42'); + expect(backing.calls.get).toBe(2); + } finally { + cacheStore.destroy(); + } + }); + + it('cache MISS where rule.match filters by key prefix: only matching keys populate', async () => { + const backing = createBackingStore(); + const cacheStore = createCacheStore(); + try { + const cacheConfig: Cache.Cache = { + rules: [ + { + match: { key: 'key', operator: 'prefix', value: 'user:' }, + ttl: 60, + }, + ], + }; + const wrapped = wrapStoreWithCache(backing, { + storeId: 'foo', + cacheConfig, + cacheStore, + namespace: 'foo', + }); + + backing.data.set('user:alice', { id: 'alice' }); + backing.data.set('account:42', { id: 42 }); + + const userVal = await wrapped.get('user:alice'); + expect(userVal).toEqual({ id: 'alice' }); + expect(cacheStore.get('foo:user:alice')).toEqual({ id: 'alice' }); + + const accountVal = await wrapped.get('account:42'); + expect(accountVal).toEqual({ id: 42 }); + // Non-matching key did not populate the cache. + expect(cacheStore.get('foo:account:42')).toBeUndefined(); + } finally { + cacheStore.destroy(); + } + }); +}); + +/** + * Build a `Store.Instance`-shaped cache layer whose `set` and `delete` + * implementations are jest mocks so tests can simulate cache-layer failures + * (backing succeeded, cache rejected) and assert that wrapper behavior matches + * the "cache is advisory" policy from the design doc. + */ +function createMockCacheStore(): Store.Instance & { + store: Map; + get: jest.Mock; + set: jest.Mock; + delete: jest.Mock; +} { + const store = new Map(); + const get = jest.fn((key: string) => store.get(key)); + const set = jest.fn((key: string, value: unknown) => { + store.set(key, value); + }); + const del = jest.fn((key: string) => { + store.delete(key); + }); + return { + type: 'mock-cache', + config: {}, + store, + get, + set, + delete: del, + }; +} + +describe('store-cache wrapper: write path', () => { + it('set: writes to backing then to cache', async () => { + const backing = createBackingStore(); + const cacheStore = createMockCacheStore(); + const logger = createMockLogger(); + const cacheConfig: Cache.Cache = { + rules: [{ ttl: 60 }], + }; + const wrapped = wrapStoreWithCache(backing, { + storeId: 'foo', + cacheConfig, + cacheStore, + namespace: 'foo', + logger, + }); + + await wrapped.set('user', 'alice'); + + expect(backing.calls.set).toBe(1); + expect(backing.data.get('user')).toBe('alice'); + expect(cacheStore.set).toHaveBeenCalledTimes(1); + expect(cacheStore.set).toHaveBeenCalledWith('foo:user', 'alice', 60 * 1000); + expect(logger.warn).not.toHaveBeenCalled(); + }); + + it('set: backing throws -> wrapper throws, cache NOT called', async () => { + const backing = createBackingStore(); + const cacheStore = createMockCacheStore(); + const logger = createMockLogger(); + const failure = new Error('backing offline'); + backing.set = jest.fn(() => { + throw failure; + }); + + const cacheConfig: Cache.Cache = { + rules: [{ ttl: 60 }], + }; + const wrapped = wrapStoreWithCache(backing, { + storeId: 'foo', + cacheConfig, + cacheStore, + namespace: 'foo', + logger, + }); + + await expect(wrapped.set('user', 'alice')).rejects.toBe(failure); + expect(cacheStore.set).not.toHaveBeenCalled(); + expect(logger.warn).not.toHaveBeenCalled(); + }); + + it('set: cache throws -> wrapper returns success, warning logged', async () => { + const backing = createBackingStore(); + const cacheStore = createMockCacheStore(); + const logger = createMockLogger(); + cacheStore.set.mockImplementationOnce(() => { + throw new Error('cache offline'); + }); + + const cacheConfig: Cache.Cache = { + rules: [{ ttl: 60 }], + }; + const wrapped = wrapStoreWithCache(backing, { + storeId: 'foo', + cacheConfig, + cacheStore, + namespace: 'foo', + logger, + }); + + // Wrapper must not throw — cache failure degrades performance, not + // correctness. Backing still recorded the write. + await expect(wrapped.set('user', 'alice')).resolves.toBeUndefined(); + expect(backing.calls.set).toBe(1); + expect(backing.data.get('user')).toBe('alice'); + expect(logger.warn).toHaveBeenCalledTimes(1); + }); + + it('set: no matching rule -> backing called, cache NOT called', async () => { + const backing = createBackingStore(); + const cacheStore = createMockCacheStore(); + const logger = createMockLogger(); + const cacheConfig: Cache.Cache = { + rules: [ + { + match: { key: 'key', operator: 'prefix', value: 'user:' }, + ttl: 60, + }, + ], + }; + const wrapped = wrapStoreWithCache(backing, { + storeId: 'foo', + cacheConfig, + cacheStore, + namespace: 'foo', + logger, + }); + + await wrapped.set('account:42', { id: 42 }); + + expect(backing.calls.set).toBe(1); + expect(backing.data.get('account:42')).toEqual({ id: 42 }); + // No rule matched the key — cache must not have been populated. + expect(cacheStore.set).not.toHaveBeenCalled(); + expect(logger.warn).not.toHaveBeenCalled(); + }); + + it('delete: deletes from backing then cache', async () => { + const backing = createBackingStore(); + const cacheStore = createMockCacheStore(); + const logger = createMockLogger(); + backing.data.set('user', 'alice'); + cacheStore.store.set('foo:user', 'alice'); + + const cacheConfig: Cache.Cache = { + rules: [{ ttl: 60 }], + }; + const wrapped = wrapStoreWithCache(backing, { + storeId: 'foo', + cacheConfig, + cacheStore, + namespace: 'foo', + logger, + }); + + await wrapped.delete('user'); + + expect(backing.calls.delete).toBe(1); + expect(backing.data.has('user')).toBe(false); + expect(cacheStore.delete).toHaveBeenCalledTimes(1); + expect(cacheStore.delete).toHaveBeenCalledWith('foo:user'); + expect(logger.warn).not.toHaveBeenCalled(); + }); + + it('delete: backing throws -> wrapper throws, cache NOT called', async () => { + const backing = createBackingStore(); + const cacheStore = createMockCacheStore(); + const logger = createMockLogger(); + const failure = new Error('backing offline'); + backing.delete = jest.fn(() => { + throw failure; + }); + + const cacheConfig: Cache.Cache = { + rules: [{ ttl: 60 }], + }; + const wrapped = wrapStoreWithCache(backing, { + storeId: 'foo', + cacheConfig, + cacheStore, + namespace: 'foo', + logger, + }); + + await expect(wrapped.delete('user')).rejects.toBe(failure); + expect(cacheStore.delete).not.toHaveBeenCalled(); + expect(logger.warn).not.toHaveBeenCalled(); + }); + + it('delete: cache throws -> wrapper returns success, warning logged', async () => { + const backing = createBackingStore(); + const cacheStore = createMockCacheStore(); + const logger = createMockLogger(); + backing.data.set('user', 'alice'); + cacheStore.delete.mockImplementationOnce(() => { + throw new Error('cache offline'); + }); + + const cacheConfig: Cache.Cache = { + rules: [{ ttl: 60 }], + }; + const wrapped = wrapStoreWithCache(backing, { + storeId: 'foo', + cacheConfig, + cacheStore, + namespace: 'foo', + logger, + }); + + await expect(wrapped.delete('user')).resolves.toBeUndefined(); + expect(backing.calls.delete).toBe(1); + expect(backing.data.has('user')).toBe(false); + expect(logger.warn).toHaveBeenCalledTimes(1); + }); +}); + +/** + * Build a `Store.Instance` whose `get` implementation is fully controlled by + * the caller. Used by the single-flight tests to model slow / failing backings + * without coupling to the Map-backed default. `set` and `delete` are no-ops + * because the dedup mechanism only applies to reads. + */ +function createControlledBackingStore( + getImpl: jest.Mock, +): Store.Instance & { get: jest.Mock } { + return { + type: 'controlled-backing', + config: {}, + get: getImpl, + set: jest.fn(), + delete: jest.fn(), + }; +} + +describe('store-cache wrapper: single-flight', () => { + beforeEach(() => { + // The shared `web.setup.mjs` enables fake timers in every `beforeEach`. + // These tests rely on a real macrotask delay (setTimeout) inside the + // backing mock to overlap concurrent gets — fake timers would deadlock + // the awaits. Opt back into real timers for this suite only. + jest.useRealTimers(); + }); + + it('N concurrent gets on the same key dedupe to one backing call', async () => { + // Make backing.get slow so all 50 callers arrive before the first resolves. + // If dedup is missing, every caller fires an independent backing.get. + const backingGet = jest.fn().mockImplementation( + () => + new Promise((resolve) => { + setTimeout(() => resolve('v'), 10); + }), + ); + const backing = createControlledBackingStore(backingGet); + const cacheStore = createCacheStore(); + try { + const cacheConfig: Cache.Cache = { + rules: [{ ttl: 60 }], + }; + const wrapped = wrapStoreWithCache(backing, { + storeId: 'foo', + cacheConfig, + cacheStore, + namespace: 'foo', + }); + + const results = await Promise.all( + Array.from({ length: 50 }, () => wrapped.get('k')), + ); + + expect(results).toHaveLength(50); + expect(results.every((r) => r === 'v')).toBe(true); + expect(backingGet).toHaveBeenCalledTimes(1); + } finally { + cacheStore.destroy(); + } + }); + + it('after in-flight resolves, next get is a fresh cycle (cache HIT, no backing call)', async () => { + // After the in-flight promise settles, the cache holds the populated value + // and the registry slot has been released. The next get must HIT the cache + // — not the freed slot, not the backing. + const backingGet = jest.fn().mockResolvedValue('v'); + const backing = createControlledBackingStore(backingGet); + const cacheStore = createCacheStore(); + try { + const cacheConfig: Cache.Cache = { + rules: [{ ttl: 60 }], + }; + const wrapped = wrapStoreWithCache(backing, { + storeId: 'foo', + cacheConfig, + cacheStore, + namespace: 'foo', + }); + + const first = await wrapped.get('k'); + expect(first).toBe('v'); + expect(backingGet).toHaveBeenCalledTimes(1); + + const second = await wrapped.get('k'); + expect(second).toBe('v'); + // Second call hit the populated cache — backing must not be called again. + expect(backingGet).toHaveBeenCalledTimes(1); + } finally { + cacheStore.destroy(); + } + }); + + it('after in-flight rejects, registry is cleared (next get retries backing)', async () => { + // `finally` must run on rejection too, otherwise a transient backing + // failure would freeze the key forever behind a dead Promise. + const backingGet = jest + .fn() + .mockRejectedValueOnce(new Error('transient')) + .mockResolvedValueOnce('v'); + const backing = createControlledBackingStore(backingGet); + const cacheStore = createCacheStore(); + try { + const cacheConfig: Cache.Cache = { + rules: [{ ttl: 60 }], + }; + const wrapped = wrapStoreWithCache(backing, { + storeId: 'foo', + cacheConfig, + cacheStore, + namespace: 'foo', + }); + + await expect(wrapped.get('k')).rejects.toThrow('transient'); + // Registry must be cleared — the next get retries the backing instead + // of returning the failed Promise. + const value = await wrapped.get('k'); + expect(value).toBe('v'); + expect(backingGet).toHaveBeenCalledTimes(2); + } finally { + cacheStore.destroy(); + } + }); + + it('different keys do not share in-flight slots', async () => { + // Registry is keyed by namespaced key. Concurrent gets on distinct keys + // must each fire their own backing call. + const backingGet = jest.fn().mockImplementation( + (key: string) => + new Promise((resolve) => { + setTimeout(() => resolve(`v:${key}`), 10); + }), + ); + const backing = createControlledBackingStore(backingGet); + const cacheStore = createCacheStore(); + try { + const cacheConfig: Cache.Cache = { + rules: [{ ttl: 60 }], + }; + const wrapped = wrapStoreWithCache(backing, { + storeId: 'foo', + cacheConfig, + cacheStore, + namespace: 'foo', + }); + + const [a, b] = await Promise.all([wrapped.get('a'), wrapped.get('b')]); + expect(a).toBe('v:a'); + expect(b).toBe('v:b'); + expect(backingGet).toHaveBeenCalledTimes(2); + } finally { + cacheStore.destroy(); + } + }); +}); + +describe('store-cache wrapper: counters', () => { + beforeEach(() => { + // Some tests below stage overlapping gets to exercise the in-flight dedup + // counter; fake timers (enabled by the shared `web.setup.mjs`) would + // deadlock the awaits, so opt into real timers for this suite. + jest.useRealTimers(); + }); + + it('hits/misses increment correctly', async () => { + const backing = createBackingStore(); + const cacheStore = createCacheStore(); + try { + const cacheConfig: Cache.Cache = { + rules: [{ ttl: 60 }], + }; + const wrapped = wrapStoreWithCache(backing, { + storeId: 'foo', + cacheConfig, + cacheStore, + namespace: 'foo', + }); + + backing.data.set('user', 'alice'); + // First read is a MISS — backing returns a value and the cache populates. + await wrapped.get('user'); + expect(wrapped.counters.misses).toBe(1); + expect(wrapped.counters.hits).toBe(0); + + // Second read finds the populated cache entry — HIT. + await wrapped.get('user'); + expect(wrapped.counters.hits).toBe(1); + expect(wrapped.counters.misses).toBe(1); + + // Third read of a different key also misses (backing returns undefined, + // so no populate, but the MISS counter still increments). + await wrapped.get('missing'); + expect(wrapped.counters.misses).toBe(2); + expect(wrapped.counters.hits).toBe(1); + } finally { + cacheStore.destroy(); + } + }); + + it('populates counts only cache-fills after backing MISS that returned a value', async () => { + const backing = createBackingStore(); + const cacheStore = createCacheStore(); + try { + const cacheConfig: Cache.Cache = { + rules: [ + { + match: { key: 'key', operator: 'prefix', value: 'user:' }, + ttl: 60, + }, + ], + }; + const wrapped = wrapStoreWithCache(backing, { + storeId: 'foo', + cacheConfig, + cacheStore, + namespace: 'foo', + }); + + // MISS + backing returns value + rule matches → populate. + backing.data.set('user:alice', { id: 'alice' }); + await wrapped.get('user:alice'); + expect(wrapped.counters.populates).toBe(1); + + // MISS + backing returns value + rule does NOT match → no populate. + backing.data.set('account:42', { id: 42 }); + await wrapped.get('account:42'); + expect(wrapped.counters.populates).toBe(1); + + // MISS + backing returns undefined → no populate. + await wrapped.get('user:missing'); + expect(wrapped.counters.populates).toBe(1); + + // HIT on the previously populated key → no populate. + await wrapped.get('user:alice'); + expect(wrapped.counters.populates).toBe(1); + } finally { + cacheStore.destroy(); + } + }); + + it('writes counts every set, deletes counts every delete', async () => { + const backing = createBackingStore(); + const cacheStore = createCacheStore(); + try { + const cacheConfig: Cache.Cache = { + rules: [ + { + match: { key: 'key', operator: 'prefix', value: 'user:' }, + ttl: 60, + }, + ], + }; + const wrapped = wrapStoreWithCache(backing, { + storeId: 'foo', + cacheConfig, + cacheStore, + namespace: 'foo', + }); + + // Every set increments `writes` regardless of whether a rule matches. + await wrapped.set('user:alice', { id: 'alice' }); + await wrapped.set('account:42', { id: 42 }); + expect(wrapped.counters.writes).toBe(2); + + // Every delete increments `deletes`. + await wrapped.delete('user:alice'); + await wrapped.delete('account:42'); + await wrapped.delete('missing'); + expect(wrapped.counters.deletes).toBe(3); + + // Sanity: counters track distinct paths. + expect(wrapped.counters.hits).toBe(0); + expect(wrapped.counters.misses).toBe(0); + } finally { + cacheStore.destroy(); + } + }); + + it('inflight_dedups counts joined in-flight promises', async () => { + // 50 concurrent gets on the same key → 1 backing call + 49 dedups. + const backingGet = jest.fn().mockImplementation( + () => + new Promise((resolve) => { + setTimeout(() => resolve('v'), 10); + }), + ); + const backing = createControlledBackingStore(backingGet); + const cacheStore = createCacheStore(); + try { + const cacheConfig: Cache.Cache = { + rules: [{ ttl: 60 }], + }; + const wrapped = wrapStoreWithCache(backing, { + storeId: 'foo', + cacheConfig, + cacheStore, + namespace: 'foo', + }); + + await Promise.all(Array.from({ length: 50 }, () => wrapped.get('k'))); + + // One caller drove the MISS; the other 49 joined the in-flight Promise. + expect(backingGet).toHaveBeenCalledTimes(1); + expect(wrapped.counters.misses).toBe(1); + expect(wrapped.counters.inflight_dedups).toBe(49); + } finally { + cacheStore.destroy(); + } + }); + + it('counters readable via wrapped.counters with snapshot semantics', async () => { + const backing = createBackingStore(); + const cacheStore = createCacheStore(); + try { + const cacheConfig: Cache.Cache = { + rules: [{ ttl: 60 }], + }; + const wrapped = wrapStoreWithCache(backing, { + storeId: 'foo', + cacheConfig, + cacheStore, + namespace: 'foo', + }); + + backing.data.set('user', 'alice'); + await wrapped.get('user'); + + // Snapshot semantics: reading `counters` returns a fresh copy each time. + // Mutating the returned object must not affect internal state, so a + // subsequent read reports the unchanged internal counter. + const snapshot = wrapped.counters; + expect(snapshot.misses).toBe(1); + snapshot.misses = 999; + expect(wrapped.counters.misses).toBe(1); + + // All counter keys are present and numeric on a fresh wrapper. + const fresh = wrapStoreWithCache(createBackingStore(), { + storeId: 'bar', + cacheConfig, + cacheStore, + namespace: 'bar', + }); + expect(fresh.counters).toEqual({ + hits: 0, + misses: 0, + populates: 0, + writes: 0, + deletes: 0, + inflight_dedups: 0, + }); + } finally { + cacheStore.destroy(); + } + }); +}); diff --git a/packages/collector/src/__tests__/store-init-order.test.ts b/packages/collector/src/__tests__/store-init-order.test.ts new file mode 100644 index 000000000..3b4b5d9cb --- /dev/null +++ b/packages/collector/src/__tests__/store-init-order.test.ts @@ -0,0 +1,131 @@ +import type { Collector, Store } from '@walkeros/core'; +import { createMockLogger } from '@walkeros/core'; +import { initStores } from '../store'; + +/** + * Minimal mock collector for store init tests. `initStores` only reads + * `logger`, `hooks`, and `stores` from the collector. + */ +function createMockCollector(): Collector.Instance { + return { + logger: createMockLogger(), + stores: {}, + hooks: {}, + } as unknown as Collector.Instance; +} + +/** + * Minimal in-memory store factory used to keep the tests focused on the + * two-phase init walker. The instances are deliberately simple `Store.Instance` + * shapes (no caching behavior); Task 7+ will introduce the wrapping logic + * exercised through these declarations. + */ +function createMemStoreInit(): Store.Init { + return (context) => ({ + type: 'mem', + config: context.config as Store.Config, + get: jest.fn(), + set: jest.fn(), + delete: jest.fn(), + }); +} + +describe('two-phase store init', () => { + it('resolves cache.store regardless of declaration order', async () => { + const collector = createMockCollector(); + + // `api` declared BEFORE `mem`, with `api.cache.store = 'mem'`. + // The two-phase walker must not throw on the forward reference. + const stores = await initStores(collector, { + api: { + code: createMemStoreInit(), + cache: { + store: 'mem', + rules: [{ ttl: 60 }], + }, + } as Store.InitStore, + mem: { + code: createMemStoreInit(), + } as Store.InitStore, + }); + + expect(stores.api).toBeDefined(); + expect(stores.mem).toBeDefined(); + expect(stores.api.type).toBe('mem'); + expect(stores.mem.type).toBe('mem'); + }); + + it('throws on cycle (A.cache.store=B, B.cache.store=A)', async () => { + const collector = createMockCollector(); + + await expect( + initStores(collector, { + a: { + code: createMemStoreInit(), + cache: { store: 'b', rules: [{ ttl: 60 }] }, + } as Store.InitStore, + b: { + code: createMemStoreInit(), + cache: { store: 'a', rules: [{ ttl: 60 }] }, + } as Store.InitStore, + }), + ).rejects.toThrow(/Cycle in cache\.store chain.*a.*b.*a/); + }); + + it('throws on self-cycle (A.cache.store=A)', async () => { + const collector = createMockCollector(); + + await expect( + initStores(collector, { + a: { + code: createMemStoreInit(), + cache: { store: 'a', rules: [{ ttl: 60 }] }, + } as Store.InitStore, + }), + ).rejects.toThrow(/Cycle in cache\.store chain.*a.*a/); + }); + + it('throws when cache.store points at non-existent store id', async () => { + const collector = createMockCollector(); + + await expect( + initStores(collector, { + api: { + code: createMemStoreInit(), + cache: { store: 'nope', rules: [{ ttl: 60 }] }, + } as Store.InitStore, + }), + ).rejects.toThrow(/cache\.store.*"nope".*not.*declared|unknown.*"nope"/i); + }); + + it('phase 1 succeeds without cache field (existing behavior)', async () => { + const collector = createMockCollector(); + + const stores = await initStores(collector, { + mem: { code: createMemStoreInit() }, + }); + + expect(stores.mem).toBeDefined(); + expect(stores.mem.type).toBe('mem'); + }); + + it('accepts a valid chain of length 3 (a -> b -> c)', async () => { + const collector = createMockCollector(); + + const stores = await initStores(collector, { + a: { + code: createMemStoreInit(), + cache: { store: 'b', rules: [{ ttl: 60 }] }, + } as Store.InitStore, + b: { + code: createMemStoreInit(), + cache: { store: 'c', rules: [{ ttl: 60 }] }, + } as Store.InitStore, + c: { code: createMemStoreInit() }, + }); + + expect(stores.a).toBeDefined(); + expect(stores.b).toBeDefined(); + expect(stores.c).toBeDefined(); + }); +}); diff --git a/packages/collector/src/__tests__/transformer-branch.test.ts b/packages/collector/src/__tests__/transformer-branch.test.ts index dbd658d07..4a134aa2d 100644 --- a/packages/collector/src/__tests__/transformer-branch.test.ts +++ b/packages/collector/src/__tests__/transformer-branch.test.ts @@ -227,7 +227,7 @@ describe('chain branching', () => { match: { key: 'ingest.type', operator: 'eq', value: 'api' }, next: 'api-handler', }, - { match: '*', next: 'default-handler' }, + { next: 'default-handler' }, ], }, ); @@ -273,7 +273,7 @@ describe('chain branching', () => { match: { key: 'ingest.path', operator: 'prefix', value: '/api' }, next: 'api', }, - { match: '*', next: 'fallback' }, + { next: 'fallback' }, ], }; }); @@ -322,4 +322,43 @@ describe('chain branching', () => { // Branch target not found → drop event (return null), not silent continue expect(result.event).toBeNull(); }); + + it('forkResult.next supports many fan-out (each branch produces its own event)', async () => { + // Each branch records the event it received at entry. Under SEQUENTIAL + // execution (the pre-Task-3.2 behavior, where `walkChain` treats a + // string[] as a single chain), `a` runs first, mutates the event with + // `{ data: { touchedBy: 'a' } }`, and `b` then sees that mutation. Under + // true fan-out, each branch starts from the parent event independently, + // so `b` must NOT see `a`'s mutation. This assertion fails under the old + // sequential walk and passes only when each fork branch dispatches as + // its own subchain with an isolated ingest. + const seenByA: WalkerOS.DeepPartialEvent[] = []; + const seenByB: WalkerOS.DeepPartialEvent[] = []; + const router = createTransformer(() => [ + { event: { name: 'fanA' }, next: { many: ['a', 'b'] } }, + ]); + const a = createTransformer((e) => { + seenByA.push(e); + return { event: { ...e, data: { touchedBy: 'a' } } }; + }); + const b = createTransformer((e) => { + seenByB.push(e); + return { event: e }; + }); + const transformers = { router, a, b }; + await runTransformerChain( + createMockCollector(transformers), + transformers, + ['router'], + {}, + ); + // Both branches MUST run. Order is parallel — assert membership, not order. + expect(seenByA).toHaveLength(1); + expect(seenByB).toHaveLength(1); + // Fan-out semantic: b sees the parent event, NOT a's mutation. Under the + // old sequential walk this would fail because b would receive + // { name: 'fanA', data: { touchedBy: 'a' } }. + expect(seenByB[0]).toEqual({ name: 'fanA' }); + expect(seenByA[0]).toEqual({ name: 'fanA' }); + }); }); diff --git a/packages/collector/src/__tests__/transformer-cache-integration.test.ts b/packages/collector/src/__tests__/transformer-cache-integration.test.ts index 7c361d424..634f238a7 100644 --- a/packages/collector/src/__tests__/transformer-cache-integration.test.ts +++ b/packages/collector/src/__tests__/transformer-cache-integration.test.ts @@ -20,7 +20,7 @@ describe('Transformer cache integration', () => { }, }), cache: { - rules: [{ match: '*', key: ['event.name'], ttl: 60 }], + rules: [{ key: ['event.name'], ttl: 60 }], }, }, }, @@ -75,7 +75,7 @@ describe('Transformer cache integration', () => { }, }), cache: { - rules: [{ match: '*', key: ['event.name'], ttl: 60 }], + rules: [{ key: ['event.name'], ttl: 60 }], }, }, validator: { @@ -114,7 +114,7 @@ describe('Transformer cache integration', () => { expect(validatorCalls).toBe(2); // Still runs — step cache continues chain }); - it('should stop chain on HIT when full=true', async () => { + it('should stop chain on HIT when stop=true', async () => { let enricherCalls = 0; let validatorCalls = 0; const destinationEvents: WalkerOS.Event[] = []; @@ -133,8 +133,8 @@ describe('Transformer cache integration', () => { }, }), cache: { - full: true, - rules: [{ match: '*', key: ['event.name'], ttl: 60 }], + stop: true, + rules: [{ key: ['event.name'], ttl: 60 }], }, }, validator: { @@ -168,7 +168,7 @@ describe('Transformer cache integration', () => { expect(validatorCalls).toBe(1); expect(destinationEvents).toHaveLength(1); - // Second push: HIT with full=true — chain stops, validator does NOT run + // Second push: HIT with stop=true — chain stops, validator does NOT run destinationEvents.length = 0; await elb({ name: 'page view', data: {} }); expect(enricherCalls).toBe(1); // Cached — not called @@ -206,7 +206,7 @@ describe('Transformer cache integration', () => { }, }), cache: { - rules: [{ match: '*', key: ['event.name'], ttl: 60 }], + rules: [{ key: ['event.name'], ttl: 60 }], }, }, }, diff --git a/packages/collector/src/__tests__/transformer-cache-stop.test.ts b/packages/collector/src/__tests__/transformer-cache-stop.test.ts new file mode 100644 index 000000000..d50d6b46b --- /dev/null +++ b/packages/collector/src/__tests__/transformer-cache-stop.test.ts @@ -0,0 +1,115 @@ +import { startFlow } from '..'; +import type { Transformer, WalkerOS } from '@walkeros/core'; + +/** + * Bug 3: `cache.stop: true` on a pre-collector transformer must halt the + * pipeline, not just the local chain. Documented in + * `website/docs/transformers/cache.mdx` ("downstream transformers and + * destinations are skipped"). + */ +describe('cache.stop: true on a pre-collector transformer halts the pipeline', () => { + it('dedups duplicate event.id from reaching destinations', async () => { + const destinationEvents: WalkerOS.Event[] = []; + + const { elb } = await startFlow({ + sources: { + test: { + code: async (context) => ({ + type: 'test', + config: context.config, + push: context.env.push, + }), + next: 'dedup', + }, + }, + transformers: { + dedup: { + code: async (ctx): Promise => ({ + type: 'dedup', + config: ctx.config, + // Pass-through transformer: cache HIT is what halts the pipeline, + // not the push body itself. The cache compares by `event.id`. + push(event) { + return { event }; + }, + }), + cache: { + stop: true, + rules: [{ key: ['event.id'], ttl: 60 }], + }, + }, + }, + destinations: { + spy: { + code: { + type: 'spy', + config: {}, + push: async (event: WalkerOS.Event) => { + destinationEvents.push(event); + }, + }, + }, + }, + }); + + // First push: MISS — dedup transformer runs, event reaches destination + await elb({ name: 'page view', id: 'evt-1', data: {} }); + expect(destinationEvents).toHaveLength(1); + expect(destinationEvents[0].id).toBe('evt-1'); + + // Second push with same event.id: HIT — pipeline halts at source.next, + // destination must NOT receive the duplicate. + await elb({ name: 'page view', id: 'evt-1', data: {} }); + expect(destinationEvents).toHaveLength(1); + + // Third push with different event.id: MISS — event reaches destination + await elb({ name: 'page view', id: 'evt-2', data: {} }); + expect(destinationEvents).toHaveLength(2); + expect(destinationEvents[1].id).toBe('evt-2'); + }); + + it('keeps destination cache stop=true scoped to that destination only', async () => { + // Destination cache `stop: true` is per-destination per the docs: other + // destinations still receive the event. The pipeline-halt `stopped` + // discriminator is for pre-collector chains, not destination scope. + const dest1Events: WalkerOS.Event[] = []; + const dest2Events: WalkerOS.Event[] = []; + + const { elb } = await startFlow({ + destinations: { + scoped: { + cache: { + stop: true, + rules: [{ key: ['event.id'], ttl: 60 }], + }, + code: { + type: 'scoped', + config: {}, + push: async (event: WalkerOS.Event) => { + dest1Events.push(event); + }, + }, + }, + other: { + code: { + type: 'other', + config: {}, + push: async (event: WalkerOS.Event) => { + dest2Events.push(event); + }, + }, + }, + }, + }); + + // First push: both destinations receive + await elb({ name: 'page view', id: 'evt-1', data: {} }); + expect(dest1Events).toHaveLength(1); + expect(dest2Events).toHaveLength(1); + + // Second push same id: `scoped` skips (HIT), `other` still receives + await elb({ name: 'page view', id: 'evt-1', data: {} }); + expect(dest1Events).toHaveLength(1); + expect(dest2Events).toHaveLength(2); + }); +}); diff --git a/packages/collector/src/__tests__/transformer-chain-integration.test.ts b/packages/collector/src/__tests__/transformer-chain-integration.test.ts index 394718513..9bc547dd7 100644 --- a/packages/collector/src/__tests__/transformer-chain-integration.test.ts +++ b/packages/collector/src/__tests__/transformer-chain-integration.test.ts @@ -1,5 +1,5 @@ import { startFlow } from '..'; -import type { Transformer, WalkerOS } from '@walkeros/core'; +import type { Elb, Source, Transformer, WalkerOS } from '@walkeros/core'; describe('Destination Transformer Chains (destination.before)', () => { describe('chain execution', () => { @@ -181,6 +181,54 @@ describe('Destination Transformer Chains (destination.before)', () => { expect(order).toEqual(['a', 'b']); }); + + it('synthesizes path passthrough for code-less transformer entries', async () => { + const filterCalls: string[] = []; + const destinationEvents: WalkerOS.Event[] = []; + + const { elb } = await startFlow({ + transformers: { + filterBots: { + code: async (): Promise => ({ + type: 'filter', + config: {}, + push: async (event) => { + filterCalls.push('filterBots'); + return { event }; + }, + }), + }, + // Code-less entry — synthesizes a passthrough whose only job is to + // host the `before: ['filterBots']` chain. + passthrough: { + before: ['filterBots'], + }, + }, + destinations: { + testDest: { + before: 'passthrough', + code: { + type: 'test', + config: {}, + push: async (event) => { + destinationEvents.push(event); + }, + }, + }, + }, + }); + + const inputEvent = { name: 'page view', data: { title: 'Home' } }; + await elb(inputEvent); + + // filterBots ran via the code-less entry's `before` chain + expect(filterCalls).toEqual(['filterBots']); + + // The destination received the event unchanged + expect(destinationEvents).toHaveLength(1); + expect(destinationEvents[0].name).toBe('page view'); + expect(destinationEvents[0].data?.title).toBe('Home'); + }); }); describe('destinations without before', () => { @@ -265,17 +313,19 @@ describe('Destination Transformer Chains (destination.before)', () => { order.push(`dest:${event.data?.enriched}`); }, }, - before: [ - { - match: { - key: 'ingest.entity', - operator: 'eq', - value: 'product', + before: { + one: [ + { + match: { + key: 'ingest.entity', + operator: 'eq', + value: 'product', + }, + next: 'product-enricher', }, - next: 'product-enricher', - }, - { match: '*', next: 'default-enricher' }, - ] as any, + { next: 'default-enricher' }, + ], + }, }, }, }); @@ -438,4 +488,69 @@ describe('Destination Transformer Chains (destination.before)', () => { expect(order).toEqual(['first', 'second', 'third']); }); }); + + describe('source.next with many (Phase 6 regression)', () => { + it('source.next with many fans out: N matching entries → N collector events', async () => { + const received: Array<{ tag: unknown; name: string }> = []; + + const { collector } = await startFlow({ + sources: { + in: { + code: async (context): Promise => { + const { env, config } = context; + return { + type: 'test', + config: config as Source.Config, + push: env.push as Elb.Fn, + }; + }, + next: { many: ['audit-tag', 'process-tag'] }, + }, + }, + transformers: { + 'audit-tag': { + code: async (context): Promise => ({ + type: 'audit-tag', + config: context.config, + push: async (event) => ({ + event: { ...event, data: { ...event.data, tag: 'audit' } }, + }), + }), + }, + 'process-tag': { + code: async (context): Promise => ({ + type: 'process-tag', + config: context.config, + push: async (event) => ({ + event: { ...event, data: { ...event.data, tag: 'process' } }, + }), + }), + }, + }, + destinations: { + spy: { + code: { + type: 'spy', + config: {}, + push: async (event: WalkerOS.Event) => { + received.push({ + tag: event.data?.tag, + name: event.name ?? '', + }); + }, + }, + }, + }, + }); + + await collector.sources.in.push({ name: 'page view', data: {} }); + + // Both branches reach the destination as INDEPENDENT events, each + // carrying their own tag. If `many` collapsed into a sequential chain, + // we'd see a single event tagged 'process' (last writer wins). + expect(received).toHaveLength(2); + expect(received.find((r) => r.tag === 'audit')).toBeDefined(); + expect(received.find((r) => r.tag === 'process')).toBeDefined(); + }); + }); }); diff --git a/packages/collector/src/__tests__/transformer-mapping.test.ts b/packages/collector/src/__tests__/transformer-mapping.test.ts new file mode 100644 index 000000000..17d9753bc --- /dev/null +++ b/packages/collector/src/__tests__/transformer-mapping.test.ts @@ -0,0 +1,112 @@ +import { startFlow } from '..'; +import type { WalkerOS } from '@walkeros/core'; + +/** + * Task 4.1: runtime integration tests for the mapping-only transformer step. + * + * A transformer entry with `mapping` (and no `code`) synthesizes a + * mapping-aware pass push at init: `processEventMapping` runs, the + * transformed event flows on, and `ignore: true` drops the event. + * + * See `packages/collector/src/transformer.ts` (synthesized codeFn around the + * "Synthesize a passthrough instance when `code` is absent" block). + */ +describe('mapping-only transformer steps', () => { + it('runs a mapping-only transformer step (mapping field, no code)', async () => { + const events: WalkerOS.Event[] = []; + + const { elb } = await startFlow({ + transformers: { + redactEmail: { + mapping: { + policy: { 'user.email': { value: '[redacted]' } }, + }, + }, + }, + destinations: { + capture: { + before: ['redactEmail'], + code: { + type: 'capture', + config: {}, + push: async (event: WalkerOS.Event) => { + events.push(event); + }, + }, + }, + }, + }); + + await elb({ + name: 'page view', + data: {}, + user: { email: 'alice@example.com' }, + }); + + expect(events).toHaveLength(1); + expect(events[0]).toMatchObject({ user: { email: '[redacted]' } }); + }); + + it('drops events when a mapping-only step has ignore: true on the matching rule', async () => { + const events: WalkerOS.Event[] = []; + + const { elb } = await startFlow({ + transformers: { + dropDebug: { + mapping: { + mapping: { debug: { '*': [{ ignore: true }] } }, + }, + }, + }, + destinations: { + capture: { + before: ['dropDebug'], + code: { + type: 'capture', + config: {}, + push: async (event: WalkerOS.Event) => { + events.push(event); + }, + }, + }, + }, + }); + + await elb({ name: 'debug ping', data: {} }); + await elb({ name: 'page view', data: {} }); + + expect(events).toHaveLength(1); + expect(events[0].name).toBe('page view'); + }); + + it('renames events when mapping[].name is set', async () => { + const events: WalkerOS.Event[] = []; + + const { elb } = await startFlow({ + transformers: { + renamer: { + mapping: { + mapping: { order: { complete: { name: 'purchase' } } }, + }, + }, + }, + destinations: { + capture: { + before: ['renamer'], + code: { + type: 'capture', + config: {}, + push: async (event: WalkerOS.Event) => { + events.push(event); + }, + }, + }, + }, + }); + + await elb({ name: 'order complete', data: {} }); + + expect(events).toHaveLength(1); + expect(events[0].name).toBe('purchase'); + }); +}); diff --git a/packages/collector/src/__tests__/transformer.test.ts b/packages/collector/src/__tests__/transformer.test.ts index 8ed914e4c..d9a2012d2 100644 --- a/packages/collector/src/__tests__/transformer.test.ts +++ b/packages/collector/src/__tests__/transformer.test.ts @@ -9,6 +9,7 @@ import { extractTransformerNextMap, extractChainProperty, } from '../transformer'; +import { createCacheStore } from '../cache-store'; describe('Transformer', () => { // Mock collector for tests @@ -284,6 +285,357 @@ describe('Transformer', () => { expect(mockPush).toHaveBeenCalled(); expect(result.event).toEqual(event); }); + + it('transformer.before: many on transformer.before spawns parallel before-chains', async () => { + const collector = createMockCollector(); + const seen: string[] = []; + const audit = createMockTransformer({ + push: jest.fn().mockImplementation(async (e) => { + seen.push('audit'); + return { event: e }; + }), + }); + const log = createMockTransformer({ + push: jest.fn().mockImplementation(async (e) => { + seen.push('log'); + return { event: e }; + }), + }); + const inner = createMockTransformer({ + config: { before: { many: ['audit', 'log'] } }, + push: jest.fn().mockImplementation(async (e) => { + seen.push('inner'); + return { event: e }; + }), + }); + const transformers = { audit, log, inner }; + collector.transformers = transformers; + await runTransformerChain(collector, transformers, ['inner'], {}); + expect(seen.sort()).toEqual(['audit', 'inner', 'log']); + }); + + it('result.next: many terminates main chain and fans out to N subchains', async () => { + const collector = createMockCollector(); + // Strong assertions per Tasks 3.1 / 3.2 discipline: + // 1. tail never sees the head event (main chain terminates). + // 2. y sees the parent event UN-mutated by x (true fan-out, not a + // sequential walk of ['x', 'y']). + const trailX: WalkerOS.DeepPartialEvent[] = []; + const trailY: WalkerOS.DeepPartialEvent[] = []; + const trailTail: WalkerOS.DeepPartialEvent[] = []; + const head = createMockTransformer({ + push: jest.fn().mockImplementation(async () => ({ + event: { name: 'h' }, + next: { many: ['x', 'y'] }, + })), + }); + const tail = createMockTransformer({ + push: jest.fn().mockImplementation(async (e) => { + trailTail.push(e); + return { event: e }; + }), + }); + const x = createMockTransformer({ + push: jest.fn().mockImplementation(async (e) => { + trailX.push(e); + return { event: { ...e, data: { touchedBy: 'x' } } }; + }), + }); + const y = createMockTransformer({ + push: jest.fn().mockImplementation(async (e) => { + trailY.push(e); + return { event: e }; + }), + }); + const transformers = { head, tail, x, y }; + collector.transformers = transformers; + await runTransformerChain(collector, transformers, ['head', 'tail'], {}); + // Both branches must run. + expect(trailX).toHaveLength(1); + expect(trailY).toHaveLength(1); + // Main chain must terminate — `tail` must NOT have received the head event. + expect(trailTail).toHaveLength(0); + // Fan-out semantic: y sees the parent event, NOT x's mutation. Under + // the old sequential walk (walkChain(['x','y'])) this would fail + // because y would receive { name: 'h', data: { touchedBy: 'x' } }. + expect(trailY[0]).toEqual({ name: 'h' }); + expect(trailX[0]).toEqual({ name: 'h' }); + }); + + it('config.next: many on transformer config produces fan-out (each branch independent)', async () => { + const collector = createMockCollector(); + // Each branch receives the routed event UN-mutated by sibling branch. + // Under SEQUENTIAL execution (the pre-fan-out behavior, where the + // dispatcher walks p then q as a chain), p mutates the event with + // `{ data: { touchedBy: 'p' } }` and q then sees that mutation. Under + // true fan-out, q must see the parent event unchanged. + const seenByP: WalkerOS.DeepPartialEvent[] = []; + const seenByQ: WalkerOS.DeepPartialEvent[] = []; + const router = createMockTransformer({ + config: { next: { many: ['p', 'q'] } }, + push: jest.fn().mockImplementation(async () => ({ + event: { name: 'routed' }, + })), + }); + const p = createMockTransformer({ + push: jest.fn().mockImplementation(async (e) => { + seenByP.push(e); + return { event: { ...e, data: { touchedBy: 'p' } } }; + }), + }); + const q = createMockTransformer({ + push: jest.fn().mockImplementation(async (e) => { + seenByQ.push(e); + return { event: e }; + }), + }); + const transformers = { router, p, q }; + collector.transformers = transformers; + await runTransformerChain(collector, transformers, ['router'], {}); + // Both branches must run. + expect(seenByP).toHaveLength(1); + expect(seenByQ).toHaveLength(1); + // Fan-out semantic: q sees the parent event, NOT p's mutation. Under + // the old sequential walk this would fail because q would receive + // { name: 'routed', data: { touchedBy: 'p' } }. + expect(seenByQ[0]).toEqual({ name: 'routed' }); + expect(seenByP[0]).toEqual({ name: 'routed' }); + }); + + it('many: one branch throwing does not kill siblings', async () => { + const collector = createMockCollector(); + const seen: string[] = []; + const router = createMockTransformer({ + push: jest.fn().mockImplementation(async () => ({ + event: { name: 'route' }, + next: { many: ['boom', 'ok'] }, + })), + }); + const boom = createMockTransformer({ + push: jest.fn().mockImplementation(async () => { + seen.push('boom-tried'); + throw new Error('intentional'); + }), + }); + const ok = createMockTransformer({ + push: jest.fn().mockImplementation(async (e) => { + seen.push('ok'); + return { event: e }; + }), + }); + const transformers = { router, boom, ok }; + collector.transformers = transformers; + await runTransformerChain(collector, transformers, ['router'], {}); + expect(seen).toContain('boom-tried'); + expect(seen).toContain('ok'); + }); + + it('many: one branch returning false does not kill siblings', async () => { + const collector = createMockCollector(); + const seen: string[] = []; + const router = createMockTransformer({ + push: jest.fn().mockImplementation(async () => ({ + event: { name: 'route' }, + next: { many: ['stop', 'ok'] }, + })), + }); + const stop = createMockTransformer({ + push: jest.fn().mockImplementation(async () => false), + }); + const ok = createMockTransformer({ + push: jest.fn().mockImplementation(async (e) => { + seen.push('ok'); + return { event: e }; + }), + }); + const transformers = { router, stop, ok }; + collector.transformers = transformers; + await runTransformerChain(collector, transformers, ['router'], {}); + expect(seen).toEqual(['ok']); + }); + + it('many strips respond propagation: parent caller sees no wrapped respond', async () => { + const collector = createMockCollector(); + // Properly typed respond: RespondFn = (options?: RespondOptions) => void. + // No `as unknown` cast — the no-op respond satisfies the signature + // directly, and the test only asserts on respond presence/absence at + // the parent boundary, not on call semantics. + const respondA: import('@walkeros/core').RespondFn = () => {}; + const respondB: import('@walkeros/core').RespondFn = () => {}; + const router = createMockTransformer({ + push: jest.fn().mockImplementation(async () => ({ + event: { name: 'r' }, + next: { many: ['a', 'b'] }, + })), + }); + const a = createMockTransformer({ + push: jest + .fn() + .mockImplementation(async (e) => ({ event: e, respond: respondA })), + }); + const b = createMockTransformer({ + push: jest + .fn() + .mockImplementation(async (e) => ({ event: e, respond: respondB })), + }); + const transformers = { router, a, b }; + collector.transformers = transformers; + const result = await runTransformerChain( + collector, + transformers, + ['router'], + {}, + ); + expect(result.respond).toBeUndefined(); + }); + + it('many inside many dispatches the union of branches', async () => { + // Task 6.2 — nested fan-out: head → many: [midA, midB] where + // midA fans out to [x, y] and midB chains to z. All three terminal + // IDs must be reached as independent flows. Verifies graph traversal, + // not parallel-vs-sequential isolation (each terminal pushes a single + // token; reachability via `seen.sort()` membership is sufficient). + const collector = createMockCollector(); + const seen: string[] = []; + const head = createMockTransformer({ + push: jest.fn().mockImplementation(async () => ({ + event: { name: 'h' }, + next: { many: ['midA', 'midB'] }, + })), + }); + const midA = createMockTransformer({ + push: jest.fn().mockImplementation(async (e) => ({ + event: e, + next: { many: ['x', 'y'] }, + })), + }); + const midB = createMockTransformer({ + push: jest.fn().mockImplementation(async (e) => ({ + event: e, + next: 'z', + })), + }); + const x = createMockTransformer({ + push: jest.fn().mockImplementation(async (e) => { + seen.push('x'); + return { event: e }; + }), + }); + const y = createMockTransformer({ + push: jest.fn().mockImplementation(async (e) => { + seen.push('y'); + return { event: e }; + }), + }); + const z = createMockTransformer({ + push: jest.fn().mockImplementation(async (e) => { + seen.push('z'); + return { event: e }; + }), + }); + const transformers = { head, midA, midB, x, y, z }; + collector.transformers = transformers; + await runTransformerChain(collector, transformers, ['head'], {}); + expect(seen.sort()).toEqual(['x', 'y', 'z']); + }); + + it('many cycle is bounded by MAX_PATH_LENGTH', async () => { + // Task 6.2 — cycle defense: a → many: [b]; b → many: [a]. The + // path-length valve in runTransformerChain (MAX_PATH_LENGTH = 256) + // must trip per-branch, terminating the cycle. cloneIngest must + // deep-copy `_meta.path` (not share the array reference) so the + // budget accumulates per fan-out branch. + const collector = createMockCollector(); + const a = createMockTransformer({ + push: jest.fn().mockImplementation(async (e) => ({ + event: e, + next: { many: ['b'] }, + })), + }); + const b = createMockTransformer({ + push: jest.fn().mockImplementation(async (e) => ({ + event: e, + next: { many: ['a'] }, + })), + }); + const transformers = { a, b }; + collector.transformers = transformers; + const result = await runTransformerChain( + collector, + transformers, + ['a'], + {}, + ); + // Path-length valve trips per-branch; runtime returns instead of + // hanging or throwing. + expect(result).toBeDefined(); + }, 5000); + + it('many: cache.stop in one branch does not halt sibling branches', async () => { + // Regression guard for Task 4.3 (route grammar refactor). + // + // When a `many` branch HITs a `cache.stop: true` cache, that branch's + // `runTransformerChain` returns `{ event, respond, stopped: true }`. + // The pipeline-halt `stopped` discriminator is branch-internal: it MUST + // NOT propagate to sibling branches under the same `many` dispatch. + // + // Task 4.2 added the per-branch side-channel strip (respond AND stopped) + // at every `many` dispatch site in `runTransformerChain`. This test + // covers Site 1 (`result.next: { many }` from the router transformer's + // push result, lines ~924-942 in transformer.ts). Because each branch + // runs in its own `runTransformerChain` invocation under `Promise.all`, + // sibling branches are dispatched concurrently and a `stopped: true` + // return from one branch cannot starve siblings. + const seen: string[] = []; + + // Prime the cache store before running. The `stopBranch` transformer's + // cache rule keys off `event.name`. After fan-out, both branches receive + // the routed event `{ name: 'r' }`, so we pre-set key 'r' to force a HIT + // in stopBranch only (normal has no cache). + const cacheStore = createCacheStore({ sweepIntervalMs: 0 }); + cacheStore.set('r', { name: 'r' }, 60_000); + + const router = createMockTransformer({ + push: jest.fn().mockImplementation(async () => ({ + event: { name: 'r' }, + next: { many: ['stopBranch', 'normal'] }, + })), + }); + const stopBranch = createMockTransformer({ + config: { + cache: { + stop: true, + rules: [{ key: ['event.name'], ttl: 1000 }], + }, + }, + push: jest.fn().mockImplementation(async (e) => { + seen.push('stopBranch'); + return { event: e }; + }), + }); + const normal = createMockTransformer({ + push: jest.fn().mockImplementation(async (e) => { + seen.push('normal'); + return { event: e }; + }), + }); + + const collector = createMockCollector({ + stores: { __cache: cacheStore }, + }); + const transformers = { router, stopBranch, normal }; + collector.transformers = transformers; + + await runTransformerChain(collector, transformers, ['router'], { + name: 'r', + }); + + // stopBranch HIT the cache → its push was skipped (cache HIT returns + // before the push call). normal has no cache → its push ran. + // The critical assertion: branch isolation under `many`. + expect(seen).toContain('normal'); + expect(seen).not.toContain('stopBranch'); + }); }); describe('transformerInit', () => { diff --git a/packages/collector/src/cache-store.ts b/packages/collector/src/cache-store.ts new file mode 100644 index 000000000..13fe36e2a --- /dev/null +++ b/packages/collector/src/cache-store.ts @@ -0,0 +1,199 @@ +import type { Store } from '@walkeros/core'; + +/** + * Options for the built-in collector cache store (`__cache`). + * + * The default cache is an entry-capped LRU with active TTL sweep. Byte-size + * accounting is opt-in: when `maxSize` is `undefined`, no byte budget is + * enforced. + */ +export interface CacheStoreOptions { + /** Hard cap on entries. Defaults to 10000. */ + maxEntries?: number; + /** + * Optional byte budget for the cache. When set, byte-sized eviction is + * enabled in addition to entry-count eviction. Defaults to `undefined` + * (no byte budget). + */ + maxSize?: number; + /** + * Active sweep interval (ms) for purging expired entries even when they + * are never read. Defaults to 60_000 (60 seconds). Pass 0 to disable. + */ + sweepIntervalMs?: number; + /** + * Fraction of `maxEntries` to keep after a batched eviction pass. Defaults + * to 0.8. The cache trims to `maxEntries * lowWaterMark` in one pass on + * overflow. + */ + lowWaterMark?: number; +} + +/** + * Operational counters exposed by the cache store. All counters are + * monotonic for the lifetime of the cache instance. + */ +export interface CacheStoreCounters { + /** Successful `get` calls that returned a live cached value. */ + hits: number; + /** `get` calls that found no entry (cold) or only an expired one. */ + misses: number; + /** `set` calls that created a new key (first-time population). */ + populates: number; + /** All `set` calls (populates + overwrites). */ + writes: number; + /** All `delete` calls that removed an existing key. */ + deletes: number; + /** Entries removed because the cache hit `maxEntries`. */ + evictions_entries: number; + /** Entries removed because their TTL expired (sweep or lazy). */ + evictions_ttl: number; +} + +interface CacheEntry { + value: unknown; + expires?: number; +} + +/** + * The upgraded `__cache` store. Backward-compatible with the existing + * `Store.Instance` shape — callers see `get(key)`, `set(key, value, ttl?)`, + * `delete(key)`. Adds an observability surface via `counters` and an active + * TTL sweep that runs on a timer. + * + * Eviction model: + * - Map iteration order is insertion order; oldest insertion is the FIFO head. + * - `get` reorders the entry to most-recently-used (delete + re-insert). + * - On insert overflow (size > maxEntries), evict in one pass down to + * `lowWaterMark * maxEntries` (default 80%). + * + * Active TTL sweep: every `sweepIntervalMs` ms, walk the map and drop any + * entries past `expires`. The interval is cleared in `destroy()`. + */ +export type CacheStore = Store.Instance & { + readonly counters: CacheStoreCounters; + destroy: () => void; +}; + +const DEFAULT_MAX_ENTRIES = 10000; +const DEFAULT_SWEEP_INTERVAL_MS = 60_000; +const DEFAULT_LOW_WATER_MARK = 0.8; + +export function createCacheStore(options: CacheStoreOptions = {}): CacheStore { + const maxEntries = options.maxEntries ?? DEFAULT_MAX_ENTRIES; + const lowWaterMark = options.lowWaterMark ?? DEFAULT_LOW_WATER_MARK; + const sweepIntervalMs = options.sweepIntervalMs ?? DEFAULT_SWEEP_INTERVAL_MS; + const targetSize = Math.floor(maxEntries * lowWaterMark); + + const entries = new Map(); + + const counters: CacheStoreCounters = { + hits: 0, + misses: 0, + populates: 0, + writes: 0, + deletes: 0, + evictions_entries: 0, + evictions_ttl: 0, + }; + + function evictOverflow(): void { + if (entries.size <= maxEntries) return; + // Trim in one pass down to targetSize using insertion-order iteration + // (oldest first). LRU is preserved because `get` re-inserts on access. + const toRemove = entries.size - targetSize; + let removed = 0; + for (const key of entries.keys()) { + if (removed >= toRemove) break; + entries.delete(key); + removed++; + } + counters.evictions_entries += removed; + } + + function sweep(): void { + const now = Date.now(); + let removed = 0; + for (const [key, entry] of entries) { + if (entry.expires !== undefined && entry.expires <= now) { + entries.delete(key); + removed++; + } + } + counters.evictions_ttl += removed; + } + + let sweepTimer: ReturnType | undefined; + if (sweepIntervalMs > 0) { + sweepTimer = setInterval(sweep, sweepIntervalMs); + // Don't keep the Node.js event loop alive solely for the cache sweep. + if ( + sweepTimer && + typeof (sweepTimer as { unref?: () => void }).unref === 'function' + ) { + (sweepTimer as { unref: () => void }).unref(); + } + } + + const store: CacheStore = { + type: 'memory', + config: {}, + + get(key: string): unknown { + const entry = entries.get(key); + if (!entry) { + counters.misses++; + return undefined; + } + + if (entry.expires !== undefined && entry.expires <= Date.now()) { + entries.delete(key); + counters.evictions_ttl++; + counters.misses++; + return undefined; + } + + // LRU: move to most-recently-used position. + entries.delete(key); + entries.set(key, entry); + counters.hits++; + return entry.value; + }, + + set(key: string, value: unknown, ttl?: number): void { + const isNew = !entries.has(key); + // Always delete first so re-insert puts the entry at the + // most-recently-used position regardless of overwrite or new. + if (!isNew) entries.delete(key); + + entries.set(key, { + value, + expires: ttl !== undefined ? Date.now() + ttl : undefined, + }); + + counters.writes++; + if (isNew) counters.populates++; + + if (entries.size > maxEntries) evictOverflow(); + }, + + delete(key: string): void { + if (entries.delete(key)) counters.deletes++; + }, + + get counters() { + // Return a snapshot so external callers can't mutate internal state. + return { ...counters }; + }, + + destroy(): void { + if (sweepTimer !== undefined) { + clearInterval(sweepTimer); + sweepTimer = undefined; + } + entries.clear(); + }, + }; + + return store; +} diff --git a/packages/collector/src/collector.ts b/packages/collector/src/collector.ts index ef196c14f..855f2fdc6 100644 --- a/packages/collector/src/collector.ts +++ b/packages/collector/src/collector.ts @@ -1,4 +1,4 @@ -import type { Collector, Logger, Store, WalkerOS } from '@walkeros/core'; +import type { Collector, Logger, WalkerOS } from '@walkeros/core'; import { assign, createLogger } from '@walkeros/core'; import { commonHandleCommand } from './handle'; import { initDestinations } from './destination'; @@ -7,6 +7,7 @@ import { createPush } from './push'; import { createCommand } from './command'; import { initSources } from './source'; import { initStores, resolveStoreReferences } from './store'; +import { createCacheStore } from './cache-store'; // Replaced at build time by tsup's `define` (see packages/config/tsup). declare const __VERSION__: string; @@ -89,31 +90,11 @@ export async function collector( // these raw references with the actual Store.Instance objects. resolveStoreReferences(rawStores, collector.stores, initConfig); - // Create default cache store for steps that use cache without explicit store + // Create default cache store for steps that use cache without explicit store. + // Uses LRU + entry cap + batched eviction + active TTL sweep. See + // `cache-store.ts` for the full semantics. if (!collector.stores.__cache) { - const cache = new Map(); - collector.stores.__cache = { - type: 'memory', - config: {}, - get: (key: string) => { - const entry = cache.get(key); - if (!entry) return undefined; - if (entry.expires && Date.now() > entry.expires) { - cache.delete(key); - return undefined; - } - return entry.value; - }, - set: (key: string, value: unknown, ttl?: number) => { - cache.set(key, { - value, - expires: ttl ? Date.now() + ttl : undefined, - }); - }, - delete: (key: string) => { - cache.delete(key); - }, - } as Store.Instance; + collector.stores.__cache = createCacheStore(); } // Initialize destinations after collector is fully created diff --git a/packages/collector/src/destination.ts b/packages/collector/src/destination.ts index c9822cf37..8f9b72c15 100644 --- a/packages/collector/src/destination.ts +++ b/packages/collector/src/destination.ts @@ -1,10 +1,10 @@ import type { + Cache, Collector, WalkerOS, Elb, Destination, Transformer, - CompiledNext, Ingest, } from '@walkeros/core'; import { @@ -14,17 +14,15 @@ import { compileCache, checkCache, storeCache, - compileNext, createIngest, debounce, getId, getGrantedConsent, + getNextSteps, isDefined, isFunction, isObject, - isRouteArray, processEventMapping, - resolveNext, tryCatchAsync, useHooks, } from '@walkeros/core'; @@ -39,30 +37,47 @@ import { getCacheStore } from './cache'; /** * Resolves transformer chain for a destination. - * For conditional routing (Route[]), compiledBefore must be provided (compiled at init). - * For static routing (string | string[]), resolution is direct. + * + * `getNextSteps` returns the immediate next-step ids for the given Route in + * the supplied context. `walkChain` then follows static `.next` links from + * each entry to produce the full ordered chain. The WeakMap inside + * `getNextSteps` caches the compiled form, so we don't re-compile per event. + * + * post-collector destination.before disallows `many` (enforced at the schema + * layer via `RouteWithoutManySchema`), so we never see more than one id here + * unless a user passes an explicit string[] chain — in which case we want to + * treat it as the explicit chain (no further walking). * * `transformerNextMap` is computed once per `pushToDestinations` call (it depends * only on `collector.transformers`) and passed in to avoid rebuilding it for * every destination's before and next chain resolution. */ function resolveDestinationChain( - before: Transformer.RouteSpec | undefined, - compiledBefore: CompiledNext | undefined, + before: Transformer.Route | undefined, transformerNextMap: ReturnType, ingest?: Ingest, ): string[] { if (!before) return []; - - if (compiledBefore) { - const resolved = resolveNext(compiledBefore, buildCacheContext(ingest)); - if (!resolved) return []; - return walkChain(resolved, transformerNextMap); + // Static string[] chains pass through unchanged — they are explicit and + // suppress `.next` walking. Static single-string starts are walked. + if ( + Array.isArray(before) && + before.every((entry) => typeof entry === 'string') + ) { + return walkChain(before, transformerNextMap); } - - // Without compiledBefore, before is static (string | string[]); skip Route[] case. - if (isRouteArray(before)) return []; - return walkChain(before, transformerNextMap); + if (typeof before === 'string') { + return walkChain(before, transformerNextMap); + } + // Conditional shape — resolve per-event, walk single-id result. + const ids = getNextSteps(before, buildCacheContext(ingest)); + if (ids.length === 0) return []; + if (ids.length === 1) return walkChain(ids[0], transformerNextMap); + // Multiple ids from a conditional shape: treat as explicit chain. + // (destination.before disallows `many`; this path is reached only if a + // RouteConfig.next resolves to a string[], which is then the user's + // declared chain.) + return walkChain(ids, transformerNextMap); } /** @@ -264,26 +279,24 @@ export async function pushToDestinations( let response: unknown; if (!destination.dlq) destination.dlq = []; - // Compile before chain once per destination batch (not per-event) + // Resolve the before chain once per destination batch (the per-event + // resolution inside getNextSteps is WeakMap-cached, so this is cheap). const before = destination.config.before; - const compiledBefore = - before && isRouteArray(before) ? compileNext(before) : undefined; const postChain = resolveDestinationChain( before, - compiledBefore, transformerNextMap, destIngest, ); - // Compile next chain once per destination batch (not per-event) + // Capture the next chain config; resolution happens per-event below. const nextConfig = destination.config.next; - const compiledNext = - nextConfig && isRouteArray(nextConfig) - ? compileNext(nextConfig) - : undefined; - // Compile destination cache once per batch (not per-event) - const destCacheConfig = destination.config?.cache; + // Compile destination cache once per batch (not per-event). + // Destination caches operate on events (HIT/MISS keyed by event fields), + // so the rule shape is always EventCacheRule, not StoreCacheRule. + const destCacheConfig = destination.config?.cache as + | Cache.Cache + | undefined; const compiledDCache = destCacheConfig ? compileCache(destCacheConfig) : undefined; @@ -301,13 +314,12 @@ export async function pushToDestinations( // Full cache check: before the before chain (skips everything on HIT) let cacheMiss: { key: string; ttl: number } | undefined; - if (compiledDCache?.full && dCacheStore) { + if (compiledDCache?.stop && dCacheStore) { const cacheContext = buildCacheContext(destIngest, event); const cacheResult = checkCache( compiledDCache, dCacheStore, cacheContext, - `d:${id}`, ); if (cacheResult?.status === 'HIT') { return event; // Skip before chain + push @@ -353,13 +365,12 @@ export async function pushToDestinations( } // Step-level cache check: after before chain, skip only push on HIT - if (compiledDCache && !compiledDCache.full && dCacheStore) { + if (compiledDCache && !compiledDCache.stop && dCacheStore) { const cacheContext = buildCacheContext(destIngest, processedEvent); const cacheResult = checkCache( compiledDCache, dCacheStore, cacheContext, - `d:${id}`, ); if (cacheResult?.status === 'HIT') { return event; // Skip push — deduplicated @@ -421,7 +432,6 @@ export async function pushToDestinations( const nextChain = resolveDestinationChain( nextConfig, - compiledNext, transformerNextMap, destIngest, ); diff --git a/packages/collector/src/index.ts b/packages/collector/src/index.ts index f72922431..972769dea 100644 --- a/packages/collector/src/index.ts +++ b/packages/collector/src/index.ts @@ -10,8 +10,6 @@ export * from './handle'; export * from './on'; export * from './source'; export { - walkChain, - extractTransformerNextMap, runTransformerChain, transformerPush, transformerInit, diff --git a/packages/collector/src/push.ts b/packages/collector/src/push.ts index 3093f141c..bde7dee05 100644 --- a/packages/collector/src/push.ts +++ b/packages/collector/src/push.ts @@ -121,6 +121,16 @@ export function createPush( return createPushResult({ ok: true }); } + // Pipeline-halt signal from a pre-collector `cache.stop: true` + // HIT. The event is intentionally NOT forwarded to destinations; + // duplicates are suppressed at the source.next boundary per the + // documented "downstream transformers and destinations are + // skipped" semantic in transformers/cache.mdx. + if (chainResult.stopped) { + if (chainResult.respond) respond = chainResult.respond; + return createPushResult({ ok: true }); + } + // Update respond if the chain produced a wrapped one if (chainResult.respond) respond = chainResult.respond; diff --git a/packages/collector/src/source.ts b/packages/collector/src/source.ts index 6d71d02ed..648b9bf42 100644 --- a/packages/collector/src/source.ts +++ b/packages/collector/src/source.ts @@ -1,12 +1,17 @@ -import type { Collector, Elb, Ingest, Source, WalkerOS } from '@walkeros/core'; +import type { + Cache, + Collector, + Elb, + Ingest, + Source, + WalkerOS, +} from '@walkeros/core'; import type { RespondFn, RespondOptions } from '@walkeros/core'; import { createIngest, getMappingValue, tryCatchAsync, - compileNext, - resolveNext, - isRouteArray, + getNextSteps, compileCache, checkCache, storeCache, @@ -17,7 +22,27 @@ import { walkChain, extractTransformerNextMap, runTransformerChain, + cloneIngest, } from './transformer'; + +/** + * A Route is "static" when it's a transformer-ID string or an array of + * transformer-ID strings. Static routes can be resolved once at init and + * walked synchronously; conditional shapes (RouteConfig, mixed arrays) + * depend on per-event context and resolve via getNextSteps at dispatch. + */ +function isStaticRoute( + route: import('@walkeros/core').Transformer.Route | undefined, +): route is string | string[] { + if (typeof route === 'string') return true; + if ( + Array.isArray(route) && + route.every((entry) => typeof entry === 'string') + ) { + return true; + } + return false; +} import { getCacheStore } from './cache'; /** @@ -70,52 +95,62 @@ export async function initSource( // Track current respond function (set per-request by setRespond) let currentRespond: RespondFn | undefined = undefined; - // Compile source cache config (if configured) - const compiledSourceCache = cache - ? compileCache({ ...cache, full: cache.full ?? true }) + // Compile source cache config (if configured). + // Source caches operate on events (request-scoped HIT/MISS keyed by event + // fields), so the rule shape is always EventCacheRule, not StoreCacheRule. + const sourceCacheConfig = cache as + | Cache.Cache + | undefined; + const compiledSourceCache = sourceCacheConfig + ? compileCache({ + ...sourceCacheConfig, + stop: sourceCacheConfig.stop ?? true, + }) + : undefined; + + // Resolve transformer chain for this source. + // Static (string / string[]) chains pre-walk at init (optimization). + // Conditional shapes (case / gate) require per-request context — see wrappedPush. + const staticPreChain = isStaticRoute(next) + ? walkChain(next, extractTransformerNextMap(collector.transformers)) : undefined; - // Resolve transformer chain for this source - const compiledNext = compileNext(next); - const isConditional = Array.isArray(next) && isRouteArray(next); - // For static next, pre-walk at init (optimization) - const staticPreChain = - !isConditional && compiledNext - ? walkChain( - resolveNext(compiledNext)!, - extractTransformerNextMap(collector.transformers), - ) - : undefined; - - // Resolve before chain for this source (consent-exempt, pre-source preprocessing) - const compiledBefore = compileNext(before); - const isBeforeConditional = Array.isArray(before) && isRouteArray(before); - const staticBeforeChain = - !isBeforeConditional && compiledBefore - ? walkChain( - resolveNext(compiledBefore)!, - extractTransformerNextMap(collector.transformers), - ) - : undefined; + // Resolve before chain for this source (consent-exempt, pre-source preprocessing). + const staticBeforeChain = isStaticRoute(before) + ? walkChain(before, extractTransformerNextMap(collector.transformers)) + : undefined; // Create wrapped push that auto-applies source mapping config, preChain, and ingest const wrappedPush: Collector.PushFn = async ( rawEvent: WalkerOS.DeepPartialEvent, options: Collector.PushOptions = {}, ) => { - let event = rawEvent; let pendingRespond: Promise | undefined; - // Resolve before chain (static or conditional) + // Resolve before chain (static or conditional). + // Single-id results walk static `.next` links; multi-id results are + // explicit chains (fan-out from `many` is handled by the engine). const beforeChain = staticBeforeChain ?? - (compiledBefore - ? walkChain( - resolveNext(compiledBefore, buildCacheContext(currentIngest))!, - extractTransformerNextMap(collector.transformers), - ) + (before !== undefined + ? (() => { + const ids = getNextSteps(before, buildCacheContext(currentIngest)); + if (ids.length === 0) return []; + const start = ids.length === 1 ? ids[0] : ids; + return walkChain( + start, + extractTransformerNextMap(collector.transformers), + ); + })() : []); + // The before chain may fan out (return an array of events). The cache + // check and destination push must run once per event so fan-out is + // preserved end-to-end. Cache logic is request-scoped (keyed by + // `currentIngest`), so it lives outside the loop. The actual pipeline + // (preChain + collector.push) runs inside the loop, once per event. + let events: WalkerOS.DeepPartialEvent[] = [rawEvent]; + // Run source.before chain (consent-exempt, pre-source preprocessing) if ( beforeChain.length > 0 && @@ -126,7 +161,7 @@ export async function initSource( collector, collector.transformers, beforeChain, - event, + rawEvent, currentIngest, currentRespond, `source.${sourceId}.before`, @@ -134,11 +169,17 @@ export async function initSource( if (beforeResult.event === null) { return { ok: true } as Elb.PushResult; } + // Pipeline-halt signal from a `cache.stop: true` HIT inside the + // source.before chain. Do NOT invoke collector.push — drop the event + // before it enters the collector pipeline. + if (beforeResult.stopped) { + if (beforeResult.respond) currentRespond = beforeResult.respond; + return { ok: true } as Elb.PushResult; + } if (beforeResult.respond) currentRespond = beforeResult.respond; - // Before chains use first result if fan-out occurred - event = Array.isArray(beforeResult.event) - ? beforeResult.event[0] - : beforeResult.event; + events = Array.isArray(beforeResult.event) + ? beforeResult.event + : [beforeResult.event]; } // Source cache check (full=true by default for sources) @@ -150,13 +191,13 @@ export async function initSource( compiledSourceCache, cacheStore, cacheContext, - `s:${sourceId}`, + // no per-step prefix — cache keys honor user-provided namespace only ); if (cacheResult) { if (cacheResult.status === 'HIT' && cacheResult.value !== undefined) { - if (compiledSourceCache.full) { - // full=true (default): respond with cached value, skip pipeline + if (compiledSourceCache.stop) { + // stop=true (default): respond with cached value, skip pipeline let respondValue: unknown = cacheResult.value; if (cacheResult.rule.update) { respondValue = await applyUpdate( @@ -169,15 +210,15 @@ export async function initSource( currentRespond?.(respondValue as Record); return { ok: true } as Elb.PushResult; } - // full=false: cached value unused — HIT signals "seen before", pipeline continues + // stop=false: cached value unused — HIT signals "seen before", pipeline continues } if ( cacheResult.status === 'MISS' && - compiledSourceCache.full && + compiledSourceCache.stop && currentRespond ) { - // full=true MISS: wrap respond to intercept and cache the value. + // stop=true MISS: wrap respond to intercept and cache the value. // Store original in cache, then apply update rules with MISS // status before responding (mirrors HIT path which applies // with HIT status). @@ -218,32 +259,104 @@ export async function initSource( currentRespond = missRespond; } - // full=false MISS: store sentinel so subsequent requests get a HIT - if (cacheResult.status === 'MISS' && !compiledSourceCache.full) { + // stop=false MISS: store sentinel so subsequent requests get a HIT + if (cacheResult.status === 'MISS' && !compiledSourceCache.stop) { storeCache(cacheStore, cacheResult.key, true, cacheResult.rule.ttl); } } } } - // Resolve chain: static (pre-computed) or conditional (per-event) - const preChain = - staticPreChain ?? - (compiledNext - ? walkChain( - resolveNext(compiledNext, buildCacheContext(currentIngest)), - extractTransformerNextMap(collector.transformers), - ) - : []); - - const pushResult = await collector.push(event, { - ...options, - id: sourceId, - ingest: currentIngest, - respond: currentRespond, - mapping: config, - preChain, - }); + // Resolve chain: static (pre-computed) or conditional (per-event). + // Three dispatch shapes from `getNextSteps`: + // - [] → no route matched; passthrough to collector with no + // pre-chain. + // - ['x'] → walk static `.next` links from x and run as a single + // sequential subchain inside `collector.push`. + // - ['a','b',…] → `many` fan-out. Each id is an INDEPENDENT terminal + // subchain dispatched via its own `collector.push` call + // with a per-branch cloned ingest and `respond` cleared + // (no-respond-across-many doctrine, Task 4.2). Error + // isolation per branch via tryCatchAsync (Task 4.1). + // + // Note: a plain `next: ['a','b','c']` is `isStaticRoute` → pre-walked + // by `staticPreChain` as the legacy explicit sequential chain. Only + // `{ many: [...] }` reaches the multi-id branch here. + type Dispatch = + | { kind: 'single'; preChain: string[] } + | { kind: 'many'; branches: string[][] }; + + const dispatch: Dispatch = staticPreChain + ? { kind: 'single', preChain: staticPreChain } + : next !== undefined + ? (() => { + const ids = getNextSteps(next, buildCacheContext(currentIngest)); + if (ids.length === 0) + return { kind: 'single', preChain: [] } as Dispatch; + if (ids.length === 1) + return { + kind: 'single', + preChain: walkChain( + ids[0], + extractTransformerNextMap(collector.transformers), + ), + } as Dispatch; + return { + kind: 'many', + branches: ids.map((id) => + walkChain( + id, + extractTransformerNextMap(collector.transformers), + ), + ), + } as Dispatch; + })() + : ({ kind: 'single', preChain: [] } as Dispatch); + + // Push each event independently through the post-before pipeline. + // For non-fan-out (single event) this is a one-iteration loop and + // behaves exactly like the previous implementation. + let pushResult: Elb.PushResult = { ok: true } as Elb.PushResult; + for (const event of events) { + if (dispatch.kind === 'many') { + // `many` fan-out: each branch is an independent terminal flow. + // Per-branch ingest clone, no respond propagation, error isolation + // via tryCatchAsync. Branch results are awaited and discarded; + // currentRespond is NOT updated from any branch. + await Promise.all( + dispatch.branches.map((branchChain, idx) => + tryCatchAsync( + async () => + collector.push(event, { + ...options, + id: sourceId, + ingest: cloneIngest(currentIngest, `${sourceId}:${idx}`), + respond: undefined, + mapping: config, + preChain: branchChain, + }), + (err) => { + collector.logger + .scope('source:many') + .error(`many branch ${idx} failed`, { error: err }); + return { ok: true } as Elb.PushResult; + }, + )(), + ), + ); + // `many` is fan-out, not enrichment — surface a generic OK. + pushResult = { ok: true } as Elb.PushResult; + } else { + pushResult = await collector.push(event, { + ...options, + id: sourceId, + ingest: currentIngest, + respond: currentRespond, + mapping: config, + preChain: dispatch.preChain, + }); + } + } // Wait for any deferred MISS update work to land on the source's // respond sender before returning control to the source. This diff --git a/packages/collector/src/store-cache-wrapper.ts b/packages/collector/src/store-cache-wrapper.ts new file mode 100644 index 000000000..07f4099c3 --- /dev/null +++ b/packages/collector/src/store-cache-wrapper.ts @@ -0,0 +1,266 @@ +import type { Cache, Logger, Store } from '@walkeros/core'; +import { compileMatcher } from '@walkeros/core'; + +/** + * Options passed to `wrapStoreWithCache`. Pre-resolved by `initStores` phase + * 2 so the wrapper itself stays small and side-effect free at construction. + * + * - `cacheStore` is the store layer where cached values live. Defaults to + * the collector's `__cache` instance, but may be any other initialized + * store (e.g. a fs-backed cache for cross-process sharing). + * - `namespace` is the prefix prepended to every key written to the cache + * layer. Defaults to `storeId` when the user did not override + * `cache.namespace`. + * - `logger` is the collector's scoped logger, used for the best-effort + * warnings emitted when a cache-side write or delete fails. Optional only + * to keep test setups lightweight — production call sites pass + * `collector.logger`. + */ +export interface WrappedStoreOptions { + storeId: string; + cacheConfig: Cache.Cache; + cacheStore: Store.Instance; + namespace: string; + logger?: Logger.Instance; +} + +interface CompiledStoreCacheRule { + match: (context: Record) => boolean; + ttl: number; +} + +/** + * Per-wrapped-store observability counters. The `evictions_*` counters live on + * the underlying cache store (`createCacheStore` returns its own counters + * surface for the global `__cache`), so they are deliberately absent here. + * + * Semantics: + * - `hits` — `cacheStore.get` returned a defined value. + * - `misses` — cache returned undefined AND no in-flight Promise was joined + * (this caller is the one driving the backing fetch). + * - `populates` — the wrapper wrote into the cache after a backing MISS that + * returned a defined value AND matched a rule. + * - `writes` — every call to `wrapper.set`, regardless of cache outcome. + * - `deletes` — every call to `wrapper.delete`. + * - `inflight_dedups` — a get found an in-flight Promise on the same key and + * joined it instead of starting a new backing call. + */ +export interface WrappedStoreCounters { + hits: number; + misses: number; + populates: number; + writes: number; + deletes: number; + inflight_dedups: number; +} + +/** + * Public-facing extension of `Store.Instance` with the per-wrapper counter + * surface. Consumers that need observability (operator UIs, debug endpoints) + * cast to this type via `as WrappedStoreInstance`; everything else continues + * to see the canonical `Store.Instance` shape and stays decoupled from the + * wrapper's internals. + */ +export interface WrappedStoreInstance extends Store.Instance { + /** + * Snapshot accessor: returns a fresh copy of the counter map on every + * access. Mutating the returned object never affects internal state, so + * callers can serialize, diff, or send the snapshot freely. The returned + * object always carries every counter key, zero-initialized. + */ + readonly counters: WrappedStoreCounters; +} + +/** + * Wrap a backing `Store.Instance` with a read-through cache layer. + * + * Read semantics: + * 1. Probe the cache at `namespace:key`. Any non-undefined value is a HIT. + * 2. On MISS, delegate to `backing.get(key)`. + * 3. If the backing returned a defined value AND a rule matches the + * `{ key, value }` context, populate the cache with `rule.ttl * 1000` ms. + * Negative caching (caching `undefined`) is intentionally not supported. + * + * Write semantics (`set` / `delete`) follow the "cache is advisory" policy + * documented in `docs/plans/2026-05-13-store-cache-design.md` (Write path and + * error policy): + * - Backing first. If `backing.set`/`backing.delete` throws, the wrapper + * throws and the cache layer is never touched. The backing is the source + * of truth and its failures must surface to the caller. + * - Cache best-effort. After a successful backing write, attempt the cache + * write. A throwing cache layer is logged via `logger.warn` and swallowed + * so the wrapper still resolves successfully — the next read will MISS + * and re-populate. Failed cache deletes leave a stale entry that serves + * until TTL; the warning lets operators react. + */ +export function wrapStoreWithCache( + backing: Store.Instance, + opts: WrappedStoreOptions, +): WrappedStoreInstance { + const { cacheConfig, cacheStore, namespace, logger, storeId } = opts; + + // Closure-scoped counters. Mutated directly at each path; the public + // `counters` accessor on the returned instance returns a fresh shallow copy + // so external consumers cannot mutate internal state. + const counters: WrappedStoreCounters = { + hits: 0, + misses: 0, + populates: 0, + writes: 0, + deletes: 0, + inflight_dedups: 0, + }; + + // Pre-compile each rule's matcher once at wrap time. Rules without a `match` + // clause are treated as always-matching, mirroring the EventCacheRule + // helpers in `packages/core/src/cache.ts`. + const compiledRules: CompiledStoreCacheRule[] = cacheConfig.rules.map( + (rule) => ({ + match: rule.match ? compileMatcher(rule.match) : () => true, + ttl: rule.ttl, + }), + ); + + const prefixed = (key: string): string => `${namespace}:${key}`; + + function findMatchingRule( + key: string, + value: unknown, + ): CompiledStoreCacheRule | undefined { + // Store-cache context shape is `{ key, value? }` — no `ingest`. The value + // is omitted when the caller has not yet read from the backing (e.g. + // future write-path callers). + const ctx: Record = + value === undefined ? { key } : { key, value }; + return compiledRules.find((r) => r.match(ctx)); + } + + // Closure-scoped in-flight registry: N concurrent gets on the same cold key + // share one backing call. Keyed by the namespaced cache key so distinct + // backing keys never collide. The entry is removed in `finally` so a + // settled (resolved or rejected) Promise never lingers — a subsequent get + // either hits the now-populated cache or retries the backing. + const inFlight = new Map>(); + + return { + type: backing.type, + config: backing.config, + setup: backing.setup, + + // Snapshot accessor. Returning a fresh shallow copy on every read keeps + // the internal counter object un-aliased: consumers that store, diff, or + // serialize the snapshot cannot inadvertently mutate state. + get counters(): WrappedStoreCounters { + return { ...counters }; + }, + + async get(key: string): Promise { + const ns = prefixed(key); + const cached = await cacheStore.get(ns); + if (cached !== undefined) { + counters.hits++; + return cached; + } + + // Single-flight: if another caller is already fetching this key, join + // their Promise rather than starting a second backing call. + const existing = inFlight.get(ns); + if (existing) { + counters.inflight_dedups++; + return existing; + } + + // This caller drives the backing fetch — count the MISS once here so + // joined callers above are not double-counted as misses too. + counters.misses++; + + const promise = (async () => { + try { + const value = await backing.get(key); + if (value === undefined) return undefined; + + const rule = findMatchingRule(key, value); + if (rule) { + // Best-effort cache populate. Mirrors the Task 8 write-path + // policy: backing has already returned, so a throwing cache layer + // must not surface as an unhandled rejection on the shared + // Promise that other concurrent callers are awaiting. + try { + // `cache.ttl` is documented in seconds; the underlying cache + // store accepts ms. Multiply once at the boundary to keep the + // rest of the pipeline consistent with EventCache semantics. + await cacheStore.set(ns, value, rule.ttl * 1000); + // Count the populate only after the cache write resolves so a + // failed populate (logged below) does not inflate the counter. + counters.populates++; + } catch (error) { + warnCacheFailure('set', key, error); + } + } + return value; + } finally { + // Always release the slot — on resolve so the next read hits the + // now-populated cache, on reject so a transient backing failure + // doesn't freeze the key forever behind a dead Promise. + inFlight.delete(ns); + } + })(); + inFlight.set(ns, promise); + return promise; + }, + + async set(key: string, value: unknown, ttl?: number): Promise { + // Count every set the moment the wrapper is entered, before any IO. + // The counter reflects intent (how many writes the wrapper has been + // asked to perform), independent of backing or cache success. + counters.writes++; + + // Backing first. A throw here propagates: backing is the source of + // truth, callers must see real write failures. + await backing.set(key, value, ttl); + + const rule = findMatchingRule(key, value); + if (!rule) return; + + // Best-effort cache populate. Wrap only the cache-side call: backing + // errors above have already propagated, so this try/catch is scoped to + // the advisory layer. + try { + await cacheStore.set(prefixed(key), value, rule.ttl * 1000); + } catch (error) { + warnCacheFailure('set', key, error); + } + }, + + async delete(key: string): Promise { + // Mirrors `writes`: count intent at entry, before backing or cache IO. + counters.deletes++; + + // Backing first; same propagation rules as `set`. + await backing.delete(key); + + try { + await cacheStore.delete(prefixed(key)); + } catch (error) { + warnCacheFailure('delete', key, error); + } + }, + }; + + function warnCacheFailure( + op: 'set' | 'delete', + key: string, + error: unknown, + ): void { + const message = `store-cache(${storeId}): cache ${op} failed for "${key}"; backing succeeded, continuing`; + if (logger) { + logger.warn(message, { error }); + } else { + // Defensive fallback so unit tests that do not thread a logger still + // surface the failure rather than swallowing it silently. Production + // call sites in `store.ts` always pass `collector.logger`. + // eslint-disable-next-line no-console + console.warn(message, error); + } + } +} diff --git a/packages/collector/src/store.ts b/packages/collector/src/store.ts index 3f6aa0a7c..774bffbd3 100644 --- a/packages/collector/src/store.ts +++ b/packages/collector/src/store.ts @@ -1,10 +1,130 @@ -import type { Collector, Store } from '@walkeros/core'; +import type { Cache, Collector, Store } from '@walkeros/core'; import { useHooks } from '@walkeros/core'; +import { createCacheStore } from './cache-store'; +import { wrapStoreWithCache } from './store-cache-wrapper'; + +/** + * Narrowed view of a `Store.InitStore` entry that also carries the optional + * `cache` configuration emitted by the bundler. The runtime `Store.InitStores` + * map is loosely typed at the core level so it can carry pass-through fields + * (`cache`, `variables`, etc.) without coupling the core `Store.InitStore` + * shape to flow-level concerns. Phase 2 reads `cache` through this local view. + */ +type InitStoreWithCache = Store.InitStore & { + cache?: Cache.Cache; +}; + +/** + * Hook wrapping for a single store instance. Mutates `instance` in place. + * + * Called once per store, AFTER any cache wrapping in phase 2. Wrapping the + * outer (wrapper) instance means the hook observes the consumer-facing + * boundary: it fires on every `wrapped.get` regardless of cache HIT/MISS, + * and only once per `wrapped.set` (not also for the wrapper's internal + * write into `cacheStore`). If the store has no cache wrapper, the bare + * backing is hook-wrapped instead, preserving observability. + */ +function applyStoreHooks( + collector: Collector.Instance, + instance: Store.Instance, +): void { + const originalGet = instance.get; + const originalSet = instance.set; + const originalDelete = instance.delete; + + instance.get = useHooks( + originalGet, + 'StoreGet', + collector.hooks, + collector.logger, + ); + instance.set = useHooks( + originalSet, + 'StoreSet', + collector.hooks, + collector.logger, + ); + instance.delete = useHooks( + originalDelete, + 'StoreDelete', + collector.hooks, + collector.logger, + ); +} + +/** + * Walks the `cache.store` graph in topological order (terminals first) and + * reports each store id together with its cache config. Detects cycles via + * three-color DFS (WHITE → GRAY → BLACK) and rejects references to unknown + * store ids. Throws on the first problem with a message naming the path. + * + * The returned order is suitable for wrapping: when a wrapper is built for + * store X, its `cache.store` target (if any) has already been wrapped. + */ +function topoOrderForCacheWrap( + defs: Record, +): string[] { + type Color = 'WHITE' | 'GRAY' | 'BLACK'; + const color: Record = {}; + for (const id of Object.keys(defs)) color[id] = 'WHITE'; + + const order: string[] = []; + const stack: string[] = []; + + function visit(id: string): void { + const c = color[id]; + if (c === 'BLACK') return; + if (c === 'GRAY') { + const cycleStart = stack.indexOf(id); + const cyclePath = stack + .slice(cycleStart === -1 ? 0 : cycleStart) + .concat(id) + .join(' -> '); + throw new Error(`Cycle in cache.store chain: ${cyclePath}`); + } + + color[id] = 'GRAY'; + stack.push(id); + + const target = defs[id].cache?.store; + if (target !== undefined) { + if (!(target in defs)) { + throw new Error( + `Store "${id}" cache.store references "${target}", which is not declared in flow.stores`, + ); + } + visit(target); + } + + stack.pop(); + color[id] = 'BLACK'; + order.push(id); + } + + for (const id of Object.keys(defs)) { + if (color[id] === 'WHITE') visit(id); + } + + return order; +} /** * Initialize store instances from configuration. - * Stores are the simplest init of all component types: - * no chains, no lazy init, no push handlers. + * + * Three-phase init: + * Phase 1, instantiate: call `code(context)` for every declared store. + * Order is not significant in this phase. Hooks are NOT installed yet — + * they wrap the outer boundary in phase 3. + * Phase 2, topologically wrap: walk the `cache.store` graph, detect cycles + * and unknown targets, then visit terminals first so any cache wrapper + * installed in Task 7+ can rely on its backing being already wrapped. + * Phase 3, install hooks: wrap the final instance (wrapper if cache was + * applied, otherwise the bare backing) so hooks fire at the consumer + * boundary and observe cache HIT/MISS behavior. + * + * Phase 2 must run before `resolveStoreReferences` in `collector.ts` so that + * env-reference replacement uses the wrapped instance (referential identity + * matters for the resolver). */ export async function initStores( collector: Collector.Instance, @@ -12,6 +132,9 @@ export async function initStores( ): Promise { const result: Store.Stores = {}; + // Phase 1: instantiate every store. Hooks are deferred to phase 3 so they + // can wrap the outer (cache-wrapped) instance and observe HIT/MISS at the + // consumer-facing boundary. for (const [storeId, storeDef] of Object.entries(initStores)) { const { code, config = {}, env = {} } = storeDef; @@ -26,32 +149,74 @@ export async function initStores( }; const instance = await code(context); + result[storeId] = instance; + } - // Wrap store operations with hooks for pre/post interception - const originalGet = instance.get; - const originalSet = instance.set; - const originalDelete = instance.delete; - - instance.get = useHooks( - originalGet, - 'StoreGet', - collector.hooks, - collector.logger, - ); - instance.set = useHooks( - originalSet, - 'StoreSet', - collector.hooks, - collector.logger, - ); - instance.delete = useHooks( - originalDelete, - 'StoreDelete', - collector.hooks, - collector.logger, - ); + // Phase 2: validate the cache.store graph and wrap in topological order. + // Cycle and missing-target errors propagate out of `topoOrderForCacheWrap`. + // Read-through wrapping is delegated to `wrapStoreWithCache`. The cache + // layer is either a user-declared store (resolved against the in-progress + // `result` map) or the default `__cache`, which is created lazily here so + // it ends up assigned to `collector.stores` together with the rest. + const defsWithCache = initStores as Record; + const order = topoOrderForCacheWrap(defsWithCache); + for (const storeId of order) { + const cacheConfig = defsWithCache[storeId].cache; + if (!cacheConfig) continue; - result[storeId] = instance; + let cacheStore: Store.Instance; + let cacheStoreId: string; + if (cacheConfig.store !== undefined) { + // Missing-target validation already ran in `topoOrderForCacheWrap`, so + // this lookup is guaranteed to hit. + cacheStore = result[cacheConfig.store]; + cacheStoreId = cacheConfig.store; + } else { + if (!result.__cache) { + result.__cache = createCacheStore(); + } + cacheStore = result.__cache; + cacheStoreId = '__cache'; + } + + // Schema rejects `namespace: ""` for store caches, so the only way the + // wrapper sees an absent namespace is when the user omitted it entirely. + // In that case default to the host store id so multiple wrapped stores + // sharing `__cache` cannot collide on raw keys. + const resolvedNamespace = cacheConfig.namespace ?? storeId; + + // One startup log line per wrapped store. Operators inspecting the cache + // layer see prefixed keys (e.g. `api:K`); surfacing the resolved namespace + // and cache-store id here keeps that defaulting from feeling like hidden + // magic. Scope mirrors the wrapper's own scope (Task 8) so all + // cache-related output groups under `store-cache:`. + collector.logger + .scope('store-cache') + .scope(storeId) + .info( + `store "${storeId}" caches with namespace "${resolvedNamespace}:" via ${cacheStoreId}`, + ); + + result[storeId] = wrapStoreWithCache(result[storeId], { + storeId, + cacheConfig, + cacheStore, + namespace: resolvedNamespace, + logger: collector.logger.scope('store-cache').scope(storeId), + }); + } + + // Phase 3: install hooks on the final instance for every user-declared + // store. Wrapping the OUTER instance (wrapper if a cache was applied, + // bare backing otherwise) means the hook fires at the consumer-facing + // boundary and observes cache HIT/MISS. The auto-created default + // `__cache` is skipped — it has no consumer-facing contract; users never + // call `__cache.get` directly. Skipping it also prevents the wrapper's + // internal writes into the default cache from double-firing + // `preStoreSet` against the consumer-facing boundary. + for (const [storeId, instance] of Object.entries(result)) { + if (storeId === '__cache') continue; + applyStoreHooks(collector, instance); } return result; diff --git a/packages/collector/src/transformer.ts b/packages/collector/src/transformer.ts index 10e33304e..bd1a3c988 100644 --- a/packages/collector/src/transformer.ts +++ b/packages/collector/src/transformer.ts @@ -31,19 +31,25 @@ * - Transformer returns void → continue with unchanged event * - Transformer returns event → continue with modified event */ -import type { Collector, Transformer, WalkerOS, Ingest } from '@walkeros/core'; +import type { + Cache, + Collector, + Transformer, + WalkerOS, + Ingest, +} from '@walkeros/core'; import { createIngest, isObject, tryCatchAsync, useHooks, - compileNext, - resolveNext, - isRouteArray, + getNextSteps, compileCache, checkCache, storeCache, buildCacheContext, + validateTransformerEntry, + processEventMapping, } from '@walkeros/core'; import { getCacheStore } from './cache'; @@ -63,8 +69,17 @@ export function extractTransformerNextMap( const result: Record = {}; for (const [id, transformer] of Object.entries(transformers)) { const next = transformer.config?.next; - if (next && !isRouteArray(next)) { + // Static shapes are recorded for synchronous chain walking. + // Conditional shapes (RouteConfig, mixed arrays) resolve per-event via + // getNextSteps at dispatch time; they get an empty entry here so the + // chain walker stops at this hop rather than following a stale link. + if (typeof next === 'string') { result[id] = { next }; + } else if ( + Array.isArray(next) && + next.every((entry) => typeof entry === 'string') + ) { + result[id] = { next: next as string[] }; } else { result[id] = {}; } @@ -183,6 +198,19 @@ export async function initTransformers( )) { const { code, env = {} } = transformerDef; + // Validate the entry via the shared predicate. A code-less entry must + // declare at least one operative field (package, before, next, cache, + // mapping). Unknown keys and code+package conflicts are also rejected. + const validation = validateTransformerEntry( + transformerDef as unknown as Record, + ); + if (!validation.ok) { + collector.logger.warn( + `Transformer ${transformerId} invalid (${validation.code}): ${validation.reason}. Skipping.`, + ); + continue; + } + // Use unified chain property extractor for both before and next const { config: configWithBefore } = extractChainProperty( transformerDef, @@ -218,8 +246,98 @@ export async function initTransformers( env: env as Transformer.Env, }; + // Synthesize a passthrough instance when `code` is absent. + // This makes the entry a "pass" — a named, code-less hop. Two flavors: + // 1. mapping-aware: when `mapping` is declared, the synthesized push + // runs `processEventMapping` and forwards the transformed event + // (or drops it when a rule has `ignore: true`). + // 2. plain passthrough: when only `before` / `next` / `cache` are + // declared, the push returns the event unchanged. + const codeFn = + code ?? + ((ctx: Transformer.Context) => { + const stepMapping = transformerDef.mapping; + if (stepMapping) { + // Warn once per init if vendor-payload fields are present at the + // transformer position. Only event-mutating fields apply here. + // Note: `MappingConfig` has no top-level `silent` field — that + // lives on `Rule` only, so the config-level check is `data` only. + const meaninglessFields: string[] = []; + if (stepMapping.data !== undefined) meaninglessFields.push('data'); + // Walk rules for per-rule data/silent + if (stepMapping.mapping) { + for (const [entity, actions] of Object.entries( + stepMapping.mapping, + )) { + if (typeof actions !== 'object' || actions === null) continue; + for (const [action, rule] of Object.entries( + actions as Record, + )) { + if (typeof rule !== 'object' || rule === null) continue; + const r = rule as Record; + if (r.data !== undefined) + meaninglessFields.push(`mapping[${entity}][${action}].data`); + if (r.silent !== undefined) + meaninglessFields.push( + `mapping[${entity}][${action}].silent`, + ); + } + } + } + if (meaninglessFields.length > 0) { + ctx.collector.logger.warn( + `Transformer ${transformerId}: \`${meaninglessFields.join(', ')}\` ignored at transformer position (only event-mutating fields apply).`, + ); + } + + return { + type: 'pass', + config: ctx.config, + push: async (event: WalkerOS.DeepPartialEvent) => { + const r = await processEventMapping( + event, + stepMapping, + ctx.collector, + ); + if (r.ignore) return false; + return { event: r.event }; + }, + }; + } + return { + type: 'pass', + config: ctx.config, + push: (event: WalkerOS.DeepPartialEvent) => ({ event }), + }; + }); + // Initialize the transformer instance with context - const instance = await code(context); + const instance = await codeFn(context); + + // Bug 2 fix: propagate def-level before/next to instance.config when + // not already set by the code function. The recursive chain walker + // reads instance.config.before; for synthesized pass-throughs and + // well-behaved user code that returns a fresh config object, the + // def-level value needs to land on instance.config explicitly. + // User-supplied code that sets its own config.before is preserved. + if ( + transformerDef.before !== undefined && + instance.config?.before === undefined + ) { + instance.config = { + ...(instance.config ?? {}), + before: transformerDef.before, + }; + } + if ( + transformerDef.next !== undefined && + instance.config?.next === undefined + ) { + instance.config = { + ...(instance.config ?? {}), + next: transformerDef.next, + }; + } result[transformerId] = instance; } @@ -334,24 +452,26 @@ export async function transformerPush( } /** - * Resolve a `RouteSpec` (string, string[], or Route[]) to the static form - * the downstream walkChain consumer understands. Used at every site inside - * `runTransformerChain` that accepts a route spec from config or transformer - * result (transformer.config.before, fork result.next, unified result.next). + * Clone an ingest for an independent branch (e.g. a `many` fan-out branch). + * + * Each branch needs its own `_meta.path` so cycle protection and the + * MAX_PATH_LENGTH safety valve operate per-branch rather than colliding + * across sibling forks. The top-level object and `_meta` are shallow-copied; + * `_meta.path` is duplicated so appends in one branch do not leak into others. * - * Returns `undefined` when the spec is absent, or when a Route[] evaluated - * against the given context produced no match. Callers treat undefined as - * "no static target" (either skip the chain or fall through to passthrough, - * depending on the call site). + * `branchId` is reserved for future per-branch labelling (Task 4.1) and is + * not currently written into `_meta`; it is accepted now so callers don't + * need to change their call sites when error-isolation lands. */ -function resolveRouteSpec( - spec: Transformer.RouteSpec | undefined, - ctx: Record, -): string | string[] | undefined { - if (!spec) return undefined; - if (typeof spec === 'string') return spec; - if (Array.isArray(spec) && !isRouteArray(spec)) return spec; - return resolveNext(compileNext(spec), ctx) ?? undefined; +export function cloneIngest( + ingest: Ingest | undefined, + branchId: string, +): Ingest { + if (!ingest) return createIngest(branchId); + return { + ...ingest, + _meta: { ...ingest._meta, path: [...ingest._meta.path] }, + }; } /** @@ -375,7 +495,16 @@ export async function runTransformerChain( ): Promise { const MAX_PATH_LENGTH = 256; - if (chainContext && ingest?._meta) { + // Ensure an ingest exists so the per-branch path budget engages + // regardless of caller. Production callers (source/push/destination) + // always pass one; this guards direct test invocations and any future + // entrypoint that omits it. Without an ingest, the safety valve below + // can never trip — leaving cyclic `many` graphs unbounded. + if (!ingest) { + ingest = createIngest(chain[0] ?? 'chain'); + } + + if (chainContext && ingest._meta) { ingest._meta.chainPath = chainContext; } @@ -440,8 +569,12 @@ export async function runTransformerChain( continue; } - // Compile transformer cache once (reused for HIT check and MISS store) - const tCacheConfig = transformer.config?.cache; + // Compile transformer cache once (reused for HIT check and MISS store). + // Transformer caches operate on events (step-level HIT/MISS keyed by event + // fields), so the rule shape is always EventCacheRule, not StoreCacheRule. + const tCacheConfig = transformer.config?.cache as + | Cache.Cache + | undefined; const compiledTCache = tCacheConfig ? compileCache(tCacheConfig) : undefined; @@ -453,18 +586,20 @@ export async function runTransformerChain( let cacheMiss: { key: string; ttl: number } | undefined; if (compiledTCache && tCacheStore) { const cacheContext = buildCacheContext(ingest, processedEvent); - const cacheResult = checkCache( - compiledTCache, - tCacheStore, - cacheContext, - `t:${transformerName}`, - ); + const cacheResult = checkCache(compiledTCache, tCacheStore, cacheContext); if (cacheResult?.status === 'HIT' && cacheResult.value) { processedEvent = cacheResult.value as WalkerOS.DeepPartialEvent; - if (compiledTCache.full) - return { event: processedEvent, respond: currentRespond }; // full=true → stop chain - continue; // full=false → next transformer + if (compiledTCache.stop) + // stop=true → stop chain AND halt pipeline at this position. + // Caller branches on `stopped` to skip downstream stages + // (collector.push, destinations); see push.ts and source.ts. + return { + event: processedEvent, + respond: currentRespond, + stopped: true, + }; + continue; // stop=false → next transformer } if (cacheResult?.status === 'MISS') { @@ -472,39 +607,94 @@ export async function runTransformerChain( } } - // Run transformer.before chain if configured + // Run transformer.before chain if configured. + // + // Dispatch uses `getNextSteps`: + // - [] → no route matched; skip the before chain (passthrough). + // - ['x'] → sequential continuation; walk static .next links from x + // and run as a single subchain. Preserves cache.stop and + // null/respond propagation from the nested chain. + // - ['a','b',...] → `many` fan-out. Each branch is an independent + // terminal subchain with a cloned ingest (per-branch + // cycle protection). No merge: many is fan-out, not + // enrichment, so parent processedEvent is unchanged. + // Per-branch error isolation lands in Task 4.1; + // respond suppression lands in Task 4.2. const transformerBefore = transformer.config.before; if (transformerBefore) { - const beforeStartId = resolveRouteSpec( + const beforeIds = getNextSteps( transformerBefore, buildCacheContext(ingest, processedEvent), ); - - const beforeChainIds = walkChain( - beforeStartId, - extractTransformerNextMap(transformers), - ); - - if (beforeChainIds.length > 0) { - const beforeResult = await runTransformerChain( - collector, - transformers, - beforeChainIds, - processedEvent, - ingest, - currentRespond, - chainContext, + if (beforeIds.length === 1) { + const beforeChainIds = walkChain( + beforeIds[0], + extractTransformerNextMap(transformers), ); - if (beforeResult.event === null) - return { - event: null, - respond: beforeResult.respond ?? currentRespond, - }; // Before chain stopped - if (beforeResult.respond) currentRespond = beforeResult.respond; - // Before chains use first result if fan-out occurred - processedEvent = Array.isArray(beforeResult.event) - ? beforeResult.event[0] - : beforeResult.event; + if (beforeChainIds.length > 0) { + const beforeResult = await runTransformerChain( + collector, + transformers, + beforeChainIds, + processedEvent, + ingest, + currentRespond, + chainContext, + ); + if (beforeResult.event === null) + return { + event: null, + respond: beforeResult.respond ?? currentRespond, + }; // Before chain stopped + // Propagate pipeline-halt from a nested `cache.stop: true` HIT in + // the before chain. The outer caller (push.ts / source.ts) drops + // the event before destinations see it. + if (beforeResult.stopped) { + return { + event: Array.isArray(beforeResult.event) + ? beforeResult.event[0] + : beforeResult.event, + respond: beforeResult.respond ?? currentRespond, + stopped: true, + }; + } + if (beforeResult.respond) currentRespond = beforeResult.respond; + // Before chains use first result if fan-out occurred + processedEvent = Array.isArray(beforeResult.event) + ? beforeResult.event[0] + : beforeResult.event; + } + } else if (beforeIds.length > 1) { + // many: independent terminal subchains. Each branch walks to its own + // exit with a per-branch ingest clone. Per-branch error isolation + // (Task 4.1): wrap each branch dispatch in `tryCatchAsync` so a + // throw in one branch (init failure, unforeseen runtime error) does + // not reject the surrounding `Promise.all` and starve siblings. + // No-respond-across-many: respond ownership cannot be unambiguously + // assigned when one inbound request fans out to N terminal flows. + // Branch dispatch passes `undefined` instead of `currentRespond`, and + // branch results are awaited and discarded — currentRespond is NOT + // updated from any branch's wrapped respond. + await Promise.all( + beforeIds.map((id) => + tryCatchAsync(runTransformerChain, (err) => { + collector.logger + .scope('transformer:many') + .error(`many branch ${id} failed`, { error: err }); + return { event: null, respond: undefined }; + })( + collector, + transformers, + walkChain(id, extractTransformerNextMap(transformers)), + processedEvent, + cloneIngest(ingest, id), + undefined, + chainContext, + ), + ), + ); + // No merge: many is fan-out, not enrichment. Parent processedEvent + // unchanged. } } @@ -537,22 +727,36 @@ export async function runTransformerChain( result.map(async (forkResult) => { const forkEvent = forkResult.event || processedEvent; // Clone ingest per fork to prevent cross-fork contamination - const forkIngest: Ingest = ingest - ? { - ...ingest, - _meta: { ...ingest._meta, path: [...ingest._meta.path] }, - } - : createIngest('unknown'); + const forkIngest = cloneIngest(ingest, 'unknown'); if (forkResult.next) { - // Fork has explicit routing - const resolvedNext = resolveRouteSpec( + // Fork has explicit routing. Dispatch uses `getNextSteps`: + // - [] → no route matched; passthrough this fork's + // event without entering any subchain (fork + // has explicit routing, so we do NOT fall + // through to remainingChain). + // - ['x'] → walk static .next from x and run that as a + // single subchain. Preserves the existing + // "fork has explicit routing terminates the + // main chain at this branch" semantic — the + // subchain's ChainResult is this fork's + // result. + // - ['a','b',...] → `many` fan-out. Each id dispatches as its + // own terminal subchain with a per-branch + // cloned ingest. Returns an array of + // ChainResults; the outer `.flat()` in the + // aggregation loop folds them into the + // surrounding flatEvents collection. + const forkIds = getNextSteps( forkResult.next, buildCacheContext(forkIngest, forkEvent), ); - if (resolvedNext) { + if (forkIds.length === 0) { + return { event: forkEvent, respond: currentRespond }; + } + if (forkIds.length === 1) { const branchedChain = walkChain( - resolvedNext, + forkIds[0], extractTransformerNextMap(transformers), ); if (branchedChain.length > 0) { @@ -566,8 +770,48 @@ export async function runTransformerChain( chainContext, ); } + return { event: forkEvent, respond: currentRespond }; } - return { event: forkEvent, respond: currentRespond }; + // Terminal fan-out. Each branch walks to its own exit with a + // per-branch ingest clone. Per-branch error isolation + // (Task 4.1): wrap each branch dispatch in `tryCatchAsync` so a + // throw in one branch does not reject the surrounding + // `Promise.all` and starve siblings. + // No-respond-across-many: respond ownership cannot be unambiguously + // assigned when one inbound request fans out to N terminal flows. + // Branches are dispatched with `respond: undefined`, and the + // ChainResults returned to the outer aggregation are stripped of + // any branch-internal respond so the outer fork's combined result + // never propagates a branch's wrapped respond back to the caller. + const branchResults = await Promise.all( + forkIds.map((id) => + tryCatchAsync(runTransformerChain, (err) => { + collector.logger + .scope('transformer:many') + .error(`many branch ${id} failed`, { error: err }); + return { event: null, respond: undefined }; + })( + collector, + transformers, + walkChain(id, extractTransformerNextMap(transformers)), + forkEvent, + cloneIngest(forkIngest, id), + undefined, + chainContext, + ), + ), + ); + // Strip per-branch side-channels (respond, stopped) at the many + // boundary. The outer aggregation only learns about events from + // branch ChainResults; respond and stopped are branch-internal + // concerns and must not leak back to the surrounding fork's + // combined result. + return branchResults.map( + (br): Transformer.ChainResult => ({ + event: br.event, + respond: undefined, + }), + ); } // Fork continues through remaining chain @@ -617,40 +861,88 @@ export async function runTransformerChain( currentRespond = resultRespond; } - // Handle chain branching - if (next) { - const resolvedNext = resolveRouteSpec( + // Handle chain branching. + // + // Dispatch uses `getNextSteps`: + // - [] → no route matched; passthrough (continue main chain + // with resultEvent if provided). + // - ['x'] → walk static .next from x and run that as a single + // subchain. The branched subchain's ChainResult + // becomes this transformer's final result; the main + // chain terminates here (explicit routing wins). + // - ['a','b',...] → `many` fan-out. Terminal: each branch dispatches + // as its own subchain with a per-branch ingest + // clone. Main chain terminates here. Per-branch + // error isolation arrives in Task 4.1; respond + // suppression in 4.2. + if (next !== undefined) { + const nextIds = getNextSteps( next, buildCacheContext(ingest, processedEvent), ); - if (!resolvedNext) { + if (nextIds.length === 0) { // No route matched → passthrough (continue chain) if (resultEvent) processedEvent = resultEvent; continue; } - - const branchedChain = walkChain( - resolvedNext, - extractTransformerNextMap(transformers), - ); - - if (branchedChain.length > 0) { - return runTransformerChain( - collector, - transformers, - branchedChain, - resultEvent || processedEvent, - ingest, - currentRespond, - chainContext, + if (nextIds.length === 1) { + const branchedChain = walkChain( + nextIds[0], + extractTransformerNextMap(transformers), + ); + if (branchedChain.length > 0) { + return runTransformerChain( + collector, + transformers, + branchedChain, + resultEvent || processedEvent, + ingest, + currentRespond, + chainContext, + ); + } + // Branch target not found — drop event (fail-safe). + collector.logger.warn( + `Branch target not found: ${JSON.stringify(next)}`, ); + return { event: null, respond: currentRespond }; } - - // Branch target not found — drop event (fail-safe). - collector.logger.warn( - `Branch target not found: ${JSON.stringify(next)}`, + // many: terminal fan-out. Main chain terminates here. Per-branch + // error isolation (Task 4.1): wrap each branch dispatch in + // `tryCatchAsync` so a throw in one branch does not reject the + // surrounding `Promise.all` and starve siblings. + // No-respond-across-many: respond ownership cannot be unambiguously + // assigned when one inbound request fans out to N terminal flows. + // Branches are dispatched with `respond: undefined`, branch results + // are awaited and discarded, and the outer return has + // `respond: undefined` so the parent caller (source) sees no + // wrapped respond. + // No-stopped-across-many (Task 4.2 / regression-guarded by Task 4.3): + // branch results — including any `stopped: true` from a nested + // `cache.stop` HIT inside one branch — are discarded here. The outer + // return omits `stopped`, so a cache.stop HIT in one branch does NOT + // halt sibling branches. See the regression test + // `transformer.test.ts > many: cache.stop in one branch does not + // halt sibling branches`. + await Promise.all( + nextIds.map((id) => + tryCatchAsync(runTransformerChain, (err) => { + collector.logger + .scope('transformer:many') + .error(`many branch ${id} failed`, { error: err }); + return { event: null, respond: undefined }; + })( + collector, + transformers, + walkChain(id, extractTransformerNextMap(transformers)), + resultEvent || processedEvent, + cloneIngest(ingest, id), + undefined, + chainContext, + ), + ), ); - return { event: null, respond: currentRespond }; + return { event: null, respond: undefined }; } // Update event if provided @@ -665,21 +957,37 @@ export async function runTransformerChain( storeCache(tCacheStore, cacheMiss.key, processedEvent, cacheMiss.ttl); } - // If transformer didn't return { next } but has Route[] config.next, resolve it + // If transformer didn't return { next } but has a conditional + // config.next (one / gate / sequence / many), resolve it per-request + // via `getNextSteps`. Static (string / string[]) chains are wired + // statically via the next-map and pre-baked into `chain` by the + // caller (or by `walkChain` when an explicit chain array is passed); + // re-dispatching them here would override an explicit caller chain. + // + // Dispatch (conditional variants only): + // - [] → no match; chain ends here (passthrough). + // - ['x'] → continue main chain via static walk from x. + // - ['a','b',...] → `many` fan-out. Terminal: each branch dispatches + // as its own subchain with a per-branch ingest + // clone. Main chain terminates here. + const configNext = transformer.config.next; + const isStaticConfigNext = + typeof configNext === 'string' || + (Array.isArray(configNext) && + configNext.every((entry) => typeof entry === 'string')); + const isConditionalConfigNext = + configNext !== undefined && !isStaticConfigNext; if ( (!result || (typeof result === 'object' && !result.next)) && - transformer.config.next && - isRouteArray(transformer.config.next) + isConditionalConfigNext ) { - const configNext = transformer.config.next; - const compiledConfigNext = compileNext(configNext); - const resolvedConfigNext = resolveNext( - compiledConfigNext, + const configNextIds = getNextSteps( + transformer.config.next, buildCacheContext(ingest, processedEvent), ); - if (resolvedConfigNext) { + if (configNextIds.length === 1) { const continuationChain = walkChain( - resolvedConfigNext, + configNextIds[0], extractTransformerNextMap(transformers), ); if (continuationChain.length > 0) { @@ -693,8 +1001,41 @@ export async function runTransformerChain( chainContext, ); } + // Target not found → chain ends here (passthrough) + return { event: processedEvent, respond: currentRespond }; + } + if (configNextIds.length > 1) { + // many: terminal fan-out. Main chain terminates here. Per-branch + // error isolation (Task 4.1): wrap each branch dispatch in + // `tryCatchAsync` so a throw in one branch does not reject the + // surrounding `Promise.all` and starve siblings. + // No-respond-across-many: respond ownership cannot be unambiguously + // assigned when one inbound request fans out to N terminal flows. + // Branches are dispatched with `respond: undefined`, branch results + // are awaited and discarded, and the outer return has + // `respond: undefined` so the parent caller (source) sees no + // wrapped respond. + await Promise.all( + configNextIds.map((id) => + tryCatchAsync(runTransformerChain, (err) => { + collector.logger + .scope('transformer:many') + .error(`many branch ${id} failed`, { error: err }); + return { event: null, respond: undefined }; + })( + collector, + transformers, + walkChain(id, extractTransformerNextMap(transformers)), + processedEvent, + cloneIngest(ingest, id), + undefined, + chainContext, + ), + ), + ); + return { event: null, respond: undefined }; } - // No match → chain ends here (passthrough to collector/destination) + // configNextIds.length === 0: no match → chain ends here return { event: processedEvent, respond: currentRespond }; } } diff --git a/packages/core/src/__tests__/cache-types.test.ts b/packages/core/src/__tests__/cache-types.test.ts new file mode 100644 index 000000000..2c53d66db --- /dev/null +++ b/packages/core/src/__tests__/cache-types.test.ts @@ -0,0 +1,19 @@ +import type { Cache, EventCacheRule, StoreCacheRule } from '../types/cache'; + +// Compile-time assertions: these should fail TS until the union exists. +const _eventOk: Cache = { + rules: [{ key: ['event.id'], ttl: 60 }], +}; + +const _storeOk: Cache = { + rules: [{ ttl: 60 }], +}; + +const _storeBad: Cache = { + // @ts-expect-error -- update is not allowed in StoreCacheRule + rules: [{ ttl: 60, update: { foo: 'bar' } }], +}; + +it('compiles', () => { + expect(true).toBe(true); +}); diff --git a/packages/core/src/__tests__/cache.test.ts b/packages/core/src/__tests__/cache.test.ts index 594a6136d..b617fd263 100644 --- a/packages/core/src/__tests__/cache.test.ts +++ b/packages/core/src/__tests__/cache.test.ts @@ -42,24 +42,65 @@ describe('compileCache', () => { it('preserves store reference', () => { const compiled = compileCache({ store: 'redis', - rules: [{ match: '*', key: ['ingest.path'], ttl: 60 }], + rules: [{ key: ['ingest.path'], ttl: 60 }], }); expect(compiled.storeId).toBe('redis'); }); - it('defaults full to false', () => { + it('defaults stop to false', () => { const compiled = compileCache({ - rules: [{ match: '*', key: ['ingest.path'], ttl: 60 }], + rules: [{ key: ['ingest.path'], ttl: 60 }], }); - expect(compiled.full).toBe(false); + expect(compiled.stop).toBe(false); }); - it('preserves full flag', () => { + it('preserves stop flag', () => { const compiled = compileCache({ - full: true, - rules: [{ match: '*', key: ['ingest.path'], ttl: 60 }], + stop: true, + rules: [{ key: ['ingest.path'], ttl: 60 }], }); - expect(compiled.full).toBe(true); + expect(compiled.stop).toBe(true); + }); + + it('uses configured namespace when present', () => { + const store = createMockStore(); + const compiled = compileCache({ + namespace: 'x', + rules: [{ key: ['ingest.path'], ttl: 60 }], + }); + const result = checkCache(compiled, store, { + ingest: { path: '/api/data' }, + }); + + expect(result).toBeDefined(); + expect(result!.key).toBe('x:/api/data'); + }); + + it('writes keys directly without prefix when namespace omitted and runtime namespace omitted', () => { + const store = createMockStore(); + const compiled = compileCache({ + rules: [{ key: ['ingest.path'], ttl: 60 }], + }); + const result = checkCache(compiled, store, { + ingest: { path: '/api/data' }, + }); + + expect(result).toBeDefined(); + expect(result!.key).toBe('/api/data'); + }); + + it('treats missing match as always-match', () => { + const store = createMockStore(); + const compiled = compileCache({ + rules: [{ key: ['ingest.path'], ttl: 60 }], + }); + const result = checkCache(compiled, store, { + ingest: { path: '/api/data' }, + }); + + expect(result).toBeDefined(); + expect(result!.status).toBe('MISS'); + expect(result!.key).toBe('/api/data'); }); }); @@ -67,7 +108,7 @@ describe('checkCache', () => { it('returns MISS when store has no entry', () => { const store = createMockStore(); const compiled = compileCache({ - rules: [{ match: '*', key: ['ingest.method', 'ingest.path'], ttl: 60 }], + rules: [{ key: ['ingest.method', 'ingest.path'], ttl: 60 }], }); const result = checkCache( compiled, @@ -75,20 +116,20 @@ describe('checkCache', () => { { ingest: { method: 'GET', path: '/api/data' }, }, - 's:express', + 'express', ); expect(result).toBeDefined(); expect(result!.status).toBe('MISS'); - expect(result!.key).toBe('s:express:GET:/api/data'); + expect(result!.key).toBe('express:GET:/api/data'); }); it('returns HIT when store has entry', () => { const store = createMockStore(); - store._data.set('s:express:GET:/api/data', { body: 'cached' }); + store._data.set('express:GET:/api/data', { body: 'cached' }); const compiled = compileCache({ - rules: [{ match: '*', key: ['ingest.method', 'ingest.path'], ttl: 60 }], + rules: [{ key: ['ingest.method', 'ingest.path'], ttl: 60 }], }); const result = checkCache( compiled, @@ -96,7 +137,7 @@ describe('checkCache', () => { { ingest: { method: 'GET', path: '/api/data' }, }, - 's:express', + 'express', ); expect(result).toBeDefined(); @@ -130,7 +171,7 @@ describe('checkCache', () => { it('builds key from event fields', () => { const store = createMockStore(); const compiled = compileCache({ - rules: [{ match: '*', key: ['event.name'], ttl: 60 }], + rules: [{ key: ['event.name'], ttl: 60 }], }); const result = checkCache( compiled, @@ -148,7 +189,7 @@ describe('checkCache', () => { it('returns null when key resolves to empty', () => { const store = createMockStore(); const compiled = compileCache({ - rules: [{ match: '*', key: ['ingest.nonexistent'], ttl: 60 }], + rules: [{ key: ['ingest.nonexistent'], ttl: 60 }], }); const result = checkCache(compiled, store, { ingest: {} }, 'test'); @@ -164,7 +205,7 @@ describe('checkCache', () => { key: ['ingest.path'], ttl: 300, }, - { match: '*', key: ['ingest.method', 'ingest.path'], ttl: 60 }, + { key: ['ingest.method', 'ingest.path'], ttl: 60 }, ], }); const result = checkCache( diff --git a/packages/core/src/__tests__/contract.test.ts b/packages/core/src/__tests__/contract.test.ts index 79ae6b492..1ba6b0482 100644 --- a/packages/core/src/__tests__/contract.test.ts +++ b/packages/core/src/__tests__/contract.test.ts @@ -49,22 +49,37 @@ describe('resolveContracts', () => { it('should resolve a single contract with no extends', () => { const contract: Flow.Contract = { default: { - globals: { required: ['country'] }, + schema: { + type: 'object', + properties: { + globals: { type: 'object', required: ['country'] }, + }, + }, events: { product: { view: { properties: { data: { required: ['id'] } } } }, }, }, }; const resolved = resolveContracts(contract); - expect(resolved.default.globals).toEqual({ required: ['country'] }); + expect(resolved.default.schema).toEqual({ + type: 'object', + properties: { + globals: { type: 'object', required: ['country'] }, + }, + }); expect(resolved.default.events?.product.view).toBeDefined(); }); it('should resolve extends chain', () => { const contract: Flow.Contract = { default: { - globals: { required: ['country'] }, - consent: { required: ['analytics'] }, + schema: { + type: 'object', + properties: { + globals: { type: 'object', required: ['country'] }, + consent: { type: 'object', required: ['analytics'] }, + }, + }, }, web: { extends: 'default', @@ -74,28 +89,50 @@ describe('resolveContracts', () => { }, }; const resolved = resolveContracts(contract); - // web inherits from default - expect(resolved.web.globals).toEqual({ required: ['country'] }); - expect(resolved.web.consent).toEqual({ required: ['analytics'] }); + // web inherits schema from default + const webProps = (resolved.web.schema as Record) + .properties as Record; + expect(webProps.globals).toEqual({ type: 'object', required: ['country'] }); + expect(webProps.consent).toEqual({ + type: 'object', + required: ['analytics'], + }); expect(resolved.web.events?.product.view).toBeDefined(); }); it('should resolve deep extends chain', () => { const contract: Flow.Contract = { - default: { consent: { required: ['analytics'] } }, + default: { + schema: { + type: 'object', + properties: { + consent: { type: 'object', required: ['analytics'] }, + }, + }, + }, web: { extends: 'default', events: { product: { view: {} } }, }, web_loggedin: { extends: 'web', - user: { required: ['id'] }, + schema: { + type: 'object', + properties: { + user: { type: 'object', required: ['id'] }, + }, + }, }, }; const resolved = resolveContracts(contract); - expect(resolved.web_loggedin.consent).toEqual({ required: ['analytics'] }); + const props = (resolved.web_loggedin.schema as Record) + .properties as Record; + expect(props.consent).toEqual({ + type: 'object', + required: ['analytics'], + }); + expect(props.user).toEqual({ type: 'object', required: ['id'] }); expect(resolved.web_loggedin.events?.product.view).toBeDefined(); - expect(resolved.web_loggedin.user).toEqual({ required: ['id'] }); }); it('should detect circular extends', () => { @@ -187,18 +224,41 @@ describe('resolveContracts', () => { }); }); - it('should merge sections additively via extends', () => { + it('should inherit tagging from parent when child omits it', () => { const contract: Flow.Contract = { default: { - consent: { required: ['analytics'] }, + tagging: 1, + schema: { + type: 'object', + properties: { globals: { type: 'object', required: ['country'] } }, + }, }, web: { extends: 'default', - consent: { required: ['marketing'] }, }, }; const resolved = resolveContracts(contract); - expect(resolved.web.consent?.required).toEqual(['analytics', 'marketing']); + expect(resolved.web.tagging).toBe(1); + }); + + it('should let child tagging override parent tagging', () => { + const contract: Flow.Contract = { + default: { tagging: 1 }, + web: { extends: 'default', tagging: 2 }, + }; + const resolved = resolveContracts(contract); + expect(resolved.web.tagging).toBe(2); + }); + + it('should propagate tagging through a multi-level extends chain', () => { + const contract: Flow.Contract = { + default: { tagging: 3 }, + web: { extends: 'default' }, + web_loggedin: { extends: 'web' }, + }; + const resolved = resolveContracts(contract); + expect(resolved.web.tagging).toBe(3); + expect(resolved.web_loggedin.tagging).toBe(3); }); it('should strip annotation keys', () => { @@ -225,17 +285,99 @@ describe('resolveContracts', () => { }); }); - it('should handle contract with only sections, no events', () => { + it('should handle contract with only schema, no events', () => { const contract: Flow.Contract = { consent_only: { - consent: { - required: ['analytics'], - properties: { analytics: { type: 'boolean' } }, + schema: { + type: 'object', + properties: { + consent: { + type: 'object', + required: ['analytics'], + properties: { analytics: { type: 'boolean' } }, + }, + }, }, }, }; const resolved = resolveContracts(contract); - expect(resolved.consent_only.consent?.required).toEqual(['analytics']); + const props = (resolved.consent_only.schema as Record) + .properties as Record; + expect((props.consent as Record).required).toEqual([ + 'analytics', + ]); expect(resolved.consent_only.events).toBeUndefined(); }); + + it('resolves a contract with schema only', () => { + const contract: Flow.Contract = { + web: { + schema: { + type: 'object', + properties: { + globals: { type: 'object', required: ['country'] }, + }, + }, + }, + }; + const resolved = resolveContracts(contract); + expect(resolved.web.schema).toEqual({ + type: 'object', + properties: { + globals: { type: 'object', required: ['country'] }, + }, + }); + }); + + it('merges schemas additively via extends', () => { + const contract: Flow.Contract = { + default: { + schema: { + type: 'object', + properties: { globals: { required: ['country'] } }, + }, + }, + web: { + extends: 'default', + schema: { + type: 'object', + properties: { consent: { required: ['analytics'] } }, + }, + }, + }; + const resolved = resolveContracts(contract); + const props = (resolved.web.schema as Record).properties; + expect(props).toEqual({ + globals: { required: ['country'] }, + consent: { required: ['analytics'] }, + }); + }); + + it('unions required arrays via extends', () => { + const contract: Flow.Contract = { + default: { + schema: { + type: 'object', + properties: { globals: { type: 'object', required: ['country'] } }, + }, + }, + web: { + extends: 'default', + schema: { + type: 'object', + properties: { globals: { type: 'object', required: ['currency'] } }, + }, + }, + }; + const resolved = resolveContracts(contract); + const globals = ( + (resolved.web.schema as Record).properties as Record< + string, + unknown + > + ).globals as Record; + expect(globals.required).toEqual( + expect.arrayContaining(['country', 'currency']), + ); + }); }); diff --git a/packages/core/src/__tests__/flow-store-cache.test.ts b/packages/core/src/__tests__/flow-store-cache.test.ts new file mode 100644 index 000000000..3de1b93a0 --- /dev/null +++ b/packages/core/src/__tests__/flow-store-cache.test.ts @@ -0,0 +1,28 @@ +import { getFlowSettings } from '../flow'; +import type { Flow } from '../types'; + +describe('Flow.Store.cache survives resolve+emit', () => { + it('keeps cache field on emitted store', () => { + const setup: Flow.Json = { + version: 4, + flows: { + default: { + config: { platform: 'server' }, + stores: { + mem: { package: '@walkeros/server-store-fs', config: {} }, + api: { + package: '@walkeros/server-store-api', + config: {}, + cache: { store: 'mem', rules: [{ ttl: 60 }] }, + }, + }, + }, + }, + }; + const resolved = getFlowSettings(setup); + expect(resolved.stores?.api.cache).toEqual({ + store: 'mem', + rules: [{ ttl: 60 }], + }); + }); +}); diff --git a/packages/core/src/__tests__/flow.test.ts b/packages/core/src/__tests__/flow.test.ts index a895530ec..e3709c588 100644 --- a/packages/core/src/__tests__/flow.test.ts +++ b/packages/core/src/__tests__/flow.test.ts @@ -1719,7 +1719,7 @@ describe('Pattern Resolution', () => { config: { platform: 'server' }, stores: { cache: { - package: '@walkeros/store-memory', + package: '@walkeros/server-store-fs', config: {}, env: { region: '$var.region' }, }, @@ -1964,8 +1964,13 @@ describe('$contract edge cases', () => { version: 4, contract: { web: { - globals: { required: ['country'] }, - consent: { required: ['analytics'] }, + schema: { + type: 'object', + properties: { + globals: { required: ['country'] }, + consent: { required: ['analytics'] }, + }, + }, events: { product: { view: { properties: { data: { required: ['id'] } } } }, }, @@ -1980,8 +1985,8 @@ describe('$contract edge cases', () => { sources: { test: { config: { - globals: '$var.c.globals', - consent: '$var.c.consent', + globals: '$var.c.schema.properties.globals', + consent: '$var.c.schema.properties.consent', }, }, }, @@ -1999,14 +2004,21 @@ describe('$contract edge cases', () => { const setup: Flow.Json = { version: 4, contract: { - web: { consent: { required: ['analytics'] } }, + web: { + schema: { + type: 'object', + properties: { consent: { required: ['analytics'] } }, + }, + }, }, flows: { default: { config: { platform: 'web' }, destinations: { api: { - config: { consent: '$contract.web.consent' }, + config: { + consent: '$contract.web.schema.properties.consent', + }, }, }, }, @@ -2054,8 +2066,13 @@ describe('$contract reference resolution', () => { version: 4, contract: { web: { - globals: { required: ['country'] }, - consent: { required: ['analytics'] }, + schema: { + type: 'object', + properties: { + globals: { required: ['country'] }, + consent: { required: ['analytics'] }, + }, + }, }, }, flows: { @@ -2063,7 +2080,9 @@ describe('$contract reference resolution', () => { config: { platform: 'web' }, sources: { cmp: { - config: { consent: '$contract.web.consent' }, + config: { + consent: '$contract.web.schema.properties.consent', + }, }, }, }, @@ -2080,7 +2099,10 @@ describe('$contract reference resolution', () => { version: 4, contract: { web: { - globals: { required: ['country'] }, + schema: { + type: 'object', + properties: { globals: { required: ['country'] } }, + }, }, }, flows: { @@ -2094,7 +2116,12 @@ describe('$contract reference resolution', () => { }; const config = getFlowSettings(setup); expect(config.sources?.test?.config).toEqual({ - c: { globals: { required: ['country'] } }, + c: { + schema: { + type: 'object', + properties: { globals: { required: ['country'] } }, + }, + }, }); }); @@ -2131,14 +2158,21 @@ describe('$contract reference resolution', () => { const setup: Flow.Json = { version: 4, contract: { - default: { consent: { required: ['analytics'] } }, + default: { + schema: { + type: 'object', + properties: { consent: { required: ['analytics'] } }, + }, + }, web: { extends: 'default', events: { product: { view: {} } } }, }, flows: { default: { config: { platform: 'web' }, sources: { - cmp: { config: { consent: '$contract.web.consent' } }, + cmp: { + config: { consent: '$contract.web.schema.properties.consent' }, + }, }, }, }, diff --git a/packages/core/src/__tests__/get-next-steps.test.ts b/packages/core/src/__tests__/get-next-steps.test.ts new file mode 100644 index 000000000..90b1961c5 --- /dev/null +++ b/packages/core/src/__tests__/get-next-steps.test.ts @@ -0,0 +1,149 @@ +import { getNextSteps } from '../route'; +import * as packageIndex from '../index'; +import type { Route } from '../types/transformer'; + +describe('getNextSteps', () => { + it('returns [] for undefined spec', () => { + expect(getNextSteps(undefined, {})).toEqual([]); + }); + + it('returns single-element array for a string ID', () => { + expect(getNextSteps('enricher', {})).toEqual(['enricher']); + }); + + it('returns string[] for a chain', () => { + expect(getNextSteps(['a', 'b', 'c'], {})).toEqual(['a', 'b', 'c']); + }); + + it('returns first match for `one` operator', () => { + const spec: Route = { + one: [ + { + match: { key: 'event.name', operator: 'eq', value: 'page view' }, + next: 'page', + }, + { next: 'default' }, + ], + }; + expect(getNextSteps(spec, { event: { name: 'page view' } })).toEqual([ + 'page', + ]); + expect(getNextSteps(spec, { event: { name: 'order' } })).toEqual([ + 'default', + ]); + }); + + it('returns ALL matches for `many` operator', () => { + const spec: Route = { + many: [ + { + match: { key: 'event.name', operator: 'eq', value: 'page view' }, + next: 'audit', + }, + { next: 'always' }, + { + match: { key: 'event.name', operator: 'eq', value: 'never' }, + next: 'skipped', + }, + ], + }; + expect(getNextSteps(spec, { event: { name: 'page view' } })).toEqual([ + 'audit', + 'always', + ]); + }); + + it('returns [] for empty many', () => { + expect(getNextSteps({ many: [] }, {})).toEqual([]); + }); + + it('returns [] for many where all matches fail', () => { + const spec: Route = { + many: [ + { match: { key: 'x', operator: 'eq', value: 'A' }, next: 'a' }, + { match: { key: 'x', operator: 'eq', value: 'B' }, next: 'b' }, + ], + }; + expect(getNextSteps(spec, { x: 'Z' })).toEqual([]); + }); + + it('returns inner next when outer gate passes', () => { + expect( + getNextSteps( + { + match: { key: 'ingest.path', operator: 'prefix', value: '/api' }, + next: 'api', + }, + { ingest: { path: '/api/x' } }, + ), + ).toEqual(['api']); + }); + + it('returns [] when outer gate fails', () => { + expect( + getNextSteps( + { + match: { key: 'ingest.path', operator: 'prefix', value: '/api' }, + next: 'api', + }, + { ingest: { path: '/other' } }, + ), + ).toEqual([]); + }); + + it('handles nested many inside one', () => { + const spec: Route = { + one: [ + { + match: { key: 'event.name', operator: 'eq', value: 'order' }, + next: { many: ['a', 'b'] }, + }, + { next: 'default' }, + ], + }; + expect(getNextSteps(spec, { event: { name: 'order' } })).toEqual([ + 'a', + 'b', + ]); + }); + + it('mixed sequence concatenates segments', () => { + const spec: Route = [ + 'dedup', + { + one: [ + { + match: { key: 'ingest.path', operator: 'prefix', value: '/api' }, + next: ['validate', 'enrich'], + }, + { next: 'fallback' }, + ], + }, + 'writer', + ]; + expect(getNextSteps(spec, { ingest: { path: '/api/x' } })).toEqual([ + 'dedup', + 'validate', + 'enrich', + 'writer', + ]); + expect(getNextSteps(spec, { ingest: { path: '/other' } })).toEqual([ + 'dedup', + 'fallback', + 'writer', + ]); + }); + + it('caches compiled AST by spec object identity', () => { + const spec: Route = { many: ['a', 'b'] }; + const first = getNextSteps(spec, {}); + const second = getNextSteps(spec, {}); + expect(first).toEqual(second); + expect(first).toEqual(['a', 'b']); + }); + + it('is exported from package index', () => { + expect(typeof packageIndex.getNextSteps).toBe('function'); + expect(packageIndex.getNextSteps).toBe(getNextSteps); + }); +}); diff --git a/packages/core/src/__tests__/references.test.ts b/packages/core/src/__tests__/references.test.ts index 0a6e7b7ac..874f761da 100644 --- a/packages/core/src/__tests__/references.test.ts +++ b/packages/core/src/__tests__/references.test.ts @@ -65,6 +65,23 @@ describe('reference regex constants', () => { expect('$contract.default.events'.match(REF_CONTRACT)?.[1]).toBe('default'); expect('prefix $contract.default'.match(REF_CONTRACT)).toBeNull(); }); + it('REF_CONTRACT captures name and shallow path generically', () => { + // After the contract restructure, the resolver walks the captured + // dot path generically into the resolved contract object. The regex + // must therefore expose the full path as a single capture, with no + // hardcoded section names. + const m = '$contract.web.schema'.match(REF_CONTRACT); + expect(m?.[1]).toBe('web'); + expect(m?.[2]).toBe('schema'); + }); + it('REF_CONTRACT captures arbitrarily deep paths generically', () => { + // $contract.web.schema.properties.globals must capture the entire + // dotted path after the contract name so flow.ts can walk it via + // walkPath. No section-name awareness allowed. + const m = '$contract.web.schema.properties.globals'.match(REF_CONTRACT); + expect(m?.[1]).toBe('web'); + expect(m?.[2]).toBe('schema.properties.globals'); + }); it('REF_CODE_PREFIX is literal', () => { expect('$code:(e) => e.x'.startsWith(REF_CODE_PREFIX)).toBe(true); }); diff --git a/packages/core/src/__tests__/route-mixed-sequence.test.ts b/packages/core/src/__tests__/route-mixed-sequence.test.ts new file mode 100644 index 000000000..80661e1a1 --- /dev/null +++ b/packages/core/src/__tests__/route-mixed-sequence.test.ts @@ -0,0 +1,130 @@ +import { compileNext, resolveNext } from '../route'; + +describe('compileNext — mixed sequence (string + RouteConfig array)', () => { + it('compiles a mixed array to a sequence', () => { + const compiled = compileNext([ + 'a', + { + one: [ + { + match: { + key: 'event.name', + operator: 'eq', + value: 'order complete', + }, + next: 'x', + }, + ], + }, + ]); + expect(compiled).toBeDefined(); + expect(compiled!.type).toBe('sequence'); + // sequence value is an array of CompiledNext segments + if (compiled && compiled.type === 'sequence') { + expect(Array.isArray(compiled.value)).toBe(true); + expect(compiled.value).toHaveLength(2); + expect(compiled.value[0].type).toBe('static'); + expect(compiled.value[1].type).toBe('one'); + } + }); + + it('resolves a sequence concatenating segment results when inner one matches', () => { + const compiled = compileNext([ + 'a', + { + one: [ + { + match: { + key: 'event.name', + operator: 'eq', + value: 'order complete', + }, + next: 'x', + }, + ], + }, + ]); + const resolved = resolveNext(compiled!, { + event: { name: 'order complete' }, + }); + expect(resolved).toEqual(['a', 'x']); + }); + + it('resolves a sequence skipping undefined segments when inner one fails', () => { + const compiled = compileNext([ + 'a', + { + one: [ + { + match: { + key: 'event.name', + operator: 'eq', + value: 'order complete', + }, + next: 'x', + }, + ], + }, + ]); + const resolved = resolveNext(compiled!, { + event: { name: 'page view' }, + }); + // Only "a" survives; inner one has no fallback so segment 2 → undefined + expect(resolved).toEqual(['a']); + }); + + it('resolves a sequence with multiple mixed segments and chain target', () => { + const compiled = compileNext([ + 'dedup', + { + one: [ + { + match: { key: 'ingest.path', operator: 'prefix', value: '/api' }, + next: ['validate', 'enrich'], + }, + { next: 'fallback' }, + ], + }, + 'writer', + ]); + expect(compiled!.type).toBe('sequence'); + + const matched = resolveNext(compiled!, { + ingest: { path: '/api/data' }, + }); + expect(matched).toEqual(['dedup', 'validate', 'enrich', 'writer']); + + const fallback = resolveNext(compiled!, { + ingest: { path: '/other' }, + }); + expect(fallback).toEqual(['dedup', 'fallback', 'writer']); + }); + + it('still compiles a pure string array as chain (unchanged)', () => { + const compiled = compileNext(['a', 'b']); + expect(compiled).toBeDefined(); + expect(compiled!.type).toBe('chain'); + if (compiled && compiled.type === 'chain') { + expect(compiled.value).toEqual(['a', 'b']); + } + expect(resolveNext(compiled!)).toEqual(['a', 'b']); + }); + + it('still compiles a pure RouteConfig array as one (unchanged)', () => { + const compiled = compileNext([ + { + match: { key: 'event.name', operator: 'eq', value: 'page view' }, + next: 'page-handler', + }, + { next: 'default' }, + ]); + expect(compiled).toBeDefined(); + expect(compiled!.type).toBe('one'); + expect(resolveNext(compiled!, { event: { name: 'page view' } })).toBe( + 'page-handler', + ); + expect(resolveNext(compiled!, { event: { name: 'other' } })).toBe( + 'default', + ); + }); +}); diff --git a/packages/core/src/__tests__/route.test.ts b/packages/core/src/__tests__/route.test.ts index 3def09eee..d838c5059 100644 --- a/packages/core/src/__tests__/route.test.ts +++ b/packages/core/src/__tests__/route.test.ts @@ -1,4 +1,10 @@ import { compileNext, resolveNext } from '../route'; +import type { + Route, + RouteConfig, + RouteOneConfig, + RouteManyConfig, +} from '../types/transformer'; describe('compileNext', () => { it('returns undefined for undefined input', () => { @@ -23,8 +29,10 @@ describe('compileNext', () => { match: { key: 'ingest.path', operator: 'prefix', value: '/gtag' }, next: 'gtag-parser', }, - { match: '*', next: 'default' }, + { next: 'default' }, ]); + expect(compiled).toBeDefined(); + expect(compiled!.type).toBe('one'); expect(resolveNext(compiled!, { ingest: { path: '/gtag/collect' } })).toBe( 'gtag-parser', ); @@ -54,10 +62,10 @@ describe('compileNext', () => { match: { key: 'ingest.method', operator: 'eq', value: 'POST' }, next: 'api-writer', }, - { match: '*', next: 'api-reader' }, + { next: 'api-reader' }, ], }, - { match: '*', next: 'default' }, + { next: 'default' }, ]); expect( resolveNext(compiled!, { ingest: { path: '/api/data', method: 'POST' } }), @@ -76,7 +84,7 @@ describe('compileNext', () => { match: { key: 'ingest.method', operator: 'eq', value: 'POST' }, next: ['validator', 'writer'], }, - { match: '*', next: 'reader' }, + { next: 'reader' }, ]); expect(resolveNext(compiled!, { ingest: { method: 'POST' } })).toEqual([ 'validator', @@ -95,7 +103,7 @@ describe('compileNext', () => { }, next: 'api-writer', }, - { match: '*', next: 'default' }, + { next: 'default' }, ]); expect( resolveNext(compiled!, { ingest: { path: '/api/data', method: 'POST' } }), @@ -116,10 +124,105 @@ describe('compileNext', () => { match: { key: 'event.name', operator: 'eq', value: 'page view' }, next: 'page-handler', }, - { match: '*', next: 'default' }, + { next: 'default' }, ]); expect(resolveNext(compiled!, { event: { name: 'page view' } })).toBe( 'page-handler', ); }); + + it('compiles a RouteConfig with explicit `one`', () => { + const compiled = compileNext({ + one: [ + { + match: { key: 'event.name', operator: 'eq', value: 'order complete' }, + next: 'a', + }, + { next: 'b' }, + ], + }); + expect(compiled).toBeDefined(); + expect(compiled!.type).toBe('one'); + expect(resolveNext(compiled!, { event: { name: 'order complete' } })).toBe( + 'a', + ); + expect(resolveNext(compiled!, { event: { name: 'page view' } })).toBe('b'); + }); + + it('compiles a RouteConfig with `many` (all-match aggregation)', () => { + const compiled = compileNext({ + many: [ + { + match: { key: 'event.name', operator: 'eq', value: 'order complete' }, + next: 'audit', + }, + { next: 'always' }, + { + match: { key: 'event.name', operator: 'eq', value: 'never' }, + next: 'skipped', + }, + ], + }); + expect(compiled).toBeDefined(); + expect(compiled!.type).toBe('many'); + expect( + resolveNext(compiled!, { event: { name: 'order complete' } }), + ).toEqual(['audit', 'always']); + expect(resolveNext(compiled!, { event: { name: 'page view' } })).toEqual([ + 'always', + ]); + expect(resolveNext(compiled!, { event: { name: 'never' } })).toEqual([ + 'always', + 'skipped', + ]); + }); + + it('compiles a gate-only RouteConfig', () => { + const compiled = compileNext({ + match: { key: 'event.name', operator: 'eq', value: 'order complete' }, + }); + expect(compiled).toBeDefined(); + expect(compiled!.type).toBe('gate'); + // gate fails → resolveNext returns undefined (fall-through) + expect( + resolveNext(compiled!, { event: { name: 'page view' } }), + ).toBeUndefined(); + // gate passes → resolveNext returns inner next (undefined here since gate has no next) + expect( + resolveNext(compiled!, { event: { name: 'order complete' } }), + ).toBeUndefined(); + }); + + it('compiles a gate-only RouteConfig with inner next propagation', () => { + // A gate wraps an outer match around an inner case/next. When match passes, + // resolveNext returns the inner next's value; when it fails, returns undefined. + const compiled = compileNext({ + match: { key: 'ingest.path', operator: 'prefix', value: '/api' }, + next: 'api-handler', + }); + expect(compiled).toBeDefined(); + expect(compiled!.type).toBe('gate'); + expect(resolveNext(compiled!, { ingest: { path: '/api/data' } })).toBe( + 'api-handler', + ); + expect( + resolveNext(compiled!, { ingest: { path: '/other' } }), + ).toBeUndefined(); + }); + + // TODO: type-level test via tsd or similar — disjoint union is enforced by RouteConfig's `never` properties +}); + +describe('RouteConfig disjoint union surface', () => { + it('typechecks RouteOneConfig and RouteManyConfig members', () => { + const one: RouteOneConfig = { + match: { key: 'event.name', operator: 'eq', value: 'page view' }, + one: ['handler-a', 'handler-b'], + }; + const many: RouteManyConfig = { many: ['audit', 'process'] }; + const a: RouteConfig = one; + const b: RouteConfig = many; + expect(a).toBeDefined(); + expect(b).toBeDefined(); + }); }); diff --git a/packages/core/src/__tests__/schemas/cache.test.ts b/packages/core/src/__tests__/schemas/cache.test.ts index 8c4c7e472..30b1ff6c1 100644 --- a/packages/core/src/__tests__/schemas/cache.test.ts +++ b/packages/core/src/__tests__/schemas/cache.test.ts @@ -11,22 +11,30 @@ describe('CacheRuleSchema', () => { ).toBe(true); }); - it('validates wildcard match', () => { + it('accepts rule without match (always-match)', () => { expect( CacheRuleSchema.safeParse({ - match: '*', key: ['ingest.path'], ttl: 60, }).success, ).toBe(true); }); - it('validates rule with update', () => { + it("rejects '*' literal match", () => { expect( CacheRuleSchema.safeParse({ match: '*', key: ['ingest.path'], ttl: 60, + }).success, + ).toBe(false); + }); + + it('validates rule with update', () => { + expect( + CacheRuleSchema.safeParse({ + key: ['ingest.path'], + ttl: 60, update: { 'headers.X-Cache': { value: 'HIT' } }, }).success, ).toBe(true); @@ -35,7 +43,6 @@ describe('CacheRuleSchema', () => { it('rejects missing ttl', () => { expect( CacheRuleSchema.safeParse({ - match: '*', key: ['ingest.path'], }).success, ).toBe(false); @@ -44,7 +51,6 @@ describe('CacheRuleSchema', () => { it('rejects missing key', () => { expect( CacheRuleSchema.safeParse({ - match: '*', ttl: 60, }).success, ).toBe(false); @@ -55,7 +61,7 @@ describe('CacheSchema', () => { it('validates minimal cache config', () => { expect( CacheSchema.safeParse({ - rules: [{ match: '*', key: ['ingest.path'], ttl: 60 }], + rules: [{ key: ['ingest.path'], ttl: 60 }], }).success, ).toBe(true); }); @@ -64,27 +70,36 @@ describe('CacheSchema', () => { expect( CacheSchema.safeParse({ store: 'myCache', - rules: [{ match: '*', key: ['ingest.path'], ttl: 300 }], + rules: [{ key: ['ingest.path'], ttl: 300 }], }).success, ).toBe(true); }); - it('validates with full flag', () => { + it('validates with stop flag', () => { expect( CacheSchema.safeParse({ - full: true, - rules: [{ match: '*', key: ['ingest.path'], ttl: 60 }], + stop: true, + rules: [{ key: ['ingest.path'], ttl: 60 }], }).success, ).toBe(true); }); - it('validates without full flag', () => { + it('validates without stop flag', () => { const result = CacheSchema.safeParse({ - rules: [{ match: '*', key: ['ingest.path'], ttl: 60 }], + rules: [{ key: ['ingest.path'], ttl: 60 }], }); expect(result.success).toBe(true); }); + it('accepts namespace', () => { + expect( + CacheSchema.safeParse({ + namespace: 'cache-v1', + rules: [{ key: ['ingest.path'], ttl: 60 }], + }).success, + ).toBe(true); + }); + it('rejects empty rules array', () => { expect( CacheSchema.safeParse({ diff --git a/packages/core/src/__tests__/schemas/destination.test.ts b/packages/core/src/__tests__/schemas/destination.test.ts new file mode 100644 index 000000000..36dfa9ef2 --- /dev/null +++ b/packages/core/src/__tests__/schemas/destination.test.ts @@ -0,0 +1,50 @@ +import { DestinationSchema } from '../../schemas/flow'; + +describe('destination.before rejects many (post-collector restriction)', () => { + it('rejects many at destination.before', () => { + const result = DestinationSchema.safeParse({ + package: '@walkeros/server-destination-spy', + before: { many: ['a', 'b'] }, + }); + expect(result.success).toBe(false); + }); + + it('accepts one at destination.before', () => { + const result = DestinationSchema.safeParse({ + package: '@walkeros/server-destination-spy', + before: { + one: [ + { + match: { key: 'event.name', operator: 'eq', value: 'x' }, + next: 'a', + }, + ], + }, + }); + expect(result.success).toBe(true); + }); + + it('accepts next at destination.before', () => { + const result = DestinationSchema.safeParse({ + package: '@walkeros/server-destination-spy', + before: { next: 'a' }, + }); + expect(result.success).toBe(true); + }); + + it('accepts nested many inside one is still rejected at destination.before', () => { + // many is forbidden at any depth in a post-collector route. + const result = DestinationSchema.safeParse({ + package: '@walkeros/server-destination-spy', + before: { + one: [ + { + match: { key: 'x', operator: 'eq', value: 'a' }, + next: { many: ['p', 'q'] }, + }, + ], + }, + }); + expect(result.success).toBe(false); + }); +}); diff --git a/packages/core/src/__tests__/schemas/matcher.test.ts b/packages/core/src/__tests__/schemas/matcher.test.ts index 78c3beec3..36a4dc593 100644 --- a/packages/core/src/__tests__/schemas/matcher.test.ts +++ b/packages/core/src/__tests__/schemas/matcher.test.ts @@ -1,9 +1,6 @@ -import { - MatchExpressionSchema, - RouteSchema, - RouteSpecSchema, -} from '../../schemas/matcher'; +import { MatchExpressionSchema, RouteSchema } from '../../schemas/matcher'; import { safeParseConfig } from '../../schemas/flow'; +import { toJsonSchema } from '../../schemas/validation'; describe('MatchExpressionSchema', () => { it('validates a simple condition', () => { @@ -26,11 +23,16 @@ describe('MatchExpressionSchema', () => { ).toBe(true); }); - it('validates wildcard string', () => { - const result = RouteSchema.safeParse({ match: '*', next: 'default' }); + it('accepts a RouteConfig with omitted match (always-match)', () => { + const result = RouteSchema.safeParse({ next: 'default' }); expect(result.success).toBe(true); }); + it('rejects the legacy wildcard literal "*" as a match value', () => { + const result = RouteSchema.safeParse({ match: '*', next: 'default' }); + expect(result.success).toBe(false); + }); + it('rejects invalid operator', () => { expect( MatchExpressionSchema.safeParse({ @@ -42,30 +44,30 @@ describe('MatchExpressionSchema', () => { }); }); -describe('RouteSpecSchema', () => { +describe('RouteSchema — basic shapes', () => { it('validates a string', () => { - expect(RouteSpecSchema.safeParse('enricher').success).toBe(true); + expect(RouteSchema.safeParse('enricher').success).toBe(true); }); it('validates a string array', () => { - expect(RouteSpecSchema.safeParse(['a', 'b']).success).toBe(true); + expect(RouteSchema.safeParse(['a', 'b']).success).toBe(true); }); it('validates a Route array', () => { expect( - RouteSpecSchema.safeParse([ + RouteSchema.safeParse([ { match: { key: 'path', operator: 'prefix', value: '/api' }, next: 'handler', }, - { match: '*', next: 'default' }, + { next: 'default' }, ]).success, ).toBe(true); }); it('validates nested routes', () => { expect( - RouteSpecSchema.safeParse([ + RouteSchema.safeParse([ { match: { key: 'path', operator: 'prefix', value: '/api' }, next: [ @@ -73,7 +75,7 @@ describe('RouteSpecSchema', () => { match: { key: 'method', operator: 'eq', value: 'POST' }, next: 'writer', }, - { match: '*', next: 'reader' }, + { next: 'reader' }, ], }, ]).success, @@ -81,6 +83,29 @@ describe('RouteSpecSchema', () => { }); }); +describe('RouteSchema disjoint union', () => { + it('rejects a RouteConfig with both next and one set', () => { + const result = RouteSchema.safeParse({ next: 'a', one: ['b'] }); + expect(result.success).toBe(false); + }); + + it('accepts a bare gate RouteConfig with only match', () => { + const result = RouteSchema.safeParse({ + match: { key: 'event.name', operator: 'eq', value: 'order complete' }, + }); + expect(result.success).toBe(true); + }); + + it('emits a JSON Schema containing the disjoint union (anyOf)', () => { + // Zod 4's toJSONSchema emits z.union(...) as `anyOf` (not `oneOf`). + // The RouteConfig three-way union therefore appears in the emitted + // JSON Schema as a nested `anyOf` somewhere in the tree. + const json = toJsonSchema(RouteSchema) as Record; + const serialized = JSON.stringify(json); + expect(serialized.includes('anyOf')).toBe(true); + }); +}); + describe('Flow config with Route[] in source.next', () => { it('validates source.next with Route array', () => { const config = { @@ -96,7 +121,7 @@ describe('Flow config with Route[] in source.next', () => { match: { key: 'path', operator: 'prefix', value: '/gtag' }, next: 'gtag-parser', }, - { match: '*', next: 'default' }, + { next: 'default' }, ], }, }, @@ -107,3 +132,33 @@ describe('Flow config with Route[] in source.next', () => { expect(result.success).toBe(true); }); }); + +describe('RouteSchema — one/many operators', () => { + it('accepts { one: [...] } and rejects { case: [...] }', () => { + expect(RouteSchema.safeParse({ one: ['a'] }).success).toBe(true); + expect(RouteSchema.safeParse({ case: ['a'] }).success).toBe(false); + }); + + it('accepts { many: [...] }', () => { + expect(RouteSchema.safeParse({ many: ['a', 'b'] }).success).toBe(true); + }); + + it('rejects both `next` and `one` set on the same RouteConfig', () => { + expect(RouteSchema.safeParse({ next: 'a', one: ['b'] }).success).toBe( + false, + ); + }); + + it('accepts empty many: [] (lint surfaces the warning, schema does not)', () => { + expect(RouteSchema.safeParse({ many: [] }).success).toBe(true); + }); + + it('accepts nested `many` inside a gated entry', () => { + expect( + RouteSchema.safeParse({ + match: { key: 'ingest.path', operator: 'prefix', value: '/api' }, + many: ['audit', 'process'], + }).success, + ).toBe(true); + }); +}); diff --git a/packages/core/src/__tests__/schemas/transformer.test.ts b/packages/core/src/__tests__/schemas/transformer.test.ts new file mode 100644 index 000000000..1e0af0713 --- /dev/null +++ b/packages/core/src/__tests__/schemas/transformer.test.ts @@ -0,0 +1,60 @@ +import { ConfigSchema } from '../../schemas/transformer'; + +describe('Transformer ConfigSchema', () => { + it('accepts mapping field on transformer config', () => { + const parsed = ConfigSchema.parse({ mapping: {} }); + expect(parsed.mapping).toBeDefined(); + }); + + it('rejects unknown top-level keys on transformer config (closed schema)', () => { + expect(() => ConfigSchema.parse({ rules: [] })).toThrow(); + }); +}); + +describe('Transformer ConfigSchema mapping field at transformer position', () => { + it('accepts mapping with policy (event-mutating)', () => { + const result = ConfigSchema.safeParse({ + mapping: { + policy: { 'user.email': { value: '[redacted]' } }, + }, + }); + expect(result.success).toBe(true); + }); + + it('accepts mapping with nested mapping (per-event rules)', () => { + const result = ConfigSchema.safeParse({ + mapping: { + mapping: { + order: { complete: { name: 'purchase' } }, + }, + }, + }); + expect(result.success).toBe(true); + }); + + it('accepts mapping that includes data (allowed by Mapping.Config; engine warns at runtime)', () => { + // Schema is lenient — same Mapping.Config shape as destinations. The + // runtime warns when `data` appears at transformer position (Task 2.3). + // Note: `data` is ValueSchema | ValuesSchema, so we use a ValueConfig shape + // (e.g. { map: { ... } }) rather than a free-form object. + const result = ConfigSchema.safeParse({ + mapping: { + data: { map: { foo: 'data.bar' } }, + }, + }); + expect(result.success).toBe(true); + }); + + it('Mapping.Config schema is currently lenient — unknown keys silently passthrough', () => { + // Empirically: packages/core/src/schemas/mapping.ts ConfigSchema (line 350) + // is a plain z.object() without .strict(), so Zod strips unknown keys and + // safeParse succeeds. TODO: revisit if Mapping.Config schema is later made + // strict — then this should assert `result.success === false`. + const result = ConfigSchema.safeParse({ + mapping: { + unknownField: 'something', + }, + }); + expect(typeof result.success).toBe('boolean'); + }); +}); diff --git a/packages/core/src/__tests__/schemas/validate-flow-config.test.ts b/packages/core/src/__tests__/schemas/validate-flow-config.test.ts index faab2d8b5..d6d2bb517 100644 --- a/packages/core/src/__tests__/schemas/validate-flow-config.test.ts +++ b/packages/core/src/__tests__/schemas/validate-flow-config.test.ts @@ -287,7 +287,7 @@ describe('validateFlowConfig', () => { flows: { a: { config: { platform: 'server' }, - stores: { cache: { package: '@walkeros/store-memory' } }, + stores: { cache: { package: '@walkeros/server-store-fs' } }, }, b: { config: { platform: 'server' }, @@ -318,12 +318,12 @@ describe('validateFlowConfig', () => { express: { package: '@walkeros/server-source-express', before: 'decoder', - next: 'validate', + next: 'fingerprint', }, }, transformers: { decoder: { package: '@walkeros/transformer-decoder' }, - validate: { package: '@walkeros/transformer-validate' }, + fingerprint: { package: '@walkeros/transformer-fingerprint' }, }, }, }, @@ -347,10 +347,10 @@ describe('validateFlowConfig', () => { enrich: { package: '@walkeros/transformer-enricher', before: 'lookup', - next: 'validate', + next: 'fingerprint', }, lookup: { package: '@walkeros/transformer-lookup' }, - validate: { package: '@walkeros/transformer-validate' }, + fingerprint: { package: '@walkeros/transformer-fingerprint' }, }, }, }, @@ -454,7 +454,7 @@ describe('validateFlowConfig', () => { default: { config: { platform: 'server' }, stores: { - cache: { package: '@walkeros/store-memory' }, + cache: { package: '@walkeros/server-store-fs' }, files: { package: '@walkeros/server-store-fs' }, }, transformers: { diff --git a/packages/core/src/__tests__/transformer-config-mapping.test.ts b/packages/core/src/__tests__/transformer-config-mapping.test.ts new file mode 100644 index 000000000..eb9c63246 --- /dev/null +++ b/packages/core/src/__tests__/transformer-config-mapping.test.ts @@ -0,0 +1,17 @@ +import type { Transformer } from '../types'; + +describe('Transformer.Config mapping field', () => { + it('accepts mapping: Mapping.Config at the transformer position', () => { + const t: Transformer.InitTransformer = { + mapping: {}, + }; + expect(t).toBeDefined(); + }); + + it('accepts a Mapping.Config-shaped value with policy', () => { + const t: Transformer.InitTransformer = { + mapping: { policy: { user_id: { value: 'redacted' } } }, + }; + expect(t).toBeDefined(); + }); +}); diff --git a/packages/core/src/__tests__/transformer-entry.test.ts b/packages/core/src/__tests__/transformer-entry.test.ts new file mode 100644 index 000000000..a292c89b9 --- /dev/null +++ b/packages/core/src/__tests__/transformer-entry.test.ts @@ -0,0 +1,107 @@ +import { + validateTransformerEntry, + isPathTransformerEntry, + TRANSFORMER_OPERATIVE_FIELDS, +} from '../transformer-entry'; + +describe('validateTransformerEntry', () => { + it('accepts an entry with code only', () => { + expect(validateTransformerEntry({ code: () => {} }).ok).toBe(true); + }); + + it('accepts an entry with package only', () => { + expect(validateTransformerEntry({ package: '@walkeros/x' }).ok).toBe(true); + }); + + it('accepts a path entry with before only', () => { + expect(validateTransformerEntry({ before: ['a'] }).ok).toBe(true); + }); + + it('accepts a path entry with cache only', () => { + expect(validateTransformerEntry({ cache: { rules: [] } }).ok).toBe(true); + }); + + it('accepts a pass-through entry with mapping only', () => { + expect(validateTransformerEntry({ mapping: {} }).ok).toBe(true); + }); + + it('accepts an empty entry (pass-through is the default; no harm)', () => { + expect(validateTransformerEntry({}).ok).toBe(true); + }); + + it('accepts an entry with only `validate` (in-built validate hook)', () => { + expect(validateTransformerEntry({ validate: () => true }).ok).toBe(true); + }); + + it('accepts an entry with examples alongside package', () => { + // `examples` is a legitimate top-level field on Flow.Transformer + // (named scenarios for testing/documentation). It must not be flagged + // as UNKNOWN_KEY by the closed-schema check. + expect( + validateTransformerEntry({ + package: '@walkeros/x', + examples: { pass: { in: {}, out: {} } }, + }).ok, + ).toBe(true); + }); + + it('accepts an entry with variables alongside package', () => { + // `variables` is a legitimate top-level field on Flow.Transformer + // (transformer-scoped variable cascade). It must not be flagged. + expect( + validateTransformerEntry({ + package: '@walkeros/x', + variables: { FOO: 'bar' }, + }).ok, + ).toBe(true); + }); + + it('rejects an entry with unknown keys', () => { + const r = validateTransformerEntry({ code: () => {}, rules: [] }); + expect(r.ok).toBe(false); + expect(r.code).toBe('UNKNOWN_KEY'); + expect(r.key).toBe('rules'); + }); + + it('rejects an entry with both code and package (conflict)', () => { + const r = validateTransformerEntry({ + code: () => {}, + package: '@walkeros/x', + }); + expect(r.ok).toBe(false); + expect(r.code).toBe('CONFLICT'); + }); + + it('exposes the operative fields list', () => { + expect(TRANSFORMER_OPERATIVE_FIELDS).toEqual([ + 'code', + 'package', + 'before', + 'next', + 'cache', + 'mapping', + ]); + }); +}); + +describe('isPathTransformerEntry', () => { + it('returns false when code is present', () => { + expect(isPathTransformerEntry({ code: () => {} })).toBe(false); + }); + + it('returns false when package is present', () => { + expect(isPathTransformerEntry({ package: '@walkeros/x' })).toBe(false); + }); + + it('returns true for a mapping-only entry', () => { + expect(isPathTransformerEntry({ mapping: {} })).toBe(true); + }); + + it('returns true for a before-only entry', () => { + expect(isPathTransformerEntry({ before: ['a'] })).toBe(true); + }); + + it('returns false for an empty entry', () => { + expect(isPathTransformerEntry({})).toBe(false); + }); +}); diff --git a/packages/core/src/__tests__/types/contract.test.ts b/packages/core/src/__tests__/types/contract.test.ts index 28eba3c36..fc3006565 100644 --- a/packages/core/src/__tests__/types/contract.test.ts +++ b/packages/core/src/__tests__/types/contract.test.ts @@ -7,10 +7,16 @@ describe('Contract types', () => { contract: { default: { description: 'Base contract', - globals: { - required: ['country'], + schema: { + type: 'object', properties: { - country: { type: 'string' }, + globals: { + type: 'object', + required: ['country'], + properties: { + country: { type: 'string' }, + }, + }, }, }, events: { @@ -31,8 +37,14 @@ describe('Contract types', () => { }, web: { extends: 'default', - consent: { - required: ['analytics'], + schema: { + type: 'object', + properties: { + consent: { + type: 'object', + required: ['analytics'], + }, + }, }, }, }, @@ -49,7 +61,12 @@ describe('Contract types', () => { web: { extends: 'default', events: { product: { view: {} } } }, web_loggedin: { extends: 'web', - user: { required: ['id'] }, + schema: { + type: 'object', + properties: { + user: { type: 'object', required: ['id'] }, + }, + }, }, }; expect(Object.keys(contract)).toHaveLength(3); diff --git a/packages/core/src/branch.ts b/packages/core/src/branch.ts index 0af278653..9001fc756 100644 --- a/packages/core/src/branch.ts +++ b/packages/core/src/branch.ts @@ -6,7 +6,7 @@ import type { Transformer, WalkerOS } from './types'; */ export function branch( event: WalkerOS.DeepPartialEvent, - next: Transformer.RouteSpec, + next: Transformer.Route, ): Transformer.Result { return { event, next }; } diff --git a/packages/core/src/cache.ts b/packages/core/src/cache.ts index a5629829d..a381168f6 100644 --- a/packages/core/src/cache.ts +++ b/packages/core/src/cache.ts @@ -1,4 +1,4 @@ -import type { Cache, CacheRule } from './types/cache'; +import type { Cache, EventCacheRule } from './types/cache'; import type { Collector, Mapping, Store } from './types'; import type { CompiledMatcher } from './types/matcher'; import { compileMatcher } from './matcher'; @@ -9,12 +9,13 @@ interface CompiledCacheRule { match: CompiledMatcher; key: string[]; ttl: number; - update?: CacheRule['update']; + update?: EventCacheRule['update']; } export interface CompiledCache { - full: boolean; + stop: boolean; storeId?: string; + namespace?: string; rules: CompiledCacheRule[]; } @@ -42,12 +43,13 @@ export function buildCacheContext( return ctx; } -export function compileCache(cache: Cache): CompiledCache { +export function compileCache(cache: Cache): CompiledCache { return { - full: cache.full ?? false, + stop: cache.stop ?? false, storeId: cache.store, + namespace: cache.namespace, rules: cache.rules.map((rule) => ({ - match: compileMatcher(rule.match), + match: rule.match ? compileMatcher(rule.match) : () => true, key: rule.key, ttl: rule.ttl, update: rule.update, @@ -59,7 +61,7 @@ export function checkCache( compiled: CompiledCache, store: Store.Instance, context: Record, - namespace: string, + namespace?: string, ): CacheResult | null { const rule = compiled.rules.find((r) => r.match(context)); if (!rule) return null; @@ -71,7 +73,8 @@ export function checkCache( if (keyParts.every((p) => p === '')) return null; const keyValue = keyParts.join(':'); - const namespacedKey = `${namespace}:${keyValue}`; + const ns = namespace ?? compiled.namespace; + const namespacedKey = ns ? `${ns}:${keyValue}` : keyValue; const cached = store.get(namespacedKey); diff --git a/packages/core/src/contract.ts b/packages/core/src/contract.ts index 3fc0e01ce..e5e5e4a9e 100644 --- a/packages/core/src/contract.ts +++ b/packages/core/src/contract.ts @@ -1,15 +1,6 @@ import type { Flow } from './types'; import { throwError } from './throwError'; -/** Section keys that map to WalkerOS.Event fields. */ -const SECTION_KEYS = [ - 'globals', - 'context', - 'custom', - 'user', - 'consent', -] as const; - /** Annotation keys to strip from AJV-compatible schemas. */ const ANNOTATION_KEYS = new Set([ 'description', @@ -92,9 +83,9 @@ export function resolveContracts( /** * Merge two contract entries additively. - * Sections merge via mergeContractSchemas. - * Events merge at the entity-action level. - * Metadata: child wins for scalars. + * Scalar metadata (tagging, description): child wins, otherwise inherited. + * `schema`: deep additive merge via mergeContractSchemas. + * `events`: per-entity-action merge. */ function mergeContractEntries( parent: Flow.ContractRule, @@ -102,26 +93,27 @@ function mergeContractEntries( ): Flow.ContractRule { const result: Flow.ContractRule = {}; - // Merge metadata (child wins) + // Scalar metadata: child overrides if set, otherwise inherited. + if (parent.tagging !== undefined || child.tagging !== undefined) { + result.tagging = child.tagging ?? parent.tagging; + } if (parent.description !== undefined || child.description !== undefined) { result.description = child.description ?? parent.description; } - // Merge sections additively - for (const key of SECTION_KEYS) { - const p = parent[key]; - const c = child[key]; - if (p && c) { - result[key] = mergeContractSchemas( - p as Record, - c as Record, - ); - } else if (p || c) { - result[key] = { ...((p || c) as Record) }; - } + // Schema: additive deep-merge via mergeContractSchemas. + if (parent.schema && child.schema) { + result.schema = mergeContractSchemas( + parent.schema as Record, + child.schema as Record, + ) as Flow.ContractRule['schema']; + } else if (parent.schema || child.schema) { + result.schema = { + ...((parent.schema || child.schema) as Record), + } as Flow.ContractRule['schema']; } - // Merge events + // Events: per-entity-action merge (unchanged semantics). if (parent.events || child.events) { const merged: Flow.ContractEvents = {}; const allEntities = new Set([ diff --git a/packages/core/src/flow.ts b/packages/core/src/flow.ts index a3fbab056..9102b6110 100644 --- a/packages/core/src/flow.ts +++ b/packages/core/src/flow.ts @@ -619,6 +619,7 @@ function resolveFlowSettings( before: source.before, next: source.next, cache: source.cache, + validate: source.validate, code: finalCode, } as Flow.Source; } @@ -670,6 +671,7 @@ function resolveFlowSettings( before: dest.before, next: dest.next, cache: dest.cache, + validate: dest.validate, code: finalCode, } as Flow.Destination; } @@ -715,6 +717,7 @@ function resolveFlowSettings( package: store.package, config: processedConfig, env: processedEnv, + cache: store.cache, variables: store.variables, code: finalCode, } as Flow.Store; @@ -766,6 +769,7 @@ function resolveFlowSettings( before: transformer.before, next: transformer.next, cache: transformer.cache, + validate: transformer.validate, code: finalCode, } as Flow.Transformer; } diff --git a/packages/core/src/index.ts b/packages/core/src/index.ts index d806eb70f..8918c2617 100644 --- a/packages/core/src/index.ts +++ b/packages/core/src/index.ts @@ -37,8 +37,12 @@ export * from './contract'; export * from './mcpHelpers'; export * from './respond'; export * from './matcher'; -export * from './route'; +// Route helpers: only `getNextSteps` is public. `compileNext`, `resolveNext`, +// `CompiledNext`, `CompiledRoute`, and `isRouteArray` remain package-internal +// (importable from `./route` inside core, not from the public package). +export { getNextSteps } from './route'; export * from './cache'; +export * from './transformer-entry'; export * from './examples/formatOut'; export { REF_VAR_FULL, diff --git a/packages/core/src/matcher.ts b/packages/core/src/matcher.ts index 1f9a0616c..826f40d0c 100644 --- a/packages/core/src/matcher.ts +++ b/packages/core/src/matcher.ts @@ -11,8 +11,10 @@ import { getByPath } from './byPath'; * Regex patterns are compiled once. Numeric comparisons are parsed once. * Runtime evaluation is pure function calls with short-circuit logic. */ -export function compileMatcher(expr: MatchExpression | '*'): CompiledMatcher { - if (expr === '*') return () => true; +export function compileMatcher( + expr: MatchExpression | '*' | undefined, +): CompiledMatcher { + if (expr === undefined || expr === '*') return () => true; if ('and' in expr) { const fns = expr.and.map(compileMatcher); diff --git a/packages/core/src/route.ts b/packages/core/src/route.ts index 3ba929075..eb821dd8b 100644 --- a/packages/core/src/route.ts +++ b/packages/core/src/route.ts @@ -1,7 +1,12 @@ -import type { Route, RouteSpec } from './types/transformer'; +import type { Route, RouteConfig } from './types/transformer'; import type { CompiledMatcher } from './types/matcher'; import { compileMatcher } from './matcher'; +/** + * Internal: compiled route data. Not exported from the package's public + * surface (`@walkeros/core`), but exported here so adjacent test files + * inside the core package can probe compilation. + */ export interface CompiledRoute { match: CompiledMatcher; next: CompiledNext; @@ -10,39 +15,165 @@ export interface CompiledRoute { export type CompiledNext = | { type: 'static'; value: string } | { type: 'chain'; value: string[] } - | { type: 'routes'; routes: CompiledRoute[] }; + | { type: 'one'; routes: CompiledRoute[] } + | { type: 'many'; routes: CompiledRoute[] } + | { type: 'gate'; match: CompiledMatcher; next?: CompiledNext } + | { type: 'sequence'; value: CompiledNext[] }; -export function isRouteArray(next: RouteSpec): next is Route[] { +function isRouteConfigEntry(entry: unknown): boolean { + return ( + typeof entry === 'object' && + entry !== null && + !Array.isArray(entry) && + ('match' in entry || 'next' in entry || 'one' in entry || 'many' in entry) + ); +} + +/** + * Pure RouteConfig array — every element is a RouteConfig object. + * Used to detect the legacy first-match shape (treated as implicit `one`). + */ +export function isRouteArray(next: Route): next is RouteConfig[] { return ( Array.isArray(next) && next.length > 0 && - typeof next[0] === 'object' && - next[0] !== null && - 'match' in next[0] + next.every((entry) => isRouteConfigEntry(entry)) ); } -export function compileNext( - next: RouteSpec | undefined, -): CompiledNext | undefined { +function compileRoutes(entries: Route[]): CompiledRoute[] { + return entries.map((entry) => { + if (typeof entry === 'string') { + return { match: () => true, next: { type: 'static', value: entry } }; + } + if (Array.isArray(entry)) { + return { + match: () => true, + next: compileNext(entry) ?? { type: 'chain', value: [] }, + }; + } + const e = entry as RouteConfig; + return { + match: e.match ? compileMatcher(e.match) : () => true, + next: compileNext(e) ?? { type: 'chain', value: [] }, + }; + }); +} + +export function compileNext(next: Route | undefined): CompiledNext | undefined { if (next === undefined || next === null) return undefined; if (typeof next === 'string') return { type: 'static', value: next }; if (Array.isArray(next)) { if (next.length === 0) return undefined; if (isRouteArray(next)) { - const routes: CompiledRoute[] = next.map((route) => ({ - match: compileMatcher(route.match), - next: compileNext(route.next)!, - })); - return { type: 'routes', routes }; + // Pure RouteConfig[] — legacy first-match shape, treat as implicit { one: [...] } + return compileNext({ one: next as RouteConfig[] }); } - return { type: 'chain', value: next as string[] }; + if (next.every((entry) => typeof entry === 'string')) { + // Pure string[] — static chain + return { type: 'chain', value: next as string[] }; + } + // Mixed array (strings + RouteConfig objects, possibly nested arrays) — + // sequence form: each segment resolves independently, results concatenated. + const segments: CompiledNext[] = []; + for (const entry of next) { + const compiled = compileNext(entry); + if (compiled !== undefined) segments.push(compiled); + } + if (segments.length === 0) return undefined; + return { type: 'sequence', value: segments }; + } + + // RouteConfig + const cfg = next as RouteConfig; + if ('next' in cfg && cfg.next !== undefined) { + // next operator (optionally gated) + if (cfg.match) { + return { + type: 'gate', + match: compileMatcher(cfg.match), + next: compileNext(cfg.next), + }; + } + return compileNext(cfg.next); + } + if ('one' in cfg && cfg.one) { + const routes = compileRoutes(cfg.one); + if (cfg.match) { + // outer gate around the one + return { + type: 'gate', + match: compileMatcher(cfg.match), + next: { type: 'one', routes }, + }; + } + return { type: 'one', routes }; + } + if ('many' in cfg && cfg.many) { + const routes = compileRoutes(cfg.many); + if (cfg.match) { + // outer gate around the many + return { + type: 'gate', + match: compileMatcher(cfg.match), + next: { type: 'many', routes }, + }; + } + return { type: 'many', routes }; + } + // Bare gate { match } — no next/one/many + if (cfg.match) { + return { type: 'gate', match: compileMatcher(cfg.match) }; } return undefined; } +const compileCache = new WeakMap(); + +/** + * Resolve a Route spec against a matcher context. Returns the immediate + * next transformer IDs. + * + * Return shape: + * [] → terminate (gate failed, empty many, all matchers failed, + * undefined spec). + * ["x"] → continue main chain at x. + * ["a","b",…] → fan-out, only produced by `many`. Main chain terminates + * at this dispatch point; each branch is an independent + * flow running to its own exit. + * + * Reachability vs prediction: `match` rules read arbitrary event fields. + * `getNextSteps` is deterministic for the SUPPLIED context only. Static + * analyzers without a real event must over-approximate by treating each + * match as "may pass or fail" — see `flattenRouteTargets` in the CLI + * validator. This function does NOT predict the path a future event will + * take; it computes the path for the event you give it. + */ +export function getNextSteps( + spec: Route | undefined, + context: Record = {}, +): string[] { + if (spec === undefined || spec === null) return []; + let compiled: CompiledNext | undefined; + if (typeof spec === 'object') { + const cached = compileCache.get(spec); + if (cached) { + compiled = cached; + } else { + compiled = compileNext(spec); + if (compiled) compileCache.set(spec, compiled); + } + } else { + compiled = compileNext(spec); + } + if (!compiled) return []; + const resolved = resolveNext(compiled, context); + if (resolved === undefined) return []; + return Array.isArray(resolved) ? resolved : [resolved]; +} + export function resolveNext( compiled: CompiledNext | undefined, context: Record = {}, @@ -50,12 +181,36 @@ export function resolveNext( if (!compiled) return undefined; if (compiled.type === 'static') return compiled.value; if (compiled.type === 'chain') return compiled.value; - + if (compiled.type === 'gate') { + if (!compiled.match(context)) return undefined; // gate failed → fall through + return resolveNext(compiled.next, context); + } + if (compiled.type === 'sequence') { + const ids: string[] = []; + for (const segment of compiled.value) { + const resolved = resolveNext(segment, context); + if (resolved === undefined) continue; + if (Array.isArray(resolved)) ids.push(...resolved); + else ids.push(resolved); + } + return ids.length > 0 ? ids : undefined; + } + if (compiled.type === 'many') { + const ids: string[] = []; + for (const route of compiled.routes) { + if (!route.match(context)) continue; + const inner = resolveNext(route.next, context); + if (inner === undefined) continue; + if (Array.isArray(inner)) ids.push(...inner); + else ids.push(inner); + } + return ids.length > 0 ? ids : undefined; + } + // one: first-match dispatch for (const route of compiled.routes) { if (route.match(context)) { return resolveNext(route.next, context); } } - return undefined; } diff --git a/packages/core/src/schemas/__tests__/cache.test.ts b/packages/core/src/schemas/__tests__/cache.test.ts new file mode 100644 index 000000000..51144064b --- /dev/null +++ b/packages/core/src/schemas/__tests__/cache.test.ts @@ -0,0 +1,59 @@ +import { EventCacheSchema, StoreCacheSchema } from '../cache'; + +describe('EventCacheSchema', () => { + it('rejects rule without key', () => { + expect(EventCacheSchema.safeParse({ rules: [{ ttl: 60 }] }).success).toBe( + false, + ); + }); + + it('accepts rule with key and optional update', () => { + expect( + EventCacheSchema.safeParse({ + rules: [{ key: ['event.id'], ttl: 60, update: { foo: 'bar' } }], + }).success, + ).toBe(true); + }); +}); + +describe('StoreCacheSchema', () => { + it('accepts minimal rule with just ttl', () => { + expect(StoreCacheSchema.safeParse({ rules: [{ ttl: 60 }] }).success).toBe( + true, + ); + }); + + it('rejects update on rule', () => { + expect( + StoreCacheSchema.safeParse({ + rules: [{ ttl: 60, update: { foo: 'bar' } }], + }).success, + ).toBe(false); + }); + + it('rejects multi-segment key on rule', () => { + expect( + StoreCacheSchema.safeParse({ + rules: [{ ttl: 60, key: ['something'] }], + }).success, + ).toBe(false); + }); + + it('rejects stop:true at top level', () => { + expect( + StoreCacheSchema.safeParse({ + stop: true, + rules: [{ ttl: 60 }], + }).success, + ).toBe(false); + }); + + it('rejects namespace: ""', () => { + expect( + StoreCacheSchema.safeParse({ + namespace: '', + rules: [{ ttl: 60 }], + }).success, + ).toBe(false); + }); +}); diff --git a/packages/core/src/schemas/cache.ts b/packages/core/src/schemas/cache.ts index 858cfc2ee..ffbaedb0d 100644 --- a/packages/core/src/schemas/cache.ts +++ b/packages/core/src/schemas/cache.ts @@ -3,34 +3,30 @@ import { MatchExpressionSchema } from './matcher'; import { ValueSchema } from './mapping'; // ======================================== -// Cache Rule Schema +// Event Cache Rule Schema // ======================================== /** - * CacheRule — a single caching rule for a pipeline step. + * EventCacheRule — a single caching rule for an event-context pipeline step + * (sources, transformers, destinations). * - * Mirrors: types/cache.ts → CacheRule + * Mirrors: types/cache.ts → EventCacheRule * - * - match: MatchExpression or '*' wildcard - * - key: array of dot-path strings used to build the cache key - * - ttl: time-to-live in seconds (must be positive) - * - update: optional record of response mutations applied on cache hit + * - match: MatchExpression — omit for always-match. + * - key: array of dot-path strings used to compose the cache key from event fields. + * - ttl: time-to-live in seconds (positive). + * - update: optional record of response mutations applied on cache hit. */ -export const CacheRuleSchema = z +export const EventCacheRuleSchema = z .object({ - match: z - .union([MatchExpressionSchema, z.literal('*')]) - .describe( - 'Match expression or wildcard to determine when this rule applies', - ), + match: MatchExpressionSchema.optional().describe( + 'Optional match expression — omit for always-match.', + ), key: z .array(z.string()) .min(1) .describe('Dot-path fields used to build the cache key'), - ttl: z - .number() - .positive() - .describe('Time-to-live in seconds for cached entries'), + ttl: z.number().positive().describe('Time-to-live in seconds'), update: z .record(z.string(), ValueSchema) .optional() @@ -39,46 +35,138 @@ export const CacheRuleSchema = z ), }) .meta({ - id: 'CacheRule', - title: 'Cache.Rule', + id: 'EventCacheRule', + title: 'EventCache.Rule', description: - 'Single caching rule: when it applies (match), what keys it keys off, TTL, and optional response mutations on hit.', + 'Single event-cache rule: when it applies (match), what event fields it keys off, TTL, and optional response mutations on hit.', }); // ======================================== -// Cache Schema +// Event Cache Schema // ======================================== /** - * Cache — top-level cache configuration for a pipeline step. + * EventCache — top-level cache configuration for an event-context pipeline step. * - * Mirrors: types/cache.ts → Cache - * - * - store: optional store ID for persistent caching ($store.storeId wiring) - * - rules: at least one CacheRule is required + * Mirrors: types/cache.ts → Cache */ -export const CacheSchema = z +export const EventCacheSchema = z .object({ - full: z + stop: z .boolean() .optional() .describe( - 'Stop flow on cache HIT (default: false). When true, skip remaining steps and return cached value.', + 'Stop the chain on cache HIT (default: false). When true, skip remaining steps and return cached value.', + ), + store: z + .string() + .optional() + .describe( + 'Store ID for persistent caching (references a configured store)', ), + namespace: z + .string() + .optional() + .describe( + 'Optional key prefix. Omit to write keys directly to the store. Same store + same key + same namespace = same cache entry.', + ), + rules: z + .array(EventCacheRuleSchema) + .min(1) + .describe('Cache rules — at least one required'), + }) + .meta({ + id: 'EventCacheConfig', + title: 'EventCache.Config', + description: + 'Top-level cache configuration for an event-context pipeline step (source / transformer / destination).', + }); + +// ======================================== +// Store Cache Rule Schema +// ======================================== + +/** + * StoreCacheRule — a single caching rule applied at the store boundary. + * + * Mirrors: types/cache.ts → StoreCacheRule + * + * The caller (store wrapper) provides the cache key, so `key` is not allowed + * here. There is no event to mutate, so `update` is rejected. + * + * - match: optional MatchExpression evaluated against `{ key, value? }`. + * - ttl: time-to-live in seconds (positive). + * + * `.strict()` rejects unknown keys so footguns surface at validation time. + */ +export const StoreCacheRuleSchema = z + .strictObject({ + match: MatchExpressionSchema.optional().describe( + 'Optional match expression evaluated against `{ key, value? }`. Omit for always-match.', + ), + ttl: z.number().positive().describe('Time-to-live in seconds'), + }) + .meta({ + id: 'StoreCacheRule', + title: 'StoreCache.Rule', + description: + 'Single store-cache rule: optional match against `{ key, value? }` and a TTL. No `key` (caller provides it) and no `update` (no event to mutate).', + }); + +// ======================================== +// Store Cache Schema +// ======================================== + +/** + * StoreCache — top-level cache configuration for a store wrapper. + * + * Mirrors: types/cache.ts → Cache + * + * Differences from EventCache: + * - No `stop` field (read-through always falls through on miss). + * - `namespace` rejects `""` (empty namespace collapses keys across stores + * sharing `__cache` and re-introduces collisions). + * - Rules use StoreCacheRuleSchema (no `key`, no `update`). + */ +export const StoreCacheSchema = z + .strictObject({ store: z .string() .optional() .describe( 'Store ID for persistent caching (references a configured store)', ), + namespace: z + .string() + .min(1) + .optional() + .describe( + 'Optional key prefix. Omit to default to the host store id. Empty string is rejected.', + ), rules: z - .array(CacheRuleSchema) + .array(StoreCacheRuleSchema) .min(1) .describe('Cache rules — at least one required'), }) .meta({ - id: 'CacheConfig', - title: 'Cache.Config', + id: 'StoreCacheConfig', + title: 'StoreCache.Config', description: - 'Top-level cache configuration for a pipeline step (destination / transformer / source ref).', + 'Top-level cache configuration for a store wrapper. No `stop` (always falls through on miss); namespace defaults to the host store id.', }); + +// ======================================== +// Backwards-compatible aliases (deprecated) +// ======================================== + +/** + * @deprecated Use {@link EventCacheRuleSchema}. Kept for one cycle to avoid + * breaking external callers. + */ +export const CacheRuleSchema = EventCacheRuleSchema; + +/** + * @deprecated Use {@link EventCacheSchema}. Kept for one cycle to avoid + * breaking external callers. + */ +export const CacheSchema = EventCacheSchema; diff --git a/packages/core/src/schemas/destination.ts b/packages/core/src/schemas/destination.ts index 0929bbabc..ef7fbc32e 100644 --- a/packages/core/src/schemas/destination.ts +++ b/packages/core/src/schemas/destination.ts @@ -8,8 +8,8 @@ import { PolicySchema, } from './mapping'; import { Identifier } from './primitives'; -import { RouteSpecSchema } from './matcher'; -import { CacheSchema } from './cache'; +import { RouteWithoutManySchema } from './matcher'; +import { EventCacheSchema } from './cache'; import { LoggerConfigSchema } from './logger'; /** @@ -116,13 +116,13 @@ export const ConfigSchema = z .describe( 'One-time setup options applied during destination registration (boolean enables defaults, object configures specifics)', ), - before: RouteSpecSchema.optional().describe( - 'Post-collector transformer chain applied before this destination receives the event', + before: RouteWithoutManySchema.optional().describe( + 'Post-collector transformer chain applied before this destination receives the event. `many` is not valid here — use multiple destinations for post-collector fan-out.', ), - next: RouteSpecSchema.optional().describe( - 'Post-push transformer chain. Runs after destination push completes; push response is available at ingest._response', + next: RouteWithoutManySchema.optional().describe( + 'Post-push transformer chain. Runs after destination push completes; push response is available at ingest._response. `many` is not valid here — use multiple destinations for post-collector fan-out.', ), - cache: CacheSchema.optional().describe( + cache: EventCacheSchema.optional().describe( 'Cache configuration for deduplication; skip push on cache HIT', ), disabled: z diff --git a/packages/core/src/schemas/flow.ts b/packages/core/src/schemas/flow.ts index 33656e57f..03094af78 100644 --- a/packages/core/src/schemas/flow.ts +++ b/packages/core/src/schemas/flow.ts @@ -18,8 +18,8 @@ */ import { z, toJsonSchema } from './validation'; -import { RouteSpecSchema } from './matcher'; -import { CacheSchema } from './cache'; +import { RouteSchema, RouteWithoutManySchema } from './matcher'; +import { EventCacheSchema, StoreCacheSchema } from './cache'; // ======================================== // Shared Type Schemas @@ -226,6 +226,46 @@ export const StepExamplesSchema = z }) .describe('Named step examples for testing and documentation'); +// ======================================== +// Validate Schemas (shared by step Init schemas and ContractRule) +// ======================================== + +/** + * JSON Schema fragment - structural JSON Schema object. + */ +export const JsonSchemaSchema = z.record(z.string(), z.unknown()).meta({ + id: 'JsonSchema', + title: 'JsonSchema', + description: 'Structural JSON Schema fragment (Record)', +}); + +/** + * Validate events map - entity → action → JSON Schema. + */ +export const ValidateEventsSchema = z + .record(z.string(), z.record(z.string(), JsonSchemaSchema)) + .meta({ + id: 'ValidateEvents', + title: 'ValidateEvents', + description: 'Entity-action keyed JSON Schemas', + }) + .describe('Entity-action keyed JSON Schemas'); + +/** + * Validate schema - step-level validation configuration. + */ +export const ValidateSchema = z + .object({ + format: z.boolean().optional(), + events: ValidateEventsSchema.optional(), + schema: JsonSchemaSchema.optional(), + }) + .meta({ + id: 'Validate', + title: 'Validate', + description: 'Step-level validation: { format?, events?, schema? }', + }); + // ======================================== // Source / Destination / Transformer / Store Schemas // ======================================== @@ -288,18 +328,19 @@ export const SourceSchema = z variables: VariablesSchema.optional().describe( 'Source-level variables (highest priority in cascade)', ), - next: RouteSpecSchema.optional().describe( + next: RouteSchema.optional().describe( 'Pre-collector transformer chain. String, string[], or Route[] for conditional routing based on ingest data.', ), - before: RouteSpecSchema.optional().describe( + before: RouteSchema.optional().describe( 'Pre-source transformer chain (consent-exempt). Handles transport-level preprocessing.', ), examples: StepExamplesSchema.optional().describe( 'Named step examples for testing and documentation (stripped during bundling)', ), - cache: CacheSchema.optional().describe( + cache: EventCacheSchema.optional().describe( 'Cache configuration for this source (match → key → ttl rules)', ), + validate: ValidateSchema.optional(), }) .meta({ id: 'FlowSource', @@ -345,10 +386,10 @@ export const TransformerSchema = z }) .optional() .describe('Transformer environment configuration'), - before: RouteSpecSchema.optional().describe( + before: RouteSchema.optional().describe( 'Pre-transformer chain. Runs before this transformer push function.', ), - next: RouteSpecSchema.optional().describe( + next: RouteSchema.optional().describe( 'Next transformer in chain. String, string[], or Route[] for conditional routing.', ), variables: VariablesSchema.optional().describe( @@ -357,9 +398,10 @@ export const TransformerSchema = z examples: StepExamplesSchema.optional().describe( 'Named step examples for testing and documentation (stripped during bundling)', ), - cache: CacheSchema.optional().describe( + cache: EventCacheSchema.optional().describe( 'Cache configuration for this transformer (match → key → ttl rules)', ), + validate: ValidateSchema.optional(), }) .meta({ id: 'FlowTransformer', @@ -415,18 +457,19 @@ export const DestinationSchema = z variables: VariablesSchema.optional().describe( 'Destination-level variables (highest priority in cascade)', ), - before: RouteSpecSchema.optional().describe( - 'Post-collector transformer chain. String, string[], or Route[] for conditional routing.', + before: RouteWithoutManySchema.optional().describe( + 'Post-collector transformer chain. String, string[], or Route[] for conditional routing. `many` is not valid here — use multiple destinations for post-collector fan-out.', ), - next: RouteSpecSchema.optional().describe( - 'Post-push transformer chain. Push response available at context.ingest._response.', + next: RouteWithoutManySchema.optional().describe( + 'Post-push transformer chain. Push response available at context.ingest._response. `many` is not valid here — use multiple destinations for post-collector fan-out.', ), examples: StepExamplesSchema.optional().describe( 'Named step examples for testing and documentation (stripped during bundling)', ), - cache: CacheSchema.optional().describe( + cache: EventCacheSchema.optional().describe( 'Cache configuration for this destination (match → key → ttl rules)', ), + validate: ValidateSchema.optional(), }) .meta({ id: 'FlowDestination', @@ -479,6 +522,9 @@ export const StoreSchema = z }) .optional() .describe('Store environment configuration'), + cache: StoreCacheSchema.optional().describe( + 'Cache configuration for this store (TTL-only rules, optional recursive `cache.store`)', + ), variables: VariablesSchema.optional().describe( 'Store-level variables (highest priority in cascade)', ), @@ -490,7 +536,7 @@ export const StoreSchema = z id: 'FlowStore', title: 'Flow.Store', description: - 'Store package reference with configuration, env, and examples.', + 'Store package reference with configuration, env, cache, and examples.', }) .describe('Store package reference with configuration'); @@ -543,39 +589,17 @@ export const ContractEventsSchema = z */ export const ContractRuleSchema = z .object({ - extends: z - .string() - .optional() - .describe('Inherit from another named contract'), - tagging: z - .number() - .optional() - .describe('Tagging level (used by validators / runtime tagging policy)'), - description: z.string().optional().describe('Human-readable description'), - globals: ContractSchemaEntry.optional().describe( - 'JSON Schema for event.globals', - ), - context: ContractSchemaEntry.optional().describe( - 'JSON Schema for event.context', - ), - custom: ContractSchemaEntry.optional().describe( - 'JSON Schema for event.custom', - ), - user: ContractSchemaEntry.optional().describe('JSON Schema for event.user'), - consent: ContractSchemaEntry.optional().describe( - 'JSON Schema for event.consent', - ), - events: ContractEventsSchema.optional().describe( - 'Entity-action event schemas', - ), + extends: z.string().optional(), + tagging: z.number().optional(), + description: z.string().optional(), + events: ValidateEventsSchema.optional(), + schema: JsonSchemaSchema.optional(), }) .meta({ - id: 'FlowContractRule', + id: 'ContractRule', title: 'Flow.ContractRule', - description: - 'Named contract rule with optional sections (globals/context/custom/user/consent) and event schemas.', - }) - .describe('Named contract rule with optional sections and events'); + description: 'Named contract entry', + }); /** * Named contract map. diff --git a/packages/core/src/schemas/index.ts b/packages/core/src/schemas/index.ts index 4895ef988..298b08a61 100644 --- a/packages/core/src/schemas/index.ts +++ b/packages/core/src/schemas/index.ts @@ -63,12 +63,20 @@ export { // Cache schemas (used by flow schemas for caching) import * as CacheSchemas from './cache'; export { CacheSchemas }; -export { CacheSchema, CacheRuleSchema } from './cache'; +export { + EventCacheSchema, + EventCacheRuleSchema, + StoreCacheSchema, + StoreCacheRuleSchema, + // Deprecated aliases — remove once external callers migrate. + CacheSchema, + CacheRuleSchema, +} from './cache'; // Matcher schemas (used by flow schemas for routing) import * as MatcherSchemas from './matcher'; export { MatcherSchemas }; -export { MatchExpressionSchema, RouteSpecSchema, RouteSchema } from './matcher'; +export { MatchExpressionSchema, RouteSchema } from './matcher'; // Hint schemas (direct export - flat record, no namespace needed) export { CodeSchema, HintSchema, HintsSchema } from './hint'; diff --git a/packages/core/src/schemas/matcher.ts b/packages/core/src/schemas/matcher.ts index 315af1ddd..0ec42fe6b 100644 --- a/packages/core/src/schemas/matcher.ts +++ b/packages/core/src/schemas/matcher.ts @@ -33,35 +33,71 @@ export const MatchExpressionSchema: z.ZodType = z description: 'Boolean expression tree of match conditions (leaf, and, or).', }); -const MatchOrWildcard = z.union([MatchExpressionSchema, z.literal('*')]); +// Recursive Route grammar (Flow v4): string | Route[] | RouteConfig. +// RouteConfig is a disjoint union enforcing exactly one of next/one/many/gate. +const RouteNextConfigSchema = z.strictObject({ + match: MatchExpressionSchema.optional(), + next: z.lazy(() => RouteSchema), +}); -// Recursive: Route.next is itself a RouteSpec -export const RouteSpecSchema: z.ZodType = z - .union([ - z.string(), - z.array(z.string()), - z.array( - z.object({ - match: MatchOrWildcard, - next: z.lazy(() => RouteSpecSchema), - }), - ), - ]) +const RouteOneConfigSchema = z.strictObject({ + match: MatchExpressionSchema.optional(), + one: z.array(z.lazy(() => RouteSchema)), +}); + +const RouteManyConfigSchema = z.strictObject({ + match: MatchExpressionSchema.optional(), + many: z.array(z.lazy(() => RouteSchema)), +}); + +const RouteGateConfigSchema = z.strictObject({ + match: MatchExpressionSchema, +}); + +const RouteConfigSchema = z.union([ + RouteNextConfigSchema, + RouteOneConfigSchema, + RouteManyConfigSchema, + RouteGateConfigSchema, +]); + +export const RouteSchema: z.ZodType = z + .union([z.string(), z.array(z.lazy(() => RouteSchema)), RouteConfigSchema]) .meta({ - id: 'MatcherRouteSpec', - title: 'Matcher.RouteSpec', + id: 'Route', + title: 'Route', description: - 'Routable next target: ID, ID list, or list of {match, next} rules.', + 'Recursive route: string ID, sequence of routes, or a RouteConfig (next/one/many/gate).', }); -export const RouteSchema = z - .object({ - match: MatchOrWildcard, - next: z.lazy(() => RouteSpecSchema), - }) +// Restricted Route grammar for post-collector positions (destination.before). +// `many` is forbidden at any depth: post-collector fan-out is expressed by +// configuring multiple destinations, not by branching the chain. +const RouteNextConfigSchema_NoMany = z.strictObject({ + match: MatchExpressionSchema.optional(), + next: z.lazy(() => RouteWithoutManySchema), +}); + +const RouteOneConfigSchema_NoMany = z.strictObject({ + match: MatchExpressionSchema.optional(), + one: z.array(z.lazy(() => RouteWithoutManySchema)), +}); + +const RouteConfigSchema_NoMany = z.union([ + RouteNextConfigSchema_NoMany, + RouteOneConfigSchema_NoMany, + RouteGateConfigSchema, +]); + +export const RouteWithoutManySchema: z.ZodType = z + .union([ + z.string(), + z.array(z.lazy(() => RouteWithoutManySchema)), + RouteConfigSchema_NoMany, + ]) .meta({ - id: 'MatcherRoute', - title: 'Matcher.Route', + id: 'RouteWithoutMany', + title: 'RouteWithoutMany', description: - 'Single routing rule pairing a match expression with a next target.', + 'Route variant for post-collector positions (destination.before). Excludes the many operator — post-collector fan-out uses the destinations map.', }); diff --git a/packages/core/src/schemas/transformer.ts b/packages/core/src/schemas/transformer.ts index 7e428190b..88304e441 100644 --- a/packages/core/src/schemas/transformer.ts +++ b/packages/core/src/schemas/transformer.ts @@ -1,8 +1,9 @@ import { z, toJsonSchema } from './validation'; import { Identifier } from './primitives'; -import { RouteSpecSchema } from './matcher'; -import { CacheSchema } from './cache'; +import { RouteSchema } from './matcher'; +import { EventCacheSchema } from './cache'; import { LoggerConfigSchema } from './logger'; +import { ConfigSchema as MappingConfigSchema } from './mapping'; /** * Transformer Schemas @@ -53,13 +54,13 @@ export const ConfigSchema = z logger: LoggerConfigSchema.optional().describe( 'Logger configuration (level, handler) to override the collector defaults', ), - before: RouteSpecSchema.optional().describe( + before: RouteSchema.optional().describe( 'Pre-transformer chain that runs before this transformer pushes', ), - next: RouteSpecSchema.optional().describe( + next: RouteSchema.optional().describe( 'Graph wiring to the next transformer in the chain', ), - cache: CacheSchema.optional().describe( + cache: EventCacheSchema.optional().describe( 'Step-level cache configuration for this transformer', ), init: z.boolean().describe('Whether to initialize immediately').optional(), @@ -92,7 +93,11 @@ export const ConfigSchema = z .describe( 'Path-specific mock values keyed by chain path. Takes precedence over global mock. Dev/testing only.', ), + mapping: MappingConfigSchema.optional().describe( + 'Declarative event-to-event mapping applied when this transformer step has no code. At this position, only event-mutating fields apply (policy, mapping[].policy, mapping[].name, mapping[].ignore, mapping[].consent, include); vendor-payload fields are ignored.', + ), }) + .strict() .meta({ id: 'TransformerConfig', title: 'Transformer.Config', diff --git a/packages/core/src/transformer-entry.ts b/packages/core/src/transformer-entry.ts new file mode 100644 index 000000000..afdb52c17 --- /dev/null +++ b/packages/core/src/transformer-entry.ts @@ -0,0 +1,75 @@ +// packages/core/src/transformer-entry.ts +export const TRANSFORMER_OPERATIVE_FIELDS = [ + 'code', + 'package', + 'before', + 'next', + 'cache', + 'mapping', +] as const; + +export type TransformerOperativeField = + (typeof TRANSFORMER_OPERATIVE_FIELDS)[number]; + +export interface TransformerEntryValidation { + ok: boolean; + reason?: string; + code?: 'UNKNOWN_KEY' | 'CONFLICT'; + key?: string; +} + +const ALLOWED_KEYS = new Set([ + ...TRANSFORMER_OPERATIVE_FIELDS, + 'config', + 'env', + 'validate', + 'variables', + 'examples', + 'disabled', + 'id', + 'logger', + 'mock', + 'chainMocks', +]); + +export function validateTransformerEntry( + entry: Record, +): TransformerEntryValidation { + // Closed schema: unknown keys are errors. This is the only validity rule. + // Empty `{}` is intentionally allowed — pass-through is the default; an + // entry with no fields is a no-op step, which causes no harm. + for (const key of Object.keys(entry)) { + if (!ALLOWED_KEYS.has(key)) { + return { + ok: false, + code: 'UNKNOWN_KEY', + key, + reason: `Unknown key "${key}". Allowed: ${[...ALLOWED_KEYS].join(', ')}.`, + }; + } + } + + // Conflict: code + package + if (entry.code !== undefined && entry.package !== undefined) { + return { + ok: false, + code: 'CONFLICT', + key: 'package', + reason: 'Cannot specify both `code` and `package`. Use one or the other.', + }; + } + + return { ok: true }; +} + +export function isPathTransformerEntry( + entry: Record, +): boolean { + if (entry.code !== undefined || entry.package !== undefined) return false; + return ( + entry.before !== undefined || + entry.next !== undefined || + entry.cache !== undefined || + entry.mapping !== undefined + ); +} diff --git a/packages/core/src/types/cache.ts b/packages/core/src/types/cache.ts index e0d8dafa3..9651817c0 100644 --- a/packages/core/src/types/cache.ts +++ b/packages/core/src/types/cache.ts @@ -1,15 +1,34 @@ import type { MatchExpression } from './matcher'; import type { Value } from './mapping'; -export interface CacheRule { - match: MatchExpression | '*'; - key: string[]; +interface BaseCacheRule { + /** + * Optional match expression. Omitted means always-match. + */ + match?: MatchExpression; ttl: number; +} + +export interface EventCacheRule extends BaseCacheRule { + key: string[]; update?: Record; } -export interface Cache { - full?: boolean; +export interface StoreCacheRule extends BaseCacheRule { + // intentionally no key (caller provides one) and no update (no event). +} + +export type CacheRule = EventCacheRule | StoreCacheRule; + +export interface Cache { + /** + * Stop the chain on cache HIT (default: false). When true, skip remaining steps and return cached value. + */ + stop?: boolean; store?: string; - rules: CacheRule[]; + /** + * Optional key prefix written to the store. When absent, cache keys are written directly. Same store + same key + same namespace = same cache entry. + */ + namespace?: string; + rules: R[]; } diff --git a/packages/core/src/types/destination.ts b/packages/core/src/types/destination.ts index 331fa6d0c..391c8be10 100644 --- a/packages/core/src/types/destination.ts +++ b/packages/core/src/types/destination.ts @@ -118,9 +118,9 @@ export interface Config { */ setup?: boolean | SetupOptions; /** Transformer chain to run after collector processing but before this destination. */ - before?: Transformer.RouteSpec; + before?: Transformer.Route; /** Transformer chain to run after destination push completes. Push response available at ingest._response. */ - next?: Transformer.RouteSpec; + next?: Transformer.Route; /** Cache configuration for deduplication (step-level: skip push on HIT). */ cache?: import('./cache').Cache; /** Completely skip this destination — no init, no push, no queuing. */ @@ -149,9 +149,10 @@ export type Init = { code: Code; config?: Partial>; env?: Partial>; - before?: Transformer.RouteSpec; - next?: Transformer.RouteSpec; + before?: Transformer.Route; + next?: Transformer.Route; cache?: import('./cache').Cache; + validate?: import('./validate').Validate; }; export interface InitDestinations { diff --git a/packages/core/src/types/flow.ts b/packages/core/src/types/flow.ts index 958397dd4..93798a1fa 100644 --- a/packages/core/src/types/flow.ts +++ b/packages/core/src/types/flow.ts @@ -38,6 +38,9 @@ */ import type { Collector } from '.'; +import type { Cache, EventCacheRule, StoreCacheRule } from './cache'; +import type { Route } from './transformer'; +import type { Validate, ValidateEvents, JsonSchema } from './validate'; /** * Single flow configuration. @@ -356,7 +359,7 @@ export namespace Flow { * (decode, validate, authenticate, normalize raw input). * Raw request data is available in context.ingest. */ - before?: import('./transformer').RouteSpec; + before?: Route; /** * First transformer in pre-collector chain. @@ -366,10 +369,11 @@ export namespace Flow { * If omitted, events route directly to the collector. * Can be an array for explicit chain control (bypasses transformer.next resolution). */ - next?: import('./transformer').RouteSpec; + next?: Route; /** Cache configuration for this source. */ - cache?: import('./cache').Cache; + cache?: Cache; + validate?: Validate; /** * Source-level variables (highest priority in cascade). @@ -416,7 +420,7 @@ export namespace Flow { * If omitted, events are sent directly from the collector. * Can be an array for explicit chain control. */ - before?: import('./transformer').RouteSpec; + before?: Route; /** * First transformer in post-push chain. @@ -425,10 +429,11 @@ export namespace Flow { * at context.ingest._response. Consent is inherited from the destination * gate - no separate consent check needed. */ - next?: import('./transformer').RouteSpec; + next?: Route; /** Cache configuration for this destination. */ - cache?: import('./cache').Cache; + cache?: Cache; + validate?: Validate; /** Destination-level variables (highest priority in cascade). */ variables?: Variables; @@ -466,7 +471,7 @@ export namespace Flow { * Enables pre-processing or context loading before the main transform. * Uses the same chain resolution as source.next and destination.before. */ - before?: import('./transformer').RouteSpec; + before?: Route; /** * Next transformer in chain. @@ -478,10 +483,11 @@ export namespace Flow { * Array values define an explicit chain (no walking). Circular references * are safely detected at runtime by `walkChain()`. */ - next?: import('./transformer').RouteSpec; + next?: Route; /** Cache configuration for this transformer. */ - cache?: import('./cache').Cache; + cache?: Cache; + validate?: Validate; /** Transformer-level variables (highest priority in cascade). */ variables?: Variables; @@ -513,6 +519,15 @@ export namespace Flow { /** Store environment configuration. */ env?: unknown; + /** + * Cache configuration for this store. + * + * When present, the collector wraps the bare store with a cache layer + * (read-through, write-through, single-flight). The cache layer may + * recursively delegate to another store via `cache.store`. + */ + cache?: Cache; + /** Store-level variables (highest priority in cascade). */ variables?: Variables; @@ -523,6 +538,23 @@ export namespace Flow { examples?: StepExamples; } + /** + * Discriminator for the four step kinds in a Flow. + * + * Single source of truth for code that branches on step kind (bundler + * codegen, validators, CLI helpers). + */ + export type StepKind = 'Source' | 'Transformer' | 'Destination' | 'Store'; + + /** + * Union of the four step interfaces. + * + * Use this where a function accepts "any step in a flow" — e.g. a + * shared `validateReference` that branches on `StepKind` without + * narrowing to one specific shape. + */ + export type Step = Source | Transformer | Destination | Store; + /** * Named contract map. * Each key is a contract name, each value is a contract rule. @@ -548,32 +580,16 @@ export namespace Flow { * Use `extends` to inherit from another named contract (additive merge). */ export interface ContractRule { - /** Inherit from another named contract (additive merge). */ + /** Inherit from another named contract entry. */ extends?: string; - - /** Tagging level (used by validators / runtime tagging policy). */ + /** Contract revision marker. */ tagging?: number; - - /** Human-readable description of the contract. */ + /** Human-readable note. */ description?: string; - - /** JSON Schema for event.globals. */ - globals?: ContractSchema; - - /** JSON Schema for event.context. */ - context?: ContractSchema; - - /** JSON Schema for event.custom. */ - custom?: ContractSchema; - - /** JSON Schema for event.user. */ - user?: ContractSchema; - - /** JSON Schema for event.consent. */ - consent?: ContractSchema; - - /** Entity-action event schemas. */ - events?: ContractEvents; + /** Entity-action keyed JSON Schemas (wildcard fallback at runtime). */ + events?: ValidateEvents; + /** JSON Schema for the full event. */ + schema?: JsonSchema; } /** diff --git a/packages/core/src/types/index.ts b/packages/core/src/types/index.ts index f87a6ef87..098b523ee 100644 --- a/packages/core/src/types/index.ts +++ b/packages/core/src/types/index.ts @@ -37,3 +37,5 @@ export type { SendDataValue, SendHeaders, SendResponse } from './send'; // Export ingest types and factory directly export type { Ingest, IngestMeta } from './ingest'; export { createIngest } from './ingest'; + +export type { JsonSchema, ValidateEvents, Validate } from './validate'; diff --git a/packages/core/src/types/source.ts b/packages/core/src/types/source.ts index 6615d1a3b..15b9c3caf 100644 --- a/packages/core/src/types/source.ts +++ b/packages/core/src/types/source.ts @@ -8,7 +8,7 @@ import type { Context as BaseContext, } from './index'; import type { DestroyFn, SetupFn } from './lifecycle'; -import type { RouteSpec } from './transformer'; +import type { Route } from './transformer'; /** * Base Env interface for dependency injection into sources. @@ -189,9 +189,10 @@ export type InitSource = { config?: Partial>; env?: Partial>; primary?: boolean; - next?: RouteSpec; - before?: RouteSpec; + next?: Route; + before?: Route; cache?: import('./cache').Cache; + validate?: import('./validate').Validate; }; /** diff --git a/packages/core/src/types/transformer.ts b/packages/core/src/types/transformer.ts index 9dc4f7534..686bf445a 100644 --- a/packages/core/src/types/transformer.ts +++ b/packages/core/src/types/transformer.ts @@ -2,32 +2,62 @@ import type { Collector, Logger, WalkerOS, Context as BaseContext } from '.'; import type { DestroyFn } from './lifecycle'; import type { Ingest } from './ingest'; +import type { Config as MappingConfig } from './mapping'; +import type { MatchExpression } from './matcher'; /** - * A single conditional routing rule. Pairs a `match` expression (or `'*'` - * wildcard) against ingest metadata with a `next` step to follow when the - * match fires. Used inside `Route[]` arrays on `Flow.Source.next`, - * `Flow.Source.before`, `Flow.Transformer.next/before`, and - * `Flow.Destination.next/before`. Routes are evaluated in order, first match - * wins, no match falls through unchanged. The `next` field of a Route - * mirrors the outer-position `next` semantics: it points to whatever comes - * downstream when this rule fires. + * Unified route grammar for Flow v4. A `Route` is one of: + * - a transformer ID string (`"redact"`) + * - a sequence of routes (`["a", "b", "c"]` — sugar for chained `.next`) + * - a `RouteConfig` — a gated / dispatching node. + * + * `RouteConfig` is a disjoint union — set exactly one of `next`, `one`, + * `many`, or neither (pure gate). The disjointness is enforced by `never` + * sibling properties at the type level and `z.strictObject` at the schema + * level. + * + * Operators: + * - `next`: single continuation. + * - `one`: first-match dispatch (walk entries, first whose match passes wins). + * - `many`: all-match terminal fan-out (every matching entry spawns an + * independent flow; main chain terminates here). Restricted to + * pre-collector positions (source.next, transformer.next, transformer.before). */ -export interface Route { - match: import('./matcher').MatchExpression | '*'; - next: RouteSpec; +export type Route = string | Route[] | RouteConfig; + +export type RouteConfig = + | RouteNextConfig + | RouteOneConfig + | RouteManyConfig + | RouteGateConfig; + +export interface RouteNextConfig { + match?: MatchExpression; + next: Route; + one?: never; + many?: never; } -/** - * The union accepted at every chain-routing boundary. A plain `string` - * targets one step by ID; `string[]` declares an explicit sequence ignoring - * per-step `next`; `Route[]` enables conditional routing on ingest metadata. - * At runtime, `compileNext()` collapses any RouteSpec into a `CompiledNext` - * (static, chain, or routes form) for hot-path evaluation. Surfaces via - * `Flow.Source.before/next`, `Flow.Transformer.before/next`, - * `Flow.Destination.before/next`. - */ -export type RouteSpec = string | string[] | Route[]; +export interface RouteOneConfig { + match?: MatchExpression; + one: Route[]; + next?: never; + many?: never; +} + +export interface RouteManyConfig { + match?: MatchExpression; + many: Route[]; + next?: never; + one?: never; +} + +export interface RouteGateConfig { + match: MatchExpression; + next?: never; + one?: never; + many?: never; +} /** * Base environment interface for walkerOS transformers. @@ -83,8 +113,8 @@ export interface Config { env?: Env; id?: string; logger?: Logger.Config; - before?: RouteSpec; // Pre-transformer chain (runs before push) - next?: RouteSpec; // Graph wiring to next transformer + before?: Route; // Pre-transformer chain (runs before push) + next?: Route; // Graph wiring to next transformer cache?: import('./cache').Cache; // Step-level cache config init?: boolean; // Track init state (like Destination) disabled?: boolean; // Completely skip this transformer in chains @@ -92,6 +122,22 @@ export interface Config { mock?: unknown; /** Path-specific mock values keyed by chain path (e.g., "destination.ga4.before"). Takes precedence over global mock. */ chainMocks?: Record; + /** + * Declarative event-to-event mapping applied when this transformer step + * has no `code`. Same field name as on `Destination.Config`, but the + * semantic differs by position: on a destination, `mapping` produces a + * vendor-shaped payload; on a transformer step, it mutates the event + * itself. The collector synthesizes a push that runs + * `processEventMapping` and returns the transformed event (or drops it + * when a rule has `ignore: true`). + * + * At the transformer position, only event-mutating fields apply: + * `policy`, `mapping[].policy`, `mapping[].name`, `mapping[].ignore`, + * `mapping[].consent`, `include`. Vendor-payload fields (`data`, + * `mapping[].data`, `silent`) are ignored at this position with a + * one-time warning. + */ + mapping?: MappingConfig; } /** @@ -116,17 +162,23 @@ export interface Context< export interface Result { event?: E; respond?: import('../respond').RespondFn; - next?: RouteSpec; + next?: Route; } /** * Result of running a transformer chain. * Returns the processed event (singular, fan-out array, or null if dropped) * alongside the potentially wrapped respond function. + * + * `stopped` signals pipeline-halt — when set, the caller MUST NOT propagate + * the event further downstream (no destinations, no subsequent chains). + * Used by `cache.stop: true` on pre-collector transformers so the documented + * "downstream transformers and destinations are skipped" semantic holds. */ export interface ChainResult { event: WalkerOS.DeepPartialEvent | WalkerOS.DeepPartialEvent[] | null; respond?: import('../respond').RespondFn; + stopped?: true; } /** @@ -187,12 +239,25 @@ export type Init = ( * Used in collector registration. */ export type InitTransformer = { - code: Init; + /** + * Initialization function. When omitted, the entry is a pass-through step: + * - If `mapping` is present, the collector synthesizes a mapping-only + * push using `processEventMapping`. + * - Otherwise it's a named hop that only hosts a `before` / `next` / + * `cache` chain. + * + * Validation: an entry without `code` must declare at least one of + * `package`, `before`, `next`, `cache`, `mapping`. Enforced by + * `validateTransformerEntry` in `@walkeros/core`. + */ + code?: Init; config?: Partial>; env?: Partial>; - before?: RouteSpec; - next?: RouteSpec; + before?: Route; + next?: Route; cache?: import('./cache').Cache; + mapping?: MappingConfig; + validate?: import('./validate').Validate; }; /** diff --git a/packages/core/src/types/validate.ts b/packages/core/src/types/validate.ts new file mode 100644 index 000000000..11d921843 --- /dev/null +++ b/packages/core/src/types/validate.ts @@ -0,0 +1,27 @@ +/** + * Structural JSON Schema type. Kept dep-free (no `ajv` import in core) + * so the runtime graph of any consumer of `@walkeros/core` does not pull + * AJV transitively. + */ +export type JsonSchema = Record; + +/** + * Entity-action keyed event validation schemas. + * Wildcard fallback semantic: entity.action → entity.* → *.action → *.*. + */ +export type ValidateEvents = Record>; + +/** + * Step-level validation primitive. Declares validation intent for a source, + * transformer, or destination: a `format` toggle, entity-action keyed schemas, + * and/or a generic JSON Schema for the full input. Declarative only, + * consumers (CLI tooling, MCP, custom runners) decide whether and how to enforce. + */ +export interface Validate { + /** Validate the full `WalkerOS.Event` structural shape. */ + format?: boolean; + /** Entity-action keyed JSON Schemas. */ + events?: ValidateEvents; + /** Generic JSON Schema for the full input. */ + schema?: JsonSchema; +} diff --git a/packages/mcps/mcp/src/__tests__/catalog.test.ts b/packages/mcps/mcp/src/__tests__/catalog.test.ts index 0f609140f..e2ab79ee8 100644 --- a/packages/mcps/mcp/src/__tests__/catalog.test.ts +++ b/packages/mcps/mcp/src/__tests__/catalog.test.ts @@ -123,7 +123,7 @@ describe('fetchCatalog', () => { mockFetch .mockResolvedValueOnce( npmSearchResponse([ - { name: '@walkeros/store-memory', version: '3.0.0' }, + { name: '@walkeros/server-store-fs', version: '3.0.0' }, ]), ) .mockResolvedValueOnce( @@ -138,7 +138,7 @@ describe('fetchCatalog', () => { mockFetch .mockResolvedValueOnce( npmSearchResponse([ - { name: '@walkeros/store-memory', version: '3.0.0' }, + { name: '@walkeros/server-store-fs', version: '3.0.0' }, ]), ) .mockResolvedValueOnce(walkerOSJsonResponse({ type: 'store' })); @@ -191,7 +191,7 @@ describe('fetchCatalog', () => { mockFetch .mockResolvedValueOnce( npmSearchResponse([ - { name: '@walkeros/store-memory', version: '3.0.0' }, + { name: '@walkeros/server-store-fs', version: '3.0.0' }, ]), ) .mockResolvedValueOnce(walkerOSJsonResponse({ type: 'store' })); diff --git a/packages/mcps/mcp/src/__tests__/tools/validate.test.ts b/packages/mcps/mcp/src/__tests__/tools/validate.test.ts index b0797d3ae..93148bb11 100644 --- a/packages/mcps/mcp/src/__tests__/tools/validate.test.ts +++ b/packages/mcps/mcp/src/__tests__/tools/validate.test.ts @@ -15,6 +15,7 @@ jest.mock('@walkeros/cli/dev', () => ({ jest.mock('@walkeros/cli', () => ({ validate: jest.fn(), + loadJsonConfig: jest.fn(), })); jest.mock('@walkeros/core', () => ({ @@ -44,8 +45,9 @@ jest.mock('@walkeros/core', () => ({ })), })); -import { validate } from '@walkeros/cli'; +import { validate, loadJsonConfig } from '@walkeros/cli'; const mockValidate = jest.mocked(validate); +const mockLoadJsonConfig = jest.mocked(loadJsonConfig); function createMockServer() { const tools: Record = {}; @@ -235,4 +237,184 @@ describe('flow_validate tool', () => { expect(result.structuredContent.valid).toBe(true); expect(JSON.parse(result.content[0].text).valid).toBe(true); }); + + describe('deprecated package detection: @walkeros/store-memory', () => { + it('rejects flow.json declaring @walkeros/store-memory in a store', async () => { + const flow = { + version: 4, + flows: { + default: { + config: { platform: 'server' }, + stores: { + mem: { package: '@walkeros/store-memory', config: {} }, + }, + }, + }, + }; + const mockResult: ValidateResult = { + valid: true, + type: 'flow', + errors: [], + warnings: [], + details: {}, + }; + mockValidate.mockResolvedValue(mockResult); + mockLoadJsonConfig.mockResolvedValue(flow); + + const tool = server.getTool('flow_validate'); + const result = await tool.handler({ + type: 'flow', + input: JSON.stringify(flow), + flow: undefined, + }); + + const parsed = JSON.parse(result.content[0].text); + expect(parsed.valid).toBe(false); + expect( + parsed.errors.some((e: { message: string }) => + /@walkeros\/store-memory/.test(e.message), + ), + ).toBe(true); + expect( + parsed.errors.some((e: { message: string }) => + /omit cache\.store|built-in cache/.test(e.message), + ), + ).toBe(true); + }); + + it('detects @walkeros/store-memory across multiple flows and stores', async () => { + const flow = { + version: 4, + flows: { + a: { + config: { platform: 'server' }, + stores: { + cache1: { package: '@walkeros/store-memory', config: {} }, + other: { package: '@walkeros/server-store-fs', config: {} }, + }, + }, + b: { + config: { platform: 'server' }, + stores: { + cache2: { package: '@walkeros/store-memory', config: {} }, + }, + }, + }, + }; + const mockResult: ValidateResult = { + valid: true, + type: 'flow', + errors: [], + warnings: [], + details: {}, + }; + mockValidate.mockResolvedValue(mockResult); + mockLoadJsonConfig.mockResolvedValue(flow); + + const tool = server.getTool('flow_validate'); + const result = await tool.handler({ + type: 'flow', + input: JSON.stringify(flow), + flow: undefined, + }); + + const parsed = JSON.parse(result.content[0].text); + expect(parsed.valid).toBe(false); + const memoryErrors = parsed.errors.filter((e: { message: string }) => + /@walkeros\/store-memory/.test(e.message), + ); + expect(memoryErrors.length).toBe(2); + expect( + parsed.errors.some((e: { path: string }) => + /flows\.a\.stores\.cache1/.test(e.path), + ), + ).toBe(true); + expect( + parsed.errors.some((e: { path: string }) => + /flows\.b\.stores\.cache2/.test(e.path), + ), + ).toBe(true); + }); + + it('passes a flow.json with no @walkeros/store-memory references', async () => { + const flow = { + version: 4, + flows: { + default: { + config: { platform: 'server' }, + stores: { + fs: { package: '@walkeros/server-store-fs', config: {} }, + }, + }, + }, + }; + const mockResult: ValidateResult = { + valid: true, + type: 'flow', + errors: [], + warnings: [], + details: {}, + }; + mockValidate.mockResolvedValue(mockResult); + mockLoadJsonConfig.mockResolvedValue(flow); + + const tool = server.getTool('flow_validate'); + const result = await tool.handler({ + type: 'flow', + input: JSON.stringify(flow), + flow: undefined, + }); + + const parsed = JSON.parse(result.content[0].text); + expect(parsed.valid).toBe(true); + expect(parsed.errors).toEqual([]); + }); + + it('skips deprecated-package check for non-flow validation types', async () => { + const mockResult: ValidateResult = { + valid: true, + type: 'event', + errors: [], + warnings: [], + details: {}, + }; + mockValidate.mockResolvedValue(mockResult); + + const tool = server.getTool('flow_validate'); + const result = await tool.handler({ + type: 'event', + input: '{"name":"page view"}', + flow: undefined, + }); + + expect(mockLoadJsonConfig).not.toHaveBeenCalled(); + const parsed = JSON.parse(result.content[0].text); + expect(parsed.valid).toBe(true); + }); + + it('skips deprecated-package check when input cannot be loaded', async () => { + const mockResult: ValidateResult = { + valid: false, + type: 'flow', + errors: [{ path: 'input', message: 'invalid json' }], + warnings: [], + details: {}, + }; + mockValidate.mockResolvedValue(mockResult); + mockLoadJsonConfig.mockRejectedValue(new Error('parse error')); + + const tool = server.getTool('flow_validate'); + const result = await tool.handler({ + type: 'flow', + input: 'not json', + flow: undefined, + }); + + const parsed = JSON.parse(result.content[0].text); + // existing errors preserved; no crash even though load failed + expect(parsed.errors).toHaveLength(1); + expect(parsed.errors[0].path).toBe('input'); + expect(parsed.errors[0].message).toContain('invalid json'); + }); + }); }); diff --git a/packages/mcps/mcp/src/instructions.ts b/packages/mcps/mcp/src/instructions.ts index a548e8763..bb9785616 100644 --- a/packages/mcps/mcp/src/instructions.ts +++ b/packages/mcps/mcp/src/instructions.ts @@ -52,6 +52,11 @@ Every component in a flow is a **step**: sources capture events, transformers pr - **Contracts** define event schemas using entity-action keying. Can generate FROM mappings or scaffold mappings FROM contracts. - **Variables** (\$var, \$env, \$code, \$store) enable DRY, environment-aware config. Whole-string \`$var.name\` references preserve native type (object/array/scalar); inline interpolation requires a scalar. Deep paths via \`$var.name.deep.path\`. - **Consent** gates destinations, mapping rules, and individual fields. Privacy-first by design. +- **Routing** wires steps via \`next\` (pre-collector) and \`before\` (post-collector). A route is a string ID, a sequence (\`["a", "b"]\`), or a RouteConfig (\`{ match?, next }\` or \`{ match?, one: [...] }\`). The \`one\` operator dispatches first-match against an ordered list of branches. Use \`many\` (instead of \`one\`) when every matching entry should run as an independent parallel flow — restricted to pre-collector positions. The optional \`match\` field is omitted to mean always-match (no wildcard literal). +- **Pass-through steps** are transformer entries with no \`code\` and no \`package\`. The runtime synthesizes the push for them automatically. Three flavors share this shape: a \`before\` / \`next\`-only step (named hop reusable across destinations), a \`cache\`-only step (dedup, rate-limit), and a \`mapping\`-only step (declarative event-to-event transform). A pass-through must declare at least one of \`before\`, \`next\`, \`cache\`, or \`mapping\`. +- **Mapping at the transformer position** uses the same \`Mapping.Config\` shape as destinations, but the semantic is event-to-event: \`policy\` and per-rule \`policy\`, \`mapping[].name\` (rename), \`mapping[].ignore\` (drop from chain), \`consent\`, and \`include\` apply. Vendor-payload fields (\`data\`, \`silent\`, \`mapping[].data\`) are no-ops at this position. +- **Closed-schema rule on transformer entries:** known keys only. Operative keys are \`code\`, \`package\`, \`before\`, \`next\`, \`cache\`, \`mapping\`. Combined with structural keys (\`config\`, \`env\`, \`validate\`, \`disabled\`, \`id\`, etc.). Unknown top-level keys on a transformer step are errors (catches typos like \`dedup: {}\` instead of nested under \`cache\`). \`code\` + \`package\` together is a conflict. +- **Cache** memoizes step output on a configured store. Set \`cache.stop: true\` to short-circuit the chain on HIT (sources default to stop-on-HIT). Set \`cache.namespace\` to prefix keys; omit it to write keys directly. \`CacheRule.match\` is optional, omit for always-match. ## Simulation Tips diff --git a/packages/mcps/mcp/src/prompts/add-step.ts b/packages/mcps/mcp/src/prompts/add-step.ts index 76df5255f..a62064d7e 100644 --- a/packages/mcps/mcp/src/prompts/add-step.ts +++ b/packages/mcps/mcp/src/prompts/add-step.ts @@ -50,6 +50,10 @@ export function registerAddStepPrompt(server: McpServer) { '- Read the walkeros://reference/flow-schema resource to understand connection rules.', '- Sources connect to pre-collector transformers via `next`.', '- Destinations connect to post-collector transformers via `before`.', + '- Routing supports string IDs, sequences (`["a", "b"]`), or RouteConfig (`{ match?, next }` for gated single-target or `{ match?, one: [...] }` for first-match dispatch). Use `many` (instead of `one`) when every matching entry should run as an independent parallel flow — restricted to pre-collector positions. Omit `match` for always-match.', + '- A transformer entry can be code-bearing (`code`), package-bearing (`package`), or a **pass-through step** (no `code`, no `package`). Pass-through synthesis is automatic at runtime. Three flavors of pass-through: `before`/`next`-only (named hop reusable across destinations), `cache`-only (dedup, rate-limit), or `mapping`-only (declarative event-to-event transform). A pass-through must declare at least one of `before`, `next`, `cache`, or `mapping`.', + '- The `mapping` field on a transformer step uses the same `Mapping.Config` shape as destinations, but the semantic is event-to-event (mutates the event in place via `policy`, per-rule `policy`, `mapping[].name` for renames, `mapping[].ignore` to drop). Vendor-payload fields (`data`, `silent`) are no-ops at this position.', + '- Closed schema: unknown top-level keys on a transformer step are errors (catches typos like `dedup` instead of `cache`). `code` + `package` together is a conflict.', '- Stores are passive — referenced via `$store.storeName` in env values.', '- Use variables ($var) for values that change between environments.', '- For required settings without defaults in the package schema, ask the user which value to use. Do not guess credentials, IDs, or environment-specific values.', diff --git a/packages/mcps/mcp/src/tools/validate.ts b/packages/mcps/mcp/src/tools/validate.ts index 8354a0dd0..4c95d9fe8 100644 --- a/packages/mcps/mcp/src/tools/validate.ts +++ b/packages/mcps/mcp/src/tools/validate.ts @@ -1,4 +1,4 @@ -import { validate } from '@walkeros/cli'; +import { validate, loadJsonConfig } from '@walkeros/cli'; import type { ValidateResult } from '@walkeros/cli'; import { schemas } from '@walkeros/cli/dev'; import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js'; @@ -8,6 +8,49 @@ import { wrapUserData } from '../user-data.js'; import type { ToolSpec } from '../tool-spec.js'; +/** + * Detect deprecated `@walkeros/store-memory` references in a flow.json. + * Returns one validation error per offending store. + * + * MCP-layer concern: `@walkeros/store-memory` was removed and replaced by + * the built-in cache (`Flow.Store.cache`). Surface a clear migration error + * so users know what to do. + */ +const DEPRECATED_STORE_PACKAGE = '@walkeros/store-memory'; + +function detectDeprecatedStorePackages( + config: unknown, +): ValidateResult['errors'] { + const errors: ValidateResult['errors'] = []; + if (!config || typeof config !== 'object') return errors; + const flows = (config as { flows?: unknown }).flows; + if (!flows || typeof flows !== 'object') return errors; + for (const [flowName, flowEntry] of Object.entries( + flows as Record, + )) { + if (!flowEntry || typeof flowEntry !== 'object') continue; + const stores = (flowEntry as { stores?: unknown }).stores; + if (!stores || typeof stores !== 'object') continue; + for (const [storeId, storeEntry] of Object.entries( + stores as Record, + )) { + if (!storeEntry || typeof storeEntry !== 'object') continue; + const pkg = (storeEntry as { package?: unknown }).package; + if (pkg === DEPRECATED_STORE_PACKAGE) { + errors.push({ + path: `flows.${flowName}.stores.${storeId}`, + message: + `Store "${storeId}" uses ${DEPRECATED_STORE_PACKAGE}, which has been removed. ` + + 'Use the built-in cache by omitting cache.store, or remove the store ' + + 'declaration if it was only used as a cache target.', + code: 'DEPRECATED_PACKAGE', + }); + } + } + } + return errors; +} + function wrapIssueMessages(result: ValidateResult): ValidateResult { return { ...result, @@ -65,7 +108,29 @@ async function flowValidateHandlerBody(input: unknown) { flow, path, }); - const hints = result.valid + + // Post-validation pass: detect deprecated `@walkeros/store-memory` + // references in flow configs. MCP-layer concern — keeps core + // validation package-agnostic. + let augmented = result; + if (type === 'flow' && typeof validateInput === 'string') { + try { + const config = await loadJsonConfig(validateInput); + const deprecatedErrors = detectDeprecatedStorePackages(config); + if (deprecatedErrors.length > 0) { + augmented = { + ...result, + valid: false, + errors: [...result.errors, ...deprecatedErrors], + }; + } + } catch { + // Load failed (invalid JSON, missing file, etc.). The CLI validate + // call already surfaces that; skip the deprecated-package check. + } + } + + const hints = augmented.valid ? { next: [ 'Use flow_simulate to test event flow', @@ -78,7 +143,7 @@ async function flowValidateHandlerBody(input: unknown) { 'Read walkeros://reference/flow-schema for correct structure', ], }; - return mcpResult(wrapIssueMessages(result), hints); + return mcpResult(wrapIssueMessages(augmented), hints); } catch (error) { return mcpError( error, diff --git a/packages/server/destinations/aws/package.json b/packages/server/destinations/aws/package.json index d01515f52..147c0d06f 100644 --- a/packages/server/destinations/aws/package.json +++ b/packages/server/destinations/aws/package.json @@ -37,6 +37,7 @@ "@aws-sdk/client-firehose": "^3.952.0", "@aws-sdk/client-sns": "^3.952.0", "@aws-sdk/client-sts": "^3.952.0", + "@walkeros/core": "4.0.2", "@walkeros/server-core": "4.0.2" }, "devDependencies": {}, diff --git a/packages/server/destinations/gcp/package.json b/packages/server/destinations/gcp/package.json index 1a88ad585..a933ff858 100644 --- a/packages/server/destinations/gcp/package.json +++ b/packages/server/destinations/gcp/package.json @@ -32,6 +32,7 @@ "@google-cloud/bigquery": "^8.1.1", "@google-cloud/bigquery-storage": "^5.1.0", "@google-cloud/pubsub": "^5.3.0", + "@walkeros/core": "4.0.2", "@walkeros/server-core": "4.0.2" }, "devDependencies": {}, diff --git a/packages/server/stores/sheets/README.md b/packages/server/stores/sheets/README.md index a0395c648..60dfad328 100644 --- a/packages/server/stores/sheets/README.md +++ b/packages/server/stores/sheets/README.md @@ -66,25 +66,14 @@ the core `Cache` config, backed by a fast in-memory store: "id": "1AbCdEfGhIjKlMnOpQrStUvWxYz", "sheet": "Customers" } - } - }, - "lookupCache": { - "package": "@walkeros/store-memory", - "config": { "settings": {} } + }, + "cache": { "rules": [{ "ttl": 60 }] } } }, "transformers": { "enrich": { "package": "@walkeros/transformer-enrich", - "env": { - "store": "$store.crm", - "cache": "$store.lookupCache" - }, - "config": { - "settings": { - "cache": { "ttl": 60000 } - } - } + "env": { "store": "$store.crm" } } } } diff --git a/packages/server/transformers/file/package.json b/packages/server/transformers/file/package.json index 6b385222a..8801ae083 100644 --- a/packages/server/transformers/file/package.json +++ b/packages/server/transformers/file/package.json @@ -30,8 +30,7 @@ "@walkeros/core": "4.0.2" }, "devDependencies": { - "@walkeros/core": "4.0.2", - "@walkeros/store-memory": "4.0.2" + "@walkeros/core": "4.0.2" }, "repository": { "url": "git+https://github.com/elbwalker/walkerOS.git", diff --git a/packages/server/transformers/file/src/__tests__/stepExamples.test.ts b/packages/server/transformers/file/src/__tests__/stepExamples.test.ts index 3260521c1..5e1757995 100644 --- a/packages/server/transformers/file/src/__tests__/stepExamples.test.ts +++ b/packages/server/transformers/file/src/__tests__/stepExamples.test.ts @@ -1,15 +1,31 @@ -import type { Transformer, WalkerOS } from '@walkeros/core'; +import type { Store, Transformer, WalkerOS } from '@walkeros/core'; import type { RespondFn, RespondOptions } from '@walkeros/core'; import { createIngest, createMockContext, createMockLogger, } from '@walkeros/core'; -import { createMockStore } from '@walkeros/store-memory'; import { transformerFile } from '../transformer'; import type { Types } from '../types'; import { examples } from '../dev'; +function createMockStore(): Store.Instance { + const data = new Map(); + return { + type: 'mock', + config: {}, + get(key) { + return data.get(key); + }, + set(key, value) { + data.set(key, value); + }, + delete(key) { + data.delete(key); + }, + }; +} + describe('Step Examples', () => { const mockLogger = createMockLogger(); diff --git a/packages/server/transformers/file/src/__tests__/transformer.test.ts b/packages/server/transformers/file/src/__tests__/transformer.test.ts index de51131c5..c5357cb83 100644 --- a/packages/server/transformers/file/src/__tests__/transformer.test.ts +++ b/packages/server/transformers/file/src/__tests__/transformer.test.ts @@ -1,10 +1,30 @@ -import type { Transformer, WalkerOS } from '@walkeros/core'; +import type { Store, Transformer, WalkerOS } from '@walkeros/core'; import type { RespondFn, RespondOptions } from '@walkeros/core'; -import { createIngest, createMockContext, createMockLogger } from '@walkeros/core'; -import { createMockStore } from '@walkeros/store-memory'; +import { + createIngest, + createMockContext, + createMockLogger, +} from '@walkeros/core'; import { transformerFile } from '../transformer'; import type { FileSettings, Types } from '../types'; +function createMockStore(): Store.Instance { + const data = new Map(); + return { + type: 'mock', + config: {}, + get(key) { + return data.get(key); + }, + set(key, value) { + data.set(key, value); + }, + delete(key) { + data.delete(key); + }, + }; +} + describe('Transformer File', () => { const mockLogger = createMockLogger(); @@ -28,7 +48,11 @@ describe('Transformer File', () => { env: respond ? { respond } : {}, logger: mockLogger, id: 'test-file', - ingest: { ...createIngest('test'), ...ingestData, _meta: createIngest('test')._meta }, + ingest: { + ...createIngest('test'), + ...ingestData, + _meta: createIngest('test')._meta, + }, }); const baseEvent: WalkerOS.DeepPartialEvent = { name: 'page view' }; diff --git a/packages/stores/memory/CHANGELOG.md b/packages/stores/memory/CHANGELOG.md deleted file mode 100644 index 04f352961..000000000 --- a/packages/stores/memory/CHANGELOG.md +++ /dev/null @@ -1,156 +0,0 @@ -# @walkeros/store-memory - -## 4.0.2 - -### Patch Changes - -- Updated dependencies [a6a0ea7] - - @walkeros/core@4.0.2 - -## 4.0.1 - -### Patch Changes - -- Updated dependencies [381dfe7] -- Updated dependencies [1524275] -- Updated dependencies [03d7055] - - @walkeros/core@4.0.1 - -## 4.0.0 - -### Patch Changes - -- Updated dependencies [93ea9c4] -- Updated dependencies [465775c] -- Updated dependencies [942a7fe] -- Updated dependencies [cfc7469] -- Updated dependencies [8e06b1f] -- Updated dependencies [3d50dd6] -- Updated dependencies [1ef33d9] - - @walkeros/core@4.0.0 - -## 3.4.2 - -### Patch Changes - -- @walkeros/core@3.4.2 - -## 3.4.1 - -### Patch Changes - -- Updated dependencies [12adf24] -- Updated dependencies [75aa26b] - - @walkeros/core@3.4.1 - -## 3.4.0 - -### Minor Changes - -- 724f97e: Migrate every step example in every walkerOS package to the - standardized `[callable, ...args][]` shape introduced in `@walkeros/core`. - Every step example's `out` is now an array of effect tuples whose first - element is the callable's public SDK name (`'gtag'`, `'analytics.track'`, - `'fbq'`, `'dataLayer.push'`, `'sendServer'`, `'fetch'`, `'trackClient.track'`, - `'amplitude.track'`, `'fs.writeFile'`, `'producer.send'`, `'client.xadd'`, - `'client.send'`, `'dataset.table.insert'`, etc.). Source examples use `'elb'` - as the callable; transformer examples use the reserved `'return'` keyword; - store examples use store-operation callables (`'get'`, `'set'`). Tests capture - real calls on each component's spy and assert against `example.out` directly — - the hardcoded `PACKAGE_CALLS` registry in the app is no longer consulted - (emptied; plan #3 removes it structurally). - -### Patch Changes - -- Updated dependencies [74940cc] -- Updated dependencies [525f5d9] - - @walkeros/core@3.4.0 - -## 3.3.1 - -### Patch Changes - -- @walkeros/core@3.3.1 - -## 3.3.0 - -### Patch Changes - -- Updated dependencies [2849acb] -- Updated dependencies [08c365a] -- Updated dependencies [08c365a] -- Updated dependencies [08c365a] -- Updated dependencies [08c365a] - - @walkeros/core@3.3.0 - -## 3.2.0 - -### Patch Changes - -- Updated dependencies [eb865e1] -- Updated dependencies [c0a53f9] -- Updated dependencies [f007c9f] -- Updated dependencies [bf2dc5b] -- Updated dependencies [da0b640] - - @walkeros/core@3.2.0 - -## 3.1.1 - -### Patch Changes - -- @walkeros/core@3.1.1 - -## 3.1.0 - -### Patch Changes - -- Updated dependencies [dfc6738] -- Updated dependencies [966342b] -- Updated dependencies [bee8ba7] -- Updated dependencies [966342b] -- Updated dependencies [df990d4] - - @walkeros/core@3.1.0 - -## 3.0.2 - -### Patch Changes - -- @walkeros/core@3.0.2 - -## 3.0.1 - -### Patch Changes - -- @walkeros/core@3.0.1 - -## 3.0.0 - -### Minor Changes - -- 4acad8e: Add @walkeros/store-memory package with in-memory store (LRU - eviction, lazy TTL), MockStore for testing, and withNamespace utility for key - isolation. -- b6c8fa8: Add stores as a first-class component type in Flow.Config. Stores get - their own `stores` section in flow settings, a `collector.stores` registry, - and `$store:storeId` env wiring in the bundler. Includes `storeMemoryInit` for - Flow.Config compatibility and type widening in cache/file transformers. - -### Patch Changes - -- 499e27a: Add sideEffects declarations to all packages for bundler tree-shaking - support. -- Updated dependencies [2b259b6] -- Updated dependencies [2614014] -- Updated dependencies [6ae0ee3] -- Updated dependencies [37299a9] -- Updated dependencies [499e27a] -- Updated dependencies [0e5eede] -- Updated dependencies [d11f574] -- Updated dependencies [d11f574] -- Updated dependencies [1fe337a] -- Updated dependencies [5cb84c1] -- Updated dependencies [23f218a] -- Updated dependencies [499e27a] -- Updated dependencies [c83d909] -- Updated dependencies [b6c8fa8] - - @walkeros/core@3.0.0 diff --git a/packages/stores/memory/README.md b/packages/stores/memory/README.md deleted file mode 100644 index a0eff25dd..000000000 --- a/packages/stores/memory/README.md +++ /dev/null @@ -1,117 +0,0 @@ -# @walkeros/store-memory - -In-process key-value store with LRU eviction, TTL expiration, and namespace -support. - -[Source Code](https://github.com/elbwalker/walkerOS/tree/main/packages/stores/memory) -| [NPM](https://www.npmjs.com/package/@walkeros/store-memory) | -[Documentation](https://www.walkeros.io/docs/stores/memory) - -## Quick start (bundled mode) - -```json -{ - "version": 3, - "flows": { - "default": { - "server": {}, - "stores": { - "cache": { - "package": "@walkeros/store-memory", - "config": { - "settings": { - "maxSize": 10485760, - "maxEntries": 1000 - } - } - } - } - } - } -} -``` - -## Integrated mode - -```typescript -import { startFlow } from '@walkeros/collector'; -import { storeMemoryInit } from '@walkeros/store-memory'; - -await startFlow({ - stores: { - cache: { - code: storeMemoryInit, - config: { - settings: { - maxSize: 10 * 1024 * 1024, // 10 MB (default) - maxEntries: 1000, - }, - }, - }, - }, -}); -``` - -## Features - -- **LRU eviction**: Least-recently-used entries are evicted when `maxSize` or - `maxEntries` is exceeded -- **TTL expiration**: Optional per-entry time-to-live in milliseconds -- **Namespace utility**: Scope keys with `withNamespace(store, 'prefix')` -- **Mock store**: `createMockStore()` for unit testing with operation tracking -- **Platform-agnostic**: Works in both browser and server flows - -## Installation - -```bash -npm install @walkeros/store-memory -``` - -## Configuration - -| Setting | Type | Required | Default | Description | -| ------------ | -------- | -------- | ------------------ | --------------------------- | -| `maxSize` | `number` | No | `10485760` (10 MB) | Maximum total size in bytes | -| `maxEntries` | `number` | No | — | Maximum number of entries | - -## API - -```typescript -const value = store.get('key'); // T | undefined -store.set('key', 'value'); // void -store.set('key', 'value', 5000); // void (TTL in ms) -store.delete('key'); // void -store.destroy(); // void (clears all) -``` - -## Programmatic usage - -Use `createMemoryStore()` directly when you don't need the `Store.Init` wrapper: - -```typescript -import { createMemoryStore, withNamespace } from '@walkeros/store-memory'; - -const store = createMemoryStore({ maxSize: 1024 }); -const sessions = withNamespace(store, 'session'); - -sessions.set('user', 'alice'); // stored as "session:user" -``` - -## Testing - -```typescript -import { createMockStore } from '@walkeros/store-memory'; - -const store = createMockStore(); -store.set('key', 'value'); -store.get('key'); - -console.log(store._sets); // [{ key: 'key', value: 'value', ttl: undefined }] -console.log(store._gets); // ['key'] -console.log(store._deletes); // [] -``` - -## Related - -- [Documentation](https://www.walkeros.io/docs/stores/memory) -- [Stores overview](https://www.walkeros.io/docs/stores) diff --git a/packages/stores/memory/jest.config.mjs b/packages/stores/memory/jest.config.mjs deleted file mode 100644 index 346de0a8d..000000000 --- a/packages/stores/memory/jest.config.mjs +++ /dev/null @@ -1,3 +0,0 @@ -import baseConfig from '@walkeros/config/jest'; -const config = {}; -export default { ...baseConfig, ...config }; diff --git a/packages/stores/memory/package.json b/packages/stores/memory/package.json deleted file mode 100644 index 8a58c4107..000000000 --- a/packages/stores/memory/package.json +++ /dev/null @@ -1,72 +0,0 @@ -{ - "name": "@walkeros/store-memory", - "description": "In-memory store for walkerOS with LRU eviction, TTL support, and namespace utility", - "version": "4.0.2", - "license": "MIT", - "main": "./dist/index.js", - "module": "./dist/index.mjs", - "types": "./dist/index.d.ts", - "exports": { - ".": { - "types": "./dist/index.d.ts", - "import": "./dist/index.mjs", - "require": "./dist/index.js" - }, - "./dev": { - "types": "./dist/dev.d.ts", - "import": "./dist/dev.mjs", - "require": "./dist/dev.js" - }, - "./walkerOS.json": "./dist/walkerOS.json" - }, - "files": [ - "dist/**" - ], - "scripts": { - "build": "tsup --silent", - "clean": "rm -rf .turbo && rm -rf dist", - "dev": "jest --watchAll --colors", - "typecheck": "tsc --noEmit", - "lint": "eslint \"**/*.ts*\"", - "test": "jest", - "update": "npx npm-check-updates -u && npm update" - }, - "dependencies": { - "@walkeros/core": "4.0.2" - }, - "devDependencies": { - "@walkeros/core": "4.0.2" - }, - "repository": { - "url": "git+https://github.com/elbwalker/walkerOS.git", - "directory": "packages/stores/memory" - }, - "author": "elbwalker ", - "homepage": "https://github.com/elbwalker/walkerOS#readme", - "bugs": { - "url": "https://github.com/elbwalker/walkerOS/issues" - }, - "walkerOS": { - "type": "store", - "docs": "https://www.walkeros.io/docs/stores/memory", - "platform": [ - "web", - "server" - ] - }, - "keywords": [ - "walkerOS", - "walkerOS-store", - "store", - "memory", - "cache", - "lru", - "analytics" - ], - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/elbwalker" - } - ] -} diff --git a/packages/stores/memory/src/__tests__/init.test.ts b/packages/stores/memory/src/__tests__/init.test.ts deleted file mode 100644 index ebf78674e..000000000 --- a/packages/stores/memory/src/__tests__/init.test.ts +++ /dev/null @@ -1,51 +0,0 @@ -import type { Collector } from '@walkeros/core'; -import { createMockLogger } from '@walkeros/core'; -import { storeMemoryInit } from '../init'; - -describe('storeMemoryInit', () => { - it('should follow Store.Init pattern', async () => { - const context = { - collector: {} as Collector.Instance, - logger: createMockLogger(), - id: 'cache', - config: { settings: { maxSize: 1024, maxEntries: 10 } }, - env: {}, - }; - - const store = await storeMemoryInit(context); - expect(store.type).toBe('memory'); - expect(store.config).toBe(context.config); - expect(store.get).toBeDefined(); - expect(store.set).toBeDefined(); - expect(store.delete).toBeDefined(); - expect(store.destroy).toBeDefined(); - }); - - it('should use settings from context.config.settings', async () => { - const context = { - collector: {} as Collector.Instance, - logger: createMockLogger(), - id: 'test', - config: { settings: { maxSize: 512 } }, - env: {}, - }; - - const store = await storeMemoryInit(context); - store.set('key', 'value'); - expect(await store.get('key')).toBe('value'); - }); - - it('should work with default settings', async () => { - const context = { - collector: {} as Collector.Instance, - logger: createMockLogger(), - id: 'default', - config: {}, - env: {}, - }; - - const store = await storeMemoryInit(context); - store.set('key', 'value'); - expect(await store.get('key')).toBe('value'); - }); -}); diff --git a/packages/stores/memory/src/__tests__/mock.test.ts b/packages/stores/memory/src/__tests__/mock.test.ts deleted file mode 100644 index 22a363fba..000000000 --- a/packages/stores/memory/src/__tests__/mock.test.ts +++ /dev/null @@ -1,63 +0,0 @@ -import { createMockStore } from '../mock'; - -describe('MockStore', () => { - it('should store and retrieve values', () => { - const store = createMockStore(); - store.set('key1', 'hello'); - expect(store.get('key1')).toBe('hello'); - }); - - it('should return undefined for missing key', () => { - const store = createMockStore(); - expect(store.get('missing')).toBeUndefined(); - }); - - it('should delete values', () => { - const store = createMockStore(); - store.set('key1', 'hello'); - store.delete('key1'); - expect(store.get('key1')).toBeUndefined(); - }); - - it('should expose type as mock', () => { - const store = createMockStore(); - expect(store.type).toBe('mock'); - }); - - describe('operation tracking', () => { - it('should track get operations', () => { - const store = createMockStore(); - store.set('a', '1'); - store.get('a'); - store.get('b'); - expect(store._gets).toEqual(['a', 'b']); - }); - - it('should track set operations', () => { - const store = createMockStore(); - store.set('a', '1'); - store.set('b', '2', 5000); - expect(store._sets).toEqual([ - { key: 'a', value: '1', ttl: undefined }, - { key: 'b', value: '2', ttl: 5000 }, - ]); - }); - - it('should track delete operations', () => { - const store = createMockStore(); - store.delete('a'); - expect(store._deletes).toEqual(['a']); - }); - - it('should clear tracking on destroy', () => { - const store = createMockStore(); - store.set('a', '1'); - store.get('a'); - store.delete('a'); - store.destroy!(); - expect(store._gets).toEqual([]); - expect(store._sets).toEqual([]); - expect(store._deletes).toEqual([]); - }); - }); -}); diff --git a/packages/stores/memory/src/__tests__/namespace.test.ts b/packages/stores/memory/src/__tests__/namespace.test.ts deleted file mode 100644 index ed8521cd2..000000000 --- a/packages/stores/memory/src/__tests__/namespace.test.ts +++ /dev/null @@ -1,40 +0,0 @@ -import { createMockStore } from '../mock'; -import { withNamespace } from '../namespace'; - -describe('withNamespace', () => { - it('should prefix keys on set', () => { - const inner = createMockStore(); - const ns = withNamespace(inner, 'session'); - ns.set('user', 'alice'); - expect(inner._sets[0].key).toBe('session:user'); - }); - - it('should prefix keys on get', () => { - const inner = createMockStore(); - const ns = withNamespace(inner, 'session'); - inner.set('session:user', 'alice'); - expect(ns.get('user')).toBe('alice'); - }); - - it('should prefix keys on delete', () => { - const inner = createMockStore(); - const ns = withNamespace(inner, 'cache'); - ns.delete('key1'); - expect(inner._deletes[0]).toBe('cache:key1'); - }); - - it('should pass through TTL', () => { - const inner = createMockStore(); - const ns = withNamespace(inner, 'ns'); - ns.set('key', 'val', 5000); - expect(inner._sets[0]).toEqual({ key: 'ns:key', value: 'val', ttl: 5000 }); - }); - - it('should delegate destroy to inner store', () => { - const inner = createMockStore(); - inner.set('a', '1'); - const ns = withNamespace(inner, 'ns'); - ns.destroy!(); - expect(inner.get('a')).toBeUndefined(); - }); -}); diff --git a/packages/stores/memory/src/__tests__/stepExamples.test.ts b/packages/stores/memory/src/__tests__/stepExamples.test.ts deleted file mode 100644 index 6dfbaef21..000000000 --- a/packages/stores/memory/src/__tests__/stepExamples.test.ts +++ /dev/null @@ -1,73 +0,0 @@ -import { createMemoryStore } from '../store'; -import { examples } from '../dev'; - -describe('Step Examples', () => { - beforeEach(() => { - jest.useFakeTimers(); - }); - - afterEach(() => { - jest.useRealTimers(); - }); - - it('getHit — read an existing key', () => { - const example = examples.step.getHit; - const input = example.in as { operation: string; key: string }; - const [, expectedKey, expectedValue] = example.out![0] as readonly [ - string, - string, - unknown, - ]; - - const store = createMemoryStore(); - // Pre-populate the store with the expected value - store.set(input.key, expectedValue); - - const result = store.get(expectedKey); - expect(result).toEqual(expectedValue); - }); - - it('setAndGet — write then read back', () => { - const example = examples.step.setAndGet; - const input = example.in as { - operation: string; - key: string; - value: unknown; - }; - const [, getKey, getValue] = example.out![1] as readonly [ - string, - string, - unknown, - ]; - - const store = createMemoryStore(); - store.set(input.key, input.value); - - const result = store.get(getKey); - expect(result).toEqual(getValue); - }); - - it('ttlExpiration — entry expires after TTL', () => { - const example = examples.step.ttlExpiration; - const input = example.in as { - operation: string; - key: string; - value: unknown; - ttl: number; - }; - const [, getKey, getValue] = example.out![1] as readonly [ - string, - string, - unknown, - ]; - - const store = createMemoryStore(); - store.set(input.key, input.value, input.ttl); - - // Advance past the TTL - jest.advanceTimersByTime(input.ttl + 1); - - const result = store.get(getKey); - expect(result).toEqual(getValue); - }); -}); diff --git a/packages/stores/memory/src/__tests__/store.test.ts b/packages/stores/memory/src/__tests__/store.test.ts deleted file mode 100644 index 20cd47360..000000000 --- a/packages/stores/memory/src/__tests__/store.test.ts +++ /dev/null @@ -1,138 +0,0 @@ -import { createMemoryStore } from '../store'; - -describe('MemoryStore', () => { - describe('get/set basics', () => { - it('should store and retrieve a value', () => { - const store = createMemoryStore(); - store.set('key1', 'hello'); - expect(store.get('key1')).toBe('hello'); - }); - - it('should return undefined for missing key', () => { - const store = createMemoryStore(); - expect(store.get('missing')).toBeUndefined(); - }); - - it('should overwrite existing key', () => { - const store = createMemoryStore(); - store.set('key1', 'old'); - store.set('key1', 'new'); - expect(store.get('key1')).toBe('new'); - }); - - it('should store object values', () => { - const store = createMemoryStore<{ name: string }>(); - store.set('user', { name: 'Alice' }); - expect(store.get('user')).toEqual({ name: 'Alice' }); - }); - - it('should expose type as memory', () => { - const store = createMemoryStore(); - expect(store.type).toBe('memory'); - }); - }); - - describe('delete', () => { - it('should remove a key', () => { - const store = createMemoryStore(); - store.set('key1', 'hello'); - store.delete('key1'); - expect(store.get('key1')).toBeUndefined(); - }); - - it('should be a no-op for missing key', () => { - const store = createMemoryStore(); - expect(() => store.delete('missing')).not.toThrow(); - }); - }); - - describe('destroy', () => { - it('should clear all entries', () => { - const store = createMemoryStore(); - store.set('a', '1'); - store.set('b', '2'); - store.destroy!(); - expect(store.get('a')).toBeUndefined(); - expect(store.get('b')).toBeUndefined(); - }); - }); - - describe('TTL expiration (milliseconds)', () => { - beforeEach(() => jest.useFakeTimers()); - afterEach(() => jest.useRealTimers()); - - it('should return undefined for expired entries', () => { - const store = createMemoryStore(); - store.set('key1', 'data', 1000); - jest.advanceTimersByTime(1001); - expect(store.get('key1')).toBeUndefined(); - }); - - it('should return value before expiration', () => { - const store = createMemoryStore(); - store.set('key1', 'data', 5000); - jest.advanceTimersByTime(3000); - expect(store.get('key1')).toBe('data'); - }); - - it('should never expire entries without TTL', () => { - const store = createMemoryStore(); - store.set('key1', 'data'); - jest.advanceTimersByTime(999999999); - expect(store.get('key1')).toBe('data'); - }); - - it('should handle TTL of 0 as immediate expiration', () => { - const store = createMemoryStore(); - store.set('key1', 'data', 0); - jest.advanceTimersByTime(1); - expect(store.get('key1')).toBeUndefined(); - }); - }); - - describe('LRU eviction by maxSize', () => { - it('should evict oldest entry when maxSize exceeded', () => { - const store = createMemoryStore({ maxSize: 100 }); - store.set('key1', 'a'.repeat(40)); - store.set('key2', 'b'.repeat(40)); - store.set('key3', 'c'.repeat(40)); - expect(store.get('key1')).toBeUndefined(); - expect(store.get('key3')).toBeDefined(); - }); - - it('should refresh access order on get (LRU)', () => { - const store = createMemoryStore({ maxSize: 100 }); - store.set('key1', 'a'.repeat(30)); - store.set('key2', 'b'.repeat(30)); - store.get('key1'); - store.set('key3', 'c'.repeat(30)); - expect(store.get('key1')).toBeDefined(); - expect(store.get('key2')).toBeUndefined(); - }); - }); - - describe('maxEntries eviction', () => { - it('should evict oldest entry when maxEntries exceeded', () => { - const store = createMemoryStore({ maxEntries: 2 }); - store.set('a', '1'); - store.set('b', '2'); - store.set('c', '3'); - expect(store.get('a')).toBeUndefined(); - expect(store.get('b')).toBe('2'); - expect(store.get('c')).toBe('3'); - }); - }); - - describe('config', () => { - it('should expose config with defaults', () => { - const store = createMemoryStore(); - expect(store.config.maxSize).toBe(10 * 1024 * 1024); - }); - - it('should expose custom config', () => { - const store = createMemoryStore({ maxSize: 500, maxEntries: 10 }); - expect(store.config.maxSize).toBe(500); - expect(store.config.maxEntries).toBe(10); - }); - }); -}); diff --git a/packages/stores/memory/src/dev.ts b/packages/stores/memory/src/dev.ts deleted file mode 100644 index 706f4127d..000000000 --- a/packages/stores/memory/src/dev.ts +++ /dev/null @@ -1,2 +0,0 @@ -export * as schemas from './schemas'; -export * as examples from './examples'; diff --git a/packages/stores/memory/src/examples/index.ts b/packages/stores/memory/src/examples/index.ts deleted file mode 100644 index 6eb534878..000000000 --- a/packages/stores/memory/src/examples/index.ts +++ /dev/null @@ -1,16 +0,0 @@ -import type { Store } from '@walkeros/core'; - -/** Default settings -- LRU cache with 10 MB limit */ -export const defaults: Store.Config = { - settings: {}, -}; - -/** Custom cache -- small, bounded store for sessions */ -export const sessionCache: Store.Config = { - settings: { - maxSize: 1024 * 1024, // 1 MB - maxEntries: 100, - }, -}; - -export * as step from './step'; diff --git a/packages/stores/memory/src/examples/step.ts b/packages/stores/memory/src/examples/step.ts deleted file mode 100644 index f8a6aa9bc..000000000 --- a/packages/stores/memory/src/examples/step.ts +++ /dev/null @@ -1,35 +0,0 @@ -import type { Flow } from '@walkeros/core'; - -/** Successful key retrieval from a populated store. */ -export const getHit: Flow.StepExample = { - title: 'Get existing key', - description: 'Read an existing key from the memory store', - in: { operation: 'get', key: 'session:abc123' }, - out: [['get', 'session:abc123', { userId: 'usr_42', role: 'admin' }]], -}; - -/** Write a value then read it back — full lifecycle. */ -export const setAndGet: Flow.StepExample = { - title: 'Set and get', - description: 'Write a key-value pair then read it back', - in: { - operation: 'set', - key: 'cache:product:99', - value: { name: 'Everyday Ruck Snack', price: 420 }, - }, - out: [ - ['set', 'cache:product:99', { name: 'Everyday Ruck Snack', price: 420 }], - ['get', 'cache:product:99', { name: 'Everyday Ruck Snack', price: 420 }], - ], -}; - -/** TTL entry expires and returns undefined on next access. */ -export const ttlExpiration: Flow.StepExample = { - title: 'TTL expiration', - description: 'Entry with TTL returns undefined after expiration', - in: { operation: 'set', key: 'token:refresh', value: 'abc', ttl: 1000 }, - out: [ - ['set', 'token:refresh', 'abc', 1000], - ['get', 'token:refresh', undefined], - ], -}; diff --git a/packages/stores/memory/src/index.ts b/packages/stores/memory/src/index.ts deleted file mode 100644 index 7456a7dea..000000000 --- a/packages/stores/memory/src/index.ts +++ /dev/null @@ -1,12 +0,0 @@ -export { createMemoryStore } from './store'; -export { storeMemoryInit } from './init'; -export { createMockStore } from './mock'; -export { withNamespace } from './namespace'; -export type { - MemoryStoreOptions, - MemoryStoreConfig, - MemoryStoreInstance, -} from './types'; -export type { MockStoreInstance } from './mock'; - -export { storeMemoryInit as default } from './init'; diff --git a/packages/stores/memory/src/init.ts b/packages/stores/memory/src/init.ts deleted file mode 100644 index 5db6b08fe..000000000 --- a/packages/stores/memory/src/init.ts +++ /dev/null @@ -1,23 +0,0 @@ -import type { Store } from '@walkeros/core'; -import { createMemoryStore } from './store'; -import type { MemoryStoreOptions } from './types'; - -/** - * Store.Init-compatible wrapper for createMemoryStore. - * Use this in Flow.Config configs. Use createMemoryStore() directly - * for programmatic usage where Store.Context is not available. - */ -export const storeMemoryInit: Store.Init = (context) => { - const settings = (context.config.settings || - {}) as Partial; - const inner = createMemoryStore(settings); - - return { - type: 'memory', - config: context.config as Store.Config, - get: inner.get, - set: inner.set, - delete: inner.delete, - destroy: inner.destroy, - }; -}; diff --git a/packages/stores/memory/src/mock.ts b/packages/stores/memory/src/mock.ts deleted file mode 100644 index 494ffc525..000000000 --- a/packages/stores/memory/src/mock.ts +++ /dev/null @@ -1,51 +0,0 @@ -export interface MockStoreInstance { - type: 'mock'; - config: Record; - get(key: string): T | undefined; - set(key: string, value: T, ttl?: number): void; - delete(key: string): void; - destroy(): void; - _gets: string[]; - _sets: Array<{ key: string; value: T; ttl: number | undefined }>; - _deletes: string[]; -} - -export function createMockStore(): MockStoreInstance { - const data = new Map(); - let _gets: string[] = []; - let _sets: Array<{ key: string; value: T; ttl: number | undefined }> = []; - let _deletes: string[] = []; - - return { - type: 'mock', - config: {}, - get _gets() { - return _gets; - }, - get _sets() { - return _sets; - }, - get _deletes() { - return _deletes; - }, - - get(key: string): T | undefined { - _gets.push(key); - return data.get(key); - }, - set(key: string, value: T, ttl?: number): void { - _sets.push({ key, value, ttl }); - data.set(key, value); - }, - delete(key: string): void { - _deletes.push(key); - data.delete(key); - }, - destroy(): void { - data.clear(); - _gets = []; - _sets = []; - _deletes = []; - }, - }; -} diff --git a/packages/stores/memory/src/namespace.ts b/packages/stores/memory/src/namespace.ts deleted file mode 100644 index 62351bf3c..000000000 --- a/packages/stores/memory/src/namespace.ts +++ /dev/null @@ -1,32 +0,0 @@ -interface StoreLike { - type: string; - config: unknown; - get(key: string): T | undefined; - set(key: string, value: T, ttl?: number): void; - delete(key: string): void; - destroy?(): void; -} - -export function withNamespace( - store: StoreLike, - prefix: string, -): StoreLike { - const ns = (key: string) => `${prefix}:${key}`; - - return { - type: store.type, - config: store.config, - get(key: string) { - return store.get(ns(key)); - }, - set(key: string, value: T, ttl?: number) { - return store.set(ns(key), value, ttl); - }, - delete(key: string) { - return store.delete(ns(key)); - }, - destroy() { - return store.destroy?.(); - }, - }; -} diff --git a/packages/stores/memory/src/schemas/index.ts b/packages/stores/memory/src/schemas/index.ts deleted file mode 100644 index cd3f763b8..000000000 --- a/packages/stores/memory/src/schemas/index.ts +++ /dev/null @@ -1,7 +0,0 @@ -import { zodToSchema } from '@walkeros/core/dev'; -import { SettingsSchema } from './settings'; - -export { SettingsSchema, type Settings } from './settings'; - -// JSON Schema for PropertyTable and walkerOS.json -export const settings = zodToSchema(SettingsSchema); diff --git a/packages/stores/memory/src/schemas/settings.ts b/packages/stores/memory/src/schemas/settings.ts deleted file mode 100644 index 3059212ce..000000000 --- a/packages/stores/memory/src/schemas/settings.ts +++ /dev/null @@ -1,20 +0,0 @@ -import { z } from '@walkeros/core/dev'; - -export const SettingsSchema = z.object({ - maxSize: z - .number() - .int() - .positive() - .default(10 * 1024 * 1024) - .describe( - 'Maximum total size in bytes before LRU eviction (default 10 MB)', - ), - maxEntries: z - .number() - .int() - .positive() - .optional() - .describe('Maximum number of entries before oldest is evicted'), -}); - -export type Settings = z.infer; diff --git a/packages/stores/memory/src/store.ts b/packages/stores/memory/src/store.ts deleted file mode 100644 index b9021da50..000000000 --- a/packages/stores/memory/src/store.ts +++ /dev/null @@ -1,96 +0,0 @@ -import type { MemoryStoreOptions, MemoryStoreInstance } from './types'; - -const DEFAULT_MAX_SIZE = 10 * 1024 * 1024; // 10MB - -interface StoreEntry { - value: T; - expiresAt: number; // 0 = no expiration - size: number; -} - -function estimateSize(key: string, value: T): number { - const valueSize = - typeof value === 'string' ? value.length : JSON.stringify(value).length; - return valueSize + key.length; -} - -export function createMemoryStore( - options: MemoryStoreOptions = {}, -): MemoryStoreInstance { - const maxSize = options.maxSize ?? DEFAULT_MAX_SIZE; - const maxEntries = options.maxEntries; - const entries = new Map>(); - let totalSize = 0; - - function evictBySize(needed: number) { - for (const [key, entry] of entries) { - if (totalSize + needed <= maxSize) break; - totalSize -= entry.size; - entries.delete(key); - } - } - - function evictByEntries() { - if (maxEntries === undefined) return; - while (entries.size >= maxEntries) { - const oldest = entries.keys().next(); - if (oldest.done) break; - const entry = entries.get(oldest.value); - if (entry) totalSize -= entry.size; - entries.delete(oldest.value); - } - } - - return { - type: 'memory', - config: { maxSize, maxEntries }, - - get(key: string): T | undefined { - const entry = entries.get(key); - if (!entry) return undefined; - - if (entry.expiresAt > 0 && Date.now() > entry.expiresAt) { - totalSize -= entry.size; - entries.delete(key); - return undefined; - } - - // Refresh access order (LRU) - entries.delete(key); - entries.set(key, entry); - return entry.value; - }, - - set(key: string, value: T, ttl?: number): void { - const existing = entries.get(key); - if (existing) { - totalSize -= existing.size; - entries.delete(key); - } - - const size = estimateSize(key, value); - evictByEntries(); - evictBySize(size); - - entries.set(key, { - value, - expiresAt: ttl !== undefined ? Date.now() + ttl : 0, - size, - }); - totalSize += size; - }, - - delete(key: string): void { - const entry = entries.get(key); - if (entry) { - totalSize -= entry.size; - entries.delete(key); - } - }, - - destroy(): void { - entries.clear(); - totalSize = 0; - }, - }; -} diff --git a/packages/stores/memory/src/types.ts b/packages/stores/memory/src/types.ts deleted file mode 100644 index 4ae234ce9..000000000 --- a/packages/stores/memory/src/types.ts +++ /dev/null @@ -1,18 +0,0 @@ -export interface MemoryStoreOptions { - maxSize?: number; - maxEntries?: number; -} - -export interface MemoryStoreConfig { - maxSize: number; - maxEntries?: number; -} - -export interface MemoryStoreInstance { - type: 'memory'; - config: MemoryStoreConfig; - get(key: string): T | undefined; - set(key: string, value: T, ttl?: number): void; - delete(key: string): void; - destroy(): void; -} diff --git a/packages/stores/memory/tsconfig.json b/packages/stores/memory/tsconfig.json deleted file mode 100644 index bcf31871b..000000000 --- a/packages/stores/memory/tsconfig.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "extends": "@walkeros/config/tsconfig/node.json", - "compilerOptions": { "rootDir": "src" }, - "include": ["src/**/*"], - "exclude": ["node_modules", "dist"] -} diff --git a/packages/transformers/ga4/README.md b/packages/transformers/ga4/README.md new file mode 100644 index 000000000..130efd7be --- /dev/null +++ b/packages/transformers/ga4/README.md @@ -0,0 +1,181 @@ +# @walkeros/transformer-ga4 + +Decode Google Analytics 4 Measurement Protocol v2 hits into walkerOS events. + +[Source Code](https://github.com/elbwalker/walkerOS/tree/main/packages/transformers/ga4) +| [NPM](https://www.npmjs.com/package/@walkeros/transformer-ga4) | +[Documentation](https://www.walkeros.io/docs/transformers/ga4) + +## Install + +```bash +npm install @walkeros/transformer-ga4 +``` + +## Wire it up + +`transformer-ga4` is a `source.before` transformer. Drop it in front of any +server source that delivers the raw HTTP request to `ingest`: + +```json +{ + "version": 4, + "flows": { + "default": { + "config": { "platform": "server" }, + "sources": { + "http": { + "package": "@walkeros/server-source-express", + "config": { + "ingest": { + "url": "req.url", + "body": "req.body" + } + }, + "before": "ga4" + } + }, + "transformers": { + "ga4": { "package": "@walkeros/transformer-ga4" } + }, + "destinations": { + "log": { "package": "@walkeros/destination-demo" } + } + } + } +} +``` + +The transformer reads two keys from `ctx.ingest`: + +| Key | Type | Required | Notes | +| ------ | -------- | -------- | ---------------------------------------------------- | +| `url` | `string` | yes | Full request URL including the query string. | +| `body` | `string` | no | Raw POST body. Multi-event lines are `\n`-separated. | + +If `url` is missing or not a string, the transformer drops the event silently. + +## Default mappings + +Out of the box, ~30 standard GA4 event names map to walkerOS event names: + +| GA4 (`en`) | walkerOS (`name`) | Notes | +| ------------------- | ----------------- | -------------------------------------- | +| `page_view` | `page view` | `id`, `title`, `referrer` from hit | +| `purchase` | `order complete` | id, currency, total, tax, shipping | +| `view_item` | `product view` | currency, value | +| `add_to_cart` | `product add` | currency, value | +| `remove_from_cart` | `product remove` | currency, value | +| `view_cart` | `cart view` | currency, value | +| `begin_checkout` | `order start` | currency, value, coupon | +| `add_shipping_info` | `order shipping` | currency, value, tier | +| `add_payment_info` | `order payment` | currency, value, type | +| `refund` | `order refund` | id, currency, total | +| `add_to_wishlist` | `wishlist add` | currency, value | +| `view_item_list` | `list view` | id, name | +| `select_item` | `product click` | list_id, list_name | +| `view_promotion` | `promotion view` | reads from `items[0]` | +| `select_promotion` | `promotion click` | reads from `items[0]` | +| `select_content` | `content select` | type, id | +| `scroll` | `page scroll` | percent | +| `click` | `link click` | url, domain, outbound | +| `file_download` | `file download` | name, extension, url | +| `video_start` | `video start` | title, duration, current, percent | +| `video_progress` | `video progress` | same as video_start | +| `video_complete` | `video complete` | same as video_start | +| `form_start` | `form start` | id, name, destination | +| `form_submit` | `form submit` | id, name, destination | +| `search` | `search submit` | term | +| `login` | `session login` | method | +| `sign_up` | `session signup` | method | +| `generate_lead` | `lead generate` | currency, value | +| `share` | `content share` | method, type, id | +| `user_engagement` | (dropped) | `ignore: true` by default | +| `session_start` | (dropped) | `ignore: true` by default | +| `first_visit` | (dropped) | `ignore: true` by default | +| `*` (fallback) | `ga4 track` | `event_name` carries the original `en` | + +See the [website docs](https://www.walkeros.io/docs/transformers/ga4) for the +authoritative reference. + +## Override a default field + +User config replaces matching default keys per event name. Untouched events keep +the default rule. To swap one mapped field on `purchase`: + +```json +{ + "transformers": { + "ga4": { + "package": "@walkeros/transformer-ga4", + "config": { + "settings": { + "mapping": { + "purchase": { + "name": "order complete", + "data": { + "map": { + "coupon": "params.ep.promo_code" + } + } + } + } + } + } + } + } +} +``` + +Replace semantics: the entire rule for `purchase` is taken from user config. +There is no additive merge inside `data.map` in v1 — copy the fields you want to +keep. + +## Drop an event + +Set `ignore: true` on any key: + +```json +"mapping": { + "click": { "ignore": true } +} +``` + +## Custom events + +Either override `'*'` to change the fallback rule, or add a specific key for an +event you fire from `gtag('event', '', ...)`: + +```json +"mapping": { + "newsletter_subscribe": { + "name": "newsletter signup", + "data": { "map": { "source": "params.ep.source" } } + } +} +``` + +Unknown event names fall through to `'*'`, which by default emits a `ga4 track` +event with `data.event_name` set to the original `en`. + +## Caveats + +- **Replace semantics, not merge.** User mappings replace the matching default + rule. There's no per-field merge. +- **GA4 v2 only.** The transformer assumes the v2 Measurement Protocol layout + (`ep.`, `epn.`, `up.`, `upn.`, `prN`, `gcs`). v1 is out of scope. +- **`G-` tids only.** By default `tidPattern` is `^G-`, so Ads (`AW-`) and DC + (`DC-`) hits are dropped. Override `settings.tidPattern` (string regex) to + widen. +- **Basic `gcs` only.** Maps `G1XX` to `marketing`/`analytics` booleans. + Functional/preferences flags and `gcd` are not decoded. +- **Body must be raw text.** The transformer parses POST bodies as URL-encoded + form lines. If the source already JSON-parses the body, pass through the + original string or skip this transformer. +- **`Ingest` contract.** The transformer reads `ctx.ingest.url` (required) and + `ctx.ingest.body` (optional). Source wiring must populate them. + +## Related + +- [Documentation](https://www.walkeros.io/docs/transformers/ga4) +- [Transformers Overview](https://www.walkeros.io/docs/transformers) diff --git a/packages/transformers/ga4/jest.config.mjs b/packages/transformers/ga4/jest.config.mjs new file mode 100644 index 000000000..0fe8dab7b --- /dev/null +++ b/packages/transformers/ga4/jest.config.mjs @@ -0,0 +1,7 @@ +import baseConfig from '@walkeros/config/jest/node.config'; + +const config = { + passWithNoTests: true, +}; + +export default { ...baseConfig, ...config }; diff --git a/packages/transformers/validator/package.json b/packages/transformers/ga4/package.json similarity index 68% rename from packages/transformers/validator/package.json rename to packages/transformers/ga4/package.json index 3364bb1e4..c8b6d56a1 100644 --- a/packages/transformers/validator/package.json +++ b/packages/transformers/ga4/package.json @@ -1,6 +1,6 @@ { - "name": "@walkeros/transformer-validator", - "description": "Event validation transformer for walkerOS using AJV and JSON Schema", + "name": "@walkeros/transformer-ga4", + "description": "Decodes GA4 Measurement Protocol v2 (gtag /g/collect) into walkerOS events", "version": "4.0.2", "license": "MIT", "main": "./dist/index.js", @@ -28,11 +28,9 @@ "dev": "jest --watchAll --colors", "typecheck": "tsc --noEmit", "lint": "eslint \"**/*.ts*\"", - "test": "jest", - "update": "npx npm-check-updates -u && npm update" + "test": "jest" }, "dependencies": { - "ajv": "^8.17.1", "@walkeros/core": "4.0.2" }, "devDependencies": { @@ -40,7 +38,7 @@ }, "repository": { "url": "git+https://github.com/elbwalker/walkerOS.git", - "directory": "packages/transformers/validator" + "directory": "packages/transformers/ga4" }, "author": "elbwalker ", "homepage": "https://github.com/elbwalker/walkerOS#readme", @@ -49,25 +47,21 @@ }, "walkerOS": { "type": "transformer", - "docs": "https://www.walkeros.io/docs/transformers/validator", + "docs": "https://www.walkeros.io/docs/transformers/ga4", "platform": [ - "web", - "server" + "server", + "web" ] }, "keywords": [ "walkerOS", "walkerOS-transformer", "transformer", - "validator", - "ajv", - "json-schema", - "analytics" - ], - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/elbwalker" - } + "ga4", + "gtag", + "decoder", + "google-analytics", + "analytics", + "measurement-protocol" ] } diff --git a/packages/transformers/ga4/src/__tests__/.gitkeep b/packages/transformers/ga4/src/__tests__/.gitkeep new file mode 100644 index 000000000..e69de29bb diff --git a/packages/transformers/ga4/src/__tests__/examples.test.ts b/packages/transformers/ga4/src/__tests__/examples.test.ts new file mode 100644 index 000000000..f15e0d11b --- /dev/null +++ b/packages/transformers/ga4/src/__tests__/examples.test.ts @@ -0,0 +1,76 @@ +import type { Flow, Transformer, WalkerOS } from '@walkeros/core'; +import { + createIngest, + createMockContext, + createMockLogger, +} from '@walkeros/core'; +import { transformerGa4 } from '../transformer'; +import type { GA4Request, GA4Settings } from '../types'; +import { examples } from '../dev'; + +type GA4Types = Transformer.Types; + +/** + * Examples-as-tests for transformer-ga4. + * + * Step examples for source.before transformers have an unusual `in` shape: + * not a walkerOS event but the raw `GA4Request` (`{ url, body? }`) that the + * transformer reads from `ctx.ingest`. The runner translates that into a + * mock context and asserts the resulting push payload matches `out`. + * + * `out` mirrors the validator pattern's `[['return', value], ...]` tuples: + * - single mapped event: `[['return', event]]` + * - fan-out (N events): `[['return', e1], ['return', e2], ...]` + * - dropped: `[['return', false]]` + */ + +function isGA4Request(input: unknown): input is GA4Request { + if (typeof input !== 'object' || input === null) return false; + const candidate = input as Record; + if (typeof candidate.url !== 'string') return false; + if (candidate.body !== undefined && typeof candidate.body !== 'string') { + return false; + } + return true; +} + +type PushResult = Transformer.Result | Transformer.Result[] | false | void; + +function effectsFromResult(result: PushResult): Flow.StepEffect[] { + if (result === false) return [['return', false]]; + if (result === undefined) return []; + if (Array.isArray(result)) { + return result.map((item): Flow.StepEffect => { + if (item.event !== undefined) return ['return', item.event]; + return ['return', item]; + }); + } + if (result.event !== undefined) return [['return', result.event]]; + return []; +} + +const emptyEvent: WalkerOS.DeepPartialEvent = {}; + +describe('Step Examples', () => { + it.each(Object.entries(examples.step))('%s', async (_name, example) => { + expect(isGA4Request(example.in)).toBe(true); + if (!isGA4Request(example.in)) return; // type narrow + + const request = example.in; + const logger = createMockLogger(); + const ctx = createMockContext({ + config: {}, + logger, + ingest: { + ...createIngest('example'), + url: request.url, + ...(request.body !== undefined ? { body: request.body } : {}), + }, + }); + + const instance = await transformerGa4(ctx); + const result = await instance.push(emptyEvent, ctx); + const actual = effectsFromResult(result); + expect(actual).toEqual(example.out); + }); +}); diff --git a/packages/transformers/ga4/src/__tests__/map.test.ts b/packages/transformers/ga4/src/__tests__/map.test.ts new file mode 100644 index 000000000..de271eb55 --- /dev/null +++ b/packages/transformers/ga4/src/__tests__/map.test.ts @@ -0,0 +1,1135 @@ +import { mapHitToEvents } from '../map'; +import { defaultMapping } from '../defaults'; +import type { GA4Hit, GA4Mapping } from '../types'; + +describe('mapHitToEvents — page_view', () => { + it('maps a page_view GET hit', () => { + const hit: GA4Hit = { + hit: { + v: '2', + tid: 'G-XXX', + cid: '111.222', + sid: '1700000000', + dl: 'https://shop.example/cart', + dt: 'Cart', + }, + events: [ + { + en: 'page_view', + params: { ep: {}, epn: {}, up: {}, upn: {} }, + items: [], + }, + ], + }; + const out = mapHitToEvents(hit, defaultMapping); + expect(out).toHaveLength(1); + expect(out[0]).toMatchObject({ + name: 'page view', + entity: 'page', + action: 'view', + data: { id: 'https://shop.example/cart', title: 'Cart' }, + }); + }); +}); + +describe('mapHitToEvents — hit-level merge', () => { + it('populates user from hit-level cid, sid, uid', () => { + const hit: GA4Hit = { + hit: { + tid: 'G-X', + cid: '111.222', + sid: '1700000000', + uid: 'user-42', + dl: 'https://x', + }, + events: [ + { + en: 'page_view', + params: { ep: {}, epn: {}, up: {}, upn: {} }, + items: [], + }, + ], + }; + const out = mapHitToEvents(hit, defaultMapping); + expect(out[0].user).toMatchObject({ + id: 'user-42', + device: '111.222', + session: '1700000000', + }); + }); + + it('populates globals from hit-level ul, sr', () => { + const hit: GA4Hit = { + hit: { tid: 'G-X', ul: 'de-de', sr: '1920x1080', dl: 'https://x' }, + events: [ + { + en: 'page_view', + params: { ep: {}, epn: {}, up: {}, upn: {} }, + items: [], + }, + ], + }; + const out = mapHitToEvents(hit, defaultMapping); + expect(out[0].globals).toMatchObject({ + language: 'de-de', + screen: '1920x1080', + }); + }); + + it('populates source from hit-level p (platform) and adds type:ga4', () => { + const hit: GA4Hit = { + hit: { tid: 'G-X', p: 'web', dl: 'https://x' }, + events: [ + { + en: 'page_view', + params: { ep: {}, epn: {}, up: {}, upn: {} }, + items: [], + }, + ], + }; + const out = mapHitToEvents(hit, defaultMapping); + expect(out[0].source).toMatchObject({ type: 'ga4', platform: 'web' }); + }); + + it('populates consent from gcs', () => { + const hit: GA4Hit = { + hit: { tid: 'G-X', gcs: 'G111', dl: 'https://x' }, + events: [ + { + en: 'page_view', + params: { ep: {}, epn: {}, up: {}, upn: {} }, + items: [], + }, + ], + }; + const out = mapHitToEvents(hit, defaultMapping); + expect(out[0].consent).toEqual({ analytics: true, marketing: true }); + }); + + it('populates id from hit._p when present', () => { + const hit: GA4Hit = { + hit: { tid: 'G-X', _p: '9876543210', dl: 'https://x' }, + events: [ + { + en: 'page_view', + params: { ep: {}, epn: {}, up: {}, upn: {} }, + items: [], + }, + ], + }; + const out = mapHitToEvents(hit, defaultMapping); + expect(out[0].id).toBe('9876543210'); + }); + + it('generates a non-empty id when hit._p is missing', () => { + const hit: GA4Hit = { + hit: { tid: 'G-X', dl: 'https://x' }, + events: [ + { + en: 'page_view', + params: { ep: {}, epn: {}, up: {}, upn: {} }, + items: [], + }, + ], + }; + const out = mapHitToEvents(hit, defaultMapping); + expect(typeof out[0].id).toBe('string'); + expect((out[0].id ?? '').length).toBeGreaterThan(0); + }); + + it('populates timestamp from hit.sid (epoch seconds → ms) and timing from event._et', () => { + const hit: GA4Hit = { + hit: { tid: 'G-X', sid: '1700000000', dl: 'https://x' }, + events: [ + { + en: 'page_view', + params: { ep: {}, epn: {}, up: {}, upn: {}, _et: 1234 }, + items: [], + }, + ], + }; + const out = mapHitToEvents(hit, defaultMapping); + expect(out[0].timestamp).toBe(1700000000 * 1000); + expect(out[0].timing).toBe(1234); + }); + + it('defaults timing to 0 when event._et missing', () => { + const hit: GA4Hit = { + hit: { tid: 'G-X', sid: '1700000000', dl: 'https://x' }, + events: [ + { + en: 'page_view', + params: { ep: {}, epn: {}, up: {}, upn: {} }, + items: [], + }, + ], + }; + const out = mapHitToEvents(hit, defaultMapping); + expect(out[0].timing).toBe(0); + }); + + it('sets trigger to "ga4"', () => { + const out = mapHitToEvents( + { + hit: { tid: 'G-X', dl: 'https://x' }, + events: [ + { + en: 'page_view', + params: { ep: {}, epn: {}, up: {}, upn: {} }, + items: [], + }, + ], + }, + defaultMapping, + ); + expect(out[0].trigger).toBe('ga4'); + }); +}); + +describe('mapHitToEvents — items → nested', () => { + it('attaches items as nested product entities with mapped data keys', () => { + const hit: GA4Hit = { + hit: { tid: 'G-X', dl: 'https://x' }, + events: [ + { + en: 'view_item', + params: { + ep: { currency: 'EUR' }, + epn: { value: 39.9 }, + up: {}, + upn: {}, + }, + items: [ + { + id: 'SKU1', + name: 'Red Shirt', + brand: 'Acme', + price: 29.95, + quantity: 2, + custom: {}, + }, + ], + }, + ], + }; + const customMapping: GA4Mapping = { + view_item: { name: 'product view' }, + }; + const out = mapHitToEvents(hit, customMapping); + expect(out[0].nested).toEqual([ + { + entity: 'product', + data: { + id: 'SKU1', + name: 'Red Shirt', + brand: 'Acme', + price: 29.95, + quantity: 2, + }, + nested: [], + context: {}, + }, + ]); + }); + + it('maps the full set of GA4Item fields (camelCase → snake_case) and custom keys', () => { + const hit: GA4Hit = { + hit: { tid: 'G-X', dl: 'https://x' }, + events: [ + { + en: 'view_item', + params: { ep: {}, epn: {}, up: {}, upn: {} }, + items: [ + { + id: 'SKU2', + name: 'Blue Hat', + brand: 'Acme', + category: 'Accessories', + category2: 'Hats', + category3: 'Casual', + category4: 'Summer', + category5: 'New', + variant: 'blue', + price: 19.95, + quantity: 1, + coupon: 'SUMMER', + discount: 5, + listName: 'related items', + listId: 'list_42', + listPosition: 3, + locationId: 'L1', + affiliation: 'Online Store', + creativeName: 'banner_top', + creativeSlot: 'top', + promotionId: 'PROMO', + promotionName: 'Summer Sale', + custom: { color: 'blue', size: 'M' }, + }, + ], + }, + ], + }; + const customMapping: GA4Mapping = { + view_item: { name: 'product view' }, + }; + const out = mapHitToEvents(hit, customMapping); + expect(out[0].nested).toEqual([ + { + entity: 'product', + data: { + id: 'SKU2', + name: 'Blue Hat', + brand: 'Acme', + category: 'Accessories', + category2: 'Hats', + category3: 'Casual', + category4: 'Summer', + category5: 'New', + variant: 'blue', + price: 19.95, + quantity: 1, + coupon: 'SUMMER', + discount: 5, + list_name: 'related items', + list_id: 'list_42', + list_position: 3, + location_id: 'L1', + affiliation: 'Online Store', + creative_name: 'banner_top', + creative_slot: 'top', + promotion_id: 'PROMO', + promotion_name: 'Summer Sale', + color: 'blue', + size: 'M', + }, + nested: [], + context: {}, + }, + ]); + }); + + it('omits nested when items is empty', () => { + const hit: GA4Hit = { + hit: { tid: 'G-X', dl: 'https://x' }, + events: [ + { + en: 'page_view', + params: { ep: {}, epn: {}, up: {}, upn: {} }, + items: [], + }, + ], + }; + const out = mapHitToEvents(hit, defaultMapping); + expect(out[0].nested).toBeUndefined(); + }); +}); + +describe('mapHitToEvents — purchase (canary)', () => { + it('purchase: T-9001 with 2 items', () => { + const hit: GA4Hit = { + hit: { + v: '2', + tid: 'G-XXX', + cid: '111.222', + sid: '1700000000', + dl: 'https://shop/success', + dt: 'Thanks', + ul: 'de-de', + }, + events: [ + { + en: 'purchase', + params: { + ep: { + transaction_id: 'T-9001', + currency: 'EUR', + coupon: 'SUMMER10', + }, + epn: { value: 129.9, tax: 20.78, shipping: 4.99 }, + up: {}, + upn: {}, + _et: 1234, + }, + items: [ + { + id: 'SKU1', + name: 'Red Shirt', + brand: 'Acme', + category: 'Apparel', + variant: 'red', + price: 29.95, + quantity: 2, + custom: {}, + }, + { + id: 'SKU2', + name: 'Blue Hat', + brand: 'Acme', + category: 'Accessories', + price: 69.95, + quantity: 1, + custom: {}, + }, + ], + }, + ], + }; + const out = mapHitToEvents(hit, defaultMapping); + expect(out).toHaveLength(1); + expect(out[0]).toMatchObject({ + name: 'order complete', + entity: 'order', + action: 'complete', + data: { + id: 'T-9001', + currency: 'EUR', + total: 129.9, + tax: 20.78, + shipping: 4.99, + coupon: 'SUMMER10', + }, + nested: [ + { + entity: 'product', + data: { + id: 'SKU1', + name: 'Red Shirt', + brand: 'Acme', + category: 'Apparel', + variant: 'red', + price: 29.95, + quantity: 2, + }, + }, + { + entity: 'product', + data: { + id: 'SKU2', + name: 'Blue Hat', + brand: 'Acme', + category: 'Accessories', + price: 69.95, + quantity: 1, + }, + }, + ], + timing: 1234, + user: { device: '111.222', session: '1700000000' }, + globals: { language: 'de-de' }, + source: { type: 'ga4' }, + }); + }); +}); + +describe('mapHitToEvents — ecommerce family', () => { + const baseHit = ( + en: string, + params: GA4Hit['events'][0]['params'], + items: GA4Hit['events'][0]['items'] = [], + ): GA4Hit => ({ + hit: { tid: 'G-X', dl: 'https://x' }, + events: [{ en, params, items }], + }); + + it('view_item → product view', () => { + const out = mapHitToEvents( + baseHit('view_item', { + ep: { currency: 'EUR' }, + epn: { value: 39.9 }, + up: {}, + upn: {}, + }), + defaultMapping, + ); + expect(out[0]).toMatchObject({ + name: 'product view', + entity: 'product', + action: 'view', + data: { currency: 'EUR', value: 39.9 }, + }); + }); + + it('add_to_cart → product add', () => { + const out = mapHitToEvents( + baseHit('add_to_cart', { + ep: { currency: 'EUR' }, + epn: { value: 19.95 }, + up: {}, + upn: {}, + }), + defaultMapping, + ); + expect(out[0]).toMatchObject({ + name: 'product add', + entity: 'product', + action: 'add', + data: { currency: 'EUR', value: 19.95 }, + }); + }); + + it('remove_from_cart → product remove', () => { + const out = mapHitToEvents( + baseHit('remove_from_cart', { + ep: { currency: 'EUR' }, + epn: { value: 9.5 }, + up: {}, + upn: {}, + }), + defaultMapping, + ); + expect(out[0]).toMatchObject({ + name: 'product remove', + entity: 'product', + action: 'remove', + data: { currency: 'EUR', value: 9.5 }, + }); + }); + + it('view_cart → cart view', () => { + const out = mapHitToEvents( + baseHit('view_cart', { + ep: { currency: 'EUR' }, + epn: { value: 199.0 }, + up: {}, + upn: {}, + }), + defaultMapping, + ); + expect(out[0]).toMatchObject({ + name: 'cart view', + entity: 'cart', + action: 'view', + data: { currency: 'EUR', value: 199.0 }, + }); + }); + + it('begin_checkout → order start', () => { + const out = mapHitToEvents( + baseHit('begin_checkout', { + ep: { currency: 'EUR', coupon: 'SUMMER10' }, + epn: { value: 199.0 }, + up: {}, + upn: {}, + }), + defaultMapping, + ); + expect(out[0]).toMatchObject({ + name: 'order start', + entity: 'order', + action: 'start', + data: { currency: 'EUR', value: 199.0, coupon: 'SUMMER10' }, + }); + }); + + it('add_shipping_info → order shipping', () => { + const out = mapHitToEvents( + baseHit('add_shipping_info', { + ep: { currency: 'EUR', shipping_tier: 'Ground' }, + epn: { value: 199.0 }, + up: {}, + upn: {}, + }), + defaultMapping, + ); + expect(out[0]).toMatchObject({ + name: 'order shipping', + entity: 'order', + action: 'shipping', + data: { currency: 'EUR', value: 199.0, tier: 'Ground' }, + }); + }); + + it('add_payment_info → order payment', () => { + const out = mapHitToEvents( + baseHit('add_payment_info', { + ep: { currency: 'EUR', payment_type: 'Card' }, + epn: { value: 199.0 }, + up: {}, + upn: {}, + }), + defaultMapping, + ); + expect(out[0]).toMatchObject({ + name: 'order payment', + entity: 'order', + action: 'payment', + data: { currency: 'EUR', value: 199.0, type: 'Card' }, + }); + }); + + it('refund → order refund', () => { + const out = mapHitToEvents( + baseHit('refund', { + ep: { transaction_id: 'T-9001', currency: 'EUR' }, + epn: { value: 129.9 }, + up: {}, + upn: {}, + }), + defaultMapping, + ); + expect(out[0]).toMatchObject({ + name: 'order refund', + entity: 'order', + action: 'refund', + data: { id: 'T-9001', currency: 'EUR', total: 129.9 }, + }); + }); + + it('add_to_wishlist → wishlist add', () => { + const out = mapHitToEvents( + baseHit('add_to_wishlist', { + ep: { currency: 'EUR' }, + epn: { value: 29.95 }, + up: {}, + upn: {}, + }), + defaultMapping, + ); + expect(out[0]).toMatchObject({ + name: 'wishlist add', + entity: 'wishlist', + action: 'add', + data: { currency: 'EUR', value: 29.95 }, + }); + }); +}); + +describe('mapHitToEvents — list / promotion family', () => { + it('view_item_list → list view', () => { + const hit: GA4Hit = { + hit: { tid: 'G-X', dl: 'https://x' }, + events: [ + { + en: 'view_item_list', + params: { + ep: { item_list_id: 'L-42', item_list_name: 'Featured' }, + epn: {}, + up: {}, + upn: {}, + }, + items: [{ id: 'SKU1', name: 'Red Shirt', price: 29.95, custom: {} }], + }, + ], + }; + const out = mapHitToEvents(hit, defaultMapping); + expect(out[0]).toMatchObject({ + name: 'list view', + entity: 'list', + action: 'view', + data: { id: 'L-42', name: 'Featured' }, + nested: [ + { + entity: 'product', + data: { id: 'SKU1', name: 'Red Shirt', price: 29.95 }, + }, + ], + }); + }); + + it('select_item → product click', () => { + const hit: GA4Hit = { + hit: { tid: 'G-X', dl: 'https://x' }, + events: [ + { + en: 'select_item', + params: { + ep: { item_list_id: 'L-42', item_list_name: 'Featured' }, + epn: {}, + up: {}, + upn: {}, + }, + items: [], + }, + ], + }; + const out = mapHitToEvents(hit, defaultMapping); + expect(out[0]).toMatchObject({ + name: 'product click', + entity: 'product', + action: 'click', + data: { list_id: 'L-42', list_name: 'Featured' }, + }); + }); + + it('view_promotion → promotion view (reads from firstItem)', () => { + const hit: GA4Hit = { + hit: { tid: 'G-X', dl: 'https://x' }, + events: [ + { + en: 'view_promotion', + params: { ep: {}, epn: {}, up: {}, upn: {} }, + items: [ + { + id: 'SKU1', + promotionId: 'P-100', + promotionName: 'Summer Sale', + creativeName: 'banner_top', + creativeSlot: 'top', + custom: {}, + }, + ], + }, + ], + }; + const out = mapHitToEvents(hit, defaultMapping); + expect(out[0]).toMatchObject({ + name: 'promotion view', + entity: 'promotion', + action: 'view', + data: { + id: 'P-100', + name: 'Summer Sale', + creative: 'banner_top', + slot: 'top', + }, + }); + }); + + it('select_promotion → promotion click (reads from firstItem)', () => { + const hit: GA4Hit = { + hit: { tid: 'G-X', dl: 'https://x' }, + events: [ + { + en: 'select_promotion', + params: { ep: {}, epn: {}, up: {}, upn: {} }, + items: [ + { + id: 'SKU1', + promotionId: 'P-200', + promotionName: 'Winter Deal', + creativeName: 'banner_side', + creativeSlot: 'side', + custom: {}, + }, + ], + }, + ], + }; + const out = mapHitToEvents(hit, defaultMapping); + expect(out[0]).toMatchObject({ + name: 'promotion click', + entity: 'promotion', + action: 'click', + data: { + id: 'P-200', + name: 'Winter Deal', + creative: 'banner_side', + slot: 'side', + }, + }); + }); + + it('select_content → content select', () => { + const hit: GA4Hit = { + hit: { tid: 'G-X', dl: 'https://x' }, + events: [ + { + en: 'select_content', + params: { + ep: { content_type: 'article', content_id: 'A-7' }, + epn: {}, + up: {}, + upn: {}, + }, + items: [], + }, + ], + }; + const out = mapHitToEvents(hit, defaultMapping); + expect(out[0]).toMatchObject({ + name: 'content select', + entity: 'content', + action: 'select', + data: { type: 'article', id: 'A-7' }, + }); + }); +}); + +describe('mapHitToEvents — engagement family', () => { + const baseHit = ( + en: string, + params: GA4Hit['events'][0]['params'], + ): GA4Hit => ({ + hit: { tid: 'G-X', dl: 'https://x' }, + events: [{ en, params, items: [] }], + }); + + it('scroll → page scroll', () => { + const out = mapHitToEvents( + baseHit('scroll', { + ep: {}, + epn: { percent_scrolled: 90 }, + up: {}, + upn: {}, + }), + defaultMapping, + ); + expect(out[0]).toMatchObject({ + name: 'page scroll', + entity: 'page', + action: 'scroll', + data: { percent: 90 }, + }); + }); + + it('click → link click', () => { + const out = mapHitToEvents( + baseHit('click', { + ep: { + link_url: 'https://example.com/x', + link_domain: 'example.com', + outbound: 'true', + }, + epn: {}, + up: {}, + upn: {}, + }), + defaultMapping, + ); + expect(out[0]).toMatchObject({ + name: 'link click', + entity: 'link', + action: 'click', + data: { + url: 'https://example.com/x', + domain: 'example.com', + outbound: 'true', + }, + }); + }); + + it('file_download → file download', () => { + const out = mapHitToEvents( + baseHit('file_download', { + ep: { + file_name: 'report', + file_extension: 'pdf', + link_url: 'https://x/report.pdf', + }, + epn: {}, + up: {}, + upn: {}, + }), + defaultMapping, + ); + expect(out[0]).toMatchObject({ + name: 'file download', + entity: 'file', + action: 'download', + data: { + name: 'report', + extension: 'pdf', + url: 'https://x/report.pdf', + }, + }); + }); + + it('video_start → video start', () => { + const out = mapHitToEvents( + baseHit('video_start', { + ep: { video_title: 'Intro' }, + epn: { + video_duration: 120, + video_current_time: 0, + video_percent: 0, + }, + up: {}, + upn: {}, + }), + defaultMapping, + ); + expect(out[0]).toMatchObject({ + name: 'video start', + entity: 'video', + action: 'start', + data: { title: 'Intro', duration: 120, current: 0, percent: 0 }, + }); + }); + + it('video_progress → video progress', () => { + const out = mapHitToEvents( + baseHit('video_progress', { + ep: { video_title: 'Intro' }, + epn: { + video_duration: 120, + video_current_time: 60, + video_percent: 50, + }, + up: {}, + upn: {}, + }), + defaultMapping, + ); + expect(out[0]).toMatchObject({ + name: 'video progress', + entity: 'video', + action: 'progress', + data: { title: 'Intro', duration: 120, current: 60, percent: 50 }, + }); + }); + + it('video_complete → video complete', () => { + const out = mapHitToEvents( + baseHit('video_complete', { + ep: { video_title: 'Intro' }, + epn: { + video_duration: 120, + video_current_time: 120, + video_percent: 100, + }, + up: {}, + upn: {}, + }), + defaultMapping, + ); + expect(out[0]).toMatchObject({ + name: 'video complete', + entity: 'video', + action: 'complete', + data: { title: 'Intro', duration: 120, current: 120, percent: 100 }, + }); + }); + + it('form_start → form start', () => { + const out = mapHitToEvents( + baseHit('form_start', { + ep: { + form_id: 'F1', + form_name: 'Contact', + form_destination: 'https://x/submit', + }, + epn: {}, + up: {}, + upn: {}, + }), + defaultMapping, + ); + expect(out[0]).toMatchObject({ + name: 'form start', + entity: 'form', + action: 'start', + data: { + id: 'F1', + name: 'Contact', + destination: 'https://x/submit', + }, + }); + }); + + it('form_submit → form submit', () => { + const out = mapHitToEvents( + baseHit('form_submit', { + ep: { + form_id: 'F1', + form_name: 'Contact', + form_destination: 'https://x/submit', + }, + epn: {}, + up: {}, + upn: {}, + }), + defaultMapping, + ); + expect(out[0]).toMatchObject({ + name: 'form submit', + entity: 'form', + action: 'submit', + data: { + id: 'F1', + name: 'Contact', + destination: 'https://x/submit', + }, + }); + }); + + it('search → search submit', () => { + const out = mapHitToEvents( + baseHit('search', { + ep: { search_term: 'sneakers' }, + epn: {}, + up: {}, + upn: {}, + }), + defaultMapping, + ); + expect(out[0]).toMatchObject({ + name: 'search submit', + entity: 'search', + action: 'submit', + data: { term: 'sneakers' }, + }); + }); + + it('login → session login', () => { + const out = mapHitToEvents( + baseHit('login', { + ep: { method: 'google' }, + epn: {}, + up: {}, + upn: {}, + }), + defaultMapping, + ); + expect(out[0]).toMatchObject({ + name: 'session login', + entity: 'session', + action: 'login', + data: { method: 'google' }, + }); + }); + + it('sign_up → session signup', () => { + const out = mapHitToEvents( + baseHit('sign_up', { + ep: { method: 'email' }, + epn: {}, + up: {}, + upn: {}, + }), + defaultMapping, + ); + expect(out[0]).toMatchObject({ + name: 'session signup', + entity: 'session', + action: 'signup', + data: { method: 'email' }, + }); + }); + + it('generate_lead → lead generate', () => { + const out = mapHitToEvents( + baseHit('generate_lead', { + ep: { currency: 'EUR' }, + epn: { value: 50 }, + up: {}, + upn: {}, + }), + defaultMapping, + ); + expect(out[0]).toMatchObject({ + name: 'lead generate', + entity: 'lead', + action: 'generate', + data: { currency: 'EUR', value: 50 }, + }); + }); + + it('share → content share', () => { + const out = mapHitToEvents( + baseHit('share', { + ep: { method: 'twitter', content_type: 'article', item_id: 'A-9' }, + epn: {}, + up: {}, + upn: {}, + }), + defaultMapping, + ); + expect(out[0]).toMatchObject({ + name: 'content share', + entity: 'content', + action: 'share', + data: { method: 'twitter', type: 'article', id: 'A-9' }, + }); + }); +}); + +describe('mapHitToEvents — auto-fired noise events', () => { + it('drops user_engagement by default', () => { + const hit: GA4Hit = { + hit: { tid: 'G-X' }, + events: [ + { + en: 'user_engagement', + params: { + ep: {}, + epn: { engagement_time_msec: 1500 }, + up: {}, + upn: {}, + }, + items: [], + }, + ], + }; + expect(mapHitToEvents(hit, defaultMapping)).toEqual([]); + }); + + it('drops session_start by default', () => { + const hit: GA4Hit = { + hit: { tid: 'G-X' }, + events: [ + { + en: 'session_start', + params: { ep: {}, epn: {}, up: {}, upn: {} }, + items: [], + }, + ], + }; + expect(mapHitToEvents(hit, defaultMapping)).toEqual([]); + }); + + it('drops first_visit by default', () => { + const hit: GA4Hit = { + hit: { tid: 'G-X' }, + events: [ + { + en: 'first_visit', + params: { ep: {}, epn: {}, up: {}, upn: {} }, + items: [], + }, + ], + }; + expect(mapHitToEvents(hit, defaultMapping)).toEqual([]); + }); + + it('user can opt in by overriding ignore', () => { + const userMapping: GA4Mapping = { + ...defaultMapping, + user_engagement: { + name: 'session engagement', + data: { map: { time: 'params.epn.engagement_time_msec' } }, + }, + }; + const hit: GA4Hit = { + hit: { tid: 'G-X' }, + events: [ + { + en: 'user_engagement', + params: { + ep: {}, + epn: { engagement_time_msec: 1500 }, + up: {}, + upn: {}, + }, + items: [], + }, + ], + }; + const out = mapHitToEvents(hit, userMapping); + expect(out[0]).toMatchObject({ + name: 'session engagement', + data: { time: 1500 }, + }); + }); +}); + +describe('mapHitToEvents — * fallback', () => { + it('falls back to ga4 track for unknown events', () => { + const hit: GA4Hit = { + hit: { tid: 'G-X' }, + events: [ + { + en: 'custom_something', + params: { ep: { foo: 'bar' }, epn: {}, up: {}, upn: {} }, + items: [], + }, + ], + }; + const out = mapHitToEvents(hit, defaultMapping); + expect(out[0]).toMatchObject({ + name: 'ga4 track', + entity: 'ga4', + action: 'track', + data: { event_name: 'custom_something' }, + }); + }); +}); diff --git a/packages/transformers/ga4/src/__tests__/parse.test.ts b/packages/transformers/ga4/src/__tests__/parse.test.ts new file mode 100644 index 000000000..f206c5911 --- /dev/null +++ b/packages/transformers/ga4/src/__tests__/parse.test.ts @@ -0,0 +1,252 @@ +import { + parseBody, + parseConsent, + parseItem, + parseQuery, + parseRequest, +} from '../parse'; + +describe('parseQuery', () => { + it('extracts simple params', () => { + expect(parseQuery('https://x/g/collect?v=2&tid=G-XXX&cid=111.222')).toEqual( + { v: '2', tid: 'G-XXX', cid: '111.222' }, + ); + }); + + it('decodes url-encoded values', () => { + const out = parseQuery( + 'https://x/g/collect?dl=https%3A%2F%2Fshop.example%2Fp%2F1&dt=My%20Page', + ); + expect(out.dl).toBe('https://shop.example/p/1'); + expect(out.dt).toBe('My Page'); + }); + + it('handles missing query string', () => { + expect(parseQuery('https://x/g/collect')).toEqual({}); + }); + + it('preserves last value when keys repeat', () => { + expect(parseQuery('https://x/g/collect?en=a&en=b').en).toBe('b'); + }); + + it('returns empty for bare-question-mark URL', () => { + expect(parseQuery('https://x/g/collect?')).toEqual({}); + }); +}); + +describe('parseBody', () => { + it('returns single-line body as one event', () => { + expect(parseBody('en=page_view&_et=1234')).toEqual([ + { en: 'page_view', _et: '1234' }, + ]); + }); + + it('splits LF-separated multi-line body into N events', () => { + const body = 'en=page_view&_et=10\nen=scroll&epn.percent_scrolled=90'; + const out = parseBody(body); + expect(out).toHaveLength(2); + expect(out[1].en).toBe('scroll'); + expect(out[1]['epn.percent_scrolled']).toBe('90'); + }); + + it('handles CRLF separator', () => { + expect(parseBody('en=a\r\nen=b')).toHaveLength(2); + }); + + it('skips empty lines and trims whitespace', () => { + expect(parseBody('en=a\n\n en=b \n')).toHaveLength(2); + }); + + it('returns empty array for empty body', () => { + expect(parseBody('')).toEqual([]); + }); + + it('handles trailing newline', () => { + expect(parseBody('en=page_view\n')).toHaveLength(1); + }); +}); + +describe('parseItem (standard prefixes)', () => { + it('parses id, name, brand, price, quantity', () => { + const it = parseItem('idSKU1~nmRed Shirt~brAcme~pr29.95~qt2'); + expect(it).toMatchObject({ + id: 'SKU1', + name: 'Red Shirt', + brand: 'Acme', + price: 29.95, + quantity: 2, + }); + }); + + it('does NOT double-decode (URLSearchParams already decoded)', () => { + // After URLSearchParams decoded, "%20" became literal space; "%25" became literal "%". + // The parser receives the already-decoded subfield contents. + const it = parseItem('nm100% Cotton'); + expect(it.name).toBe('100% Cotton'); + }); + + it('parses categories c2..c5', () => { + const it = parseItem('caTop~c2Mid~c3Low~c4Deep~c5Bottom'); + expect(it).toMatchObject({ + category: 'Top', + category2: 'Mid', + category3: 'Low', + category4: 'Deep', + category5: 'Bottom', + }); + }); + + it('NaN-guards numeric coercion', () => { + const it = parseItem('idA~prabc~qtxyz'); + expect(it.price).toBeUndefined(); + expect(it.quantity).toBeUndefined(); + }); + + it('initializes custom={} when no k/v present', () => { + expect(parseItem('idA').custom).toEqual({}); + }); + + it('ignores unknown short prefixes', () => { + const it = parseItem('idA~zzGarbage'); + expect(it.id).toBe('A'); + // Unknown prefix `zz` must not appear in custom or as any known field. + expect(it.custom).toEqual({}); + expect(Object.keys(it)).toEqual(['custom', 'id']); + }); +}); + +describe('parseItem (promotion prefixes)', () => { + it('parses affiliation, creativeName, creativeSlot, promotionId, promotionName', () => { + const it = parseItem('idA~afStore~cnHero~csTop~piPROMO-1~pnSummer Sale'); + expect(it).toMatchObject({ + id: 'A', + affiliation: 'Store', + creativeName: 'Hero', + creativeSlot: 'Top', + promotionId: 'PROMO-1', + promotionName: 'Summer Sale', + }); + }); +}); + +describe('parseItem (custom k/v)', () => { + it('captures single-digit k0/v0 pairs', () => { + const it = parseItem('idA~k0color~v0red~k1size~v1L'); + expect(it.custom).toEqual({ color: 'red', size: 'L' }); + }); + + it('captures multi-digit k10/v10 pairs', () => { + const it = parseItem('idA~k10color~v10red~k11size~v11L'); + expect(it.custom).toEqual({ color: 'red', size: 'L' }); + }); + + it('drops unbalanced k without matching v', () => { + const it = parseItem('idA~k0color~v1red'); + expect(it.custom).toEqual({}); + }); + + it('handles k values containing arbitrary characters', () => { + const it = parseItem('idA~k0note~v0has spaces and ?chars'); + // GA4 escapes literal ~ in values to %7E before sending, so URLSearchParams + // gives us a single segment. The split('~') here would still split on a + // literal ~ in the segment, so we use a value without literal tildes. + expect(it.custom.note).toContain('has spaces'); + }); +}); + +describe('parseConsent', () => { + it('returns empty consent when gcs missing', () => { + expect(parseConsent({})).toEqual({}); + }); + it('grants both for G111', () => { + expect(parseConsent({ gcs: 'G111' })).toEqual({ + analytics: true, + marketing: true, + }); + }); + it('denies both for G100', () => { + expect(parseConsent({ gcs: 'G100' })).toEqual({ + analytics: false, + marketing: false, + }); + }); + it('analytics-only for G101', () => { + expect(parseConsent({ gcs: 'G101' })).toEqual({ + analytics: true, + marketing: false, + }); + }); + it('marketing-only for G110', () => { + expect(parseConsent({ gcs: 'G110' })).toEqual({ + analytics: false, + marketing: true, + }); + }); + it('ignores malformed gcs', () => { + expect(parseConsent({ gcs: 'invalid' })).toEqual({}); + expect(parseConsent({ gcs: 'G12X' })).toEqual({}); + }); +}); + +describe('parseRequest', () => { + it('GET hit with all data in URL', () => { + const out = parseRequest({ + url: 'https://x/g/collect?v=2&tid=G-XXX&cid=111.222&en=page_view&ep.author=alex&dl=https%3A%2F%2Fshop', + }); + expect(out.hit).toMatchObject({ + v: '2', + tid: 'G-XXX', + cid: '111.222', + dl: 'https://shop', + }); + expect(out.events).toHaveLength(1); + expect(out.events[0]).toMatchObject({ + en: 'page_view', + params: { ep: { author: 'alex' }, epn: {}, up: {}, upn: {} }, + items: [], + }); + }); + + it('POST batch nests ep/epn keys per event', () => { + const out = parseRequest({ + url: 'https://x/g/collect?v=2&tid=G-XXX&cid=111.222', + body: 'en=purchase&ep.transaction_id=T-1&epn.value=29.95\nen=scroll&epn.percent_scrolled=90', + }); + expect(out.events).toHaveLength(2); + expect(out.events[0]).toMatchObject({ + en: 'purchase', + params: { ep: { transaction_id: 'T-1' }, epn: { value: 29.95 } }, + }); + expect(out.events[1]).toMatchObject({ + en: 'scroll', + params: { epn: { percent_scrolled: 90 } }, + }); + }); + + it('parses pr items into items array, sorted by index', () => { + const out = parseRequest({ + url: 'https://x/g/collect?v=2&tid=G-XXX&en=view_item', + body: 'en=view_item&pr2=idB~pr10&pr1=idA~pr5', + }); + expect(out.events[0].items).toHaveLength(2); + expect(out.events[0].items[0].id).toBe('A'); + expect(out.events[0].items[1].id).toBe('B'); + }); + + it('handles GET request with no body', () => { + const out = parseRequest({ + url: 'https://x/g/collect?v=2&tid=G-XXX&en=page_view&dl=https%3A%2F%2Fx', + }); + expect(out.events).toHaveLength(1); + expect(out.events[0].en).toBe('page_view'); + }); + + it('drops body lines with no en', () => { + const out = parseRequest({ + url: 'https://x/g/collect?v=2&tid=G-XXX', + body: 'foo=bar\nen=page_view', + }); + expect(out.events).toHaveLength(1); + expect(out.events[0].en).toBe('page_view'); + }); +}); diff --git a/packages/transformers/ga4/src/__tests__/transformer.test.ts b/packages/transformers/ga4/src/__tests__/transformer.test.ts new file mode 100644 index 000000000..52cc010f2 --- /dev/null +++ b/packages/transformers/ga4/src/__tests__/transformer.test.ts @@ -0,0 +1,285 @@ +import type { Transformer, WalkerOS } from '@walkeros/core'; +import { + createIngest, + createMockContext, + createMockLogger, +} from '@walkeros/core'; +import { transformerGa4 } from '../transformer'; +import type { GA4Settings } from '../types'; + +type GA4Types = Transformer.Types; + +interface MakeContextOpts { + settings?: GA4Settings; + url?: string; + body?: string; + logger?: ReturnType; +} + +function makeContext(opts: MakeContextOpts = {}) { + const logger = opts.logger ?? createMockLogger(); + return createMockContext({ + config: opts.settings ? { settings: opts.settings } : {}, + logger, + ingest: { + ...createIngest('test'), + ...(opts.url !== undefined ? { url: opts.url } : {}), + ...(opts.body !== undefined ? { body: opts.body } : {}), + }, + }); +} + +const emptyEvent: WalkerOS.DeepPartialEvent = {}; + +describe('transformerGa4', () => { + describe('Task 22 — Init + push', () => { + it('decodes a GA4 hit delivered via context.ingest', async () => { + const ctx = makeContext({ + url: 'https://www.google-analytics.com/g/collect?v=2&tid=G-XXX&cid=111.222&sid=1700000000&dl=https%3A%2F%2Fx&dt=Home&en=page_view', + }); + const instance = await transformerGa4(ctx); + const result = await instance.push(emptyEvent, ctx); + + expect(result).toEqual({ + event: expect.objectContaining({ name: 'page view' }), + }); + }); + + it('returns false when ingest has no url', async () => { + const ctx = makeContext({}); + const instance = await transformerGa4(ctx); + const result = await instance.push(emptyEvent, ctx); + expect(result).toBe(false); + }); + + it('returns false when ingest.url is not a string', async () => { + const ctx = createMockContext({ + config: {}, + ingest: { ...createIngest('test'), url: 123 }, + }); + const instance = await transformerGa4(ctx); + const result = await instance.push(emptyEvent, ctx); + expect(result).toBe(false); + }); + + it('fan-outs multiple events as array of Results', async () => { + // POST body with two events (newline separated) + const ctx = makeContext({ + url: 'https://www.google-analytics.com/g/collect?v=2&tid=G-XXX', + body: [ + 'en=page_view&dl=https%3A%2F%2Fa&dt=A', + 'en=page_view&dl=https%3A%2F%2Fb&dt=B', + ].join('\n'), + }); + const instance = await transformerGa4(ctx); + const result = await instance.push(emptyEvent, ctx); + expect(Array.isArray(result)).toBe(true); + const arr = result as Transformer.Result[]; + expect(arr).toHaveLength(2); + expect(arr[0]).toEqual({ + event: expect.objectContaining({ name: 'page view' }), + }); + expect(arr[1]).toEqual({ + event: expect.objectContaining({ name: 'page view' }), + }); + }); + }); + + describe('Task 23 — tidPattern string → RegExp', () => { + it('respects user tidPattern (string)', async () => { + const ctx = makeContext({ + settings: { tidPattern: '^G-CUSTOM' }, + url: 'https://x/g/collect?v=2&tid=G-DEFAULT&en=page_view&dl=https%3A%2F%2Fx', + }); + const instance = await transformerGa4(ctx); + const result = await instance.push(emptyEvent, ctx); + expect(result).toBe(false); + }); + + it('accepts custom-prefixed tids when pattern allows', async () => { + const ctx = makeContext({ + settings: { tidPattern: '^G-CUSTOM' }, + url: 'https://x/g/collect?v=2&tid=G-CUSTOM-1&en=page_view&dl=https%3A%2F%2Fx', + }); + const instance = await transformerGa4(ctx); + const result = await instance.push(emptyEvent, ctx); + expect(result).toEqual({ + event: expect.objectContaining({ name: 'page view' }), + }); + }); + + it('default tidPattern drops AW- traffic', async () => { + const ctx = makeContext({ + url: 'https://x/g/collect?v=2&tid=AW-12345&en=page_view&dl=https%3A%2F%2Fx', + }); + const instance = await transformerGa4(ctx); + expect(await instance.push(emptyEvent, ctx)).toBe(false); + }); + + it('default tidPattern drops DC- traffic', async () => { + const ctx = makeContext({ + url: 'https://x/g/collect?v=2&tid=DC-12345&en=page_view&dl=https%3A%2F%2Fx', + }); + const instance = await transformerGa4(ctx); + expect(await instance.push(emptyEvent, ctx)).toBe(false); + }); + }); + + describe('Task 24 — User-override merge + ignore semantics', () => { + it('user mapping replaces individual default keys while keeping others', async () => { + const ctx = makeContext({ + settings: { + mapping: { + page_view: { + name: 'page open', + data: { map: { id: 'hit.dl' } }, + }, + }, + }, + url: 'https://x/g/collect?v=2&tid=G-X&dl=https%3A%2F%2Fy&dt=Y&en=page_view', + }); + const overridden = await ( + await transformerGa4(ctx) + ).push(emptyEvent, ctx); + expect(overridden).toEqual({ + event: expect.objectContaining({ + name: 'page open', + data: expect.objectContaining({ id: 'https://y' }), + }), + }); + + // purchase still default + const ctx2 = makeContext({ + settings: { mapping: { page_view: { name: 'x' } } }, + url: 'https://x/g/collect?v=2&tid=G-X&en=purchase&ep.transaction_id=T-1&epn.value=10', + }); + const stillDefault = await ( + await transformerGa4(ctx2) + ).push(emptyEvent, ctx2); + expect(stillDefault).toEqual({ + event: expect.objectContaining({ name: 'order complete' }), + }); + }); + + it('ignore: true drops the event', async () => { + const ctx = makeContext({ + settings: { mapping: { page_view: { ignore: true } } }, + url: 'https://x/g/collect?v=2&tid=G-X&en=page_view&dl=https%3A%2F%2Fx', + }); + expect(await (await transformerGa4(ctx)).push(emptyEvent, ctx)).toBe( + false, + ); + }); + }); + + describe('Task 25 — Logging via context.logger.*', () => { + it('logs successful decode with event count', async () => { + const logger = createMockLogger(); + const ctx = makeContext({ + logger, + url: 'https://x/g/collect?en=page_view&v=2&tid=G-X&dl=https%3A%2F%2Fx', + }); + await (await transformerGa4(ctx)).push(emptyEvent, ctx); + const debugCalls = logger.debug.mock.calls.map((args) => String(args[0])); + expect(debugCalls.some((m) => m.includes('decoded'))).toBe(true); + }); + + it('logs debug when tid is dropped by pattern', async () => { + const logger = createMockLogger(); + const ctx = makeContext({ + logger, + url: 'https://x/g/collect?v=2&tid=AW-12345&en=page_view&dl=https%3A%2F%2Fx', + }); + await (await transformerGa4(ctx)).push(emptyEvent, ctx); + const debugCalls = logger.debug.mock.calls.map((args) => String(args[0])); + expect(debugCalls.some((m) => m.includes('dropped by tidPattern'))).toBe( + true, + ); + }); + + it('logs debug when no request is present in ingest', async () => { + const logger = createMockLogger(); + const ctx = makeContext({ logger }); + await (await transformerGa4(ctx)).push(emptyEvent, ctx); + const debugCalls = logger.debug.mock.calls.map((args) => String(args[0])); + expect(debugCalls.some((m) => m.includes('no request in ingest'))).toBe( + true, + ); + }); + }); + + describe('Task 26 — try/catch around parseRequest', () => { + it('drops on malformed URI in URL without crashing', async () => { + // URLSearchParams is lenient about bare `%`; this exercises the + // resilient path: parse succeeds, no `en`, no events mapped, drop. + const ctx = makeContext({ + url: 'https://x/g/collect?dl=%', + }); + expect(await (await transformerGa4(ctx)).push(emptyEvent, ctx)).toBe( + false, + ); + }); + + it('catches and logs unexpected parser throws', async () => { + // Force a throw from inside `push` by making `ctx.ingest.url` lookup + // throw at access time. The try/catch wraps `parseRequest` and the + // hit-derived steps, but `readGA4Request` runs first and accesses + // `ingest.url`. So instead, supply a string url and break the regex + // by making `tidPattern.test` throw — we do that by giving a tid that + // is a non-string-coercible value via a doctored parse path. + // + // Simplest robust trigger: monkey-patch the prototype temporarily so + // `URLSearchParams.prototype.forEach` throws. This is the closest we + // can get to a parser failure without mocking module internals. + const original = URLSearchParams.prototype.forEach; + URLSearchParams.prototype.forEach = function () { + throw new Error('boom'); + }; + try { + const logger = createMockLogger(); + const ctx = makeContext({ + logger, + url: 'https://x/g/collect?v=2&tid=G-X&en=page_view', + }); + const result = await (await transformerGa4(ctx)).push(emptyEvent, ctx); + expect(result).toBe(false); + const errors = logger.error.mock.calls.map((args) => String(args[0])); + expect(errors.some((e) => e.includes('parse error'))).toBe(true); + expect(errors.some((e) => e.includes('boom'))).toBe(true); + } finally { + URLSearchParams.prototype.forEach = original; + } + }); + }); + + describe('Task 27 — Integration with createMockContext', () => { + it('composes cleanly with canonical createMockContext helper', async () => { + const logger = createMockLogger(); + const ctx = createMockContext({ + config: {}, + logger, + ingest: { + ...createIngest('source-id'), + url: 'https://www.google-analytics.com/g/collect?v=2&tid=G-INT&cid=1.2&en=purchase&ep.transaction_id=T-99&epn.value=42&ep.currency=EUR', + }, + }); + + const instance = await transformerGa4(ctx); + expect(instance.type).toBe('ga4'); + expect(instance.config).toBe(ctx.config); + + const result = await instance.push(emptyEvent, ctx); + expect(result).toEqual({ + event: expect.objectContaining({ + name: 'order complete', + data: expect.objectContaining({ + id: 'T-99', + total: 42, + currency: 'EUR', + }), + }), + }); + expect(logger.error).not.toHaveBeenCalled(); + }); + }); +}); diff --git a/packages/transformers/ga4/src/defaults.ts b/packages/transformers/ga4/src/defaults.ts new file mode 100644 index 000000000..7d2be4a57 --- /dev/null +++ b/packages/transformers/ga4/src/defaults.ts @@ -0,0 +1,319 @@ +import type { GA4Mapping } from './types'; + +/** + * Default GA4 event-name → walkerOS mapping rules. + * Users may override or extend these via settings.mapping at config time. + * The `'*'` key is the fallback for unknown event names. + * + * Field naming for `data.map`: + * - Monetary: `currency` from `ep.currency`, `value`/`total` from `epn.value`, + * `tax` from `epn.tax`, `shipping` from `epn.shipping`, `coupon` from + * `ep.coupon`. + * - Promotions read from `firstItem` (synthetic `items[0]` reference exposed by + * the mapper), since GA4 encodes promotion info inside item tilde strings. + */ +export const defaultMapping: GA4Mapping = { + // --- page --- + page_view: { + name: 'page view', + data: { + map: { + id: 'hit.dl', + title: 'hit.dt', + referrer: 'hit.dr', + }, + }, + }, + + // --- ecommerce --- + purchase: { + name: 'order complete', + data: { + map: { + id: 'params.ep.transaction_id', + currency: 'params.ep.currency', + total: 'params.epn.value', + tax: 'params.epn.tax', + shipping: 'params.epn.shipping', + coupon: 'params.ep.coupon', + }, + }, + }, + view_item: { + name: 'product view', + data: { + map: { + currency: 'params.ep.currency', + value: 'params.epn.value', + }, + }, + }, + add_to_cart: { + name: 'product add', + data: { + map: { + currency: 'params.ep.currency', + value: 'params.epn.value', + }, + }, + }, + remove_from_cart: { + name: 'product remove', + data: { + map: { + currency: 'params.ep.currency', + value: 'params.epn.value', + }, + }, + }, + view_cart: { + name: 'cart view', + data: { + map: { + currency: 'params.ep.currency', + value: 'params.epn.value', + }, + }, + }, + begin_checkout: { + name: 'order start', + data: { + map: { + currency: 'params.ep.currency', + value: 'params.epn.value', + coupon: 'params.ep.coupon', + }, + }, + }, + add_shipping_info: { + name: 'order shipping', + data: { + map: { + currency: 'params.ep.currency', + value: 'params.epn.value', + tier: 'params.ep.shipping_tier', + }, + }, + }, + add_payment_info: { + name: 'order payment', + data: { + map: { + currency: 'params.ep.currency', + value: 'params.epn.value', + type: 'params.ep.payment_type', + }, + }, + }, + refund: { + name: 'order refund', + data: { + map: { + id: 'params.ep.transaction_id', + currency: 'params.ep.currency', + total: 'params.epn.value', + }, + }, + }, + add_to_wishlist: { + name: 'wishlist add', + data: { + map: { + currency: 'params.ep.currency', + value: 'params.epn.value', + }, + }, + }, + + // --- list / promotion --- + view_item_list: { + name: 'list view', + data: { + map: { + id: 'params.ep.item_list_id', + name: 'params.ep.item_list_name', + }, + }, + }, + select_item: { + name: 'product click', + data: { + map: { + list_id: 'params.ep.item_list_id', + list_name: 'params.ep.item_list_name', + }, + }, + }, + view_promotion: { + name: 'promotion view', + data: { + map: { + id: 'firstItem.promotionId', + name: 'firstItem.promotionName', + creative: 'firstItem.creativeName', + slot: 'firstItem.creativeSlot', + }, + }, + }, + select_promotion: { + name: 'promotion click', + data: { + map: { + id: 'firstItem.promotionId', + name: 'firstItem.promotionName', + creative: 'firstItem.creativeName', + slot: 'firstItem.creativeSlot', + }, + }, + }, + select_content: { + name: 'content select', + data: { + map: { + type: 'params.ep.content_type', + id: 'params.ep.content_id', + }, + }, + }, + + // --- engagement --- + scroll: { + name: 'page scroll', + data: { + map: { + percent: 'params.epn.percent_scrolled', + }, + }, + }, + click: { + name: 'link click', + data: { + map: { + url: 'params.ep.link_url', + domain: 'params.ep.link_domain', + outbound: 'params.ep.outbound', + }, + }, + }, + file_download: { + name: 'file download', + data: { + map: { + name: 'params.ep.file_name', + extension: 'params.ep.file_extension', + url: 'params.ep.link_url', + }, + }, + }, + video_start: { + name: 'video start', + data: { + map: { + title: 'params.ep.video_title', + duration: 'params.epn.video_duration', + current: 'params.epn.video_current_time', + percent: 'params.epn.video_percent', + }, + }, + }, + video_progress: { + name: 'video progress', + data: { + map: { + title: 'params.ep.video_title', + duration: 'params.epn.video_duration', + current: 'params.epn.video_current_time', + percent: 'params.epn.video_percent', + }, + }, + }, + video_complete: { + name: 'video complete', + data: { + map: { + title: 'params.ep.video_title', + duration: 'params.epn.video_duration', + current: 'params.epn.video_current_time', + percent: 'params.epn.video_percent', + }, + }, + }, + form_start: { + name: 'form start', + data: { + map: { + id: 'params.ep.form_id', + name: 'params.ep.form_name', + destination: 'params.ep.form_destination', + }, + }, + }, + form_submit: { + name: 'form submit', + data: { + map: { + id: 'params.ep.form_id', + name: 'params.ep.form_name', + destination: 'params.ep.form_destination', + }, + }, + }, + search: { + name: 'search submit', + data: { + map: { + term: 'params.ep.search_term', + }, + }, + }, + login: { + name: 'session login', + data: { + map: { + method: 'params.ep.method', + }, + }, + }, + sign_up: { + name: 'session signup', + data: { + map: { + method: 'params.ep.method', + }, + }, + }, + generate_lead: { + name: 'lead generate', + data: { + map: { + currency: 'params.ep.currency', + value: 'params.epn.value', + }, + }, + }, + share: { + name: 'content share', + data: { + map: { + method: 'params.ep.method', + type: 'params.ep.content_type', + id: 'params.ep.item_id', + }, + }, + }, + + // --- auto-fired noise: ignore by default (users can override) --- + user_engagement: { ignore: true }, + session_start: { ignore: true }, + first_visit: { ignore: true }, + + // --- fallback for unknown event names --- + '*': { + name: 'ga4 track', + data: { + map: { + event_name: 'en', + }, + }, + }, +}; diff --git a/packages/transformers/ga4/src/dev.ts b/packages/transformers/ga4/src/dev.ts new file mode 100644 index 000000000..7febd8feb --- /dev/null +++ b/packages/transformers/ga4/src/dev.ts @@ -0,0 +1,29 @@ +/** + * Development exports for transformer-ga4. + * Used by website documentation, step examples, and downstream tests. + * + * Mirrors the validator's dev.ts pattern: only primitives leak out here, the + * transformer instance is reached via the package entry (`./index.ts`). + */ + +export { + parseRequest, + parseQuery, + parseBody, + parseItem, + parseConsent, +} from './parse'; +export { defaultMapping } from './defaults'; +export { mapHitToEvents } from './map'; +export type { + GA4Settings, + GA4Mapping, + GA4Request, + GA4Hit, + GA4Event, + GA4EventParams, + GA4HitParams, + GA4Item, +} from './types'; + +export * as examples from './examples'; diff --git a/packages/transformers/validator/src/examples/index.ts b/packages/transformers/ga4/src/examples/index.ts similarity index 100% rename from packages/transformers/validator/src/examples/index.ts rename to packages/transformers/ga4/src/examples/index.ts diff --git a/packages/transformers/ga4/src/examples/step.ts b/packages/transformers/ga4/src/examples/step.ts new file mode 100644 index 000000000..5f3387886 --- /dev/null +++ b/packages/transformers/ga4/src/examples/step.ts @@ -0,0 +1,361 @@ +import type { Flow } from '@walkeros/core'; + +/** + * Step examples for transformer-ga4. + * + * `in` is a raw `GA4Request` (`{ url, body? }`) — the shape the transformer + * reads from `ctx.ingest`. `out` is the array of effect tuples produced by + * pushing that request through the transformer: + * + * - Mapped event (single): `out: [['return', event]]` + * - Mapped events (fan-out): `out: [['return', e1], ['return', e2], ...]` + * - Dropped (ignore / no en): `out: [['return', false]]` + * + * Examples set `_p` (becomes `event.id`) and `sid` (becomes `event.timestamp` + * in ms via `sid * 1000`) so the assertions are deterministic. The synthetic + * walkerOS event shape mirrors what `mapHitToEvents` produces in `map.ts`: + * - `entity` + `action` derived from rule.name's first/rest words + * - `user.{id,device,session}` from `uid/cid/sid` + * - `source: { type: 'ga4', platform? }` from `p` + * - `consent` from `gcs` (`G100` → all false, `G111` → all true) + * - `timing` from event `_et` (defaults to 0 if absent) + * - `trigger: 'ga4'` (hard-coded in v1) + * - `nested[]` only set when items are present (POST-only example below) + */ + +// --- helpers (typed, no casts) ----------------------------------------------- + +const SID = '1700000000'; // → timestamp 1700000000000 + +function ga4Event(overrides: Record): Record { + return { + id: 'p1', + timestamp: 1700000000000, + timing: 0, + trigger: 'ga4', + user: { device: 'cid-1', session: SID }, + globals: {}, + source: { type: 'ga4' }, + consent: {}, + ...overrides, + }; +} + +// --- examples --------------------------------------------------------------- + +export const pageView: Flow.StepExample = { + title: 'Page view', + description: + 'A standard GA4 page_view hit decoded to a walkerOS page view with id, title, and referrer.', + in: { + url: + 'https://www.google-analytics.com/g/collect' + + '?v=2&tid=G-EXAMPLE&_p=p1&cid=cid-1&sid=' + + SID + + '&en=page_view' + + '&dl=https%3A%2F%2Fshop.example.com%2Fproducts%2Fsku-123' + + '&dt=Trail%20Runner%20Pro' + + '&dr=https%3A%2F%2Fshop.example.com%2F', + }, + out: [ + [ + 'return', + ga4Event({ + name: 'page view', + entity: 'page', + action: 'view', + data: { + id: 'https://shop.example.com/products/sku-123', + title: 'Trail Runner Pro', + referrer: 'https://shop.example.com/', + }, + }), + ], + ], +}; + +export const purchase: Flow.StepExample = { + title: 'Purchase (canary)', + description: + 'A GA4 purchase hit decoded to a walkerOS order complete event with id, currency, total, tax, shipping, and coupon.', + in: { + url: + 'https://www.google-analytics.com/g/collect' + + '?v=2&tid=G-EXAMPLE&_p=p1&cid=cid-1&sid=' + + SID + + '&en=purchase' + + '&ep.transaction_id=T-9001' + + '&ep.currency=EUR' + + '&epn.value=149.97' + + '&epn.tax=23.97' + + '&epn.shipping=4.95' + + '&ep.coupon=WELCOME10', + }, + out: [ + [ + 'return', + ga4Event({ + name: 'order complete', + entity: 'order', + action: 'complete', + data: { + id: 'T-9001', + currency: 'EUR', + total: 149.97, + tax: 23.97, + shipping: 4.95, + coupon: 'WELCOME10', + }, + }), + ], + ], +}; + +export const viewItem: Flow.StepExample = { + title: 'View item', + description: + 'A GA4 view_item hit decoded to a walkerOS product view event with currency and value.', + in: { + url: + 'https://www.google-analytics.com/g/collect' + + '?v=2&tid=G-EXAMPLE&_p=p1&cid=cid-1&sid=' + + SID + + '&en=view_item&ep.currency=EUR&epn.value=129.99', + }, + out: [ + [ + 'return', + ga4Event({ + name: 'product view', + entity: 'product', + action: 'view', + data: { currency: 'EUR', value: 129.99 }, + }), + ], + ], +}; + +export const addToCart: Flow.StepExample = { + title: 'Add to cart', + description: + 'A GA4 add_to_cart hit decoded to a walkerOS product add event with currency and value.', + in: { + url: + 'https://www.google-analytics.com/g/collect' + + '?v=2&tid=G-EXAMPLE&_p=p1&cid=cid-1&sid=' + + SID + + '&en=add_to_cart&ep.currency=EUR&epn.value=129.99', + }, + out: [ + [ + 'return', + ga4Event({ + name: 'product add', + entity: 'product', + action: 'add', + data: { currency: 'EUR', value: 129.99 }, + }), + ], + ], +}; + +export const beginCheckout: Flow.StepExample = { + title: 'Begin checkout', + description: + 'A GA4 begin_checkout hit decoded to a walkerOS order start event with currency, value, and coupon.', + in: { + url: + 'https://www.google-analytics.com/g/collect' + + '?v=2&tid=G-EXAMPLE&_p=p1&cid=cid-1&sid=' + + SID + + '&en=begin_checkout' + + '&ep.currency=EUR&epn.value=149.97&ep.coupon=WELCOME10', + }, + out: [ + [ + 'return', + ga4Event({ + name: 'order start', + entity: 'order', + action: 'start', + data: { + currency: 'EUR', + value: 149.97, + coupon: 'WELCOME10', + }, + }), + ], + ], +}; + +export const scroll: Flow.StepExample = { + title: 'Scroll', + description: + 'A GA4 scroll hit decoded to a walkerOS page scroll event with the percent_scrolled value.', + in: { + url: + 'https://www.google-analytics.com/g/collect' + + '?v=2&tid=G-EXAMPLE&_p=p1&cid=cid-1&sid=' + + SID + + '&en=scroll&epn.percent_scrolled=90', + }, + out: [ + [ + 'return', + ga4Event({ + name: 'page scroll', + entity: 'page', + action: 'scroll', + data: { percent: 90 }, + }), + ], + ], +}; + +export const search: Flow.StepExample = { + title: 'Search', + description: + 'A GA4 search hit decoded to a walkerOS search submit event carrying the search term.', + in: { + url: + 'https://www.google-analytics.com/g/collect' + + '?v=2&tid=G-EXAMPLE&_p=p1&cid=cid-1&sid=' + + SID + + '&en=search&ep.search_term=trail%20runner', + }, + out: [ + [ + 'return', + ga4Event({ + name: 'search submit', + entity: 'search', + action: 'submit', + data: { term: 'trail runner' }, + }), + ], + ], +}; + +export const login: Flow.StepExample = { + title: 'Login', + description: + 'A GA4 login hit decoded to a walkerOS session login event with the auth method.', + in: { + url: + 'https://www.google-analytics.com/g/collect' + + '?v=2&tid=G-EXAMPLE&_p=p1&cid=cid-1&sid=' + + SID + + '&en=login&ep.method=google', + }, + out: [ + [ + 'return', + ga4Event({ + name: 'session login', + entity: 'session', + action: 'login', + data: { method: 'google' }, + }), + ], + ], +}; + +export const customEvent: Flow.StepExample = { + title: 'Custom event (* fallback)', + description: + 'Unknown GA4 event names hit the * fallback rule and surface as a ga4 track event carrying the original name.', + in: { + url: + 'https://www.google-analytics.com/g/collect' + + '?v=2&tid=G-EXAMPLE&_p=p1&cid=cid-1&sid=' + + SID + + '&en=newsletter_subscribe&ep.source=footer', + }, + out: [ + [ + 'return', + ga4Event({ + name: 'ga4 track', + entity: 'ga4', + action: 'track', + data: { event_name: 'newsletter_subscribe' }, + }), + ], + ], +}; + +export const consentDenied: Flow.StepExample = { + title: 'Consent denied (gcs=G100)', + description: + 'A page_view hit with gcs=G100 still maps, with consent.{marketing,analytics} both false on the resulting event.', + in: { + url: + 'https://www.google-analytics.com/g/collect' + + '?v=2&tid=G-EXAMPLE&_p=p1&cid=cid-1&sid=' + + SID + + '&gcs=G100' + + '&en=page_view&dl=https%3A%2F%2Fx&dt=X', + }, + out: [ + [ + 'return', + ga4Event({ + name: 'page view', + entity: 'page', + action: 'view', + data: { id: 'https://x', title: 'X' }, + consent: { marketing: false, analytics: false }, + }), + ], + ], +}; + +export const userEngagementIgnored: Flow.StepExample = { + title: 'user_engagement (ignored)', + description: + 'Auto-fired GA4 user_engagement events are dropped by default — the transformer returns false.', + in: { + url: + 'https://www.google-analytics.com/g/collect' + + '?v=2&tid=G-EXAMPLE&_p=p1&cid=cid-1&sid=' + + SID + + '&en=user_engagement&_et=1500', + }, + out: [['return', false]], +}; + +export const batchPost: Flow.StepExample = { + title: 'Batched POST (fan-out)', + description: + 'A single POST request carrying two newline-separated events fans out into two walkerOS events.', + in: { + url: + 'https://www.google-analytics.com/g/collect' + + '?v=2&tid=G-EXAMPLE&_p=p1&cid=cid-1&sid=' + + SID, + body: [ + 'en=add_to_cart&ep.currency=EUR&epn.value=19.99', + 'en=add_to_cart&ep.currency=EUR&epn.value=29.99', + ].join('\n'), + }, + out: [ + [ + 'return', + ga4Event({ + name: 'product add', + entity: 'product', + action: 'add', + data: { currency: 'EUR', value: 19.99 }, + }), + ], + [ + 'return', + ga4Event({ + name: 'product add', + entity: 'product', + action: 'add', + data: { currency: 'EUR', value: 29.99 }, + }), + ], + ], +}; diff --git a/packages/transformers/ga4/src/index.ts b/packages/transformers/ga4/src/index.ts new file mode 100644 index 000000000..994d92d48 --- /dev/null +++ b/packages/transformers/ga4/src/index.ts @@ -0,0 +1,13 @@ +export { transformerGa4 } from './transformer'; +export { defaultMapping } from './defaults'; +export type { + GA4Settings, + GA4Mapping, + GA4Request, + GA4Hit, + GA4Event, + GA4EventParams, + GA4HitParams, + GA4Item, +} from './types'; +export { transformerGa4 as default } from './transformer'; diff --git a/packages/transformers/ga4/src/map.ts b/packages/transformers/ga4/src/map.ts new file mode 100644 index 000000000..20e2e4943 --- /dev/null +++ b/packages/transformers/ga4/src/map.ts @@ -0,0 +1,199 @@ +import type { Mapping, WalkerOS } from '@walkeros/core'; +import { getByPath, getId } from '@walkeros/core'; +import type { + GA4Event, + GA4Hit, + GA4HitParams, + GA4Item, + GA4Mapping, +} from './types'; +import { parseConsent } from './parse'; + +/** + * Lookup root for mapping path resolution. Mapping rules reference keys via + * dotted paths: `hit.dl`, `params.ep.transaction_id`, `params.epn.value`, `items`. + * + * `en` exposes the GA4 event name (used by the `*` fallback so unknown events + * can carry their original name through). `firstItem` exposes `items[0]` so + * promotion-style mappings can resolve `firstItem.promotionId` etc. without + * needing array-index syntax in `getByPath`. + * + * Typed as `Record & { ... }` so `getByPath` (which accepts + * unknown) is happy without any narrowing cast on the call site. + */ +type LookupRoot = Record & { + hit: GA4HitParams; + params: GA4Event['params']; + items: GA4Event['items']; + en: string; + firstItem?: GA4Item; +}; + +/** + * Convert a parsed GA4 hit into zero or more walkerOS events. + * One GA4 hit may carry several events (POST batch); each is mapped + * independently with hit-level metadata merged in. + */ +export function mapHitToEvents( + hit: GA4Hit, + mapping: GA4Mapping, +): WalkerOS.DeepPartialEvent[] { + const out: WalkerOS.DeepPartialEvent[] = []; + for (const event of hit.events) { + const mapped = mapOneEvent(hit.hit, event, mapping); + if (mapped) out.push(mapped); + } + return out; +} + +function mapOneEvent( + hitParams: GA4HitParams, + event: GA4Event, + mapping: GA4Mapping, +): WalkerOS.DeepPartialEvent | null { + const ruleEntry = mapping[event.en] ?? mapping['*']; + if (!ruleEntry) return null; + // For v1, only single-rule entries are supported (no array fan-out). + const rule: Mapping.Rule = Array.isArray(ruleEntry) + ? ruleEntry[0] + : ruleEntry; + if (!rule || rule.ignore) return null; + + const lookup: LookupRoot = { + hit: hitParams, + params: event.params, + items: event.items, + en: event.en, + ...(event.items.length > 0 ? { firstItem: event.items[0] } : {}), + }; + + const evaluated: WalkerOS.DeepPartialEvent = {}; + + if (rule.name) { + const [entity, ...rest] = rule.name.split(' '); + evaluated.name = rule.name; + evaluated.entity = entity; + evaluated.action = rest.join(' '); + } + + if (rule.data !== undefined) { + const data = evalValue(rule.data, lookup); + if (data !== undefined) { + evaluated.data = data as WalkerOS.Properties; + } + } + + // Hit-level merge: user / globals / source. + evaluated.user = { + ...(hitParams.uid !== undefined ? { id: hitParams.uid } : {}), + ...(hitParams.cid !== undefined ? { device: hitParams.cid } : {}), + ...(hitParams.sid !== undefined ? { session: hitParams.sid } : {}), + }; + evaluated.globals = { + ...(hitParams.ul !== undefined ? { language: hitParams.ul } : {}), + ...(hitParams.sr !== undefined ? { screen: hitParams.sr } : {}), + }; + evaluated.source = { + type: 'ga4', + ...(hitParams.p !== undefined ? { platform: hitParams.p } : {}), + }; + + // Consent from gcs string, id from hit._p (fallback to generated string), + // timestamp from sid (epoch seconds → ms; falls back to wall-clock now), + // timing from event._et (ms; 0 if absent), trigger hard-coded to "ga4" for v1. + evaluated.consent = parseConsent(hitParams); + evaluated.id = hitParams._p ?? getId(); + const sidNum = hitParams.sid ? Number(hitParams.sid) : NaN; + evaluated.timestamp = + !Number.isNaN(sidNum) && sidNum > 0 ? sidNum * 1000 : Date.now(); + evaluated.timing = event.params._et ?? 0; + evaluated.trigger = 'ga4'; + + if (event.items.length > 0) { + evaluated.nested = itemsToNested(event.items); + } + + return evaluated; +} + +/** + * GA4 items → walkerOS nested product entities. + * Field naming: camelCase GA4Item keys are emitted as snake_case data keys + * (`listName` → `list_name`, `promotionId` → `promotion_id`, etc). + * Custom k/v pairs are spread as-is. + * + * Returns `WalkerOS.Entities` (i.e. `Array`). Note that the + * canonical `WalkerOS.Entity` interface uses `entity: string` as the kind + * discriminator (not `type`). + */ +function itemsToNested(items: GA4Item[]): WalkerOS.Entities { + return items.map((item): WalkerOS.Entity => { + const data: WalkerOS.Properties = {}; + if (item.id !== undefined) data.id = item.id; + if (item.name !== undefined) data.name = item.name; + if (item.brand !== undefined) data.brand = item.brand; + if (item.category !== undefined) data.category = item.category; + if (item.category2 !== undefined) data.category2 = item.category2; + if (item.category3 !== undefined) data.category3 = item.category3; + if (item.category4 !== undefined) data.category4 = item.category4; + if (item.category5 !== undefined) data.category5 = item.category5; + if (item.variant !== undefined) data.variant = item.variant; + if (item.price !== undefined) data.price = item.price; + if (item.quantity !== undefined) data.quantity = item.quantity; + if (item.coupon !== undefined) data.coupon = item.coupon; + if (item.discount !== undefined) data.discount = item.discount; + if (item.listName !== undefined) data.list_name = item.listName; + if (item.listId !== undefined) data.list_id = item.listId; + if (item.listPosition !== undefined) data.list_position = item.listPosition; + if (item.locationId !== undefined) data.location_id = item.locationId; + if (item.affiliation !== undefined) data.affiliation = item.affiliation; + if (item.creativeName !== undefined) data.creative_name = item.creativeName; + if (item.creativeSlot !== undefined) data.creative_slot = item.creativeSlot; + if (item.promotionId !== undefined) data.promotion_id = item.promotionId; + if (item.promotionName !== undefined) + data.promotion_name = item.promotionName; + for (const [k, v] of Object.entries(item.custom)) data[k] = v; + return { entity: 'product', data, nested: [], context: {} }; + }); +} + +/** + * Minimal mapping evaluator. v1 supports: + * - string → path lookup via getByPath + * - Array → fallback chain: first non-undefined wins + * - { value: X } → literal + * - { key: 'path' } → path lookup + * - { map: {...} } → recursive object build + * + * Deferred to v2: condition, loop, fn, validate, set, consent, $code. + */ +function evalValue( + value: Mapping.Value | Mapping.Values, + root: LookupRoot, +): unknown { + if (Array.isArray(value)) { + for (const v of value) { + const resolved = evalValue(v, root); + if (resolved !== undefined && resolved !== null) return resolved; + } + return undefined; + } + if (typeof value === 'string') { + return getByPath(root, value); + } + if (typeof value === 'object' && value !== null) { + if ('value' in value && value.value !== undefined) return value.value; + if ('key' in value && typeof value.key === 'string') { + return getByPath(root, value.key); + } + if ('map' in value && value.map) { + const out: Record = {}; + for (const [k, v] of Object.entries(value.map)) { + const resolved = evalValue(v, root); + if (resolved !== undefined) out[k] = resolved; + } + return out; + } + } + return undefined; +} diff --git a/packages/transformers/ga4/src/parse.ts b/packages/transformers/ga4/src/parse.ts new file mode 100644 index 000000000..1a470cb91 --- /dev/null +++ b/packages/transformers/ga4/src/parse.ts @@ -0,0 +1,306 @@ +import type { WalkerOS } from '@walkeros/core'; +import type { + GA4Event, + GA4EventParams, + GA4Hit, + GA4HitParams, + GA4Item, + GA4Request, +} from './types'; + +export function parseQuery(url: string): Record { + const out: Record = {}; + const qIdx = url.indexOf('?'); + if (qIdx === -1) return out; + const usp = new URLSearchParams(url.slice(qIdx + 1)); + usp.forEach((value, key) => { + out[key] = value; + }); + return out; +} + +export function parseBody(body: string): Record[] { + if (!body) return []; + return body + .split(/\r?\n/) + .map((line) => line.trim()) + .filter((line) => line.length > 0) + .map((line) => { + const out: Record = {}; + const usp = new URLSearchParams(line); + usp.forEach((v, k) => { + out[k] = v; + }); + return out; + }); +} + +// Two separate dispatch maps keyed by 2-char prefix. +// Split by type so the assignment site stays type-safe (no cast). +const ITEM_STRING_FIELDS: Readonly> = { + id: 'id', + nm: 'name', + br: 'brand', + ca: 'category', + c2: 'category2', + c3: 'category3', + c4: 'category4', + c5: 'category5', + va: 'variant', + cp: 'coupon', + ln: 'listName', + li: 'listId', + lo: 'locationId', + af: 'affiliation', + cn: 'creativeName', + cs: 'creativeSlot', + pi: 'promotionId', + pn: 'promotionName', +}; + +const ITEM_NUMBER_FIELDS: Readonly> = { + pr: 'price', + qt: 'quantity', + ds: 'discount', + lp: 'listPosition', +}; + +function setItemString(item: GA4Item, key: keyof GA4Item, value: string): void { + // Narrow assignment by key — these are the string-typed fields. + switch (key) { + case 'id': + item.id = value; + return; + case 'name': + item.name = value; + return; + case 'brand': + item.brand = value; + return; + case 'category': + item.category = value; + return; + case 'category2': + item.category2 = value; + return; + case 'category3': + item.category3 = value; + return; + case 'category4': + item.category4 = value; + return; + case 'category5': + item.category5 = value; + return; + case 'variant': + item.variant = value; + return; + case 'coupon': + item.coupon = value; + return; + case 'listName': + item.listName = value; + return; + case 'listId': + item.listId = value; + return; + case 'locationId': + item.locationId = value; + return; + case 'affiliation': + item.affiliation = value; + return; + case 'creativeName': + item.creativeName = value; + return; + case 'creativeSlot': + item.creativeSlot = value; + return; + case 'promotionId': + item.promotionId = value; + return; + case 'promotionName': + item.promotionName = value; + return; + } +} + +function setItemNumber(item: GA4Item, key: keyof GA4Item, value: number): void { + switch (key) { + case 'price': + item.price = value; + return; + case 'quantity': + item.quantity = value; + return; + case 'discount': + item.discount = value; + return; + case 'listPosition': + item.listPosition = value; + return; + } +} + +export function parseItem(value: string): GA4Item { + const item: GA4Item = { custom: {} }; + const customKeys = new Map(); + const customVals = new Map(); + + for (const raw of value.split('~')) { + if (raw.length === 0) continue; + + // Variable-length k/v (must match before 2-char prefix lookup + // because k10/v10 etc are wider than 2 chars). + const kvMatch = /^([kv])(\d+)(.*)$/.exec(raw); + if (kvMatch) { + const [, kind, idx, val] = kvMatch; + if (kind === 'k') customKeys.set(idx, val); + else customVals.set(idx, val); + continue; + } + + if (raw.length < 2) continue; + const prefix = raw.slice(0, 2); + const val = raw.slice(2); + + const stringKey = ITEM_STRING_FIELDS[prefix]; + if (stringKey !== undefined) { + setItemString(item, stringKey, val); + continue; + } + const numberKey = ITEM_NUMBER_FIELDS[prefix]; + if (numberKey !== undefined) { + const n = Number(val); + if (!Number.isNaN(n)) setItemNumber(item, numberKey, n); + continue; + } + } + + // Pair k with v; drop unmatched. + for (const [idx, key] of customKeys) { + const v = customVals.get(idx); + if (v !== undefined) item.custom[key] = v; + } + return item; +} + +export function parseConsent(hit: { gcs?: string }): WalkerOS.Consent { + const gcs = hit.gcs; + if (!gcs || !/^G[01]{3}$/.test(gcs)) return {}; + // gcs[1] is reserved (always '1' for current consent mode v2) + return { + marketing: gcs[2] === '1', // ad_storage + analytics: gcs[3] === '1', // analytics_storage + }; +} + +const HIT_PARAM_KEYS = new Set([ + 'v', + 'tid', + 'cid', + 'sid', + 'sct', + 'seg', + '_p', + '_z', + 'gtm', + 'dl', + 'dt', + 'dr', + 'ul', + 'sr', + 'uid', + '_dbg', + '_s', + '_ss', + '_fv', + 'gcs', + 'gcd', + 'dma', + 'dma_cps', + 'npa', + 'p', +]); + +export function parseRequest(req: GA4Request): GA4Hit { + const queryParams = parseQuery(req.url); + const hit: GA4HitParams = {}; + const queryEventParams: Record = {}; + + // Split URL params into hit-level vs event-level. + for (const [k, v] of Object.entries(queryParams)) { + if (HIT_PARAM_KEYS.has(k)) hit[k] = v; + else queryEventParams[k] = v; + } + + // GET: event params live in the URL alongside hit params. + // POST: in body lines. + const bodyLines = req.body ? parseBody(req.body) : []; + const rawEvents = + bodyLines.length > 0 + ? bodyLines + : Object.keys(queryEventParams).length > 0 + ? [queryEventParams] + : []; + + const events: GA4Event[] = rawEvents + .filter((raw) => typeof raw.en === 'string' && raw.en.length > 0) + .map((raw) => buildEvent(raw)); + + return { hit, events }; +} + +function buildEvent(raw: Record): GA4Event { + const params: GA4EventParams = { ep: {}, epn: {}, up: {}, upn: {} }; + const itemEntries: Array<[number, string]> = []; + + for (const [k, v] of Object.entries(raw)) { + if (k === 'en') continue; + + // pr items + const prMatch = /^pr(\d+)$/.exec(k); + if (prMatch) { + itemEntries.push([Number(prMatch[1]), v]); + continue; + } + + // Dotted-key nesting + if (k.startsWith('ep.')) { + params.ep[k.slice(3)] = v; + continue; + } + if (k.startsWith('epn.')) { + const n = Number(v); + if (!Number.isNaN(n)) params.epn[k.slice(4)] = n; + continue; + } + if (k.startsWith('up.')) { + params.up[k.slice(3)] = v; + continue; + } + if (k.startsWith('upn.')) { + const n = Number(v); + if (!Number.isNaN(n)) params.upn[k.slice(4)] = n; + continue; + } + + // Standalone numeric keys + if (k === '_et') { + const n = Number(v); + if (!Number.isNaN(n)) params._et = n; + continue; + } + if (k === '_c') { + params._c = v; + continue; + } + // Unknown standalone keys: drop. Add to GA4EventParams type if a future + // need surfaces. + } + + itemEntries.sort((a, b) => a[0] - b[0]); + const items = itemEntries.map(([, v]) => parseItem(v)); + + return { en: raw.en, params, items }; +} diff --git a/packages/transformers/ga4/src/transformer.ts b/packages/transformers/ga4/src/transformer.ts new file mode 100644 index 000000000..c936fd38e --- /dev/null +++ b/packages/transformers/ga4/src/transformer.ts @@ -0,0 +1,80 @@ +import type { Ingest, Transformer } from '@walkeros/core'; +import { parseRequest } from './parse'; +import { mapHitToEvents } from './map'; +import { defaultMapping } from './defaults'; +import type { GA4Request, GA4Settings } from './types'; + +/** + * Read the raw GA4 HTTP request from `ctx.ingest`. + * + * Source wiring (e.g. an express source) is expected to populate + * `ingest.url` (full request URL, query string included) and optionally + * `ingest.body` (raw POST body as a string). `Ingest` is an open + * `Record` per `@walkeros/core`, so each field is + * narrowed with a `typeof` guard instead of a cast. + * + * Returns `null` if `url` is missing or not a string — the caller drops + * the event in that case. + */ +function readGA4Request(ingest: Ingest): GA4Request | null { + const url = ingest.url; + if (typeof url !== 'string') return null; + const body = ingest.body; + return { + url, + body: typeof body === 'string' ? body : undefined, + }; +} + +export const transformerGa4: Transformer.Init< + Transformer.Types +> = (context) => { + const { config } = context; + const settings = config.settings ?? {}; + const tidPattern = new RegExp(settings.tidPattern ?? '^G-'); + const mapping = { ...defaultMapping, ...(settings.mapping ?? {}) }; + + return { + type: 'ga4', + config, + async push(_event, ctx) { + const { logger } = ctx; + + const raw = readGA4Request(ctx.ingest); + if (!raw) { + logger.debug('transformer-ga4: no request in ingest; skipping'); + return false; + } + + try { + const hit = parseRequest(raw); + + if (hit.hit.tid && !tidPattern.test(hit.hit.tid)) { + logger.debug( + `transformer-ga4: tid ${hit.hit.tid} dropped by tidPattern`, + ); + return false; + } + + const events = mapHitToEvents(hit, mapping); + if (events.length === 0) { + logger.debug( + `transformer-ga4: no events mapped (tid=${hit.hit.tid ?? 'unknown'})`, + ); + return false; + } + + logger.debug( + `transformer-ga4: decoded ${events.length} events from ${hit.hit.tid ?? 'unknown'}`, + ); + + if (events.length === 1) return { event: events[0] }; + return events.map((event) => ({ event })); + } catch (err) { + const message = err instanceof Error ? err.message : String(err); + logger.error(`transformer-ga4: parse error: ${message}`); + return false; + } + }, + }; +}; diff --git a/packages/transformers/ga4/src/types.ts b/packages/transformers/ga4/src/types.ts new file mode 100644 index 000000000..2b1098803 --- /dev/null +++ b/packages/transformers/ga4/src/types.ts @@ -0,0 +1,132 @@ +import type { Mapping, WalkerOS } from '@walkeros/core'; + +/** Raw input to the decoder. Origin-agnostic (express, lambda, pubsub, etc). */ +export interface GA4Request { + /** Full request URL including query string. */ + url: string; + /** POST body if present. May be \n- or \r\n-separated multi-event lines. */ + body?: string; +} + +/** + * Parsed GA4 wire payload. One request → one hit → N events. + * IMPORTANT: dotted GA4 keys (`ep.transaction_id`, `epn.value`) are nested + * into structured objects at parse time so the mapping engine's getByPath + * (which splits paths on `.`) can resolve them. + */ +export interface GA4Hit { + /** Hit-level params from the URL query string. v, tid, cid, sid, dl, dt, ul, sr, gcs, gtm, p. */ + hit: GA4HitParams; + /** One entry per body line (POST) or single entry (GET). */ + events: GA4Event[]; +} + +/** Hit-level params extracted from URL query. Known keys typed; unknown keys allowed. */ +export interface GA4HitParams { + v?: string; + tid?: string; + cid?: string; + sid?: string; + sct?: string; + seg?: string; + _p?: string; + _z?: string; + gtm?: string; + dl?: string; + dt?: string; + dr?: string; + ul?: string; + sr?: string; + uid?: string; + _dbg?: string; + _s?: string; + _ss?: string; + _fv?: string; + gcs?: string; + gcd?: string; + dma?: string; + dma_cps?: string; + npa?: string; + p?: string; // platform: web, mob, srv + [other: string]: string | undefined; +} + +export interface GA4Event { + /** Event name from `en` param. */ + en: string; + /** + * Per-event params with dotted keys nested: + * raw `ep.transaction_id` → `params.ep.transaction_id` + * raw `epn.value` → `params.epn.value` + * raw `up.role` → `params.up.role` + * raw `upn.score` → `params.upn.score` + * Standalone keys: `_et`, `_c` stay flat. + */ + params: GA4EventParams; + /** Parsed items from pr1, pr2, ..., prN. Empty array if none. */ + items: GA4Item[]; +} + +export interface GA4EventParams { + /** String event params from ep.. */ + ep: Record; + /** Numeric event params from epn.. Values are coerced via Number(). */ + epn: Record; + /** String user properties from up.. */ + up: Record; + /** Numeric user properties from upn.. */ + upn: Record; + /** Engagement time delta (ms). */ + _et?: number; + /** Is-conversion flag. */ + _c?: string; +} + +/** Parsed product item from one pr param. */ +export interface GA4Item { + id?: string; + name?: string; + brand?: string; + category?: string; + category2?: string; + category3?: string; + category4?: string; + category5?: string; + variant?: string; + price?: number; + quantity?: number; + coupon?: string; + discount?: number; + listName?: string; + listId?: string; + listPosition?: number; + locationId?: string; + affiliation?: string; + creativeName?: string; + creativeSlot?: string; + promotionId?: string; + promotionName?: string; + /** Custom item params from k/v pairs (multi-digit N supported). */ + custom: Record; +} + +/** Decoder settings. */ +export interface GA4Settings { + /** + * Mapping registry keyed by GA4 event name (`en`). + * User config replaces matching package defaults at the per-event key. + * Use `'*'` for the unknown-event fallback. + * Set a rule's `ignore: true` to drop matching events. + */ + mapping?: GA4Mapping; + /** + * Regex string to filter `tid` values. Default `^G-` (drops Ads `AW-`/DC `DC-`). + * String at config time, compiled to RegExp once at init. + */ + tidPattern?: string; +} + +/** Per-event mapping rule keyed by GA4 event name. */ +export type GA4Mapping = Record & { + '*'?: Mapping.Rule; +}; diff --git a/packages/transformers/ga4/tsconfig.build.json b/packages/transformers/ga4/tsconfig.build.json new file mode 100644 index 000000000..1d3d774e6 --- /dev/null +++ b/packages/transformers/ga4/tsconfig.build.json @@ -0,0 +1,10 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "noEmit": false, + "declaration": true, + "outDir": "dist" + }, + "include": ["src/**/*"], + "exclude": ["node_modules", "dist", "src/**/__tests__/**", "src/**/*.test.ts"] +} diff --git a/packages/transformers/validator/tsconfig.json b/packages/transformers/ga4/tsconfig.json similarity index 100% rename from packages/transformers/validator/tsconfig.json rename to packages/transformers/ga4/tsconfig.json diff --git a/packages/stores/memory/tsup.config.ts b/packages/transformers/ga4/tsup.config.ts similarity index 100% rename from packages/stores/memory/tsup.config.ts rename to packages/transformers/ga4/tsup.config.ts diff --git a/packages/transformers/validator/CHANGELOG.md b/packages/transformers/validator/CHANGELOG.md deleted file mode 100644 index e2331aa8d..000000000 --- a/packages/transformers/validator/CHANGELOG.md +++ /dev/null @@ -1,290 +0,0 @@ -# @walkeros/transformer-validator - -## 4.0.2 - -### Patch Changes - -- Updated dependencies [a6a0ea7] - - @walkeros/core@4.0.2 - -## 4.0.1 - -### Patch Changes - -- Updated dependencies [381dfe7] -- Updated dependencies [1524275] -- Updated dependencies [03d7055] - - @walkeros/core@4.0.1 - -## 4.0.0 - -### Major Changes - -- 93ea9c4: Event model v4: breaking changes to the `Event`, `Source`, and - `Entity` shapes. - - `event.id` is now a W3C span_id (16 lowercase hex chars), generated by the - collector. Reference: W3C Trace Context (W3C Recommendation, January 2020). - - `event.version`, `event.group`, `event.count` are removed. - - `source.type` is now the source kind (e.g. `browser`, `gtag`, `mcp`, `cli`). - New `source.platform` holds the runtime (`web` | `server` | `app` | ...). - - `source.id` and `source.previous_id` are removed. - - Browser source now sets `source.url` and `source.referrer`. - - MCP source sets `source.tool` per emission. CLI source sets - `source.command`. - - `Entity.nested` and `Entity.context` are now optional. Root `event.nested` - and `event.context` remain required. - - Each source self-registers via TypeScript module augmentation of `SourceMap` - in `@walkeros/core`. - - App-side coordination (`/workspaces/developer/app`) is a follow-up plan, not - part of this release. Telemetry from v4 CLI/MCP will not validate against - the existing app schema until that follow-up ships. - - `Mapping.Rule.skip` is renamed to `Mapping.Rule.silent`. Customer flow.json - configs using `skip: true` in mapping rules must rename to `silent: true`. - Hard cut: no legacy alias, the field is gone. - -### Patch Changes - -- Updated dependencies [93ea9c4] -- Updated dependencies [465775c] -- Updated dependencies [942a7fe] -- Updated dependencies [cfc7469] -- Updated dependencies [8e06b1f] -- Updated dependencies [3d50dd6] -- Updated dependencies [1ef33d9] - - @walkeros/core@4.0.0 - -## 3.4.2 - -### Patch Changes - -- @walkeros/core@3.4.2 - -## 3.4.1 - -### Patch Changes - -- Updated dependencies [12adf24] -- Updated dependencies [75aa26b] - - @walkeros/core@3.4.1 - -## 3.4.0 - -### Minor Changes - -- 724f97e: Migrate every step example in every walkerOS package to the - standardized `[callable, ...args][]` shape introduced in `@walkeros/core`. - Every step example's `out` is now an array of effect tuples whose first - element is the callable's public SDK name (`'gtag'`, `'analytics.track'`, - `'fbq'`, `'dataLayer.push'`, `'sendServer'`, `'fetch'`, `'trackClient.track'`, - `'amplitude.track'`, `'fs.writeFile'`, `'producer.send'`, `'client.xadd'`, - `'client.send'`, `'dataset.table.insert'`, etc.). Source examples use `'elb'` - as the callable; transformer examples use the reserved `'return'` keyword; - store examples use store-operation callables (`'get'`, `'set'`). Tests capture - real calls on each component's spy and assert against `example.out` directly — - the hardcoded `PACKAGE_CALLS` registry in the app is no longer consulted - (emptied; plan #3 removes it structurally). - -### Patch Changes - -- Updated dependencies [74940cc] -- Updated dependencies [525f5d9] - - @walkeros/core@3.4.0 - -## 3.3.1 - -### Patch Changes - -- @walkeros/core@3.3.1 - -## 3.3.0 - -### Patch Changes - -- Updated dependencies [2849acb] -- Updated dependencies [08c365a] -- Updated dependencies [08c365a] -- Updated dependencies [08c365a] -- Updated dependencies [08c365a] - - @walkeros/core@3.3.0 - -## 3.2.0 - -### Patch Changes - -- Updated dependencies [eb865e1] -- Updated dependencies [c0a53f9] -- Updated dependencies [f007c9f] -- Updated dependencies [bf2dc5b] -- Updated dependencies [da0b640] - - @walkeros/core@3.2.0 - -## 3.1.1 - -### Patch Changes - -- @walkeros/core@3.1.1 - -## 3.1.0 - -### Patch Changes - -- Updated dependencies [dfc6738] -- Updated dependencies [966342b] -- Updated dependencies [bee8ba7] -- Updated dependencies [966342b] -- Updated dependencies [df990d4] - - @walkeros/core@3.1.0 - -## 3.0.2 - -### Patch Changes - -- @walkeros/core@3.0.2 - -## 3.0.1 - -### Patch Changes - -- @walkeros/core@3.0.1 - -## 3.0.0 - -### Major Changes - -- 23f218a: Replace flat/v2 contract format with named contracts supporting - extends inheritance. - - BREAKING CHANGES: - - `contract` is now a map of named contract entries (e.g., - `{ "default": { ... }, "web": { ... } }`) - - `version` field inside contracts removed - - `$tagging` renamed to `tagging` - - Legacy flat contract format removed - - `$globals`, `$context`, `$custom`, `$user`, `$consent` references removed - - Settings-level `contract` field removed (use named contracts at config - level) - - Auto-injection of `$tagging` into `collector.tagging` removed (use - `$contract.name.tagging` explicitly) - - Validator `contract` setting renamed to `events` (receives raw schemas, not - `{ schema: ... }` wrappers) - - NEW FEATURES: - - Named contracts with `extends` for inheritance (additive merge) - - Generalized dot-path resolution: `$def.name.nested.path`, - `$contract.name.section` - - `$contract` as first-class reference type with path access - - `$def` inside contracts supported via two-pass resolution - - `$def` aliasing for reducing repetition: `{ "c": "$contract.web" }` then - `$def.c.events` - -### Minor Changes - -- 6ae0ee3: Add v2 structured contract format with globals, context, custom, - user, and consent sections. - - Contracts can now describe cross-event properties (globals, consent, etc.) - alongside entity-action event schemas. Top-level sections are JSON Schemas - that merge additively into per-event validation. - - Breaking: None. Legacy flat contracts continue working unchanged. v2 is opt-in - via `version: 2` field. - -### Patch Changes - -- 499e27a: Add sideEffects declarations to all packages for bundler tree-shaking - support. -- Updated dependencies [2b259b6] -- Updated dependencies [2614014] -- Updated dependencies [6ae0ee3] -- Updated dependencies [37299a9] -- Updated dependencies [499e27a] -- Updated dependencies [0e5eede] -- Updated dependencies [d11f574] -- Updated dependencies [d11f574] -- Updated dependencies [1fe337a] -- Updated dependencies [5cb84c1] -- Updated dependencies [23f218a] -- Updated dependencies [499e27a] -- Updated dependencies [c83d909] -- Updated dependencies [b6c8fa8] - - @walkeros/core@3.0.0 - -## 2.1.1 - -### Patch Changes - -- fab477d: Replace union transformer return type with unified - `Transformer.Result` object. Transformers now return `{ event }` instead of - naked events, and can optionally include `respond` (for wrapping) or `next` - (for branching). The `BranchResult` type and `__branch` discriminant are - removed. -- Updated dependencies [fab477d] - - @walkeros/core@2.1.1 - -## 2.1.0 - -### Minor Changes - -- 97df0b2: Step examples: upgrade all packages to blueprint pattern with inline - mapping, no intermediate variables, no `all` export - -### Patch Changes - -- Updated dependencies [7fc4cee] -- Updated dependencies [7fc4cee] -- Updated dependencies [cb2da05] -- Updated dependencies [2bbe8c8] -- Updated dependencies [3eb6416] -- Updated dependencies [02a7958] -- Updated dependencies [97df0b2] -- Updated dependencies [97df0b2] -- Updated dependencies [026c412] -- Updated dependencies [7d38d9d] - - @walkeros/core@2.1.0 - -## 2.0.1 - -## 5.0.0 - -### Patch Changes - -- Updated dependencies [7b2d750] - - @walkeros/core@1.4.0 - -## 4.0.0 - -### Patch Changes - -- Updated dependencies [a4cc1ea] - - @walkeros/core@1.3.0 - -## 3.0.0 - -### Patch Changes - -- 6778ab2: Add default exports for simpler CLI flow.json configuration -- Updated dependencies [f39d9fb] -- Updated dependencies [888bbdf] - - @walkeros/core@1.2.0 - -## 2.0.0 - -### Patch Changes - -- Updated dependencies [b65b773] -- Updated dependencies [20eca6e] - - @walkeros/core@1.1.0 - -## 1.0.0 - -### Major Changes - -- 67c9e1d: Hello World! walkerOS v1.0.0 - - Open-source event data collection. Collect event data for digital analytics in - a unified and privacy-centric way. - -### Patch Changes - -- Updated dependencies [67c9e1d] - - @walkeros/core@1.0.0 diff --git a/packages/transformers/validator/README.md b/packages/transformers/validator/README.md deleted file mode 100644 index 9853890ea..000000000 --- a/packages/transformers/validator/README.md +++ /dev/null @@ -1,61 +0,0 @@ -# @walkeros/transformer-validator - -Event validation transformer using JSON Schema. - -[Source Code](https://github.com/elbwalker/walkerOS/tree/main/packages/transformers/validator) -| [NPM](https://www.npmjs.com/package/@walkeros/transformer-validator) | -[Documentation](https://www.walkeros.io/docs/transformers/validator) - -## Quick Start - -```json -{ - "transformers": { - "validate": { - "package": "@walkeros/transformer-validator", - "config": { - "logger": { "level": "DEBUG" }, - "settings": { - "format": true, - "contract": { - "product": { - "add": { - "schema": { - "properties": { - "data": { "required": ["id", "name"] } - } - } - } - } - } - } - } - } - } -} -``` - -## Features - -- **Format validation**: Validates full WalkerOS.Event structure -- **Contract validation**: Entity/action-specific business rules -- **Wildcards**: Match multiple events with `*` patterns -- **Conditional rules**: Apply different schemas based on event data - -## Installation - -```bash -npm install @walkeros/transformer-validator -``` - -## Configuration - -| Property | Type | Description | -| ---------- | ------------------------------------------------------------------------------- | --------------------------------------------------- | -| `format` | `boolean` | Validate WalkerOS.Event structure (default: `true`) | -| `contract` | [`Contract`](https://www.walkeros.io/docs/transformers/validator#configuration) | Entity/action validation rules (see docs) | - -## Related - -- [Documentation](https://www.walkeros.io/docs/transformers/validator) -- [Transformers Overview](https://www.walkeros.io/docs/transformers) diff --git a/packages/transformers/validator/jest.config.mjs b/packages/transformers/validator/jest.config.mjs deleted file mode 100644 index d1e06ddf6..000000000 --- a/packages/transformers/validator/jest.config.mjs +++ /dev/null @@ -1,5 +0,0 @@ -import baseConfig from '@walkeros/config/jest'; - -const config = {}; - -export default { ...baseConfig, ...config }; diff --git a/packages/transformers/validator/src/__tests__/contract.test.ts b/packages/transformers/validator/src/__tests__/contract.test.ts deleted file mode 100644 index a0ec4b746..000000000 --- a/packages/transformers/validator/src/__tests__/contract.test.ts +++ /dev/null @@ -1,314 +0,0 @@ -import type { Transformer, WalkerOS } from '@walkeros/core'; -import { createMockContext, createMockLogger } from '@walkeros/core'; -import { transformerValidator } from '../transformer'; -import type { ValidatorSettings } from '../types'; - -describe('Contract Integration Tests', () => { - const mockLogger = createMockLogger(); - - const createContext = ( - config: Transformer.Config>, - ) => - createMockContext>({ - config, - logger: mockLogger, - id: 'test-transformer', - }); - - const createEvent = ( - entity: string, - action: string, - data: WalkerOS.Properties = {}, - ): WalkerOS.Event => ({ - name: `${entity} ${action}`, - entity, - action, - data, - context: {}, - globals: {}, - custom: {}, - user: {}, - nested: [], - consent: {}, - id: 'evt-123', - trigger: 'click', - timestamp: Date.now(), - timing: 100, - source: { - type: 'browser', - platform: 'web', - url: 'https://example.com/', - schema: '4', - }, - }); - - beforeEach(() => { - jest.clearAllMocks(); - }); - - describe('Wildcard Matching', () => { - it('should match entity.* wildcard', async () => { - const config: Transformer.Config> = { - settings: { - format: false, - events: { - product: { - '*': { - properties: { - data: { required: ['id'] }, - }, - }, - }, - }, - }, - }; - const context = createContext(config); - const transformer = await transformerValidator(context); - - // Any product action should match - const viewEvent = createEvent('product', 'view', { id: '123' }); - const addEvent = createEvent('product', 'add', { id: '456' }); - - expect(await transformer.push(viewEvent, context)).toEqual({ - event: viewEvent, - }); - expect(await transformer.push(addEvent, context)).toEqual({ - event: addEvent, - }); - expect(mockLogger.debug).toHaveBeenCalledWith( - 'Contract validation passed', - { rule: 'product *' }, - ); - }); - - it('should match *.action wildcard when entity not in contract', async () => { - const config: Transformer.Config> = { - settings: { - format: false, - events: { - '*': { - purchase: { - properties: { - data: { required: ['value'] }, - }, - }, - }, - }, - }, - }; - const context = createContext(config); - const transformer = await transformerValidator(context); - - const event = createEvent('item', 'purchase', { value: 100 }); - - expect(await transformer.push(event, context)).toEqual({ event }); - expect(mockLogger.debug).toHaveBeenCalledWith( - 'Contract validation passed', - { rule: '* purchase' }, - ); - }); - - it('should match *.* global fallback', async () => { - const config: Transformer.Config> = { - settings: { - format: false, - events: { - '*': { - '*': { - properties: { - data: { type: 'object' }, - }, - }, - }, - }, - }, - }; - const context = createContext(config); - const transformer = await transformerValidator(context); - - const event = createEvent('anything', 'random', { foo: 'bar' }); - - expect(await transformer.push(event, context)).toEqual({ event }); - expect(mockLogger.debug).toHaveBeenCalledWith( - 'Contract validation passed', - { rule: '* *' }, - ); - }); - - it('should prefer exact match over wildcards', async () => { - const config: Transformer.Config> = { - settings: { - format: false, - events: { - product: { - view: { - properties: { - data: { required: ['id', 'name'] }, // Stricter - }, - }, - '*': { - properties: { - data: { required: ['id'] }, // Less strict - }, - }, - }, - }, - }, - }; - const context = createContext(config); - const transformer = await transformerValidator(context); - - // Missing 'name' should fail exact match - const event = createEvent('product', 'view', { id: '123' }); - - expect(await transformer.push(event, context)).toBe(false); - expect(mockLogger.error).toHaveBeenCalledWith( - 'Contract validation failed', - expect.objectContaining({ rule: 'product view' }), - ); - }); - }); - - describe('Lazy Compilation Caching', () => { - it('should reuse compiled validators', async () => { - const config: Transformer.Config> = { - settings: { - format: false, - events: { - product: { - view: { - properties: { - data: { required: ['id'] }, - }, - }, - }, - }, - }, - }; - const context = createContext(config); - const transformer = await transformerValidator(context); - - const event1 = createEvent('product', 'view', { id: '123' }); - const event2 = createEvent('product', 'view', { id: '456' }); - const event3 = createEvent('product', 'view', { id: '789' }); - - // All should pass using the same cached validator - expect(await transformer.push(event1, context)).toEqual({ - event: event1, - }); - expect(await transformer.push(event2, context)).toEqual({ - event: event2, - }); - expect(await transformer.push(event3, context)).toEqual({ - event: event3, - }); - - // Debug called 3 times with same rule - expect(mockLogger.debug).toHaveBeenCalledTimes(3); - expect(mockLogger.debug).toHaveBeenCalledWith( - 'Contract validation passed', - { rule: 'product view' }, - ); - }); - }); - - describe('Pass-through Behavior', () => { - it('should pass unmatched events through unchanged', async () => { - const config: Transformer.Config> = { - settings: { - format: false, - events: { - order: { - complete: { - properties: { - data: { required: ['total'] }, - }, - }, - }, - }, - }, - }; - const context = createContext(config); - const transformer = await transformerValidator(context); - - // Different entity/action - no matching rule - const event = createEvent('product', 'view', { anything: 'goes' }); - - expect(await transformer.push(event, context)).toEqual({ event }); - expect(mockLogger.error).not.toHaveBeenCalled(); - expect(mockLogger.debug).not.toHaveBeenCalled(); - }); - - it('should pass events when events is not configured', async () => { - const config: Transformer.Config> = { - settings: { - format: false, - // No events - }, - }; - const context = createContext(config); - const transformer = await transformerValidator(context); - - const event = createEvent('any', 'event', {}); - - expect(await transformer.push(event, context)).toEqual({ event }); - }); - }); - - describe('Combined Format and Contract', () => { - it('should validate both format and contract', async () => { - const config: Transformer.Config> = { - settings: { - format: true, - events: { - product: { - view: { - properties: { - data: { required: ['id'] }, - }, - }, - }, - }, - }, - }; - const context = createContext(config); - const transformer = await transformerValidator(context); - - const event = createEvent('product', 'view', { id: '123' }); - - expect(await transformer.push(event, context)).toEqual({ event }); - }); - - it('should fail on format before reaching contract', async () => { - const config: Transformer.Config> = { - settings: { - format: true, - events: { - product: { - view: { - properties: { - data: { required: ['id'] }, - }, - }, - }, - }, - }, - }; - const context = createContext(config); - const transformer = await transformerValidator(context); - - const invalidEvent = { - ...createEvent('product', 'view', { id: '123' }), - name: 'invalid', // Bad format - }; - - expect(await transformer.push(invalidEvent, context)).toBe(false); - expect(mockLogger.error).toHaveBeenCalledWith( - 'Event format invalid', - expect.any(Object), - ); - // Contract validation should not run - expect(mockLogger.debug).not.toHaveBeenCalled(); - }); - }); -}); diff --git a/packages/transformers/validator/src/__tests__/format.test.ts b/packages/transformers/validator/src/__tests__/format.test.ts deleted file mode 100644 index fc8b74baf..000000000 --- a/packages/transformers/validator/src/__tests__/format.test.ts +++ /dev/null @@ -1,110 +0,0 @@ -import Ajv from 'ajv'; -import { formatSchema } from '../format-schema'; -import type { WalkerOS } from '@walkeros/core'; - -describe('Format Schema', () => { - const ajv = new Ajv({ allErrors: true }); - const validate = ajv.compile(formatSchema); - - const validEvent: WalkerOS.Event = { - name: 'product view', - entity: 'product', - action: 'view', - data: { id: '123', name: 'Test Product' }, - context: {}, - globals: {}, - custom: {}, - user: {}, - nested: [], - consent: {}, - id: 'evt-123', - trigger: 'click', - timestamp: Date.now(), - timing: 100, - source: { - type: 'browser', - platform: 'web', - url: 'https://example.com/', - schema: '4', - }, - }; - - it('should validate a correct WalkerOS.Event', () => { - const result = validate(validEvent); - expect(result).toBe(true); - expect(validate.errors).toBeNull(); - }); - - it('should reject event with missing required fields', () => { - const invalidEvent = { ...validEvent }; - delete (invalidEvent as Record).name; - - const result = validate(invalidEvent); - expect(result).toBe(false); - expect(validate.errors).toContainEqual( - expect.objectContaining({ - keyword: 'required', - params: { missingProperty: 'name' }, - }), - ); - }); - - it('should reject event with invalid name format', () => { - const invalidEvent = { ...validEvent, name: 'singleword' }; - - const result = validate(invalidEvent); - expect(result).toBe(false); - expect(validate.errors).toContainEqual( - expect.objectContaining({ - keyword: 'pattern', - instancePath: '/name', - }), - ); - }); - - it('should reject event with wrong field type', () => { - const invalidEvent = { ...validEvent, timestamp: 'not a number' }; - - const result = validate(invalidEvent); - expect(result).toBe(false); - expect(validate.errors).toContainEqual( - expect.objectContaining({ - keyword: 'type', - instancePath: '/timestamp', - }), - ); - }); - - it('should reject event with missing source.type', () => { - const invalidEvent = { - ...validEvent, - source: { platform: 'web' } as WalkerOS.Source, - }; - - const result = validate(invalidEvent); - expect(result).toBe(false); - expect(validate.errors).toContainEqual( - expect.objectContaining({ - keyword: 'required', - instancePath: '/source', - }), - ); - }); - - it('should validate nested array as empty', () => { - const eventWithEmptyNested = { ...validEvent, nested: [] }; - - const result = validate(eventWithEmptyNested); - expect(result).toBe(true); - }); - - it('should validate data as any object', () => { - const eventWithComplexData = { - ...validEvent, - data: { deeply: { nested: { value: 123 } } }, - }; - - const result = validate(eventWithComplexData); - expect(result).toBe(true); - }); -}); diff --git a/packages/transformers/validator/src/__tests__/globals.test.ts b/packages/transformers/validator/src/__tests__/globals.test.ts deleted file mode 100644 index 70b1f6d68..000000000 --- a/packages/transformers/validator/src/__tests__/globals.test.ts +++ /dev/null @@ -1,112 +0,0 @@ -import type { Transformer, WalkerOS } from '@walkeros/core'; -import { createMockContext, createMockLogger } from '@walkeros/core'; -import { transformerValidator } from '../transformer'; -import type { ValidatorSettings } from '../types'; - -const mockLogger = createMockLogger(); - -const createContext = ( - config: Transformer.Config>, -) => - createMockContext>({ - config, - logger: mockLogger, - id: 'test-transformer', - }); - -function makeEvent(overrides: Partial = {}): WalkerOS.Event { - return { - name: 'product view', - entity: 'product', - action: 'view', - data: {}, - context: {}, - globals: {}, - custom: {}, - user: {}, - nested: [], - consent: {}, - id: 'test-id', - trigger: 'load', - timestamp: Date.now(), - timing: 0, - source: { - type: 'browser', - platform: 'web', - url: 'https://example.com/', - schema: '4', - }, - ...overrides, - }; -} - -describe('globals validation', () => { - beforeEach(() => { - jest.clearAllMocks(); - }); - - it('should pass when globals match schema', async () => { - const config: Transformer.Config> = { - settings: { - format: false, - globals: { - type: 'object', - required: ['country'], - properties: { - country: { type: 'string' }, - }, - }, - }, - }; - const instance = await transformerValidator(createContext(config)); - const event = makeEvent({ globals: { country: 'DE' } }); - const result = await instance.push( - event, - createMockContext({ logger: mockLogger }), - ); - expect(result).toEqual({ event }); - }); - - it('should fail when required global is missing', async () => { - const config: Transformer.Config> = { - settings: { - format: false, - globals: { - type: 'object', - required: ['country'], - properties: { - country: { type: 'string' }, - }, - }, - }, - }; - const instance = await transformerValidator(createContext(config)); - const event = makeEvent({ globals: {} }); - const result = await instance.push( - event, - createMockContext({ logger: mockLogger }), - ); - expect(result).toBe(false); - }); - - it('should fail when global has wrong type', async () => { - const config: Transformer.Config> = { - settings: { - format: false, - globals: { - type: 'object', - properties: { - country: { type: 'string' }, - }, - }, - }, - }; - const instance = await transformerValidator(createContext(config)); - const event = makeEvent({ globals: { country: 123 } }); - const result = await instance.push( - event, - createMockContext({ logger: mockLogger }), - ); - expect(result).toBe(false); - }); -}); diff --git a/packages/transformers/validator/src/__tests__/stepExamples.test.ts b/packages/transformers/validator/src/__tests__/stepExamples.test.ts deleted file mode 100644 index ee74b765b..000000000 --- a/packages/transformers/validator/src/__tests__/stepExamples.test.ts +++ /dev/null @@ -1,58 +0,0 @@ -import type { Transformer, WalkerOS } from '@walkeros/core'; -import { createMockContext } from '@walkeros/core'; -import { transformerValidator } from '../transformer'; -import type { ValidatorSettings } from '../types'; -import { examples } from '../dev'; - -describe('Step Examples', () => { - // Per-example settings overrides for examples needing contract validation - const settingsOverrides: Record = { - contractValidationPass: { - format: true, - events: { - order: { - complete: { - properties: { - data: { - type: 'object', - required: ['id', 'total', 'currency'], - }, - }, - }, - }, - }, - }, - }; - - const defaultSettings: ValidatorSettings = { format: true }; - - it.each(Object.entries(examples.step))('%s', async (name, example) => { - const settings = settingsOverrides[name] || defaultSettings; - const config: Transformer.Config> = { - settings, - }; - const context = createMockContext>({ - config, - id: 'test-validator', - }); - const transformer = await transformerValidator(context); - const result = await transformer.push( - example.in as WalkerOS.DeepPartialEvent, - context, - ); - - const actual = - result === undefined - ? [] - : [ - [ - 'return', - result === false - ? false - : (result as { event: WalkerOS.DeepPartialEvent }).event, - ], - ]; - - expect(actual).toEqual(example.out); - }); -}); diff --git a/packages/transformers/validator/src/__tests__/transformer.test.ts b/packages/transformers/validator/src/__tests__/transformer.test.ts deleted file mode 100644 index 619cd0811..000000000 --- a/packages/transformers/validator/src/__tests__/transformer.test.ts +++ /dev/null @@ -1,196 +0,0 @@ -import type { Transformer, WalkerOS } from '@walkeros/core'; -import { createMockContext, createMockLogger } from '@walkeros/core'; -import { transformerValidator } from '../transformer'; -import type { ValidatorSettings } from '../types'; -import { examples } from '../dev'; - -describe('Transformer Validator', () => { - const mockLogger = createMockLogger(); - - const createContext = ( - config: Transformer.Config>, - ) => - createMockContext>({ - config, - logger: mockLogger, - }); - - const validEvent: WalkerOS.Event = { - name: 'product view', - entity: 'product', - action: 'view', - data: { id: '123', name: 'Test Product' }, - context: {}, - globals: {}, - custom: {}, - user: {}, - nested: [], - consent: {}, - id: 'evt-123', - trigger: 'click', - timestamp: Date.now(), - timing: 100, - source: { - type: 'browser', - platform: 'web', - url: 'https://example.com/', - schema: '4', - }, - }; - - beforeEach(() => { - jest.clearAllMocks(); - }); - - describe('Format Validation', () => { - it('should pass valid events with format validation enabled', async () => { - const config: Transformer.Config> = { - settings: { format: true }, - }; - const context = createContext(config); - const transformer = await transformerValidator(context); - - const result = await transformer.push(validEvent, context); - - expect(result).toEqual({ event: validEvent }); - expect(mockLogger.error).not.toHaveBeenCalled(); - }); - - it('should reject invalid events with format validation', async () => { - const config: Transformer.Config> = { - settings: { format: true }, - }; - const context = createContext(config); - const transformer = await transformerValidator(context); - - const invalidEvent = { ...validEvent, name: 'invalid' }; // Missing space - - const result = await transformer.push(invalidEvent, context); - - expect(result).toBe(false); - expect(mockLogger.error).toHaveBeenCalledWith( - 'Event format invalid', - expect.objectContaining({ errors: expect.any(String) }), - ); - }); - - it('should skip format validation when disabled', async () => { - const config: Transformer.Config> = { - settings: { format: false }, - }; - const context = createContext(config); - const transformer = await transformerValidator(context); - - const invalidEvent = { ...validEvent, name: 'invalid' }; - - const result = await transformer.push(invalidEvent, context); - - expect(result).toEqual({ event: invalidEvent }); - expect(mockLogger.error).not.toHaveBeenCalled(); - }); - - it('should enable format validation by default', async () => { - const config: Transformer.Config> = { - settings: {}, - }; - const context = createContext(config); - const transformer = await transformerValidator(context); - - const invalidEvent = { ...validEvent, name: 'invalid' }; - - const result = await transformer.push(invalidEvent, context); - - expect(result).toBe(false); - }); - }); - - describe('Contract Validation', () => { - it('should pass events matching contract schema', async () => { - const config: Transformer.Config> = { - settings: { - format: false, - events: { - product: { - view: { - properties: { - data: { - type: 'object', - required: ['id', 'name'], - }, - }, - }, - }, - }, - }, - }; - const context = createContext(config); - const transformer = await transformerValidator(context); - - const result = await transformer.push(validEvent, context); - - expect(result).toEqual({ event: validEvent }); - expect(mockLogger.debug).toHaveBeenCalledWith( - 'Contract validation passed', - { rule: 'product view' }, - ); - }); - - it('should reject events failing contract schema', async () => { - const config: Transformer.Config> = { - settings: { - format: false, - events: { - product: { - view: { - properties: { - data: { - type: 'object', - required: ['id', 'name', 'price'], // price is missing - }, - }, - }, - }, - }, - }, - }; - const context = createContext(config); - const transformer = await transformerValidator(context); - - const result = await transformer.push(validEvent, context); - - expect(result).toBe(false); - expect(mockLogger.error).toHaveBeenCalledWith( - 'Contract validation failed', - expect.objectContaining({ - rule: 'product view', - errors: expect.any(String), - }), - ); - }); - - it('should pass unmatched events through', async () => { - const config: Transformer.Config> = { - settings: { - format: false, - events: { - order: { - complete: { - properties: { - data: { required: ['total'] }, - }, - }, - }, - }, - }, - }; - const context = createContext(config); - const transformer = await transformerValidator(context); - - // product view doesn't match order complete - const result = await transformer.push(validEvent, context); - - expect(result).toEqual({ event: validEvent }); - expect(mockLogger.error).not.toHaveBeenCalled(); - }); - }); -}); diff --git a/packages/transformers/validator/src/dev.ts b/packages/transformers/validator/src/dev.ts deleted file mode 100644 index 21a45f6bf..000000000 --- a/packages/transformers/validator/src/dev.ts +++ /dev/null @@ -1,36 +0,0 @@ -/** - * Development exports for transformer-validator - * Used by website documentation and examples - */ -import { formatSchema } from './format-schema'; -import type { JsonSchema } from './types'; - -export { formatSchema }; - -/** - * JSON Schema describing ValidatorSettings for documentation. - */ -export const settingsSchema: JsonSchema = { - type: 'object', - properties: { - format: { - type: 'boolean', - description: - 'Validate full WalkerOS.Event structure. Pre-compiled at init.', - default: true, - }, - contract: { - type: 'object', - description: - 'Event-specific validation rules. Entity/action keyed, supports wildcards.', - }, - }, -}; - -// Re-export for convenience -export const schemas: { format: JsonSchema; settings: JsonSchema } = { - format: formatSchema, - settings: settingsSchema, -}; - -export * as examples from './examples'; diff --git a/packages/transformers/validator/src/examples/step.ts b/packages/transformers/validator/src/examples/step.ts deleted file mode 100644 index ab11e8da3..000000000 --- a/packages/transformers/validator/src/examples/step.ts +++ /dev/null @@ -1,69 +0,0 @@ -import type { Flow } from '@walkeros/core'; -import { getEvent } from '@walkeros/core'; - -export const validEvent: Flow.StepExample = { - title: 'Valid event', - description: - 'A well-formed product view passes validation and is returned unchanged for downstream destinations.', - in: getEvent('product view', { - id: 'ev-1700000700', - timestamp: 1700000700, - data: { id: 'SKU-100', name: 'Trail Runner Pro', price: 129.99 }, - source: { type: 'browser', platform: 'web', url: 'https://example.com/' }, - }), - out: [ - [ - 'return', - getEvent('product view', { - id: 'ev-1700000700', - timestamp: 1700000700, - data: { id: 'SKU-100', name: 'Trail Runner Pro', price: 129.99 }, - source: { - type: 'browser', - platform: 'web', - url: 'https://example.com/', - }, - }), - ], - ], -}; - -export const invalidFormat: Flow.StepExample = { - public: false, - in: { - name: 'invalid', - data: {}, - }, - out: [['return', false]], -}; - -export const contractValidationPass: Flow.StepExample = { - title: 'Contract validation', - description: - 'Contract validation passes when event data matches the entity.action JSON Schema', - in: getEvent('order complete', { - id: 'ev-1700000800', - timestamp: 1700000800, - data: { id: '0rd3r1d', total: 555, currency: 'EUR' }, - source: { - type: 'browser', - platform: 'web', - url: 'https://shop.example.com/', - }, - }), - out: [ - [ - 'return', - getEvent('order complete', { - id: 'ev-1700000800', - timestamp: 1700000800, - data: { id: '0rd3r1d', total: 555, currency: 'EUR' }, - source: { - type: 'browser', - platform: 'web', - url: 'https://shop.example.com/', - }, - }), - ], - ], -}; diff --git a/packages/transformers/validator/src/format-schema.ts b/packages/transformers/validator/src/format-schema.ts deleted file mode 100644 index 49e1f36bc..000000000 --- a/packages/transformers/validator/src/format-schema.ts +++ /dev/null @@ -1,56 +0,0 @@ -import type { JsonSchema } from './types'; - -/** - * Pre-compiled JSON Schema for WalkerOS.Event structure validation. - * Validates that all required fields exist with correct types. - */ -export const formatSchema: JsonSchema = { - type: 'object', - required: [ - 'name', - 'entity', - 'action', - 'data', - 'globals', - 'custom', - 'user', - 'consent', - 'id', - 'trigger', - 'timestamp', - 'timing', - 'source', - ], - properties: { - name: { type: 'string', pattern: '^\\S+ \\S+$' }, // "entity action" - entity: { type: 'string' }, - action: { type: 'string' }, - data: { type: 'object' }, - context: { type: 'object' }, - globals: { type: 'object' }, - custom: { type: 'object' }, - user: { type: 'object' }, - nested: { type: 'array' }, - consent: { type: 'object' }, - id: { type: 'string' }, - trigger: { type: 'string' }, - timestamp: { type: 'number' }, - timing: { type: 'number' }, - source: { - type: 'object', - required: ['type'], - properties: { - type: { type: 'string' }, - platform: { type: 'string' }, - url: { type: 'string' }, - referrer: { type: 'string' }, - schema: { type: 'string' }, - version: { type: 'string' }, - count: { type: 'number' }, - trace: { type: 'string' }, - tool: { type: 'string' }, - command: { type: 'string' }, - }, - }, - }, -}; diff --git a/packages/transformers/validator/src/index.ts b/packages/transformers/validator/src/index.ts deleted file mode 100644 index e1d3c9ecc..000000000 --- a/packages/transformers/validator/src/index.ts +++ /dev/null @@ -1,4 +0,0 @@ -export { transformerValidator } from './transformer'; -export type { ValidatorSettings, ContractEvents, JsonSchema } from './types'; - -export { transformerValidator as default } from './transformer'; diff --git a/packages/transformers/validator/src/transformer.ts b/packages/transformers/validator/src/transformer.ts deleted file mode 100644 index 4a4702177..000000000 --- a/packages/transformers/validator/src/transformer.ts +++ /dev/null @@ -1,140 +0,0 @@ -import Ajv, { ValidateFunction } from 'ajv'; -import type { Transformer } from '@walkeros/core'; -import { formatSchema } from './format-schema'; -import type { ValidatorSettings, JsonSchema } from './types'; - -export const transformerValidator: Transformer.Init< - Transformer.Types -> = (context) => { - const { config } = context; - const settings = config.settings || {}; - const { - format = true, - events, - globals, - context: ctx, - custom, - user, - consent, - } = settings; - - const ajv = new Ajv({ allErrors: true, strict: false }); - - // Pre-compile format validator - const formatValidator = format ? ajv.compile(formatSchema) : null; - - // Pre-compile section validators (run on every event) - const sectionValidators: Array<{ - name: string; - field: string; - validate: ValidateFunction; - }> = []; - - const sectionSchemas = { globals, context: ctx, custom, user, consent }; - for (const [name, schema] of Object.entries(sectionSchemas)) { - if (schema) { - sectionValidators.push({ - name, - field: name, - validate: ajv.compile({ type: 'object', ...schema }), - }); - } - } - - // Lazy-compiled event validators - const eventValidators = new Map(); - - function getEventValidator( - entity: string, - action: string, - schema: JsonSchema, - ) { - const key = `${entity}.${action}`; - if (!eventValidators.has(key)) { - eventValidators.set(key, ajv.compile({ type: 'object', ...schema })); - } - return eventValidators.get(key)!; - } - - /** - * Find matching event schema using wildcard fallback. - * Checks: entity.action → entity.* → *.action → *.* - */ - function findEventSchema( - entity: string, - action: string, - ): { schema: JsonSchema; key: string } | undefined { - if (!events) return undefined; - - // Direct match - if (events[entity]?.[action]) { - return { schema: events[entity][action], key: `${entity} ${action}` }; - } - // Entity wildcard - if (events[entity]?.['*']) { - return { schema: events[entity]['*'], key: `${entity} *` }; - } - // Action wildcard - if (events['*']?.[action]) { - return { schema: events['*'][action], key: `* ${action}` }; - } - // Global wildcard - if (events['*']?.['*']) { - return { schema: events['*']['*'], key: '* *' }; - } - return undefined; - } - - return { - type: 'validator', - config, - - async push(event, context) { - const { logger } = context; - - // 1. Format validation (pre-compiled, fast) - if (formatValidator && !formatValidator(event)) { - logger.error('Event format invalid', { - errors: ajv.errorsText(formatValidator.errors), - }); - return false; - } - - // 2. Section validation (pre-compiled, runs on every event) - for (const { name, field, validate } of sectionValidators) { - const value = (event as Record)[field]; - if (!validate(value)) { - logger.error(`${name} validation failed`, { - errors: ajv.errorsText(validate.errors), - }); - return false; - } - } - - // 3. Event validation (lazy compiled) - if (events && event.entity && event.action) { - const match = findEventSchema(event.entity, event.action); - - if (match) { - const validator = getEventValidator( - event.entity, - event.action, - match.schema, - ); - - if (!validator(event)) { - logger.error('Contract validation failed', { - rule: match.key, - errors: ajv.errorsText(validator.errors), - }); - return false; - } - - logger.debug('Contract validation passed', { rule: match.key }); - } - } - - return { event }; - }, - }; -}; diff --git a/packages/transformers/validator/src/types.ts b/packages/transformers/validator/src/types.ts deleted file mode 100644 index 8aff715b8..000000000 --- a/packages/transformers/validator/src/types.ts +++ /dev/null @@ -1,46 +0,0 @@ -import type { JSONSchemaType } from 'ajv'; - -/** - * Partial JSON Schema type - we auto-add type: 'object'. - */ -export type JsonSchema = Partial>; - -/** - * Contract event rules — entity → action → JSON Schema. - * The validator matches events by entity-action and validates - * against the corresponding schema. - */ -export type ContractEvents = Record>; - -/** - * Validator transformer settings. - */ -export interface ValidatorSettings { - /** - * Validate full WalkerOS.Event structure. - * @default true - */ - format?: boolean; - - /** - * Entity-action event validation schemas. - * Resolved from $contract.name.events. - * Supports wildcards via findEventSchema. - */ - events?: ContractEvents; - - /** JSON Schema for event.globals — validates on every event. */ - globals?: JsonSchema; - - /** JSON Schema for event.context — validates on every event. */ - context?: JsonSchema; - - /** JSON Schema for event.custom — validates on every event. */ - custom?: JsonSchema; - - /** JSON Schema for event.user — validates on every event. */ - user?: JsonSchema; - - /** JSON Schema for event.consent — validates on every event. */ - consent?: JsonSchema; -} diff --git a/packages/transformers/validator/tsup.config.ts b/packages/transformers/validator/tsup.config.ts deleted file mode 100644 index 482b31a7c..000000000 --- a/packages/transformers/validator/tsup.config.ts +++ /dev/null @@ -1,3 +0,0 @@ -import { defineConfig, buildModules, buildDev } from '@walkeros/config/tsup'; - -export default defineConfig([buildModules(), buildDev()]); diff --git a/packages/web/destinations/amplitude/package.json b/packages/web/destinations/amplitude/package.json index 5439adf3c..edec6520e 100644 --- a/packages/web/destinations/amplitude/package.json +++ b/packages/web/destinations/amplitude/package.json @@ -38,6 +38,7 @@ }, "dependencies": { "@amplitude/unified": "^1.0.16", + "@walkeros/core": "4.0.2", "@walkeros/web-core": "4.0.2" }, "devDependencies": { diff --git a/packages/web/destinations/api/package.json b/packages/web/destinations/api/package.json index 83ed52388..340f80254 100644 --- a/packages/web/destinations/api/package.json +++ b/packages/web/destinations/api/package.json @@ -37,6 +37,7 @@ "update": "npx npm-check-updates -u && npm update" }, "dependencies": { + "@walkeros/core": "4.0.2", "@walkeros/web-core": "4.0.2" }, "devDependencies": { diff --git a/packages/web/destinations/clarity/package.json b/packages/web/destinations/clarity/package.json index 9bd799b99..b388a9703 100644 --- a/packages/web/destinations/clarity/package.json +++ b/packages/web/destinations/clarity/package.json @@ -38,6 +38,7 @@ }, "dependencies": { "@microsoft/clarity": "^1.0.2", + "@walkeros/core": "4.0.2", "@walkeros/web-core": "4.0.2" }, "devDependencies": { diff --git a/packages/web/destinations/fullstory/package.json b/packages/web/destinations/fullstory/package.json index 7ae2ad1b3..58e397707 100644 --- a/packages/web/destinations/fullstory/package.json +++ b/packages/web/destinations/fullstory/package.json @@ -38,6 +38,7 @@ }, "dependencies": { "@fullstory/browser": "^2.0.8", + "@walkeros/core": "4.0.2", "@walkeros/web-core": "4.0.2" }, "devDependencies": { diff --git a/packages/web/destinations/gtag/package.json b/packages/web/destinations/gtag/package.json index c0bde50eb..9bd40c88c 100644 --- a/packages/web/destinations/gtag/package.json +++ b/packages/web/destinations/gtag/package.json @@ -37,6 +37,7 @@ "update": "npx npm-check-updates -u && npm update" }, "dependencies": { + "@walkeros/core": "4.0.2", "@walkeros/web-core": "4.0.2" }, "repository": { diff --git a/packages/web/destinations/heap/package.json b/packages/web/destinations/heap/package.json index 706885cd4..c80512dec 100644 --- a/packages/web/destinations/heap/package.json +++ b/packages/web/destinations/heap/package.json @@ -37,6 +37,7 @@ "update": "npx npm-check-updates -u && npm update" }, "dependencies": { + "@walkeros/core": "4.0.2", "@walkeros/web-core": "4.0.2" }, "devDependencies": { diff --git a/packages/web/destinations/hotjar/package.json b/packages/web/destinations/hotjar/package.json index ae533f78c..4402d5945 100644 --- a/packages/web/destinations/hotjar/package.json +++ b/packages/web/destinations/hotjar/package.json @@ -38,6 +38,7 @@ }, "dependencies": { "@hotjar/browser": "^1.0.9", + "@walkeros/core": "4.0.2", "@walkeros/web-core": "4.0.2" }, "devDependencies": { diff --git a/packages/web/destinations/linkedin/package.json b/packages/web/destinations/linkedin/package.json index 44ee4af42..5fe7a804a 100644 --- a/packages/web/destinations/linkedin/package.json +++ b/packages/web/destinations/linkedin/package.json @@ -37,6 +37,7 @@ "update": "npx npm-check-updates -u && npm update" }, "dependencies": { + "@walkeros/core": "4.0.2", "@walkeros/web-core": "4.0.2" }, "devDependencies": { diff --git a/packages/web/destinations/meta/package.json b/packages/web/destinations/meta/package.json index c1db53cf4..eca193eef 100644 --- a/packages/web/destinations/meta/package.json +++ b/packages/web/destinations/meta/package.json @@ -37,6 +37,7 @@ "update": "npx npm-check-updates -u && npm update" }, "dependencies": { + "@walkeros/core": "4.0.2", "@walkeros/web-core": "4.0.2" }, "devDependencies": { diff --git a/packages/web/destinations/mixpanel/package.json b/packages/web/destinations/mixpanel/package.json index 47a2c66a2..a3e8159c0 100644 --- a/packages/web/destinations/mixpanel/package.json +++ b/packages/web/destinations/mixpanel/package.json @@ -37,6 +37,7 @@ "update": "npx npm-check-updates -u && npm update" }, "dependencies": { + "@walkeros/core": "4.0.2", "mixpanel-browser": "^2.78.0", "@walkeros/web-core": "4.0.2" }, diff --git a/packages/web/destinations/optimizely/package.json b/packages/web/destinations/optimizely/package.json index 88b197ee8..649a94135 100644 --- a/packages/web/destinations/optimizely/package.json +++ b/packages/web/destinations/optimizely/package.json @@ -38,6 +38,7 @@ }, "dependencies": { "@optimizely/optimizely-sdk": "^6.0.0", + "@walkeros/core": "4.0.2", "@walkeros/web-core": "4.0.2" }, "devDependencies": { diff --git a/packages/web/destinations/pinterest/package.json b/packages/web/destinations/pinterest/package.json index 1c6e3f5c0..6522c6d01 100644 --- a/packages/web/destinations/pinterest/package.json +++ b/packages/web/destinations/pinterest/package.json @@ -37,6 +37,7 @@ "update": "npx npm-check-updates -u && npm update" }, "dependencies": { + "@walkeros/core": "4.0.2", "@walkeros/web-core": "4.0.2" }, "devDependencies": { diff --git a/packages/web/destinations/plausible/package.json b/packages/web/destinations/plausible/package.json index dfdccfbb5..606729fb0 100644 --- a/packages/web/destinations/plausible/package.json +++ b/packages/web/destinations/plausible/package.json @@ -37,6 +37,7 @@ "update": "npx npm-check-updates -u && npm update" }, "dependencies": { + "@walkeros/core": "4.0.2", "@walkeros/web-core": "4.0.2" }, "devDependencies": { diff --git a/packages/web/destinations/posthog/package.json b/packages/web/destinations/posthog/package.json index f90a48cc6..b67793c55 100644 --- a/packages/web/destinations/posthog/package.json +++ b/packages/web/destinations/posthog/package.json @@ -37,6 +37,7 @@ "update": "npx npm-check-updates -u && npm update" }, "dependencies": { + "@walkeros/core": "4.0.2", "posthog-js": "^1.367.0", "@walkeros/web-core": "4.0.2" }, diff --git a/packages/web/destinations/segment/package.json b/packages/web/destinations/segment/package.json index c23b40247..b6bc8d438 100644 --- a/packages/web/destinations/segment/package.json +++ b/packages/web/destinations/segment/package.json @@ -38,6 +38,7 @@ }, "dependencies": { "@segment/analytics-next": "^1.82.0", + "@walkeros/core": "4.0.2", "@walkeros/web-core": "4.0.2" }, "devDependencies": { diff --git a/packages/web/destinations/snowplow/package.json b/packages/web/destinations/snowplow/package.json index 50982703e..ca5094e46 100644 --- a/packages/web/destinations/snowplow/package.json +++ b/packages/web/destinations/snowplow/package.json @@ -37,6 +37,7 @@ "update": "npx npm-check-updates -u && npm update" }, "dependencies": { + "@walkeros/core": "4.0.2", "@walkeros/web-core": "4.0.2" }, "devDependencies": { diff --git a/packages/web/destinations/tiktok/package.json b/packages/web/destinations/tiktok/package.json index 726e0c4fb..777b0551f 100644 --- a/packages/web/destinations/tiktok/package.json +++ b/packages/web/destinations/tiktok/package.json @@ -37,6 +37,7 @@ "update": "npx npm-check-updates -u && npm update" }, "dependencies": { + "@walkeros/core": "4.0.2", "@walkeros/web-core": "4.0.2" }, "devDependencies": { diff --git a/packages/web/sources/browser/package.json b/packages/web/sources/browser/package.json index 8420a795c..95746bc41 100644 --- a/packages/web/sources/browser/package.json +++ b/packages/web/sources/browser/package.json @@ -33,6 +33,7 @@ }, "dependencies": { "@walkeros/collector": "4.0.2", + "@walkeros/core": "4.0.2", "@walkeros/web-core": "4.0.2" }, "repository": { diff --git a/packages/web/sources/demo/src/__tests__/index.test.ts b/packages/web/sources/demo/src/__tests__/index.test.ts index da450b9e5..1c89f5587 100644 --- a/packages/web/sources/demo/src/__tests__/index.test.ts +++ b/packages/web/sources/demo/src/__tests__/index.test.ts @@ -5,7 +5,12 @@ import { sourceDemo } from '../index'; describe('Demo Source', () => { beforeEach(() => { - jest.useFakeTimers(); + // `startFlow()` creates a default cache store whose TTL sweep runs on + // `setInterval`. Faking setInterval causes `runAllTimers()` to loop + // forever (the sweep self-reschedules every tick). The demo source + // only needs `setTimeout` faked for its event-delay mechanism, so + // leave setInterval on real timers. + jest.useFakeTimers({ doNotFake: ['setInterval'] }); }); afterEach(() => { diff --git a/skills/README.md b/skills/README.md index 767d9a8b2..bae278ce4 100644 --- a/skills/README.md +++ b/skills/README.md @@ -19,6 +19,8 @@ Tool-agnostic and accessible to Claude, Cursor, Copilot, and other AI tools. | [understanding-stores](./walkeros-understanding-stores/SKILL.md) | Store interface, $store. wiring, lifecycle | | [using-logger](./walkeros-using-logger/SKILL.md) | Logger access, DRY principles, API logging patterns | | [using-step-examples](./walkeros-using-step-examples/SKILL.md) | Step examples, Three Type Zones, in/out format | +| [using-store-cache](./walkeros-using-store-cache/SKILL.md) | Recipes for store-level cache, multi-tier composition | +| [using-transformer-ga4](./walkeros-using-transformer-ga4/SKILL.md) | Wire `@walkeros/transformer-ga4`, override mappings | ### Task Skills diff --git a/skills/walkeros-create-transformer/SKILL.md b/skills/walkeros-create-transformer/SKILL.md index 7d4c925de..a2e9abf7a 100644 --- a/skills/walkeros-create-transformer/SKILL.md +++ b/skills/walkeros-create-transformer/SKILL.md @@ -75,7 +75,7 @@ This skill includes reference files you can copy: ```bash # Reference implementation -ls packages/transformers/validator/ +ls packages/transformers/fingerprint/ # Transformer types cat packages/core/src/types/transformer.ts @@ -152,10 +152,10 @@ export * as examples from './examples'; ## Phase 3: Scaffold -**Template transformer:** `packages/transformers/validator/` +**Template transformer:** `packages/transformers/fingerprint/` ```bash -cp -r packages/transformers/validator packages/transformers/[name] +cp -r packages/transformers/fingerprint packages/transformers/[name] cd packages/transformers/[name] # Update package.json: name, description, repository.directory @@ -370,7 +370,7 @@ requirements (build, test, lint, no `any`): | What | Where | | -------------- | ---------------------------------------- | -| Template | `packages/transformers/validator/` | +| Template | `packages/transformers/fingerprint/` | | Types | `packages/core/src/types/transformer.ts` | | Chaining logic | `packages/collector/src/transformer.ts` | diff --git a/skills/walkeros-understanding-flow/SKILL.md b/skills/walkeros-understanding-flow/SKILL.md index 280897689..bc7e835cf 100644 --- a/skills/walkeros-understanding-flow/SKILL.md +++ b/skills/walkeros-understanding-flow/SKILL.md @@ -132,14 +132,16 @@ no `next`, no `before`; they sit alongside the pipeline rather than inside it. transformer, or destination starts, and outlive them on shutdown - **No chains** - stores don't participate in the event pipeline. Components access them through their `env`. -- Implementations: `@walkeros/store-memory` (sync, LRU), - `@walkeros/server-store-fs` (async, filesystem), `@walkeros/server-store-s3` - (async, S3-compatible) +- Implementations: `@walkeros/server-store-fs` (async, filesystem), + `@walkeros/server-store-s3` (async, S3-compatible), + `@walkeros/server-store-gcs`, `@walkeros/server-store-sheets`. The collector + ships a built-in in-memory cache tier — enable it on any store via + `Flow.Store.cache` instead of declaring a separate memory store. ```json { "stores": { - "data": { "package": "@walkeros/store-memory" } + "data": { "package": "@walkeros/server-store-fs" } }, "transformers": { "fingerprint": { @@ -163,6 +165,18 @@ for the full store interface and lifecycle. | Transformation | Mapping system | Raw push calls | | Delivery | Destinations | Sources, Collector | +## Step-Level Primitives + +Every step (source, transformer, destination) supports a small set of inline +primitives alongside its package wiring. `cache`, `mapping`, and `consent` are +the long-established ones; `validate?` is the newest. `validate:` declares +validation intent (format check, per-event JSON Schemas, or a single generic +schema) inline on a step, just like `cache` declares caching intent. It is a +declarative description: consumers (CLI tooling, MCP, custom runners) decide how +to enforce it. See +[Website: Validate](../../website/docs/getting-started/flow/validate.mdx) for +the full shape. + ## Transformer Chains Transformers run at two points in the pipeline, configured via `next` and @@ -179,16 +193,16 @@ Runs after source captures event, before collector processing: "sources": { "browser": { "package": "@walkeros/web-source-browser", - "next": "validate" + "next": "enrich" } }, "transformers": { - "validate": { - "package": "@walkeros/transformer-validator", - "next": "enrich" - }, "enrich": { - "package": "@walkeros/transformer-enricher" + "package": "@walkeros/transformer-enricher", + "next": "redact" + }, + "redact": { + "package": "@walkeros/transformer-redact" } } } @@ -200,16 +214,16 @@ Runs after source captures event, before collector processing: sources: { browser: { code: sourceBrowser, - next: 'validate' + next: 'enrich' } }, transformers: { - validate: { - code: transformerValidator, - config: { next: 'enrich' } - }, enrich: { - code: transformerEnrich + code: transformerEnrich, + config: { next: 'redact' } + }, + redact: { + code: transformerRedact } } ``` @@ -449,11 +463,12 @@ validating configurations, and rendering UI visualizations. - Multiple destinations can share the same transformer - No `before` = collector connects directly to destination -### Chain resolution algorithm (`walkChain`) +### Chain resolution algorithm (`getNextSteps`) See [packages/collector/src/transformer.ts](../../packages/collector/src/transformer.ts) -for the implementation. +for the implementation. `getNextSteps` is the public dispatch helper that +replaces the previous `walkChain` entry point. - **String start:** walks `transformer.next` links until chain ends - **Array start:** uses array as-is (explicit chain, no walking) @@ -462,21 +477,31 @@ for the implementation. - **Non-existent transformer ID:** chain ends (no error, event proceeds without transformation) -### Conditional routing (Route[]) +Note: `getNextSteps` is deterministic for the supplied event context. Static +analyzers without a real event can only enumerate reachability under "match may +pass or fail" speculation. + +### Conditional routing (`one` operator) -The `next` and `before` properties accept a `RouteSpec` -(`string | string[] | Route[]`). A `Route` is one `{ match, next }` rule, and -`Route[]` enables conditional routing evaluated against ingest data: +The `next` and `before` properties accept a `Route` +(`string | Route[] | RouteConfig`). A `RouteConfig` is a **disjoint union**: +each config sets at most one of `next` (gated link), `one` (first-match +dispatch), or `many` (all-match dispatch), never more than one. The `one` +operator enables conditional routing evaluated against ingest data and picks the +first entry whose `match` succeeds: ```json -"next": [ - { "match": { "key": "ingest.path", "operator": "prefix", "value": "/api" }, "next": "api-handler" }, - { "match": "*", "next": "default" } -] +"next": { + "one": [ + { "match": { "key": "ingest.path", "operator": "prefix", "value": "/api" }, "next": "api-handler" }, + { "next": "default" } + ] +} ``` -- Routes are evaluated in order - first match wins -- No match and no wildcard = event passes through unchanged +- `one` entries are evaluated in order, first match wins +- An entry without `match` always matches, use it as the fallback +- No matching entry means the event passes through unchanged - Works on all chain positions: `source.before`, `source.next`, `transformer.before`, `transformer.next`, `destination.before`, and `destination.next` @@ -484,6 +509,68 @@ The `next` and `before` properties accept a `RouteSpec` - See [packages/core/src/route.ts](../../packages/core/src/route.ts) for `compileNext()` and `resolveNext()` +### All-match dispatch (`many` operator) + +Use `many` when every matching entry should produce an independent parallel flow +(audit-while-process, multi-decoder fan-out). `many` terminates the main chain, +each branch runs to its own exit. Available only pre-collector. Post-collector +fan-out uses the destinations map. + +```jsonc +"next": { + "many": [ + { "match": { "key": "event.consent.analytics", "operator": "eq", "value": "granted" }, "next": "ga4-pipeline" }, + { "next": "audit-log" } + ] +} +``` + +### Paths and pass-through steps (code-less transformer entries) + +A **path** is the multi-step chain through a flow's `transformers` section. A +**pass-through step** (short: **pass**) is a single step inside a path that +declares no `code` and no `package`; the runtime synthesizes its push from the +operative fields the step does declare. + +Pass-through steps come in three variants: + +- **Chain-only:** only `before` and/or `next` set. A named hop that shares a + chain across multiple call sites (avoids duplicating arrays). +- **Cache-only:** only `cache` set. A dedup or short-circuit step. + `cache.stop: true` at a pre-collector position halts the pipeline. +- **Mapping-only:** only `mapping: Mapping.Config` set. A declarative + event-to-event transform that mutates the event in-flight. + +```json +{ + "transformers": { + "validateThenEnrich": { + "before": ["validate", "enrich"] + } + }, + "destinations": { + "gtag": { + "package": "@walkeros/web-destination-gtag", + "before": "validateThenEnrich" + }, + "meta": { + "package": "@walkeros/web-destination-meta", + "before": "validateThenEnrich" + } + } +} +``` + +Transformer step entries follow a **closed schema**: unknown top-level keys are +validation errors, and at least one operative field (`code` / `package` / +`before` / `next` / `cache` / `mapping`) must be set. + +See +[walkeros-understanding-transformers](../walkeros-understanding-transformers/SKILL.md) +for full depth on the three variants, the closed-schema rule, and the dual +semantic of `mapping` at the transformer position versus the destination +position. + ### Transformer sharing A single transformer can appear in both pre-chains (`source.next`) and diff --git a/skills/walkeros-understanding-mapping/SKILL.md b/skills/walkeros-understanding-mapping/SKILL.md index 5014d465c..292bc9a57 100644 --- a/skills/walkeros-understanding-mapping/SKILL.md +++ b/skills/walkeros-understanding-mapping/SKILL.md @@ -425,11 +425,72 @@ For full destination configuration examples (TypeScript + JSON), see --- +## Mapping at the Transformer Position + +`Mapping.Config` accepts the same shape at three positions in the flow, but the +semantic differs by position: + +| Position | What the mapping produces | +| ----------- | --------------------------------------------------------- | +| Source | A walkerOS event from raw input | +| Transformer | A mutated walkerOS event that continues through the chain | +| Destination | A vendor-shaped payload that the destination consumes | + +When a transformer step declares only a `mapping` (no `code`, no `package`), the +collector synthesizes a push that runs `processEventMapping` against each event. +Same keyword as the destination field, different semantic at this step position. +See +[walkeros-understanding-transformers](../walkeros-understanding-transformers/SKILL.md) +for the pass-through-step model. + +### Which fields apply at the transformer position + +Only **event-mutating** fields run; vendor-payload fields are no-ops with a +one-time init warning: + +| Field | Transformer position | +| ------------------------ | --------------------------------------------------------------------------------- | +| `policy` | Applies, pre-processes the event before rule matching | +| `include` | Applies, flattens event sections into mapping context | +| `mapping[].policy` | Applies, per-event policy | +| `mapping[].name` | Applies, **renames** the event (mutation is observable downstream) | +| `mapping[].ignore` | Applies, drops the event **from the chain entirely** (no downstream step sees it) | +| `mapping[].consent` | Applies, consent gate | +| `data`, `mapping[].data` | Ignored at this position (event mutation does not produce a vendor payload) | +| `mapping[].silent` | Ignored at this position (destination-only concept) | + +Note the `ignore: true` semantic shift: at a **destination** it skips delivery +to that destination only; at a **transformer step** it drops the event from the +chain so no downstream step (transformer or destination) sees it. + +```json +{ + "transformers": { + "redactPII": { + "mapping": { + "policy": { + "user.email": { "value": "[redacted]" } + }, + "mapping": { + "test": { + "*": { "ignore": true } + }, + "order": { + "complete": { "name": "purchase" } + } + } + } + } + } +} +``` + ## Where Mapping Lives | Location | Purpose | | ------------------------------------------ | ----------------------------------------- | | Source config | Transform raw input → walkerOS events | +| Transformer step config | Mutate walkerOS events in-flight | | Destination config | Transform walkerOS events → vendor format | | `packages/core/src/mapping.ts` | Core mapping functions | | `packages/core/src/types/mapping.ts` | Type definitions | @@ -443,6 +504,8 @@ For full destination configuration examples (TypeScript + JSON), see Event structure - [walkeros-understanding-destinations](../walkeros-understanding-destinations/SKILL.md) - Destination-side mapping +- [walkeros-understanding-transformers](../walkeros-understanding-transformers/SKILL.md) - + Transformer-position mapping and pass-through-step variants - [walkeros-mapping-configuration](../walkeros-mapping-configuration/SKILL.md) - Recipes and patterns diff --git a/skills/walkeros-understanding-stores/SKILL.md b/skills/walkeros-understanding-stores/SKILL.md index bd1f6ebeb..4195be8d6 100644 --- a/skills/walkeros-understanding-stores/SKILL.md +++ b/skills/walkeros-understanding-stores/SKILL.md @@ -102,8 +102,9 @@ Use `$store.storeId` in a component's `env` to inject a store instance: { "stores": { "data": { - "package": "@walkeros/store-memory", - "config": { "settings": { "maxSize": 10485760 } } + "package": "@walkeros/server-store-fs", + "config": { "settings": { "basePath": "./data" } }, + "cache": { "rules": [{ "ttl": 60 }] } } }, "transformers": { @@ -120,20 +121,24 @@ are caught at build time. `walkeros validate` also catches typos at validation time, including unknown store names and the colon-instead-of-dot mistake (e.g. `$store:data` is flagged with the suggested form `$store.data`). +The `cache` field enables the built-in in-memory cache tier (`__cache`) on top +of any backing store. No separate memory store declaration is needed. + ### Integrated mode (TypeScript) Pass store instances directly — no `$store.` prefix needed: ```typescript import { startFlow } from '@walkeros/collector'; -import { storeMemoryInit } from '@walkeros/store-memory'; +import { storeFsInit } from '@walkeros/server-store-fs'; import { transformerFingerprint } from '@walkeros/server-transformer-fingerprint'; const { collector } = await startFlow({ stores: { data: { - code: storeMemoryInit, - config: { settings: { maxSize: 10 * 1024 * 1024 } }, + code: storeFsInit, + config: { settings: { basePath: './data' } }, + cache: { rules: [{ ttl: 60 }] }, }, }, transformers: { @@ -150,27 +155,25 @@ than using the `$store.` string prefix (that's a bundler feature). ## Available stores -### `@walkeros/store-memory` (in-memory) +### Built-in cache tier (`__cache`) -LRU cache with TTL support. Suitable for caching, session state, deduplication. +The collector ships a built-in in-memory cache with LRU eviction, TTL, and +entry/byte caps. Enable it on any store by setting `Flow.Store.cache`. No +separate package import needed: -```typescript -import { storeMemoryInit } from '@walkeros/store-memory'; -// Or for direct programmatic usage (no Flow.Json context): -import { createMemoryStore } from '@walkeros/store-memory'; +```json +{ + "stores": { + "files": { + "package": "@walkeros/server-store-fs", + "cache": { "rules": [{ "ttl": 60 }] } + } + } +} ``` -**Settings:** - -| Setting | Type | Default | Purpose | -| ------------ | -------- | ------- | -------------------------- | -| `maxSize` | `number` | 10 MB | Maximum total size (bytes) | -| `maxEntries` | `number` | — | Maximum number of entries | - -**Two entry points:** - -- `storeMemoryInit` — `Store.Init` wrapper for Flow.Json / `startFlow()` -- `createMemoryStore()` — Direct factory for programmatic usage without context +Use this for the common "cache in front of a slow backing store" pattern (API, +GCS, Sheets, etc.). ### `@walkeros/server-store-fs` (filesystem) @@ -248,22 +251,18 @@ import { storeSheetsInit } from '@walkeros/server-store-sheets'; **Primary use case:** Demos and small prototypes where the spreadsheet is the operator-facing UI for tweaking lookup data. Quota: 60 reads/min and 60 -writes/min per project. Wire a fast cache (e.g., `@walkeros/store-memory`) in -front via the core `Cache` config on the consuming transformer or destination, -otherwise quota burns in seconds. **Not a production CRM substitute.** See +writes/min per project. Enable the built-in cache via `Flow.Store.cache` on the +store declaration to absorb the quota, otherwise quota burns in seconds. **Not a +production CRM substitute.** See [Website: Sheets Store](../../website/docs/stores/server/sheets.mdx) for the cache-wiring example. -## Stores vs direct construction +## Stores in flow config -| Approach | When to use | -| ------------------------------- | ------------------------------------------------------------------------------ | -| `stores` section in flow config | Shared store consumed by multiple components via `$store.` | -| Direct `createMemoryStore()` | Single component, self-contained (e.g., cache transformer's internal fallback) | - -If only one transformer uses the store internally and doesn't expose it, the -transformer can construct it directly. If multiple components need the same -store instance, declare it in `stores` and wire via `$store.`. +Declare any store consumed by one or more components in the `stores` section of +the flow config and wire it via `$store.` in component `env`. The built-in +cache tier (`Flow.Store.cache`) covers the "fast in-memory cache in front of a +slow backing store" pattern without a separate memory store. ## Accessing stores at runtime @@ -271,13 +270,15 @@ After `startFlow()`, stores are available on the collector instance: ```typescript const { collector } = await startFlow({ - stores: { cache: { code: storeMemoryInit } }, + stores: { + files: { code: storeFsInit, config: { settings: { basePath: './data' } } }, + }, }); // Read/write -collector.stores.cache.set('key', 'value', 60000); // 60s TTL -const value = collector.stores.cache.get('key'); -collector.stores.cache.delete('key'); +await collector.stores.files.set('key', 'value', 60000); // 60s TTL +const value = await collector.stores.files.get('key'); +await collector.stores.files.delete('key'); ``` ## Hooks @@ -299,7 +300,9 @@ Hooks fire on every store operation regardless of which component triggered it ```typescript const { collector } = await startFlow({ - stores: { cache: { code: storeMemoryInit } }, + stores: { + files: { code: storeFsInit, config: { settings: { basePath: './data' } } }, + }, }); // Intercept all store reads @@ -445,8 +448,6 @@ operator workflow. Store types - [packages/collector/src/store.ts](../../packages/collector/src/store.ts) - initStores implementation -- [packages/stores/memory/src/](../../packages/stores/memory/src/) - Memory - store package - [packages/server/stores/fs/src/](../../packages/server/stores/fs/src/) - Filesystem store package - [packages/server/stores/s3/src/](../../packages/server/stores/s3/src/) - S3 @@ -465,8 +466,6 @@ operator workflow. documentation - [Website: FS Store](../../website/docs/stores/server/fs.mdx) - Filesystem store documentation -- [Website: Memory Store](../../website/docs/stores/memory.mdx) - Memory store - documentation - [Website: GCS Store](../../website/docs/stores/server/gcs.mdx) - GCS store documentation - [Website: Sheets Store](../../website/docs/stores/server/sheets.mdx) - Google diff --git a/skills/walkeros-understanding-transformers/SKILL.md b/skills/walkeros-understanding-transformers/SKILL.md index 8bca18905..54a294ce4 100644 --- a/skills/walkeros-understanding-transformers/SKILL.md +++ b/skills/walkeros-understanding-transformers/SKILL.md @@ -161,10 +161,10 @@ bundler to parse the following string as executable JavaScript: "code": { "push": "$code:(event) => { event.data.processedAt = new Date().toISOString(); return { event }; }" }, - "next": "validate" + "next": "enrich" }, - "validate": { - "package": "@walkeros/transformer-validator" + "enrich": { + "package": "@walkeros/transformer-enricher" } } } @@ -211,8 +211,8 @@ Transformers link together via `next`: ```typescript transformers: { - validate: { - code: transformerValidator, + fingerprint: { + code: transformerFingerprint, config: { next: 'enrich' } // Chain to next transformer }, enrich: { @@ -240,24 +240,165 @@ push(event, context) { } ``` -Conditional routing is built into `next`/`before` properties using `Route[]` — -no separate router transformer needed: +Conditional routing is built into `next`/`before` properties using the `one` +operator, no separate router transformer needed: + +```json +"next": { + "one": [ + { "match": { "key": "ingest.path", "operator": "prefix", "value": "/api" }, "next": "api-handler" }, + { "next": "default" } + ] +} +``` + +`one` entries are evaluated in order, first match wins. A `RouteConfig` is a +disjoint union: each config sets at most one of `next` (gated link), `one` +(first-match dispatch), or `many` (all-match dispatch), never more than one. An +entry with no `match` always matches (use it as a fallback). If no entry +matches, the event passes through unchanged. Use `many` (pre-collector only) +when every matching branch should run in parallel, terminating the main chain: + +```json +"next": { + "many": [ + { "match": { "key": "event.consent.analytics", "operator": "eq", "value": "granted" }, "next": "ga4-pipeline" }, + { "next": "audit-log" } + ] +} +``` + +### Paths and pass-through steps + +walkerOS uses two vocabulary terms for chain composition: + +- **Path:** the multi-step chain that an event walks through a flow's + `transformers` section. +- **Pass-through step** (short: **pass**): a single step inside a path that + declares no `code` and no `package`. The runtime synthesizes the push, so the + step contributes structure without shipping executable code. + +A pass-through step ships in three variants. Each variant uses a different +operative field; combine them on the same step when it helps. + +#### Variant 1: chain-only (before / next) + +A named hop that shares a chain across multiple call sites. Use it to avoid +duplicating arrays in `before` / `next` references: + +```json +{ + "transformers": { + "validateThenEnrich": { + "before": ["validate", "enrich"] + } + }, + "destinations": { + "gtag": { + "package": "@walkeros/web-destination-gtag", + "before": "validateThenEnrich" + }, + "meta": { + "package": "@walkeros/web-destination-meta", + "before": "validateThenEnrich" + } + } +} +``` + +#### Variant 2: cache-only + +A step that declares only a `cache` block. Useful for deduplication or +short-circuit halts. `cache.stop: true` at a pre-collector position halts the +pipeline (not just the local chain): + +```json +{ + "transformers": { + "dedup": { + "cache": { + "stop": true, + "rules": [{ "key": ["event.id"], "ttl": 60 }] + } + } + } +} +``` + +#### Variant 3: mapping-only + +A step that declares only a `mapping: Mapping.Config`. The runtime synthesizes a +push that calls `processEventMapping` and mutates the event in-flight: ```json -"next": [ - { "match": { "key": "ingest.path", "operator": "prefix", "value": "/api" }, "next": "api-handler" }, - { "match": "*", "next": "default" } -] +{ + "transformers": { + "redactPII": { + "mapping": { + "policy": { + "user.email": { "value": "[redacted]" } + } + } + } + } +} ``` -Routes are evaluated in order — first match wins. If no route matches and -there's no wildcard, the event passes through unchanged. +See [walkeros-understanding-mapping](../walkeros-understanding-mapping/SKILL.md) +for the mapping primitives (`policy`, `data`, `mapping[].name`, etc.) and the +"Mapping at the transformer position" section for the dual semantic. + +### Mapping at transformer position vs destination position + +`mapping` is the same field shape (`Mapping.Config`) in both positions, but the +semantic is disambiguated by where the step sits: + +| Position | What `mapping` produces | +| ----------- | --------------------------------------------------------- | +| Destination | A vendor-shaped payload (the destination consumes `data`) | +| Transformer | A mutated event that continues through the chain | + +At the transformer position, only event-mutating fields apply: `policy`, +`mapping[].policy`, `mapping[].name`, `mapping[].ignore`, `mapping[].consent`, +and `include`. Vendor-payload fields (`data`, `mapping[].data`, `silent`) are +ignored with a one-time init warning. `mapping[].ignore: true` drops the event +from the chain (not "skip this destination", which is the destination-position +semantic). + +### Closed schema (unknown keys are errors) + +Transformer step entries follow a **closed schema**. Known keys only: `code`, +`package`, `config`, `before`, `next`, `cache`, `mapping`. Unknown keys at the +top of a step are validation errors. This catches misrouted keys (e.g. +`{ rules: [], stop: true }` placed at the top of a step instead of nested under +`cache:`) at validate time instead of letting them silently pass through at +runtime. + +A step must declare at least one operative field. An empty `{}` is rejected with +`EMPTY_TRANSFORMER`. Declaring both `code` and `package` on the same step is +rejected with `CONFLICT`. ### Chain resolution safety -`walkChain()` uses a visited set to detect circular references. If a cycle is -found, the loop is silently broken and the chain ends. If `next` points to a -non-existent transformer, the chain also ends without error. +`getNextSteps()` (the public dispatch helper, previously `walkChain`) uses a +visited set to detect circular references. If a cycle is found, the loop is +silently broken and the chain ends. If `next` points to a non-existent +transformer, the chain also ends without error. Note: `getNextSteps` is +deterministic for the supplied event context. Static analyzers without a real +event can only enumerate reachability under "match may pass or fail" +speculation. + +### Composition principle + +A transformer owns its own chain. When a chain references a transformer by name, +that transformer's own `before` chain runs before its push, and its `next` chain +after, both are walked recursively, with cycle detection. Cache halt signals +(`cache.stop: true`) at pre-collector positions propagate pipeline-wide; +destinations do not see the dropped event. The grammar's recursive `Route` shape +(`string | Route[] | RouteConfig`) compiles element-by-element, so sequences can +mix transformer IDs and inline `one` / `many` / `next` routes +(`next: ["dedup", { one: [...] }]` is valid). This is the model to default to +when adding new chain primitives. See [walkeros-understanding-flow](../walkeros-understanding-flow/SKILL.md) for the full connection rules between sources, transformers, and destinations. @@ -300,10 +441,9 @@ respond function is optional — only present when the source provides one. ## Transformer Paths -| Path | Description | -| ---------------------------------- | --------------------- | -| `packages/transformers/` | Transformer packages | -| `packages/transformers/validator/` | Validator transformer | +| Path | Description | +| ------------------------ | -------------------- | +| `packages/transformers/` | Transformer packages | ## Related Skills @@ -317,15 +457,8 @@ respond function is optional — only present when the source provides one. - [packages/core/src/types/transformer.ts](../../packages/core/src/types/transformer.ts) - Interface -**Package READMEs:** - -- [packages/transformers/validator/README.md](../../packages/transformers/validator/README.md) - - Validator transformer - **Documentation:** - [Website: Transformers](../../website/docs/transformers/index.mdx) - Overview -- [Website: Validator](../../website/docs/transformers/validator.mdx) - - Validator docs - [Website: Create Your Own](../../website/docs/transformers/create-your-own.mdx) - Guide diff --git a/skills/walkeros-using-cli/flow-configuration.md b/skills/walkeros-using-cli/flow-configuration.md index d5711713e..44384d327 100644 --- a/skills/walkeros-using-cli/flow-configuration.md +++ b/skills/walkeros-using-cli/flow-configuration.md @@ -192,26 +192,52 @@ globs both work, resolved against the install root (where pacote put files): ### Destination Properties -| Property | Type | Description | -| --------- | ------------------------------- | --------------------------------------------------------------------- | -| `package` | `string` | NPM package or local package name | -| `config` | `object` | Destination-specific configuration | -| `mapping` | `object` | Event transformation rules | -| `consent` | `object` | Required consent levels | -| `before` | `string \| string[] \| Route[]` | First transformer in post-collector chain (conditional via `Route[]`) | - -**Route shape** (used wherever the type column shows `Route[]`): +| Property | Type | Description | +| --------- | ---------------------------------- | ----------------------------------------------------------------- | +| `package` | `string` | NPM package or local package name | +| `config` | `object` | Destination-specific configuration | +| `mapping` | `object` | Event transformation rules | +| `consent` | `object` | Required consent levels | +| `before` | `string \| Route[] \| RouteConfig` | First transformer in post-collector chain (conditional via `one`) | + +**Route shape** (used wherever the type column shows `Route[]` or +`RouteConfig`). A `RouteConfig` is a **disjoint union**: set at most one of +`next` (gated link), `one` (first-match dispatch), or `many` (all-match +dispatch), never more than one: ```json -{ - "match": "*" | { "key": "", "operator": "eq|contains|prefix|suffix|regex|gt|lt|exists", "value": "" }, - "next": "" | ["", ""] +// Sequence form (chained, no dispatch): +"before": ["validate", "enrich"] + +// Gated link: +"before": { + "match": { "key": "ingest.path", "operator": "prefix", "value": "/api" }, + "next": "api-handler" +} + +// First-match dispatch (one): +"before": { + "one": [ + { "match": { "key": "ingest.method", "operator": "eq", "value": "POST" }, "next": "post-chain" }, + { "next": "default" } + ] +} + +// All-match dispatch (many, pre-collector only): +"next": { + "many": [ + { "match": { "key": "event.consent.analytics", "operator": "eq", "value": "granted" }, "next": "ga4-pipeline" }, + { "next": "audit-log" } + ] } ``` -Routes evaluate in order, first match wins. `"*"` is the wildcard. The match -object reads from ingest metadata (e.g. `ingest.path`, `ingest.method`). No -match plus no wildcard means the event passes through unchanged. +`one` entries evaluate in order, first match wins. An entry with no `match` +always matches (use it as a fallback). The match object reads from ingest +metadata (e.g. `ingest.path`, `ingest.method`). No matching entry means the +event passes through unchanged. `many` runs every matching branch in parallel +and terminates the main chain, useful for audit-while-process patterns +pre-collector. For mapping syntax, see [walkeros-understanding-mapping](../walkeros-understanding-mapping/SKILL.md). @@ -236,13 +262,13 @@ For mapping syntax, see ### Source Properties -| Property | Type | Description | -| --------- | ------------------------------- | -------------------------------------------------------------------- | -| `package` | `string` | Source package name | -| `config` | `object` | Source-specific configuration | -| `next` | `string \| string[] \| Route[]` | First transformer in pre-collector chain (conditional via `Route[]`) | +| Property | Type | Description | +| --------- | ---------------------------------- | ---------------------------------------------------------------- | +| `package` | `string` | Source package name | +| `config` | `object` | Source-specific configuration | +| `next` | `string \| Route[] \| RouteConfig` | First transformer in pre-collector chain (conditional via `one`) | -`Route[]` shape: see [Destination Properties](#destination-properties) above. +`Route` shape: see [Destination Properties](#destination-properties) above. --- @@ -251,8 +277,8 @@ For mapping syntax, see ```json { "transformers": { - "validate": { - "package": "@walkeros/transformer-validate", + "fingerprint": { + "package": "@walkeros/transformer-fingerprint", "config": {}, "next": "enrich" }, @@ -266,14 +292,40 @@ For mapping syntax, see ### Transformer Properties -| Property | Type | Description | -| --------- | ------------------------------- | --------------------------------------------------------- | -| `package` | `string` | Transformer package name | -| `config` | `object` | Transformer-specific configuration | -| `code` | `object` | Inline code (`push`, `init`) with `$code:` | -| `next` | `string \| string[] \| Route[]` | Next transformer in the chain (conditional via `Route[]`) | - -`Route[]` shape: see [Destination Properties](#destination-properties) above. +| Property | Type | Description | +| --------- | ---------------------------------- | --------------------------------------------------------------------------------------------- | +| `package` | `string` | Transformer package name | +| `config` | `object` | Transformer-specific configuration | +| `code` | `object` | Inline code (`push`, `init`) with `$code:` | +| `before` | `string \| Route[] \| RouteConfig` | First transformer to run before this step's push (conditional via `one`) | +| `next` | `string \| Route[] \| RouteConfig` | Next transformer in the chain (conditional via `one`) | +| `cache` | `object` | Cache config (dedup, halt). `cache.stop: true` halts the pipeline at pre-collector positions. | +| `mapping` | `Mapping.Config` | Event-to-event mapping (same shape as `Destination.mapping`, different position semantic) | + +`Route` shape: see [Destination Properties](#destination-properties) above. + +A transformer entry with no `code` and no `package` is a **pass-through step** +(short: **pass**): a single step within a path that the runtime synthesizes from +its operative fields. Three variants ship: + +- **Chain-only:** only `before` / `next` set. A named hop that shares a chain + across multiple call sites. +- **Cache-only:** only `cache` set. Dedup or pipeline halt. +- **Mapping-only:** only `mapping` set. Declarative event-to-event mutation. + +`mapping` here uses the same `Mapping.Config` shape as on a destination, but the +position semantic differs: on a destination it produces a vendor payload; on a +transformer step it mutates the event itself. Only event-mutating fields apply +(`policy`, `mapping[].policy`, `mapping[].name`, `mapping[].ignore`, +`mapping[].consent`, `include`); vendor-payload fields (`data`, +`mapping[].data`, `silent`) are ignored at this position with a one-time init +warning. See +[walkeros-understanding-mapping](../walkeros-understanding-mapping/SKILL.md) for +full mapping syntax. + +Transformer step entries follow a **closed schema**: unknown top-level keys are +validation errors, and a step must declare at least one of `code`, `package`, +`before`, `next`, `cache`, or `mapping`. ### Transformer Chaining diff --git a/skills/walkeros-using-store-cache/SKILL.md b/skills/walkeros-using-store-cache/SKILL.md new file mode 100644 index 000000000..21873ecb4 --- /dev/null +++ b/skills/walkeros-using-store-cache/SKILL.md @@ -0,0 +1,317 @@ +--- +name: walkeros-using-store-cache +description: + Use when adding read-through caching to a walkerOS store, memoizing a slow + API/Sheets backing, composing multi-tier cache chains, or deduplicating + concurrent store reads. Covers recipes, TTL choice, error policy, and + observability counters. +--- + +# Using store-level cache + +## Overview + +`Flow.Store.cache` wraps any store with a read-through, write-through cache +tier. Reads check the cache first, fall through to the backing on miss, and +populate every tier on the unwind. Writes go to the backing first, then to the +cache best-effort. + +The wrapping is transparent: a transformer wired to `$store.crm` does not know +whether reads hit a memory cache, a Redis tier, or the underlying API. + +**Core principle:** the cache is advisory. Backing is the source of truth. +Failed cache operations degrade performance, never correctness. + +## When to use this skill + +- A transformer reads the same key many times across events (sessions, user + lookups, product catalog enrichment) +- A store has rate limits or slow HTTP round-trips (Sheets, custom API, S3 + metadata) +- You need to deduplicate concurrent reads on a cold key (thundering herd) +- You want to compose multi-tier caches (memory → Redis → API) +- You're migrating off `@walkeros/store-memory` (removed in favor of the + built-in tier) + +## Minimal recipe: cache a Sheets store + +The talk-demo use case. A `sessions` lookup runs on every event but most events +in a session share the same key. + +```json +{ + "stores": { + "sessions": { + "package": "@walkeros/server-store-sheets", + "config": { + "settings": { + "id": "1AbC...", + "sheet": "Sessions", + "credentials": "$var.sheetsCredentials" + } + }, + "cache": { "rules": [{ "ttl": 300 }] } + } + }, + "transformers": { + "enrich": { + "package": "@walkeros/transformer-enrich", + "env": { "store": "$store.sessions" } + } + } +} +``` + +The first lookup hits Sheets and populates the built-in in-memory tier with a +300-second TTL. The next 300 seconds of identical reads hit memory and skip the +Sheets API. + +Without the cache: 60 events in 60 seconds = 60 Sheets reads = quota tripped (60 +req/min limit) in one minute. With the cache: 60 events in 60 seconds = 1 Sheets +read. + +## Recipe: memoize a slow API store + +Same shape, longer TTL because the API is the cold backing: + +```json +{ + "stores": { + "users": { + "package": "@walkeros/server-store-api", + "config": { "settings": { "endpoint": "$env.USER_API_URL" } }, + "cache": { "rules": [{ "ttl": 3600 }] } + } + } +} +``` + +One-hour TTL is reasonable when user records change rarely. Use `flow_validate` +to verify the config; use `flow_simulate` with a representative event to confirm +the cache hit rate. + +## Recipe: TTL by key prefix + +Different keys can have different TTLs. Rules evaluate top-down, first match +wins. The match context is `{ key, value? }`, not event data: + +```json +"cache": { + "rules": [ + { "match": { "key": "key", "operator": "prefix", "value": "session:" }, "ttl": 300 }, + { "match": { "key": "key", "operator": "prefix", "value": "user:" }, "ttl": 3600 }, + { "ttl": 60 } + ] +} +``` + +- `session:*` keys cache for 5 minutes +- `user:*` keys cache for 1 hour +- Everything else caches for 1 minute + +A rule without `match` always matches. Place it last as a fallback. + +## Recipe: multi-tier composition (memory → Redis → API) + +When the working set exceeds the memory tier's capacity, add a Redis layer +between memory and the cold backing. The consumer still wires to `$store.api`; +the tiers resolve automatically. + +```json +{ + "stores": { + "redis": { + "package": "@walkeros/server-store-redis", + "config": { "settings": { "url": "$env.REDIS_URL" } }, + "cache": { "rules": [{ "ttl": 300 }] } + }, + "api": { + "package": "@walkeros/server-store-api", + "config": { "settings": { "endpoint": "$env.API_URL" } }, + "cache": { + "store": "redis", + "rules": [{ "ttl": 86400 }] + } + } + }, + "transformers": { + "enrich": { + "env": { "store": "$store.api" } + } + } +} +``` + +Lookup chain on `api.get(K)`: + +1. `api`'s tier (Redis) — HIT, return. +2. On Redis MISS, the Redis wrapper checks its own tier (memory `__cache`). If + memory HIT, return up and Redis populates. +3. On all MISS, call the underlying API. Each traversed tier populates on the + unwind. + +TTL ordering: shortest at the top (memory 300s), longest at the cold end (API +86400s). The bound on staleness is the longest TTL in the chain. + +## Recipe: prevent thundering herd on a cold key + +Single-flight deduplication is on by default. 50 concurrent +`store.get('session:abc')` calls on a cold cache produce **one** backing call, +not 50. All callers receive the same promise. + +This is what makes store-level cache useful on a slow backing under high +concurrency. No configuration needed; just set `cache` on the store. + +Verify it works with the `inflight_dedups` counter (see Observability below). + +## What `cache` rules cannot do (compared to event cache) + +Store rules are a stricter subset: + +- **No `key` field.** The cache key comes from the caller (`store.get(K)`); + there is no event path to compose. +- **No `update` field.** Stores have no event to mutate on hit. +- **No `stop` field.** Stores always fall through on miss; halting the pipeline + is an event-cache concept. +- **Empty `namespace: ""` is rejected** by the schema (re-introduces the + collision footgun across stores sharing `__cache`). + +Use the [event-level Cache](../../website/docs/transformers/cache.mdx) on +sources, transformers, or destinations when you need `key`, `update`, or `stop`. + +## Default tier: built-in `__cache` + +Omitting `cache.store` falls back to the collector's built-in `__cache`. It is +an in-memory LRU map with: + +- `maxEntries: 10000` (fixed in v1) +- LRU access ordering on reads +- Batched eviction down to 80% on overflow +- Active TTL sweep every 60 seconds + +Each wrapped store gets an automatic namespace prefix (the store id) so multiple +stores sharing `__cache` do not collide. Override with `cache.namespace: "myns"` +if you want explicit control. + +The collector logs one line per wrapped store at startup: + +``` +store "sessions" caches with namespace "sessions:" via __cache +``` + +## Write-through error policy + +`wrapped.set(K, V)` runs two steps: + +1. **Backing first.** Await `backing.set(K, V)`. If this throws, the wrapper + throws. The cache is not touched. +2. **Cache best-effort.** If the backing succeeded, attempt to populate the + cache. If this throws, log a warning and return success. + +`wrapped.delete(K)` follows the same shape. A failed cache delete leaves a +poisoned entry that serves stale data until TTL; the warning lets operators +react. + +Backing is the source of truth. Code that wraps `set` / `delete` should assume +the cache may be lagging. + +## Coherence model + +Read this before relying on the cache for anything correctness-sensitive: + +- **Read-your-writes (in-process):** yes. After `wrapped.set(K, V)`, a + subsequent `wrapped.get(K)` in the same process returns `V`. +- **Cross-process consistency:** eventual, bounded by the longest TTL in the + chain. No invalidation channel. +- **Tier-skipping repopulation:** a MISS in tier N that HITs in tier N+1 + repopulates tier N. Subsequent reads hit tier N. + +Pick TTLs accordingly. Short TTLs (1-60s) for mostly-static lookups behind a +fast backing; long TTLs (minutes-hours) for cold, expensive lookups where +staleness is tolerable. + +## Observability + +Each wrapped store exposes counters. Per-store telemetry keys: +`walkeros.store_cache..`. + +| Counter | Use this to detect | +| ------------------- | ----------------------------------- | +| `hits` | Cache is actually working | +| `misses` | Working-set size, cold start | +| `populates` | New keys being added to cache | +| `writes` | Set call volume | +| `deletes` | Delete call volume | +| `evictions_entries` | `maxEntries` cap being hit | +| `evictions_ttl` | TTL sweeper finding expired entries | +| `inflight_dedups` | Concurrent reads on a cold key | + +For interactive debugging at runtime: + +```typescript +const { collector } = await startFlow({ + /* ... */ +}); +const snapshot = collector.stores.sessions.counters; +console.log(snapshot); +// { hits: 412, misses: 18, populates: 18, writes: 0, deletes: 0, +// evictions_entries: 0, evictions_ttl: 0, inflight_dedups: 7 } +``` + +Healthy cache: `hits / (hits + misses)` rises over time. `inflight_dedups` +proves the herd prevention worked. + +## Known limitations + +- **No negative caching.** A `get(K)` that returns `undefined` from the backing + is not populated. Every subsequent call for a missing key re-hits the backing + until the value exists. Workaround: write a sentinel value on the first miss + and treat it as "not present" in transformer logic. +- **No cross-process invalidation.** Writes from one process do not invalidate + caches in other processes. TTL is the only mechanism. +- **Cycles are rejected at startup.** `A.cache.store = B` and + `B.cache.store = A` throws during init. The collector logs the cycle path + before exiting. +- **Renaming a store is a breaking change** to anything caching through it + (`cache.store: "X"` references break). Migrate explicitly. + +## Migration from `@walkeros/store-memory` + +The dedicated `@walkeros/store-memory` package was deleted once the built-in +`__cache` reached feature parity. One-line migration per occurrence: + +- If used **only** as a cache target (`cache.store: "memory"`): drop the store + declaration and omit `cache.store`. The wrapper falls back to `__cache` + automatically. +- If wired into a component's `env` for non-cache use: replace with a small + inline `Map` inside the component, or use one of the persistent stores + (`@walkeros/server-store-fs`, `-s3`, `-gcs`, `-sheets`). + +`flow_validate` rejects `package: "@walkeros/store-memory"` and points at the +replacement. + +## Related skills + +- [walkeros-understanding-stores](../walkeros-understanding-stores/SKILL.md) - + Store interface, `$store.` wiring, lifecycle +- [walkeros-understanding-flow](../walkeros-understanding-flow/SKILL.md) - + Architecture, stores as passive infrastructure +- [walkeros-using-cli](../walkeros-using-cli/SKILL.md) - Bundling and simulating + flows with stores + +**Documentation:** + +- [Website: Store-level cache](../../website/docs/stores/cache.mdx) - Full + reference for `Flow.Store.cache` +- [Website: Stores](../../website/docs/stores/index.mdx) - Stores overview +- [Website: Transformers Cache](../../website/docs/transformers/cache.mdx) - + Event-level cache (separate concept) + +**Source files:** + +- [packages/core/src/types/cache.ts](../../packages/core/src/types/cache.ts) - + `Cache`, `StoreCacheRule`, `EventCacheRule` types +- [packages/collector/src/store-cache-wrapper.ts](../../packages/collector/src/store-cache-wrapper.ts) - + Wrapper implementation +- [packages/collector/src/store.ts](../../packages/collector/src/store.ts) - + Two-phase store init diff --git a/skills/walkeros-using-transformer-ga4/SKILL.md b/skills/walkeros-using-transformer-ga4/SKILL.md new file mode 100644 index 000000000..fff876052 --- /dev/null +++ b/skills/walkeros-using-transformer-ga4/SKILL.md @@ -0,0 +1,235 @@ +--- +name: walkeros-using-transformer-ga4 +description: + Use when wiring `@walkeros/transformer-ga4` into a server flow, overriding + default GA4 event mappings, dropping events, adding custom event keys, or + troubleshooting GA4 Measurement Protocol decoding. Covers the `before`-chain + wiring contract, configuration recipes, and v1 limitations. +--- + +# Using `@walkeros/transformer-ga4` + +## Overview + +`@walkeros/transformer-ga4` decodes Google Analytics 4 Measurement Protocol v2 +hits (`/g/collect`, `/mp/collect`) into walkerOS events. It sits in a server +source's `before` chain, reads the raw HTTP request via `ctx.ingest`, and +returns one walkerOS event per GA4 event in the hit (one hit can carry many +events). + +This is the v1 release at `0.1.0`. Boundaries are explicit: server-side decoding +via `source-express`, GA4 v2 only, replace-not-merge mapping semantics, `G-` +tids only by default. + +## When to use this skill + +- You are wiring `transformer-ga4` into a server flow for the first time +- You want to override one of the 33 default GA4 mappings +- You need to drop a GA4 event (auto-fired noise like `user_engagement`) +- You want to add a custom event key for a `gtag('event', '', ...)` call +- You need to widen `tidPattern` to accept Ads (`AW-`) or DC (`DC-`) traffic +- Events are not arriving and you suspect the decoder is silently dropping them + +## Quickstart wiring + +```json +{ + "version": 4, + "flows": { + "default": { + "config": { "platform": "server" }, + "sources": { + "http": { + "package": "@walkeros/server-source-express", + "config": { + "ingest": { + "url": "req.url", + "body": "req.body" + } + }, + "before": "ga4" + } + }, + "transformers": { + "ga4": { "package": "@walkeros/transformer-ga4" } + }, + "destinations": { + "log": { "package": "@walkeros/destination-demo" } + } + } + } +} +``` + +**Wiring rules:** + +- `transformer-ga4` belongs in `source.before`, not `destination.before`. + Decoding is a pre-collector concern: GA4 hits are not yet walkerOS events. +- The source must populate `ctx.ingest.url` (required, string) and + `ctx.ingest.body` (optional, string). Raw text body only — pre-parsed JSON + will not decode. +- One HTTP request can fan out to N walkerOS events. This requires the collector + fan-out fix (shipped in this release). + +## Configuration recipes + +### Override one field in a default mapping + +User config **replaces** the matching default rule. Copy any fields you want to +keep: + +```json +"transformers": { + "ga4": { + "package": "@walkeros/transformer-ga4", + "config": { + "settings": { + "mapping": { + "purchase": { + "name": "order complete", + "data": { + "map": { + "id": "params.ep.transaction_id", + "total": "params.epn.value", + "currency": "params.ep.currency", + "coupon": "params.ep.promo_code" + } + } + } + } + } + } + } +} +``` + +There is no additive per-field merge in v1. Replace the full rule, or leave it +alone. + +### Drop an event + +Set `ignore: true` on any key. This is how `user_engagement`, `session_start`, +and `first_visit` are silenced by default: + +```json +"settings": { + "mapping": { + "click": { "ignore": true } + } +} +``` + +### Add a custom event mapping + +For events fired via `gtag('event', '', ...)`: + +```json +"settings": { + "mapping": { + "newsletter_subscribe": { + "name": "newsletter signup", + "data": { + "map": { "source": "params.ep.source" } + } + } + } +} +``` + +Unknown event names fall through to the `'*'` key, which by default emits +`ga4 track` with `data.event_name` set to the original `en`. Override `'*'` to +change the global fallback rule. + +### Set a custom `tidPattern` + +By default only `G-` tids are accepted. Widen via a string regex (compiled at +init): + +```json +"settings": { + "tidPattern": "^(G|AW|DC)-" +} +``` + +### Custom destination after decode + +The transformer returns walkerOS events with `entity action` names. Anything +downstream of the collector treats them as native events — no GA4 awareness +needed: + +```json +"destinations": { + "bq": { + "package": "@walkeros/server-destination-bigquery", + "config": { + "settings": { + "project": "my-eu-project", + "dataset": "events", + "location": "EU" + } + } + } +} +``` + +## Mapping path syntax + +Mappings reference fields on the decoded `GA4Hit` shape via dotted paths: + +| Path | Meaning | +| -------------- | --------------------------------------------------------- | +| `params.ep.X` | Event parameter (string), e.g. `params.ep.transaction_id` | +| `params.epn.X` | Event parameter (numeric), e.g. `params.epn.value` | +| `params.up.X` | User property (string) | +| `params.upn.X` | User property (numeric) | +| `items[0].X` | First item in the items array | +| `items` | Full items array (mapped to `nested` via item rules) | + +Use `params.ep.X` not `ep.X`. The decoder materializes the prefixed keys under +the `params` namespace. + +## Troubleshooting + +### No events arriving + +1. Check that `source.config.ingest` populates `url` (required, string) and + `body` (optional, string). Express source typically uses `req.url` + + `req.body`. +2. Confirm `before: "ga4"` is set on the source, not on a destination. +3. Check the `tidPattern`: by default `^G-` blocks `AW-` / `DC-` traffic + silently. +4. Confirm the request really is Measurement Protocol v2. v1 hits will not + decode. + +### Wrong field in the output event + +1. Check the path syntax: `params.ep.X`, not `ep.X`. +2. Verify the GA4 hit actually carries the parameter. Use a debug destination to + log the decoded `params` object. +3. Remember replace semantics: if you override an event, your `data.map` is the + entire rule. Missing fields stay missing. + +### Batched POST drops events after the first + +This was a pre-`0.1.0` bug in `@walkeros/collector`. The fix preserves fan-out +in `source.before` chains. Confirm both packages are on the same release wave +(transformer-ga4 `0.1.0` + collector minor bump). + +### `gcs` consent not applied + +v1 decodes basic `gcs` (`G1XX` → `marketing` / `analytics` booleans) only. +Functional/preferences flags and the newer `gcd` parameter are not decoded. +Override the consent path manually if you need richer mapping. + +## Limitations of v1 + +- **Replace semantics only.** No per-field additive merge inside `data.map`. +- **GA4 v2 only.** v1 Measurement Protocol is out of scope. +- **`G-` tids only by default.** Override `tidPattern` for Ads/DC. +- **Basic `gcs` only.** No `gcd`, no functional/preferences flags. +- **Raw text body required.** Pre-parsed JSON bodies will not decode. +- **Server-side only.** Web ingest via interception sources is roadmap, not v1. + +See the [website docs](https://www.walkeros.io/docs/transformers/ga4) for the +authoritative reference and the +[README](../../packages/transformers/ga4/README.md) for the in-repo summary. diff --git a/website/docs/contract.mdx b/website/docs/contract.mdx deleted file mode 100644 index 90cce5ad9..000000000 --- a/website/docs/contract.mdx +++ /dev/null @@ -1,555 +0,0 @@ ---- -title: Contract -description: Named data contracts with inheritance for event validation -sidebar_position: 5 ---- - -# Contract - -A contract defines what your events should look like: which fields are required, -what types they have, and what values are allowed. Contracts are named entries -with optional inheritance via `extends`. - -```json -{ - "contract": { - "default": { - "tagging": 1, - "globals": { "required": ["country"] }, - "events": { - "product": { - "*": { "properties": { "data": { "required": ["id", "name"] } } }, - "add": { "properties": { "data": { "required": ["quantity"] } } } - } - } - }, - "web": { - "extends": "default", - "consent": { "required": ["analytics"] } - } - } -} -``` - -## Why contracts? - -Without contracts, validation rules live inside each transformer config, -duplicated across flows. Contracts solve this: - -- **Single source of truth**: Define event requirements once at the config level -- **Named and composable**: Multiple contracts with inheritance via `extends` -- **Self-documenting**: JSON Schema `description` and `examples` annotate your events -- **Versioned**: `tagging` tracks contract versions alongside your events -- **Dot-path access**: Reference any part with `$contract.name.section` - -## Named contracts - -Contracts are always a map of named entries. Each entry can contain sections -(`globals`, `context`, `custom`, `user`, `consent`), event schemas (`events`), -metadata (`tagging`, `description`), and an optional `extends` reference: - - - -## Inheritance with `extends` - -Use `extends` to inherit from another named contract. Inheritance is additive: -the child contract merges on top of the parent: - -- **Sections** (`globals`, `consent`, etc.) merge additively -- **Events** merge at the entity-action level -- **Scalars** (`tagging`): child wins -- **Chains** work: `web_loggedin` extends `web` extends `default` -- **Circular references** are detected and throw an error - -Resolution order: extends chains are resolved first, then wildcards are expanded -on the fully merged result. - -## Sections - -Each section is a JSON Schema for the corresponding `WalkerOS.Event` field: - -| Section | Event field | Purpose | -|---------|------------|---------| -| `globals` | `event.globals` | Cross-event key-value pairs (country, currency) | -| `context` | `event.context` | Timing/context properties | -| `custom` | `event.custom` | Custom properties | -| `user` | `event.user` | User identity and attributes | -| `consent` | `event.consent` | Consent state | - -## Event schemas - -Inside `events`, entity-action keyed entries define JSON Schema objects -describing a partial `WalkerOS.Event`: - - - -## Wildcard inheritance - -Contracts support four wildcard levels that merge **additively**: - -| Level | Pattern | Matches | -|-------|---------|---------| -| 1 | `*` → `*` | All events (global rules) | -| 2 | `*` → `action` | A specific action across all entities | -| 3 | `entity` → `*` | All actions of a specific entity | -| 4 | `entity` → `action` | Exact match | - -All matching levels combine. For `product add`, levels 1, 3, and 4 all apply: - - - -:::warning Contracts vs mapping wildcards -Contract wildcards use **additive merging**: all matching levels combine. -Mapping wildcards use **fallback matching**: the first match wins. - -This difference is intentional. Contracts define cumulative requirements (entity-level -rules always apply to all actions), while mappings select a single transformation -target. - -**Contract:** `product.*` rules AND `product.add` rules both apply to `product add` - -**Mapping:** `product.add` matches first, so `product.*` is never checked -::: - -## Merge algorithm - -When multiple levels match, schemas merge with these rules: - -| JSON Schema keyword | Merge behavior | -|---------------------|----------------| -| `required` | Union (deduplicated): can only add requirements, never remove | -| `properties` | Deep merge: child wins on conflict for scalar values | -| Scalar keywords (`minimum`, `maximum`, `pattern`, etc.) | Child overrides parent | -| Annotations (`description`, `examples`) | Stripped from resolved event schemas | - -
-Merge example - -Given a parent schema from `product.*`: - -```json -{ - "properties": { - "data": { "type": "object", "required": ["id", "name"] } - } -} -``` - -And a child schema from `product.add`: - -```json -{ - "properties": { - "data": { "type": "object", "required": ["name", "quantity"] } - } -} -``` - -The merged result for `product add`: - -```json -{ - "properties": { - "data": { "type": "object", "required": ["id", "name", "quantity"] } - } -} -``` - -The `required` arrays are unioned and deduplicated: `["id", "name"]` + `["name", "quantity"]` = `["id", "name", "quantity"]`. - -
- -## `$contract` dot-path references - -Use `$contract.name.path` to reference any part of a resolved contract. -The contract is fully resolved (extends + wildcards) before path access: - - - -### Deep paths - -Access nested values with dot notation: - -- `$contract.web.events`: all event schemas for the "web" contract -- `$contract.web.events.product.add`: single event schema -- `$contract.web.consent`: consent section -- `$contract.web.tagging`: contract version metadata - -
-Advanced: shared schema fragments via `variables` - -Variables can hold JSON Schema fragments that get reused across multiple -contract events: - - - -A whole-string `$var.idSchema` reference is replaced by the entire schema -object. Deep paths (`$var.idSchema.properties.id`) walk into the value. - -
- -## Versioning - -Contract versions are tracked alongside the contract definition itself, not on -the runtime event. As of v4 the event payload no longer carries a `version` -field - track contract evolution through your source of truth (Git, your -deployment pipeline, or contract metadata) instead. - -Recommended workflow: - -- Store the contract in version control next to your flow config -- Tag releases of the deployed contract in your CI/CD pipeline -- Compare the currently deployed contract against the previous release as part - of your review process - -## Using contracts with the validator - -The [validator transformer](/docs/transformers/validator) enforces contracts at -runtime. Wire contract sections to the validator settings: - - - -## CLI validation - -Validate contracts with the CLI or MCP server: - - - -The contract validator checks: -- `tagging` is a non-negative integer (if present) -- `extends` references exist and are not circular -- Entity and action keys are non-empty -- Each entry is a valid JSON Schema object -- Sections (`globals`, `context`, etc.) are valid JSON Schema objects - -## Complete example - - - -In the `web-shop` flow, `product add` merges these levels: - -| Level | Source | Rules added | -|-------|--------|-------------| -| Top-level `globals` | `default` (inherited) | `globals.country`, `globals.currency` required | -| Top-level `consent` | `default` (inherited) | `consent.analytics` required | -| `product.*` | `default` events (inherited) | `data.id`, `data.name` required | -| `product.add` | `default` events (inherited) | `data.quantity` required | - -## Next steps - -- **[Validator transformer](/docs/transformers/validator)**: Enforce contracts at runtime -- **[Mapping](/docs/mapping)**: Transform events for destinations -- **[Flow configuration](/docs/getting-started/modes/bundled)**: Full flow config reference diff --git a/website/docs/getting-started/flow/contract.mdx b/website/docs/getting-started/flow/contract.mdx new file mode 100644 index 000000000..0bb78148d --- /dev/null +++ b/website/docs/getting-started/flow/contract.mdx @@ -0,0 +1,404 @@ +--- +title: Contract +description: Named, inheritable event schemas that define what your data should look like +sidebar_position: 2 +--- + +# Contract + +A contract is the schema for your event data: which fields are required, what types they have, what values are allowed. It lives alongside `flows` in flow.json as a named, inheritable block that any flow can reference via `$contract..`. + +```json +{ + "contract": { + "default": { + "tagging": 1, + "schema": { + "type": "object", + "properties": { + "globals": { "required": ["country"] } + } + }, + "events": { + "product": { + "*": { "properties": { "data": { "required": ["id", "name"] } } }, + "add": { "properties": { "data": { "required": ["quantity"] } } } + } + } + } + } +} +``` + +## Why use a contract + +A contract is a single, inheritable description of what your events should look like. It does not enforce anything at runtime: tools and humans read it for governance, documentation, and schema-driven workflows. Without a contract, schema rules can live inline (`validate:` on each step), which duplicates across flows. + +- **Single source of truth.** Define `product add` requirements once. Every flow that ships these events references the same definition. +- **Inheritance.** Layer additional rules on top with `extends` (for example, `web_loggedin` extends `web` extends `default`) rather than copying. +- **Versioned.** `tagging` tracks contract revisions alongside the events they govern. +- **Self-documenting.** Each schema is JSON Schema, so `description` and `examples` annotate fields the same way humans and tools read them. +- **Decoupled from enforcement.** Contracts describe what events should look like, step-level `validate:` references them, consumers decide whether to enforce. +- **Composable with the rest of the config.** Reference fragments anywhere via `$contract..` (see [Reference syntax](/docs/guides/reference-syntax#contract-)). + +If your flow has a single throwaway event, you do not need a contract. Reach for one as soon as the same shape needs to hold across more than one flow. + +## The shape + +`contract` is a top-level key on flow.json (parallel to `flows`, not nested inside a flow). Each entry is a named contract. The full shape: + +| Field | Purpose | +|-------|---------| +| `extends?` | Inherit from another named contract | +| `tagging?` | Integer revision marker | +| `description?` | Human-readable note | +| `events?` | Entity-action keyed JSON Schemas, applied per event | +| `schema?` | A single JSON Schema applied to every event | + +```json +{ + "version": 4, + "contract": { + "default": { + "tagging": 1, + "schema": { + "type": "object", + "properties": { + "globals": { + "required": ["country"], + "properties": { + "country": { "type": "string" } + } + }, + "consent": { + "required": ["analytics"], + "properties": { + "analytics": { "type": "boolean", "const": true } + } + } + } + } + }, + "web": { + "extends": "default", + "events": { + "product": { + "add": { + "properties": { + "data": { "required": ["id", "quantity"] } + } + } + } + } + } + } +} +``` + +### Schema + +`schema` is a JSON Schema for the full event. Standard event field names (`globals`, `context`, `consent`, `user`, `custom`, `source`, `data`) live inside `schema.properties`. The schema runs on every event the contract governs, in addition to any per-event rules under `events`. + +### Event schemas + +Inside `events`, entity-action keyed entries define JSON Schemas for a partial `WalkerOS.Event`. The `*` key matches anything (see [Wildcard inheritance](#wildcard-inheritance)). + +```json +"events": { + "product": { + "*": { + "description": "A product in the catalog", + "properties": { + "data": { + "type": "object", + "required": ["id", "name"], + "properties": { + "id": { "type": "string", "description": "Product SKU" }, + "name": { "type": "string", "description": "Display name" } + } + } + } + }, + "add": { + "description": "Product added to cart", + "properties": { + "data": { + "type": "object", + "required": ["quantity"], + "properties": { + "quantity": { "type": "integer", "minimum": 1 } + } + } + } + } + } +} +``` + +## Inheritance with extends + +Use `extends` to inherit from another named contract. Inheritance is additive: + +- **`schema`** merges additively across the chain (deep merge of `properties`, union of `required`) +- **`events`** merge at the entity-action level +- **Scalars** (`tagging`, `description`): child overrides if set, otherwise inherited from parent +- **Chains supported**: `web_loggedin` extends `web` extends `default` +- **Circular references** are detected and throw + +Extends chains are resolved first, then wildcards expand on the merged result. Schema merging follows the same additive rules as wildcard merging (see [Merge rules](#merge-rules)), so the same limitations on JSON Schema composition keywords apply. + +```json +"contract": { + "default": { + "tagging": 1, + "schema": { + "properties": { + "globals": { "required": ["country"] } + } + } + }, + "web": { + "extends": "default", + "events": { + "product": { + "add": { "properties": { "data": { "required": ["id", "quantity"] } } } + } + } + }, + "web_loggedin": { + "extends": "web", + "schema": { + "properties": { + "user": { + "required": ["id"], + "properties": { "id": { "type": "string" } } + } + } + } + } +} +``` + +`web_loggedin` resolves to: `tagging: 1` (from `default`), `globals.country` required (from `default`), `events.product.add` (from `web`), and `user.id` required (added by `web_loggedin`), all within a single merged `schema`. + +## Wildcard inheritance + +Contracts support four wildcard levels in `events` that all merge **additively**: + +| Level | Pattern | Matches | +|-------|---------|---------| +| 1 | `*` → `*` | All events (global rules) | +| 2 | `*` → `action` | A specific action across all entities | +| 3 | `entity` → `*` | All actions of a specific entity | +| 4 | `entity` → `action` | Exact match | + +For `product add`, levels 1, 3, and 4 all apply and combine: + +```json +"events": { + "*": { "*": { "properties": { "consent": { "required": ["analytics"] } } } }, + "product": { "*": { "properties": { "data": { "required": ["id", "name"] } } }, + "add": { "properties": { "data": { "required": ["quantity"] } } } } +} + +// Resolved "product add": +// consent.analytics required (from * -> *) +// data.id, data.name required (from product -> *) +// data.quantity required (from product -> add) +``` + +:::warning Contracts vs mapping wildcards +Contract wildcards use **additive merging**: all matching levels combine. +Mapping wildcards use **fallback matching**: the first match wins. + +This difference is intentional. Contracts express cumulative requirements (entity-level rules apply to every action); mappings select a single transformation target. + +**Contract:** `product.*` rules AND `product.add` rules both apply to `product add` +**Mapping:** `product.add` matches first, so `product.*` is never checked +::: + +### Merge rules + +When multiple wildcard levels (or `extends` chains) match, the JSON Schemas merge with these rules: + +| JSON Schema keyword | Merge behavior | +|---------------------|----------------| +| `required` | Union (deduplicated) | +| `properties` | Deep merge | +| Scalar keywords (`minimum`, `pattern`, ...) | Child overrides parent | +| Annotations (`description`, `examples`, `title`, `$comment`) | Stripped from resolved event schemas | + +Additive deep-merge applies to `properties` (deep-merge) and `required` arrays (union/dedup). Other JSON Schema keywords (`oneOf`, `enum`, `type` arrays, `allOf`) follow child-wins. Use `allOf` composition at the schema level if full JSON Schema composition is needed. + +Annotations stay on the source contract for tooling (CLI hints, IDE descriptions), but the runtime schema seen by validators is the stripped form. + +## `$contract` references + +Reference any part of a resolved contract with `$contract..`. The contract is fully resolved (extends + wildcards) before path access, so the returned value is the merged shape, not the raw entry. + +```json +"destinations": { + "ga4": { + "validate": { + "schema": "$contract.web.schema", + "events": "$contract.web.events" + } + } +} +``` + +### Deep paths + +Walk into the resolved shape with dot notation: + +| Path | Returns | +|------|---------| +| `$contract.web` | The fully resolved contract entry | +| `$contract.web.schema` | The merged event-level JSON Schema | +| `$contract.web.schema.properties.globals` | Just the resolved globals sub-schema | +| `$contract.web.schema.properties.consent` | Just the resolved consent sub-schema | +| `$contract.web.events` | All resolved event schemas for the `web` contract | +| `$contract.web.events.product.add` | Resolved schema for `product add`, with all matching wildcard levels merged in | +| `$contract.web.tagging` | The contract revision number | + +## CLI validation + +Validate contracts standalone or as part of a flow: + +```bash +# Validate a contract file +walkeros validate contract.json --type contract + +# Validate inline +echo '{"default":{"events":{"product":{"add":{"properties":{}}}}}}' | walkeros validate --type contract + +# Validate a full flow (covers contract structure + example compliance) +walkeros validate flow.json +``` + +The contract validator checks: + +- `tagging` is a non-negative integer (if present) +- `extends` references exist and are not circular +- Entity and action keys are non-empty +- `schema`, if present, is a valid JSON Schema object +- Each event entry is a valid JSON Schema object + +
+Advanced: shared schema fragments via `variables` + +Top-level `variables` holds reusable values that any part of the config can pull in with `$var.`. Whole-string references preserve native type; deep paths walk into the value: + +```json +{ + "variables": { + "idSchema": { + "required": ["id"], + "properties": { "id": { "type": "string" } } + } + }, + "contract": { + "web": { + "events": { + "product": { + "*": { "properties": { "data": "$var.idSchema" } } + } + } + } + } +} +``` + +Use `variables` when the same JSON Schema fragment shows up in many events. For contract-shaped reuse across flows, prefer `extends`. + +
+ +## Complete example + +A canonical, tested flow with a multi-entry contract lives at +[`packages/cli/examples/flow-complete.json`](https://github.com/elbwalker/walkerOS/blob/main/packages/cli/examples/flow-complete.json). + +A shorter end-to-end illustration: + +```json +{ + "version": 4, + "contract": { + "default": { + "tagging": 1, + "description": "Web shop tracking contract", + "schema": { + "type": "object", + "properties": { + "globals": { + "required": ["country", "currency"], + "properties": { + "country": { "type": "string", "pattern": "^[A-Z]{2}$" }, + "currency": { "type": "string", "pattern": "^[A-Z]{3}$" } + } + }, + "consent": { + "required": ["analytics"], + "properties": { + "analytics": { "type": "boolean", "const": true } + } + } + } + }, + "events": { + "product": { + "*": { "properties": { "data": { "required": ["id", "name"] } } }, + "add": { "properties": { "data": { "required": ["quantity"], "properties": { "quantity": { "type": "integer", "minimum": 1 } } } } } + }, + "order": { + "complete": { "properties": { "data": { "required": ["total"], "properties": { "total": { "type": "number", "minimum": 0 } } } } } + } + } + }, + "web_loggedin": { + "extends": "default", + "schema": { + "properties": { + "user": { + "required": ["id", "email"], + "properties": { + "id": { "type": "string" }, + "email": { "type": "string", "format": "email" } + } + } + } + } + } + }, + "flows": { + "web-shop": { + "config": { "platform": "web" }, + "destinations": { + "ga4": { + "validate": { + "schema": "$contract.web_loggedin.schema", + "events": "$contract.web_loggedin.events" + } + } + } + } + } +} +``` + +For `product add`, a `validate:` block that references `$contract.web_loggedin` sees these rules (all from the merged shape): + +| Source | Rule | +|--------|------| +| `default.schema.properties.globals` | `country`, `currency` required, both match pattern | +| `default.schema.properties.consent` | `analytics` required and `true` | +| `default.events.product.*` | `data.id`, `data.name` required | +| `default.events.product.add` | `data.quantity` required, integer, minimum 1 | +| `web_loggedin.schema.properties.user` | `user.id`, `user.email` required | + +## Next steps + +- **[Validate](/docs/getting-started/flow/validate)**: step-level `validate:` primitive that consumes contracts +- **[Mapping](/docs/mapping)**: transform events between steps +- **[Step examples](/docs/getting-started/flow/step-examples)**: pair every step with input/output fixtures +- **[Reference syntax](/docs/guides/reference-syntax)**: all `$contract`, `$var`, `$flow`, `$store`, `$secret`, `$code:`, `$env` references diff --git a/website/docs/getting-started/flow/index.mdx b/website/docs/getting-started/flow/index.mdx index b610e382e..0ad7f3f6e 100644 --- a/website/docs/getting-started/flow/index.mdx +++ b/website/docs/getting-started/flow/index.mdx @@ -294,7 +294,7 @@ Sources and destinations support `require` to delay initialization until specifi }, "destinations": { "ga4": { - "package": "@walkeros/web-destination-gtag-ga4", + "package": "@walkeros/web-destination-gtag", "config": { "require": ["consent"], "consent": { "marketing": true } @@ -314,8 +314,8 @@ Transformers process events between sources and destinations. They validate, enr -In this config, `validate` runs before the collector (pre-chain) and `enrich` runs after the collector but before the `analytics` destination (post-chain). +In this config, `fingerprint` runs before the collector (pre-chain) and `enrich` runs after the collector but before the `analytics` destination (post-chain). #### Conditional routing -The `next` property accepts a `RouteSpec`: a `string`, a `string[]`, or a `Route[]`. A `Route` is a single `{ match, next }` rule, and `Route[]` enables conditional routing evaluated against ingest metadata: +Every chain field (`source.before`, `source.next`, `transformer.before`, `transformer.next`, `destination.before`, `destination.next`) accepts a `Route`. `Route` is recursive: + +```typescript +type Route = string | Route[] | RouteConfig; +``` + +A `string` names a transformer (or a path, see below). A `Route[]` runs each entry in order as a pipeline. A `RouteConfig` is a disjoint union: it sets **exactly one** of `next`, `one`, `many`, or none of them (pure gate that only filters by `match`). `match` is optional everywhere; omit it to always match. + +##### Route operators + +A `RouteConfig` is a disjoint union. Pick the operator that matches the routing shape you need: + +- `next`: single continuation. Optionally gated by `match`. +- `one`: first-match dispatch. Walk entries in order; the first whose `match` passes wins, and the main chain continues with that entry's `Route`. +- `many`: all-match terminal fan-out. Every matching entry spawns an independent flow that runs to its own exit. The main chain terminates at the `many` step. Restricted to pre-collector positions (`source.next`, `transformer.next`, `transformer.before`). Post-collector fan-out uses the destinations map. + +First-match dispatch is the `one` operator: + +`one` entries are evaluated in order and the first matching `Route` wins. The trailing entry omits `match`, so it always matches and acts as the default branch. If no entry matches, the event passes through unchanged to the collector. + +Terminal fan-out is the `many` operator. Use it when one inbound event needs to feed several independent processing branches (for example, splitting a webhook payload into per-vendor enrichment paths before the collector): + + -Routes are evaluated in order. The first match wins. If no route matches, the event passes through unchanged to the collector. Conditional routing works on all chain positions that accept a `RouteSpec`: `source.before`, `source.next`, `transformer.before`, `transformer.next`, `destination.before`, and `destination.next`. +Every entry in `many` whose `match` passes runs as its own branch. The main chain stops at the `many` step, so each branch is responsible for its own continuation. If no entry matches, the event is dropped from the pre-collector pipeline. + +To name and reuse a chain without writing code, declare a **path** transformer: a transformer entry with no `code` / `package`, just `before` / `next` / `cache`. The collector synthesizes a code-less passthrough so the named entry can be referenced from any `Route`: + + #### Deferred activation with `require` diff --git a/website/docs/getting-started/flow/step-examples.mdx b/website/docs/getting-started/flow/step-examples.mdx index 55198e992..8230b3e9a 100644 --- a/website/docs/getting-started/flow/step-examples.mdx +++ b/website/docs/getting-started/flow/step-examples.mdx @@ -144,23 +144,19 @@ Here is a complete flow config with examples on a source, transformer, and desti } }, "transformers": { - "validate": { - "package": "@walkeros/transformer-validator", + "fingerprint": { + "package": "@walkeros/server-transformer-fingerprint", "examples": { - "valid event": { + "enriched event": { "in": { "name": "page view", "data": { "title": "Home" } }, "out": { "name": "page view", "data": { "title": "Home" } } - }, - "invalid event": { - "in": { "name": "", "data": {} }, - "out": false } } } }, "destinations": { "ga4": { - "package": "@walkeros/web-destination-gtag-ga4", + "package": "@walkeros/web-destination-gtag", "config": { "settings": { "measurementId": "G-DEMO123456" } }, @@ -229,7 +225,7 @@ Extract examples from your flow config and use them as test fixtures: >` | Per-event JSON Schemas keyed by entity then action, with `*` wildcard fallback | +| `schema?` | `JsonSchema` | A single JSON Schema applied to every event that reaches the step | + +## events or schema + +Per-event rules go in `events`. Apply-to-every-event rules go in `schema`. + +## Step-level usage + +`validate:` lives on the step it protects. Same shape on every step type. + +### On a destination + +Declare that orders without a total should not reach GA4. Other destinations on the same flow are unaffected by this declaration. + + + +### On a source + +Declare ingest payloads that miss a required field as invalid before they hit the collector. + + + +### On a transformer + +Declare a precondition for a transformer, for example that a downstream enrichment transformer never sees an event without a user id. + + + +## Failure semantic + +`validate:` is declarative, runtime behavior depends on the consumer. The typical interpretation is local to the step: a failed validation skips the step it is attached to and other destinations, transformers, and sources on the same flow continue to receive the event. Treat this as the recommended convention, not a guaranteed runtime contract. + +``` + ┌──────────────────────────┐ + │ ga4 (validate fails) │ +event "order complete" ──┤ skipped │ + │ │ + │ meta (no validate here) │ + │ receives event │ + └──────────────────────────┘ +``` + +This local-to-the-step semantic is the key difference from a flow-level validator that drops events globally. + +## Lifecycle position + +The recommended logical position is after the step's `before` chain and before the step's main action. On a source that places validation in front of the collector, on a transformer or destination it sits in front of the main push. The validator sees the event in the same shape the step itself would see. + +## Wiring from a contract + +`validate:` accepts `$contract..` references just like any other config value. Define rules once in a contract, reference them from each step: + + + +See [Contract](/docs/getting-started/flow/contract) for the full contract shape, inheritance with `extends`, and wildcard merging. + +## Format layer + +Setting `format: true` declares that the full `WalkerOS.Event` structural check should run on the input. That covers required top-level fields (`name`, `source`, `timestamp`, `id`, ...), the entity-action `event name` pattern, `source.type` being one of the known kinds, and the basic shape of nested objects (`data`, `context`, `globals`, `user`, `consent`). Use it as a cheap sanity gate when the step receives data from arbitrary callers, skip it when the input is already a `WalkerOS.Event` produced by the collector. + +## Next steps + +- **[Contract](/docs/getting-started/flow/contract)**: named, inheritable schemas referenced via `$contract` +- **[Mapping](/docs/mapping)**: transform events between steps diff --git a/website/docs/getting-started/stores.mdx b/website/docs/getting-started/stores.mdx index 01c8073e0..5f1f04f7d 100644 --- a/website/docs/getting-started/stores.mdx +++ b/website/docs/getting-started/stores.mdx @@ -30,30 +30,28 @@ Stores can be synchronous or asynchronous. The interface supports both. | Package | Environment | Storage | Features | |---------|-------------|---------|----------| -| `@walkeros/store-memory` | Any | In-memory | LRU eviction, TTL, namespace utility | | `@walkeros/server-store-fs` | Node.js | Filesystem | Read/write files, directory listing | | `@walkeros/server-store-s3` | Node.js | S3-compatible | Object storage via AWS SDK | +| `@walkeros/server-store-gcs` | Node.js | Google Cloud Storage | Object storage via GCS JSON API | +| `@walkeros/server-store-sheets` | Node.js | Google Sheets | Row-per-key storage via Sheets API | + +The collector ships a built-in in-memory cache tier (`__cache`). Wire it on any store via `Flow.Store.cache` instead of declaring a separate memory store. ## Configuration ### Bundled mode (flow.json) -Define stores in the `stores` section of a flow config: +Define stores in the `stores` section of a flow config. Use `cache` to enable the built-in in-memory cache tier on top of the backing store: @@ -88,14 +87,14 @@ Use the `$store.` prefix in a component's `env` to inject a store instance at ru + +Every `sessions.get(K)` now checks the in-memory tier first. On miss, it reads from Sheets and populates the tier with a 300-second TTL. The next 300 seconds of identical reads hit memory and skip the Sheets API entirely. + +The same rule applies to writes: `sessions.set(K, V)` writes to Sheets first, then to the tier on a best-effort basis (see [Write-through error policy](#write-through-error-policy) below). + +## Cache rule shape + +Store cache rules use a stricter subset of the rule shape used by event caches: + +| Field | Type | Notes | +| ------- | ----------------- | ------------------------------------------------------------ | +| `ttl` | `number` | **Required.** Time-to-live in seconds. | +| `match` | `MatchExpression` | Optional. Matches against `{ key, value? }`, not event data. | + +Store rules **never** accept `key` or `update`. The cache key comes from the caller (`store.get(K)`); there is no event to transform. Rules can match on the store key or value via `match`: + + + +First rule caches only keys starting with `session:` for five minutes. The second catches everything else for one minute. Rules evaluate top-down, first match wins. + +## Multi-tier composition + +`cache.store` references another store in the same flow. That store can have its own `cache`, and so on. The wrapper hierarchy is transparent: consumers wire to the top-level store and the wrapping resolves automatically. + + + +The lookup chain on `api.get(K)`: + +1. Check the `api` wrapper's tier (Redis). HIT, return. +2. On Redis MISS, fall through to the next layer. The Redis wrapper's own tier (the built-in memory `__cache`) is checked first. HIT, return and **populate Redis**. +3. On both MISS, call the underlying API. +4. The value flows back up. Each traversed tier is populated on the unwind: memory `__cache`, then Redis, then the `api` tier. + +Subsequent reads hit the topmost tier that has a fresh value. + +Omitting `cache.store` falls back to the collector's built-in `__cache` tier. There is no separate memory-store package to install. + +## Built-in `__cache` tier + +The collector ships a single shared `__cache` instance used as the default cache tier when `cache.store` is omitted. It is an in-memory LRU map: + +- **Entry cap:** `maxEntries: 10000` (fixed in v1). +- **LRU access ordering:** reads reorder entries; least-recently-used drop first when full. +- **Batched eviction:** on overflow, evict down to 80% (`8000`) in one pass. +- **Active TTL sweep:** a periodic sweeper drops expired entries every 60 seconds. + +Each wrapped store gets an automatic namespace prefix (the store id by default) so multiple stores sharing `__cache` do not collide. Override with `cache.namespace: "myns"` for an explicit prefix. The collector logs the resolved namespace at startup, one line per wrapped store. + +## Coherence model + +Read this section before relying on the cache for anything correctness-sensitive. + +- **Read-your-writes (in-process):** yes. `wrapped.set(K, V)` populates the local cache on success, so a subsequent `wrapped.get(K)` in the same process sees `V`. +- **Cross-process consistency:** eventual, bounded by the longest TTL in the chain. If memory TTL is 60s and Redis TTL is 300s, a value changed in the backing by another writer is served stale from memory for up to 60s, from Redis for up to 300s. There is no invalidation channel. +- **Tier-skipping repopulation:** a MISS in tier N that HITs in tier N+1 repopulates tier N on the unwind. Subsequent reads hit tier N. + +Set TTLs accordingly. Use short TTLs (1-60s) for mostly-static lookups behind a fast backing; use long TTLs (minutes-hours) for cold, expensive lookups where staleness is tolerable. + +## Write-through error policy + +`wrapped.set(K, V)` runs two steps with explicit failure handling: + +1. **Backing first.** Await `backing.set(K, V)`. If this throws, the wrapper throws. The cache is not touched. +2. **Cache best-effort.** If the backing succeeded and a rule matches, attempt `cache.store.set(...)`. If this throws, the wrapper logs a warning and returns success. + +Backing is the source of truth. A failed cache write degrades performance (next read misses) but does not corrupt correctness. A failed backing write is real failure and surfaces to the caller. + +`wrapped.delete(K)` follows the same shape: backing first (throws on failure), then best-effort cache delete (logs on failure). A failed cache delete leaves a poisoned entry that serves stale data until TTL; the warning lets operators react. + +## Single-flight deduplication + +Multiple concurrent `wrapped.get(K)` calls on a cold cache produce **exactly one** backing call. The wrapper holds an in-flight promise registry keyed by the namespaced key: subsequent callers receive the same promise until the first resolves. + +This eliminates the thundering-herd failure mode that motivates store-level cache in the first place: 50 simultaneous events looking up the same `session:abc` key against a Sheets backend trigger one Sheets read, not 50. + +## Observability + +Each wrapped store exposes counters via the collector telemetry channel. Per-store keys are `walkeros.store_cache..`: + +| Counter | Meaning | +| ------------------- | ----------------------------------------------- | +| `hits` | Reads served by the cache tier | +| `misses` | Reads that fell through to the backing | +| `populates` | Cache writes triggered by successful backing reads | +| `writes` | Successful `set` calls | +| `deletes` | Successful `delete` calls | +| `evictions_entries` | Entries evicted because the tier hit `maxEntries` | +| `evictions_ttl` | Entries evicted by the active TTL sweep | +| `inflight_dedups` | Concurrent calls dedup-merged into one inflight | + +Counters surface through the same telemetry hook the collector uses for flow events. Wire your own logger or telemetry destination to consume them. + +For interactive debugging, the wrapped store instance exposes a `counters` accessor: + + + +## Known limitations + +- **No negative caching.** A `get(K)` that returns `undefined` from the backing is not populated. Every subsequent call for that key re-hits the backing until the value exists. Workaround: write a sentinel value on the first miss, treat it as "not present" in your transformer logic. +- **No cross-process invalidation.** Writes from one process do not invalidate caches in other processes. TTL is the only mechanism. +- **No `stop` field on store cache.** `stop` is an event-cache concept (halt the pipeline on hit). Store reads always fall through on miss; the field is rejected by the schema. +- **No `update` field on store cache.** `update` mutates events on hit. Stores have no event to mutate. +- **Renaming a store is a breaking change** to anything caching through it (`cache.store: "X"` references break). Document and migrate explicitly. + +## Migration from `@walkeros/store-memory` + +The dedicated `@walkeros/store-memory` package was removed once the built-in `__cache` reached feature parity. Migration is one-line per occurrence: + +- If a memory store was used **only** as a cache target (`cache.store: "memory"`): omit `cache.store`. The wrapper falls back to the built-in `__cache` automatically. +- If the memory store was wired into a component's `env` for non-cache use: replace with a small inline `Map` inside the component, or use one of the persistent stores in [Stores](./index.mdx). + +`flow_validate` rejects `package: "@walkeros/store-memory"` with the replacement instruction. + +## Related + +- [Stores](./index.mdx) — store interface, `$store.` wiring, lifecycle. +- [Transformers: Cache](../transformers/cache.mdx) — event-level cache on sources, transformers, destinations. +- [Reference Syntax](../guides/reference-syntax.mdx) — `$store.`, `$env.`, `$var.` references. diff --git a/website/docs/stores/index.mdx b/website/docs/stores/index.mdx index 1876c2da1..cff734246 100644 --- a/website/docs/stores/index.mdx +++ b/website/docs/stores/index.mdx @@ -35,10 +35,12 @@ Flow startup order: | Store | Platform | Persistence | Speed | Best for | |-------|----------|-------------|-------|----------| -| [**Memory**](./memory) | Web + Server | Process lifetime (lost on restart) | Fastest (in-process) | Caching, deduplication, ephemeral state | | [**Filesystem**](./server/fs) | Server only | Disk (survives restarts) | Fast (local I/O) | Local dev, Docker with baked-in assets | | [**S3**](./server/s3) | Server only | Cloud (always available) | Network I/O | Managed deployments, shared assets, hot-swap | | [**GCS**](./server/gcs) | Server only | Cloud (always available) | Network I/O | Cloud Run / GKE deployments, GCP-native | +| [**Sheets**](./server/sheets) | Server only | Cloud (Google Sheets) | Slow (HTTP, rate-limited) | Demos, prototypes with a spreadsheet UI | + +For ephemeral, in-process caching, use the built-in [cache tier](./cache.mdx) on any of the stores above, no separate package needed. ## Wiring stores to components @@ -116,18 +118,13 @@ Stores are rarely used alone. They work together with transformers to enable ana | Pattern | Store | Transformer | What it enables | |---------|-------|-------------|-----------------| | **Self-hosted tag delivery** | S3 or Filesystem | [File](/docs/transformers/file) | Serve walker.js and tracking pixels from your own infrastructure | -| **Cookie-free user identification** | Memory | [Fingerprint](/docs/transformers/fingerprint) | Store session hashes server-side, identify users without cookies or PII | -| **Response caching** | Memory | [Cache](/docs/transformers/cache) | Deduplicate identical requests, reduce load on downstream analytics APIs | +| **Cookie-free user identification** | Built-in cache tier | [Fingerprint](/docs/transformers/fingerprint) | Store session hashes server-side, identify users without cookies or PII | +| **Response caching** | Built-in cache tier | [Cache](/docs/transformers/cache) | Deduplicate identical requests, reduce load on downstream analytics APIs | +| **Quota-friendly Sheets lookups** | Sheets + [cache tier](./cache.mdx) | Any transformer | Memoize slow API reads, absorb rate limits via TTL | | **Local development** | Filesystem | [File](/docs/transformers/file) | Serve assets from disk during development, no S3 credentials needed | ## Available stores -### Memory - -In-process key-value store with LRU eviction and TTL support. Works in both browser and server flows. Fast but not persisted: data is lost on restart. - -[Learn more →](./memory) - ### Filesystem Local filesystem store for server flows. Reads and writes files relative to a base path with path traversal protection. Good for local development and Docker deployments with baked-in assets. @@ -146,6 +143,18 @@ Google Cloud Storage with zero runtime dependencies. Built-in auth supports Appl [Learn more →](./server/gcs) +### Sheets + +Google Sheets store with zero runtime dependencies. Row-per-key storage using the Sheets v4 REST API. Designed for demos and small prototypes where the spreadsheet is the operator-facing UI. Rate-limited; pair with the [cache tier](./cache.mdx) for any non-trivial throughput. + +[Learn more →](./server/sheets) + +## Caching on stores + +Wrap any of the stores above with a read-through, write-through cache tier by setting `cache` on the store declaration. The default tier uses the collector's built-in in-memory LRU. Compose multi-tier chains via `cache.store`. + +[Learn more →](./cache.mdx) + ## Configuration These fields are available on every store, regardless of package. They wrap the diff --git a/website/docs/stores/memory.mdx b/website/docs/stores/memory.mdx deleted file mode 100644 index 2ee821d2c..000000000 --- a/website/docs/stores/memory.mdx +++ /dev/null @@ -1,147 +0,0 @@ ---- -title: Memory -description: In-process key-value store with LRU eviction and TTL support -sidebar_position: 2 -package: '@walkeros/store-memory' ---- - -import data from '@walkeros/store-memory/walkerOS.json'; -import Configuration from '@site/src/components/snippets/_configuration.mdx'; - -# Memory - - - -In-process key-value store with LRU eviction, TTL expiration, and namespace support. Platform-agnostic: works in both browser and server flows. - -## Installation - - - - - - - - - - - -Add to your `flow.json`: - - - - - - - - -## When to use - -| Scenario | Recommended store | -|----------|-------------------| -| Caching API responses within a request cycle | **Memory**: fastest, no I/O | -| Deduplicating events (seen-key tracking) | **Memory**: in-process, zero overhead | -| Ephemeral session or user state | **Memory**: TTL support, auto-expiry | -| Sharing state across browser tabs | Not memory: use a server store | -| Persisting data across server restarts | [Filesystem](./server/fs) or [S3](./server/s3) | - -Both `maxSize` and `maxEntries` can be used together. When either is exceeded, the least-recently-used entry is evicted first. - -## API - - - -## TTL expiration - -Pass a TTL in milliseconds as the third argument to `set()`. Expired entries are cleaned up lazily on the next `get()`: - - - -Entries without a TTL never expire. - -## LRU eviction - -When the store exceeds `maxSize` or `maxEntries`, the least-recently-used entries are evicted to make room. Calling `get()` refreshes an entry's position, so frequently accessed entries survive longer. - -Size is estimated from `JSON.stringify(value).length + key.length`. - -## Namespace utility - -Use `withNamespace` to scope keys for different components sharing one store: - -'); // stored as "cache:page"`} - language="typescript" -/> - -## Testing - -Use `createMockStore` for unit tests. It implements the same interface and tracks all operations: - -(); -store.set('key', 'value'); -store.get('key'); - -console.log(store._sets); // [{ key: 'key', value: 'value', ttl: undefined }] -console.log(store._gets); // ['key'] -console.log(store._deletes); // []`} - language="typescript" -/> diff --git a/website/docs/stores/server/fs.mdx b/website/docs/stores/server/fs.mdx index 4d2035580..3aa6146c1 100644 --- a/website/docs/stores/server/fs.mdx +++ b/website/docs/stores/server/fs.mdx @@ -118,4 +118,4 @@ A request to `/static/walker.js` reads `./public/walker.js` from disk. | Local development | **Filesystem**: files on disk, no credentials needed | | Docker with baked-in assets | **Filesystem**: mount or copy files into the image | | Cloud / managed deployments | [S3](./s3): files in a bucket, hot-swappable | -| Caching / ephemeral data | [Memory](../memory): fastest, no I/O | +| Caching / ephemeral data | Built-in [cache tier](../cache.mdx): in-process, no I/O | diff --git a/website/docs/stores/server/sheets.mdx b/website/docs/stores/server/sheets.mdx index 99ba37863..6a8415bb6 100644 --- a/website/docs/stores/server/sheets.mdx +++ b/website/docs/stores/server/sheets.mdx @@ -83,9 +83,9 @@ Add to your `flow.json`: -## Wiring with the core cache +## Wiring with the built-in cache -To absorb the Sheets quota, wire the consuming transformer or destination with the core `Cache` config, backed by a fast in-memory store (`@walkeros/store-memory`): +To absorb the Sheets quota, wire the store with the built-in cache via `Flow.Store.cache`. The cache is on by default with an in-memory tier and requires no extra store declaration: ` | Optional modifications applied on read | +`match` is optional, omit it for an always-match rule. + ### Cache Properties | Property | Type | Default | Description | |----------|------|---------|-------------| -| `full` | `boolean` | `false` (`true` for sources) | Stop flow on cache HIT and skip remaining steps, returning the cached value | +| `stop` | `boolean` | `false` (`true` for sources) | Stop flow on cache HIT and skip remaining steps, returning the cached value | | `store` | `string` | Built-in memory | Reference to a store in `flow.stores` | +| `namespace` | `string` | _(none)_ | Optional key prefix. Omit to write keys directly to the store. Same store + same key + same namespace = same cache entry. | | `rules` | `CacheRule[]` | Required | At least one cache rule | ## Behavior by Step Type -### Source Cache (full by default) +### Source Cache (stop by default) -Source cache intercepts requests before the pipeline runs. Sources default to `full: true`. On cache HIT, the cached respond value is returned immediately and the pipeline is skipped. Set `full: false` to skip only the source step and let the pipeline continue. +Source cache intercepts requests before the pipeline runs. Sources default to `stop: true`. On cache HIT, the cached respond value is returned immediately and the pipeline is skipped. Set `stop: false` to skip only the source step and let the pipeline continue. ```json "sources": { @@ -65,7 +68,11 @@ Source cache intercepts requests before the pipeline runs. Sources default to `f ### Transformer Cache (step-level) -Transformer cache skips the transformer's execution on HIT but continues the chain with the cached event. Useful for expensive computations like API enrichment. With `full: true`, the remaining chain stops on HIT and downstream transformers and destinations are skipped. +Transformer cache skips the transformer's execution on HIT but continues the chain with the cached event. Useful for expensive computations like API enrichment. With `stop: true`, the remaining chain stops on HIT and downstream transformers and destinations are skipped. + +:::note Halt scopes +Pre-collector transformer caches with `stop: true` halt the entire pipeline on HIT, destinations do not see the event. Destination caches with `stop: true` halt only the per-destination delivery, sibling destinations still receive the event. +::: ```json "transformers": { @@ -73,7 +80,7 @@ Transformer cache skips the transformer's execution on HIT but continues the cha "package": "@walkeros/server-transformer-enricher", "cache": { "rules": [ - { "match": "*", "key": ["event.name"], "ttl": 60 } + { "key": ["event.name"], "ttl": 60 } ] } } @@ -82,7 +89,7 @@ Transformer cache skips the transformer's execution on HIT but continues the cha ### Destination Cache (deduplication) -Destination cache skips the push on HIT, preventing duplicate events from reaching the destination. Other destinations still receive the event. With `full: true`, the `before` transformer chain is also skipped on HIT. +Destination cache skips the push on HIT, preventing duplicate events from reaching the destination. Other destinations still receive the event. With `stop: true`, the `before` transformer chain is also skipped on HIT. ```json "destinations": { @@ -90,7 +97,7 @@ Destination cache skips the push on HIT, preventing duplicate events from reachi "package": "@walkeros/web-destination-ga4", "cache": { "rules": [ - { "match": "*", "key": ["event.name", "event.data.id"], "ttl": 300 } + { "key": ["event.name", "event.data.id"], "ttl": 300 } ] } } @@ -114,7 +121,6 @@ Use `update` to modify the result on both HIT and MISS: ```json "cache": { "rules": [{ - "match": "*", "key": ["ingest.method", "ingest.path"], "ttl": 300, "update": { @@ -147,3 +153,10 @@ By default, cache uses a shared in-memory store. Reference a custom store for pe } ``` +## Migration from prior v4 cache + +If you're upgrading from an earlier v4 build, three breaking changes apply: + +- **`cache.full` is now `cache.stop`.** Search-and-replace `"full"` for `"stop"` in every `cache` block. Default behavior unchanged (sources default to `stop: true`, transformers and destinations default to `stop: false`). +- **`cache.match: "*"` is now omitted.** Drop the `"match": "*"` entry from rules. A rule with no `match` matches every event, the behavior is identical to the previous wildcard. +- **Implicit per-step namespacing is gone.** Previous builds prefixed cache keys with `s:`, `t:`, or `d:` based on step type, so a source and a destination writing the same key never collided. That prefix is no longer applied. If you share a store across step types and need isolation, set `cache.namespace` explicitly (for example `"namespace": "source"`). diff --git a/website/docs/transformers/create-your-own.mdx b/website/docs/transformers/create-your-own.mdx index 2ad89fac2..116e8393f 100644 --- a/website/docs/transformers/create-your-own.mdx +++ b/website/docs/transformers/create-your-own.mdx @@ -170,6 +170,64 @@ await startFlow({ language="typescript" /> +## Pass-through steps + +A **path** is the multi-step chain through a flow's transformer section. A +**pass-through step** (short: **pass**) is a single step within a path that +has no `code` and no `package`. The runtime synthesizes its push function for +you, so the step exists purely to wire chain hops, run a cache check, or +apply a declarative mapping. + +Three variants exist: + +### 1. Before/next chain only + +A named hop in the chain. Useful for reusing a chain prefix across destinations. + +```json +"enrichServer": { "before": ["filterBots", "sessionLookup"] } +``` + +### 2. Cache only + +A step that runs a cache check, often for dedup or response caching. + +```json +"dedup": { + "cache": { + "stop": true, + "rules": [{ "key": ["event.id"], "ttl": 60 }] + } +} +``` + +### 3. Mapping only + +A step that runs a declarative event-to-event mapping using `Mapping.Config` +primitives (`policy`, per-rule `policy`, `mapping[].name`, `mapping[].ignore`). + +```json +"redactPII": { + "mapping": { + "policy": { "user.email": { "value": "[redacted]" } } + } +} +``` + +:::note Dual semantic of `mapping` +The `mapping` field uses the same `Mapping.Config` shape on destinations and +transformer steps, but the semantic differs by position. On a destination, +`mapping` shapes the vendor payload. On a transformer step, it mutates the +event itself. Vendor-payload fields (`data`, per-rule `data`, `silent`) are +ignored at the transformer position with a one-time warning at init. +::: + +:::note Closed schema +Transformer entries use a **closed schema**: unknown top-level keys are +errors. This catches typos like `{ "rules": [], "stop": true }` at the top +of a step (forgot the `cache:` wrapper). +::: + ## Testing Validator source as reference * Learn about creating sources * Learn about creating destinations diff --git a/website/docs/transformers/ga4.mdx b/website/docs/transformers/ga4.mdx new file mode 100644 index 000000000..01ef99de1 --- /dev/null +++ b/website/docs/transformers/ga4.mdx @@ -0,0 +1,294 @@ +--- +title: GA4 +description: 'Decode Google Analytics 4 Measurement Protocol v2 hits into walkerOS events' +sidebar_position: 2 +package: '@walkeros/transformer-ga4' +--- + +import data from '@walkeros/transformer-ga4/walkerOS.json'; +import Configuration from '@site/src/components/snippets/_configuration.mdx'; + +# GA4 + + + +Decoder transformer that turns Google Analytics 4 Measurement Protocol v2 hits (`/g/collect`, `/mp/collect`) into walkerOS events. Drop it in a server source's `before` chain to ingest existing `gtag`/Google Tag traffic without changing the front-end. One HTTP request can carry many GA4 events; the transformer returns one walkerOS event per GA4 event in the hit. + +This is the v1 release (`0.1.0`) with an explicit scope: server-side decoding via `source-express`, GA4 v2 only, replace-not-merge mapping semantics. See [Caveats](#caveats) and [Roadmap](#roadmap) for the boundaries. + +## Installation + + + +## Wire it up + +The transformer reads `ctx.ingest.url` (required) and `ctx.ingest.body` (optional) from the source it sits in front of. The recommended pairing is `@walkeros/server-source-express`: + + + + +```json +{ + "version": 4, + "flows": { + "default": { + "config": { "platform": "server" }, + "sources": { + "http": { + "package": "@walkeros/server-source-express", + "config": { + "ingest": { + "url": "req.url", + "body": "req.body" + } + }, + "before": "ga4" + } + }, + "transformers": { + "ga4": { "package": "@walkeros/transformer-ga4" } + }, + "destinations": { + "log": { "package": "@walkeros/destination-demo" } + } + } + } +} +``` + + + + +```typescript +import { startFlow } from '@walkeros/collector'; +import { sourceExpress } from '@walkeros/server-source-express'; +import { transformerGa4 } from '@walkeros/transformer-ga4'; +import { destinationDemo } from '@walkeros/destination-demo'; + +await startFlow({ + sources: { + http: { + code: sourceExpress, + config: { + ingest: { url: 'req.url', body: 'req.body' }, + }, + before: 'ga4', + }, + }, + transformers: { + ga4: { code: transformerGa4 }, + }, + destinations: { + log: { code: destinationDemo }, + }, +}); +``` + + + + +### Ingest contract + +The transformer expects the source to populate `ctx.ingest` with these keys: + +| Key | Type | Required | Notes | +| ------ | -------- | -------- | ---------------------------------------------------- | +| `url` | `string` | yes | Full request URL including the query string. | +| `body` | `string` | no | Raw POST body. Multi-event batches are `\n`-separated lines. | + +If `url` is missing or not a string the transformer drops the event silently. If `body` is JSON-parsed by the source before reaching the transformer, pass the original raw string through or skip the transformer. + + + +## Default mappings + +`transformer-ga4` ships with default mappings for 33 standard GA4 event names. Out of the box, you get pageviews, ecommerce, list/promotion, engagement, and auth events mapped to walkerOS's [entity-action naming](/docs/getting-started/event-model). + +### Page / scroll / click + +| GA4 (`en`) | walkerOS (`name`) | Fields | +| ----------------- | ----------------- | ----------------------------------- | +| `page_view` | `page view` | `id`, `title`, `referrer` | +| `scroll` | `page scroll` | `percent` | +| `click` | `link click` | `url`, `domain`, `outbound` | +| `file_download` | `file download` | `name`, `extension`, `url` | + +### Ecommerce + +| GA4 (`en`) | walkerOS (`name`) | Fields | +| --------------------- | ------------------ | --------------------------------- | +| `view_item` | `product view` | `currency`, `value` | +| `add_to_cart` | `product add` | `currency`, `value` | +| `remove_from_cart` | `product remove` | `currency`, `value` | +| `view_cart` | `cart view` | `currency`, `value` | +| `begin_checkout` | `order start` | `currency`, `value`, `coupon` | +| `add_shipping_info` | `order shipping` | `currency`, `value`, `tier` | +| `add_payment_info` | `order payment` | `currency`, `value`, `type` | +| `purchase` | `order complete` | `id`, `currency`, `total`, `tax`, `shipping` | +| `refund` | `order refund` | `id`, `currency`, `total` | +| `add_to_wishlist` | `wishlist add` | `currency`, `value` | + +### List / promotion + +| GA4 (`en`) | walkerOS (`name`) | Fields | +| ------------------ | ------------------ | --------------------- | +| `view_item_list` | `list view` | `id`, `name` | +| `select_item` | `product click` | `list_id`, `list_name` | +| `view_promotion` | `promotion view` | reads from `items[0]` | +| `select_promotion` | `promotion click` | reads from `items[0]` | +| `select_content` | `content select` | `type`, `id` | + +### Video / form / search + +| GA4 (`en`) | walkerOS (`name`) | Fields | +| ----------------- | ----------------- | ------------------------------------- | +| `video_start` | `video start` | `title`, `duration`, `current`, `percent` | +| `video_progress` | `video progress` | same as `video_start` | +| `video_complete` | `video complete` | same as `video_start` | +| `form_start` | `form start` | `id`, `name`, `destination` | +| `form_submit` | `form submit` | `id`, `name`, `destination` | +| `search` | `search submit` | `term` | + +### Auth / lead / share + +| GA4 (`en`) | walkerOS (`name`) | Fields | +| ----------------- | ----------------- | --------------------- | +| `login` | `session login` | `method` | +| `sign_up` | `session signup` | `method` | +| `generate_lead` | `lead generate` | `currency`, `value` | +| `share` | `content share` | `method`, `type`, `id` | + +### Auto-fired noise (dropped by default) + +| GA4 (`en`) | Behavior | +| ----------------- | --------------------- | +| `user_engagement` | `ignore: true` | +| `session_start` | `ignore: true` | +| `first_visit` | `ignore: true` | + +These events are emitted automatically by `gtag` and rarely carry analytics intent. Override the rule if you need them. + +### Fallback + +| GA4 (`en`) | walkerOS (`name`) | Fields | +| ----------------- | ----------------- | --------------------------------- | +| `'*'` | `ga4 track` | `data.event_name` = original `en` | + +Any GA4 event name not listed above falls through to `'*'` and produces a generic `ga4 track` walkerOS event. Override `'*'` to change the fallback rule globally. + +## Override a default field + +User config **replaces** the matching default rule per event name. Other events keep their defaults. To swap a field on `purchase`: + +```json +{ + "transformers": { + "ga4": { + "package": "@walkeros/transformer-ga4", + "config": { + "settings": { + "mapping": { + "purchase": { + "name": "order complete", + "data": { + "map": { + "id": "params.ep.transaction_id", + "total": "params.epn.value", + "currency": "params.ep.currency", + "coupon": "params.ep.promo_code" + } + } + } + } + } + } + } + } +} +``` + +Because v1 uses replace semantics, the entire `purchase` rule is taken from user config: copy any default fields you want to keep. Additive per-field merge is on the [roadmap](#roadmap). + +## Drop an event + +Set `ignore: true` on any key to prevent it from being emitted: + +```json +"settings": { + "mapping": { + "click": { "ignore": true } + } +} +``` + +This is how `user_engagement`, `session_start`, and `first_visit` are silenced by default. + +## Custom events + +Two patterns: + +**1. Override `'*'`** to change the global fallback for unknown GA4 event names: + +```json +"settings": { + "mapping": { + "*": { + "name": "custom event", + "data": { "map": { "event_name": "name" } } + } + } +} +``` + +**2. Add a specific key** for an event you fire via `gtag('event', '', ...)`: + +```json +"settings": { + "mapping": { + "newsletter_subscribe": { + "name": "newsletter signup", + "data": { "map": { "source": "params.ep.source" } } + } + } +} +``` + +## Tracking ID filtering + +By default only Measurement IDs starting with `G-` are accepted; Ads (`AW-`) and DC (`DC-`) hits are dropped. Widen via a string regex in `settings.tidPattern`: + +```json +"settings": { + "tidPattern": "^(G|AW|DC)-" +} +``` + +The string is compiled to a `RegExp` at init time. + +## Caveats + +- **Replace semantics, not merge.** A user mapping rule fully replaces the matching default rule. There is no per-field merge inside `data.map` in v1. +- **GA4 v2 only.** Assumes the v2 Measurement Protocol layout (`ep.`, `epn.`, `up.`, `upn.`, `prN`, `gcs`). v1 is out of scope. +- **`G-` tids only by default.** Override `tidPattern` to capture Ads and DC traffic. +- **Basic `gcs` only.** Maps `G1XX` to `marketing`/`analytics` booleans. Functional/preferences flags and the newer `gcd` parameter are not decoded. +- **Body must be raw text.** The transformer parses POST bodies as URL-encoded form lines. Pre-parsed JSON bodies will not decode. +- **Ingest contract is required.** Source wiring must populate `ctx.ingest.url` (required) and `ctx.ingest.body` (optional) for batched hits. + +## Roadmap + +- **Additive per-field merge** so partial overrides extend the default rule instead of replacing it +- **Web ingest via interception sources** for capturing `gtag` traffic from the browser +- **More vendor decoders** (Segment, Snowplow, Adobe) following the same `before`-chain pattern +- **Richer consent decoding** (`gcd`, functional/preferences flags) + +## Next steps + +- **[Create your own](./create-your-own)** - Build custom transformers +- **[Server source: express](/docs/sources/server/express)** - Pair the decoder with the HTTP source diff --git a/website/docs/transformers/index.mdx b/website/docs/transformers/index.mdx index bab337e50..9110ac05e 100644 --- a/website/docs/transformers/index.mdx +++ b/website/docs/transformers/index.mdx @@ -17,6 +17,13 @@ export const transformerConfig = omitSchemaProperties( Transformers are middleware for **validating**, **enriching**, and **redacting** events in the walkerOS pipeline. Together with [Mapping](/docs/mapping), they give you full control over how events are shaped before reaching destinations. +A transformer step can either run custom logic (via `code` or `package`) or +act as a **pass-through step**: a step with no `code` and no `package`, where +the runtime synthesizes the push. Pass-through steps cover three patterns: +chain-only hops (`before` / `next`), cache-only checks (`cache`), and +mapping-only mutations (`mapping`). See [Create your own](./create-your-own#pass-through-steps) +for the full vocabulary. + -## Available transformers - -### Validator - -Validates events using JSON Schema: - -* Format validation (WalkerOS.Event structure) -* Contract validation (entity/action business rules) -* Configurable logging for validation results - -[Learn more →](./validator) - ## Configuration These fields are available on every transformer, regardless of package. They @@ -75,7 +72,24 @@ transformer's page. +Beyond `code`, `package`, `before`, `next`, and `cache`, transformer entries +also accept a `mapping` field that takes a `Mapping.Config` value. + +:::note Dual semantic of `mapping` +The `mapping` field uses the same `Mapping.Config` shape on destinations and +transformer steps, but the semantic differs by position. On a destination, +`mapping` shapes the vendor payload. On a transformer step, it mutates the +event itself. Vendor-payload fields (`data`, per-rule `data`, `silent`) are +ignored at the transformer position with a one-time warning at init. +::: + +:::note Closed schema +Transformer entries use a **closed schema**: unknown top-level keys are +errors. This catches typos like placing `rules` or `stop` at the top of a +step (forgot the `cache:` wrapper). +::: + ## Next steps -* **[Validator](./validator)** - JSON Schema validation +* **[Cache](./cache)** - Cache pure handler results * **[Create your own](./create-your-own)** - Custom transformer guide diff --git a/website/docs/transformers/validator.mdx b/website/docs/transformers/validator.mdx deleted file mode 100644 index 886ef2225..000000000 --- a/website/docs/transformers/validator.mdx +++ /dev/null @@ -1,204 +0,0 @@ ---- -title: Validator -description: 'Event validation transformer using JSON Schema' -sidebar_position: 1 -package: '@walkeros/transformer-validator' ---- - -import data from '@walkeros/transformer-validator/walkerOS.json'; -import Configuration from '@site/src/components/snippets/_configuration.mdx'; - -# Validator - - - -Validates events using JSON Schema with two modes: **format** (structure of the full `WalkerOS.Event`) and **contract** (entity/action business rules). Invalid events are dropped from the pipeline and logged; valid events pass through unchanged. - -## Installation - - - - - - - - - - - -Add to your `flow.json`: - - - -[See bundled mode setup](/docs/getting-started/modes/bundled) | [CLI reference](/docs/apps/cli) - - - - - - -## Validation modes - -| Mode | Purpose | -|------|---------| -| `format` | Validates full `WalkerOS.Event` structure | -| `contract` | Validates entity/action-specific business rules | - -## Logger levels - -| Level | Output | -|-------|--------| -| `ERROR` | Validation failures only | -| `DEBUG` | All validation results (pass and fail) | - -## Behavior - -### When validation fails - -Invalid events are **dropped from the pipeline** and do not reach destinations. The validator logs detailed error information: - -| Validation | Log message | Includes | -|------------|-------------|----------| -| Format | `Event format invalid` | Field-level errors from AJV | -| Contract | `Contract validation failed` | Rule name + field-level errors | - -**Example log output:** - -``` -[ERROR] Event format invalid { errors: "data/name must match pattern \"^\\w+ \\w+$\"" } -[ERROR] Contract validation failed { rule: "product add", errors: "data must have required property 'id'" } -``` - -### When validation passes - -- **Format valid**: Event continues to contract validation (if configured) -- **Contract valid**: Logs debug message, event continues to next transformer or destinations -- **No matching contract**: Event passes through unchanged (validation is opt-in per entity/action) - -### Pipeline flow - -``` -Event → Format check → Contract check → Next transformer/Destination - ↓ ↓ - Invalid? Invalid? - ↓ ↓ - Drop + Log Drop + Log -``` - -
-Conditional rules - -Apply different schemas based on event data: - - (event.data?.quantity ?? 0) > 10, - schema: { - properties: { - data: { required: ['id', 'quantity', 'warehouse'] } - } - } - }, - { - schema: { - properties: { - data: { required: ['id', 'quantity'] } - } - } - } - ] - } -}`} - language="typescript" -/> - -
- -
-Wildcard patterns - -Match multiple events with wildcards: - - - -
- -## Next steps - -- **[Create your own](./create-your-own)** - Build custom transformers diff --git a/website/package.json b/website/package.json index 90dd75716..23850b637 100644 --- a/website/package.json +++ b/website/package.json @@ -60,8 +60,7 @@ "@walkeros/server-store-sheets": "^4.0.2", "@walkeros/server-transformer-file": "^4.0.2", "@walkeros/server-transformer-fingerprint": "^4.0.2", - "@walkeros/store-memory": "^4.0.2", - "@walkeros/transformer-validator": "^4.0.2", + "@walkeros/transformer-ga4": "^4.0.2", "@walkeros/walker.js": "^4.0.2", "@walkeros/web-destination-amplitude": "^4.0.2", "@walkeros/web-destination-api": "^4.0.2", @@ -86,6 +85,8 @@ "@walkeros/web-source-cmp-cookiefirst": "^4.0.2", "@walkeros/web-source-cmp-cookiepro": "^4.0.2", "@walkeros/web-source-cmp-usercentrics": "^4.0.2", + "@walkeros/web-source-datalayer": "^4.0.2", + "@walkeros/web-source-session": "^4.0.2", "css-loader": "^7.1.2", "prism-react-renderer": "^2.4.1", "react": "^19.2.4", diff --git a/website/sidebars.ts b/website/sidebars.ts index 8d27ba579..09660de0d 100644 --- a/website/sidebars.ts +++ b/website/sidebars.ts @@ -45,7 +45,11 @@ const sidebars: SidebarsConfig = { type: 'doc', id: 'getting-started/flow/index', }, - items: ['getting-started/flow/step-examples'], + items: [ + 'getting-started/flow/step-examples', + 'getting-started/flow/contract', + 'getting-started/flow/validate', + ], }, 'getting-started/event-model', 'apps/mcp', @@ -139,7 +143,6 @@ const sidebars: SidebarsConfig = { 'transformers/cache', 'transformers/file', 'transformers/fingerprint', - 'transformers/validator', 'transformers/create-your-own', ], }, @@ -151,11 +154,7 @@ const sidebars: SidebarsConfig = { id: 'stores/index', }, items: [ - { - type: 'doc', - id: 'stores/memory', - className: 'sidebar-badge-web', - }, + 'stores/cache', { type: 'doc', id: 'stores/server/fs',