diff --git a/.tool-versions b/.tool-versions new file mode 100644 index 000000000..97d06958e --- /dev/null +++ b/.tool-versions @@ -0,0 +1,2 @@ +nodejs 24.11.0 +pnpm 10.20.0 diff --git a/PHASE_2_ARTICLE_FLOW.md b/PHASE_2_ARTICLE_FLOW.md index d312a0a1c..33bb238bf 100644 --- a/PHASE_2_ARTICLE_FLOW.md +++ b/PHASE_2_ARTICLE_FLOW.md @@ -5,6 +5,7 @@ **Goal:** Implement 4-step article processing flow with state management. Establish data flow foundation for observability features. **Success Criteria:** + - ✅ Article processing flow with 4 steps (fetch, summarize, extractKeywords, publish) - ✅ Simulated retry on summarize step - ✅ pgflow State Store manages run state @@ -25,12 +26,27 @@ cd ../.. ``` This installs: -- `@xyflow/svelte` - DAG visualization -- `shiki` - Syntax highlighting + +- `@xyflow/svelte` - DAG visualization (used in Phase 3) +- `shiki` - Syntax highlighting (used in Phase 4+) + +**Note:** Installing all frontend dependencies now simplifies later phases and avoids switching contexts when building UI components. + +--- + +### 2. Copy Logo Assets + +Copy pgflow logos for header component (used in Phase 6): + +```bash +cp pkgs/website/src/assets/pgflow-logo-*.svg apps/demo/static/ +``` + +This copies both light and dark variants of the pgflow logo. --- -### 2. Create Article Flow Worker +### 3. Create Article Flow Worker Create new Edge Function for the article flow: @@ -43,55 +59,75 @@ This creates `apps/demo/supabase/functions/article_flow_worker/` directory. --- -### 3. Create Article Processing Flow +### 4. Create Article Processing Flow Create `apps/demo/supabase/functions/article_flow_worker/article_flow.ts` with 4 steps: ```typescript import { Flow } from '@pgflow/dsl'; +// Task functions (implementations can be simple for Phase 2) +async function fetchArticle(url: string) { + const response = await fetch(`https://r.jina.ai/${url}`); + const content = await response.text(); + return { content, title: 'Article Title' }; +} + +function summarizeArticle(content: string, attemptNumber: number) { + // Simulate failure on first attempt for retry demo + if (attemptNumber === 1) { + throw new Error('Simulated failure for retry demo'); + } + return { summary: `Summary of article`, sentiment: 'positive' }; +} + +function extractKeywords(content: string) { + return { keywords: ['keyword1', 'keyword2', 'keyword3'] }; +} + +function publishArticle(data: { summary: any; keywords: any }) { + return { + articleId: crypto.randomUUID(), + publishedAt: new Date().toISOString(), + ...data, + }; +} + +// Flow definition - clean and minimal export default new Flow<{ url: string }>({ slug: 'article_flow', maxAttempts: 3, - baseDelay: 1, - timeout: 60 }) - .step({ slug: 'fetch_article' }, async (input) => { - // Call r.jina.ai API - const response = await fetch(`https://r.jina.ai/${input.run.url}`); - const content = await response.text(); - return { content, title: 'Article Title' }; - }) - .step({ slug: 'summarize' }, (input) => { - // Simulate failure on first attempt - if (input.attemptNumber === 1) { - throw new Error('Simulated failure for retry demo'); - } - return `Summary of: ${input.steps.fetch_article.title}`; - }) - .step({ slug: 'extract_keywords' }, (input) => { - // Runs parallel with summarize - return ['keyword1', 'keyword2', 'keyword3']; - }) - .step({ slug: 'publish' }, (input) => { - // Depends on both summarize and extract_keywords - return { - articleId: 'article_123', - summary: input.steps.summarize, - keywords: input.steps.extract_keywords - }; - }); + .step({ slug: 'fetch_article' }, async (input) => fetchArticle(input.run.url)) + .step({ slug: 'summarize', dependsOn: ['fetch_article'] }, (input) => + summarizeArticle(input.fetch_article.content, input.attemptNumber) + ) + .step({ slug: 'extract_keywords', dependsOn: ['fetch_article'] }, (input) => + extractKeywords(input.fetch_article.content) + ) + .step( + { slug: 'publish', dependsOn: ['summarize', 'extract_keywords'] }, + (input) => + publishArticle({ + summary: input.summarize, + keywords: input.extract_keywords, + }) + ); ``` **Key patterns:** + - Flow slug is `article_flow` (with underscore) -- Parallel execution: summarize and extractKeywords run simultaneously (both depend only on fetch_article) -- Retry simulation: Use `attemptNumber` param to fail first attempt -- Flow config: `maxAttempts: 3, baseDelay: 1, timeout: 60` +- Task functions defined separately for clarity +- Parallel execution: `summarize` and `extract_keywords` run simultaneously (both depend only on `fetch_article`) +- Retry simulation: `summarizeArticle` checks `attemptNumber` to fail first attempt +- Diamond DAG shape: 1 → 2 parallel → 1 +- Minimal config: Only `slug` and `maxAttempts` (defaults used for baseDelay/timeout) +- Explicit `dependsOn` arrays show flow structure clearly --- -### 4. Create Edge Function Worker +### 5. Create Edge Function Worker Create `apps/demo/supabase/functions/article_flow_worker/index.ts`: @@ -104,7 +140,7 @@ EdgeWorker.start(ArticleFlow); --- -### 5. Create Deno Import Map +### 6. Create Deno Import Map Create `apps/demo/supabase/functions/article_flow_worker/deno.json`: @@ -128,7 +164,7 @@ Create `apps/demo/supabase/functions/article_flow_worker/deno.json`: --- -### 6. Configure Edge Function in config.toml +### 7. Configure Edge Function in config.toml Edit `apps/demo/supabase/config.toml`, add at the end: @@ -144,7 +180,7 @@ entrypoint = "./functions/article_flow_worker/index.ts" --- -### 7. Set Environment Variables +### 8. Set Environment Variables Create `apps/demo/supabase/.env.local` with `JINA_API_KEY` (optional for now): @@ -154,7 +190,7 @@ JINA_API_KEY=your_jina_api_key_here --- -### 8. Rebuild and Re-vendor +### 9. Rebuild and Re-vendor ```bash pnpm nx build core dsl client @@ -163,7 +199,7 @@ pnpm nx sync-edge-deps demo --- -### 9. Test Edge Function Locally +### 10. Test Edge Function Locally ```bash cd apps/demo @@ -174,7 +210,7 @@ npx -y supabase@latest functions serve article_flow_worker --- -### 10. Create pgflow State Store +### 11. Create pgflow State Store Create `apps/demo/src/lib/stores/pgflow-state.svelte.ts`: @@ -199,6 +235,7 @@ export const pgflowState = new PgflowState(); **Purpose:** Central state management for flow execution, used by all UI components **Key patterns:** + - Use Svelte 5 runes: `$state` and `$derived` - Export singleton instance - Will be updated in Phase 3 when building UI @@ -207,14 +244,15 @@ export const pgflowState = new PgflowState(); ## Validation Checklist -- [ ] Article flow worker created (`article_flow_worker/`) -- [ ] 4-step flow created with simulated retry -- [ ] Worker configured in `config.toml` with `verify_jwt = false` -- [ ] Deno import map created with all dependencies -- [ ] pgflow State Store created and exported -- [ ] All dependencies installed (`@xyflow/svelte`, `shiki`) -- [ ] Edge Function serves successfully -- [ ] Build succeeds +- [x] All dependencies installed (`@xyflow/svelte`, `shiki`) +- [x] Logo assets copied to `apps/demo/static/` +- [x] Article flow worker created (`article_flow_worker/`) +- [x] 4-step flow created with simulated retry +- [x] Worker configured in `config.toml` with `verify_jwt = false` +- [x] Deno import map created with all dependencies +- [x] pgflow State Store created and exported +- [x] Edge Function serves successfully +- [x] Build succeeds --- diff --git a/PHASE_3_DAG_DEBUG.md b/PHASE_3_DAG_DEBUG.md index 504fc96f4..c4d24b7e6 100644 --- a/PHASE_3_DAG_DEBUG.md +++ b/PHASE_3_DAG_DEBUG.md @@ -19,7 +19,19 @@ ## Tasks -### 7. Create DAG Component +### 1. Verify Dependencies + +Confirm `@xyflow/svelte` was installed in Phase 2: + +```bash +ls apps/demo/node_modules/@xyflow/svelte +``` + +**If missing:** Run `cd apps/demo && pnpm add @xyflow/svelte && cd ../..` + +--- + +### 2. Create DAG Component Create `apps/demo/src/lib/components/DAGVisualization.svelte`: @@ -31,7 +43,7 @@ Use `@xyflow/svelte` to render 4 nodes: --- -### 8. Create Debug Panel Component +### 3. Create Debug Panel Component Create `apps/demo/src/lib/components/DebugPanel.svelte` with 3 sections: @@ -43,7 +55,7 @@ Create `apps/demo/src/lib/components/DebugPanel.svelte` with 3 sections: --- -### 9. Create Demo Page Layout +### 4. Create Demo Page Layout Update `apps/demo/src/routes/+page.svelte`: @@ -57,11 +69,11 @@ Update `apps/demo/src/routes/+page.svelte`: --- -### 10. Add Brand Assets and Styles +### 5. Add Brand Styles -Copy logos from website to static folder: +Verify logos were copied in Phase 2: ```bash -cp pkgs/website/src/assets/pgflow-logo-*.svg apps/demo/static/ +ls apps/demo/static/pgflow-logo-*.svg ``` Create `apps/demo/src/app.css` with pgflow brand colors: @@ -74,7 +86,7 @@ Import styles in `apps/demo/src/routes/+layout.svelte` --- -### 11. Test Complete Flow +### 6. Test Complete Flow ```bash cd apps/demo diff --git a/apps/demo/package.json b/apps/demo/package.json index 242096e3f..bbaa4a953 100644 --- a/apps/demo/package.json +++ b/apps/demo/package.json @@ -38,6 +38,9 @@ }, "dependencies": { "@pgflow/client": "workspace:*", - "@supabase/supabase-js": "^2.78.0" + "@pgflow/dsl": "workspace:*", + "@supabase/supabase-js": "^2.78.0", + "@xyflow/svelte": "^1.4.1", + "shiki": "^3.14.0" } } diff --git a/apps/demo/project.json b/apps/demo/project.json index 0bd9b38d8..5e122b701 100644 --- a/apps/demo/project.json +++ b/apps/demo/project.json @@ -6,11 +6,20 @@ "targets": { "dev": { "executor": "nx:run-commands", + "dependsOn": ["^build"], "options": { "command": "vite dev", "cwd": "apps/demo" } }, + "dev:remote": { + "executor": "nx:run-commands", + "dependsOn": ["^build"], + "options": { + "command": "vite dev --host 0.0.0.0", + "cwd": "apps/demo" + } + }, "build": { "executor": "nx:run-commands", "options": { @@ -34,6 +43,13 @@ "command": "./scripts/sync-edge-deps.sh", "cwd": "apps/demo" } + }, + "test": { + "executor": "nx:run-commands", + "options": { + "command": "deno test --allow-env --allow-net tests/", + "cwd": "apps/demo/supabase/functions/article_flow_worker" + } } } } diff --git a/apps/demo/src/lib/stores/MIGRATION_GUIDE.md b/apps/demo/src/lib/stores/MIGRATION_GUIDE.md new file mode 100644 index 000000000..a8977080e --- /dev/null +++ b/apps/demo/src/lib/stores/MIGRATION_GUIDE.md @@ -0,0 +1,229 @@ +# Migration Guide: Improved pgflow State Management + +## Summary of Improvements + +The improved pattern fixes these key issues: + +1. ✅ **Auto-discovers steps** - No more manual step lists +2. ✅ **Better abstraction** - Wraps FlowRun lifecycle, not client factory +3. ✅ **Cleaner API** - Simpler configuration, fewer parameters +4. ✅ **More flexible** - Can attach to existing runs via `getRun()` +5. ✅ **Follows docs** - Aligns with documented pgflow patterns + +## Side-by-Side Comparison + +### Creating the Store + +**Before (Original):** +```typescript +const pgflowState = createPgflowState( + pgflow, + 'article_flow', + ['fetch_article', 'summarize', 'extract_keywords', 'publish'] // ❌ Manual list +); +``` + +**After (Improved):** +```typescript +const flowState = createFlowState( + pgflow, + 'article_flow' + // ✅ Steps auto-discovered from run +); +``` + +### Starting a Flow + +**Before:** +```typescript +await pgflowState.startFlow({ url: 'https://example.com' }); +``` + +**After (Same):** +```typescript +await flowState.startFlow({ url: 'https://example.com' }); +``` + +### Accessing State + +**Before:** +```svelte +

Status: {pgflowState.status}

+

Active: {pgflowState.activeStep}

+``` + +**After (Same):** +```svelte +

Status: {flowState.status}

+

Active: {flowState.activeStep}

+``` + +### Cleanup + +**Before:** +```typescript +pgflowState.dispose(); +``` + +**After (Same):** +```typescript +flowState.dispose(); +``` + +## New Capability: Attach to Existing Runs + +The improved version can also attach to existing runs: + +```typescript +// Get a run that was started elsewhere +const existingRun = await pgflow.getRun('run-id'); + +if (existingRun) { + flowState.attachRun(existingRun); +} +``` + +This enables monitoring flows started by: +- Supabase RPC +- pg_cron +- Database triggers +- Other components + +## Complete Migration Example + +### Original Code + +```svelte + + +

{pgflowState.status}

+{#if pgflowState.activeStep} +

Active Step: {pgflowState.activeStep}

+{/if} +``` + +### Migrated Code + +```svelte + + +

{flowState.status}

+{#if flowState.activeStep} +

Active Step: {flowState.activeStep}

+{/if} +``` + +## Migration Checklist + +- [ ] Replace `createPgflowState` imports with `createFlowState` +- [ ] Remove manual step slug arrays from store creation +- [ ] Add `onDestroy` lifecycle hook for cleanup +- [ ] Update all `pgflowState` references to `flowState` (or keep original naming) +- [ ] Test that step events still fire correctly +- [ ] Verify cleanup happens on unmount + +## Why These Changes? + +### 1. Auto-Discovery is More Robust + +**Problem:** Manual step lists can get out of sync with flow definitions + +```typescript +// ❌ Error-prone: Must update in multiple places +const flow = new Flow(...) + .step({ slug: 'new_step' }, ...) // Added here + +const state = createPgflowState(..., [ + 'fetch', 'summarize' + // ❌ Forgot to add 'new_step'! +]); +``` + +**Solution:** Steps are discovered from runtime state + +```typescript +// ✅ Always in sync +const state = createFlowState(...); +await state.startFlow(...); +// Steps auto-discovered from run.stepStates +``` + +### 2. Better Separation of Concerns + +**Original approach:** +- Store wraps PgflowClient (a factory) +- Mixes client operations with state management +- Client is recreated for each flow type + +**Improved approach:** +- Store wraps FlowRun (the reactive entity) +- Client stays as documented: a factory for runs +- Each flow type gets its own state instance + +### 3. Enables Run Monitoring + +```typescript +// Monitor a flow started by pg_cron +const cron_run = await pgflow.getRun('cron-run-id'); +flowState.attachRun(cron_run); + +// Now you can track it in your UI +console.log(flowState.status); +``` + +## When to Use Each Pattern + +| Pattern | Use When | +|---------|----------| +| **createFlowState** | You need module-level state that can be shared | +| **useFlowRun** | You need component-local state with auto-cleanup | +| Original | You're migrating incrementally (keep using it) | + +## Questions? + +The improved pattern is fully compatible with the original API surface, just: +- Removes one parameter (step list) +- Adds one method (`attachRun`) +- Same reactive properties +- Same cleanup story diff --git a/apps/demo/src/lib/stores/PATTERNS.md b/apps/demo/src/lib/stores/PATTERNS.md new file mode 100644 index 000000000..2cb4d229d --- /dev/null +++ b/apps/demo/src/lib/stores/PATTERNS.md @@ -0,0 +1,222 @@ +# pgflow + Svelte Integration Patterns + +This document compares different approaches for integrating pgflow with Svelte 5 runes. + +## The Core Issue + +The current `createPgflowState` pattern has these problems: + +1. **Hardcoded step slugs** - Error-prone duplication +2. **Wraps the wrong thing** - Wraps PgflowClient (factory) instead of FlowRun (reactive entity) +3. **Manual cleanup** - No integration with component lifecycle +4. **Deviates from docs** - Documented pattern is `pgflow.startFlow()` directly + +## Recommended Pattern: `useFlowRun` + +**Best for:** Component-level state with automatic cleanup + +```svelte + + +{#if flowState} +

Status: {flowState.status}

+

Active: {flowState.activeStep}

+ + {#each flowState.events as event} +
{event.event_type} at {event.timestamp.toLocaleTimeString()}
+ {/each} +{/if} +``` + +**Advantages:** +- ✅ Follows documented pgflow patterns +- ✅ Auto-discovers steps from run state +- ✅ Automatic cleanup on unmount +- ✅ No manual step list needed +- ✅ Wraps FlowRun (correct abstraction) + +**Disadvantages:** +- ❌ Tied to component lifecycle +- ❌ Harder to share across components + +## Alternative: Store-Based Pattern + +**Best for:** Module-level state shared across components + +```typescript +// store.svelte.ts +import type { FlowRun } from '@pgflow/client'; +import type { AnyFlow } from '@pgflow/dsl'; + +export function createFlowStore() { + let run = $state | null>(null); + let status = $state('idle'); + let output = $state(null); + let events = $state([]); + + const unsubscribers = $state.raw void>>([]); + + function setRun(flowRun: FlowRun) { + // Clear previous subscriptions + unsubscribers.forEach(u => u()); + unsubscribers.length = 0; + + run = flowRun; + + // Auto-discover steps + const stepSlugs = flowRun.stepStates?.map(s => s.step_slug) || []; + + // Set up listeners... + const unsub = flowRun.on('*', event => { + events = [...events, event]; + status = event.status; + }); + + if (typeof unsub === 'function') { + unsubscribers.push(unsub); + } + } + + function dispose() { + unsubscribers.forEach(u => u()); + unsubscribers.length = 0; + run = null; + status = 'idle'; + events = []; + } + + return { + get run() { return run; }, + get status() { return status; }, + get events() { return events; }, + get output() { return output; }, + setRun, + dispose + }; +} +``` + +```svelte + + +``` + +**Advantages:** +- ✅ Can be module-level (shared across components) +- ✅ Auto-discovers steps +- ✅ Explicit control over lifecycle +- ✅ No component coupling + +**Disadvantages:** +- ❌ Manual cleanup required +- ❌ Need to remember to call dispose() + +## Comparison Matrix + +| Feature | Current Approach | useFlowRun | Store Pattern | +|---------|------------------|------------|---------------| +| Follows pgflow docs | ❌ | ✅ | ✅ | +| Auto-discover steps | ❌ | ✅ | ✅ | +| Auto cleanup | ❌ | ✅ | ❌ | +| Module-level | ✅ | ❌ | ✅ | +| Component-local | ❌ | ✅ | ❌ | +| Manual step list | ❌ | ✅ | ✅ | +| Wraps correct abstraction | ❌ | ✅ | ✅ | + +## Recommendation + +**For most use cases:** Use `useFlowRun` +- Simpler +- Automatic cleanup +- Follows documented patterns +- Auto-discovers steps + +**For shared state:** Use store pattern +- When multiple components need the same run +- When you need explicit lifecycle control +- When you want module-level state + +## Implementation Notes + +### Auto-Discovering Steps + +Both patterns discover steps from `run.stepStates`: + +```typescript +const stepSlugs = run.stepStates?.map(s => s.step_slug) || []; +``` + +This is populated by `startFlow()` / `getRun()`, so no manual list needed. + +### Type Safety + +Both patterns maintain full type safety with the Flow definition: + +```typescript +import type ArticleFlow from './article_flow'; + +const state = useFlowRun(run); +// state.output is fully typed +``` + +### Cleanup Patterns + +**Automatic (useFlowRun):** +```typescript +// Cleanup happens automatically via onDestroy +const state = useFlowRun(run); +``` + +**Manual (Store):** +```typescript +const store = createFlowStore(); +store.setRun(run); + +// Later or on unmount: +store.dispose(); +``` + +**With Svelte Context:** +```typescript +// In parent component +setContext('flow', store); +onDestroy(() => store.dispose()); + +// In child components +const flow = getContext('flow'); +``` diff --git a/apps/demo/src/lib/stores/pgflow-state-improved.svelte.ts b/apps/demo/src/lib/stores/pgflow-state-improved.svelte.ts new file mode 100644 index 000000000..5b2e0bc77 --- /dev/null +++ b/apps/demo/src/lib/stores/pgflow-state-improved.svelte.ts @@ -0,0 +1,186 @@ +import type { FlowRun, PgflowClient } from '@pgflow/client'; +import type { AnyFlow, ExtractFlowInput } from '@pgflow/dsl'; + +/** + * Improved pgflow state management for Svelte 5 + * + * Key improvements over original: + * - Auto-discovers steps from FlowRun (no manual list) + * - Wraps FlowRun instances instead of client + * - Cleaner separation of concerns + * - Follows documented pgflow patterns + */ +export function createFlowState( + client: PgflowClient, + flowSlug: string +) { + // ✅ Reactive state + let run = $state | null>(null); + let status = $state('idle'); + let output = $state(null); + let error = $state(null); + let activeStep = $state(null); + let events = $state>([]); + + // ✅ Non-reactive internals (function-scoped, effectively private) + const _client = $state.raw(client); + const _flowSlug = $state.raw(flowSlug); + const _unsubscribers = $state.raw void>>([]); + + /** + * Start a new flow run + */ + async function startFlow(input: ExtractFlowInput) { + clear(); + status = 'starting'; + + try { + const flowRun = await _client.startFlow(_flowSlug, input); + _setupRun(flowRun); + return flowRun; + } catch (err) { + status = 'error'; + error = err instanceof Error ? err.message : String(err); + throw err; + } + } + + /** + * Attach to an existing flow run (e.g., from getRun) + */ + function attachRun(flowRun: FlowRun) { + clear(); + _setupRun(flowRun); + } + + function _setupRun(flowRun: FlowRun) { + run = flowRun; + status = flowRun.status; + output = flowRun.output; + error = flowRun.error_message; + + // ✅ Auto-discover steps from run state + const stepSlugs = flowRun.stepStates?.map((s) => s.step_slug) || []; + + // Set up run-level events + const unsubRun = flowRun.on('*', (event) => { + events = [ + ...events, + { + event_type: `run:${event.status}`, + timestamp: new Date(), + data: event + } + ]; + + status = event.status; + + if (event.status === 'completed' && event.output) { + output = event.output; + } else if (event.status === 'failed') { + error = event.error_message || 'Flow failed'; + } + }); + + if (typeof unsubRun === 'function') { + _unsubscribers.push(unsubRun); + } + + // Set up step-level events (auto-discovered) + stepSlugs.forEach((stepSlug) => { + const step = flowRun.step(stepSlug); + const unsubStep = step.on('*', (event) => { + events = [ + ...events, + { + event_type: `step:${event.status}`, + timestamp: new Date(), + data: { ...event, step_slug: stepSlug } + } + ]; + + if (event.status === 'in_progress' || event.status === 'started') { + activeStep = stepSlug; + } else if (event.status === 'completed' && activeStep === stepSlug) { + activeStep = null; + } + }); + + if (typeof unsubStep === 'function') { + _unsubscribers.push(unsubStep); + } + }); + } + + function clear() { + _unsubscribers.forEach((unsub) => unsub()); + _unsubscribers.length = 0; + + run = null; + status = 'idle'; + output = null; + error = null; + activeStep = null; + events = []; + } + + /** + * Clean up subscriptions + * Call when done with the flow or on component unmount + */ + function dispose() { + clear(); + } + + return { + // Reactive state (using getters for proper reactivity) + get run() { + return run; + }, + get status() { + return status; + }, + get output() { + return output; + }, + get error() { + return error; + }, + get activeStep() { + return activeStep; + }, + get events() { + return events; + }, + + // Methods + startFlow, + attachRun, + dispose + }; +} + +/** + * Example usage: + * + * ```svelte + * + * + *

Status: {flowState.status}

+ *

Active Step: {flowState.activeStep}

+ * ``` + */ diff --git a/apps/demo/src/lib/stores/pgflow-state.svelte.ts b/apps/demo/src/lib/stores/pgflow-state.svelte.ts new file mode 100644 index 000000000..993eb5ee8 --- /dev/null +++ b/apps/demo/src/lib/stores/pgflow-state.svelte.ts @@ -0,0 +1,174 @@ +import type { FlowRun, PgflowClient } from '@pgflow/client'; +import type { AnyFlow, ExtractFlowInput } from '@pgflow/dsl'; + +interface PgflowStateConfig { + client: PgflowClient; + flowSlug: string; + stepSlugs: string[]; +} + +/** + * Svelte 5 runes-based state management for pgflow + * + * Best practices applied: + * - $state for reactive data + * - $state.raw for non-reactive objects (client, config) + * - $derived for computed values + * - Proper cleanup via dispose() + */ +class PgflowState { + // ✅ Reactive state - these trigger UI updates + run = $state | null>(null); + activeStep = $state(null); + status = $state('idle'); + output = $state(null); + events = $state>([]); + error = $state(null); + + // ✅ Non-reactive objects - don't need deep tracking + #client = $state.raw(null!); + #flowSlug = $state.raw(''); + #stepSlugs = $state.raw([]); + #unsubscribers = $state.raw void>>([]); + + constructor(config: PgflowStateConfig) { + this.#client = config.client; + this.#flowSlug = config.flowSlug; + this.#stepSlugs = config.stepSlugs; + } + + // ✅ Derived state - automatically recomputes when dependencies change + steps = $derived(() => { + if (!this.run) return new Map(); + + const stepMap = new Map(); + if (this.run.stepStates) { + this.run.stepStates.forEach((stepState) => { + stepMap.set(stepState.stepSlug, stepState); + }); + } + + return stepMap; + }); + + async startFlow(input: ExtractFlowInput) { + this.clear(); + this.status = 'starting'; + + try { + const run = await this.#client.startFlow(this.#flowSlug, input); + this.#setupRun(run); + return run; + } catch (error) { + this.status = 'error'; + this.error = error instanceof Error ? error.message : String(error); + throw error; + } + } + + #setupRun(run: FlowRun) { + this.run = run; + this.status = 'started'; + this.events = []; + this.output = null; + this.error = null; + + // Set up run-level event listeners + const unsubRun = run.on('*', (event) => { + this.#addEvent('run', event); + this.status = event.status || this.status; + + if (event.status === 'completed' && event.output) { + this.output = event.output; + } else if (event.status === 'failed') { + this.status = 'failed'; + this.error = event.error_message || 'Flow failed'; + } + }); + + // Store unsubscriber if available + if (typeof unsubRun === 'function') { + this.#unsubscribers.push(unsubRun); + } + + // Set up step-level event listeners + this.#stepSlugs.forEach((stepSlug) => { + const step = run.step(stepSlug); + const unsubStep = step.on('*', (event) => { + this.#addEvent('step', { ...event, step_slug: stepSlug }); + + if (event.status === 'in_progress' || event.status === 'started') { + this.activeStep = stepSlug; + } else if (event.status === 'completed' && this.activeStep === stepSlug) { + this.activeStep = null; + } + }); + + if (typeof unsubStep === 'function') { + this.#unsubscribers.push(unsubStep); + } + }); + } + + #addEvent(type: 'run' | 'step', data: any) { + this.events = [ + ...this.events, + { + event_type: type === 'run' ? `run:${data.status}` : `step:${data.status}`, + timestamp: new Date(), + data + } + ]; + } + + clear() { + this.run = null; + this.activeStep = null; + this.status = 'idle'; + this.output = null; + this.error = null; + this.events = []; + } + + /** + * Clean up event subscriptions + * Call this when the component unmounts or when switching flows + */ + dispose() { + this.#unsubscribers.forEach((unsub) => unsub()); + this.#unsubscribers = []; + this.clear(); + } +} + +/** + * Factory function to create a typed pgflow state instance + * + * @example + * ```ts + * import type ArticleFlow from './article_flow'; + * + * const articleFlowState = createPgflowState( + * pgflowClient, + * 'article_flow', + * ['fetch_article', 'summarize', 'extract_keywords', 'publish'] + * ); + * + * // Start the flow + * await articleFlowState.startFlow({ url: 'https://example.com' }); + * + * // Clean up when done + * articleFlowState.dispose(); + * ``` + */ +export function createPgflowState( + client: PgflowClient, + flowSlug: string, + stepSlugs: string[] +) { + return new PgflowState({ + client, + flowSlug, + stepSlugs + }); +} diff --git a/apps/demo/src/lib/stores/use-flow-run.svelte.ts b/apps/demo/src/lib/stores/use-flow-run.svelte.ts new file mode 100644 index 000000000..3680d0b06 --- /dev/null +++ b/apps/demo/src/lib/stores/use-flow-run.svelte.ts @@ -0,0 +1,137 @@ +import type { FlowRun } from '@pgflow/client'; +import type { AnyFlow } from '@pgflow/dsl'; +import { onDestroy } from 'svelte'; + +interface FlowRunEvent { + event_type: string; + timestamp: Date; + data: any; +} + +/** + * Creates reactive state for a pgflow FlowRun with automatic event handling and cleanup. + * + * This pattern follows Svelte 5 best practices and the documented pgflow client usage: + * - Use PgflowClient directly to start flows (as documented) + * - Wrap the resulting FlowRun for reactive state management + * - Automatic discovery of steps from run state + * - Automatic cleanup on component unmount + * + * @example + * ```svelte + * + * + * {#if flowState} + *

Status: {flowState.status}

+ *

Active Step: {flowState.activeStep}

+ * {/if} + * ``` + */ +export function useFlowRun(run: FlowRun) { + // ✅ Reactive state + let status = $state(run.status); + let output = $state(run.output); + let error = $state(run.error_message); + let activeStep = $state(null); + let events = $state([]); + + // ✅ Non-reactive internals + const unsubscribers = $state.raw void>>([]); + + // Auto-discover step slugs from run state + const stepSlugs = $state.raw( + run.stepStates?.map((s) => s.step_slug) || [] + ); + + // Set up run-level event listeners + const unsubRun = run.on('*', (event) => { + events = [ + ...events, + { + event_type: `run:${event.status}`, + timestamp: new Date(), + data: event + } + ]; + + status = event.status; + + if (event.status === 'completed' && event.output) { + output = event.output; + } else if (event.status === 'failed') { + error = event.error_message || 'Flow failed'; + } + }); + + if (typeof unsubRun === 'function') { + unsubscribers.push(unsubRun); + } + + // Set up step-level event listeners (auto-discovered) + stepSlugs.forEach((stepSlug) => { + const step = run.step(stepSlug); + const unsubStep = step.on('*', (event) => { + events = [ + ...events, + { + event_type: `step:${event.status}`, + timestamp: new Date(), + data: { ...event, step_slug: stepSlug } + } + ]; + + if (event.status === 'in_progress' || event.status === 'started') { + activeStep = stepSlug; + } else if (event.status === 'completed' && activeStep === stepSlug) { + activeStep = null; + } + }); + + if (typeof unsubStep === 'function') { + unsubscribers.push(unsubStep); + } + }); + + // ✅ Automatic cleanup when component unmounts + onDestroy(() => { + unsubscribers.forEach((unsub) => unsub()); + }); + + // Return reactive state (using getters for reactivity) + return { + get status() { + return status; + }, + get output() { + return output; + }, + get error() { + return error; + }, + get activeStep() { + return activeStep; + }, + get events() { + return events; + }, + get run() { + return run; + } + }; +} diff --git a/apps/demo/src/lib/supabase.ts b/apps/demo/src/lib/supabase.ts index 0008335a3..33642261a 100644 --- a/apps/demo/src/lib/supabase.ts +++ b/apps/demo/src/lib/supabase.ts @@ -1,9 +1,13 @@ import { createClient } from '@supabase/supabase-js'; import { PgflowClient } from '@pgflow/client'; -// Hardcoded local Supabase defaults (Phase 1 - production config in Phase 6) -const SUPABASE_URL = 'http://127.0.0.1:54321'; -const SUPABASE_ANON_KEY = 'sb_publishable_ACJWlzQHlZjBrEguHvfOxg_3BJgxAaH'; +// Local Supabase configuration (Phase 1 - production config in Phase 6) +// Use environment variables for remote dev: +// - Set VITE_SUPABASE_URL to your dev machine (e.g., http://pc:54321) +// - Defaults to localhost for local development +const SUPABASE_URL = import.meta.env.VITE_SUPABASE_URL || 'http://localhost:54321'; +const SUPABASE_ANON_KEY = + import.meta.env.VITE_SUPABASE_ANON_KEY || 'sb_publishable_ACJWlzQHlZjBrEguHvfOxg_3BJgxAaH'; export const supabase = createClient(SUPABASE_URL, SUPABASE_ANON_KEY); export const pgflow = new PgflowClient(supabase); diff --git a/apps/demo/src/routes/+page.svelte b/apps/demo/src/routes/+page.svelte index dcc87ea8d..5cf979338 100644 --- a/apps/demo/src/routes/+page.svelte +++ b/apps/demo/src/routes/+page.svelte @@ -1,31 +1,25 @@
@@ -37,21 +31,31 @@

Status

-

{status}

+

{flowState.status}

+ {#if flowState.activeStep} +

Active Step: {flowState.activeStep}

+ {/if} + {#if flowState.error} +

Error: {flowState.error}

+ {/if}
- {#if output} + {#if flowState.output}

Output

-
{output}
+
{JSON.stringify(flowState.output, null, 2)}
{/if} - {#if events.length > 0} + {#if flowState.events.length > 0}
-

Events

- {#each events as event} -
{event}
+

Events ({flowState.events.length})

+ {#each flowState.events as event} +
+ {event.event_type} + {event.timestamp.toLocaleTimeString()} +
{JSON.stringify(event.data, null, 2)}
+
{/each}
{/if} @@ -104,4 +108,76 @@ overflow-x: auto; font-size: 0.9rem; } + + .status-badge { + display: inline-block; + padding: 0.25rem 0.75rem; + background: #e3f2fd; + border-radius: 4px; + font-weight: 500; + text-transform: uppercase; + font-size: 0.85rem; + transition: background-color 0.3s; + } + + .status-badge.completed { + background: #c8e6c9; + color: #2e7d32; + } + + .status-badge.failed, + .status-badge.error { + background: #ffcdd2; + color: #c62828; + } + + .status-badge.starting, + .status-badge.started, + .status-badge.in_progress { + background: #fff9c4; + color: #f57f17; + } + + .active-step { + color: #666; + font-style: italic; + margin-top: 0.5rem; + } + + .error-message { + color: #c62828; + background: #ffebee; + padding: 0.5rem; + border-radius: 4px; + margin-top: 0.5rem; + border-left: 3px solid #c62828; + } + + .event-item { + margin-bottom: 1rem; + padding: 0.5rem; + border-left: 3px solid #2196f3; + background: #fafafa; + } + + .event-type { + display: inline-block; + padding: 0.125rem 0.5rem; + background: #2196f3; + color: white; + border-radius: 3px; + font-size: 0.75rem; + font-weight: 500; + margin-right: 0.5rem; + } + + .event-time { + color: #666; + font-size: 0.85rem; + } + + .event-item pre { + margin-top: 0.5rem; + margin-bottom: 0; + } diff --git a/apps/demo/static/pgflow-logo-dark.svg b/apps/demo/static/pgflow-logo-dark.svg new file mode 100644 index 000000000..66805cc8f --- /dev/null +++ b/apps/demo/static/pgflow-logo-dark.svg @@ -0,0 +1,24 @@ + + + + + + + nodes-groups + + + + + + + + + + + + + + diff --git a/apps/demo/static/pgflow-logo-light.svg b/apps/demo/static/pgflow-logo-light.svg new file mode 100644 index 000000000..7521b90c5 --- /dev/null +++ b/apps/demo/static/pgflow-logo-light.svg @@ -0,0 +1,24 @@ + + + + + + + nodes-groups + + + + + + + + + + + + + + diff --git a/apps/demo/supabase/config.toml b/apps/demo/supabase/config.toml index 89a1eaf0d..95ae37a7e 100644 --- a/apps/demo/supabase/config.toml +++ b/apps/demo/supabase/config.toml @@ -358,3 +358,14 @@ entrypoint = "./functions/test_flow_worker/index.ts" # Specifies static files to be bundled with the function. Supports glob patterns. # For example, if you want to serve static HTML pages in your function: # static_files = [ "./functions/test_flow_worker/*.html" ] + +[functions.article_flow_worker] +enabled = true +verify_jwt = false +import_map = "./functions/article_flow_worker/deno.json" +# Uncomment to specify a custom file path to the entrypoint. +# Supported file extensions are: .ts, .js, .mjs, .jsx, .tsx +entrypoint = "./functions/article_flow_worker/index.ts" +# Specifies static files to be bundled with the function. Supports glob patterns. +# For example, if you want to serve static HTML pages in your function: +# static_files = [ "./functions/article_flow_worker/*.html" ] diff --git a/apps/demo/supabase/functions/.env.example b/apps/demo/supabase/functions/.env.example new file mode 100644 index 000000000..9c643fa0d --- /dev/null +++ b/apps/demo/supabase/functions/.env.example @@ -0,0 +1,15 @@ +# Copy this file to .env and fill in your actual API keys + +# Optional: Jina API key for r.jina.ai (works without key but with rate limits) +JINA_API_KEY= + +# Required for real LLM tests (choose one provider) +# Option 1: Groq (fast and cheap) +GROQ_API_KEY= + +# Option 2: OpenAI +OPENAI_API_KEY= + +# Supabase connection (for local testing) +SUPABASE_URL=http://localhost:54321 +SUPABASE_ANON_KEY=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJzdXBhYmFzZS1kZW1vIiwicm9sZSI6ImFub24iLCJleHAiOjE5ODM4MTI5OTZ9.CRXP1A7WOeoJeXxjNni43kdQwgnWNReilDMblYTn_I0 diff --git a/apps/demo/supabase/functions/article_flow_worker/.npmrc b/apps/demo/supabase/functions/article_flow_worker/.npmrc new file mode 100644 index 000000000..48c638863 --- /dev/null +++ b/apps/demo/supabase/functions/article_flow_worker/.npmrc @@ -0,0 +1,3 @@ +# Configuration for private npm package dependencies +# For more information on using private registries with Edge Functions, see: +# https://supabase.com/docs/guides/functions/import-maps#importing-from-private-registries diff --git a/apps/demo/supabase/functions/article_flow_worker/article_flow.ts b/apps/demo/supabase/functions/article_flow_worker/article_flow.ts new file mode 100644 index 000000000..b9e3d8ca3 --- /dev/null +++ b/apps/demo/supabase/functions/article_flow_worker/article_flow.ts @@ -0,0 +1,31 @@ +import { Flow } from '@pgflow/dsl'; +import { fetchArticle } from './tasks/fetch-article.ts'; +import { summarizeArticle } from './tasks/summarize-article.ts'; +import { extractKeywords } from './tasks/extract-keywords.ts'; +import { publishArticle } from './tasks/publish-article.ts'; + +// Flow definition - clean and minimal +export default new Flow<{ url: string }>({ + slug: 'article_flow', + maxAttempts: 3 +}) + .step({ slug: 'fetch_article' }, async (input) => fetchArticle(input.run.url)) + .step({ slug: 'summarize', dependsOn: ['fetch_article'] }, async (input, context) => { + const attemptNumber = context.rawMessage.read_ct; + + // Simulate failure on first attempt for retry demo + if (attemptNumber === 1) { + throw new Error('Simulated failure for retry demo'); + } + + return summarizeArticle(input.fetch_article.content); + }) + .step({ slug: 'extract_keywords', dependsOn: ['fetch_article'] }, async (input) => + extractKeywords(input.fetch_article.content) + ) + .step({ slug: 'publish', dependsOn: ['summarize', 'extract_keywords'] }, (input) => + publishArticle({ + summary: input.summarize, + keywords: input.extract_keywords + }) + ); diff --git a/apps/demo/supabase/functions/article_flow_worker/deno.json b/apps/demo/supabase/functions/article_flow_worker/deno.json new file mode 100644 index 000000000..1f1166b25 --- /dev/null +++ b/apps/demo/supabase/functions/article_flow_worker/deno.json @@ -0,0 +1,15 @@ +{ + "imports": { + "@pgflow/core": "../_vendor/@pgflow/core/index.ts", + "@pgflow/core/": "../_vendor/@pgflow/core/", + "@pgflow/dsl": "../_vendor/@pgflow/dsl/index.ts", + "@pgflow/dsl/": "../_vendor/@pgflow/dsl/", + "@pgflow/dsl/supabase": "../_vendor/@pgflow/dsl/src/supabase.ts", + "@pgflow/edge-worker": "../_vendor/@pgflow/edge-worker/index.ts", + "@pgflow/edge-worker/": "../_vendor/@pgflow/edge-worker/", + "@pgflow/edge-worker/_internal": "../_vendor/@pgflow/edge-worker/_internal.ts", + "postgres": "npm:postgres@3.4.5", + "@henrygd/queue": "jsr:@henrygd/queue@^1.0.7", + "@supabase/supabase-js": "jsr:@supabase/supabase-js@^2.49.4" + } +} \ No newline at end of file diff --git a/apps/demo/supabase/functions/article_flow_worker/deno.lock b/apps/demo/supabase/functions/article_flow_worker/deno.lock new file mode 100644 index 000000000..a19fb8c00 --- /dev/null +++ b/apps/demo/supabase/functions/article_flow_worker/deno.lock @@ -0,0 +1,45 @@ +{ + "version": "3", + "remote": { + "https://deno.land/std@0.208.0/assert/_constants.ts": "8a9da298c26750b28b326b297316cdde860bc237533b07e1337c021379e6b2a9", + "https://deno.land/std@0.208.0/assert/_diff.ts": "58e1461cc61d8eb1eacbf2a010932bf6a05b79344b02ca38095f9b805795dc48", + "https://deno.land/std@0.208.0/assert/_format.ts": "a69126e8a469009adf4cf2a50af889aca364c349797e63174884a52ff75cf4c7", + "https://deno.land/std@0.208.0/assert/assert.ts": "9a97dad6d98c238938e7540736b826440ad8c1c1e54430ca4c4e623e585607ee", + "https://deno.land/std@0.208.0/assert/assert_almost_equals.ts": "e15ca1f34d0d5e0afae63b3f5d975cbd18335a132e42b0c747d282f62ad2cd6c", + "https://deno.land/std@0.208.0/assert/assert_array_includes.ts": "6856d7f2c3544bc6e62fb4646dfefa3d1df5ff14744d1bca19f0cbaf3b0d66c9", + "https://deno.land/std@0.208.0/assert/assert_equals.ts": "d8ec8a22447fbaf2fc9d7c3ed2e66790fdb74beae3e482855d75782218d68227", + "https://deno.land/std@0.208.0/assert/assert_exists.ts": "407cb6b9fb23a835cd8d5ad804e2e2edbbbf3870e322d53f79e1c7a512e2efd7", + "https://deno.land/std@0.208.0/assert/assert_false.ts": "0ccbcaae910f52c857192ff16ea08bda40fdc79de80846c206bfc061e8c851c6", + "https://deno.land/std@0.208.0/assert/assert_greater.ts": "ae2158a2d19313bf675bf7251d31c6dc52973edb12ac64ac8fc7064152af3e63", + "https://deno.land/std@0.208.0/assert/assert_greater_or_equal.ts": "1439da5ebbe20855446cac50097ac78b9742abe8e9a43e7de1ce1426d556e89c", + "https://deno.land/std@0.208.0/assert/assert_instance_of.ts": "3aedb3d8186e120812d2b3a5dea66a6e42bf8c57a8bd927645770bd21eea554c", + "https://deno.land/std@0.208.0/assert/assert_is_error.ts": "c21113094a51a296ffaf036767d616a78a2ae5f9f7bbd464cd0197476498b94b", + "https://deno.land/std@0.208.0/assert/assert_less.ts": "aec695db57db42ec3e2b62e97e1e93db0063f5a6ec133326cc290ff4b71b47e4", + "https://deno.land/std@0.208.0/assert/assert_less_or_equal.ts": "5fa8b6a3ffa20fd0a05032fe7257bf985d207b85685fdbcd23651b70f928c848", + "https://deno.land/std@0.208.0/assert/assert_match.ts": "c4083f80600bc190309903c95e397a7c9257ff8b5ae5c7ef91e834704e672e9b", + "https://deno.land/std@0.208.0/assert/assert_not_equals.ts": "9f1acab95bd1f5fc9a1b17b8027d894509a745d91bac1718fdab51dc76831754", + "https://deno.land/std@0.208.0/assert/assert_not_instance_of.ts": "0c14d3dfd9ab7a5276ed8ed0b18c703d79a3d106102077ec437bfe7ed912bd22", + "https://deno.land/std@0.208.0/assert/assert_not_match.ts": "3796a5b0c57a1ce6c1c57883dd4286be13a26f715ea662318ab43a8491a13ab0", + "https://deno.land/std@0.208.0/assert/assert_not_strict_equals.ts": "4cdef83df17488df555c8aac1f7f5ec2b84ad161b6d0645ccdbcc17654e80c99", + "https://deno.land/std@0.208.0/assert/assert_object_match.ts": "d8fc2867cfd92eeacf9cea621e10336b666de1874a6767b5ec48988838370b54", + "https://deno.land/std@0.208.0/assert/assert_rejects.ts": "45c59724de2701e3b1f67c391d6c71c392363635aad3f68a1b3408f9efca0057", + "https://deno.land/std@0.208.0/assert/assert_strict_equals.ts": "b1f538a7ea5f8348aeca261d4f9ca603127c665e0f2bbfeb91fa272787c87265", + "https://deno.land/std@0.208.0/assert/assert_string_includes.ts": "b821d39ebf5cb0200a348863c86d8c4c4b398e02012ce74ad15666fc4b631b0c", + "https://deno.land/std@0.208.0/assert/assert_throws.ts": "63784e951475cb7bdfd59878cd25a0931e18f6dc32a6077c454b2cd94f4f4bcd", + "https://deno.land/std@0.208.0/assert/assertion_error.ts": "4d0bde9b374dfbcbe8ac23f54f567b77024fb67dbb1906a852d67fe050d42f56", + "https://deno.land/std@0.208.0/assert/equal.ts": "9f1a46d5993966d2596c44e5858eec821859b45f783a5ee2f7a695dfc12d8ece", + "https://deno.land/std@0.208.0/assert/fail.ts": "c36353d7ae6e1f7933d45f8ea51e358c8c4b67d7e7502028598fe1fea062e278", + "https://deno.land/std@0.208.0/assert/mod.ts": "37c49a26aae2b254bbe25723434dc28cd7532e444cf0b481a97c045d110ec085", + "https://deno.land/std@0.208.0/assert/unimplemented.ts": "d56fbeecb1f108331a380f72e3e010a1f161baa6956fd0f7cf3e095ae1a4c75a", + "https://deno.land/std@0.208.0/assert/unreachable.ts": "4600dc0baf7d9c15a7f7d234f00c23bca8f3eba8b140286aaca7aa998cf9a536", + "https://deno.land/std@0.208.0/dotenv/mod.ts": "039468f5c87d39b69d7ca6c3d68ebca82f206ec0ff5e011d48205eea292ea5a6", + "https://deno.land/std@0.208.0/fmt/colors.ts": "34b3f77432925eb72cf0bfb351616949746768620b8e5ead66da532f93d10ba2" + }, + "workspace": { + "dependencies": [ + "jsr:@henrygd/queue@^1.0.7", + "jsr:@supabase/supabase-js@^2.49.4", + "npm:postgres@3.4.5" + ] + } +} diff --git a/apps/demo/supabase/functions/article_flow_worker/index.ts b/apps/demo/supabase/functions/article_flow_worker/index.ts new file mode 100644 index 000000000..83df2a51c --- /dev/null +++ b/apps/demo/supabase/functions/article_flow_worker/index.ts @@ -0,0 +1,4 @@ +import { EdgeWorker } from '@pgflow/edge-worker'; +import ArticleFlow from './article_flow.ts'; + +EdgeWorker.start(ArticleFlow); \ No newline at end of file diff --git a/apps/demo/supabase/functions/article_flow_worker/tasks/extract-keywords.ts b/apps/demo/supabase/functions/article_flow_worker/tasks/extract-keywords.ts new file mode 100644 index 000000000..0c457014b --- /dev/null +++ b/apps/demo/supabase/functions/article_flow_worker/tasks/extract-keywords.ts @@ -0,0 +1,124 @@ +/** + * Extracts keywords from article content using LLM or fallback + */ + +export async function extractKeywords(content: string) { + // Try to use real LLM if API key is available + const groqApiKey = Deno.env.get('GROQ_API_KEY'); + const openaiApiKey = Deno.env.get('OPENAI_API_KEY'); + + if (groqApiKey) { + return await extractWithGroq(content, groqApiKey); + } else if (openaiApiKey) { + return await extractWithOpenAI(content, openaiApiKey); + } else { + // Fallback to simple extraction if no API keys + return mockExtractKeywords(content); + } +} + +async function extractWithGroq(content: string, apiKey: string) { + const response = await fetch('https://api.groq.com/openai/v1/chat/completions', { + method: 'POST', + headers: { + 'Authorization': `Bearer ${apiKey}`, + 'Content-Type': 'application/json', + }, + body: JSON.stringify({ + model: 'llama-3.1-8b-instant', + messages: [ + { + role: 'system', + content: 'Extract 5 key topics or keywords from the article. Return only the keywords as a comma-separated list, no other text.' + }, + { + role: 'user', + content: `Extract keywords from this article:\n\n${content.slice(0, 4000)}` + } + ], + temperature: 0.3, + max_tokens: 100 + }) + }); + + if (!response.ok) { + const error = await response.text(); + throw new Error(`Groq API error: ${response.status} - ${error}`); + } + + const data = await response.json(); + const keywordsText = data.choices[0].message.content; + const keywords = keywordsText.split(',').map((k: string) => k.trim()).filter((k: string) => k.length > 0); + + return { + keywords: keywords.slice(0, 5) + }; +} + +async function extractWithOpenAI(content: string, apiKey: string) { + const response = await fetch('https://api.openai.com/v1/chat/completions', { + method: 'POST', + headers: { + 'Authorization': `Bearer ${apiKey}`, + 'Content-Type': 'application/json', + }, + body: JSON.stringify({ + model: 'gpt-3.5-turbo', + messages: [ + { + role: 'system', + content: 'Extract 5 key topics or keywords from the article. Return only the keywords as a comma-separated list, no other text.' + }, + { + role: 'user', + content: `Extract keywords from this article:\n\n${content.slice(0, 4000)}` + } + ], + temperature: 0.3, + max_tokens: 100 + }) + }); + + if (!response.ok) { + const error = await response.text(); + throw new Error(`OpenAI API error: ${response.status} - ${error}`); + } + + const data = await response.json(); + const keywordsText = data.choices[0].message.content; + const keywords = keywordsText.split(',').map((k: string) => k.trim()).filter((k: string) => k.length > 0); + + return { + keywords: keywords.slice(0, 5) + }; +} + +function mockExtractKeywords(content: string) { + // Simple word frequency approach for demo + const words = content + .toLowerCase() + .replace(/[^\w\s]/g, '') + .split(/\s+/) + .filter(word => word.length > 4); // Only words longer than 4 chars + + // Count word frequency + const wordCount = new Map(); + words.forEach(word => { + wordCount.set(word, (wordCount.get(word) || 0) + 1); + }); + + // Get top 5 most frequent words as keywords + const keywords = Array.from(wordCount.entries()) + .sort((a, b) => b[1] - a[1]) + .slice(0, 5) + .map(([word]) => word); + + // If we don't have enough keywords, add some defaults + if (keywords.length < 3) { + keywords.push('technology', 'innovation', 'article'); + } + + return { + keywords: keywords.slice(0, 5) + }; +} \ No newline at end of file diff --git a/apps/demo/supabase/functions/article_flow_worker/tasks/fetch-article.ts b/apps/demo/supabase/functions/article_flow_worker/tasks/fetch-article.ts new file mode 100644 index 000000000..8c7a0870b --- /dev/null +++ b/apps/demo/supabase/functions/article_flow_worker/tasks/fetch-article.ts @@ -0,0 +1,46 @@ +/** + * Fetches article content from a given URL using Jina Reader API + */ + +export async function fetchArticle(url: string) { + const jinaUrl = `https://r.jina.ai/${url}`; + + try { + const response = await fetch(jinaUrl, { + // headers: { + // // Optional: Add Jina API key if available + // ...(Deno.env.get('JINA_API_KEY') && { + // 'Authorization': `Bearer ${Deno.env.get('JINA_API_KEY')}` + // }) + // } + }); + + if (!response.ok) { + throw new Error(`Failed to fetch article: ${response.status} ${response.statusText}`); + } + + const content = await response.text(); + + // Try to extract title from the content + // Jina typically puts the title in the first line or as markdown heading + const lines = content.split('\n'); + let title = 'Untitled Article'; + + for (const line of lines) { + const trimmed = line.trim(); + if (trimmed && !trimmed.startsWith('http')) { + // Remove markdown heading markers if present + title = trimmed.replace(/^#+\s*/, ''); + break; + } + } + + return { + content, + title + }; + } catch (error) { + console.error('Error fetching article:', error); + throw new Error(`Failed to fetch article from ${url}: ${error.message}`); + } +} diff --git a/apps/demo/supabase/functions/article_flow_worker/tasks/publish-article.ts b/apps/demo/supabase/functions/article_flow_worker/tasks/publish-article.ts new file mode 100644 index 000000000..d1406b99e --- /dev/null +++ b/apps/demo/supabase/functions/article_flow_worker/tasks/publish-article.ts @@ -0,0 +1,15 @@ +/** + * Publishes the processed article + * For demo purposes, just generates a mock article ID + */ + +export function publishArticle(data: { summary: any; keywords: any }) { + // Generate a mock article ID + const articleId = `art_${crypto.randomUUID()}`; + + return { + articleId, + publishedAt: new Date().toISOString(), + ...data + }; +} \ No newline at end of file diff --git a/apps/demo/supabase/functions/article_flow_worker/tasks/summarize-article.ts b/apps/demo/supabase/functions/article_flow_worker/tasks/summarize-article.ts new file mode 100644 index 000000000..1dc0b3ff6 --- /dev/null +++ b/apps/demo/supabase/functions/article_flow_worker/tasks/summarize-article.ts @@ -0,0 +1,119 @@ +/** + * Summarizes article content using LLM + * Simulates failure on first attempt for demo purposes + */ + +export async function summarizeArticle(content: string) { + // Try to use real LLM if API key is available + const groqApiKey = Deno.env.get('GROQ_API_KEY'); + const openaiApiKey = Deno.env.get('OPENAI_API_KEY'); + + if (groqApiKey) { + return await summarizeWithGroq(content, groqApiKey); + } else if (openaiApiKey) { + return await summarizeWithOpenAI(content, openaiApiKey); + } else { + // Fallback to mock summary if no API keys + return mockSummarize(content); + } +} + +async function summarizeWithGroq(content: string, apiKey: string) { + const response = await fetch('https://api.groq.com/openai/v1/chat/completions', { + method: 'POST', + headers: { + Authorization: `Bearer ${apiKey}`, + 'Content-Type': 'application/json' + }, + body: JSON.stringify({ + model: 'llama-3.1-8b-instant', + messages: [ + { + role: 'system', + content: + 'You are a helpful assistant that summarizes articles concisely. Also determine the overall sentiment (positive, negative, or neutral).' + }, + { + role: 'user', + content: `Summarize this article in 2-3 sentences and determine its sentiment:\n\n${content.slice(0, 4000)}` + } + ], + temperature: 0.7, + max_tokens: 200 + }) + }); + + if (!response.ok) { + const error = await response.text(); + throw new Error(`Groq API error: ${response.status} - ${error}`); + } + + const data = await response.json(); + const fullResponse = data.choices[0].message.content; + + // Try to extract sentiment from response, default to neutral + let sentiment = 'neutral'; + if (fullResponse.toLowerCase().includes('positive')) sentiment = 'positive'; + else if (fullResponse.toLowerCase().includes('negative')) sentiment = 'negative'; + + return { + summary: fullResponse, + sentiment + }; +} + +async function summarizeWithOpenAI(content: string, apiKey: string) { + const response = await fetch('https://api.openai.com/v1/chat/completions', { + method: 'POST', + headers: { + Authorization: `Bearer ${apiKey}`, + 'Content-Type': 'application/json' + }, + body: JSON.stringify({ + model: 'gpt-3.5-turbo', + messages: [ + { + role: 'system', + content: + 'You are a helpful assistant that summarizes articles concisely. Also determine the overall sentiment (positive, negative, or neutral).' + }, + { + role: 'user', + content: `Summarize this article in 2-3 sentences and determine its sentiment:\n\n${content.slice(0, 4000)}` + } + ], + temperature: 0.7, + max_tokens: 200 + }) + }); + + if (!response.ok) { + const error = await response.text(); + throw new Error(`OpenAI API error: ${response.status} - ${error}`); + } + + const data = await response.json(); + const fullResponse = data.choices[0].message.content; + + // Try to extract sentiment from response, default to neutral + let sentiment = 'neutral'; + if (fullResponse.toLowerCase().includes('positive')) sentiment = 'positive'; + else if (fullResponse.toLowerCase().includes('negative')) sentiment = 'negative'; + + return { + summary: fullResponse, + sentiment + }; +} + +function mockSummarize(content: string) { + const wordCount = content.split(/\s+/).length; + const summary = + `This article contains approximately ${wordCount} words and discusses various topics. ` + + `It presents key insights and information that readers will find valuable.`; + + return { + summary, + sentiment: 'positive' + }; +} diff --git a/apps/demo/supabase/functions/article_flow_worker/test-local.sh b/apps/demo/supabase/functions/article_flow_worker/test-local.sh new file mode 100755 index 000000000..7fca95d05 --- /dev/null +++ b/apps/demo/supabase/functions/article_flow_worker/test-local.sh @@ -0,0 +1,13 @@ +#!/bin/bash + +echo "Testing article_flow_worker Edge Function locally..." +echo "" +echo "Make sure you've started Supabase with: supabase start" +echo "And served the function with: supabase functions serve article_flow_worker" +echo "" +echo "Testing with a sample HN article URL..." +echo "" + +curl -i --location --request POST 'http://localhost:54321/functions/v1/article_flow_worker' \ + --header 'Content-Type: application/json' \ + --data '{"url":"https://news.ycombinator.com/item?id=35629516"}' \ No newline at end of file diff --git a/apps/demo/supabase/functions/article_flow_worker/tests/extract-keywords.test.ts b/apps/demo/supabase/functions/article_flow_worker/tests/extract-keywords.test.ts new file mode 100644 index 000000000..37e9a82df --- /dev/null +++ b/apps/demo/supabase/functions/article_flow_worker/tests/extract-keywords.test.ts @@ -0,0 +1,107 @@ +import { assertEquals, assert } from 'https://deno.land/std@0.208.0/assert/mod.ts'; +import { extractKeywords } from '../tasks/extract-keywords.ts'; +import { load } from 'https://deno.land/std@0.208.0/dotenv/mod.ts'; + +// Load environment variables from .env file if it exists +await load({ envPath: '../.env', export: true }).catch(() => { + console.log('No .env file found, using environment variables'); +}); + +const testContent = ` +Artificial intelligence and machine learning are revolutionizing technology. +Deep learning neural networks enable powerful pattern recognition. +Natural language processing helps computers understand human language. +Computer vision allows machines to interpret visual information. +These artificial intelligence technologies are transforming industries worldwide. +`; + +Deno.test('extractKeywords - extracts keywords with mock function', async () => { + // Temporarily clear API keys to test mock behavior + const groqKey = Deno.env.get('GROQ_API_KEY'); + const openaiKey = Deno.env.get('OPENAI_API_KEY'); + + Deno.env.delete('GROQ_API_KEY'); + Deno.env.delete('OPENAI_API_KEY'); + + const result = await extractKeywords(testContent); + + assert(result.keywords, 'Should have keywords array'); + assert(Array.isArray(result.keywords), 'Keywords should be an array'); + assert(result.keywords.length > 0, 'Should extract at least one keyword'); + assert(result.keywords.length <= 5, 'Should not exceed 5 keywords'); + + console.log('✓ Mock keyword extraction works'); + console.log(` Keywords: ${result.keywords.join(', ')}`); + + // Restore API keys + if (groqKey) Deno.env.set('GROQ_API_KEY', groqKey); + if (openaiKey) Deno.env.set('OPENAI_API_KEY', openaiKey); +}); + +Deno.test('extractKeywords - works with Groq API if key provided', async () => { + const hasGroqKey = !!Deno.env.get('GROQ_API_KEY'); + + if (!hasGroqKey) { + console.log('⚠ Skipping Groq API test (no GROQ_API_KEY in environment)'); + console.log(' To run this test, copy .env.example to .env and add your Groq API key'); + return; + } + + const result = await extractKeywords(testContent); + + assert(result.keywords, 'Should have keywords array'); + assert(Array.isArray(result.keywords), 'Keywords should be an array'); + assert(result.keywords.length > 0, 'Should extract at least one keyword'); + assert(result.keywords.length <= 5, 'Should not exceed 5 keywords'); + + // Should likely find AI-related keywords in our test content + const keywordsLower = result.keywords.map(k => k.toLowerCase()); + const hasRelevantKeyword = keywordsLower.some(k => + k.includes('artificial') || k.includes('intelligence') || + k.includes('ai') || k.includes('machine') || k.includes('learning') + ); + assert(hasRelevantKeyword, 'Should extract relevant keywords from content'); + + console.log('✓ Groq API keyword extraction works'); + console.log(` Keywords: ${result.keywords.join(', ')}`); +}); + +Deno.test('extractKeywords - works with OpenAI API if key provided', async () => { + const hasOpenAIKey = !!Deno.env.get('OPENAI_API_KEY'); + + if (!hasOpenAIKey) { + console.log('⚠ Skipping OpenAI API test (no OPENAI_API_KEY in environment)'); + console.log(' To run this test, copy .env.example to .env and add your OpenAI API key'); + return; + } + + // Temporarily remove Groq key to test OpenAI + const groqKey = Deno.env.get('GROQ_API_KEY'); + Deno.env.delete('GROQ_API_KEY'); + + const result = await extractKeywords(testContent); + + assert(result.keywords, 'Should have keywords array'); + assert(Array.isArray(result.keywords), 'Keywords should be an array'); + assert(result.keywords.length > 0, 'Should extract at least one keyword'); + assert(result.keywords.length <= 5, 'Should not exceed 5 keywords'); + + console.log('✓ OpenAI API keyword extraction works'); + console.log(` Keywords: ${result.keywords.join(', ')}`); + + // Restore Groq key + if (groqKey) Deno.env.set('GROQ_API_KEY', groqKey); +}); + +Deno.test('extractKeywords - handles short content', async () => { + const shortContent = 'This is a very short piece of text.'; + + const result = await extractKeywords(shortContent); + + assert(result.keywords, 'Should handle short content'); + assert(Array.isArray(result.keywords), 'Keywords should be an array'); + assert(result.keywords.length > 0, 'Should extract keywords even from short content'); + + console.log('✓ Handles short content'); + console.log(` Keywords from short text: ${result.keywords.join(', ')}`); +}); \ No newline at end of file diff --git a/apps/demo/supabase/functions/article_flow_worker/tests/fetch-article.test.ts b/apps/demo/supabase/functions/article_flow_worker/tests/fetch-article.test.ts new file mode 100644 index 000000000..3996a0300 --- /dev/null +++ b/apps/demo/supabase/functions/article_flow_worker/tests/fetch-article.test.ts @@ -0,0 +1,71 @@ +import { assertEquals, assert } from 'https://deno.land/std@0.208.0/assert/mod.ts'; +import { fetchArticle } from '../tasks/fetch-article.ts'; +import { load } from 'https://deno.land/std@0.208.0/dotenv/mod.ts'; + +// Load environment variables from .env file if it exists +await load({ envPath: '../.env', export: true }).catch(() => { + console.log('No .env file found, using environment variables'); +}); + +Deno.test('fetchArticle - fetches real article from Hacker News', async () => { + // Use a stable HN article URL that should always exist + const url = 'https://news.ycombinator.com/item?id=35629516'; + + const result = await fetchArticle(url); + + // Verify we got a result with both content and title + assert(result.content, 'Should have content'); + assert(result.title, 'Should have title'); + assert(result.content.length > 100, 'Content should be substantial'); + assert(result.title !== 'Untitled Article', 'Should extract a real title'); + + console.log(`✓ Fetched article: "${result.title}" (${result.content.length} chars)`); +}); + +Deno.test('fetchArticle - fetches real article from TechCrunch', async () => { + // Use TechCrunch homepage which should always work + const url = 'https://techcrunch.com'; + + const result = await fetchArticle(url); + + assert(result.content, 'Should have content'); + assert(result.title, 'Should have title'); + assert(result.content.length > 100, 'Content should be substantial'); + + console.log(`✓ Fetched article: "${result.title}" (${result.content.length} chars)`); +}); + +Deno.test({ + name: 'fetchArticle - handles non-existent URL gracefully', + sanitizeResources: false, // Disable resource leak check for this test + fn: async () => { + const url = 'https://this-domain-definitely-does-not-exist-12345.com/article'; + + try { + await fetchArticle(url); + assert(false, 'Should have thrown an error'); + } catch (error) { + assert(error instanceof Error); + assert(error.message.includes('Failed to fetch')); + console.log('✓ Properly handles fetch errors'); + } + } +}); + +// Test with Jina API key if available +Deno.test('fetchArticle - works with Jina API key if provided', async () => { + const hasApiKey = !!Deno.env.get('JINA_API_KEY'); + + if (!hasApiKey) { + console.log('⚠ Skipping Jina API key test (no JINA_API_KEY in environment)'); + return; + } + + const url = 'https://example.com'; + const result = await fetchArticle(url); + + assert(result.content, 'Should have content'); + assert(result.title, 'Should have title'); + + console.log(`✓ Fetched with API key: "${result.title}"`); +}); \ No newline at end of file diff --git a/apps/demo/supabase/functions/article_flow_worker/tests/publish-article.test.ts b/apps/demo/supabase/functions/article_flow_worker/tests/publish-article.test.ts new file mode 100644 index 000000000..78c46a9f2 --- /dev/null +++ b/apps/demo/supabase/functions/article_flow_worker/tests/publish-article.test.ts @@ -0,0 +1,68 @@ +import { assertEquals, assert } from 'https://deno.land/std@0.208.0/assert/mod.ts'; +import { publishArticle } from '../tasks/publish-article.ts'; + +Deno.test('publishArticle - generates article ID and timestamp', () => { + const data = { + summary: { summary: 'Test summary', sentiment: 'positive' }, + keywords: { keywords: ['test', 'article', 'keywords'] } + }; + + const result = publishArticle(data); + + // Check that required fields exist + assert(result.articleId, 'Should have articleId'); + assert(result.publishedAt, 'Should have publishedAt timestamp'); + assert(result.summary, 'Should include summary data'); + assert(result.keywords, 'Should include keywords data'); + + // Verify articleId format (starts with art_ and has UUID format) + assert(result.articleId.startsWith('art_'), 'Article ID should start with art_'); + assert(result.articleId.length > 10, 'Article ID should be substantial'); + + // Verify timestamp is valid ISO string + const timestamp = new Date(result.publishedAt); + assert(!isNaN(timestamp.getTime()), 'Timestamp should be valid date'); + + console.log('✓ Article publishing works'); + console.log(` Article ID: ${result.articleId}`); + console.log(` Published at: ${result.publishedAt}`); +}); + +Deno.test('publishArticle - includes all input data in output', () => { + const complexData = { + summary: { + summary: 'Complex test summary with multiple sentences.', + sentiment: 'neutral' + }, + keywords: { + keywords: ['artificial', 'intelligence', 'machine', 'learning', 'technology'] + } + }; + + const result = publishArticle(complexData); + + // Verify all input data is preserved + assertEquals(result.summary, complexData.summary); + assertEquals(result.keywords, complexData.keywords); + + console.log('✓ All input data preserved in output'); +}); + +Deno.test('publishArticle - generates unique IDs', () => { + const data = { + summary: { summary: 'Test', sentiment: 'positive' }, + keywords: { keywords: ['test'] } + }; + + const result1 = publishArticle(data); + const result2 = publishArticle(data); + const result3 = publishArticle(data); + + // All IDs should be unique + assert(result1.articleId !== result2.articleId, 'IDs should be unique'); + assert(result2.articleId !== result3.articleId, 'IDs should be unique'); + assert(result1.articleId !== result3.articleId, 'IDs should be unique'); + + console.log('✓ Generates unique article IDs'); + console.log(` Sample IDs: ${result1.articleId}, ${result2.articleId}`); +}); \ No newline at end of file diff --git a/apps/demo/supabase/functions/article_flow_worker/tests/summarize-article.test.ts b/apps/demo/supabase/functions/article_flow_worker/tests/summarize-article.test.ts new file mode 100644 index 000000000..81e7bd78b --- /dev/null +++ b/apps/demo/supabase/functions/article_flow_worker/tests/summarize-article.test.ts @@ -0,0 +1,109 @@ +import { assertEquals, assert, assertRejects } from 'https://deno.land/std@0.208.0/assert/mod.ts'; +import { summarizeArticle } from '../tasks/summarize-article.ts'; +import { load } from 'https://deno.land/std@0.208.0/dotenv/mod.ts'; + +// Load environment variables from .env file if it exists +await load({ envPath: '../.env', export: true }).catch(() => { + console.log('No .env file found, using environment variables'); +}); + +const testContent = ` +Artificial intelligence is rapidly transforming how we work and live. +Machine learning models are becoming more sophisticated and accessible. +Natural language processing has made significant breakthroughs recently. +Companies are investing heavily in AI research and development. +The future of technology is closely tied to advances in artificial intelligence. +`; + +Deno.test('summarizeArticle - fails on first attempt (retry simulation)', async () => { + // First attempt should always throw an error (simulated failure) + await assertRejects( + async () => await summarizeArticle(testContent, 1), + Error, + 'Simulated failure for retry demo' + ); + console.log('✓ First attempt fails as expected (retry simulation)'); +}); + +Deno.test('summarizeArticle - succeeds on second attempt with mock data', async () => { + // Temporarily clear API keys to test mock behavior + const groqKey = Deno.env.get('GROQ_API_KEY'); + const openaiKey = Deno.env.get('OPENAI_API_KEY'); + + Deno.env.delete('GROQ_API_KEY'); + Deno.env.delete('OPENAI_API_KEY'); + + const result = await summarizeArticle(testContent, 2); + + assert(result.summary, 'Should have summary'); + assert(result.sentiment, 'Should have sentiment'); + assert(result.summary.includes('words'), 'Mock summary should mention word count'); + + console.log('✓ Mock summary works on second attempt'); + + // Restore API keys + if (groqKey) Deno.env.set('GROQ_API_KEY', groqKey); + if (openaiKey) Deno.env.set('OPENAI_API_KEY', openaiKey); +}); + +Deno.test('summarizeArticle - works with Groq API if key provided', async () => { + const hasGroqKey = !!Deno.env.get('GROQ_API_KEY'); + + if (!hasGroqKey) { + console.log('⚠ Skipping Groq API test (no GROQ_API_KEY in environment)'); + console.log(' To run this test, copy .env.example to .env and add your Groq API key'); + return; + } + + const result = await summarizeArticle(testContent, 2); + + assert(result.summary, 'Should have summary'); + assert(result.sentiment, 'Should have sentiment'); + assert(['positive', 'negative', 'neutral'].includes(result.sentiment), 'Should have valid sentiment'); + assert(result.summary.length > 20, 'Summary should be substantial'); + + console.log('✓ Groq API summarization works'); + console.log(` Summary: ${result.summary.substring(0, 100)}...`); + console.log(` Sentiment: ${result.sentiment}`); +}); + +Deno.test('summarizeArticle - works with OpenAI API if key provided', async () => { + const hasOpenAIKey = !!Deno.env.get('OPENAI_API_KEY'); + const hasGroqKey = !!Deno.env.get('GROQ_API_KEY'); + + if (!hasOpenAIKey) { + console.log('⚠ Skipping OpenAI API test (no OPENAI_API_KEY in environment)'); + console.log(' To run this test, copy .env.example to .env and add your OpenAI API key'); + return; + } + + // Temporarily remove Groq key to test OpenAI + const groqKey = Deno.env.get('GROQ_API_KEY'); + Deno.env.delete('GROQ_API_KEY'); + + const result = await summarizeArticle(testContent, 2); + + assert(result.summary, 'Should have summary'); + assert(result.sentiment, 'Should have sentiment'); + assert(['positive', 'negative', 'neutral'].includes(result.sentiment), 'Should have valid sentiment'); + assert(result.summary.length > 20, 'Summary should be substantial'); + + console.log('✓ OpenAI API summarization works'); + console.log(` Summary: ${result.summary.substring(0, 100)}...`); + console.log(` Sentiment: ${result.sentiment}`); + + // Restore Groq key + if (groqKey) Deno.env.set('GROQ_API_KEY', groqKey); +}); + +Deno.test('summarizeArticle - handles long content', async () => { + // Create a longer piece of content + const longContent = testContent.repeat(100); // Make it much longer + + const result = await summarizeArticle(longContent, 2); + + assert(result.summary, 'Should handle long content'); + assert(result.sentiment, 'Should determine sentiment for long content'); + + console.log('✓ Handles long content properly'); +}); \ No newline at end of file diff --git a/apps/demo/supabase/functions/article_flow_worker/tests/test-helpers.ts b/apps/demo/supabase/functions/article_flow_worker/tests/test-helpers.ts new file mode 100644 index 000000000..fb67981bd --- /dev/null +++ b/apps/demo/supabase/functions/article_flow_worker/tests/test-helpers.ts @@ -0,0 +1,37 @@ +/** + * Test helpers and mock data for testing + */ + +export const mockArticleContent = ` +# Test Article Title + +This is a test article with some content. + +## Introduction + +This article discusses testing and development practices. +We'll cover various topics including TypeScript, Deno, and testing strategies. + +## Main Content + +Testing is important for software development. +It helps ensure code quality and reliability. +Unit tests verify individual functions work correctly. +Integration tests verify components work together. + +## Conclusion + +Always write tests for your code. +`; + +export const mockArticleUrl = 'https://example.com/article'; + +// Mock fetch for testing +export function createMockFetch(response: { ok: boolean; text?: string; status?: number; statusText?: string }) { + return () => Promise.resolve({ + ok: response.ok, + status: response.status || 200, + statusText: response.statusText || 'OK', + text: () => Promise.resolve(response.text || ''), + } as Response); +} \ No newline at end of file diff --git a/apps/demo/supabase/migrations/20251031234352_create_article_flow_flow.sql b/apps/demo/supabase/migrations/20251031234352_create_article_flow_flow.sql new file mode 100644 index 000000000..b4822946e --- /dev/null +++ b/apps/demo/supabase/migrations/20251031234352_create_article_flow_flow.sql @@ -0,0 +1,5 @@ +SELECT pgflow.create_flow('article_flow', max_attempts => 3); +SELECT pgflow.add_step('article_flow', 'fetch_article'); +SELECT pgflow.add_step('article_flow', 'summarize', ARRAY['fetch_article']); +SELECT pgflow.add_step('article_flow', 'extract_keywords', ARRAY['fetch_article']); +SELECT pgflow.add_step('article_flow', 'publish', ARRAY['summarize', 'extract_keywords']); diff --git a/apps/demo/vite.config.ts b/apps/demo/vite.config.ts index bbf8c7da4..82c605d9f 100644 --- a/apps/demo/vite.config.ts +++ b/apps/demo/vite.config.ts @@ -2,5 +2,13 @@ import { sveltekit } from '@sveltejs/kit/vite'; import { defineConfig } from 'vite'; export default defineConfig({ - plugins: [sveltekit()] + plugins: [sveltekit()], + server: { + // server.host is controlled via CLI flags (--host) + // Regular dev: localhost only + // dev:remote: 0.0.0.0 via --host flag + + // Hostnames for remote dev access (local network only) + allowedHosts: ['localhost', 'pc', 'laptop'] + } }); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 926edc910..7d5c4545d 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -38,7 +38,7 @@ importers: version: 21.2.1(@babel/traverse@7.28.5)(nx@21.2.1) '@nx/next': specifier: 21.2.1 - version: 21.2.1(@babel/core@7.28.5)(@babel/traverse@7.28.5)(@rspack/core@1.6.1(@swc/helpers@0.5.17))(@swc/helpers@0.5.17)(@zkochan/js-yaml@0.0.7)(esbuild@0.19.12)(eslint@9.39.1(jiti@2.4.2))(next@15.0.3(@babel/core@7.28.5)(@opentelemetry/api@1.8.0)(babel-plugin-macros@3.1.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(sass@1.94.0))(nx@21.2.1)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.8.3)(vue-template-compiler@2.7.16)(vue-tsc@1.8.27(typescript@5.8.3))(webpack@5.102.1(esbuild@0.19.12)) + version: 21.2.1(@babel/core@7.28.5)(@babel/traverse@7.28.5)(@rspack/core@1.6.0(@swc/helpers@0.5.17))(@swc/helpers@0.5.17)(@zkochan/js-yaml@0.0.7)(esbuild@0.19.12)(eslint@9.39.1(jiti@2.4.2))(next@15.0.3(@babel/core@7.28.5)(@opentelemetry/api@1.8.0)(babel-plugin-macros@3.1.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(sass@1.93.3))(nx@21.2.1)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.8.3)(vue-template-compiler@2.7.16)(vue-tsc@1.8.27(typescript@5.8.3))(webpack@5.102.1(esbuild@0.19.12)) '@nx/node': specifier: 21.2.1 version: 21.2.1(@babel/traverse@7.28.5)(@types/node@18.16.20)(@zkochan/js-yaml@0.0.7)(babel-plugin-macros@3.1.0)(eslint@9.39.1(jiti@2.4.2))(nx@21.2.1)(ts-node@10.9.2(@types/node@18.16.20)(typescript@5.8.3))(typescript@5.8.3) @@ -47,7 +47,7 @@ importers: version: 21.2.1(@babel/traverse@7.28.5)(@types/node@18.16.20)(@zkochan/js-yaml@0.0.7)(babel-plugin-macros@3.1.0)(eslint@9.39.1(jiti@2.4.2))(nx@21.2.1)(ts-node@10.9.2(@types/node@18.16.20)(typescript@5.8.3))(typescript@5.8.3) '@nx/vite': specifier: 21.2.1 - version: 21.2.1(@babel/traverse@7.28.5)(nx@21.2.1)(typescript@5.8.3)(vite@6.3.5(@types/node@18.16.20)(jiti@2.4.2)(less@4.1.3)(sass-embedded@1.93.3)(sass@1.94.0)(stylus@0.64.0)(terser@5.43.1)(tsx@4.20.6)(yaml@2.8.1))(vitest@1.3.1) + version: 21.2.1(@babel/traverse@7.28.5)(nx@21.2.1)(typescript@5.8.3)(vite@6.3.5(@types/node@18.16.20)(jiti@2.4.2)(less@4.1.3)(sass-embedded@1.93.3)(sass@1.93.3)(stylus@0.64.0)(terser@5.43.1)(tsx@4.20.6)(yaml@2.8.1))(vitest@1.3.1) '@nx/web': specifier: 21.2.1 version: 21.2.1(@babel/traverse@7.28.5)(nx@21.2.1) @@ -101,25 +101,34 @@ importers: version: 8.34.1(eslint@9.39.1(jiti@2.4.2))(typescript@5.8.3) vite: specifier: 6.3.5 - version: 6.3.5(@types/node@18.16.20)(jiti@2.4.2)(less@4.1.3)(sass-embedded@1.93.3)(sass@1.94.0)(stylus@0.64.0)(terser@5.43.1)(tsx@4.20.6)(yaml@2.8.1) + version: 6.3.5(@types/node@18.16.20)(jiti@2.4.2)(less@4.1.3)(sass-embedded@1.93.3)(sass@1.93.3)(stylus@0.64.0)(terser@5.43.1)(tsx@4.20.6)(yaml@2.8.1) vite-plugin-dts: specifier: 4.5.4 - version: 4.5.4(@types/node@18.16.20)(rollup@4.53.2)(typescript@5.8.3)(vite@6.3.5(@types/node@18.16.20)(jiti@2.4.2)(less@4.1.3)(sass-embedded@1.93.3)(sass@1.94.0)(stylus@0.64.0)(terser@5.43.1)(tsx@4.20.6)(yaml@2.8.1)) + version: 4.5.4(@types/node@18.16.20)(rollup@4.53.2)(typescript@5.8.3)(vite@6.3.5(@types/node@18.16.20)(jiti@2.4.2)(less@4.1.3)(sass-embedded@1.93.3)(sass@1.93.3)(stylus@0.64.0)(terser@5.43.1)(tsx@4.20.6)(yaml@2.8.1)) vite-tsconfig-paths: specifier: ^5.1.4 - version: 5.1.4(typescript@5.8.3)(vite@6.3.5(@types/node@18.16.20)(jiti@2.4.2)(less@4.1.3)(sass-embedded@1.93.3)(sass@1.94.0)(stylus@0.64.0)(terser@5.43.1)(tsx@4.20.6)(yaml@2.8.1)) + version: 5.1.4(typescript@5.8.3)(vite@6.3.5(@types/node@18.16.20)(jiti@2.4.2)(less@4.1.3)(sass-embedded@1.93.3)(sass@1.93.3)(stylus@0.64.0)(terser@5.43.1)(tsx@4.20.6)(yaml@2.8.1)) vitest: specifier: ^1.3.1 - version: 1.3.1(@types/node@18.16.20)(@vitest/ui@1.6.1)(jsdom@22.1.0)(less@4.1.3)(sass-embedded@1.93.3)(sass@1.94.0)(stylus@0.64.0)(terser@5.43.1) + version: 1.3.1(@types/node@18.16.20)(@vitest/ui@1.6.1)(jsdom@22.1.0)(less@4.1.3)(sass-embedded@1.93.3)(sass@1.93.3)(stylus@0.64.0)(terser@5.43.1) apps/demo: dependencies: '@pgflow/client': specifier: workspace:* version: link:../../pkgs/client + '@pgflow/dsl': + specifier: workspace:* + version: link:../../pkgs/dsl '@supabase/supabase-js': specifier: ^2.78.0 version: 2.81.0 + '@xyflow/svelte': + specifier: ^1.4.1 + version: 1.4.1(svelte@5.43.6) + shiki: + specifier: ^3.14.0 + version: 3.14.0 devDependencies: '@eslint/compat': specifier: ^1.4.0 @@ -319,16 +328,16 @@ importers: dependencies: '@astrojs/check': specifier: ^0.9.4 - version: 0.9.5(prettier-plugin-astro@0.14.1)(prettier@3.6.2)(typescript@5.8.3) + version: 0.9.5(prettier-plugin-astro@0.14.1)(prettier@3.6.2)(typescript@5.9.3) '@astrojs/cloudflare': specifier: ^12.6.0 - version: 12.6.10(@types/node@22.19.0)(astro@5.15.5(@netlify/blobs@10.0.7)(@types/node@22.19.0)(jiti@2.4.2)(less@4.1.3)(rollup@4.53.2)(sass-embedded@1.93.3)(sass@1.94.0)(stylus@0.64.0)(terser@5.43.1)(tsx@4.20.6)(typescript@5.8.3)(yaml@2.8.1))(jiti@2.4.2)(less@4.1.3)(sass-embedded@1.93.3)(sass@1.94.0)(stylus@0.64.0)(terser@5.43.1)(tsx@4.20.6)(yaml@2.8.1) + version: 12.6.10(@types/node@22.19.0)(astro@5.15.5(@netlify/blobs@10.0.7)(@types/node@22.19.0)(jiti@2.4.2)(less@4.1.3)(rollup@4.53.2)(sass-embedded@1.93.3)(sass@1.94.0)(stylus@0.64.0)(terser@5.43.1)(tsx@4.20.6)(typescript@5.9.3)(yaml@2.8.1))(jiti@2.4.2)(less@4.1.3)(sass-embedded@1.93.3)(sass@1.94.0)(stylus@0.64.0)(terser@5.43.1)(tsx@4.20.6)(yaml@2.8.1) '@astrojs/react': specifier: ^4.3.0 version: 4.4.2(@types/node@22.19.0)(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(jiti@2.4.2)(less@4.1.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(sass-embedded@1.93.3)(sass@1.94.0)(stylus@0.64.0)(terser@5.43.1)(tsx@4.20.6)(yaml@2.8.1) '@astrojs/starlight': specifier: ^0.34.3 - version: 0.34.8(astro@5.15.5(@netlify/blobs@10.0.7)(@types/node@22.19.0)(jiti@2.4.2)(less@4.1.3)(rollup@4.53.2)(sass-embedded@1.93.3)(sass@1.94.0)(stylus@0.64.0)(terser@5.43.1)(tsx@4.20.6)(typescript@5.8.3)(yaml@2.8.1)) + version: 0.34.8(astro@5.15.5(@netlify/blobs@10.0.7)(@types/node@22.19.0)(jiti@2.4.2)(less@4.1.3)(rollup@4.53.2)(sass-embedded@1.93.3)(sass@1.94.0)(stylus@0.64.0)(terser@5.43.1)(tsx@4.20.6)(typescript@5.9.3)(yaml@2.8.1)) '@supabase/supabase-js': specifier: ^2.56.0 version: 2.81.0 @@ -343,7 +352,7 @@ importers: version: 1.5.0(@sveltejs/kit@2.48.4(@opentelemetry/api@1.8.0)(@sveltejs/vite-plugin-svelte@6.2.1(svelte@5.43.6)(vite@6.4.1(@types/node@22.19.0)(jiti@2.4.2)(less@4.1.3)(sass-embedded@1.93.3)(sass@1.94.0)(stylus@0.64.0)(terser@5.43.1)(tsx@4.20.6)(yaml@2.8.1)))(svelte@5.43.6)(vite@6.4.1(@types/node@22.19.0)(jiti@2.4.2)(less@4.1.3)(sass-embedded@1.93.3)(sass@1.94.0)(stylus@0.64.0)(terser@5.43.1)(tsx@4.20.6)(yaml@2.8.1)))(next@15.0.3(@babel/core@7.28.5)(@opentelemetry/api@1.8.0)(babel-plugin-macros@3.1.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(sass@1.94.0))(react@19.2.0)(svelte@5.43.6) astro: specifier: ^5.7.14 - version: 5.15.5(@netlify/blobs@10.0.7)(@types/node@22.19.0)(jiti@2.4.2)(less@4.1.3)(rollup@4.53.2)(sass-embedded@1.93.3)(sass@1.94.0)(stylus@0.64.0)(terser@5.43.1)(tsx@4.20.6)(typescript@5.8.3)(yaml@2.8.1) + version: 5.15.5(@netlify/blobs@10.0.7)(@types/node@22.19.0)(jiti@2.4.2)(less@4.1.3)(rollup@4.53.2)(sass-embedded@1.93.3)(sass@1.94.0)(stylus@0.64.0)(terser@5.43.1)(tsx@4.20.6)(typescript@5.9.3)(yaml@2.8.1) astro-robots-txt: specifier: ^1.0.0 version: 1.0.0 @@ -358,22 +367,22 @@ importers: version: 0.32.6 starlight-blog: specifier: ^0.24.0 - version: 0.24.3(@astrojs/starlight@0.34.8(astro@5.15.5(@netlify/blobs@10.0.7)(@types/node@22.19.0)(jiti@2.4.2)(less@4.1.3)(rollup@4.53.2)(sass-embedded@1.93.3)(sass@1.94.0)(stylus@0.64.0)(terser@5.43.1)(tsx@4.20.6)(typescript@5.8.3)(yaml@2.8.1)))(astro@5.15.5(@netlify/blobs@10.0.7)(@types/node@22.19.0)(jiti@2.4.2)(less@4.1.3)(rollup@4.53.2)(sass-embedded@1.93.3)(sass@1.94.0)(stylus@0.64.0)(terser@5.43.1)(tsx@4.20.6)(typescript@5.8.3)(yaml@2.8.1)) + version: 0.24.3(@astrojs/starlight@0.34.8(astro@5.15.5(@netlify/blobs@10.0.7)(@types/node@22.19.0)(jiti@2.4.2)(less@4.1.3)(rollup@4.53.2)(sass-embedded@1.93.3)(sass@1.94.0)(stylus@0.64.0)(terser@5.43.1)(tsx@4.20.6)(typescript@5.9.3)(yaml@2.8.1)))(astro@5.15.5(@netlify/blobs@10.0.7)(@types/node@22.19.0)(jiti@2.4.2)(less@4.1.3)(rollup@4.53.2)(sass-embedded@1.93.3)(sass@1.94.0)(stylus@0.64.0)(terser@5.43.1)(tsx@4.20.6)(typescript@5.9.3)(yaml@2.8.1)) starlight-contextual-menu: specifier: ^0.1.5 - version: 0.1.5(astro@5.15.5(@netlify/blobs@10.0.7)(@types/node@22.19.0)(jiti@2.4.2)(less@4.1.3)(rollup@4.53.2)(sass-embedded@1.93.3)(sass@1.94.0)(stylus@0.64.0)(terser@5.43.1)(tsx@4.20.6)(typescript@5.8.3)(yaml@2.8.1))(starlight-markdown@0.1.5(astro@5.15.5(@netlify/blobs@10.0.7)(@types/node@22.19.0)(jiti@2.4.2)(less@4.1.3)(rollup@4.53.2)(sass-embedded@1.93.3)(sass@1.94.0)(stylus@0.64.0)(terser@5.43.1)(tsx@4.20.6)(typescript@5.8.3)(yaml@2.8.1))) + version: 0.1.5(astro@5.15.5(@netlify/blobs@10.0.7)(@types/node@22.19.0)(jiti@2.4.2)(less@4.1.3)(rollup@4.53.2)(sass-embedded@1.93.3)(sass@1.94.0)(stylus@0.64.0)(terser@5.43.1)(tsx@4.20.6)(typescript@5.9.3)(yaml@2.8.1))(starlight-markdown@0.1.5(astro@5.15.5(@netlify/blobs@10.0.7)(@types/node@22.19.0)(jiti@2.4.2)(less@4.1.3)(rollup@4.53.2)(sass-embedded@1.93.3)(sass@1.94.0)(stylus@0.64.0)(terser@5.43.1)(tsx@4.20.6)(typescript@5.9.3)(yaml@2.8.1))) starlight-links-validator: specifier: ^0.14.3 - version: 0.14.3(@astrojs/starlight@0.34.8(astro@5.15.5(@netlify/blobs@10.0.7)(@types/node@22.19.0)(jiti@2.4.2)(less@4.1.3)(rollup@4.53.2)(sass-embedded@1.93.3)(sass@1.94.0)(stylus@0.64.0)(terser@5.43.1)(tsx@4.20.6)(typescript@5.8.3)(yaml@2.8.1))) + version: 0.14.3(@astrojs/starlight@0.34.8(astro@5.15.5(@netlify/blobs@10.0.7)(@types/node@22.19.0)(jiti@2.4.2)(less@4.1.3)(rollup@4.53.2)(sass-embedded@1.93.3)(sass@1.94.0)(stylus@0.64.0)(terser@5.43.1)(tsx@4.20.6)(typescript@5.9.3)(yaml@2.8.1))) starlight-llms-txt: specifier: ^0.4.1 - version: 0.4.1(@astrojs/starlight@0.34.8(astro@5.15.5(@netlify/blobs@10.0.7)(@types/node@22.19.0)(jiti@2.4.2)(less@4.1.3)(rollup@4.53.2)(sass-embedded@1.93.3)(sass@1.94.0)(stylus@0.64.0)(terser@5.43.1)(tsx@4.20.6)(typescript@5.8.3)(yaml@2.8.1)))(astro@5.15.5(@netlify/blobs@10.0.7)(@types/node@22.19.0)(jiti@2.4.2)(less@4.1.3)(rollup@4.53.2)(sass-embedded@1.93.3)(sass@1.94.0)(stylus@0.64.0)(terser@5.43.1)(tsx@4.20.6)(typescript@5.8.3)(yaml@2.8.1)) + version: 0.4.1(@astrojs/starlight@0.34.8(astro@5.15.5(@netlify/blobs@10.0.7)(@types/node@22.19.0)(jiti@2.4.2)(less@4.1.3)(rollup@4.53.2)(sass-embedded@1.93.3)(sass@1.94.0)(stylus@0.64.0)(terser@5.43.1)(tsx@4.20.6)(typescript@5.9.3)(yaml@2.8.1)))(astro@5.15.5(@netlify/blobs@10.0.7)(@types/node@22.19.0)(jiti@2.4.2)(less@4.1.3)(rollup@4.53.2)(sass-embedded@1.93.3)(sass@1.94.0)(stylus@0.64.0)(terser@5.43.1)(tsx@4.20.6)(typescript@5.9.3)(yaml@2.8.1)) starlight-sidebar-topics: specifier: ^0.6.0 - version: 0.6.2(@astrojs/starlight@0.34.8(astro@5.15.5(@netlify/blobs@10.0.7)(@types/node@22.19.0)(jiti@2.4.2)(less@4.1.3)(rollup@4.53.2)(sass-embedded@1.93.3)(sass@1.94.0)(stylus@0.64.0)(terser@5.43.1)(tsx@4.20.6)(typescript@5.8.3)(yaml@2.8.1))) + version: 0.6.2(@astrojs/starlight@0.34.8(astro@5.15.5(@netlify/blobs@10.0.7)(@types/node@22.19.0)(jiti@2.4.2)(less@4.1.3)(rollup@4.53.2)(sass-embedded@1.93.3)(sass@1.94.0)(stylus@0.64.0)(terser@5.43.1)(tsx@4.20.6)(typescript@5.9.3)(yaml@2.8.1))) typescript: specifier: ^5.8.3 - version: 5.8.3 + version: 5.9.3 devDependencies: prettier-plugin-astro: specifier: ^0.14.1 @@ -383,7 +392,7 @@ importers: version: 2.54.11 wrangler: specifier: ^4.20.3 - version: 4.46.0(@cloudflare/workers-types@4.20251109.0) + version: 4.46.0(@cloudflare/workers-types@4.20251014.0) packages: @@ -430,8 +439,8 @@ packages: '@astrojs/markdown-remark@6.3.8': resolution: {integrity: sha512-uFNyFWadnULWK2cOw4n0hLKeu+xaVWeuECdP10cQ3K2fkybtTlhb7J7TcScdjmS8Yps7oje9S/ehYMfZrhrgCg==} - '@astrojs/mdx@4.3.10': - resolution: {integrity: sha512-2T5+XIr7PMqMeXhRofXY5NlY4lA0Km+wkfsqmr9lq5KXUHpGlKPQ9dlDZJP9E/CtljJyEBNS17zq66LrIJ1tiQ==} + '@astrojs/mdx@4.3.9': + resolution: {integrity: sha512-80LHiM4z3FxAjATHNgFpa8nlTNSprAWB4UUKnr/QG56Pwk7uRnJWrXlok4wSCi/3fg8kTZ98A408Q91M+iqJdw==} engines: {node: 18.20.8 || ^20.3.0 || >=22.0.0} peerDependencies: astro: ^5.0.0 @@ -1131,6 +1140,10 @@ packages: resolution: {integrity: sha512-x0LvFTekgSX+83TI28Y9wYPUfzrnl2aT5+5QLnO6v7mSJYtEEevuDRN0F0uSHRk1G1IWZC43o00Y0xDDrpBGPQ==} engines: {node: '>=6.9.0'} + '@babel/types@7.28.4': + resolution: {integrity: sha512-bkFqkLhh3pMBUQQkpVgWDWq/lqzc2678eUyDlTBhRqhCHFguYYGM0Efga7tYk4TogG/3x0EEl66/OQ+WGbWB/Q==} + engines: {node: '>=6.9.0'} + '@babel/types@7.28.5': resolution: {integrity: sha512-qQ5m48eI/MFLQ5PxQj4PFaprjyCTLI37ElWMmNs0K8Lk3dVeOdNpB3ks8jc7yM5CDmVC73eMVk/trk3fgmrUpA==} engines: {node: '>=6.9.0'} @@ -1306,6 +1319,9 @@ packages: cpu: [x64] os: [win32] + '@cloudflare/workers-types@4.20251014.0': + resolution: {integrity: sha512-tEW98J/kOa0TdylIUOrLKRdwkUw0rvvYVlo+Ce0mqRH3c8kSoxLzUH9gfCvwLe0M89z1RkzFovSKAW2Nwtyn3w==} + '@cloudflare/workers-types@4.20251109.0': resolution: {integrity: sha512-/wMfoS6NmoY0GgKVoRUp4x0yiZM0eNXwXTTzM7gFJKcm+0NtZmzUzgXj6xpShkfWSrmug0mX7BbyaFMAMHFlPA==} @@ -2952,8 +2968,8 @@ packages: resolution: {integrity: sha512-GFhTcJpB+MI6FhvXEI9b2K0snulNLWHqC/BbcJtyNYcKUiw7l3Lgis5ApsYncJ0leALX7/of4XfmXk+maT111w==} hasBin: true - '@microsoft/api-extractor@7.54.0': - resolution: {integrity: sha512-t0SEcbVUPy4yAVykPafTNWktBg728X6p9t8qCuGDsYr1/lz2VQFihYDP2CnBFSArP5vwJPcvxktoKVSqH326cA==} + '@microsoft/api-extractor@7.53.3': + resolution: {integrity: sha512-p2HmQaMSVqMBj3bH3643f8xApKAqrF1jNpPsMCTQOYCYgfwLnvzsve8c+bgBWzCOBBgLK54PB6ZLIWMGLg8CZA==} hasBin: true '@microsoft/tsdoc-config@0.16.2': @@ -2974,19 +2990,19 @@ packages: '@modern-js/utils@2.68.2': resolution: {integrity: sha512-revom/i/EhKfI0STNLo/AUbv7gY0JY0Ni2gO6P/Z4cTyZZRgd5j90678YB2DGn+LtmSrEWtUphyDH5Jn1RKjgg==} - '@module-federation/bridge-react-webpack-plugin@0.21.3': - resolution: {integrity: sha512-uEmx63j2Ux/cjqzas5rasr+FbWDlLTqm5C3KQ96EE12fb08z53nWjLdrOtIcswwaEgrRc3dXZnvQxofsgBViZw==} + '@module-federation/bridge-react-webpack-plugin@0.21.2': + resolution: {integrity: sha512-HxrzbpAXUwvhnKmgUqKrTJo0mMGHeap2w9T204ieHCXtF8xkw7xGDIgn+Vu6OJqLeGvbWagPrSGAn1CwOvxxRg==} '@module-federation/bridge-react-webpack-plugin@0.9.1': resolution: {integrity: sha512-znN/Qm6M0U1t3iF10gu1hSxDkk18yz78yvk+AMB34UDzpXHiC1zbpIeV2CQNV5GCeafmCICmcn9y1qh7F54KTg==} - '@module-federation/cli@0.21.3': - resolution: {integrity: sha512-UVGulUH0/J/0WMr1HfUmRUwpIRU4ObUKSwWXTPTdnHRIhPo0Y6U8M9IztdoXZxNGq9fPz/RUNbhVX6d46z0Y0w==} + '@module-federation/cli@0.21.2': + resolution: {integrity: sha512-hBz9zu++0B0SqTomPcluf6ghZOv9sU8iixsEicMPsi+2qRlccGdCxr3hKBEZE/xBN5zJ4+Rj+RCAHYtx92wq8w==} engines: {node: '>=16.0.0'} hasBin: true - '@module-federation/data-prefetch@0.21.3': - resolution: {integrity: sha512-1bZ35CvjuZkvgGD46xuqUVjMUL5n+g5utU2EgCgWIMmpviXb52LAnGYCPRH5sOG7jdIuDi1n0PqR+HsmSu78PA==} + '@module-federation/data-prefetch@0.21.2': + resolution: {integrity: sha512-550WjRmsH4VE/ia8o3B/Uro266ph29rBKsuce9IWXo2fg/aj+E+LH/w7bg/VVEjvgjBWCwvTe6NyTGvROZ4hqg==} peerDependencies: react: '>=16.9.0' react-dom: '>=16.9.0' @@ -2997,8 +3013,8 @@ packages: react: '>=16.9.0' react-dom: '>=16.9.0' - '@module-federation/dts-plugin@0.21.3': - resolution: {integrity: sha512-RIkoEPHuKG6pttzgNz+t3BP+NcLJCuyYrW/hqAlVWrGUJ5wux9TQA0zHMrqqwNLNJBBzPABeTHTqQiJdB1rJJg==} + '@module-federation/dts-plugin@0.21.2': + resolution: {integrity: sha512-BPfBQLpq6D+5uz9yhqLFbTDNSpom7IXZBQ67dVzR9EKXhjSeM14hYu6e4289oYnx7yiKnXB2gdey+Q3UqSvCxw==} peerDependencies: typescript: ^4.9.0 || ^5.0.0 vue-tsc: '>=1.0.24' @@ -3015,8 +3031,8 @@ packages: vue-tsc: optional: true - '@module-federation/enhanced@0.21.3': - resolution: {integrity: sha512-L7kx+2nct6ga25n1d4+59ydRZSSL+zf/Pf9oUuDPSjbeuB4Ca3QEOmqNDTBLKqxjQMk1ihAE4i5Gb3WS79fB4A==} + '@module-federation/enhanced@0.21.2': + resolution: {integrity: sha512-fG1a5GgXHDGpkbTLZ1BYBSkNYNaEa9GqITKiPQpNjEh/GpQDFfHLp9Cnnazkrs6yg9RBJDUsFscWpCKz3x6F4g==} hasBin: true peerDependencies: typescript: ^4.9.0 || ^5.0.0 @@ -3047,36 +3063,33 @@ packages: '@module-federation/error-codes@0.21.2': resolution: {integrity: sha512-mGbPAAApgjmQUl4J7WAt20aV04a26TyS21GDEpOGXFEQG5FqmZnSJ6FqB8K19HgTKioBT1+fF/Ctl5bGGao/EA==} - '@module-federation/error-codes@0.21.3': - resolution: {integrity: sha512-RiV/YDdZ10jYdkhaP3KOxsSmQyKtklEeEJVVBBm7ek97FAlURyxdWGHuuFMXmQnx+t9DeP/QH+CT4bDBE1PP8w==} - '@module-federation/error-codes@0.9.1': resolution: {integrity: sha512-q8spCvlwUzW42iX1irnlBTcwcZftRNHyGdlaoFO1z/fW4iphnBIfijzkigWQzOMhdPgzqN/up7XN+g5hjBGBtw==} - '@module-federation/inject-external-runtime-core-plugin@0.21.3': - resolution: {integrity: sha512-BzCZuXRLAUsMUmgcLwdOpfiY6WkdWzli+gGNTweLl+p/3gJXqHb2L143h66ccUuxQkDaFyiMr0e8FOLs3fiBtg==} + '@module-federation/inject-external-runtime-core-plugin@0.21.2': + resolution: {integrity: sha512-8D+p0oLIxnl3RnM/c84K3WOaxouGPYcWkNQFvv5aMw+GDOCgAgcgvrfs/TzU5PEGVj5NqCQRTP7dUDrujeW4tg==} peerDependencies: - '@module-federation/runtime-tools': 0.21.3 + '@module-federation/runtime-tools': 0.21.2 '@module-federation/inject-external-runtime-core-plugin@0.9.1': resolution: {integrity: sha512-BPfzu1cqDU5BhM493enVF1VfxJWmruen0ktlHrWdJJlcddhZzyFBGaLAGoGc+83fS75aEllvJTEthw4kMViMQQ==} peerDependencies: '@module-federation/runtime-tools': 0.9.1 - '@module-federation/managers@0.21.3': - resolution: {integrity: sha512-j9a0ZZTwORyNxjVquJDmPx/w/e49dvluGA9qRBMFxMb0if5ybPJm4ykcwvJwavhV+4bJ86C0tC4gB3PFCfg0ng==} + '@module-federation/managers@0.21.2': + resolution: {integrity: sha512-AZIqm7wj2l78OwBh4aEABXecSbRV2WIxde3kIgf1FSd3FAML8r1gjIgLVvCrXgHiTJyqy7l6DwgQSl6Rm5UpXQ==} '@module-federation/managers@0.9.1': resolution: {integrity: sha512-8hpIrvGfiODxS1qelTd7eaLRVF7jrp17RWgeH1DWoprxELANxm5IVvqUryB+7j+BhoQzamog9DL5q4MuNfGgIA==} - '@module-federation/manifest@0.21.3': - resolution: {integrity: sha512-rGfgAUeNcQgfohXO7vnBOohd3A8G7t50QQ9gpPKvNz/bDMtg7h3oIIH2tijlGVChGD92Hh8/C3HabXQD9D8FjQ==} + '@module-federation/manifest@0.21.2': + resolution: {integrity: sha512-UDvjsn2u4JHlLB5eT4wLIWsD5h3cDre5e4LtixjuhtZpvo8o9wWSmxTNqmcZZa6XuwbGQQ7hRxGuSlI0xO5LvQ==} '@module-federation/manifest@0.9.1': resolution: {integrity: sha512-+GteKBXrAUkq49i2CSyWZXM4vYa+mEVXxR9Du71R55nXXxgbzAIoZj9gxjRunj9pcE8+YpAOyfHxLEdWngxWdg==} - '@module-federation/node@2.7.22': - resolution: {integrity: sha512-WN/E2pv4kNMbO0pdjoFozLsBiv/O8MUT2/oTFHgnJiuYG88G3qKpX2qmEFPcv07eahpAv4vPp7gTKtvz4jFazQ==} + '@module-federation/node@2.7.21': + resolution: {integrity: sha512-a4GH54mHr8b+wLjKhDenAbMN2XLSqkkjvkTKSVSmpBnfs+jMR08U1moSki9ppAf8J7LFmxR+oFNdaAFdLItTiQ==} peerDependencies: next: '*' react: ^16||^17||^18||^19 @@ -3090,8 +3103,8 @@ packages: react-dom: optional: true - '@module-federation/rspack@0.21.3': - resolution: {integrity: sha512-bUk4TPVYmBM08NZeL6vGprdPaxpeFpwnCVc+OwGRTiE7Sa+p5YWwp9nhq98jAr0Poy/W7HLUpSjEUWRHzgQybQ==} + '@module-federation/rspack@0.21.2': + resolution: {integrity: sha512-mJy/X+8SDPvur+/s/CNg5Ho4M0nXyUv5cN+zUdXr7ziX9UvPscNPF+T6jasrro32CU4KtcWIbX9FKqQSZ/odcg==} peerDependencies: '@rspack/core': '>=0.7' typescript: ^4.9.0 || ^5.0.0 @@ -3117,41 +3130,29 @@ packages: '@module-federation/runtime-core@0.21.2': resolution: {integrity: sha512-LtDnccPxjR8Xqa3daRYr1cH/6vUzK3mQSzgvnfsUm1fXte5syX4ftWw3Eu55VdqNY3yREFRn77AXdu9PfPEZRw==} - '@module-federation/runtime-core@0.21.3': - resolution: {integrity: sha512-CVQFsrgT5sWKv23qss3oycUGzpZvdPQbl/biQmjvlWyi530E47plNOt+zpO2hQnTAy5SqCnDnLNvdN0T7qGgiw==} - '@module-federation/runtime-core@0.9.1': resolution: {integrity: sha512-r61ufhKt5pjl81v7TkmhzeIoSPOaNtLynW6+aCy3KZMa3RfRevFxmygJqv4Nug1L0NhqUeWtdLejh4VIglNy5Q==} '@module-federation/runtime-tools@0.21.2': resolution: {integrity: sha512-SgG9NWTYGNYcHSd5MepO3AXf6DNXriIo4sKKM4mu4RqfYhHyP+yNjnF/gvYJl52VD61g0nADmzLWzBqxOqk2tg==} - '@module-federation/runtime-tools@0.21.3': - resolution: {integrity: sha512-vDnF/CjWq2ssrS3FgrZSrF6r/60S59+NKriLFdZiR42ykk4meY7XjrApn0l8RcBt3135/uO94VedCSF6jSfsJQ==} - '@module-federation/runtime-tools@0.9.1': resolution: {integrity: sha512-JQZ//ab+lEXoU2DHAH+JtYASGzxEjXB0s4rU+6VJXc8c+oUPxH3kWIwzjdncg2mcWBmC1140DCk+K+kDfOZ5CQ==} '@module-federation/runtime@0.21.2': resolution: {integrity: sha512-97jlOx4RAnAHMBTfgU5FBK6+V/pfT6GNX0YjSf8G+uJ3lFy74Y6kg/BevEkChTGw5waCLAkw/pw4LmntYcNN7g==} - '@module-federation/runtime@0.21.3': - resolution: {integrity: sha512-5DJcoitApuEIx65HLGRzjO0F3XyOelLpV9Pwt3ueGYO10JO2xAZn6V99Tnw0YkUCjBB7FL5TofIsjbNSMNGeEw==} - '@module-federation/runtime@0.9.1': resolution: {integrity: sha512-jp7K06weabM5BF5sruHr/VLyalO+cilvRDy7vdEBqq88O9mjc0RserD8J+AP4WTl3ZzU7/GRqwRsiwjjN913dA==} '@module-federation/sdk@0.21.2': resolution: {integrity: sha512-t2vHSJ1a9zjg7LLJoEghcytNLzeFCqOat5TbXTav5dgU0xXw82Cf0EfLrxiJL6uUpgbtyvUdqqa2DVAvMPjiiA==} - '@module-federation/sdk@0.21.3': - resolution: {integrity: sha512-OD2LrJtEjRbarA6JSZbIi0HZ8BW2hsB2Ih+7pSL9WmD6BjTgCmoZKUToaTnhIIjthQtbsZrE9h07bmBUOpo91g==} - '@module-federation/sdk@0.9.1': resolution: {integrity: sha512-YQonPTImgnCqZjE/A+3N2g3J5ypR6kx1tbBzc9toUANKr/dw/S63qlh/zHKzWQzxjjNNVMdXRtTMp07g3kgEWg==} - '@module-federation/third-party-dts-extractor@0.21.3': - resolution: {integrity: sha512-/A1PX5nEvOj4sy6qGvFgDnLhxZ/54JQ9ZSPIo4ZdydmzTsCnHByBd7VrC8uuNTy2dUTtCZkKbOMWwYhPIjrTmA==} + '@module-federation/third-party-dts-extractor@0.21.2': + resolution: {integrity: sha512-t8kKhD1XigGUpgFXyjpmT71gPSjR5CuTezSCSF6rIRSl+lQESiwzbPPlXHJorpKaaQJYAFtlmtNkcbvVR9nnXg==} '@module-federation/third-party-dts-extractor@0.9.1': resolution: {integrity: sha512-KeIByP718hHyq+Mc53enZ419pZZ1fh9Ns6+/bYLkc3iCoJr/EDBeiLzkbMwh2AS4Qk57WW0yNC82xzf7r0Zrrw==} @@ -3159,9 +3160,6 @@ packages: '@module-federation/webpack-bundler-runtime@0.21.2': resolution: {integrity: sha512-06R/NDY6Uh5RBIaBOFwYWzJCf1dIiQd/DFHToBVhejUT3ZFG7GzHEPIIsAGqMzne/JSmVsvjlXiJu7UthQ6rFA==} - '@module-federation/webpack-bundler-runtime@0.21.3': - resolution: {integrity: sha512-8TDrp7dF4JqEgNvvvSRqW3kZGNb52r0xf0eDg1muSH5kI2acPRQ4TT4ZJY+2527tMOUu9qPqwGD3tnnpN2xLUA==} - '@module-federation/webpack-bundler-runtime@0.9.1': resolution: {integrity: sha512-CxySX01gT8cBowKl9xZh+voiHvThMZ471icasWnlDIZb14KasZoX1eCh9wpGvwoOdIk9rIRT7h70UvW9nmop6w==} @@ -3222,8 +3220,8 @@ packages: resolution: {integrity: sha512-vpNT/VrfvymLx9MH46cuvTfPfEVZtpkwdM5atApzWLUrbyA0pgooAx2H0jupJk+u8yTfEYZCMvtsENEZO82agw==} engines: {node: '>=18.0.0'} - '@netlify/functions-utils@6.2.13': - resolution: {integrity: sha512-nntswdhi9wW3QejB/HMgtnrP1b7+6RLmZE6/DojfVBQN3D4ybxcoUFOKU97aQviXnwfFy2366dEzhlCbFabi0Q==} + '@netlify/functions-utils@6.2.12': + resolution: {integrity: sha512-JnSkgxH38PAQLr+Z2ddXfB1kxFQglw1etfZgo+ZH+tkdnm6Vf0RBieDqFDzLdJzCDUGO7PtO8xFMuUYJ4AtncA==} engines: {node: '>=18.14.0'} '@netlify/git-utils@6.0.2': @@ -3353,8 +3351,8 @@ packages: engines: {node: '>=18.14.0'} hasBin: true - '@netlify/zip-it-and-ship-it@14.1.13': - resolution: {integrity: sha512-nemTNQ2HjF5ubGKOMZ0XO9eHayoNJ8F2YahPqHXRQ3VXfwQnXkC8vW1Tvq1OspUsAiFrOyYOYLyw2J4JmpuTtA==} + '@netlify/zip-it-and-ship-it@14.1.12': + resolution: {integrity: sha512-HdMcvyvDQBcqjzf8hUZQE+uqqiEJP3ucjBCl1FX5bly7ci1DT6qeZR1Zm6jrWAVl8y36UgAB2Nx8r4ulGg+p+w==} engines: {node: '>=18.14.0'} hasBin: true @@ -3872,170 +3870,280 @@ packages: rollup: optional: true + '@rollup/rollup-android-arm-eabi@4.52.5': + resolution: {integrity: sha512-8c1vW4ocv3UOMp9K+gToY5zL2XiiVw3k7f1ksf4yO1FlDFQ1C2u72iACFnSOceJFsWskc2WZNqeRhFRPzv+wtQ==} + cpu: [arm] + os: [android] + '@rollup/rollup-android-arm-eabi@4.53.2': resolution: {integrity: sha512-yDPzwsgiFO26RJA4nZo8I+xqzh7sJTZIWQOxn+/XOdPE31lAvLIYCKqjV+lNH/vxE2L2iH3plKxDCRK6i+CwhA==} cpu: [arm] os: [android] + '@rollup/rollup-android-arm64@4.52.5': + resolution: {integrity: sha512-mQGfsIEFcu21mvqkEKKu2dYmtuSZOBMmAl5CFlPGLY94Vlcm+zWApK7F/eocsNzp8tKmbeBP8yXyAbx0XHsFNA==} + cpu: [arm64] + os: [android] + '@rollup/rollup-android-arm64@4.53.2': resolution: {integrity: sha512-k8FontTxIE7b0/OGKeSN5B6j25EuppBcWM33Z19JoVT7UTXFSo3D9CdU39wGTeb29NO3XxpMNauh09B+Ibw+9g==} cpu: [arm64] os: [android] + '@rollup/rollup-darwin-arm64@4.52.5': + resolution: {integrity: sha512-takF3CR71mCAGA+v794QUZ0b6ZSrgJkArC+gUiG6LB6TQty9T0Mqh3m2ImRBOxS2IeYBo4lKWIieSvnEk2OQWA==} + cpu: [arm64] + os: [darwin] + '@rollup/rollup-darwin-arm64@4.53.2': resolution: {integrity: sha512-A6s4gJpomNBtJ2yioj8bflM2oogDwzUiMl2yNJ2v9E7++sHrSrsQ29fOfn5DM/iCzpWcebNYEdXpaK4tr2RhfQ==} cpu: [arm64] os: [darwin] + '@rollup/rollup-darwin-x64@4.52.5': + resolution: {integrity: sha512-W901Pla8Ya95WpxDn//VF9K9u2JbocwV/v75TE0YIHNTbhqUTv9w4VuQ9MaWlNOkkEfFwkdNhXgcLqPSmHy0fA==} + cpu: [x64] + os: [darwin] + '@rollup/rollup-darwin-x64@4.53.2': resolution: {integrity: sha512-e6XqVmXlHrBlG56obu9gDRPW3O3hLxpwHpLsBJvuI8qqnsrtSZ9ERoWUXtPOkY8c78WghyPHZdmPhHLWNdAGEw==} cpu: [x64] os: [darwin] + '@rollup/rollup-freebsd-arm64@4.52.5': + resolution: {integrity: sha512-QofO7i7JycsYOWxe0GFqhLmF6l1TqBswJMvICnRUjqCx8b47MTo46W8AoeQwiokAx3zVryVnxtBMcGcnX12LvA==} + cpu: [arm64] + os: [freebsd] + '@rollup/rollup-freebsd-arm64@4.53.2': resolution: {integrity: sha512-v0E9lJW8VsrwPux5Qe5CwmH/CF/2mQs6xU1MF3nmUxmZUCHazCjLgYvToOk+YuuUqLQBio1qkkREhxhc656ViA==} cpu: [arm64] os: [freebsd] + '@rollup/rollup-freebsd-x64@4.52.5': + resolution: {integrity: sha512-jr21b/99ew8ujZubPo9skbrItHEIE50WdV86cdSoRkKtmWa+DDr6fu2c/xyRT0F/WazZpam6kk7IHBerSL7LDQ==} + cpu: [x64] + os: [freebsd] + '@rollup/rollup-freebsd-x64@4.53.2': resolution: {integrity: sha512-ClAmAPx3ZCHtp6ysl4XEhWU69GUB1D+s7G9YjHGhIGCSrsg00nEGRRZHmINYxkdoJehde8VIsDC5t9C0gb6yqA==} cpu: [x64] os: [freebsd] + '@rollup/rollup-linux-arm-gnueabihf@4.52.5': + resolution: {integrity: sha512-PsNAbcyv9CcecAUagQefwX8fQn9LQ4nZkpDboBOttmyffnInRy8R8dSg6hxxl2Re5QhHBf6FYIDhIj5v982ATQ==} + cpu: [arm] + os: [linux] + '@rollup/rollup-linux-arm-gnueabihf@4.53.2': resolution: {integrity: sha512-EPlb95nUsz6Dd9Qy13fI5kUPXNSljaG9FiJ4YUGU1O/Q77i5DYFW5KR8g1OzTcdZUqQQ1KdDqsTohdFVwCwjqg==} cpu: [arm] os: [linux] + '@rollup/rollup-linux-arm-musleabihf@4.52.5': + resolution: {integrity: sha512-Fw4tysRutyQc/wwkmcyoqFtJhh0u31K+Q6jYjeicsGJJ7bbEq8LwPWV/w0cnzOqR2m694/Af6hpFayLJZkG2VQ==} + cpu: [arm] + os: [linux] + '@rollup/rollup-linux-arm-musleabihf@4.53.2': resolution: {integrity: sha512-BOmnVW+khAUX+YZvNfa0tGTEMVVEerOxN0pDk2E6N6DsEIa2Ctj48FOMfNDdrwinocKaC7YXUZ1pHlKpnkja/Q==} cpu: [arm] os: [linux] + '@rollup/rollup-linux-arm64-gnu@4.52.5': + resolution: {integrity: sha512-a+3wVnAYdQClOTlyapKmyI6BLPAFYs0JM8HRpgYZQO02rMR09ZcV9LbQB+NL6sljzG38869YqThrRnfPMCDtZg==} + cpu: [arm64] + os: [linux] + '@rollup/rollup-linux-arm64-gnu@4.53.2': resolution: {integrity: sha512-Xt2byDZ+6OVNuREgBXr4+CZDJtrVso5woFtpKdGPhpTPHcNG7D8YXeQzpNbFRxzTVqJf7kvPMCub/pcGUWgBjA==} cpu: [arm64] os: [linux] + '@rollup/rollup-linux-arm64-musl@4.52.5': + resolution: {integrity: sha512-AvttBOMwO9Pcuuf7m9PkC1PUIKsfaAJ4AYhy944qeTJgQOqJYJ9oVl2nYgY7Rk0mkbsuOpCAYSs6wLYB2Xiw0Q==} + cpu: [arm64] + os: [linux] + '@rollup/rollup-linux-arm64-musl@4.53.2': resolution: {integrity: sha512-+LdZSldy/I9N8+klim/Y1HsKbJ3BbInHav5qE9Iy77dtHC/pibw1SR/fXlWyAk0ThnpRKoODwnAuSjqxFRDHUQ==} cpu: [arm64] os: [linux] + '@rollup/rollup-linux-loong64-gnu@4.52.5': + resolution: {integrity: sha512-DkDk8pmXQV2wVrF6oq5tONK6UHLz/XcEVow4JTTerdeV1uqPeHxwcg7aFsfnSm9L+OO8WJsWotKM2JJPMWrQtA==} + cpu: [loong64] + os: [linux] + '@rollup/rollup-linux-loong64-gnu@4.53.2': resolution: {integrity: sha512-8ms8sjmyc1jWJS6WdNSA23rEfdjWB30LH8Wqj0Cqvv7qSHnvw6kgMMXRdop6hkmGPlyYBdRPkjJnj3KCUHV/uQ==} cpu: [loong64] os: [linux] + '@rollup/rollup-linux-ppc64-gnu@4.52.5': + resolution: {integrity: sha512-W/b9ZN/U9+hPQVvlGwjzi+Wy4xdoH2I8EjaCkMvzpI7wJUs8sWJ03Rq96jRnHkSrcHTpQe8h5Tg3ZzUPGauvAw==} + cpu: [ppc64] + os: [linux] + '@rollup/rollup-linux-ppc64-gnu@4.53.2': resolution: {integrity: sha512-3HRQLUQbpBDMmzoxPJYd3W6vrVHOo2cVW8RUo87Xz0JPJcBLBr5kZ1pGcQAhdZgX9VV7NbGNipah1omKKe23/g==} cpu: [ppc64] os: [linux] + '@rollup/rollup-linux-riscv64-gnu@4.52.5': + resolution: {integrity: sha512-sjQLr9BW7R/ZiXnQiWPkErNfLMkkWIoCz7YMn27HldKsADEKa5WYdobaa1hmN6slu9oWQbB6/jFpJ+P2IkVrmw==} + cpu: [riscv64] + os: [linux] + '@rollup/rollup-linux-riscv64-gnu@4.53.2': resolution: {integrity: sha512-fMjKi+ojnmIvhk34gZP94vjogXNNUKMEYs+EDaB/5TG/wUkoeua7p7VCHnE6T2Tx+iaghAqQX8teQzcvrYpaQA==} cpu: [riscv64] os: [linux] + '@rollup/rollup-linux-riscv64-musl@4.52.5': + resolution: {integrity: sha512-hq3jU/kGyjXWTvAh2awn8oHroCbrPm8JqM7RUpKjalIRWWXE01CQOf/tUNWNHjmbMHg/hmNCwc/Pz3k1T/j/Lg==} + cpu: [riscv64] + os: [linux] + '@rollup/rollup-linux-riscv64-musl@4.53.2': resolution: {integrity: sha512-XuGFGU+VwUUV5kLvoAdi0Wz5Xbh2SrjIxCtZj6Wq8MDp4bflb/+ThZsVxokM7n0pcbkEr2h5/pzqzDYI7cCgLQ==} cpu: [riscv64] os: [linux] + '@rollup/rollup-linux-s390x-gnu@4.52.5': + resolution: {integrity: sha512-gn8kHOrku8D4NGHMK1Y7NA7INQTRdVOntt1OCYypZPRt6skGbddska44K8iocdpxHTMMNui5oH4elPH4QOLrFQ==} + cpu: [s390x] + os: [linux] + '@rollup/rollup-linux-s390x-gnu@4.53.2': resolution: {integrity: sha512-w6yjZF0P+NGzWR3AXWX9zc0DNEGdtvykB03uhonSHMRa+oWA6novflo2WaJr6JZakG2ucsyb+rvhrKac6NIy+w==} cpu: [s390x] os: [linux] + '@rollup/rollup-linux-x64-gnu@4.52.5': + resolution: {integrity: sha512-hXGLYpdhiNElzN770+H2nlx+jRog8TyynpTVzdlc6bndktjKWyZyiCsuDAlpd+j+W+WNqfcyAWz9HxxIGfZm1Q==} + cpu: [x64] + os: [linux] + '@rollup/rollup-linux-x64-gnu@4.53.2': resolution: {integrity: sha512-yo8d6tdfdeBArzC7T/PnHd7OypfI9cbuZzPnzLJIyKYFhAQ8SvlkKtKBMbXDxe1h03Rcr7u++nFS7tqXz87Gtw==} cpu: [x64] os: [linux] + '@rollup/rollup-linux-x64-musl@4.52.5': + resolution: {integrity: sha512-arCGIcuNKjBoKAXD+y7XomR9gY6Mw7HnFBv5Rw7wQRvwYLR7gBAgV7Mb2QTyjXfTveBNFAtPt46/36vV9STLNg==} + cpu: [x64] + os: [linux] + '@rollup/rollup-linux-x64-musl@4.53.2': resolution: {integrity: sha512-ah59c1YkCxKExPP8O9PwOvs+XRLKwh/mV+3YdKqQ5AMQ0r4M4ZDuOrpWkUaqO7fzAHdINzV9tEVu8vNw48z0lA==} cpu: [x64] os: [linux] + '@rollup/rollup-openharmony-arm64@4.52.5': + resolution: {integrity: sha512-QoFqB6+/9Rly/RiPjaomPLmR/13cgkIGfA40LHly9zcH1S0bN2HVFYk3a1eAyHQyjs3ZJYlXvIGtcCs5tko9Cw==} + cpu: [arm64] + os: [openharmony] + '@rollup/rollup-openharmony-arm64@4.53.2': resolution: {integrity: sha512-4VEd19Wmhr+Zy7hbUsFZ6YXEiP48hE//KPLCSVNY5RMGX2/7HZ+QkN55a3atM1C/BZCGIgqN+xrVgtdak2S9+A==} cpu: [arm64] os: [openharmony] + '@rollup/rollup-win32-arm64-msvc@4.52.5': + resolution: {integrity: sha512-w0cDWVR6MlTstla1cIfOGyl8+qb93FlAVutcor14Gf5Md5ap5ySfQ7R9S/NjNaMLSFdUnKGEasmVnu3lCMqB7w==} + cpu: [arm64] + os: [win32] + '@rollup/rollup-win32-arm64-msvc@4.53.2': resolution: {integrity: sha512-IlbHFYc/pQCgew/d5fslcy1KEaYVCJ44G8pajugd8VoOEI8ODhtb/j8XMhLpwHCMB3yk2J07ctup10gpw2nyMA==} cpu: [arm64] os: [win32] + '@rollup/rollup-win32-ia32-msvc@4.52.5': + resolution: {integrity: sha512-Aufdpzp7DpOTULJCuvzqcItSGDH73pF3ko/f+ckJhxQyHtp67rHw3HMNxoIdDMUITJESNE6a8uh4Lo4SLouOUg==} + cpu: [ia32] + os: [win32] + '@rollup/rollup-win32-ia32-msvc@4.53.2': resolution: {integrity: sha512-lNlPEGgdUfSzdCWU176ku/dQRnA7W+Gp8d+cWv73jYrb8uT7HTVVxq62DUYxjbaByuf1Yk0RIIAbDzp+CnOTFg==} cpu: [ia32] os: [win32] + '@rollup/rollup-win32-x64-gnu@4.52.5': + resolution: {integrity: sha512-UGBUGPFp1vkj6p8wCRraqNhqwX/4kNQPS57BCFc8wYh0g94iVIW33wJtQAx3G7vrjjNtRaxiMUylM0ktp/TRSQ==} + cpu: [x64] + os: [win32] + '@rollup/rollup-win32-x64-gnu@4.53.2': resolution: {integrity: sha512-S6YojNVrHybQis2lYov1sd+uj7K0Q05NxHcGktuMMdIQ2VixGwAfbJ23NnlvvVV1bdpR2m5MsNBViHJKcA4ADw==} cpu: [x64] os: [win32] + '@rollup/rollup-win32-x64-msvc@4.52.5': + resolution: {integrity: sha512-TAcgQh2sSkykPRWLrdyy2AiceMckNf5loITqXxFI5VuQjS5tSuw3WlwdN8qv8vzjLAUTvYaH/mVjSFpbkFbpTg==} + cpu: [x64] + os: [win32] + '@rollup/rollup-win32-x64-msvc@4.53.2': resolution: {integrity: sha512-k+/Rkcyx//P6fetPoLMb8pBeqJBNGx81uuf7iljX9++yNBVRDQgD04L+SVXmXmh5ZP4/WOp4mWF0kmi06PW2tA==} cpu: [x64] os: [win32] - '@rspack/binding-darwin-arm64@1.6.1': - resolution: {integrity: sha512-am7gVsqicKY/FhDfNa/InHxrBd3wRt6rI7sFTaunKaPbPERjWSKr/sI47tB3t8uNYmLQFFhWFijomAhDyrlHMg==} + '@rspack/binding-darwin-arm64@1.6.0': + resolution: {integrity: sha512-IrigOWnGvQgugsTZgf3dB5uko+y+lkNLYg/8w0DiobxkWhpLO97RAeR1w0ofIPXYVu3UWVf7dgHj3PjTqjC9Tw==} cpu: [arm64] os: [darwin] - '@rspack/binding-darwin-x64@1.6.1': - resolution: {integrity: sha512-uadcJOal5YTg191+kvi47I0b+U0sRKe8vKFjMXYOrSIcbXGVRdBxROt/HMlKnvg0u/A83f6AABiY6MA2fCs/gw==} + '@rspack/binding-darwin-x64@1.6.0': + resolution: {integrity: sha512-UYz+Y1XqbHGnkUOsaZRuwiuQaQaQ5rEPSboBPlIVDtblwmB71yxo3ET0nSoUhz8L/WXqQoARiraTCxUP6bvSIg==} cpu: [x64] os: [darwin] - '@rspack/binding-linux-arm64-gnu@1.6.1': - resolution: {integrity: sha512-n7UGSBzv7PiX+V1Q2bY3S1XWyN3RCykCQUgfhZ+xWietCM/1349jgN7DoXKPllqlof1GPGBjziHU0sQZTC4tag==} + '@rspack/binding-linux-arm64-gnu@1.6.0': + resolution: {integrity: sha512-Jr7aaxrtwOnh7ge7tZP+Mjpo6uNltvQisL25WcjpP+8PnPT0C9jziKDJso7KxeOINXnQ2yRn2h65+HBNb7FQig==} cpu: [arm64] os: [linux] - '@rspack/binding-linux-arm64-musl@1.6.1': - resolution: {integrity: sha512-P7nx0jsKxx7g3QAnH9UnJDGVgs1M2H7ZQl68SRyrs42TKOd9Md22ynoMIgCK1zoy+skssU6MhWptluSggXqSrA==} + '@rspack/binding-linux-arm64-musl@1.6.0': + resolution: {integrity: sha512-hl17reUhkjgkcLao6ZvNiSRQFGFykqUpIj1//v/XtVd/2XAZ0Kt7jv9UUeaR+2zY8piH+tgCkwgefmjmajMeFg==} cpu: [arm64] os: [linux] - '@rspack/binding-linux-x64-gnu@1.6.1': - resolution: {integrity: sha512-SdiurC1bV/QHnj7rmrBYJLdsat3uUDWl9KjkVjEbtc8kQV0Ri4/vZRH0nswgzx7hZNY2j0jYuCm5O8+3qeJEMg==} + '@rspack/binding-linux-x64-gnu@1.6.0': + resolution: {integrity: sha512-xdlb+ToerFU/YggndCfIrZI/S/C80CP9ZFw6lhnEFSTJDAG88KptxstsoKUh8YzyPTD45CYaOjYNtUtiv0nScg==} cpu: [x64] os: [linux] - '@rspack/binding-linux-x64-musl@1.6.1': - resolution: {integrity: sha512-JoSJu29nV+auOePhe8x2Fzqxiga1YGNcOMWKJ5Uj8rHBZ8FPAiiE+CpLG8TwfpHsivojrY/sy6fE8JldYLV5TQ==} + '@rspack/binding-linux-x64-musl@1.6.0': + resolution: {integrity: sha512-IkXEW/FBPPz4EJJTLNZvA+94aLaW2HgUMYu7zCIw5YMc9JJ/UXexY1zjX/A7yidsCiZCRy/ZrB+veFJ5FkZv7w==} cpu: [x64] os: [linux] - '@rspack/binding-wasm32-wasi@1.6.1': - resolution: {integrity: sha512-u5NiSHxM7LtIo4cebq/hQPJ9o39u127am3eVJHDzdmBVhTYYO5l7XVUnFmcU8hNHuj/4lJzkFviWFbf3SaRSYA==} + '@rspack/binding-wasm32-wasi@1.6.0': + resolution: {integrity: sha512-XGwX35XXnoTYVUGwDBsKNOkkk/yUsT/RF59u9BwT3QBM5eSXk767xVw/ZeiiyJf5YfI/52HDW2E4QZyvlYyv7g==} cpu: [wasm32] - '@rspack/binding-win32-arm64-msvc@1.6.1': - resolution: {integrity: sha512-u2Lm4iyUstX/H4JavHnFLIlXQwMka6WVvG2XH8uRd6ziNTh0k/u9jlFADzhdZMvxj63L2hNXCs7TrMZTx2VObQ==} + '@rspack/binding-win32-arm64-msvc@1.6.0': + resolution: {integrity: sha512-HOA/U7YC6EB74CpIrT2GrvPgd+TLr0anNuOp/8omw9hH1jjsP5cjUMgWeAGmWyXWxwoS8rRJ0xhRA+UIe3cL3g==} cpu: [arm64] os: [win32] - '@rspack/binding-win32-ia32-msvc@1.6.1': - resolution: {integrity: sha512-/rMU4pjnQeYnkrXmlqeEPiUNT1wHfJ8GR5v2zqcHXBQkAtic3ZsLwjHpucJjrfRsN5CcVChxJl/T7ozlITfcYw==} + '@rspack/binding-win32-ia32-msvc@1.6.0': + resolution: {integrity: sha512-ThczdltBOFcq+IrTflCE+8q0GvKoISt6pTupkuGnI1/bCnqhCxPP6kx8Z06fdJUFMhvBtpZa0gDJvhh3JBZrKA==} cpu: [ia32] os: [win32] - '@rspack/binding-win32-x64-msvc@1.6.1': - resolution: {integrity: sha512-8qsdb5COuZF5Trimo3HHz3N0KuRtrPtRCMK/wi7DOT1nR6CpUeUMPTjvtPl/O/QezQje+cpBFTa5BaQ1WKlHhw==} + '@rspack/binding-win32-x64-msvc@1.6.0': + resolution: {integrity: sha512-Bhyvsh1m6kIpr1vqZlcdUDUTh0bheRe9SF+f6jw0kPDPbh8FfrRbshPKmRHpRZAUHt20NqgUKR2z2BaKb0IJvQ==} cpu: [x64] os: [win32] - '@rspack/binding@1.6.1': - resolution: {integrity: sha512-6duvh3CbDA3c4HpNkzIOP9z1wn/mKY1Mrxj+AqgcNvsE0ppp1iKlMsJCDgl7SlUauus2AgtM1dIEU+0sRajmwQ==} + '@rspack/binding@1.6.0': + resolution: {integrity: sha512-RqlCjvWg/LkJjHpsbI48ebo2SYpIBJsV1eh9SEMfXo1batAPvB5grhAbLX0MRUOtzuQOnZMCDGdr2v7l2L8Siw==} - '@rspack/core@1.6.1': - resolution: {integrity: sha512-hZVrmiZoBTchWUdh/XbeJ5z+GqHW5aPYeufBigmtUeyzul8uJtHlWKmQhpG+lplMf6o1RESTjjxl632TP/Cfhg==} + '@rspack/core@1.6.0': + resolution: {integrity: sha512-u2GDSToEhmgIsy0QbOPA81i9tu87J2HgSsRA3HHZfWIR8Vt8KdlAriQnG8CatDnvFSY/UQEumVf5Z1HUAQwxCg==} engines: {node: '>=18.12.0'} peerDependencies: '@swc/helpers': '>=0.5.1' @@ -4102,21 +4210,39 @@ packages: '@sec-ant/readable-stream@0.4.1': resolution: {integrity: sha512-831qok9r2t8AlxLko40y2ebgSDhenenCatLVeW/uBtnHPyhHOvG0C7TvfgecV+wHzIm5KUICgzmVpWS+IMEAeg==} + '@shikijs/core@3.14.0': + resolution: {integrity: sha512-qRSeuP5vlYHCNUIrpEBQFO7vSkR7jn7Kv+5X3FO/zBKVDGQbcnlScD3XhkrHi/R8Ltz0kEjvFR9Szp/XMRbFMw==} + '@shikijs/core@3.15.0': resolution: {integrity: sha512-8TOG6yG557q+fMsSVa8nkEDOZNTSxjbbR8l6lF2gyr6Np+jrPlslqDxQkN6rMXCECQ3isNPZAGszAfYoJOPGlg==} + '@shikijs/engine-javascript@3.14.0': + resolution: {integrity: sha512-3v1kAXI2TsWQuwv86cREH/+FK9Pjw3dorVEykzQDhwrZj0lwsHYlfyARaKmn6vr5Gasf8aeVpb8JkzeWspxOLQ==} + '@shikijs/engine-javascript@3.15.0': resolution: {integrity: sha512-ZedbOFpopibdLmvTz2sJPJgns8Xvyabe2QbmqMTz07kt1pTzfEvKZc5IqPVO/XFiEbbNyaOpjPBkkr1vlwS+qg==} + '@shikijs/engine-oniguruma@3.14.0': + resolution: {integrity: sha512-TNcYTYMbJyy+ZjzWtt0bG5y4YyMIWC2nyePz+CFMWqm+HnZZyy9SWMgo8Z6KBJVIZnx8XUXS8U2afO6Y0g1Oug==} + '@shikijs/engine-oniguruma@3.15.0': resolution: {integrity: sha512-HnqFsV11skAHvOArMZdLBZZApRSYS4LSztk2K3016Y9VCyZISnlYUYsL2hzlS7tPqKHvNqmI5JSUJZprXloMvA==} + '@shikijs/langs@3.14.0': + resolution: {integrity: sha512-DIB2EQY7yPX1/ZH7lMcwrK5pl+ZkP/xoSpUzg9YC8R+evRCCiSQ7yyrvEyBsMnfZq4eBzLzBlugMyTAf13+pzg==} + '@shikijs/langs@3.15.0': resolution: {integrity: sha512-WpRvEFvkVvO65uKYW4Rzxs+IG0gToyM8SARQMtGGsH4GDMNZrr60qdggXrFOsdfOVssG/QQGEl3FnJ3EZ+8w8A==} + '@shikijs/themes@3.14.0': + resolution: {integrity: sha512-fAo/OnfWckNmv4uBoUu6dSlkcBc+SA1xzj5oUSaz5z3KqHtEbUypg/9xxgJARtM6+7RVm0Q6Xnty41xA1ma1IA==} + '@shikijs/themes@3.15.0': resolution: {integrity: sha512-8ow2zWb1IDvCKjYb0KiLNrK4offFdkfNVPXb1OZykpLCzRU6j+efkY+Y7VQjNlNFXonSw+4AOdGYtmqykDbRiQ==} + '@shikijs/types@3.14.0': + resolution: {integrity: sha512-bQGgC6vrY8U/9ObG1Z/vTro+uclbjjD/uG58RvfxKZVD5p9Yc1ka3tVyEFy7BNJLzxuWyHH5NWynP9zZZS59eQ==} + '@shikijs/types@3.15.0': resolution: {integrity: sha512-BnP+y/EQnhihgHy4oIAN+6FFtmfTekwOLsQbRw9hOKwqgNy8Bdsjq8B05oAt/ZgvIWWFrshV71ytOrlPfYjIJw==} @@ -4185,6 +4311,11 @@ packages: resolution: {integrity: sha512-FkiqUYCzsT92V/mfvoFueszkQrPqSTHgXhN9ADqeMpY5j0tUqeAZu8g2ptLYiDmx1pBbh4xoiqxWAf3UDIv4Bw==} engines: {node: '>=20.0.0'} + '@svelte-put/shortcut@4.1.0': + resolution: {integrity: sha512-wImNEIkbxAIWFqlfuhcbC+jRPDeRa/uJGIXHMEVVD+jqL9xCwWNnkGQJ6Qb2XVszuRLHlb8SGZDL3Io/h3vs8w==} + peerDependencies: + svelte: ^5.1.0 + '@sveltejs/acorn-typescript@1.0.6': resolution: {integrity: sha512-4awhxtMh4cx9blePWl10HRHj8Iivtqj+2QdDCSMDzxG+XKa9+VCNupQuCuvzEhYPzZSrX+0gC+0lHA/0fFKKQQ==} peerDependencies: @@ -4382,6 +4513,24 @@ packages: '@types/cookie@0.6.0': resolution: {integrity: sha512-4Kh9a6B2bQciAhf7FSuMRRkUWecJgJu9nPnx3yzpsfXX/c50REIqpHY4C82bXP90qrLtXtkDxTZosYO3UpOwlA==} + '@types/d3-color@3.1.3': + resolution: {integrity: sha512-iO90scth9WAbmgv7ogoq57O9YpKmFBbmoEoCHDB2xMBY0+/KVrqAaCDyCE16dUspeOvIxFFRI+0sEtqDqy2b4A==} + + '@types/d3-drag@3.0.7': + resolution: {integrity: sha512-HE3jVKlzU9AaMazNufooRJ5ZpWmLIoc90A37WU2JMmeq28w1FQqCZswHZ3xR+SuxYftzHq6WU6KJHvqxKzTxxQ==} + + '@types/d3-interpolate@3.0.4': + resolution: {integrity: sha512-mgLPETlrpVV1YRJIglr4Ez47g7Yxjl1lj7YKsiMCb27VJH9W8NVM6Bb9d8kkpG/uAQS5AmbA48q2IAolKKo1MA==} + + '@types/d3-selection@3.0.11': + resolution: {integrity: sha512-bhAXu23DJWsrI45xafYpkQ4NtcKMwWnAC/vKrd2l+nxMFuvOT3XMYTIj2opv8vq8AO5Yh7Qac/nSeP/3zjTK0w==} + + '@types/d3-transition@3.0.9': + resolution: {integrity: sha512-uZS5shfxzO3rGlu0cC3bjmMFKsXv+SmZZcgp0KD22ts4uGXp5EVYGzu/0YdwZeKmddhcAccYtREJKkPfXkZuCg==} + + '@types/d3-zoom@3.0.8': + resolution: {integrity: sha512-iqMC4/YlFCSlO8+2Ii1GGGliCAY4XdeG748w5vQUbevlbDu0zSjH/+jojorQVBK/se0j6DUFNPBGSqD3YWYnDw==} + '@types/debug@4.1.12': resolution: {integrity: sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==} @@ -4588,6 +4737,12 @@ packages: peerDependencies: typescript: '>=4.8.4 <5.9.0' + '@typescript-eslint/project-service@8.46.2': + resolution: {integrity: sha512-PULOLZ9iqwI7hXcmL4fVfIsBi6AN9YxRc0frbvmg8f+4hQAjQ5GYNKK0DIArNo+rOKmR/iBYwkpBmnIwin4wBg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '>=4.8.4 <6.0.0' + '@typescript-eslint/project-service@8.46.4': resolution: {integrity: sha512-nPiRSKuvtTN+no/2N1kt2tUh/HoFzeEgOm9fQ6XQk4/ApGqjx0zFIIaLJ6wooR1HIoozvj2j6vTi/1fgAz7UYQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -4598,6 +4753,10 @@ packages: resolution: {integrity: sha512-beu6o6QY4hJAgL1E8RaXNC071G4Kso2MGmJskCFQhRhg8VOH/FDbC8soP8NHN7e/Hdphwp8G8cE6OBzC8o41ZA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@typescript-eslint/scope-manager@8.46.2': + resolution: {integrity: sha512-LF4b/NmGvdWEHD2H4MsHD8ny6JpiVNDzrSZr3CsckEgCbAGZbYM4Cqxvi9L+WqDMT+51Ozy7lt2M+d0JLEuBqA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@typescript-eslint/scope-manager@8.46.4': resolution: {integrity: sha512-tMDbLGXb1wC+McN1M6QeDx7P7c0UWO5z9CXqp7J8E+xGcJuUuevWKxuG8j41FoweS3+L41SkyKKkia16jpX7CA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -4608,6 +4767,12 @@ packages: peerDependencies: typescript: '>=4.8.4 <5.9.0' + '@typescript-eslint/tsconfig-utils@8.46.2': + resolution: {integrity: sha512-a7QH6fw4S57+F5y2FIxxSDyi5M4UfGF+Jl1bCGd7+L4KsaUY80GsiF/t0UoRFDHAguKlBaACWJRmdrc6Xfkkag==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '>=4.8.4 <6.0.0' + '@typescript-eslint/tsconfig-utils@8.46.4': resolution: {integrity: sha512-+/XqaZPIAk6Cjg7NWgSGe27X4zMGqrFqZ8atJsX3CWxH/jACqWnrWI68h7nHQld0y+k9eTTjb9r+KU4twLoo9A==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -4621,6 +4786,13 @@ packages: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <5.9.0' + '@typescript-eslint/type-utils@8.46.2': + resolution: {integrity: sha512-HbPM4LbaAAt/DjxXaG9yiS9brOOz6fabal4uvUmaUYe6l3K1phQDMQKBRUrr06BQkxkvIZVVHttqiybM9nJsLA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: '>=4.8.4 <6.0.0' + '@typescript-eslint/type-utils@8.46.4': resolution: {integrity: sha512-V4QC8h3fdT5Wro6vANk6eojqfbv5bpwHuMsBcJUJkqs2z5XnYhJzyz9Y02eUmF9u3PgXEUiOt4w4KHR3P+z0PQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -4632,6 +4804,10 @@ packages: resolution: {integrity: sha512-rjLVbmE7HR18kDsjNIZQHxmv9RZwlgzavryL5Lnj2ujIRTeXlKtILHgRNmQ3j4daw7zd+mQgy+uyt6Zo6I0IGA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@typescript-eslint/types@8.46.2': + resolution: {integrity: sha512-lNCWCbq7rpg7qDsQrd3D6NyWYu+gkTENkG5IKYhUIcxSb59SQC/hEQ+MrG4sTgBVghTonNWq42bA/d4yYumldQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@typescript-eslint/types@8.46.4': resolution: {integrity: sha512-USjyxm3gQEePdUwJBFjjGNG18xY9A2grDVGuk7/9AkjIF1L+ZrVnwR5VAU5JXtUnBL/Nwt3H31KlRDaksnM7/w==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -4642,6 +4818,12 @@ packages: peerDependencies: typescript: '>=4.8.4 <5.9.0' + '@typescript-eslint/typescript-estree@8.46.2': + resolution: {integrity: sha512-f7rW7LJ2b7Uh2EiQ+7sza6RDZnajbNbemn54Ob6fRwQbgcIn+GWfyuHDHRYgRoZu1P4AayVScrRW+YfbTvPQoQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '>=4.8.4 <6.0.0' + '@typescript-eslint/typescript-estree@8.46.4': resolution: {integrity: sha512-7oV2qEOr1d4NWNmpXLR35LvCfOkTNymY9oyW+lUHkmCno7aOmIf/hMaydnJBUTBMRCOGZh8YjkFOc8dadEoNGA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -4655,6 +4837,13 @@ packages: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <5.9.0' + '@typescript-eslint/utils@8.46.2': + resolution: {integrity: sha512-sExxzucx0Tud5tE0XqR0lT0psBQvEpnpiul9XbGUB1QwpWJJAps1O/Z7hJxLGiZLBKMCutjTzDgmd1muEhBnVg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: '>=4.8.4 <6.0.0' + '@typescript-eslint/utils@8.46.4': resolution: {integrity: sha512-AbSv11fklGXV6T28dp2Me04Uw90R2iJ30g2bgLz529Koehrmkbs1r7paFqr1vPCZi7hHwYxYtxfyQMRC8QaVSg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -4666,6 +4855,10 @@ packages: resolution: {integrity: sha512-xoh5rJ+tgsRKoXnkBPFRLZ7rjKM0AfVbC68UZ/ECXoDbfggb9RbEySN359acY1vS3qZ0jVTVWzbtfapwm5ztxw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@typescript-eslint/visitor-keys@8.46.2': + resolution: {integrity: sha512-tUFMXI4gxzzMXt4xpGJEsBsTox0XbNQ1y94EwlD/CuZwFcQP79xfQqMhau9HsRc/J0cAPA/HZt1dZPtGn9V/7w==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@typescript-eslint/visitor-keys@8.46.4': resolution: {integrity: sha512-/++5CYLQqsO9HFGLI7APrxBJYo+5OCMpViuhV8q5/Qa3o5mMrF//eQHks+PXcsAVaLdn817fMuS7zqoXNNZGaw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -4911,6 +5104,14 @@ packages: '@xtuc/long@4.2.2': resolution: {integrity: sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==} + '@xyflow/svelte@1.4.1': + resolution: {integrity: sha512-CAegVmLMpX64G6JnhiU7ezoIOY7aX88cf1fSOV8FutKdZNMxcJBykhvaXunOBf7jjDs9X887RH8Jgdl1rMwXww==} + peerDependencies: + svelte: ^5.25.0 + + '@xyflow/system@0.0.72': + resolution: {integrity: sha512-WBI5Aau0fXTXwxHPzceLNS6QdXggSWnGjDtj/gG669crApN8+SCmEtkBth1m7r6pStNo/5fI9McEi7Dk0ymCLA==} + '@yarnpkg/lockfile@1.1.0': resolution: {integrity: sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ==} @@ -5211,6 +5412,9 @@ packages: avvio@8.4.0: resolution: {integrity: sha512-CDSwaxINFy59iNwhYnkvALBwZiTydGkOecZyPkqBpABYR1KqGEsET0VOOYDwtleZSUIdeY36DC2bSZ24CO1igA==} + axios@1.13.1: + resolution: {integrity: sha512-hU4EGxxt+j7TQijx1oYdAjw4xuIp1wRQSsbMFwSthCWeBQur1eF+qJ5iQ5sN3Tw8YRzQNKb8jszgBdMDVqwJcw==} + axios@1.13.2: resolution: {integrity: sha512-VPk9ebNqPcy5lRGuSlKx752IlDatOjT9paPlm8A7yOuW2Fbvp4X3JznJtT4f0GzGLLiWE9W8onz51SqLYwzGaA==} @@ -5348,6 +5552,10 @@ packages: base64-js@1.5.1: resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} + baseline-browser-mapping@2.8.22: + resolution: {integrity: sha512-/tk9kky/d8T8CTXIQYASLyhAxR5VwL3zct1oAoVTaOUHwrmsGnfbRwNdEq+vOl2BN8i3PcDdP0o4Q+jjKQoFbQ==} + hasBin: true + baseline-browser-mapping@2.8.25: resolution: {integrity: sha512-2NovHVesVF5TXefsGX1yzx1xgr7+m9JQenvz6FQY3qd+YXkKkYiv+vTCc7OriP9mcDZpTC5mAOYN4ocd29+erA==} hasBin: true @@ -5429,6 +5637,11 @@ packages: brotli@1.3.3: resolution: {integrity: sha512-oTKjJdShmDuGW94SyyaoQvAjf30dZaHnjJ8uAF+u2/vGJkJbJPJAT1gDiOJP5v1Zb6f9KEyW/1HpuaWIXtGHPg==} + browserslist@4.27.0: + resolution: {integrity: sha512-AXVQwdhot1eqLihwasPElhX2tAZiBjWdJ9i/Zcj2S6QYIjkx62OKSfnobkriB81C3l4w0rVy3Nt4jaTBltYEpw==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true + browserslist@4.28.0: resolution: {integrity: sha512-tbydkR/CxfMwelN0vwdP/pLkDwyAASZ+VfWm4EOwlB6SWhx1sYnWLqo8N5j0rAzPfzfRaxt0mM/4wPU/Su84RQ==} engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} @@ -5534,6 +5747,9 @@ packages: caniuse-api@3.0.0: resolution: {integrity: sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==} + caniuse-lite@1.0.30001752: + resolution: {integrity: sha512-vKUk7beoukxE47P5gcVNKkDRzXdVofotshHwfR9vmpeFKxmI5PBpgOMC18LUJUA/DvJ70Y7RveasIBraqsyO/g==} + caniuse-lite@1.0.30001754: resolution: {integrity: sha512-x6OeBXueoAceOmotzx3PO4Zpt4rzpeIFsSr6AAePTZxSkXiYDUmpypEl7e2+8NCd9bD7bXjqyef8CJYPC1jfxg==} @@ -6048,6 +6264,44 @@ packages: cyclist@1.0.2: resolution: {integrity: sha512-0sVXIohTfLqVIW3kb/0n6IiWF3Ifj5nm2XaSrLq2DI6fKIGa2fYAZdk917rUneaeLVpYfFcyXE2ft0fe3remsA==} + d3-color@3.1.0: + resolution: {integrity: sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==} + engines: {node: '>=12'} + + d3-dispatch@3.0.1: + resolution: {integrity: sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg==} + engines: {node: '>=12'} + + d3-drag@3.0.0: + resolution: {integrity: sha512-pWbUJLdETVA8lQNJecMxoXfH6x+mO2UQo8rSmZ+QqxcbyA3hfeprFgIT//HW2nlHChWeIIMwS2Fq+gEARkhTkg==} + engines: {node: '>=12'} + + d3-ease@3.0.1: + resolution: {integrity: sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==} + engines: {node: '>=12'} + + d3-interpolate@3.0.1: + resolution: {integrity: sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==} + engines: {node: '>=12'} + + d3-selection@3.0.0: + resolution: {integrity: sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==} + engines: {node: '>=12'} + + d3-timer@3.0.1: + resolution: {integrity: sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==} + engines: {node: '>=12'} + + d3-transition@3.0.1: + resolution: {integrity: sha512-ApKvfjsSR6tg06xrL434C0WydLr7JewBB3V+/39RMHsaXTOG0zmt/OAXeng5M5LBm0ojmxJrpomQVZ1aPvBL4w==} + engines: {node: '>=12'} + peerDependencies: + d3-selection: 2 - 3 + + d3-zoom@3.0.0: + resolution: {integrity: sha512-b8AmV3kfQaqWAuacbPuNbL6vahnOJflOhexLzMMNLga62+/nh0JzvJ0aO/5a5MVgUFGS7Hu1P9P03o3fJkDCyw==} + engines: {node: '>=12'} + data-uri-to-buffer@4.0.1: resolution: {integrity: sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==} engines: {node: '>= 12'} @@ -6285,10 +6539,6 @@ packages: resolution: {integrity: sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A==} engines: {node: '>=0.3.1'} - diff@8.0.2: - resolution: {integrity: sha512-sSuxWU5j5SR9QQji/o2qMvqRNYRDOcBTgsJ/DeCf4iSN4gW+gNMXM7wFIP+fdXZxoNiAnHUTGjCr+TSWXdRDKg==} - engines: {node: '>=0.3.1'} - dir-glob@3.0.1: resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} engines: {node: '>=8'} @@ -6374,6 +6624,9 @@ packages: engines: {node: '>=0.10.0'} hasBin: true + electron-to-chromium@1.5.244: + resolution: {integrity: sha512-OszpBN7xZX4vWMPJwB9illkN/znA8M36GQqQxi6MNy9axWxhOfJyZZJtSLQCpEFLHP2xK33BiWx9aIuIEXVCcw==} + electron-to-chromium@1.5.249: resolution: {integrity: sha512-5vcfL3BBe++qZ5kuFhD/p8WOM1N9m3nwvJPULJx+4xf2usSlZFJ0qoNYO2fOX4hi3ocuDcmDobtA+5SFr4OmBg==} @@ -10107,6 +10360,11 @@ packages: rfdc@1.4.1: resolution: {integrity: sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==} + rollup@4.52.5: + resolution: {integrity: sha512-3GuObel8h7Kqdjt0gxkEzaifHTqLVW56Y/bjN7PSQtkKr0w3V/QYSdt6QWYtd7A1xUtYQigtdUfgj1RvWVtorw==} + engines: {node: '>=18.0.0', npm: '>=8.0.0'} + hasBin: true + rollup@4.53.2: resolution: {integrity: sha512-MHngMYwGJVi6Fmnk6ISmnk7JAHRNF0UkuucA0CUW3N3a4KnONPEZz+vUanQP/ZC/iY1Qkf3bwPWzyY84wEks1g==} engines: {node: '>=18.0.0', npm: '>=8.0.0'} @@ -10435,6 +10693,9 @@ packages: resolution: {integrity: sha512-ObmnIF4hXNg1BqhnHmgbDETF8dLPCggZWBjkQfhZpbszZnYur5DUljTcCHii5LC3J5E0yeO/1LIMyH+UvHQgyw==} engines: {node: '>= 0.4'} + shiki@3.14.0: + resolution: {integrity: sha512-J0yvpLI7LSig3Z3acIuDLouV5UCKQqu8qOArwMx+/yPVC3WRMgrP67beaG8F+j4xfEWE0eVC4GeBCIXeOPra1g==} + shiki@3.15.0: resolution: {integrity: sha512-kLdkY6iV3dYbtPwS9KXU7mjfmDm25f5m0IPNFnaXO7TBPcvbUOY72PYXSuSqDzwp+vlH/d7MXpHlKO/x+QoLXw==} @@ -12266,26 +12527,26 @@ snapshots: '@jridgewell/gen-mapping': 0.3.13 '@jridgewell/trace-mapping': 0.3.31 - '@astrojs/check@0.9.5(prettier-plugin-astro@0.14.1)(prettier@3.6.2)(typescript@5.8.3)': + '@astrojs/check@0.9.5(prettier-plugin-astro@0.14.1)(prettier@3.6.2)(typescript@5.9.3)': dependencies: - '@astrojs/language-server': 2.16.0(prettier-plugin-astro@0.14.1)(prettier@3.6.2)(typescript@5.8.3) + '@astrojs/language-server': 2.16.0(prettier-plugin-astro@0.14.1)(prettier@3.6.2)(typescript@5.9.3) chokidar: 4.0.3 kleur: 4.1.5 - typescript: 5.8.3 + typescript: 5.9.3 yargs: 17.7.2 transitivePeerDependencies: - prettier - prettier-plugin-astro - '@astrojs/cloudflare@12.6.10(@types/node@22.19.0)(astro@5.15.5(@netlify/blobs@10.0.7)(@types/node@22.19.0)(jiti@2.4.2)(less@4.1.3)(rollup@4.53.2)(sass-embedded@1.93.3)(sass@1.94.0)(stylus@0.64.0)(terser@5.43.1)(tsx@4.20.6)(typescript@5.8.3)(yaml@2.8.1))(jiti@2.4.2)(less@4.1.3)(sass-embedded@1.93.3)(sass@1.94.0)(stylus@0.64.0)(terser@5.43.1)(tsx@4.20.6)(yaml@2.8.1)': + '@astrojs/cloudflare@12.6.10(@types/node@22.19.0)(astro@5.15.5(@netlify/blobs@10.0.7)(@types/node@22.19.0)(jiti@2.4.2)(less@4.1.3)(rollup@4.53.2)(sass-embedded@1.93.3)(sass@1.94.0)(stylus@0.64.0)(terser@5.43.1)(tsx@4.20.6)(typescript@5.9.3)(yaml@2.8.1))(jiti@2.4.2)(less@4.1.3)(sass-embedded@1.93.3)(sass@1.94.0)(stylus@0.64.0)(terser@5.43.1)(tsx@4.20.6)(yaml@2.8.1)': dependencies: '@astrojs/internal-helpers': 0.7.4 '@astrojs/underscore-redirects': 1.0.0 - '@cloudflare/workers-types': 4.20251109.0 - astro: 5.15.5(@netlify/blobs@10.0.7)(@types/node@22.19.0)(jiti@2.4.2)(less@4.1.3)(rollup@4.53.2)(sass-embedded@1.93.3)(sass@1.94.0)(stylus@0.64.0)(terser@5.43.1)(tsx@4.20.6)(typescript@5.8.3)(yaml@2.8.1) + '@cloudflare/workers-types': 4.20251014.0 + astro: 5.15.5(@netlify/blobs@10.0.7)(@types/node@22.19.0)(jiti@2.4.2)(less@4.1.3)(rollup@4.53.2)(sass-embedded@1.93.3)(sass@1.94.0)(stylus@0.64.0)(terser@5.43.1)(tsx@4.20.6)(typescript@5.9.3)(yaml@2.8.1) tinyglobby: 0.2.15 vite: 6.4.1(@types/node@22.19.0)(jiti@2.4.2)(less@4.1.3)(sass-embedded@1.93.3)(sass@1.94.0)(stylus@0.64.0)(terser@5.43.1)(tsx@4.20.6)(yaml@2.8.1) - wrangler: 4.41.0(@cloudflare/workers-types@4.20251109.0) + wrangler: 4.41.0(@cloudflare/workers-types@4.20251014.0) transitivePeerDependencies: - '@types/node' - bufferutil @@ -12305,12 +12566,12 @@ snapshots: '@astrojs/internal-helpers@0.7.4': {} - '@astrojs/language-server@2.16.0(prettier-plugin-astro@0.14.1)(prettier@3.6.2)(typescript@5.8.3)': + '@astrojs/language-server@2.16.0(prettier-plugin-astro@0.14.1)(prettier@3.6.2)(typescript@5.9.3)': dependencies: '@astrojs/compiler': 2.13.0 '@astrojs/yaml2ts': 0.2.2 '@jridgewell/sourcemap-codec': 1.5.5 - '@volar/kit': 2.4.23(typescript@5.8.3) + '@volar/kit': 2.4.23(typescript@5.9.3) '@volar/language-core': 2.4.23 '@volar/language-server': 2.4.23 '@volar/language-service': 2.4.23 @@ -12357,12 +12618,12 @@ snapshots: transitivePeerDependencies: - supports-color - '@astrojs/mdx@4.3.10(astro@5.15.5(@netlify/blobs@10.0.7)(@types/node@22.19.0)(jiti@2.4.2)(less@4.1.3)(rollup@4.53.2)(sass-embedded@1.93.3)(sass@1.94.0)(stylus@0.64.0)(terser@5.43.1)(tsx@4.20.6)(typescript@5.8.3)(yaml@2.8.1))': + '@astrojs/mdx@4.3.9(astro@5.15.5(@netlify/blobs@10.0.7)(@types/node@22.19.0)(jiti@2.4.2)(less@4.1.3)(rollup@4.53.2)(sass-embedded@1.93.3)(sass@1.94.0)(stylus@0.64.0)(terser@5.43.1)(tsx@4.20.6)(typescript@5.9.3)(yaml@2.8.1))': dependencies: '@astrojs/markdown-remark': 6.3.8 '@mdx-js/mdx': 3.1.1 acorn: 8.15.0 - astro: 5.15.5(@netlify/blobs@10.0.7)(@types/node@22.19.0)(jiti@2.4.2)(less@4.1.3)(rollup@4.53.2)(sass-embedded@1.93.3)(sass@1.94.0)(stylus@0.64.0)(terser@5.43.1)(tsx@4.20.6)(typescript@5.8.3)(yaml@2.8.1) + astro: 5.15.5(@netlify/blobs@10.0.7)(@types/node@22.19.0)(jiti@2.4.2)(less@4.1.3)(rollup@4.53.2)(sass-embedded@1.93.3)(sass@1.94.0)(stylus@0.64.0)(terser@5.43.1)(tsx@4.20.6)(typescript@5.9.3)(yaml@2.8.1) es-module-lexer: 1.7.0 estree-util-visit: 2.0.0 hast-util-to-html: 9.0.5 @@ -12414,17 +12675,17 @@ snapshots: stream-replace-string: 2.0.0 zod: 3.25.76 - '@astrojs/starlight@0.34.8(astro@5.15.5(@netlify/blobs@10.0.7)(@types/node@22.19.0)(jiti@2.4.2)(less@4.1.3)(rollup@4.53.2)(sass-embedded@1.93.3)(sass@1.94.0)(stylus@0.64.0)(terser@5.43.1)(tsx@4.20.6)(typescript@5.8.3)(yaml@2.8.1))': + '@astrojs/starlight@0.34.8(astro@5.15.5(@netlify/blobs@10.0.7)(@types/node@22.19.0)(jiti@2.4.2)(less@4.1.3)(rollup@4.53.2)(sass-embedded@1.93.3)(sass@1.94.0)(stylus@0.64.0)(terser@5.43.1)(tsx@4.20.6)(typescript@5.9.3)(yaml@2.8.1))': dependencies: '@astrojs/markdown-remark': 6.3.8 - '@astrojs/mdx': 4.3.10(astro@5.15.5(@netlify/blobs@10.0.7)(@types/node@22.19.0)(jiti@2.4.2)(less@4.1.3)(rollup@4.53.2)(sass-embedded@1.93.3)(sass@1.94.0)(stylus@0.64.0)(terser@5.43.1)(tsx@4.20.6)(typescript@5.8.3)(yaml@2.8.1)) + '@astrojs/mdx': 4.3.9(astro@5.15.5(@netlify/blobs@10.0.7)(@types/node@22.19.0)(jiti@2.4.2)(less@4.1.3)(rollup@4.53.2)(sass-embedded@1.93.3)(sass@1.94.0)(stylus@0.64.0)(terser@5.43.1)(tsx@4.20.6)(typescript@5.9.3)(yaml@2.8.1)) '@astrojs/sitemap': 3.6.0 '@pagefind/default-ui': 1.4.0 '@types/hast': 3.0.4 '@types/js-yaml': 4.0.9 '@types/mdast': 4.0.4 - astro: 5.15.5(@netlify/blobs@10.0.7)(@types/node@22.19.0)(jiti@2.4.2)(less@4.1.3)(rollup@4.53.2)(sass-embedded@1.93.3)(sass@1.94.0)(stylus@0.64.0)(terser@5.43.1)(tsx@4.20.6)(typescript@5.8.3)(yaml@2.8.1) - astro-expressive-code: 0.41.3(astro@5.15.5(@netlify/blobs@10.0.7)(@types/node@22.19.0)(jiti@2.4.2)(less@4.1.3)(rollup@4.53.2)(sass-embedded@1.93.3)(sass@1.94.0)(stylus@0.64.0)(terser@5.43.1)(tsx@4.20.6)(typescript@5.8.3)(yaml@2.8.1)) + astro: 5.15.5(@netlify/blobs@10.0.7)(@types/node@22.19.0)(jiti@2.4.2)(less@4.1.3)(rollup@4.53.2)(sass-embedded@1.93.3)(sass@1.94.0)(stylus@0.64.0)(terser@5.43.1)(tsx@4.20.6)(typescript@5.9.3)(yaml@2.8.1) + astro-expressive-code: 0.41.3(astro@5.15.5(@netlify/blobs@10.0.7)(@types/node@22.19.0)(jiti@2.4.2)(less@4.1.3)(rollup@4.53.2)(sass-embedded@1.93.3)(sass@1.94.0)(stylus@0.64.0)(terser@5.43.1)(tsx@4.20.6)(typescript@5.9.3)(yaml@2.8.1)) bcp-47: 2.1.0 hast-util-from-html: 2.0.3 hast-util-select: 6.0.4 @@ -13322,6 +13583,11 @@ snapshots: '@babel/helper-string-parser': 7.27.1 '@babel/helper-validator-identifier': 7.28.5 + '@babel/types@7.28.4': + dependencies: + '@babel/helper-string-parser': 7.27.1 + '@babel/helper-validator-identifier': 7.28.5 + '@babel/types@7.28.5': dependencies: '@babel/helper-string-parser': 7.27.1 @@ -13566,7 +13832,10 @@ snapshots: '@cloudflare/workerd-windows-64@1.20251105.0': optional: true - '@cloudflare/workers-types@4.20251109.0': {} + '@cloudflare/workers-types@4.20251014.0': {} + + '@cloudflare/workers-types@4.20251109.0': + optional: true '@colors/colors@1.6.0': {} @@ -14787,7 +15056,7 @@ snapshots: transitivePeerDependencies: - '@types/node' - '@microsoft/api-extractor@7.54.0(@types/node@18.16.20)': + '@microsoft/api-extractor@7.53.3(@types/node@18.16.20)': dependencies: '@microsoft/api-extractor-model': 7.31.3(@types/node@18.16.20) '@microsoft/tsdoc': 0.15.1 @@ -14796,7 +15065,6 @@ snapshots: '@rushstack/rig-package': 0.6.0 '@rushstack/terminal': 0.19.3(@types/node@18.16.20) '@rushstack/ts-command-line': 5.1.3(@types/node@18.16.20) - diff: 8.0.2 lodash: 4.17.21 minimatch: 10.0.3 resolve: 1.22.11 @@ -14837,9 +15105,9 @@ snapshots: lodash: 4.17.21 rslog: 1.3.0 - '@module-federation/bridge-react-webpack-plugin@0.21.3': + '@module-federation/bridge-react-webpack-plugin@0.21.2': dependencies: - '@module-federation/sdk': 0.21.3 + '@module-federation/sdk': 0.21.2 '@types/semver': 7.5.8 semver: 7.6.3 @@ -14849,11 +15117,11 @@ snapshots: '@types/semver': 7.5.8 semver: 7.6.3 - '@module-federation/cli@0.21.3(typescript@5.8.3)(vue-tsc@1.8.27(typescript@5.8.3))': + '@module-federation/cli@0.21.2(typescript@5.8.3)(vue-tsc@1.8.27(typescript@5.8.3))': dependencies: '@modern-js/node-bundle-require': 2.68.2 - '@module-federation/dts-plugin': 0.21.3(typescript@5.8.3)(vue-tsc@1.8.27(typescript@5.8.3)) - '@module-federation/sdk': 0.21.3 + '@module-federation/dts-plugin': 0.21.2(typescript@5.8.3)(vue-tsc@1.8.27(typescript@5.8.3)) + '@module-federation/sdk': 0.21.2 chalk: 3.0.0 commander: 11.1.0 transitivePeerDependencies: @@ -14864,10 +15132,10 @@ snapshots: - utf-8-validate - vue-tsc - '@module-federation/data-prefetch@0.21.3(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + '@module-federation/data-prefetch@0.21.2(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': dependencies: - '@module-federation/runtime': 0.21.3 - '@module-federation/sdk': 0.21.3 + '@module-federation/runtime': 0.21.2 + '@module-federation/sdk': 0.21.2 fs-extra: 9.1.0 react: 19.2.0 react-dom: 19.2.0(react@19.2.0) @@ -14880,15 +15148,15 @@ snapshots: react: 19.2.0 react-dom: 19.2.0(react@19.2.0) - '@module-federation/dts-plugin@0.21.3(typescript@5.8.3)(vue-tsc@1.8.27(typescript@5.8.3))': + '@module-federation/dts-plugin@0.21.2(typescript@5.8.3)(vue-tsc@1.8.27(typescript@5.8.3))': dependencies: - '@module-federation/error-codes': 0.21.3 - '@module-federation/managers': 0.21.3 - '@module-federation/sdk': 0.21.3 - '@module-federation/third-party-dts-extractor': 0.21.3 + '@module-federation/error-codes': 0.21.2 + '@module-federation/managers': 0.21.2 + '@module-federation/sdk': 0.21.2 + '@module-federation/third-party-dts-extractor': 0.21.2 adm-zip: 0.5.16 ansi-colors: 4.1.3 - axios: 1.13.2 + axios: 1.13.1 chalk: 3.0.0 fs-extra: 9.1.0 isomorphic-ws: 5.0.0(ws@8.18.0) @@ -14934,19 +15202,19 @@ snapshots: - supports-color - utf-8-validate - '@module-federation/enhanced@0.21.3(@rspack/core@1.6.1(@swc/helpers@0.5.17))(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.8.3)(vue-tsc@1.8.27(typescript@5.8.3))(webpack@5.102.1(esbuild@0.19.12))': - dependencies: - '@module-federation/bridge-react-webpack-plugin': 0.21.3 - '@module-federation/cli': 0.21.3(typescript@5.8.3)(vue-tsc@1.8.27(typescript@5.8.3)) - '@module-federation/data-prefetch': 0.21.3(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@module-federation/dts-plugin': 0.21.3(typescript@5.8.3)(vue-tsc@1.8.27(typescript@5.8.3)) - '@module-federation/error-codes': 0.21.3 - '@module-federation/inject-external-runtime-core-plugin': 0.21.3(@module-federation/runtime-tools@0.21.3) - '@module-federation/managers': 0.21.3 - '@module-federation/manifest': 0.21.3(typescript@5.8.3)(vue-tsc@1.8.27(typescript@5.8.3)) - '@module-federation/rspack': 0.21.3(@rspack/core@1.6.1(@swc/helpers@0.5.17))(typescript@5.8.3)(vue-tsc@1.8.27(typescript@5.8.3)) - '@module-federation/runtime-tools': 0.21.3 - '@module-federation/sdk': 0.21.3 + '@module-federation/enhanced@0.21.2(@rspack/core@1.6.0(@swc/helpers@0.5.17))(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.8.3)(vue-tsc@1.8.27(typescript@5.8.3))(webpack@5.102.1(esbuild@0.19.12))': + dependencies: + '@module-federation/bridge-react-webpack-plugin': 0.21.2 + '@module-federation/cli': 0.21.2(typescript@5.8.3)(vue-tsc@1.8.27(typescript@5.8.3)) + '@module-federation/data-prefetch': 0.21.2(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@module-federation/dts-plugin': 0.21.2(typescript@5.8.3)(vue-tsc@1.8.27(typescript@5.8.3)) + '@module-federation/error-codes': 0.21.2 + '@module-federation/inject-external-runtime-core-plugin': 0.21.2(@module-federation/runtime-tools@0.21.2) + '@module-federation/managers': 0.21.2 + '@module-federation/manifest': 0.21.2(typescript@5.8.3)(vue-tsc@1.8.27(typescript@5.8.3)) + '@module-federation/rspack': 0.21.2(@rspack/core@1.6.0(@swc/helpers@0.5.17))(typescript@5.8.3)(vue-tsc@1.8.27(typescript@5.8.3)) + '@module-federation/runtime-tools': 0.21.2 + '@module-federation/sdk': 0.21.2 btoa: 1.2.1 schema-utils: 4.3.3 upath: 2.0.1 @@ -14963,7 +15231,7 @@ snapshots: - supports-color - utf-8-validate - '@module-federation/enhanced@0.9.1(@rspack/core@1.6.1(@swc/helpers@0.5.17))(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.8.3)(vue-tsc@1.8.27(typescript@5.8.3))(webpack@5.102.1(esbuild@0.19.12))': + '@module-federation/enhanced@0.9.1(@rspack/core@1.6.0(@swc/helpers@0.5.17))(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.8.3)(vue-tsc@1.8.27(typescript@5.8.3))(webpack@5.102.1(esbuild@0.19.12))': dependencies: '@module-federation/bridge-react-webpack-plugin': 0.9.1 '@module-federation/data-prefetch': 0.9.1(react-dom@19.2.0(react@19.2.0))(react@19.2.0) @@ -14972,7 +15240,7 @@ snapshots: '@module-federation/inject-external-runtime-core-plugin': 0.9.1(@module-federation/runtime-tools@0.9.1) '@module-federation/managers': 0.9.1 '@module-federation/manifest': 0.9.1(typescript@5.8.3)(vue-tsc@1.8.27(typescript@5.8.3)) - '@module-federation/rspack': 0.9.1(@rspack/core@1.6.1(@swc/helpers@0.5.17))(typescript@5.8.3)(vue-tsc@1.8.27(typescript@5.8.3)) + '@module-federation/rspack': 0.9.1(@rspack/core@1.6.0(@swc/helpers@0.5.17))(typescript@5.8.3)(vue-tsc@1.8.27(typescript@5.8.3)) '@module-federation/runtime-tools': 0.9.1 '@module-federation/sdk': 0.9.1 btoa: 1.2.1 @@ -14992,21 +15260,19 @@ snapshots: '@module-federation/error-codes@0.21.2': {} - '@module-federation/error-codes@0.21.3': {} - '@module-federation/error-codes@0.9.1': {} - '@module-federation/inject-external-runtime-core-plugin@0.21.3(@module-federation/runtime-tools@0.21.3)': + '@module-federation/inject-external-runtime-core-plugin@0.21.2(@module-federation/runtime-tools@0.21.2)': dependencies: - '@module-federation/runtime-tools': 0.21.3 + '@module-federation/runtime-tools': 0.21.2 '@module-federation/inject-external-runtime-core-plugin@0.9.1(@module-federation/runtime-tools@0.9.1)': dependencies: '@module-federation/runtime-tools': 0.9.1 - '@module-federation/managers@0.21.3': + '@module-federation/managers@0.21.2': dependencies: - '@module-federation/sdk': 0.21.3 + '@module-federation/sdk': 0.21.2 find-pkg: 2.0.0 fs-extra: 9.1.0 @@ -15016,11 +15282,11 @@ snapshots: find-pkg: 2.0.0 fs-extra: 9.1.0 - '@module-federation/manifest@0.21.3(typescript@5.8.3)(vue-tsc@1.8.27(typescript@5.8.3))': + '@module-federation/manifest@0.21.2(typescript@5.8.3)(vue-tsc@1.8.27(typescript@5.8.3))': dependencies: - '@module-federation/dts-plugin': 0.21.3(typescript@5.8.3)(vue-tsc@1.8.27(typescript@5.8.3)) - '@module-federation/managers': 0.21.3 - '@module-federation/sdk': 0.21.3 + '@module-federation/dts-plugin': 0.21.2(typescript@5.8.3)(vue-tsc@1.8.27(typescript@5.8.3)) + '@module-federation/managers': 0.21.2 + '@module-federation/sdk': 0.21.2 chalk: 3.0.0 find-pkg: 2.0.0 transitivePeerDependencies: @@ -15046,17 +15312,17 @@ snapshots: - utf-8-validate - vue-tsc - '@module-federation/node@2.7.22(@rspack/core@1.6.1(@swc/helpers@0.5.17))(next@15.0.3(@babel/core@7.28.5)(@opentelemetry/api@1.8.0)(babel-plugin-macros@3.1.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(sass@1.94.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.8.3)(vue-tsc@1.8.27(typescript@5.8.3))(webpack@5.102.1(esbuild@0.19.12))': + '@module-federation/node@2.7.21(@rspack/core@1.6.0(@swc/helpers@0.5.17))(next@15.0.3(@babel/core@7.28.5)(@opentelemetry/api@1.8.0)(babel-plugin-macros@3.1.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(sass@1.93.3))(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.8.3)(vue-tsc@1.8.27(typescript@5.8.3))(webpack@5.102.1(esbuild@0.19.12))': dependencies: - '@module-federation/enhanced': 0.21.3(@rspack/core@1.6.1(@swc/helpers@0.5.17))(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.8.3)(vue-tsc@1.8.27(typescript@5.8.3))(webpack@5.102.1(esbuild@0.19.12)) - '@module-federation/runtime': 0.21.3 - '@module-federation/sdk': 0.21.3 + '@module-federation/enhanced': 0.21.2(@rspack/core@1.6.0(@swc/helpers@0.5.17))(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.8.3)(vue-tsc@1.8.27(typescript@5.8.3))(webpack@5.102.1(esbuild@0.19.12)) + '@module-federation/runtime': 0.21.2 + '@module-federation/sdk': 0.21.2 btoa: 1.2.1 encoding: 0.1.13 node-fetch: 2.7.0(encoding@0.1.13) webpack: 5.102.1(esbuild@0.19.12) optionalDependencies: - next: 15.0.3(@babel/core@7.28.5)(@opentelemetry/api@1.8.0)(babel-plugin-macros@3.1.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(sass@1.94.0) + next: 15.0.3(@babel/core@7.28.5)(@opentelemetry/api@1.8.0)(babel-plugin-macros@3.1.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(sass@1.93.3) react: 19.2.0 react-dom: 19.2.0(react@19.2.0) transitivePeerDependencies: @@ -15068,16 +15334,16 @@ snapshots: - utf-8-validate - vue-tsc - '@module-federation/rspack@0.21.3(@rspack/core@1.6.1(@swc/helpers@0.5.17))(typescript@5.8.3)(vue-tsc@1.8.27(typescript@5.8.3))': + '@module-federation/rspack@0.21.2(@rspack/core@1.6.0(@swc/helpers@0.5.17))(typescript@5.8.3)(vue-tsc@1.8.27(typescript@5.8.3))': dependencies: - '@module-federation/bridge-react-webpack-plugin': 0.21.3 - '@module-federation/dts-plugin': 0.21.3(typescript@5.8.3)(vue-tsc@1.8.27(typescript@5.8.3)) - '@module-federation/inject-external-runtime-core-plugin': 0.21.3(@module-federation/runtime-tools@0.21.3) - '@module-federation/managers': 0.21.3 - '@module-federation/manifest': 0.21.3(typescript@5.8.3)(vue-tsc@1.8.27(typescript@5.8.3)) - '@module-federation/runtime-tools': 0.21.3 - '@module-federation/sdk': 0.21.3 - '@rspack/core': 1.6.1(@swc/helpers@0.5.17) + '@module-federation/bridge-react-webpack-plugin': 0.21.2 + '@module-federation/dts-plugin': 0.21.2(typescript@5.8.3)(vue-tsc@1.8.27(typescript@5.8.3)) + '@module-federation/inject-external-runtime-core-plugin': 0.21.2(@module-federation/runtime-tools@0.21.2) + '@module-federation/managers': 0.21.2 + '@module-federation/manifest': 0.21.2(typescript@5.8.3)(vue-tsc@1.8.27(typescript@5.8.3)) + '@module-federation/runtime-tools': 0.21.2 + '@module-federation/sdk': 0.21.2 + '@rspack/core': 1.6.0(@swc/helpers@0.5.17) btoa: 1.2.1 optionalDependencies: typescript: 5.8.3 @@ -15088,7 +15354,7 @@ snapshots: - supports-color - utf-8-validate - '@module-federation/rspack@0.9.1(@rspack/core@1.6.1(@swc/helpers@0.5.17))(typescript@5.8.3)(vue-tsc@1.8.27(typescript@5.8.3))': + '@module-federation/rspack@0.9.1(@rspack/core@1.6.0(@swc/helpers@0.5.17))(typescript@5.8.3)(vue-tsc@1.8.27(typescript@5.8.3))': dependencies: '@module-federation/bridge-react-webpack-plugin': 0.9.1 '@module-federation/dts-plugin': 0.9.1(typescript@5.8.3)(vue-tsc@1.8.27(typescript@5.8.3)) @@ -15097,7 +15363,7 @@ snapshots: '@module-federation/manifest': 0.9.1(typescript@5.8.3)(vue-tsc@1.8.27(typescript@5.8.3)) '@module-federation/runtime-tools': 0.9.1 '@module-federation/sdk': 0.9.1 - '@rspack/core': 1.6.1(@swc/helpers@0.5.17) + '@rspack/core': 1.6.0(@swc/helpers@0.5.17) optionalDependencies: typescript: 5.8.3 vue-tsc: 1.8.27(typescript@5.8.3) @@ -15112,11 +15378,6 @@ snapshots: '@module-federation/error-codes': 0.21.2 '@module-federation/sdk': 0.21.2 - '@module-federation/runtime-core@0.21.3': - dependencies: - '@module-federation/error-codes': 0.21.3 - '@module-federation/sdk': 0.21.3 - '@module-federation/runtime-core@0.9.1': dependencies: '@module-federation/error-codes': 0.9.1 @@ -15127,11 +15388,6 @@ snapshots: '@module-federation/runtime': 0.21.2 '@module-federation/webpack-bundler-runtime': 0.21.2 - '@module-federation/runtime-tools@0.21.3': - dependencies: - '@module-federation/runtime': 0.21.3 - '@module-federation/webpack-bundler-runtime': 0.21.3 - '@module-federation/runtime-tools@0.9.1': dependencies: '@module-federation/runtime': 0.9.1 @@ -15143,12 +15399,6 @@ snapshots: '@module-federation/runtime-core': 0.21.2 '@module-federation/sdk': 0.21.2 - '@module-federation/runtime@0.21.3': - dependencies: - '@module-federation/error-codes': 0.21.3 - '@module-federation/runtime-core': 0.21.3 - '@module-federation/sdk': 0.21.3 - '@module-federation/runtime@0.9.1': dependencies: '@module-federation/error-codes': 0.9.1 @@ -15157,11 +15407,9 @@ snapshots: '@module-federation/sdk@0.21.2': {} - '@module-federation/sdk@0.21.3': {} - '@module-federation/sdk@0.9.1': {} - '@module-federation/third-party-dts-extractor@0.21.3': + '@module-federation/third-party-dts-extractor@0.21.2': dependencies: find-pkg: 2.0.0 fs-extra: 9.1.0 @@ -15178,11 +15426,6 @@ snapshots: '@module-federation/runtime': 0.21.2 '@module-federation/sdk': 0.21.2 - '@module-federation/webpack-bundler-runtime@0.21.3': - dependencies: - '@module-federation/runtime': 0.21.3 - '@module-federation/sdk': 0.21.3 - '@module-federation/webpack-bundler-runtime@0.9.1': dependencies: '@module-federation/runtime': 0.9.1 @@ -15236,7 +15479,7 @@ snapshots: '@netlify/cache-utils': 6.0.4 '@netlify/config': 23.2.0 '@netlify/edge-bundler': 14.2.2 - '@netlify/functions-utils': 6.2.13(encoding@0.1.13)(rollup@4.53.2)(supports-color@10.2.2) + '@netlify/functions-utils': 6.2.12(encoding@0.1.13)(rollup@4.53.2)(supports-color@10.2.2) '@netlify/git-utils': 6.0.2 '@netlify/opentelemetry-utils': 2.0.1(@opentelemetry/api@1.8.0) '@netlify/plugins-list': 6.80.0 @@ -15387,9 +15630,9 @@ snapshots: '@netlify/types': 2.0.2 get-port: 7.1.0 - '@netlify/functions-utils@6.2.13(encoding@0.1.13)(rollup@4.53.2)(supports-color@10.2.2)': + '@netlify/functions-utils@6.2.12(encoding@0.1.13)(rollup@4.53.2)(supports-color@10.2.2)': dependencies: - '@netlify/zip-it-and-ship-it': 14.1.13(encoding@0.1.13)(rollup@4.53.2)(supports-color@10.2.2) + '@netlify/zip-it-and-ship-it': 14.1.12(encoding@0.1.13)(rollup@4.53.2)(supports-color@10.2.2) cpy: 11.1.0 path-exists: 5.0.0 transitivePeerDependencies: @@ -15537,10 +15780,10 @@ snapshots: - rollup - supports-color - '@netlify/zip-it-and-ship-it@14.1.13(encoding@0.1.13)(rollup@4.53.2)(supports-color@10.2.2)': + '@netlify/zip-it-and-ship-it@14.1.12(encoding@0.1.13)(rollup@4.53.2)(supports-color@10.2.2)': dependencies: '@babel/parser': 7.28.5 - '@babel/types': 7.28.5 + '@babel/types': 7.28.4 '@netlify/binary-info': 1.0.0 '@netlify/serverless-functions-api': 2.7.1 '@vercel/nft': 0.29.4(encoding@0.1.13)(rollup@4.53.2)(supports-color@10.2.2) @@ -15564,7 +15807,7 @@ snapshots: precinct: 12.2.0(supports-color@10.2.2) require-package-name: 2.0.1 resolve: 2.0.0-next.5 - semver: 7.7.3 + semver: 7.7.2 tmp-promise: 3.0.3 toml: 3.0.0 unixify: 1.0.0 @@ -15720,8 +15963,8 @@ snapshots: '@nx/devkit': 21.2.1(nx@21.2.1) '@nx/js': 21.2.1(@babel/traverse@7.28.5)(nx@21.2.1) '@typescript-eslint/parser': 8.46.4(eslint@9.39.1(jiti@2.4.2))(typescript@5.8.3) - '@typescript-eslint/type-utils': 8.46.4(eslint@9.39.1(jiti@2.4.2))(typescript@5.8.3) - '@typescript-eslint/utils': 8.46.4(eslint@9.39.1(jiti@2.4.2))(typescript@5.8.3) + '@typescript-eslint/type-utils': 8.46.2(eslint@9.39.1(jiti@2.4.2))(typescript@5.8.3) + '@typescript-eslint/utils': 8.46.2(eslint@9.39.1(jiti@2.4.2))(typescript@5.8.3) chalk: 4.1.2 confusing-browser-globals: 1.0.11 globals: 15.15.0 @@ -15873,15 +16116,15 @@ snapshots: - nx - supports-color - '@nx/module-federation@21.2.1(@babel/traverse@7.28.5)(@swc/helpers@0.5.17)(esbuild@0.19.12)(next@15.0.3(@babel/core@7.28.5)(@opentelemetry/api@1.8.0)(babel-plugin-macros@3.1.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(sass@1.94.0))(nx@21.2.1)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.8.3)(vue-tsc@1.8.27(typescript@5.8.3))': + '@nx/module-federation@21.2.1(@babel/traverse@7.28.5)(@swc/helpers@0.5.17)(esbuild@0.19.12)(next@15.0.3(@babel/core@7.28.5)(@opentelemetry/api@1.8.0)(babel-plugin-macros@3.1.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(sass@1.93.3))(nx@21.2.1)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.8.3)(vue-tsc@1.8.27(typescript@5.8.3))': dependencies: - '@module-federation/enhanced': 0.9.1(@rspack/core@1.6.1(@swc/helpers@0.5.17))(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.8.3)(vue-tsc@1.8.27(typescript@5.8.3))(webpack@5.102.1(esbuild@0.19.12)) - '@module-federation/node': 2.7.22(@rspack/core@1.6.1(@swc/helpers@0.5.17))(next@15.0.3(@babel/core@7.28.5)(@opentelemetry/api@1.8.0)(babel-plugin-macros@3.1.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(sass@1.94.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.8.3)(vue-tsc@1.8.27(typescript@5.8.3))(webpack@5.102.1(esbuild@0.19.12)) + '@module-federation/enhanced': 0.9.1(@rspack/core@1.6.0(@swc/helpers@0.5.17))(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.8.3)(vue-tsc@1.8.27(typescript@5.8.3))(webpack@5.102.1(esbuild@0.19.12)) + '@module-federation/node': 2.7.21(@rspack/core@1.6.0(@swc/helpers@0.5.17))(next@15.0.3(@babel/core@7.28.5)(@opentelemetry/api@1.8.0)(babel-plugin-macros@3.1.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(sass@1.93.3))(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.8.3)(vue-tsc@1.8.27(typescript@5.8.3))(webpack@5.102.1(esbuild@0.19.12)) '@module-federation/sdk': 0.9.1 '@nx/devkit': 21.2.1(nx@21.2.1) '@nx/js': 21.2.1(@babel/traverse@7.28.5)(nx@21.2.1) '@nx/web': 21.2.1(@babel/traverse@7.28.5)(nx@21.2.1) - '@rspack/core': 1.6.1(@swc/helpers@0.5.17) + '@rspack/core': 1.6.0(@swc/helpers@0.5.17) express: 4.21.2 http-proxy-middleware: 3.0.5 picocolors: 1.1.1 @@ -15907,21 +16150,21 @@ snapshots: - vue-tsc - webpack-cli - '@nx/next@21.2.1(@babel/core@7.28.5)(@babel/traverse@7.28.5)(@rspack/core@1.6.1(@swc/helpers@0.5.17))(@swc/helpers@0.5.17)(@zkochan/js-yaml@0.0.7)(esbuild@0.19.12)(eslint@9.39.1(jiti@2.4.2))(next@15.0.3(@babel/core@7.28.5)(@opentelemetry/api@1.8.0)(babel-plugin-macros@3.1.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(sass@1.94.0))(nx@21.2.1)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.8.3)(vue-template-compiler@2.7.16)(vue-tsc@1.8.27(typescript@5.8.3))(webpack@5.102.1(esbuild@0.19.12))': + '@nx/next@21.2.1(@babel/core@7.28.5)(@babel/traverse@7.28.5)(@rspack/core@1.6.0(@swc/helpers@0.5.17))(@swc/helpers@0.5.17)(@zkochan/js-yaml@0.0.7)(esbuild@0.19.12)(eslint@9.39.1(jiti@2.4.2))(next@15.0.3(@babel/core@7.28.5)(@opentelemetry/api@1.8.0)(babel-plugin-macros@3.1.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(sass@1.93.3))(nx@21.2.1)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.8.3)(vue-template-compiler@2.7.16)(vue-tsc@1.8.27(typescript@5.8.3))(webpack@5.102.1(esbuild@0.19.12))': dependencies: '@babel/plugin-proposal-decorators': 7.28.0(@babel/core@7.28.5) '@nx/devkit': 21.2.1(nx@21.2.1) '@nx/eslint': 21.2.1(@babel/traverse@7.28.5)(@zkochan/js-yaml@0.0.7)(eslint@9.39.1(jiti@2.4.2))(nx@21.2.1) '@nx/js': 21.2.1(@babel/traverse@7.28.5)(nx@21.2.1) - '@nx/react': 21.2.1(@babel/traverse@7.28.5)(@swc/helpers@0.5.17)(@zkochan/js-yaml@0.0.7)(esbuild@0.19.12)(eslint@9.39.1(jiti@2.4.2))(next@15.0.3(@babel/core@7.28.5)(@opentelemetry/api@1.8.0)(babel-plugin-macros@3.1.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(sass@1.94.0))(nx@21.2.1)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.8.3)(vue-tsc@1.8.27(typescript@5.8.3))(webpack@5.102.1(esbuild@0.19.12)) + '@nx/react': 21.2.1(@babel/traverse@7.28.5)(@swc/helpers@0.5.17)(@zkochan/js-yaml@0.0.7)(esbuild@0.19.12)(eslint@9.39.1(jiti@2.4.2))(next@15.0.3(@babel/core@7.28.5)(@opentelemetry/api@1.8.0)(babel-plugin-macros@3.1.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(sass@1.93.3))(nx@21.2.1)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.8.3)(vue-tsc@1.8.27(typescript@5.8.3))(webpack@5.102.1(esbuild@0.19.12)) '@nx/web': 21.2.1(@babel/traverse@7.28.5)(nx@21.2.1) - '@nx/webpack': 21.2.1(@babel/traverse@7.28.5)(@rspack/core@1.6.1(@swc/helpers@0.5.17))(esbuild@0.19.12)(nx@21.2.1)(typescript@5.8.3)(vue-template-compiler@2.7.16) + '@nx/webpack': 21.2.1(@babel/traverse@7.28.5)(@rspack/core@1.6.0(@swc/helpers@0.5.17))(esbuild@0.19.12)(nx@21.2.1)(typescript@5.8.3)(vue-template-compiler@2.7.16) '@phenomnomnominal/tsquery': 5.0.1(typescript@5.8.3) '@svgr/webpack': 8.1.0(typescript@5.8.3) copy-webpack-plugin: 10.2.4(webpack@5.102.1(esbuild@0.19.12)) file-loader: 6.2.0(webpack@5.102.1(esbuild@0.19.12)) ignore: 5.3.2 - next: 15.0.3(@babel/core@7.28.5)(@opentelemetry/api@1.8.0)(babel-plugin-macros@3.1.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(sass@1.94.0) + next: 15.0.3(@babel/core@7.28.5)(@opentelemetry/api@1.8.0)(babel-plugin-macros@3.1.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(sass@1.93.3) semver: 7.7.3 tslib: 2.8.1 webpack-merge: 5.10.0 @@ -16065,12 +16308,12 @@ snapshots: - typescript - verdaccio - '@nx/react@21.2.1(@babel/traverse@7.28.5)(@swc/helpers@0.5.17)(@zkochan/js-yaml@0.0.7)(esbuild@0.19.12)(eslint@9.39.1(jiti@2.4.2))(next@15.0.3(@babel/core@7.28.5)(@opentelemetry/api@1.8.0)(babel-plugin-macros@3.1.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(sass@1.94.0))(nx@21.2.1)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.8.3)(vue-tsc@1.8.27(typescript@5.8.3))(webpack@5.102.1(esbuild@0.19.12))': + '@nx/react@21.2.1(@babel/traverse@7.28.5)(@swc/helpers@0.5.17)(@zkochan/js-yaml@0.0.7)(esbuild@0.19.12)(eslint@9.39.1(jiti@2.4.2))(next@15.0.3(@babel/core@7.28.5)(@opentelemetry/api@1.8.0)(babel-plugin-macros@3.1.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(sass@1.93.3))(nx@21.2.1)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.8.3)(vue-tsc@1.8.27(typescript@5.8.3))(webpack@5.102.1(esbuild@0.19.12))': dependencies: '@nx/devkit': 21.2.1(nx@21.2.1) '@nx/eslint': 21.2.1(@babel/traverse@7.28.5)(@zkochan/js-yaml@0.0.7)(eslint@9.39.1(jiti@2.4.2))(nx@21.2.1) '@nx/js': 21.2.1(@babel/traverse@7.28.5)(nx@21.2.1) - '@nx/module-federation': 21.2.1(@babel/traverse@7.28.5)(@swc/helpers@0.5.17)(esbuild@0.19.12)(next@15.0.3(@babel/core@7.28.5)(@opentelemetry/api@1.8.0)(babel-plugin-macros@3.1.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(sass@1.94.0))(nx@21.2.1)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.8.3)(vue-tsc@1.8.27(typescript@5.8.3)) + '@nx/module-federation': 21.2.1(@babel/traverse@7.28.5)(@swc/helpers@0.5.17)(esbuild@0.19.12)(next@15.0.3(@babel/core@7.28.5)(@opentelemetry/api@1.8.0)(babel-plugin-macros@3.1.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(sass@1.93.3))(nx@21.2.1)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.8.3)(vue-tsc@1.8.27(typescript@5.8.3)) '@nx/web': 21.2.1(@babel/traverse@7.28.5)(nx@21.2.1) '@phenomnomnominal/tsquery': 5.0.1(typescript@5.8.3) '@svgr/webpack': 8.1.0(typescript@5.8.3) @@ -16104,7 +16347,7 @@ snapshots: - webpack - webpack-cli - '@nx/vite@21.2.1(@babel/traverse@7.28.5)(nx@21.2.1)(typescript@5.8.3)(vite@6.3.5(@types/node@18.16.20)(jiti@2.4.2)(less@4.1.3)(sass-embedded@1.93.3)(sass@1.94.0)(stylus@0.64.0)(terser@5.43.1)(tsx@4.20.6)(yaml@2.8.1))(vitest@1.3.1)': + '@nx/vite@21.2.1(@babel/traverse@7.28.5)(nx@21.2.1)(typescript@5.8.3)(vite@6.3.5(@types/node@18.16.20)(jiti@2.4.2)(less@4.1.3)(sass-embedded@1.93.3)(sass@1.93.3)(stylus@0.64.0)(terser@5.43.1)(tsx@4.20.6)(yaml@2.8.1))(vitest@1.3.1)': dependencies: '@nx/devkit': 21.2.1(nx@21.2.1) '@nx/js': 21.2.1(@babel/traverse@7.28.5)(nx@21.2.1) @@ -16115,8 +16358,8 @@ snapshots: picomatch: 4.0.2 semver: 7.7.3 tsconfig-paths: 4.2.0 - vite: 6.3.5(@types/node@18.16.20)(jiti@2.4.2)(less@4.1.3)(sass-embedded@1.93.3)(sass@1.94.0)(stylus@0.64.0)(terser@5.43.1)(tsx@4.20.6)(yaml@2.8.1) - vitest: 1.3.1(@types/node@18.16.20)(@vitest/ui@1.6.1)(jsdom@22.1.0)(less@4.1.3)(sass-embedded@1.93.3)(sass@1.94.0)(stylus@0.64.0)(terser@5.43.1) + vite: 6.3.5(@types/node@18.16.20)(jiti@2.4.2)(less@4.1.3)(sass-embedded@1.93.3)(sass@1.93.3)(stylus@0.64.0)(terser@5.43.1)(tsx@4.20.6)(yaml@2.8.1) + vitest: 1.3.1(@types/node@18.16.20)(@vitest/ui@1.6.1)(jsdom@22.1.0)(less@4.1.3)(sass-embedded@1.93.3)(sass@1.93.3)(stylus@0.64.0)(terser@5.43.1) transitivePeerDependencies: - '@babel/traverse' - '@swc-node/register' @@ -16144,7 +16387,7 @@ snapshots: - supports-color - verdaccio - '@nx/webpack@21.2.1(@babel/traverse@7.28.5)(@rspack/core@1.6.1(@swc/helpers@0.5.17))(esbuild@0.19.12)(nx@21.2.1)(typescript@5.8.3)(vue-template-compiler@2.7.16)': + '@nx/webpack@21.2.1(@babel/traverse@7.28.5)(@rspack/core@1.6.0(@swc/helpers@0.5.17))(esbuild@0.19.12)(nx@21.2.1)(typescript@5.8.3)(vue-template-compiler@2.7.16)': dependencies: '@babel/core': 7.28.5 '@nx/devkit': 21.2.1(nx@21.2.1) @@ -16153,9 +16396,9 @@ snapshots: ajv: 8.17.1 autoprefixer: 10.4.20(postcss@8.4.49) babel-loader: 9.2.1(@babel/core@7.28.5)(webpack@5.99.9(esbuild@0.19.12)) - browserslist: 4.28.0 + browserslist: 4.27.0 copy-webpack-plugin: 10.2.4(webpack@5.99.9(esbuild@0.19.12)) - css-loader: 6.11.0(@rspack/core@1.6.1(@swc/helpers@0.5.17))(webpack@5.99.9(esbuild@0.19.12)) + css-loader: 6.11.0(@rspack/core@1.6.0(@swc/helpers@0.5.17))(webpack@5.99.9(esbuild@0.19.12)) css-minimizer-webpack-plugin: 5.0.1(esbuild@0.19.12)(webpack@5.99.9(esbuild@0.19.12)) fork-ts-checker-webpack-plugin: 7.2.13(typescript@5.8.3)(vue-template-compiler@2.7.16)(webpack@5.99.9(esbuild@0.19.12)) less: 4.1.3 @@ -16169,9 +16412,9 @@ snapshots: postcss-import: 14.1.0(postcss@8.4.49) postcss-loader: 6.2.1(postcss@8.4.49)(webpack@5.99.9(esbuild@0.19.12)) rxjs: 7.8.2 - sass: 1.94.0 + sass: 1.93.3 sass-embedded: 1.93.3 - sass-loader: 16.0.6(@rspack/core@1.6.1(@swc/helpers@0.5.17))(sass-embedded@1.93.3)(sass@1.94.0)(webpack@5.99.9(esbuild@0.19.12)) + sass-loader: 16.0.6(@rspack/core@1.6.0(@swc/helpers@0.5.17))(sass-embedded@1.93.3)(sass@1.93.3)(webpack@5.99.9(esbuild@0.19.12)) source-map-loader: 5.0.0(webpack@5.99.9(esbuild@0.19.12)) style-loader: 3.3.4(webpack@5.99.9(esbuild@0.19.12)) stylus: 0.64.0 @@ -16449,121 +16692,187 @@ snapshots: optionalDependencies: rollup: 4.53.2 + '@rollup/rollup-android-arm-eabi@4.52.5': + optional: true + '@rollup/rollup-android-arm-eabi@4.53.2': optional: true + '@rollup/rollup-android-arm64@4.52.5': + optional: true + '@rollup/rollup-android-arm64@4.53.2': optional: true + '@rollup/rollup-darwin-arm64@4.52.5': + optional: true + '@rollup/rollup-darwin-arm64@4.53.2': optional: true + '@rollup/rollup-darwin-x64@4.52.5': + optional: true + '@rollup/rollup-darwin-x64@4.53.2': optional: true + '@rollup/rollup-freebsd-arm64@4.52.5': + optional: true + '@rollup/rollup-freebsd-arm64@4.53.2': optional: true + '@rollup/rollup-freebsd-x64@4.52.5': + optional: true + '@rollup/rollup-freebsd-x64@4.53.2': optional: true + '@rollup/rollup-linux-arm-gnueabihf@4.52.5': + optional: true + '@rollup/rollup-linux-arm-gnueabihf@4.53.2': optional: true + '@rollup/rollup-linux-arm-musleabihf@4.52.5': + optional: true + '@rollup/rollup-linux-arm-musleabihf@4.53.2': optional: true + '@rollup/rollup-linux-arm64-gnu@4.52.5': + optional: true + '@rollup/rollup-linux-arm64-gnu@4.53.2': optional: true + '@rollup/rollup-linux-arm64-musl@4.52.5': + optional: true + '@rollup/rollup-linux-arm64-musl@4.53.2': optional: true + '@rollup/rollup-linux-loong64-gnu@4.52.5': + optional: true + '@rollup/rollup-linux-loong64-gnu@4.53.2': optional: true + '@rollup/rollup-linux-ppc64-gnu@4.52.5': + optional: true + '@rollup/rollup-linux-ppc64-gnu@4.53.2': optional: true + '@rollup/rollup-linux-riscv64-gnu@4.52.5': + optional: true + '@rollup/rollup-linux-riscv64-gnu@4.53.2': optional: true + '@rollup/rollup-linux-riscv64-musl@4.52.5': + optional: true + '@rollup/rollup-linux-riscv64-musl@4.53.2': optional: true + '@rollup/rollup-linux-s390x-gnu@4.52.5': + optional: true + '@rollup/rollup-linux-s390x-gnu@4.53.2': optional: true + '@rollup/rollup-linux-x64-gnu@4.52.5': + optional: true + '@rollup/rollup-linux-x64-gnu@4.53.2': optional: true + '@rollup/rollup-linux-x64-musl@4.52.5': + optional: true + '@rollup/rollup-linux-x64-musl@4.53.2': optional: true + '@rollup/rollup-openharmony-arm64@4.52.5': + optional: true + '@rollup/rollup-openharmony-arm64@4.53.2': optional: true + '@rollup/rollup-win32-arm64-msvc@4.52.5': + optional: true + '@rollup/rollup-win32-arm64-msvc@4.53.2': optional: true + '@rollup/rollup-win32-ia32-msvc@4.52.5': + optional: true + '@rollup/rollup-win32-ia32-msvc@4.53.2': optional: true + '@rollup/rollup-win32-x64-gnu@4.52.5': + optional: true + '@rollup/rollup-win32-x64-gnu@4.53.2': optional: true + '@rollup/rollup-win32-x64-msvc@4.52.5': + optional: true + '@rollup/rollup-win32-x64-msvc@4.53.2': optional: true - '@rspack/binding-darwin-arm64@1.6.1': + '@rspack/binding-darwin-arm64@1.6.0': optional: true - '@rspack/binding-darwin-x64@1.6.1': + '@rspack/binding-darwin-x64@1.6.0': optional: true - '@rspack/binding-linux-arm64-gnu@1.6.1': + '@rspack/binding-linux-arm64-gnu@1.6.0': optional: true - '@rspack/binding-linux-arm64-musl@1.6.1': + '@rspack/binding-linux-arm64-musl@1.6.0': optional: true - '@rspack/binding-linux-x64-gnu@1.6.1': + '@rspack/binding-linux-x64-gnu@1.6.0': optional: true - '@rspack/binding-linux-x64-musl@1.6.1': + '@rspack/binding-linux-x64-musl@1.6.0': optional: true - '@rspack/binding-wasm32-wasi@1.6.1': + '@rspack/binding-wasm32-wasi@1.6.0': dependencies: '@napi-rs/wasm-runtime': 1.0.7 optional: true - '@rspack/binding-win32-arm64-msvc@1.6.1': + '@rspack/binding-win32-arm64-msvc@1.6.0': optional: true - '@rspack/binding-win32-ia32-msvc@1.6.1': + '@rspack/binding-win32-ia32-msvc@1.6.0': optional: true - '@rspack/binding-win32-x64-msvc@1.6.1': + '@rspack/binding-win32-x64-msvc@1.6.0': optional: true - '@rspack/binding@1.6.1': + '@rspack/binding@1.6.0': optionalDependencies: - '@rspack/binding-darwin-arm64': 1.6.1 - '@rspack/binding-darwin-x64': 1.6.1 - '@rspack/binding-linux-arm64-gnu': 1.6.1 - '@rspack/binding-linux-arm64-musl': 1.6.1 - '@rspack/binding-linux-x64-gnu': 1.6.1 - '@rspack/binding-linux-x64-musl': 1.6.1 - '@rspack/binding-wasm32-wasi': 1.6.1 - '@rspack/binding-win32-arm64-msvc': 1.6.1 - '@rspack/binding-win32-ia32-msvc': 1.6.1 - '@rspack/binding-win32-x64-msvc': 1.6.1 - - '@rspack/core@1.6.1(@swc/helpers@0.5.17)': + '@rspack/binding-darwin-arm64': 1.6.0 + '@rspack/binding-darwin-x64': 1.6.0 + '@rspack/binding-linux-arm64-gnu': 1.6.0 + '@rspack/binding-linux-arm64-musl': 1.6.0 + '@rspack/binding-linux-x64-gnu': 1.6.0 + '@rspack/binding-linux-x64-musl': 1.6.0 + '@rspack/binding-wasm32-wasi': 1.6.0 + '@rspack/binding-win32-arm64-msvc': 1.6.0 + '@rspack/binding-win32-ia32-msvc': 1.6.0 + '@rspack/binding-win32-x64-msvc': 1.6.0 + + '@rspack/core@1.6.0(@swc/helpers@0.5.17)': dependencies: '@module-federation/runtime-tools': 0.21.2 - '@rspack/binding': 1.6.1 + '@rspack/binding': 1.6.0 '@rspack/lite-tapable': 1.0.1 optionalDependencies: '@swc/helpers': 0.5.17 @@ -16643,6 +16952,13 @@ snapshots: '@sec-ant/readable-stream@0.4.1': {} + '@shikijs/core@3.14.0': + dependencies: + '@shikijs/types': 3.14.0 + '@shikijs/vscode-textmate': 10.0.2 + '@types/hast': 3.0.4 + hast-util-to-html: 9.0.5 + '@shikijs/core@3.15.0': dependencies: '@shikijs/types': 3.15.0 @@ -16650,25 +16966,49 @@ snapshots: '@types/hast': 3.0.4 hast-util-to-html: 9.0.5 + '@shikijs/engine-javascript@3.14.0': + dependencies: + '@shikijs/types': 3.14.0 + '@shikijs/vscode-textmate': 10.0.2 + oniguruma-to-es: 4.3.3 + '@shikijs/engine-javascript@3.15.0': dependencies: '@shikijs/types': 3.15.0 '@shikijs/vscode-textmate': 10.0.2 oniguruma-to-es: 4.3.3 + '@shikijs/engine-oniguruma@3.14.0': + dependencies: + '@shikijs/types': 3.14.0 + '@shikijs/vscode-textmate': 10.0.2 + '@shikijs/engine-oniguruma@3.15.0': dependencies: '@shikijs/types': 3.15.0 '@shikijs/vscode-textmate': 10.0.2 + '@shikijs/langs@3.14.0': + dependencies: + '@shikijs/types': 3.14.0 + '@shikijs/langs@3.15.0': dependencies: '@shikijs/types': 3.15.0 + '@shikijs/themes@3.14.0': + dependencies: + '@shikijs/types': 3.14.0 + '@shikijs/themes@3.15.0': dependencies: '@shikijs/types': 3.15.0 + '@shikijs/types@3.14.0': + dependencies: + '@shikijs/vscode-textmate': 10.0.2 + '@types/hast': 3.0.4 + '@shikijs/types@3.15.0': dependencies: '@shikijs/vscode-textmate': 10.0.2 @@ -16747,6 +17087,10 @@ snapshots: - bufferutil - utf-8-validate + '@svelte-put/shortcut@4.1.0(svelte@5.43.6)': + dependencies: + svelte: 5.43.6 + '@sveltejs/acorn-typescript@1.0.6(acorn@8.15.0)': dependencies: acorn: 8.15.0 @@ -16757,7 +17101,7 @@ snapshots: '@sveltejs/adapter-cloudflare@7.2.4(@sveltejs/kit@2.48.4(@opentelemetry/api@1.8.0)(@sveltejs/vite-plugin-svelte@6.2.1(svelte@5.43.6)(vite@7.2.2(@types/node@20.19.24)(jiti@2.4.2)(less@4.1.3)(sass-embedded@1.93.3)(sass@1.94.0)(stylus@0.64.0)(terser@5.43.1)(tsx@4.20.6)(yaml@2.8.1)))(svelte@5.43.6)(vite@7.2.2(@types/node@20.19.24)(jiti@2.4.2)(less@4.1.3)(sass-embedded@1.93.3)(sass@1.94.0)(stylus@0.64.0)(terser@5.43.1)(tsx@4.20.6)(yaml@2.8.1)))(wrangler@4.46.0(@cloudflare/workers-types@4.20251109.0))': dependencies: - '@cloudflare/workers-types': 4.20251109.0 + '@cloudflare/workers-types': 4.20251014.0 '@sveltejs/kit': 2.48.4(@opentelemetry/api@1.8.0)(@sveltejs/vite-plugin-svelte@6.2.1(svelte@5.43.6)(vite@7.2.2(@types/node@20.19.24)(jiti@2.4.2)(less@4.1.3)(sass-embedded@1.93.3)(sass@1.94.0)(stylus@0.64.0)(terser@5.43.1)(tsx@4.20.6)(yaml@2.8.1)))(svelte@5.43.6)(vite@7.2.2(@types/node@20.19.24)(jiti@2.4.2)(less@4.1.3)(sass-embedded@1.93.3)(sass@1.94.0)(stylus@0.64.0)(terser@5.43.1)(tsx@4.20.6)(yaml@2.8.1)) worktop: 0.8.0-next.18 wrangler: 4.46.0(@cloudflare/workers-types@4.20251109.0) @@ -17024,6 +17368,27 @@ snapshots: '@types/cookie@0.6.0': {} + '@types/d3-color@3.1.3': {} + + '@types/d3-drag@3.0.7': + dependencies: + '@types/d3-selection': 3.0.11 + + '@types/d3-interpolate@3.0.4': + dependencies: + '@types/d3-color': 3.1.3 + + '@types/d3-selection@3.0.11': {} + + '@types/d3-transition@3.0.9': + dependencies: + '@types/d3-selection': 3.0.11 + + '@types/d3-zoom@3.0.8': + dependencies: + '@types/d3-interpolate': 3.0.4 + '@types/d3-selection': 3.0.11 + '@types/debug@4.1.12': dependencies: '@types/ms': 2.1.0 @@ -17285,6 +17650,15 @@ snapshots: transitivePeerDependencies: - supports-color + '@typescript-eslint/project-service@8.46.2(typescript@5.8.3)': + dependencies: + '@typescript-eslint/tsconfig-utils': 8.46.2(typescript@5.8.3) + '@typescript-eslint/types': 8.46.2 + debug: 4.4.3(supports-color@10.2.2) + typescript: 5.8.3 + transitivePeerDependencies: + - supports-color + '@typescript-eslint/project-service@8.46.4(supports-color@10.2.2)(typescript@5.9.3)': dependencies: '@typescript-eslint/tsconfig-utils': 8.46.4(typescript@5.9.3) @@ -17308,6 +17682,11 @@ snapshots: '@typescript-eslint/types': 8.34.1 '@typescript-eslint/visitor-keys': 8.34.1 + '@typescript-eslint/scope-manager@8.46.2': + dependencies: + '@typescript-eslint/types': 8.46.2 + '@typescript-eslint/visitor-keys': 8.46.2 + '@typescript-eslint/scope-manager@8.46.4': dependencies: '@typescript-eslint/types': 8.46.4 @@ -17317,6 +17696,10 @@ snapshots: dependencies: typescript: 5.8.3 + '@typescript-eslint/tsconfig-utils@8.46.2(typescript@5.8.3)': + dependencies: + typescript: 5.8.3 + '@typescript-eslint/tsconfig-utils@8.46.4(typescript@5.8.3)': dependencies: typescript: 5.8.3 @@ -17336,11 +17719,11 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/type-utils@8.46.4(eslint@9.39.1(jiti@2.4.2))(typescript@5.8.3)': + '@typescript-eslint/type-utils@8.46.2(eslint@9.39.1(jiti@2.4.2))(typescript@5.8.3)': dependencies: - '@typescript-eslint/types': 8.46.4 - '@typescript-eslint/typescript-estree': 8.46.4(typescript@5.8.3) - '@typescript-eslint/utils': 8.46.4(eslint@9.39.1(jiti@2.4.2))(typescript@5.8.3) + '@typescript-eslint/types': 8.46.2 + '@typescript-eslint/typescript-estree': 8.46.2(typescript@5.8.3) + '@typescript-eslint/utils': 8.46.2(eslint@9.39.1(jiti@2.4.2))(typescript@5.8.3) debug: 4.4.3(supports-color@10.2.2) eslint: 9.39.1(jiti@2.4.2) ts-api-utils: 2.1.0(typescript@5.8.3) @@ -17362,6 +17745,8 @@ snapshots: '@typescript-eslint/types@8.34.1': {} + '@typescript-eslint/types@8.46.2': {} + '@typescript-eslint/types@8.46.4': {} '@typescript-eslint/typescript-estree@8.34.1(typescript@5.8.3)': @@ -17380,6 +17765,22 @@ snapshots: transitivePeerDependencies: - supports-color + '@typescript-eslint/typescript-estree@8.46.2(typescript@5.8.3)': + dependencies: + '@typescript-eslint/project-service': 8.46.2(typescript@5.8.3) + '@typescript-eslint/tsconfig-utils': 8.46.2(typescript@5.8.3) + '@typescript-eslint/types': 8.46.2 + '@typescript-eslint/visitor-keys': 8.46.2 + debug: 4.4.3(supports-color@10.2.2) + fast-glob: 3.3.3 + is-glob: 4.0.3 + minimatch: 9.0.5 + semver: 7.7.3 + ts-api-utils: 2.1.0(typescript@5.8.3) + typescript: 5.8.3 + transitivePeerDependencies: + - supports-color + '@typescript-eslint/typescript-estree@8.46.4(supports-color@10.2.2)(typescript@5.9.3)': dependencies: '@typescript-eslint/project-service': 8.46.4(supports-color@10.2.2)(typescript@5.9.3) @@ -17423,12 +17824,12 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.46.4(eslint@9.39.1(jiti@2.4.2))(typescript@5.8.3)': + '@typescript-eslint/utils@8.46.2(eslint@9.39.1(jiti@2.4.2))(typescript@5.8.3)': dependencies: '@eslint-community/eslint-utils': 4.9.0(eslint@9.39.1(jiti@2.4.2)) - '@typescript-eslint/scope-manager': 8.46.4 - '@typescript-eslint/types': 8.46.4 - '@typescript-eslint/typescript-estree': 8.46.4(typescript@5.8.3) + '@typescript-eslint/scope-manager': 8.46.2 + '@typescript-eslint/types': 8.46.2 + '@typescript-eslint/typescript-estree': 8.46.2(typescript@5.8.3) eslint: 9.39.1(jiti@2.4.2) typescript: 5.8.3 transitivePeerDependencies: @@ -17450,6 +17851,11 @@ snapshots: '@typescript-eslint/types': 8.34.1 eslint-visitor-keys: 4.2.1 + '@typescript-eslint/visitor-keys@8.46.2': + dependencies: + '@typescript-eslint/types': 8.46.2 + eslint-visitor-keys: 4.2.1 + '@typescript-eslint/visitor-keys@8.46.4': dependencies: '@typescript-eslint/types': 8.46.4 @@ -17510,7 +17916,7 @@ snapshots: std-env: 3.10.0 strip-literal: 2.1.1 test-exclude: 6.0.0 - vitest: 1.3.1(@types/node@18.16.20)(@vitest/ui@1.6.1)(jsdom@22.1.0)(less@4.1.3)(sass-embedded@1.93.3)(sass@1.94.0)(stylus@0.64.0)(terser@5.43.1) + vitest: 1.3.1(@types/node@18.16.20)(@vitest/ui@1.6.1)(jsdom@22.1.0)(less@4.1.3)(sass-embedded@1.93.3)(sass@1.93.3)(stylus@0.64.0)(terser@5.43.1) transitivePeerDependencies: - supports-color @@ -17545,7 +17951,7 @@ snapshots: pathe: 1.1.2 picocolors: 1.1.1 sirv: 2.0.4 - vitest: 1.3.1(@types/node@18.16.20)(@vitest/ui@1.6.1)(jsdom@22.1.0)(less@4.1.3)(sass-embedded@1.93.3)(sass@1.94.0)(stylus@0.64.0)(terser@5.43.1) + vitest: 1.3.1(@types/node@18.16.20)(@vitest/ui@1.6.1)(jsdom@22.1.0)(less@4.1.3)(sass-embedded@1.93.3)(sass@1.93.3)(stylus@0.64.0)(terser@5.43.1) '@vitest/utils@1.3.1': dependencies: @@ -17561,12 +17967,12 @@ snapshots: loupe: 2.3.7 pretty-format: 29.7.0 - '@volar/kit@2.4.23(typescript@5.8.3)': + '@volar/kit@2.4.23(typescript@5.9.3)': dependencies: '@volar/language-service': 2.4.23 '@volar/typescript': 2.4.23 typesafe-path: 0.2.2 - typescript: 5.8.3 + typescript: 5.9.3 vscode-languageserver-textdocument: 1.0.12 vscode-uri: 3.1.0 @@ -17884,6 +18290,24 @@ snapshots: '@xtuc/long@4.2.2': {} + '@xyflow/svelte@1.4.1(svelte@5.43.6)': + dependencies: + '@svelte-put/shortcut': 4.1.0(svelte@5.43.6) + '@xyflow/system': 0.0.72 + svelte: 5.43.6 + + '@xyflow/system@0.0.72': + dependencies: + '@types/d3-drag': 3.0.7 + '@types/d3-interpolate': 3.0.4 + '@types/d3-selection': 3.0.11 + '@types/d3-transition': 3.0.9 + '@types/d3-zoom': 3.0.8 + d3-drag: 3.0.0 + d3-interpolate: 3.0.1 + d3-selection: 3.0.0 + d3-zoom: 3.0.0 + '@yarnpkg/lockfile@1.1.0': {} '@yarnpkg/parsers@3.0.0-rc.46': @@ -18110,9 +18534,9 @@ snapshots: astring@1.9.0: {} - astro-expressive-code@0.41.3(astro@5.15.5(@netlify/blobs@10.0.7)(@types/node@22.19.0)(jiti@2.4.2)(less@4.1.3)(rollup@4.53.2)(sass-embedded@1.93.3)(sass@1.94.0)(stylus@0.64.0)(terser@5.43.1)(tsx@4.20.6)(typescript@5.8.3)(yaml@2.8.1)): + astro-expressive-code@0.41.3(astro@5.15.5(@netlify/blobs@10.0.7)(@types/node@22.19.0)(jiti@2.4.2)(less@4.1.3)(rollup@4.53.2)(sass-embedded@1.93.3)(sass@1.94.0)(stylus@0.64.0)(terser@5.43.1)(tsx@4.20.6)(typescript@5.9.3)(yaml@2.8.1)): dependencies: - astro: 5.15.5(@netlify/blobs@10.0.7)(@types/node@22.19.0)(jiti@2.4.2)(less@4.1.3)(rollup@4.53.2)(sass-embedded@1.93.3)(sass@1.94.0)(stylus@0.64.0)(terser@5.43.1)(tsx@4.20.6)(typescript@5.8.3)(yaml@2.8.1) + astro: 5.15.5(@netlify/blobs@10.0.7)(@types/node@22.19.0)(jiti@2.4.2)(less@4.1.3)(rollup@4.53.2)(sass-embedded@1.93.3)(sass@1.94.0)(stylus@0.64.0)(terser@5.43.1)(tsx@4.20.6)(typescript@5.9.3)(yaml@2.8.1) rehype-expressive-code: 0.41.3 astro-remote@0.3.4: @@ -18128,7 +18552,7 @@ snapshots: valid-filename: 4.0.0 zod: 3.25.76 - astro@5.15.5(@netlify/blobs@10.0.7)(@types/node@22.19.0)(jiti@2.4.2)(less@4.1.3)(rollup@4.53.2)(sass-embedded@1.93.3)(sass@1.94.0)(stylus@0.64.0)(terser@5.43.1)(tsx@4.20.6)(typescript@5.8.3)(yaml@2.8.1): + astro@5.15.5(@netlify/blobs@10.0.7)(@types/node@22.19.0)(jiti@2.4.2)(less@4.1.3)(rollup@4.53.2)(sass-embedded@1.93.3)(sass@1.94.0)(stylus@0.64.0)(terser@5.43.1)(tsx@4.20.6)(typescript@5.9.3)(yaml@2.8.1): dependencies: '@astrojs/compiler': 2.13.0 '@astrojs/internal-helpers': 0.7.4 @@ -18178,7 +18602,7 @@ snapshots: smol-toml: 1.4.2 tinyexec: 1.0.2 tinyglobby: 0.2.15 - tsconfck: 3.1.6(typescript@5.8.3) + tsconfck: 3.1.6(typescript@5.9.3) ultrahtml: 1.6.0 unifont: 0.6.0 unist-util-visit: 5.0.0 @@ -18191,7 +18615,7 @@ snapshots: yocto-spinner: 0.2.3 zod: 3.25.76 zod-to-json-schema: 3.24.6(zod@3.25.76) - zod-to-ts: 1.2.0(typescript@5.8.3)(zod@3.25.76) + zod-to-ts: 1.2.0(typescript@5.9.3)(zod@3.25.76) optionalDependencies: sharp: 0.34.5 transitivePeerDependencies: @@ -18259,6 +18683,14 @@ snapshots: '@fastify/error': 3.4.1 fastq: 1.19.1 + axios@1.13.1: + dependencies: + follow-redirects: 1.15.11(debug@4.4.1) + form-data: 4.0.4 + proxy-from-env: 1.1.0 + transitivePeerDependencies: + - debug + axios@1.13.2: dependencies: follow-redirects: 1.15.11(debug@4.4.1) @@ -18434,6 +18866,8 @@ snapshots: base64-js@1.5.1: {} + baseline-browser-mapping@2.8.22: {} + baseline-browser-mapping@2.8.25: {} basic-auth@2.0.1: @@ -18549,6 +18983,14 @@ snapshots: dependencies: base64-js: 1.5.1 + browserslist@4.27.0: + dependencies: + baseline-browser-mapping: 2.8.22 + caniuse-lite: 1.0.30001752 + electron-to-chromium: 1.5.244 + node-releases: 2.0.27 + update-browserslist-db: 1.1.4(browserslist@4.27.0) + browserslist@4.28.0: dependencies: baseline-browser-mapping: 2.8.25 @@ -18645,6 +19087,8 @@ snapshots: lodash.memoize: 4.1.2 lodash.uniq: 4.5.0 + caniuse-lite@1.0.30001752: {} + caniuse-lite@1.0.30001754: {} ccount@2.0.1: {} @@ -19040,7 +19484,7 @@ snapshots: dependencies: postcss: 8.4.49 - css-loader@6.11.0(@rspack/core@1.6.1(@swc/helpers@0.5.17))(webpack@5.99.9(esbuild@0.19.12)): + css-loader@6.11.0(@rspack/core@1.6.0(@swc/helpers@0.5.17))(webpack@5.99.9(esbuild@0.19.12)): dependencies: icss-utils: 5.1.0(postcss@8.4.49) postcss: 8.4.49 @@ -19051,7 +19495,7 @@ snapshots: postcss-value-parser: 4.2.0 semver: 7.7.3 optionalDependencies: - '@rspack/core': 1.6.1(@swc/helpers@0.5.17) + '@rspack/core': 1.6.0(@swc/helpers@0.5.17) webpack: 5.99.9(esbuild@0.19.12) css-minimizer-webpack-plugin@5.0.1(esbuild@0.19.12)(webpack@5.99.9(esbuild@0.19.12)): @@ -19153,6 +19597,42 @@ snapshots: cyclist@1.0.2: {} + d3-color@3.1.0: {} + + d3-dispatch@3.0.1: {} + + d3-drag@3.0.0: + dependencies: + d3-dispatch: 3.0.1 + d3-selection: 3.0.0 + + d3-ease@3.0.1: {} + + d3-interpolate@3.0.1: + dependencies: + d3-color: 3.1.0 + + d3-selection@3.0.0: {} + + d3-timer@3.0.1: {} + + d3-transition@3.0.1(d3-selection@3.0.0): + dependencies: + d3-color: 3.1.0 + d3-dispatch: 3.0.1 + d3-ease: 3.0.1 + d3-interpolate: 3.0.1 + d3-selection: 3.0.0 + d3-timer: 3.0.1 + + d3-zoom@3.0.0: + dependencies: + d3-dispatch: 3.0.1 + d3-drag: 3.0.0 + d3-interpolate: 3.0.1 + d3-selection: 3.0.0 + d3-transition: 3.0.1(d3-selection@3.0.0) + data-uri-to-buffer@4.0.1: {} data-urls@4.0.0: @@ -19339,8 +19819,6 @@ snapshots: diff@5.2.0: {} - diff@8.0.2: {} - dir-glob@3.0.1: dependencies: path-type: 4.0.0 @@ -19418,6 +19896,8 @@ snapshots: dependencies: jake: 10.9.4 + electron-to-chromium@1.5.244: {} + electron-to-chromium@1.5.249: {} emittery@0.13.1: {} @@ -22930,6 +23410,33 @@ snapshots: netlify-redirector@0.5.0: {} + next@15.0.3(@babel/core@7.28.5)(@opentelemetry/api@1.8.0)(babel-plugin-macros@3.1.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(sass@1.93.3): + dependencies: + '@next/env': 15.0.3 + '@swc/counter': 0.1.3 + '@swc/helpers': 0.5.13 + busboy: 1.6.0 + caniuse-lite: 1.0.30001754 + postcss: 8.4.31 + react: 19.2.0 + react-dom: 19.2.0(react@19.2.0) + styled-jsx: 5.1.6(@babel/core@7.28.5)(babel-plugin-macros@3.1.0)(react@19.2.0) + optionalDependencies: + '@next/swc-darwin-arm64': 15.0.3 + '@next/swc-darwin-x64': 15.0.3 + '@next/swc-linux-arm64-gnu': 15.0.3 + '@next/swc-linux-arm64-musl': 15.0.3 + '@next/swc-linux-x64-gnu': 15.0.3 + '@next/swc-linux-x64-musl': 15.0.3 + '@next/swc-win32-arm64-msvc': 15.0.3 + '@next/swc-win32-x64-msvc': 15.0.3 + '@opentelemetry/api': 1.8.0 + sass: 1.93.3 + sharp: 0.33.5 + transitivePeerDependencies: + - '@babel/core' + - babel-plugin-macros + next@15.0.3(@babel/core@7.28.5)(@opentelemetry/api@1.8.0)(babel-plugin-macros@3.1.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(sass@1.94.0): dependencies: '@next/env': 15.0.3 @@ -22956,6 +23463,7 @@ snapshots: transitivePeerDependencies: - '@babel/core' - babel-plugin-macros + optional: true nlcst-to-string@4.0.0: dependencies: @@ -24373,6 +24881,34 @@ snapshots: rfdc@1.4.1: {} + rollup@4.52.5: + dependencies: + '@types/estree': 1.0.8 + optionalDependencies: + '@rollup/rollup-android-arm-eabi': 4.52.5 + '@rollup/rollup-android-arm64': 4.52.5 + '@rollup/rollup-darwin-arm64': 4.52.5 + '@rollup/rollup-darwin-x64': 4.52.5 + '@rollup/rollup-freebsd-arm64': 4.52.5 + '@rollup/rollup-freebsd-x64': 4.52.5 + '@rollup/rollup-linux-arm-gnueabihf': 4.52.5 + '@rollup/rollup-linux-arm-musleabihf': 4.52.5 + '@rollup/rollup-linux-arm64-gnu': 4.52.5 + '@rollup/rollup-linux-arm64-musl': 4.52.5 + '@rollup/rollup-linux-loong64-gnu': 4.52.5 + '@rollup/rollup-linux-ppc64-gnu': 4.52.5 + '@rollup/rollup-linux-riscv64-gnu': 4.52.5 + '@rollup/rollup-linux-riscv64-musl': 4.52.5 + '@rollup/rollup-linux-s390x-gnu': 4.52.5 + '@rollup/rollup-linux-x64-gnu': 4.52.5 + '@rollup/rollup-linux-x64-musl': 4.52.5 + '@rollup/rollup-openharmony-arm64': 4.52.5 + '@rollup/rollup-win32-arm64-msvc': 4.52.5 + '@rollup/rollup-win32-ia32-msvc': 4.52.5 + '@rollup/rollup-win32-x64-gnu': 4.52.5 + '@rollup/rollup-win32-x64-msvc': 4.52.5 + fsevents: 2.3.3 + rollup@4.53.2: dependencies: '@types/estree': 1.0.8 @@ -24539,12 +25075,12 @@ snapshots: dependencies: suf-log: 2.5.3 - sass-loader@16.0.6(@rspack/core@1.6.1(@swc/helpers@0.5.17))(sass-embedded@1.93.3)(sass@1.94.0)(webpack@5.99.9(esbuild@0.19.12)): + sass-loader@16.0.6(@rspack/core@1.6.0(@swc/helpers@0.5.17))(sass-embedded@1.93.3)(sass@1.93.3)(webpack@5.99.9(esbuild@0.19.12)): dependencies: neo-async: 2.6.2 optionalDependencies: - '@rspack/core': 1.6.1(@swc/helpers@0.5.17) - sass: 1.94.0 + '@rspack/core': 1.6.0(@swc/helpers@0.5.17) + sass: 1.93.3 sass-embedded: 1.93.3 webpack: 5.99.9(esbuild@0.19.12) @@ -24555,7 +25091,6 @@ snapshots: source-map-js: 1.2.1 optionalDependencies: '@parcel/watcher': 2.5.1 - optional: true sass@1.94.0: dependencies: @@ -24564,6 +25099,7 @@ snapshots: source-map-js: 1.2.1 optionalDependencies: '@parcel/watcher': 2.5.1 + optional: true sax@1.4.3: {} @@ -24757,6 +25293,17 @@ snapshots: shell-quote@1.8.3: {} + shiki@3.14.0: + dependencies: + '@shikijs/core': 3.14.0 + '@shikijs/engine-javascript': 3.14.0 + '@shikijs/engine-oniguruma': 3.14.0 + '@shikijs/langs': 3.14.0 + '@shikijs/themes': 3.14.0 + '@shikijs/types': 3.14.0 + '@shikijs/vscode-textmate': 10.0.2 + '@types/hast': 3.0.4 + shiki@3.15.0: dependencies: '@shikijs/core': 3.15.0 @@ -24968,12 +25515,12 @@ snapshots: stackframe@1.3.4: {} - starlight-blog@0.24.3(@astrojs/starlight@0.34.8(astro@5.15.5(@netlify/blobs@10.0.7)(@types/node@22.19.0)(jiti@2.4.2)(less@4.1.3)(rollup@4.53.2)(sass-embedded@1.93.3)(sass@1.94.0)(stylus@0.64.0)(terser@5.43.1)(tsx@4.20.6)(typescript@5.8.3)(yaml@2.8.1)))(astro@5.15.5(@netlify/blobs@10.0.7)(@types/node@22.19.0)(jiti@2.4.2)(less@4.1.3)(rollup@4.53.2)(sass-embedded@1.93.3)(sass@1.94.0)(stylus@0.64.0)(terser@5.43.1)(tsx@4.20.6)(typescript@5.8.3)(yaml@2.8.1)): + starlight-blog@0.24.3(@astrojs/starlight@0.34.8(astro@5.15.5(@netlify/blobs@10.0.7)(@types/node@22.19.0)(jiti@2.4.2)(less@4.1.3)(rollup@4.53.2)(sass-embedded@1.93.3)(sass@1.94.0)(stylus@0.64.0)(terser@5.43.1)(tsx@4.20.6)(typescript@5.9.3)(yaml@2.8.1)))(astro@5.15.5(@netlify/blobs@10.0.7)(@types/node@22.19.0)(jiti@2.4.2)(less@4.1.3)(rollup@4.53.2)(sass-embedded@1.93.3)(sass@1.94.0)(stylus@0.64.0)(terser@5.43.1)(tsx@4.20.6)(typescript@5.9.3)(yaml@2.8.1)): dependencies: '@astrojs/markdown-remark': 6.3.8 - '@astrojs/mdx': 4.3.10(astro@5.15.5(@netlify/blobs@10.0.7)(@types/node@22.19.0)(jiti@2.4.2)(less@4.1.3)(rollup@4.53.2)(sass-embedded@1.93.3)(sass@1.94.0)(stylus@0.64.0)(terser@5.43.1)(tsx@4.20.6)(typescript@5.8.3)(yaml@2.8.1)) + '@astrojs/mdx': 4.3.9(astro@5.15.5(@netlify/blobs@10.0.7)(@types/node@22.19.0)(jiti@2.4.2)(less@4.1.3)(rollup@4.53.2)(sass-embedded@1.93.3)(sass@1.94.0)(stylus@0.64.0)(terser@5.43.1)(tsx@4.20.6)(typescript@5.9.3)(yaml@2.8.1)) '@astrojs/rss': 4.0.13 - '@astrojs/starlight': 0.34.8(astro@5.15.5(@netlify/blobs@10.0.7)(@types/node@22.19.0)(jiti@2.4.2)(less@4.1.3)(rollup@4.53.2)(sass-embedded@1.93.3)(sass@1.94.0)(stylus@0.64.0)(terser@5.43.1)(tsx@4.20.6)(typescript@5.8.3)(yaml@2.8.1)) + '@astrojs/starlight': 0.34.8(astro@5.15.5(@netlify/blobs@10.0.7)(@types/node@22.19.0)(jiti@2.4.2)(less@4.1.3)(rollup@4.53.2)(sass-embedded@1.93.3)(sass@1.94.0)(stylus@0.64.0)(terser@5.43.1)(tsx@4.20.6)(typescript@5.9.3)(yaml@2.8.1)) astro-remote: 0.3.4 github-slugger: 2.0.0 hast-util-from-html: 2.0.3 @@ -24989,14 +25536,14 @@ snapshots: - astro - supports-color - starlight-contextual-menu@0.1.5(astro@5.15.5(@netlify/blobs@10.0.7)(@types/node@22.19.0)(jiti@2.4.2)(less@4.1.3)(rollup@4.53.2)(sass-embedded@1.93.3)(sass@1.94.0)(stylus@0.64.0)(terser@5.43.1)(tsx@4.20.6)(typescript@5.8.3)(yaml@2.8.1))(starlight-markdown@0.1.5(astro@5.15.5(@netlify/blobs@10.0.7)(@types/node@22.19.0)(jiti@2.4.2)(less@4.1.3)(rollup@4.53.2)(sass-embedded@1.93.3)(sass@1.94.0)(stylus@0.64.0)(terser@5.43.1)(tsx@4.20.6)(typescript@5.8.3)(yaml@2.8.1))): + starlight-contextual-menu@0.1.5(astro@5.15.5(@netlify/blobs@10.0.7)(@types/node@22.19.0)(jiti@2.4.2)(less@4.1.3)(rollup@4.53.2)(sass-embedded@1.93.3)(sass@1.94.0)(stylus@0.64.0)(terser@5.43.1)(tsx@4.20.6)(typescript@5.9.3)(yaml@2.8.1))(starlight-markdown@0.1.5(astro@5.15.5(@netlify/blobs@10.0.7)(@types/node@22.19.0)(jiti@2.4.2)(less@4.1.3)(rollup@4.53.2)(sass-embedded@1.93.3)(sass@1.94.0)(stylus@0.64.0)(terser@5.43.1)(tsx@4.20.6)(typescript@5.9.3)(yaml@2.8.1))): dependencies: - astro: 5.15.5(@netlify/blobs@10.0.7)(@types/node@22.19.0)(jiti@2.4.2)(less@4.1.3)(rollup@4.53.2)(sass-embedded@1.93.3)(sass@1.94.0)(stylus@0.64.0)(terser@5.43.1)(tsx@4.20.6)(typescript@5.8.3)(yaml@2.8.1) - starlight-markdown: 0.1.5(astro@5.15.5(@netlify/blobs@10.0.7)(@types/node@22.19.0)(jiti@2.4.2)(less@4.1.3)(rollup@4.53.2)(sass-embedded@1.93.3)(sass@1.94.0)(stylus@0.64.0)(terser@5.43.1)(tsx@4.20.6)(typescript@5.8.3)(yaml@2.8.1)) + astro: 5.15.5(@netlify/blobs@10.0.7)(@types/node@22.19.0)(jiti@2.4.2)(less@4.1.3)(rollup@4.53.2)(sass-embedded@1.93.3)(sass@1.94.0)(stylus@0.64.0)(terser@5.43.1)(tsx@4.20.6)(typescript@5.9.3)(yaml@2.8.1) + starlight-markdown: 0.1.5(astro@5.15.5(@netlify/blobs@10.0.7)(@types/node@22.19.0)(jiti@2.4.2)(less@4.1.3)(rollup@4.53.2)(sass-embedded@1.93.3)(sass@1.94.0)(stylus@0.64.0)(terser@5.43.1)(tsx@4.20.6)(typescript@5.9.3)(yaml@2.8.1)) - starlight-links-validator@0.14.3(@astrojs/starlight@0.34.8(astro@5.15.5(@netlify/blobs@10.0.7)(@types/node@22.19.0)(jiti@2.4.2)(less@4.1.3)(rollup@4.53.2)(sass-embedded@1.93.3)(sass@1.94.0)(stylus@0.64.0)(terser@5.43.1)(tsx@4.20.6)(typescript@5.8.3)(yaml@2.8.1))): + starlight-links-validator@0.14.3(@astrojs/starlight@0.34.8(astro@5.15.5(@netlify/blobs@10.0.7)(@types/node@22.19.0)(jiti@2.4.2)(less@4.1.3)(rollup@4.53.2)(sass-embedded@1.93.3)(sass@1.94.0)(stylus@0.64.0)(terser@5.43.1)(tsx@4.20.6)(typescript@5.9.3)(yaml@2.8.1))): dependencies: - '@astrojs/starlight': 0.34.8(astro@5.15.5(@netlify/blobs@10.0.7)(@types/node@22.19.0)(jiti@2.4.2)(less@4.1.3)(rollup@4.53.2)(sass-embedded@1.93.3)(sass@1.94.0)(stylus@0.64.0)(terser@5.43.1)(tsx@4.20.6)(typescript@5.8.3)(yaml@2.8.1)) + '@astrojs/starlight': 0.34.8(astro@5.15.5(@netlify/blobs@10.0.7)(@types/node@22.19.0)(jiti@2.4.2)(less@4.1.3)(rollup@4.53.2)(sass-embedded@1.93.3)(sass@1.94.0)(stylus@0.64.0)(terser@5.43.1)(tsx@4.20.6)(typescript@5.9.3)(yaml@2.8.1)) '@types/picomatch': 3.0.2 github-slugger: 2.0.0 hast-util-from-html: 2.0.3 @@ -25010,13 +25557,13 @@ snapshots: transitivePeerDependencies: - supports-color - starlight-llms-txt@0.4.1(@astrojs/starlight@0.34.8(astro@5.15.5(@netlify/blobs@10.0.7)(@types/node@22.19.0)(jiti@2.4.2)(less@4.1.3)(rollup@4.53.2)(sass-embedded@1.93.3)(sass@1.94.0)(stylus@0.64.0)(terser@5.43.1)(tsx@4.20.6)(typescript@5.8.3)(yaml@2.8.1)))(astro@5.15.5(@netlify/blobs@10.0.7)(@types/node@22.19.0)(jiti@2.4.2)(less@4.1.3)(rollup@4.53.2)(sass-embedded@1.93.3)(sass@1.94.0)(stylus@0.64.0)(terser@5.43.1)(tsx@4.20.6)(typescript@5.8.3)(yaml@2.8.1)): + starlight-llms-txt@0.4.1(@astrojs/starlight@0.34.8(astro@5.15.5(@netlify/blobs@10.0.7)(@types/node@22.19.0)(jiti@2.4.2)(less@4.1.3)(rollup@4.53.2)(sass-embedded@1.93.3)(sass@1.94.0)(stylus@0.64.0)(terser@5.43.1)(tsx@4.20.6)(typescript@5.9.3)(yaml@2.8.1)))(astro@5.15.5(@netlify/blobs@10.0.7)(@types/node@22.19.0)(jiti@2.4.2)(less@4.1.3)(rollup@4.53.2)(sass-embedded@1.93.3)(sass@1.94.0)(stylus@0.64.0)(terser@5.43.1)(tsx@4.20.6)(typescript@5.9.3)(yaml@2.8.1)): dependencies: - '@astrojs/mdx': 4.3.10(astro@5.15.5(@netlify/blobs@10.0.7)(@types/node@22.19.0)(jiti@2.4.2)(less@4.1.3)(rollup@4.53.2)(sass-embedded@1.93.3)(sass@1.94.0)(stylus@0.64.0)(terser@5.43.1)(tsx@4.20.6)(typescript@5.8.3)(yaml@2.8.1)) - '@astrojs/starlight': 0.34.8(astro@5.15.5(@netlify/blobs@10.0.7)(@types/node@22.19.0)(jiti@2.4.2)(less@4.1.3)(rollup@4.53.2)(sass-embedded@1.93.3)(sass@1.94.0)(stylus@0.64.0)(terser@5.43.1)(tsx@4.20.6)(typescript@5.8.3)(yaml@2.8.1)) + '@astrojs/mdx': 4.3.9(astro@5.15.5(@netlify/blobs@10.0.7)(@types/node@22.19.0)(jiti@2.4.2)(less@4.1.3)(rollup@4.53.2)(sass-embedded@1.93.3)(sass@1.94.0)(stylus@0.64.0)(terser@5.43.1)(tsx@4.20.6)(typescript@5.9.3)(yaml@2.8.1)) + '@astrojs/starlight': 0.34.8(astro@5.15.5(@netlify/blobs@10.0.7)(@types/node@22.19.0)(jiti@2.4.2)(less@4.1.3)(rollup@4.53.2)(sass-embedded@1.93.3)(sass@1.94.0)(stylus@0.64.0)(terser@5.43.1)(tsx@4.20.6)(typescript@5.9.3)(yaml@2.8.1)) '@types/hast': 3.0.4 '@types/micromatch': 4.0.10 - astro: 5.15.5(@netlify/blobs@10.0.7)(@types/node@22.19.0)(jiti@2.4.2)(less@4.1.3)(rollup@4.53.2)(sass-embedded@1.93.3)(sass@1.94.0)(stylus@0.64.0)(terser@5.43.1)(tsx@4.20.6)(typescript@5.8.3)(yaml@2.8.1) + astro: 5.15.5(@netlify/blobs@10.0.7)(@types/node@22.19.0)(jiti@2.4.2)(less@4.1.3)(rollup@4.53.2)(sass-embedded@1.93.3)(sass@1.94.0)(stylus@0.64.0)(terser@5.43.1)(tsx@4.20.6)(typescript@5.9.3)(yaml@2.8.1) github-slugger: 2.0.0 hast-util-select: 6.0.4 micromatch: 4.0.8 @@ -25029,13 +25576,13 @@ snapshots: transitivePeerDependencies: - supports-color - starlight-markdown@0.1.5(astro@5.15.5(@netlify/blobs@10.0.7)(@types/node@22.19.0)(jiti@2.4.2)(less@4.1.3)(rollup@4.53.2)(sass-embedded@1.93.3)(sass@1.94.0)(stylus@0.64.0)(terser@5.43.1)(tsx@4.20.6)(typescript@5.8.3)(yaml@2.8.1)): + starlight-markdown@0.1.5(astro@5.15.5(@netlify/blobs@10.0.7)(@types/node@22.19.0)(jiti@2.4.2)(less@4.1.3)(rollup@4.53.2)(sass-embedded@1.93.3)(sass@1.94.0)(stylus@0.64.0)(terser@5.43.1)(tsx@4.20.6)(typescript@5.9.3)(yaml@2.8.1)): dependencies: - astro: 5.15.5(@netlify/blobs@10.0.7)(@types/node@22.19.0)(jiti@2.4.2)(less@4.1.3)(rollup@4.53.2)(sass-embedded@1.93.3)(sass@1.94.0)(stylus@0.64.0)(terser@5.43.1)(tsx@4.20.6)(typescript@5.8.3)(yaml@2.8.1) + astro: 5.15.5(@netlify/blobs@10.0.7)(@types/node@22.19.0)(jiti@2.4.2)(less@4.1.3)(rollup@4.53.2)(sass-embedded@1.93.3)(sass@1.94.0)(stylus@0.64.0)(terser@5.43.1)(tsx@4.20.6)(typescript@5.9.3)(yaml@2.8.1) - starlight-sidebar-topics@0.6.2(@astrojs/starlight@0.34.8(astro@5.15.5(@netlify/blobs@10.0.7)(@types/node@22.19.0)(jiti@2.4.2)(less@4.1.3)(rollup@4.53.2)(sass-embedded@1.93.3)(sass@1.94.0)(stylus@0.64.0)(terser@5.43.1)(tsx@4.20.6)(typescript@5.8.3)(yaml@2.8.1))): + starlight-sidebar-topics@0.6.2(@astrojs/starlight@0.34.8(astro@5.15.5(@netlify/blobs@10.0.7)(@types/node@22.19.0)(jiti@2.4.2)(less@4.1.3)(rollup@4.53.2)(sass-embedded@1.93.3)(sass@1.94.0)(stylus@0.64.0)(terser@5.43.1)(tsx@4.20.6)(typescript@5.9.3)(yaml@2.8.1))): dependencies: - '@astrojs/starlight': 0.34.8(astro@5.15.5(@netlify/blobs@10.0.7)(@types/node@22.19.0)(jiti@2.4.2)(less@4.1.3)(rollup@4.53.2)(sass-embedded@1.93.3)(sass@1.94.0)(stylus@0.64.0)(terser@5.43.1)(tsx@4.20.6)(typescript@5.8.3)(yaml@2.8.1)) + '@astrojs/starlight': 0.34.8(astro@5.15.5(@netlify/blobs@10.0.7)(@types/node@22.19.0)(jiti@2.4.2)(less@4.1.3)(rollup@4.53.2)(sass-embedded@1.93.3)(sass@1.94.0)(stylus@0.64.0)(terser@5.43.1)(tsx@4.20.6)(typescript@5.9.3)(yaml@2.8.1)) picomatch: 4.0.3 statuses@1.5.0: {} @@ -25668,6 +26215,10 @@ snapshots: optionalDependencies: typescript: 5.8.3 + tsconfck@3.1.6(typescript@5.9.3): + optionalDependencies: + typescript: 5.9.3 + tsconfig-paths-webpack-plugin@4.0.0: dependencies: chalk: 4.1.2 @@ -25930,6 +26481,12 @@ snapshots: upath@2.0.1: {} + update-browserslist-db@1.1.4(browserslist@4.27.0): + dependencies: + browserslist: 4.27.0 + escalade: 3.2.0 + picocolors: 1.1.1 + update-browserslist-db@1.1.4(browserslist@4.28.0): dependencies: browserslist: 4.28.0 @@ -26016,13 +26573,13 @@ snapshots: '@types/unist': 3.0.3 vfile-message: 4.0.3 - vite-node@1.3.1(@types/node@18.16.20)(less@4.1.3)(sass-embedded@1.93.3)(sass@1.94.0)(stylus@0.64.0)(terser@5.43.1): + vite-node@1.3.1(@types/node@18.16.20)(less@4.1.3)(sass-embedded@1.93.3)(sass@1.93.3)(stylus@0.64.0)(terser@5.43.1): dependencies: cac: 6.7.14 debug: 4.4.3(supports-color@10.2.2) pathe: 1.1.2 picocolors: 1.1.1 - vite: 5.4.21(@types/node@18.16.20)(less@4.1.3)(sass-embedded@1.93.3)(sass@1.94.0)(stylus@0.64.0)(terser@5.43.1) + vite: 5.4.21(@types/node@18.16.20)(less@4.1.3)(sass-embedded@1.93.3)(sass@1.93.3)(stylus@0.64.0)(terser@5.43.1) transitivePeerDependencies: - '@types/node' - less @@ -26069,9 +26626,9 @@ snapshots: - rollup - supports-color - vite-plugin-dts@4.5.4(@types/node@18.16.20)(rollup@4.53.2)(typescript@5.8.3)(vite@6.3.5(@types/node@18.16.20)(jiti@2.4.2)(less@4.1.3)(sass-embedded@1.93.3)(sass@1.94.0)(stylus@0.64.0)(terser@5.43.1)(tsx@4.20.6)(yaml@2.8.1)): + vite-plugin-dts@4.5.4(@types/node@18.16.20)(rollup@4.53.2)(typescript@5.8.3)(vite@6.3.5(@types/node@18.16.20)(jiti@2.4.2)(less@4.1.3)(sass-embedded@1.93.3)(sass@1.93.3)(stylus@0.64.0)(terser@5.43.1)(tsx@4.20.6)(yaml@2.8.1)): dependencies: - '@microsoft/api-extractor': 7.54.0(@types/node@18.16.20) + '@microsoft/api-extractor': 7.53.3(@types/node@18.16.20) '@rollup/pluginutils': 5.3.0(rollup@4.53.2) '@volar/typescript': 2.4.23 '@vue/language-core': 2.2.0(typescript@5.8.3) @@ -26082,33 +26639,33 @@ snapshots: magic-string: 0.30.21 typescript: 5.8.3 optionalDependencies: - vite: 6.3.5(@types/node@18.16.20)(jiti@2.4.2)(less@4.1.3)(sass-embedded@1.93.3)(sass@1.94.0)(stylus@0.64.0)(terser@5.43.1)(tsx@4.20.6)(yaml@2.8.1) + vite: 6.3.5(@types/node@18.16.20)(jiti@2.4.2)(less@4.1.3)(sass-embedded@1.93.3)(sass@1.93.3)(stylus@0.64.0)(terser@5.43.1)(tsx@4.20.6)(yaml@2.8.1) transitivePeerDependencies: - '@types/node' - rollup - supports-color - vite-tsconfig-paths@5.1.4(typescript@5.8.3)(vite@6.3.5(@types/node@18.16.20)(jiti@2.4.2)(less@4.1.3)(sass-embedded@1.93.3)(sass@1.94.0)(stylus@0.64.0)(terser@5.43.1)(tsx@4.20.6)(yaml@2.8.1)): + vite-tsconfig-paths@5.1.4(typescript@5.8.3)(vite@6.3.5(@types/node@18.16.20)(jiti@2.4.2)(less@4.1.3)(sass-embedded@1.93.3)(sass@1.93.3)(stylus@0.64.0)(terser@5.43.1)(tsx@4.20.6)(yaml@2.8.1)): dependencies: debug: 4.4.3(supports-color@10.2.2) globrex: 0.1.2 tsconfck: 3.1.6(typescript@5.8.3) optionalDependencies: - vite: 6.3.5(@types/node@18.16.20)(jiti@2.4.2)(less@4.1.3)(sass-embedded@1.93.3)(sass@1.94.0)(stylus@0.64.0)(terser@5.43.1)(tsx@4.20.6)(yaml@2.8.1) + vite: 6.3.5(@types/node@18.16.20)(jiti@2.4.2)(less@4.1.3)(sass-embedded@1.93.3)(sass@1.93.3)(stylus@0.64.0)(terser@5.43.1)(tsx@4.20.6)(yaml@2.8.1) transitivePeerDependencies: - supports-color - typescript - vite@5.4.21(@types/node@18.16.20)(less@4.1.3)(sass-embedded@1.93.3)(sass@1.94.0)(stylus@0.64.0)(terser@5.43.1): + vite@5.4.21(@types/node@18.16.20)(less@4.1.3)(sass-embedded@1.93.3)(sass@1.93.3)(stylus@0.64.0)(terser@5.43.1): dependencies: esbuild: 0.21.5 postcss: 8.4.49 - rollup: 4.53.2 + rollup: 4.52.5 optionalDependencies: '@types/node': 18.16.20 fsevents: 2.3.3 less: 4.1.3 - sass: 1.94.0 + sass: 1.93.3 sass-embedded: 1.93.3 stylus: 0.64.0 terser: 5.43.1 @@ -26117,7 +26674,7 @@ snapshots: dependencies: esbuild: 0.21.5 postcss: 8.4.49 - rollup: 4.53.2 + rollup: 4.52.5 optionalDependencies: '@types/node': 22.19.0 fsevents: 2.3.3 @@ -26127,20 +26684,20 @@ snapshots: stylus: 0.64.0 terser: 5.43.1 - vite@6.3.5(@types/node@18.16.20)(jiti@2.4.2)(less@4.1.3)(sass-embedded@1.93.3)(sass@1.94.0)(stylus@0.64.0)(terser@5.43.1)(tsx@4.20.6)(yaml@2.8.1): + vite@6.3.5(@types/node@18.16.20)(jiti@2.4.2)(less@4.1.3)(sass-embedded@1.93.3)(sass@1.93.3)(stylus@0.64.0)(terser@5.43.1)(tsx@4.20.6)(yaml@2.8.1): dependencies: - esbuild: 0.25.12 + esbuild: 0.25.11 fdir: 6.5.0(picomatch@4.0.3) picomatch: 4.0.3 postcss: 8.5.6 - rollup: 4.53.2 + rollup: 4.52.5 tinyglobby: 0.2.15 optionalDependencies: '@types/node': 18.16.20 fsevents: 2.3.3 jiti: 2.4.2 less: 4.1.3 - sass: 1.94.0 + sass: 1.93.3 sass-embedded: 1.93.3 stylus: 0.64.0 terser: 5.43.1 @@ -26149,11 +26706,11 @@ snapshots: vite@6.4.1(@types/node@22.19.0)(jiti@2.4.2)(less@4.1.3)(sass-embedded@1.93.3)(sass@1.94.0)(stylus@0.64.0)(terser@5.43.1)(tsx@4.20.6)(yaml@2.8.1): dependencies: - esbuild: 0.25.12 + esbuild: 0.25.11 fdir: 6.5.0(picomatch@4.0.3) picomatch: 4.0.3 postcss: 8.5.6 - rollup: 4.53.2 + rollup: 4.52.5 tinyglobby: 0.2.15 optionalDependencies: '@types/node': 22.19.0 @@ -26216,7 +26773,7 @@ snapshots: optionalDependencies: vite: 7.2.2(@types/node@20.19.24)(jiti@2.4.2)(less@4.1.3)(sass-embedded@1.93.3)(sass@1.94.0)(stylus@0.64.0)(terser@5.43.1)(tsx@4.20.6)(yaml@2.8.1) - vitest@1.3.1(@types/node@18.16.20)(@vitest/ui@1.6.1)(jsdom@22.1.0)(less@4.1.3)(sass-embedded@1.93.3)(sass@1.94.0)(stylus@0.64.0)(terser@5.43.1): + vitest@1.3.1(@types/node@18.16.20)(@vitest/ui@1.6.1)(jsdom@22.1.0)(less@4.1.3)(sass-embedded@1.93.3)(sass@1.93.3)(stylus@0.64.0)(terser@5.43.1): dependencies: '@vitest/expect': 1.3.1 '@vitest/runner': 1.3.1 @@ -26235,8 +26792,8 @@ snapshots: strip-literal: 2.1.1 tinybench: 2.9.0 tinypool: 0.8.4 - vite: 5.4.21(@types/node@18.16.20)(less@4.1.3)(sass-embedded@1.93.3)(sass@1.94.0)(stylus@0.64.0)(terser@5.43.1) - vite-node: 1.3.1(@types/node@18.16.20)(less@4.1.3)(sass-embedded@1.93.3)(sass@1.94.0)(stylus@0.64.0)(terser@5.43.1) + vite: 5.4.21(@types/node@18.16.20)(less@4.1.3)(sass-embedded@1.93.3)(sass@1.93.3)(stylus@0.64.0)(terser@5.43.1) + vite-node: 1.3.1(@types/node@18.16.20)(less@4.1.3)(sass-embedded@1.93.3)(sass@1.93.3)(stylus@0.64.0)(terser@5.43.1) why-is-node-running: 2.3.0 optionalDependencies: '@types/node': 18.16.20 @@ -26663,7 +27220,7 @@ snapshots: mrmime: 2.0.1 regexparam: 3.0.0 - wrangler@4.41.0(@cloudflare/workers-types@4.20251109.0): + wrangler@4.41.0(@cloudflare/workers-types@4.20251014.0): dependencies: '@cloudflare/kv-asset-handler': 0.4.0 '@cloudflare/unenv-preset': 2.7.5(unenv@2.0.0-rc.21)(workerd@1.20251001.0) @@ -26674,7 +27231,24 @@ snapshots: unenv: 2.0.0-rc.21 workerd: 1.20251001.0 optionalDependencies: - '@cloudflare/workers-types': 4.20251109.0 + '@cloudflare/workers-types': 4.20251014.0 + fsevents: 2.3.3 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + + wrangler@4.46.0(@cloudflare/workers-types@4.20251014.0): + dependencies: + '@cloudflare/kv-asset-handler': 0.4.0 + '@cloudflare/unenv-preset': 2.7.9(unenv@2.0.0-rc.24)(workerd@1.20251105.0) + blake3-wasm: 2.1.5 + esbuild: 0.25.4 + miniflare: 4.20251105.0 + path-to-regexp: 6.3.0 + unenv: 2.0.0-rc.24 + workerd: 1.20251105.0 + optionalDependencies: + '@cloudflare/workers-types': 4.20251014.0 fsevents: 2.3.3 transitivePeerDependencies: - bufferutil @@ -26859,9 +27433,9 @@ snapshots: dependencies: zod: 3.25.76 - zod-to-ts@1.2.0(typescript@5.8.3)(zod@3.25.76): + zod-to-ts@1.2.0(typescript@5.9.3)(zod@3.25.76): dependencies: - typescript: 5.8.3 + typescript: 5.9.3 zod: 3.25.76 zod@3.22.3: {}