From d57a007a42622bea1794d3477e674436250415c3 Mon Sep 17 00:00:00 2001 From: YHH <359807859@qq.com> Date: Sat, 27 Dec 2025 13:28:49 +0800 Subject: [PATCH] docs: split Entity docs into sub-modules and fix Starlight CI (#362) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * docs: split Entity docs into sub-modules and fix Starlight CI - Split monolithic entity.md into 4 focused sub-documents: - guide/entity/index.md - Overview and basic concepts - guide/entity/component-operations.md - Component API operations - guide/entity/entity-handle.md - EntityHandle system for safe references - guide/entity/lifecycle.md - Lifecycle and persistence management - Created bilingual versions (Chinese and English) - Updated sidebar configuration in astro.config.mjs - Fixed CI workflow for Starlight migration: - Updated docs.yml to upload from docs/dist instead of .vitepress/dist - Updated package.json scripts to use pnpm filter for docs - Added docs directory to pnpm-workspace.yaml - Renamed docs package to @esengine/docs - Documented missing Entity APIs: - createComponent() method - addComponents() batch method - getComponentByType() with inheritance support - markDirty() for change detection * docs: split Network docs and fix API errors - Split network module into focused sub-documents: - modules/network/index.md - Overview and quick start - modules/network/client.md - Client-side usage - modules/network/server.md - Server-side GameServer/Room - modules/network/sync.md - Interpolation and prediction - modules/network/api.md - Complete API reference - Fixed incorrect API documentation: - localClientId → clientId - ENetworkState enum values (strings → numbers) - connect() method signature - Removed non-existent localPlayerId property - Fixed onConnected callback signature - Created bilingual versions (Chinese and English) - Updated sidebar configuration - Updated pnpm-lock.yaml for docs workspace --- .github/workflows/docs.yml | 2 +- docs/astro.config.mjs | 25 +- docs/package.json | 3 +- docs/src/content/docs/en/guide/entity.md | 446 --- .../en/guide/entity/component-operations.md | 273 ++ .../docs/en/guide/entity/entity-handle.md | 265 ++ .../src/content/docs/en/guide/entity/index.md | 174 ++ .../content/docs/en/guide/entity/lifecycle.md | 238 ++ .../content/docs/en/modules/network/api.md | 111 + .../content/docs/en/modules/network/client.md | 141 + .../content/docs/en/modules/network/index.md | 660 +--- .../content/docs/en/modules/network/server.md | 76 + .../content/docs/en/modules/network/sync.md | 69 + docs/src/content/docs/guide/entity.md | 448 --- .../docs/guide/entity/component-operations.md | 273 ++ .../docs/guide/entity/entity-handle.md | 265 ++ docs/src/content/docs/guide/entity/index.md | 174 ++ .../content/docs/guide/entity/lifecycle.md | 238 ++ docs/src/content/docs/modules/network/api.md | 288 ++ .../content/docs/modules/network/client.md | 256 ++ .../src/content/docs/modules/network/index.md | 660 +--- .../content/docs/modules/network/server.md | 207 ++ docs/src/content/docs/modules/network/sync.md | 174 ++ package.json | 6 +- pnpm-lock.yaml | 2758 ++++++++++++++++- pnpm-workspace.yaml | 1 + 26 files changed, 5970 insertions(+), 2261 deletions(-) delete mode 100644 docs/src/content/docs/en/guide/entity.md create mode 100644 docs/src/content/docs/en/guide/entity/component-operations.md create mode 100644 docs/src/content/docs/en/guide/entity/entity-handle.md create mode 100644 docs/src/content/docs/en/guide/entity/index.md create mode 100644 docs/src/content/docs/en/guide/entity/lifecycle.md create mode 100644 docs/src/content/docs/en/modules/network/api.md create mode 100644 docs/src/content/docs/en/modules/network/client.md create mode 100644 docs/src/content/docs/en/modules/network/server.md create mode 100644 docs/src/content/docs/en/modules/network/sync.md delete mode 100644 docs/src/content/docs/guide/entity.md create mode 100644 docs/src/content/docs/guide/entity/component-operations.md create mode 100644 docs/src/content/docs/guide/entity/entity-handle.md create mode 100644 docs/src/content/docs/guide/entity/index.md create mode 100644 docs/src/content/docs/guide/entity/lifecycle.md create mode 100644 docs/src/content/docs/modules/network/api.md create mode 100644 docs/src/content/docs/modules/network/client.md create mode 100644 docs/src/content/docs/modules/network/server.md create mode 100644 docs/src/content/docs/modules/network/sync.md diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml index 459b2184..18e5ad92 100644 --- a/.github/workflows/docs.yml +++ b/.github/workflows/docs.yml @@ -56,7 +56,7 @@ jobs: - name: Upload artifact uses: actions/upload-pages-artifact@v3 with: - path: docs/.vitepress/dist + path: docs/dist deploy: environment: diff --git a/docs/astro.config.mjs b/docs/astro.config.mjs index 1a011f8b..fb408046 100644 --- a/docs/astro.config.mjs +++ b/docs/astro.config.mjs @@ -39,7 +39,16 @@ export default defineConfig({ label: '核心概念', translations: { en: 'Core Concepts' }, items: [ - { label: '实体', slug: 'guide/entity', translations: { en: 'Entity' } }, + { + label: '实体', + translations: { en: 'Entity' }, + items: [ + { label: '概述', slug: 'guide/entity', translations: { en: 'Overview' } }, + { label: '组件操作', slug: 'guide/entity/component-operations', translations: { en: 'Component Operations' } }, + { label: '实体句柄', slug: 'guide/entity/entity-handle', translations: { en: 'Entity Handle' } }, + { label: '生命周期', slug: 'guide/entity/lifecycle', translations: { en: 'Lifecycle' } }, + ], + }, { label: '层级结构', slug: 'guide/hierarchy', translations: { en: 'Hierarchy' } }, { label: '组件', @@ -132,7 +141,17 @@ export default defineConfig({ { label: '寻路', slug: 'modules/pathfinding', translations: { en: 'Pathfinding' } }, { label: '蓝图', slug: 'modules/blueprint', translations: { en: 'Blueprint' } }, { label: '程序生成', slug: 'modules/procgen', translations: { en: 'Procgen' } }, - { label: '网络', slug: 'modules/network', translations: { en: 'Network' } }, + { + label: '网络', + translations: { en: 'Network' }, + items: [ + { label: '概述', slug: 'modules/network', translations: { en: 'Overview' } }, + { label: '客户端', slug: 'modules/network/client', translations: { en: 'Client' } }, + { label: '服务器', slug: 'modules/network/server', translations: { en: 'Server' } }, + { label: '状态同步', slug: 'modules/network/sync', translations: { en: 'State Sync' } }, + { label: 'API 参考', slug: 'modules/network/api', translations: { en: 'API Reference' } }, + ], + }, ], }, { @@ -175,4 +194,4 @@ export default defineConfig({ vite: { plugins: [tailwindcss()], }, -}); \ No newline at end of file +}); diff --git a/docs/package.json b/docs/package.json index 1113e479..567b7949 100644 --- a/docs/package.json +++ b/docs/package.json @@ -1,5 +1,6 @@ { - "name": "docs-new", + "name": "@esengine/docs", + "private": true, "type": "module", "version": "0.0.1", "scripts": { diff --git a/docs/src/content/docs/en/guide/entity.md b/docs/src/content/docs/en/guide/entity.md deleted file mode 100644 index 7a83f22f..00000000 --- a/docs/src/content/docs/en/guide/entity.md +++ /dev/null @@ -1,446 +0,0 @@ ---- -title: "Entity" ---- - -In ECS architecture, an Entity is the basic object in the game world. An entity itself does not contain game logic or data - it's just a container that combines different components to achieve various functionalities. - -## Basic Concepts - -An entity is a lightweight object mainly used for: -- Serving as a container for components -- Providing a unique identifier (ID) -- Managing component lifecycle - -::: tip About Parent-Child Hierarchy -Parent-child hierarchy relationships between entities are managed through `HierarchyComponent` and `HierarchySystem`, not built-in Entity properties. This design follows ECS composition principles - only entities that need hierarchy relationships add this component. - -See [Hierarchy System](./hierarchy/) documentation. -::: - -## Creating Entities - -**Important: Entities must be created through Scene, manual creation is not supported!** - -Entities must be created through the scene's `createEntity()` method to ensure: -- Entity is properly added to the scene's entity management system -- Entity is added to the query system for system use -- Entity gets the correct scene reference -- Related lifecycle events are triggered - -```typescript -// Correct way: create entity through scene -const player = scene.createEntity("Player"); - -// Wrong way: manually create entity -// const entity = new Entity("MyEntity", 1); // System cannot manage such entities -``` - -## Adding Components - -Entities gain functionality by adding components: - -```typescript -import { Component, ECSComponent } from '@esengine/ecs-framework'; - -// Define position component -@ECSComponent('Position') -class Position extends Component { - x: number = 0; - y: number = 0; - - constructor(x: number = 0, y: number = 0) { - super(); - this.x = x; - this.y = y; - } -} - -// Define health component -@ECSComponent('Health') -class Health extends Component { - current: number = 100; - max: number = 100; - - constructor(max: number = 100) { - super(); - this.max = max; - this.current = max; - } -} - -// Add components to entity -const player = scene.createEntity("Player"); -player.addComponent(new Position(100, 200)); -player.addComponent(new Health(150)); -``` - -## Getting Components - -```typescript -// Get component (pass component class, not instance) -const position = player.getComponent(Position); // Returns Position | null -const health = player.getComponent(Health); // Returns Health | null - -// Check if component exists -if (position) { - console.log(`Player position: x=${position.x}, y=${position.y}`); -} - -// Check if entity has a component -if (player.hasComponent(Position)) { - console.log("Player has position component"); -} - -// Get all component instances (read-only property) -const allComponents = player.components; // readonly Component[] - -// Get all components of specified type (supports multiple components of same type) -const allHealthComponents = player.getComponents(Health); // Health[] - -// Get or create component (creates automatically if not exists) -const position = player.getOrCreateComponent(Position, 0, 0); // Pass constructor arguments -const health = player.getOrCreateComponent(Health, 100); // Returns existing if present, creates new if not -``` - -## Removing Components - -```typescript -// Method 1: Remove by component type -const removedHealth = player.removeComponentByType(Health); -if (removedHealth) { - console.log("Health component removed"); -} - -// Method 2: Remove by component instance -const healthComponent = player.getComponent(Health); -if (healthComponent) { - player.removeComponent(healthComponent); -} - -// Batch remove multiple component types -const removedComponents = player.removeComponentsByTypes([Position, Health]); - -// Check if component was removed -if (!player.hasComponent(Health)) { - console.log("Health component has been removed"); -} -``` - -## Finding Entities - -Scene provides multiple ways to find entities: - -### Find by Name - -```typescript -// Find single entity -const player = scene.findEntity("Player"); -// Or use alias method -const player2 = scene.getEntityByName("Player"); - -if (player) { - console.log("Found player entity"); -} -``` - -### Find by ID - -```typescript -// Find by entity ID -const entity = scene.findEntityById(123); -``` - -### Find by Tag - -Entities support a tag system for quick categorization and lookup: - -```typescript -// Set tags -player.tag = 1; // Player tag -enemy.tag = 2; // Enemy tag - -// Find all entities by tag -const players = scene.findEntitiesByTag(1); -const enemies = scene.findEntitiesByTag(2); -// Or use alias method -const allPlayers = scene.getEntitiesByTag(1); -``` - -## Entity Lifecycle - -```typescript -// Destroy entity -player.destroy(); - -// Check if entity is destroyed -if (player.isDestroyed) { - console.log("Entity has been destroyed"); -} -``` - -## Entity Events - -Component changes on entities trigger events: - -```typescript -// Listen for component added event -scene.eventSystem.on('component:added', (data) => { - console.log('Component added:', data); -}); - -// Listen for entity created event -scene.eventSystem.on('entity:created', (data) => { - console.log('Entity created:', data.entityName); -}); -``` - -## Performance Optimization - -### Batch Entity Creation - -The framework provides high-performance batch creation methods: - -```typescript -// Batch create 100 bullet entities (high-performance version) -const bullets = scene.createEntities(100, "Bullet"); - -// Add components to each bullet -bullets.forEach((bullet, index) => { - bullet.addComponent(new Position(Math.random() * 800, Math.random() * 600)); - bullet.addComponent(new Velocity(Math.random() * 100 - 50, Math.random() * 100 - 50)); -}); -``` - -`createEntities()` method will: -- Batch allocate entity IDs -- Batch add to entity list -- Optimize query system updates -- Reduce system cache clearing times - -## Best Practices - -### 1. Appropriate Component Granularity - -```typescript -// Good practice: single-purpose components -@ECSComponent('Position') -class Position extends Component { - x: number = 0; - y: number = 0; -} - -@ECSComponent('Velocity') -class Velocity extends Component { - dx: number = 0; - dy: number = 0; -} - -// Avoid: overly complex components -@ECSComponent('Player') -class Player extends Component { - // Avoid including too many unrelated properties in one component - x: number; - y: number; - health: number; - inventory: Item[]; - skills: Skill[]; -} -``` - -### 2. Use Decorators - -Always use `@ECSComponent` decorator: - -```typescript -@ECSComponent('Transform') -class Transform extends Component { - // Component implementation -} -``` - -### 3. Proper Naming - -```typescript -// Clear entity naming -const mainCharacter = scene.createEntity("MainCharacter"); -const enemy1 = scene.createEntity("Goblin_001"); -const collectible = scene.createEntity("HealthPotion"); -``` - -### 4. Timely Cleanup - -```typescript -// Destroy entities that are no longer needed -if (enemy.getComponent(Health).current <= 0) { - enemy.destroy(); -} -``` - -## Debugging Entities - -The framework provides debugging features to help development: - -```typescript -// Get entity debug info -const debugInfo = entity.getDebugInfo(); -console.log('Entity info:', debugInfo); - -// List all components of entity -entity.components.forEach(component => { - console.log('Component:', component.constructor.name); -}); -``` - -Entities are one of the core concepts in ECS architecture. Understanding how to use entities correctly will help you build efficient, maintainable game code. - -## Entity Handle (EntityHandle) - -Entity handles provide a safe way to reference entities, solving the "referencing destroyed entity" problem. - -### Problem Scenario - -Suppose your AI system needs to track a target enemy: - -```typescript -// Wrong approach: directly store entity reference -class AISystem extends EntitySystem { - private targetEnemy: Entity | null = null; - - setTarget(enemy: Entity) { - this.targetEnemy = enemy; - } - - process() { - if (this.targetEnemy) { - // Dangerous! Enemy might be destroyed, but reference still exists - // Worse: this memory location might be reused by a new entity - const health = this.targetEnemy.getComponent(Health); - // Might operate on the wrong entity! - } - } -} -``` - -### Correct Approach Using Handles - -Each entity is automatically assigned a handle when created, accessible via `entity.handle`: - -```typescript -import { EntityHandle, NULL_HANDLE, isValidHandle } from '@esengine/ecs-framework'; - -class AISystem extends EntitySystem { - // Store handle instead of entity reference - private targetHandle: EntityHandle = NULL_HANDLE; - - setTarget(enemy: Entity) { - // Save enemy's handle - this.targetHandle = enemy.handle; - } - - process() { - if (!isValidHandle(this.targetHandle)) { - return; // No target - } - - // Get entity through handle (automatically checks validity) - const enemy = this.scene.findEntityByHandle(this.targetHandle); - - if (!enemy) { - // Enemy was destroyed, clear reference - this.targetHandle = NULL_HANDLE; - return; - } - - // Safe operation - const health = enemy.getComponent(Health); - } -} -``` - -### Complete Example: Skill Target Locking - -```typescript -import { - EntitySystem, Entity, EntityHandle, NULL_HANDLE, isValidHandle -} from '@esengine/ecs-framework'; - -@ECSSystem('SkillTargeting') -class SkillTargetingSystem extends EntitySystem { - // Store handles for multiple targets - private lockedTargets: Map = new Map(); - - // Lock target - lockTarget(caster: Entity, target: Entity) { - this.lockedTargets.set(caster, target.handle); - } - - // Get locked target - getLockedTarget(caster: Entity): Entity | null { - const handle = this.lockedTargets.get(caster); - - if (!handle || !isValidHandle(handle)) { - return null; - } - - // findEntityByHandle checks if handle is valid - const target = this.scene.findEntityByHandle(handle); - - if (!target) { - // Target died, clear lock - this.lockedTargets.delete(caster); - } - - return target; - } - - // Cast skill - castSkill(caster: Entity) { - const target = this.getLockedTarget(caster); - - if (!target) { - console.log('Target lost, skill cancelled'); - return; - } - - // Safely deal damage to target - const health = target.getComponent(Health); - if (health) { - health.current -= 10; - } - } -} -``` - -### Handle vs Entity Reference - -| Scenario | Recommended Approach | -|----------|---------------------| -| Temporary use within same frame | Use `Entity` reference directly | -| Cross-frame storage (e.g., AI target, skill target) | Use `EntityHandle` | -| Needs serialization | Use `EntityHandle` (numeric type) | -| Network synchronization | Use `EntityHandle` (can be transmitted directly) | - -### API Quick Reference - -```typescript -// Get entity's handle -const handle = entity.handle; - -// Check if handle is non-null -if (isValidHandle(handle)) { ... } - -// Get entity through handle (automatically checks validity) -const entity = scene.findEntityByHandle(handle); - -// Check if entity corresponding to handle is alive -const alive = scene.handleManager.isAlive(handle); - -// Null handle constant -const emptyHandle = NULL_HANDLE; -``` - -## Next Steps - -- Learn about [Hierarchy System](./hierarchy/) to establish parent-child relationships -- Learn about [Component System](./component/) to add functionality to entities -- Learn about [Scene Management](./scene/) to organize and manage entities diff --git a/docs/src/content/docs/en/guide/entity/component-operations.md b/docs/src/content/docs/en/guide/entity/component-operations.md new file mode 100644 index 00000000..503369a2 --- /dev/null +++ b/docs/src/content/docs/en/guide/entity/component-operations.md @@ -0,0 +1,273 @@ +--- +title: "Component Operations" +description: "Detailed guide to adding, getting, and removing entity components" +--- + +Entities gain functionality by adding components. This section details all component operation APIs. + +## Adding Components + +### addComponent + +Add an already-created component instance: + +```typescript +import { Component, ECSComponent } from '@esengine/ecs-framework'; + +@ECSComponent('Position') +class Position extends Component { + x: number = 0; + y: number = 0; + + constructor(x: number = 0, y: number = 0) { + super(); + this.x = x; + this.y = y; + } +} + +const player = scene.createEntity("Player"); +const position = new Position(100, 200); +player.addComponent(position); +``` + +### createComponent + +Pass the component type and constructor arguments directly—the entity creates the instance (recommended): + +```typescript +// Create and add component +const position = player.createComponent(Position, 100, 200); +const health = player.createComponent(Health, 150); + +// Equivalent to: +// const position = new Position(100, 200); +// player.addComponent(position); +``` + +### addComponents + +Add multiple components at once: + +```typescript +const components = player.addComponents([ + new Position(100, 200), + new Health(150), + new Velocity(0, 0) +]); +``` + +:::note[Important Notes] +- An entity cannot have two components of the same type—an exception will be thrown +- The entity must be added to a scene before adding components +::: + +## Getting Components + +### getComponent + +Get a component of a specific type: + +```typescript +// Returns Position | null +const position = player.getComponent(Position); + +if (position) { + position.x += 10; + position.y += 20; +} +``` + +### hasComponent + +Check if an entity has a specific component type: + +```typescript +if (player.hasComponent(Position)) { + const position = player.getComponent(Position)!; + // Use ! because we confirmed it exists +} +``` + +### getComponents + +Get all components of a specific type (for multi-component scenarios): + +```typescript +const allHealthComponents = player.getComponents(Health); +``` + +### getComponentByType + +Get components with inheritance support using `instanceof` checking: + +```typescript +// Find CompositeNodeComponent or any subclass +const composite = entity.getComponentByType(CompositeNodeComponent); +if (composite) { + // composite could be SequenceNode, SelectorNode, etc. +} +``` + +Difference from `getComponent()`: + +| Method | Lookup Method | Performance | Use Case | +|--------|---------------|-------------|----------| +| `getComponent` | Exact type match (bitmask) | High | Known exact type | +| `getComponentByType` | `instanceof` check | Lower | Need inheritance support | + +### getOrCreateComponent + +Get or create a component—automatically creates if it doesn't exist: + +```typescript +// Ensure entity has Position component +const position = player.getOrCreateComponent(Position, 0, 0); +position.x = 100; + +// If exists, returns existing component +// If not, creates new component with (0, 0) args +``` + +### components Property + +Get all entity components (read-only): + +```typescript +const allComponents = player.components; // readonly Component[] + +allComponents.forEach(component => { + console.log(component.constructor.name); +}); +``` + +## Removing Components + +### removeComponent + +Remove by component instance: + +```typescript +const healthComponent = player.getComponent(Health); +if (healthComponent) { + player.removeComponent(healthComponent); +} +``` + +### removeComponentByType + +Remove by component type: + +```typescript +const removedHealth = player.removeComponentByType(Health); +if (removedHealth) { + console.log("Health component removed"); +} +``` + +### removeComponentsByTypes + +Remove multiple component types at once: + +```typescript +const removedComponents = player.removeComponentsByTypes([ + Position, + Health, + Velocity +]); +``` + +### removeAllComponents + +Remove all components: + +```typescript +player.removeAllComponents(); +``` + +## Change Detection + +### markDirty + +Mark components as modified for frame-level change detection: + +```typescript +const pos = entity.getComponent(Position)!; +pos.x = 100; +entity.markDirty(pos); + +// Or mark multiple components +const vel = entity.getComponent(Velocity)!; +entity.markDirty(pos, vel); +``` + +Use with reactive queries: + +```typescript +// Query for components modified this frame +const changedQuery = scene.createReactiveQuery({ + all: [Position], + changed: [Position] // Only match modified this frame +}); + +for (const entity of changedQuery.getEntities()) { + // Handle entities with position changes +} +``` + +## Component Mask + +Each entity maintains a component bitmask for efficient `hasComponent` checks: + +```typescript +// Get component mask (internal use) +const mask = entity.componentMask; +``` + +## Complete Example + +```typescript +import { Component, ECSComponent, Scene } from '@esengine/ecs-framework'; + +@ECSComponent('Position') +class Position extends Component { + constructor(public x = 0, public y = 0) { super(); } +} + +@ECSComponent('Health') +class Health extends Component { + constructor(public current = 100, public max = 100) { super(); } +} + +// Create entity and add components +const player = scene.createEntity("Player"); +player.createComponent(Position, 100, 200); +player.createComponent(Health, 150, 150); + +// Get and modify component +const position = player.getComponent(Position); +if (position) { + position.x += 10; + player.markDirty(position); +} + +// Get or create component +const velocity = player.getOrCreateComponent(Velocity, 0, 0); + +// Check component existence +if (player.hasComponent(Health)) { + const health = player.getComponent(Health)!; + health.current -= 10; +} + +// Remove component +player.removeComponentByType(Velocity); + +// List all components +console.log(player.components.map(c => c.constructor.name)); +``` + +## Next Steps + +- [Entity Handle](/en/guide/entity/entity-handle/) - Safe cross-frame entity references +- [Component System](/en/guide/component/) - Component definition and lifecycle diff --git a/docs/src/content/docs/en/guide/entity/entity-handle.md b/docs/src/content/docs/en/guide/entity/entity-handle.md new file mode 100644 index 00000000..b0bb8ef0 --- /dev/null +++ b/docs/src/content/docs/en/guide/entity/entity-handle.md @@ -0,0 +1,265 @@ +--- +title: "Entity Handle" +description: "Using EntityHandle to safely reference entities and avoid referencing destroyed entities" +--- + +Entity handles (EntityHandle) provide a safe way to reference entities, solving the "referencing destroyed entities" problem. + +## The Problem + +Imagine your AI system needs to track a target enemy: + +```typescript +// ❌ Wrong: Storing entity reference directly +class AISystem extends EntitySystem { + private targetEnemy: Entity | null = null; + + setTarget(enemy: Entity) { + this.targetEnemy = enemy; + } + + process() { + if (this.targetEnemy) { + // Danger! Enemy might be destroyed but reference still exists + // Worse: This memory location might be reused by a new entity + const health = this.targetEnemy.getComponent(Health); + // Might operate on wrong entity! + } + } +} +``` + +## What is EntityHandle + +EntityHandle is a numeric entity identifier containing: +- **Index**: Entity's position in the array +- **Generation**: Number of times the entity slot has been reused + +When an entity is destroyed, even if its index is reused by a new entity, the generation increases, invalidating old handles. + +```typescript +import { EntityHandle, NULL_HANDLE, isValidHandle } from '@esengine/ecs-framework'; + +// Each entity gets a handle when created +const handle: EntityHandle = entity.handle; + +// Null handle constant +const emptyHandle = NULL_HANDLE; + +// Check if handle is non-null +if (isValidHandle(handle)) { + // Handle is valid +} +``` + +## The Correct Approach + +```typescript +import { EntityHandle, NULL_HANDLE, isValidHandle } from '@esengine/ecs-framework'; + +class AISystem extends EntitySystem { + // ✅ Store handle instead of entity reference + private targetHandle: EntityHandle = NULL_HANDLE; + + setTarget(enemy: Entity) { + this.targetHandle = enemy.handle; + } + + process() { + if (!isValidHandle(this.targetHandle)) { + return; // No target + } + + // Get entity via handle (auto-validates) + const enemy = this.scene.findEntityByHandle(this.targetHandle); + + if (!enemy) { + // Enemy destroyed, clear reference + this.targetHandle = NULL_HANDLE; + return; + } + + // Safe operation + const health = enemy.getComponent(Health); + if (health) { + // Deal damage to enemy + } + } +} +``` + +## API Reference + +### Getting Handle + +```typescript +// Get handle from entity +const handle = entity.handle; +``` + +### Validating Handle + +```typescript +import { isValidHandle, NULL_HANDLE } from '@esengine/ecs-framework'; + +// Check if handle is non-null +if (isValidHandle(handle)) { + // ... +} + +// Check if entity is alive +const alive = scene.handleManager.isAlive(handle); +``` + +### Getting Entity by Handle + +```typescript +// Returns Entity | null +const entity = scene.findEntityByHandle(handle); + +if (entity) { + // Entity exists and is valid +} +``` + +## Complete Example: Skill Target Locking + +```typescript +import { + EntitySystem, + Entity, + EntityHandle, + NULL_HANDLE, + isValidHandle +} from '@esengine/ecs-framework'; + +@ECSSystem('SkillTargeting') +class SkillTargetingSystem extends EntitySystem { + // Store multiple target handles + private lockedTargets: Map = new Map(); + + // Lock target + lockTarget(casterId: number, target: Entity) { + this.lockedTargets.set(casterId, target.handle); + } + + // Get locked target + getLockedTarget(casterId: number): Entity | null { + const handle = this.lockedTargets.get(casterId); + + if (!handle || !isValidHandle(handle)) { + return null; + } + + const target = this.scene.findEntityByHandle(handle); + + if (!target) { + // Target dead, clear lock + this.lockedTargets.delete(casterId); + } + + return target; + } + + // Cast skill + castSkill(caster: Entity) { + const target = this.getLockedTarget(caster.id); + + if (!target) { + console.log('Target lost, skill cancelled'); + return; + } + + const health = target.getComponent(Health); + if (health) { + health.current -= 10; + } + } + + // Clear target for specific caster + clearTarget(casterId: number) { + this.lockedTargets.delete(casterId); + } +} +``` + +## Usage Guidelines + +| Scenario | Recommended Approach | +|----------|---------------------| +| Same-frame temporary use | Direct `Entity` reference | +| Cross-frame storage (AI target, skill target) | Use `EntityHandle` | +| Serialization/save | Use `EntityHandle` (numeric type) | +| Network sync | Use `EntityHandle` (directly transferable) | + +## Performance Considerations + +- EntityHandle is a numeric type with small memory footprint +- `findEntityByHandle` is O(1) operation +- Safer and more reliable than checking `entity.isDestroyed` every frame + +## Common Patterns + +### Optional Target Reference + +```typescript +class FollowComponent extends Component { + private _targetHandle: EntityHandle = NULL_HANDLE; + + setTarget(target: Entity | null) { + this._targetHandle = target?.handle ?? NULL_HANDLE; + } + + getTarget(scene: IScene): Entity | null { + if (!isValidHandle(this._targetHandle)) { + return null; + } + return scene.findEntityByHandle(this._targetHandle); + } + + hasTarget(): boolean { + return isValidHandle(this._targetHandle); + } +} +``` + +### Multi-Target Tracking + +```typescript +class MultiTargetComponent extends Component { + private targets: EntityHandle[] = []; + + addTarget(target: Entity) { + this.targets.push(target.handle); + } + + removeTarget(target: Entity) { + const index = this.targets.indexOf(target.handle); + if (index >= 0) { + this.targets.splice(index, 1); + } + } + + getValidTargets(scene: IScene): Entity[] { + const valid: Entity[] = []; + const stillValid: EntityHandle[] = []; + + for (const handle of this.targets) { + const entity = scene.findEntityByHandle(handle); + if (entity) { + valid.push(entity); + stillValid.push(handle); + } + } + + // Clean up invalid handles + this.targets = stillValid; + return valid; + } +} +``` + +## Next Steps + +- [Lifecycle](/en/guide/entity/lifecycle/) - Entity destruction and persistence +- [Entity Reference](/en/guide/component/entity-ref/) - Entity reference decorators in components diff --git a/docs/src/content/docs/en/guide/entity/index.md b/docs/src/content/docs/en/guide/entity/index.md new file mode 100644 index 00000000..fd8bddbe --- /dev/null +++ b/docs/src/content/docs/en/guide/entity/index.md @@ -0,0 +1,174 @@ +--- +title: "Entity Overview" +description: "Basic concepts and usage of entities in ECS architecture" +--- + +In ECS architecture, an Entity is a fundamental object in the game world. Entities contain no game logic or data themselves—they are simply containers that combine different components to achieve various functionalities. + +## Basic Concepts + +An entity is a lightweight object primarily used for: +- Acting as a container for components +- Providing unique identifiers (ID and persistentId) +- Managing component lifecycles + +:::tip[About Parent-Child Hierarchy] +Parent-child relationships between entities are managed through `HierarchyComponent` and `HierarchySystem`, not built-in Entity properties. This design follows ECS composition principles—only entities that need hierarchy relationships add this component. + +See the [Hierarchy System](/en/guide/hierarchy/) documentation for details. +::: + +## Creating Entities + +**Entities must be created through the scene, not manually.** + +```typescript +// Correct: Create entity through scene +const player = scene.createEntity("Player"); + +// ❌ Wrong: Manual creation +// const entity = new Entity("MyEntity", 1); +``` + +Creating through the scene ensures: +- Entity is properly added to the scene's entity management system +- Entity is added to the query system for use by systems +- Entity gets the correct scene reference +- Related lifecycle events are triggered + +### Batch Creation + +The framework provides high-performance batch creation: + +```typescript +// Batch create 100 bullet entities +const bullets = scene.createEntities(100, "Bullet"); + +bullets.forEach((bullet, index) => { + bullet.createComponent(Position, Math.random() * 800, Math.random() * 600); + bullet.createComponent(Velocity, Math.random() * 100, Math.random() * 100); +}); +``` + +`createEntities()` batches ID allocation, optimizes query system updates, and reduces system cache clearing. + +## Entity Identifiers + +Each entity has three types of identifiers: + +| Property | Type | Description | +|----------|------|-------------| +| `id` | `number` | Runtime unique identifier for fast lookups | +| `persistentId` | `string` | GUID for maintaining reference consistency during serialization | +| `handle` | `EntityHandle` | Lightweight handle, see [Entity Handle](/en/guide/entity/entity-handle/) | + +```typescript +const entity = scene.createEntity("Player"); + +console.log(entity.id); // 1 +console.log(entity.persistentId); // "a1b2c3d4-..." +console.log(entity.handle); // Numeric handle +``` + +## Entity Properties + +### Name and Tag + +```typescript +// Name - for debugging and lookup +entity.name = "Player"; + +// Tag - for fast categorization and querying +entity.tag = 1; // Player tag +enemy.tag = 2; // Enemy tag +``` + +### State Control + +```typescript +// Enable/disable state +entity.enabled = false; + +// Active state +entity.active = false; + +// Update order (lower values have higher priority) +entity.updateOrder = 10; +``` + +## Finding Entities + +The scene provides multiple ways to find entities: + +```typescript +// Find by name +const player = scene.findEntity("Player"); +// Or use alias +const player2 = scene.getEntityByName("Player"); + +// Find by ID +const entity = scene.findEntityById(123); + +// Find all entities by tag +const enemies = scene.findEntitiesByTag(2); +// Or use alias +const allEnemies = scene.getEntitiesByTag(2); + +// Find by handle +const entity = scene.findEntityByHandle(handle); +``` + +## Entity Events + +Entity changes trigger events: + +```typescript +// Listen for component additions +scene.eventSystem.on('component:added', (data) => { + console.log(`${data.entityName} added ${data.componentType}`); +}); + +// Listen for component removals +scene.eventSystem.on('component:removed', (data) => { + console.log(`${data.entityName} removed ${data.componentType}`); +}); + +// Listen for entity creation +scene.eventSystem.on('entity:created', (data) => { + console.log(`Entity created: ${data.entityName}`); +}); + +// Listen for active state changes +scene.eventSystem.on('entity:activeChanged', (data) => { + console.log(`${data.entity.name} active: ${data.active}`); +}); +``` + +## Debugging + +```typescript +// Get entity debug info +const debugInfo = entity.getDebugInfo(); +console.log(debugInfo); +// { +// name: "Player", +// id: 1, +// persistentId: "a1b2c3d4-...", +// enabled: true, +// active: true, +// destroyed: false, +// componentCount: 3, +// componentTypes: ["Position", "Health", "Velocity"], +// ... +// } + +// Entity string representation +console.log(entity.toString()); +// "Entity[Player:1:a1b2c3d4]" +``` + +## Next Steps + +- [Component Operations](/en/guide/entity/component-operations/) - Add, get, and remove components +- [Entity Handle](/en/guide/entity/entity-handle/) - Safe entity reference method +- [Lifecycle](/en/guide/entity/lifecycle/) - Destruction and persistence diff --git a/docs/src/content/docs/en/guide/entity/lifecycle.md b/docs/src/content/docs/en/guide/entity/lifecycle.md new file mode 100644 index 00000000..cc376fc7 --- /dev/null +++ b/docs/src/content/docs/en/guide/entity/lifecycle.md @@ -0,0 +1,238 @@ +--- +title: "Lifecycle" +description: "Entity lifecycle management, destruction, and persistence" +--- + +Entity lifecycle includes three phases: creation, runtime, and destruction. This section covers how to properly manage entity lifecycles. + +## Destroying Entities + +### Basic Destruction + +```typescript +// Destroy entity +player.destroy(); + +// Check if entity is destroyed +if (player.isDestroyed) { + console.log("Entity has been destroyed"); +} +``` + +When destroying an entity: +1. All components are removed (triggering `onRemovedFromEntity` callbacks) +2. Entity is removed from query systems +3. Entity is removed from scene entity list +4. All reference tracking is cleaned up + +### Conditional Destruction + +```typescript +// Common pattern: Destroy when health depleted +const health = enemy.getComponent(Health); +if (health && health.current <= 0) { + enemy.destroy(); +} +``` + +### Destruction Safety + +Destruction is idempotent—multiple calls won't cause errors: + +```typescript +player.destroy(); +player.destroy(); // Safe, no error +``` + +## Persistent Entities + +By default, entities are destroyed during scene transitions. Persistence allows entities to survive across scenes. + +### Setting Persistence + +```typescript +// Method 1: Chain call +const player = scene.createEntity('Player') + .setPersistent() + .createComponent(PlayerComponent); + +// Method 2: Separate call +player.setPersistent(); + +// Check persistence +if (player.isPersistent) { + console.log("This is a persistent entity"); +} +``` + +### Removing Persistence + +```typescript +// Restore to scene-local entity +player.setSceneLocal(); +``` + +### Lifecycle Policies + +Entities have two lifecycle policies: + +| Policy | Description | +|--------|-------------| +| `SceneLocal` | Default, destroyed with scene | +| `Persistent` | Survives scene transitions | + +```typescript +import { EEntityLifecyclePolicy } from '@esengine/ecs-framework'; + +// Get current policy +const policy = entity.lifecyclePolicy; + +if (policy === EEntityLifecyclePolicy.Persistent) { + // Persistent entity +} +``` + +### Use Cases + +Persistent entities are suitable for: +- Player characters +- Global managers +- UI entities +- Game state that needs to survive scene transitions + +```typescript +// Player character +const player = scene.createEntity('Player') + .setPersistent(); + +// Game manager +const gameManager = scene.createEntity('GameManager') + .setPersistent() + .createComponent(GameStateComponent); + +// Score manager +const scoreManager = scene.createEntity('ScoreManager') + .setPersistent() + .createComponent(ScoreComponent); +``` + +## Scene Transition Behavior + +```typescript +// Scene manager switches scenes +sceneManager.loadScene('Level2'); + +// During transition: +// 1. SceneLocal entities are destroyed +// 2. Persistent entities migrate to new scene +// 3. New scene entities are created +``` + +:::caution[Note] +Persistent entities automatically migrate to the new scene during transitions, but other non-persistent entities they reference may be destroyed. Use [EntityHandle](/en/guide/entity/entity-handle/) to safely handle this situation. +::: + +## Reference Cleanup + +The framework provides reference tracking that automatically cleans up references when entities are destroyed: + +```typescript +// Reference tracker cleans up all references to this entity on destruction +scene.referenceTracker?.clearReferencesTo(entity.id); +``` + +Using the `@entityRef` decorator handles this automatically: + +```typescript +class FollowComponent extends Component { + @entityRef() + targetId: number | null = null; +} + +// When target is destroyed, targetId is automatically set to null +``` + +See [Component References](/en/guide/component/entity-ref/) for details. + +## Best Practices + +### 1. Destroy Unneeded Entities Promptly + +```typescript +// Destroy bullets that fly off screen +if (position.x < 0 || position.x > screenWidth) { + bullet.destroy(); +} +``` + +### 2. Use Object Pools Instead of Frequent Create/Destroy + +```typescript +class BulletPool { + private pool: Entity[] = []; + + acquire(scene: Scene): Entity { + if (this.pool.length > 0) { + const bullet = this.pool.pop()!; + bullet.enabled = true; + return bullet; + } + return scene.createEntity('Bullet'); + } + + release(bullet: Entity) { + bullet.enabled = false; + this.pool.push(bullet); + } +} +``` + +### 3. Use Persistence Sparingly + +Only use persistence for entities that truly need to survive scene transitions—too many persistent entities increase memory usage. + +### 4. Clean Up References Before Destruction + +```typescript +// Notify related systems before destruction +const aiSystem = scene.getSystem(AISystem); +aiSystem?.clearTarget(enemy.id); + +enemy.destroy(); +``` + +## Lifecycle Events + +You can listen to entity destruction events: + +```typescript +// Method 1: Through event system +scene.eventSystem.on('entity:destroyed', (data) => { + console.log(`Entity ${data.entityName} destroyed`); +}); + +// Method 2: In component +class MyComponent extends Component { + onRemovedFromEntity() { + console.log('Component removed, entity may be destroying'); + // Clean up resources + } +} +``` + +## Debugging + +```typescript +// Get entity status +const debugInfo = entity.getDebugInfo(); +console.log({ + destroyed: debugInfo.destroyed, + enabled: debugInfo.enabled, + active: debugInfo.active +}); +``` + +## Next Steps + +- [Component Operations](/en/guide/entity/component-operations/) - Adding and removing components +- [Scene Management](/en/guide/scene/) - Scene switching and management diff --git a/docs/src/content/docs/en/modules/network/api.md b/docs/src/content/docs/en/modules/network/api.md new file mode 100644 index 00000000..628aa266 --- /dev/null +++ b/docs/src/content/docs/en/modules/network/api.md @@ -0,0 +1,111 @@ +--- +title: "API Reference" +description: "Complete Network module API documentation" +--- + +## NetworkPlugin + +```typescript +class NetworkPlugin implements IPlugin { + readonly name: string; + readonly version: string; + + get networkService(): NetworkService; + get syncSystem(): NetworkSyncSystem; + get spawnSystem(): NetworkSpawnSystem; + get inputSystem(): NetworkInputSystem; + get isConnected(): boolean; + + connect(serverUrl: string, playerName: string, roomId?: string): Promise; + disconnect(): Promise; + registerPrefab(prefabType: string, factory: PrefabFactory): void; + sendMoveInput(x: number, y: number): void; + sendActionInput(action: string): void; +} +``` + +## NetworkService + +```typescript +class NetworkService { + get state(): ENetworkState; + get isConnected(): boolean; + get clientId(): number; + get roomId(): string; + + connect(serverUrl: string, playerName: string, roomId?: string): Promise; + disconnect(): Promise; + sendInput(input: IPlayerInput): void; + setCallbacks(callbacks: INetworkCallbacks): void; +} +``` + +## Enums + +```typescript +const enum ENetworkState { + Disconnected = 0, + Connecting = 1, + Connected = 2 +} +``` + +## Interfaces + +```typescript +interface INetworkCallbacks { + onConnected?: (clientId: number, roomId: string) => void; + onDisconnected?: () => void; + onSync?: (msg: MsgSync) => void; + onSpawn?: (msg: MsgSpawn) => void; + onDespawn?: (msg: MsgDespawn) => void; + onError?: (error: Error) => void; +} + +type PrefabFactory = (scene: Scene, spawn: MsgSpawn) => Entity; +``` + +## Components + +```typescript +class NetworkIdentity extends Component { + netId: number; + ownerId: number; + bIsLocalPlayer: boolean; + bHasAuthority: boolean; +} + +class NetworkTransform extends Component { + position: { x: number; y: number }; + rotation: number; + velocity: { x: number; y: number }; +} +``` + +## Service Tokens + +```typescript +import { + NetworkServiceToken, + NetworkSyncSystemToken, + NetworkSpawnSystemToken, + NetworkInputSystemToken +} from '@esengine/network'; +``` + +## Server API + +```typescript +class GameServer { + start(): Promise; + stop(): Promise; + getOrCreateRoom(roomId: string): Room; +} + +class Room { + readonly id: string; + readonly playerCount: number; + addPlayer(name: string, connection: Connection): IPlayer | null; + removePlayer(clientId: number): void; +} +``` diff --git a/docs/src/content/docs/en/modules/network/client.md b/docs/src/content/docs/en/modules/network/client.md new file mode 100644 index 00000000..7d6d1320 --- /dev/null +++ b/docs/src/content/docs/en/modules/network/client.md @@ -0,0 +1,141 @@ +--- +title: "Client Usage" +description: "NetworkPlugin, components and systems client-side guide" +--- + +## NetworkPlugin + +NetworkPlugin is the core entry point for client-side networking. + +### Basic Usage + +```typescript +import { Core } from '@esengine/ecs-framework'; +import { NetworkPlugin } from '@esengine/network'; + +// Create and install plugin +const networkPlugin = new NetworkPlugin(); +await Core.installPlugin(networkPlugin); + +// Connect to server +const success = await networkPlugin.connect('ws://localhost:3000', 'PlayerName'); + +// Disconnect +await networkPlugin.disconnect(); +``` + +### Properties and Methods + +```typescript +class NetworkPlugin { + readonly name: string; + readonly version: string; + + // Accessors + get networkService(): NetworkService; + get syncSystem(): NetworkSyncSystem; + get spawnSystem(): NetworkSpawnSystem; + get inputSystem(): NetworkInputSystem; + get isConnected(): boolean; + + // Connect to server + connect(serverUrl: string, playerName: string, roomId?: string): Promise; + + // Disconnect + disconnect(): Promise; + + // Register prefab factory + registerPrefab(prefabType: string, factory: PrefabFactory): void; + + // Send input + sendMoveInput(x: number, y: number): void; + sendActionInput(action: string): void; +} +``` + +## Components + +### NetworkIdentity + +Network identity component, required for every networked entity: + +```typescript +class NetworkIdentity extends Component { + netId: number; // Network unique ID + ownerId: number; // Owner client ID + bIsLocalPlayer: boolean; // Whether local player + bHasAuthority: boolean; // Whether has control authority +} +``` + +### NetworkTransform + +Network transform component for position and rotation sync: + +```typescript +class NetworkTransform extends Component { + position: { x: number; y: number }; + rotation: number; + velocity: { x: number; y: number }; +} +``` + +## Systems + +### NetworkSyncSystem + +Handles server state synchronization and interpolation. + +### NetworkSpawnSystem + +Handles network entity spawning and despawning. + +### NetworkInputSystem + +Handles local player input sending: + +```typescript +// Via NetworkPlugin (recommended) +networkPlugin.sendMoveInput(0, 1); +networkPlugin.sendActionInput('jump'); + +// Or use inputSystem directly +networkPlugin.inputSystem.addMoveInput(0, 1); +``` + +## Prefab Factory + +```typescript +networkPlugin.registerPrefab('player', (scene, spawn) => { + const entity = scene.createEntity(`player_${spawn.netId}`); + + const identity = entity.addComponent(new NetworkIdentity()); + identity.netId = spawn.netId; + identity.ownerId = spawn.ownerId; + identity.bIsLocalPlayer = spawn.ownerId === networkPlugin.networkService.clientId; + + entity.addComponent(new NetworkTransform()); + + if (identity.bIsLocalPlayer) { + entity.addComponent(new LocalInputComponent()); + } + + return entity; +}); +``` + +## Connection State Monitoring + +```typescript +networkPlugin.networkService.setCallbacks({ + onConnected: (clientId, roomId) => { + console.log(`Connected: client ${clientId}, room ${roomId}`); + }, + onDisconnected: () => { + console.log('Disconnected'); + }, + onError: (error) => { + console.error('Network error:', error); + } +}); +``` diff --git a/docs/src/content/docs/en/modules/network/index.md b/docs/src/content/docs/en/modules/network/index.md index 5d1df15e..c2490875 100644 --- a/docs/src/content/docs/en/modules/network/index.md +++ b/docs/src/content/docs/en/modules/network/index.md @@ -1,5 +1,6 @@ --- title: "Network System" +description: "TSRPC-based multiplayer game network synchronization solution" --- `@esengine/network` provides a TSRPC-based client-server network synchronization solution for multiplayer games, including entity synchronization, input handling, and state interpolation. @@ -24,49 +25,17 @@ npm install @esengine/network npm install @esengine/network-server ``` -## Quick Setup with CLI - -We recommend using ESEngine CLI to quickly create a complete game server project: - -```bash -# Create project directory -mkdir my-game-server && cd my-game-server -npm init -y - -# Initialize Node.js server with CLI -npx @esengine/cli init -p nodejs -``` - -The CLI will generate the following project structure: +## Architecture ``` -my-game-server/ -├── src/ -│ ├── index.ts # Entry point -│ ├── server/ -│ │ └── GameServer.ts # Network server configuration -│ └── game/ -│ ├── Game.ts # ECS game class -│ ├── scenes/ -│ │ └── MainScene.ts # Main scene -│ ├── components/ # ECS components -│ │ ├── PositionComponent.ts -│ │ └── VelocityComponent.ts -│ └── systems/ # ECS systems -│ └── MovementSystem.ts -├── tsconfig.json -├── package.json -└── README.md -``` - -Start the server: - -```bash -# Development mode (hot reload) -npm run dev - -# Production mode -npm run start +Client Server +┌────────────────┐ ┌────────────────┐ +│ NetworkPlugin │◄──── WS ────► │ GameServer │ +│ ├─ Service │ │ ├─ Room │ +│ ├─ SyncSystem │ │ └─ Players │ +│ ├─ SpawnSystem │ └────────────────┘ +│ └─ InputSystem │ +└────────────────┘ ``` ## Quick Start @@ -75,21 +44,16 @@ npm run start ```typescript import { Core, Scene } from '@esengine/ecs-framework'; -import { - NetworkPlugin, - NetworkIdentity, - NetworkTransform -} from '@esengine/network'; +import { NetworkPlugin, NetworkIdentity, NetworkTransform } from '@esengine/network'; // Define game scene class GameScene extends Scene { initialize(): void { this.name = 'Game'; - // Network systems are automatically added by NetworkPlugin } } -// Initialize Core +// Initialize Core.create({ debug: false }); const scene = new GameScene(); Core.setScene(scene); @@ -105,7 +69,7 @@ networkPlugin.registerPrefab('player', (scene, spawn) => { const identity = entity.addComponent(new NetworkIdentity()); identity.netId = spawn.netId; identity.ownerId = spawn.ownerId; - identity.isLocalPlayer = spawn.ownerId === networkPlugin.networkService.localClientId; + identity.bIsLocalPlayer = spawn.ownerId === networkPlugin.networkService.clientId; entity.addComponent(new NetworkTransform()); return entity; @@ -116,20 +80,10 @@ const success = await networkPlugin.connect('ws://localhost:3000', 'PlayerName') if (success) { console.log('Connected!'); } - -// Game loop -function gameLoop(dt: number) { - Core.update(dt); -} - -// Disconnect -await networkPlugin.disconnect(); ``` ### Server -After creating a server project with CLI, the generated code already configures GameServer: - ```typescript import { GameServer } from '@esengine/network-server'; @@ -145,436 +99,39 @@ await server.start(); console.log('Server started on ws://localhost:3000'); ``` -## Core Concepts +## Quick Setup with CLI -### Architecture +We recommend using ESEngine CLI to quickly create a complete game server project: -``` -Client Server -┌────────────────┐ ┌────────────────┐ -│ NetworkPlugin │◄──── WS ────► │ GameServer │ -│ ├─ Service │ │ ├─ Room │ -│ ├─ SyncSystem │ │ └─ Players │ -│ ├─ SpawnSystem │ └────────────────┘ -│ └─ InputSystem │ -└────────────────┘ +```bash +mkdir my-game-server && cd my-game-server +npm init -y +npx @esengine/cli init -p nodejs ``` -### Components +Generated project structure: -#### NetworkIdentity - -Network identity component, required for every networked entity: - -```typescript -class NetworkIdentity extends Component { - netId: number; // Network unique ID - ownerId: number; // Owner client ID - bIsLocalPlayer: boolean; // Whether local player - bHasAuthority: boolean; // Whether has control authority -} +``` +my-game-server/ +├── src/ +│ ├── index.ts +│ ├── server/ +│ │ └── GameServer.ts +│ └── game/ +│ ├── Game.ts +│ ├── scenes/ +│ ├── components/ +│ └── systems/ +├── tsconfig.json +└── package.json ``` -#### NetworkTransform +## Documentation -Network transform component for position and rotation sync: - -```typescript -class NetworkTransform extends Component { - position: { x: number; y: number }; - rotation: number; - velocity: { x: number; y: number }; -} -``` - -### Systems - -#### NetworkSyncSystem - -Handles server state synchronization and interpolation: - -- Receives server state snapshots -- Stores states in snapshot buffer -- Performs interpolation for remote entities - -#### NetworkSpawnSystem - -Handles network entity spawning and despawning: - -- Listens for Spawn/Despawn messages -- Creates entities using registered prefab factories -- Manages networked entity lifecycle - -#### NetworkInputSystem - -Handles local player input sending: - -- Collects local player input -- Sends input to server -- Supports movement and action inputs - -## API Reference - -### NetworkPlugin - -```typescript -class NetworkPlugin { - constructor(config: INetworkPluginConfig); - - // Install plugin - install(services: ServiceContainer): void; - - // Connect to server - connect(playerName: string, roomId?: string): Promise; - - // Disconnect - disconnect(): void; - - // Register prefab factory - registerPrefab(prefab: string, factory: PrefabFactory): void; - - // Properties - readonly localPlayerId: number | null; - readonly isConnected: boolean; -} -``` - -**Configuration:** - -| Property | Type | Required | Description | -|----------|------|----------|-------------| -| `serverUrl` | `string` | Yes | WebSocket server URL | - -### NetworkService - -Network service managing WebSocket connections: - -```typescript -class NetworkService { - // Connection state - readonly state: ENetworkState; - readonly isConnected: boolean; - readonly clientId: number | null; - readonly roomId: string | null; - - // Connection control - connect(serverUrl: string): Promise; - disconnect(): void; - - // Join room - join(playerName: string, roomId?: string): Promise; - - // Send input - sendInput(input: IPlayerInput): void; - - // Event callbacks - setCallbacks(callbacks: Partial): void; -} -``` - -**Network state enum:** - -```typescript -enum ENetworkState { - Disconnected = 'disconnected', - Connecting = 'connecting', - Connected = 'connected', - Joining = 'joining', - Joined = 'joined' -} -``` - -**Callbacks interface:** - -```typescript -interface INetworkCallbacks { - onConnected?: () => void; - onDisconnected?: () => void; - onJoined?: (clientId: number, roomId: string) => void; - onSync?: (msg: MsgSync) => void; - onSpawn?: (msg: MsgSpawn) => void; - onDespawn?: (msg: MsgDespawn) => void; -} -``` - -### Prefab Factory - -```typescript -type PrefabFactory = (scene: Scene, spawn: MsgSpawn) => Entity; -``` - -Register prefab factories for network entity creation: - -```typescript -networkPlugin.registerPrefab('enemy', (scene, spawn) => { - const entity = scene.createEntity(`enemy_${spawn.netId}`); - - const identity = entity.addComponent(new NetworkIdentity()); - identity.netId = spawn.netId; - identity.ownerId = spawn.ownerId; - - entity.addComponent(new NetworkTransform()); - entity.addComponent(new EnemyComponent()); - return entity; -}); -``` - -### Input System - -#### NetworkInputSystem - -```typescript -class NetworkInputSystem extends EntitySystem { - // Add movement input - addMoveInput(x: number, y: number): void; - - // Add action input - addActionInput(action: string): void; - - // Clear input - clearInput(): void; -} -``` - -Usage example: - -```typescript -// Send input via NetworkPlugin (recommended) -networkPlugin.sendMoveInput(0, 1); // Movement -networkPlugin.sendActionInput('jump'); // Action - -// Or use inputSystem directly -const inputSystem = networkPlugin.inputSystem; -if (keyboard.isPressed('W')) { - inputSystem.addMoveInput(0, 1); -} -if (keyboard.isPressed('Space')) { - inputSystem.addActionInput('jump'); -} -``` - -## State Synchronization - -### Snapshot Buffer - -Stores server state snapshots for interpolation: - -```typescript -import { createSnapshotBuffer, type IStateSnapshot } from '@esengine/network'; - -const buffer = createSnapshotBuffer({ - maxSnapshots: 30, // Max snapshots - interpolationDelay: 100 // Interpolation delay (ms) -}); - -// Add snapshot -buffer.addSnapshot({ - time: serverTime, - entities: states -}); - -// Get interpolated state -const interpolated = buffer.getInterpolatedState(clientTime); -``` - -### Transform Interpolators - -#### Linear Interpolator - -```typescript -import { createTransformInterpolator } from '@esengine/network'; - -const interpolator = createTransformInterpolator(); - -// Add state -interpolator.addState(time, { x: 0, y: 0, rotation: 0 }); - -// Get interpolated result -const state = interpolator.getInterpolatedState(currentTime); -``` - -#### Hermite Interpolator - -Uses Hermite splines for smoother interpolation: - -```typescript -import { createHermiteTransformInterpolator } from '@esengine/network'; - -const interpolator = createHermiteTransformInterpolator({ - bufferSize: 10 -}); - -// Add state with velocity -interpolator.addState(time, { - x: 100, - y: 200, - rotation: 0, - vx: 5, - vy: 0 -}); - -// Get smooth interpolated result -const state = interpolator.getInterpolatedState(currentTime); -``` - -### Client Prediction - -Implement client-side prediction with server reconciliation: - -```typescript -import { createClientPrediction } from '@esengine/network'; - -const prediction = createClientPrediction({ - maxPredictedInputs: 60, - reconciliationThreshold: 0.1 -}); - -// Predict input -const seq = prediction.predict(inputState, currentState, (state, input) => { - // Apply input to state - return applyInput(state, input); -}); - -// Server reconciliation -const corrected = prediction.reconcile( - serverState, - serverSeq, - (state, input) => applyInput(state, input) -); -``` - -## Server Side - -### GameServer - -```typescript -import { GameServer } from '@esengine/network-server'; - -const server = new GameServer({ - port: 3000, - roomConfig: { - maxPlayers: 16, // Max players per room - tickRate: 20 // Sync rate (Hz) - } -}); - -// Start server -await server.start(); - -// Get room -const room = server.getOrCreateRoom('room-id'); - -// Stop server -await server.stop(); -``` - -### Room - -```typescript -class Room { - readonly id: string; - readonly playerCount: number; - readonly isFull: boolean; - - // Add player - addPlayer(name: string, connection: Connection): IPlayer | null; - - // Remove player - removePlayer(clientId: number): void; - - // Get player - getPlayer(clientId: number): IPlayer | undefined; - - // Handle input - handleInput(clientId: number, input: IPlayerInput): void; - - // Destroy room - destroy(): void; -} -``` - -**Player interface:** - -```typescript -interface IPlayer { - clientId: number; // Client ID - name: string; // Player name - connection: Connection; // Connection object - netId: number; // Network entity ID -} -``` - -## Protocol Types - -### Message Types - -```typescript -// State sync message -interface MsgSync { - time: number; - entities: IEntityState[]; -} - -// Entity state -interface IEntityState { - netId: number; - pos?: Vec2; - rot?: number; -} - -// Spawn message -interface MsgSpawn { - netId: number; - ownerId: number; - prefab: string; - pos: Vec2; - rot: number; -} - -// Despawn message -interface MsgDespawn { - netId: number; -} - -// Input message -interface MsgInput { - input: IPlayerInput; -} - -// Player input -interface IPlayerInput { - seq?: number; - moveDir?: Vec2; - actions?: string[]; -} -``` - -### API Types - -```typescript -// Join request -interface ReqJoin { - playerName: string; - roomId?: string; -} - -// Join response -interface ResJoin { - clientId: number; - roomId: string; - playerCount: number; -} -``` - -## Blueprint Nodes - -The network module provides blueprint nodes for visual scripting: - -- `IsLocalPlayer` - Check if entity is local player -- `IsServer` - Check if running on server -- `HasAuthority` - Check if has authority over entity -- `GetNetworkId` - Get entity's network ID -- `GetLocalPlayerId` - Get local player ID +- [Client Usage](/en/modules/network/client/) - NetworkPlugin, components and systems +- [Server Side](/en/modules/network/server/) - GameServer and Room management +- [State Sync](/en/modules/network/sync/) - Interpolation, prediction and snapshots +- [API Reference](/en/modules/network/api/) - Complete API documentation ## Service Tokens @@ -588,142 +145,15 @@ import { NetworkInputSystemToken } from '@esengine/network'; -// Get service const networkService = services.get(NetworkServiceToken); ``` -## Practical Example +## Blueprint Nodes -### Complete Multiplayer Client +The network module provides visual scripting support: -```typescript -import { Core, Scene, EntitySystem, Matcher, Entity } from '@esengine/ecs-framework'; -import { - NetworkPlugin, - NetworkIdentity, - NetworkTransform -} from '@esengine/network'; - -// Define game scene -class GameScene extends Scene { - initialize(): void { - this.name = 'MultiplayerGame'; - // Network systems are automatically added by NetworkPlugin - // Add custom systems - this.addSystem(new LocalInputHandler()); - } -} - -// Initialize -async function initGame() { - Core.create({ debug: false }); - - const scene = new GameScene(); - Core.setScene(scene); - - // Install network plugin - const networkPlugin = new NetworkPlugin(); - await Core.installPlugin(networkPlugin); - - // Register player prefab - networkPlugin.registerPrefab('player', (scene, spawn) => { - const entity = scene.createEntity(`player_${spawn.netId}`); - - const identity = entity.addComponent(new NetworkIdentity()); - identity.netId = spawn.netId; - identity.ownerId = spawn.ownerId; - identity.isLocalPlayer = spawn.ownerId === networkPlugin.networkService.localClientId; - - entity.addComponent(new NetworkTransform()); - - // If local player, add input marker - if (identity.isLocalPlayer) { - entity.addComponent(new LocalInputComponent()); - } - - return entity; - }); - - // Connect to server - const success = await networkPlugin.connect('ws://localhost:3000', 'Player1'); - if (success) { - console.log('Connected!'); - } else { - console.error('Connection failed'); - } - - return networkPlugin; -} - -// Game loop -function gameLoop(deltaTime: number) { - Core.update(deltaTime); -} - -initGame(); -``` - -### Handling Input - -```typescript -class LocalInputHandler extends EntitySystem { - private _networkPlugin: NetworkPlugin | null = null; - - constructor() { - super(Matcher.empty().all(NetworkIdentity, LocalInputComponent)); - } - - protected onAddedToScene(): void { - // Get NetworkPlugin reference - this._networkPlugin = Core.getPlugin(NetworkPlugin); - } - - protected processEntity(entity: Entity, dt: number): void { - if (!this._networkPlugin) return; - - const identity = entity.getComponent(NetworkIdentity)!; - if (!identity.isLocalPlayer) return; - - // Read keyboard input - let moveX = 0; - let moveY = 0; - - if (keyboard.isPressed('A')) moveX -= 1; - if (keyboard.isPressed('D')) moveX += 1; - if (keyboard.isPressed('W')) moveY += 1; - if (keyboard.isPressed('S')) moveY -= 1; - - if (moveX !== 0 || moveY !== 0) { - this._networkPlugin.sendMoveInput(moveX, moveY); - } - - if (keyboard.isJustPressed('Space')) { - this._networkPlugin.sendActionInput('jump'); - } - } -} -``` - -## Best Practices - -1. **Set appropriate sync rate**: Choose `tickRate` based on game type, action games typically need 20-60 Hz - -2. **Use interpolation delay**: Set appropriate `interpolationDelay` to balance latency and smoothness - -3. **Client prediction**: Use client-side prediction for local players to reduce input lag - -4. **Prefab management**: Register prefab factories for each networked entity type - -5. **Authority checks**: Use `bHasAuthority` to check entity control permissions - -6. **Connection state**: Monitor connection state changes, handle reconnection - -```typescript -networkService.setCallbacks({ - onConnected: () => console.log('Connected'), - onDisconnected: () => { - console.log('Disconnected'); - // Handle reconnection logic - } -}); -``` +- `IsLocalPlayer` - Check if entity is local player +- `IsServer` - Check if running on server +- `HasAuthority` - Check if has authority over entity +- `GetNetworkId` - Get entity's network ID +- `GetLocalPlayerId` - Get local player ID diff --git a/docs/src/content/docs/en/modules/network/server.md b/docs/src/content/docs/en/modules/network/server.md new file mode 100644 index 00000000..1d4defe3 --- /dev/null +++ b/docs/src/content/docs/en/modules/network/server.md @@ -0,0 +1,76 @@ +--- +title: "Server Side" +description: "GameServer and Room management" +--- + +## GameServer + +GameServer is the core server-side class managing WebSocket connections and rooms. + +### Basic Usage + +```typescript +import { GameServer } from '@esengine/network-server'; + +const server = new GameServer({ + port: 3000, + roomConfig: { + maxPlayers: 16, + tickRate: 20 + } +}); + +await server.start(); +await server.stop(); +``` + +### Configuration + +| Property | Type | Description | +|----------|------|-------------| +| `port` | `number` | WebSocket port | +| `roomConfig.maxPlayers` | `number` | Max players per room | +| `roomConfig.tickRate` | `number` | Sync rate (Hz) | + +## Room + +```typescript +class Room { + readonly id: string; + readonly playerCount: number; + readonly isFull: boolean; + + addPlayer(name: string, connection: Connection): IPlayer | null; + removePlayer(clientId: number): void; + getPlayer(clientId: number): IPlayer | undefined; + handleInput(clientId: number, input: IPlayerInput): void; + destroy(): void; +} +``` + +## Protocol Types + +```typescript +interface MsgSync { + time: number; + entities: IEntityState[]; +} + +interface MsgSpawn { + netId: number; + ownerId: number; + prefab: string; + pos: Vec2; + rot: number; +} + +interface MsgDespawn { + netId: number; +} +``` + +## Best Practices + +1. **Set appropriate tick rate**: Choose based on game type (20-60 Hz for action games) +2. **Room size control**: Set reasonable `maxPlayers` based on server capacity +3. **State validation**: Server should validate client inputs to prevent cheating diff --git a/docs/src/content/docs/en/modules/network/sync.md b/docs/src/content/docs/en/modules/network/sync.md new file mode 100644 index 00000000..0837128f --- /dev/null +++ b/docs/src/content/docs/en/modules/network/sync.md @@ -0,0 +1,69 @@ +--- +title: "State Sync" +description: "Interpolation, prediction and snapshot buffers" +--- + +## Snapshot Buffer + +Stores server state snapshots for interpolation: + +```typescript +import { createSnapshotBuffer } from '@esengine/network'; + +const buffer = createSnapshotBuffer({ + maxSnapshots: 30, + interpolationDelay: 100 +}); + +buffer.addSnapshot({ time: serverTime, entities: states }); +const interpolated = buffer.getInterpolatedState(clientTime); +``` + +## Transform Interpolators + +### Linear Interpolator + +```typescript +import { createTransformInterpolator } from '@esengine/network'; + +const interpolator = createTransformInterpolator(); +interpolator.addState(time, { x: 0, y: 0, rotation: 0 }); +const state = interpolator.getInterpolatedState(currentTime); +``` + +### Hermite Interpolator + +Smoother interpolation using Hermite splines: + +```typescript +import { createHermiteTransformInterpolator } from '@esengine/network'; + +const interpolator = createHermiteTransformInterpolator({ bufferSize: 10 }); +interpolator.addState(time, { x: 100, y: 200, rotation: 0, vx: 5, vy: 0 }); +const state = interpolator.getInterpolatedState(currentTime); +``` + +## Client Prediction + +Reduces input lag with client-side prediction and server reconciliation: + +```typescript +import { createClientPrediction } from '@esengine/network'; + +const prediction = createClientPrediction({ + maxPredictedInputs: 60, + reconciliationThreshold: 0.1 +}); + +// Predict +const seq = prediction.predict(input, state, applyInput); + +// Reconcile with server +const corrected = prediction.reconcile(serverState, serverSeq, applyInput); +``` + +## Best Practices + +1. **Interpolation delay**: 100-150ms for typical networks +2. **Prediction**: Use only for local player, interpolate remote players +3. **Snapshot count**: Keep enough snapshots to handle network jitter diff --git a/docs/src/content/docs/guide/entity.md b/docs/src/content/docs/guide/entity.md deleted file mode 100644 index 0113d8dd..00000000 --- a/docs/src/content/docs/guide/entity.md +++ /dev/null @@ -1,448 +0,0 @@ ---- -title: "实体类" ---- - -在 ECS 架构中,实体(Entity)是游戏世界中的基本对象。实体本身不包含游戏逻辑或数据,它只是一个容器,用来组合不同的组件来实现各种功能。 - -## 基本概念 - -实体是一个轻量级的对象,主要用于: -- 作为组件的容器 -- 提供唯一标识(ID) -- 管理组件的生命周期 - -::: tip 关于父子层级关系 -实体间的父子层级关系通过 `HierarchyComponent` 和 `HierarchySystem` 管理,而非 Entity 内置属性。这种设计遵循 ECS 组合原则 —— 只有需要层级关系的实体才添加此组件。 - -详见 [层级系统](./hierarchy/) 文档。 -::: - -## 创建实体 - -**重要提示:实体必须通过场景创建,不支持手动创建!** - -实体必须通过场景的 `createEntity()` 方法来创建,这样才能确保: -- 实体被正确添加到场景的实体管理系统中 -- 实体被添加到查询系统中,供系统使用 -- 实体获得正确的场景引用 -- 触发相关的生命周期事件 - -```typescript -// 正确的方式:通过场景创建实体 -const player = scene.createEntity("Player"); - -// ❌ 错误的方式:手动创建实体 -// const entity = new Entity("MyEntity", 1); // 这样创建的实体系统无法管理 -``` - -## 添加组件 - -实体通过添加组件来获得功能: - -```typescript -import { Component, ECSComponent } from '@esengine/ecs-framework'; - -// 定义位置组件 -@ECSComponent('Position') -class Position extends Component { - x: number = 0; - y: number = 0; - - constructor(x: number = 0, y: number = 0) { - super(); - this.x = x; - this.y = y; - } -} - -// 定义健康组件 -@ECSComponent('Health') -class Health extends Component { - current: number = 100; - max: number = 100; - - constructor(max: number = 100) { - super(); - this.max = max; - this.current = max; - } -} - -// 给实体添加组件 -const player = scene.createEntity("Player"); -player.addComponent(new Position(100, 200)); -player.addComponent(new Health(150)); -``` - -## 获取组件 - -```typescript -// 获取组件(传入组件类,不是实例) -const position = player.getComponent(Position); // 返回 Position | null -const health = player.getComponent(Health); // 返回 Health | null - -// 检查组件是否存在 -if (position) { - console.log(`玩家位置: x=${position.x}, y=${position.y}`); -} - -// 检查是否有某个组件 -if (player.hasComponent(Position)) { - console.log("玩家有位置组件"); -} - -// 获取所有组件实例(只读属性) -const allComponents = player.components; // readonly Component[] - -// 获取指定类型的所有组件(支持同类型多组件) -const allHealthComponents = player.getComponents(Health); // Health[] - -// 获取或创建组件(如果不存在则自动创建) -const position = player.getOrCreateComponent(Position, 0, 0); // 传入构造参数 -const health = player.getOrCreateComponent(Health, 100); // 如果存在则返回现有的,不存在则创建新的 -``` - -## 移除组件 - -```typescript -// 方式1:通过组件类型移除 -const removedHealth = player.removeComponentByType(Health); -if (removedHealth) { - console.log("健康组件已被移除"); -} - -// 方式2:通过组件实例移除 -const healthComponent = player.getComponent(Health); -if (healthComponent) { - player.removeComponent(healthComponent); -} - -// 批量移除多种组件类型 -const removedComponents = player.removeComponentsByTypes([Position, Health]); - -// 检查组件是否被移除 -if (!player.hasComponent(Health)) { - console.log("健康组件已被移除"); -} -``` - -## 实体查找 - -场景提供了多种方式来查找实体: - -### 通过名称查找 - -```typescript -// 查找单个实体 -const player = scene.findEntity("Player"); -// 或使用别名方法 -const player2 = scene.getEntityByName("Player"); - -if (player) { - console.log("找到玩家实体"); -} -``` - -### 通过 ID 查找 - -```typescript -// 通过实体 ID 查找 -const entity = scene.findEntityById(123); -``` - -### 通过标签查找 - -实体支持标签系统,用于快速分类和查找: - -```typescript -// 设置标签 -player.tag = 1; // 玩家标签 -enemy.tag = 2; // 敌人标签 - -// 通过标签查找所有相关实体 -const players = scene.findEntitiesByTag(1); -const enemies = scene.findEntitiesByTag(2); -// 或使用别名方法 -const allPlayers = scene.getEntitiesByTag(1); -``` - - -## 实体生命周期 - -```typescript -// 销毁实体 -player.destroy(); - -// 检查实体是否已销毁 -if (player.isDestroyed) { - console.log("实体已被销毁"); -} -``` - -## 实体事件 - -实体的组件变化会触发事件: - -```typescript -// 监听组件添加事件 -scene.eventSystem.on('component:added', (data) => { - console.log('组件已添加:', data); -}); - -// 监听实体创建事件 -scene.eventSystem.on('entity:created', (data) => { - console.log('实体已创建:', data.entityName); -}); -``` - -## 性能优化 - - -### 批量创建实体 - -框架提供了高性能的批量创建方法: - -```typescript -// 批量创建 100 个子弹实体(高性能版本) -const bullets = scene.createEntities(100, "Bullet"); - -// 为每个子弹添加组件 -bullets.forEach((bullet, index) => { - bullet.addComponent(new Position(Math.random() * 800, Math.random() * 600)); - bullet.addComponent(new Velocity(Math.random() * 100 - 50, Math.random() * 100 - 50)); -}); -``` - -`createEntities()` 方法会: -- 批量分配实体 ID -- 批量添加到实体列表 -- 优化查询系统更新 -- 减少系统缓存清理次数 - -## 最佳实践 - -### 1. 合理的组件粒度 - -```typescript -// 好的做法:功能单一的组件 -@ECSComponent('Position') -class Position extends Component { - x: number = 0; - y: number = 0; -} - -@ECSComponent('Velocity') -class Velocity extends Component { - dx: number = 0; - dy: number = 0; -} - -// 避免:功能过于复杂的组件 -@ECSComponent('Player') -class Player extends Component { - // 避免在一个组件中包含太多不相关的属性 - x: number; - y: number; - health: number; - inventory: Item[]; - skills: Skill[]; -} -``` - -### 2. 使用装饰器 - -始终使用 `@ECSComponent` 装饰器: - -```typescript -@ECSComponent('Transform') -class Transform extends Component { - // 组件实现 -} -``` - -### 3. 合理命名 - -```typescript -// 清晰的实体命名 -const mainCharacter = scene.createEntity("MainCharacter"); -const enemy1 = scene.createEntity("Goblin_001"); -const collectible = scene.createEntity("HealthPotion"); -``` - -### 4. 及时清理 - -```typescript -// 不再需要的实体应该及时销毁 -if (enemy.getComponent(Health).current <= 0) { - enemy.destroy(); -} -``` - -## 调试实体 - -框架提供了调试功能来帮助开发: - -```typescript -// 获取实体调试信息 -const debugInfo = entity.getDebugInfo(); -console.log('实体信息:', debugInfo); - -// 列出实体的所有组件 -entity.components.forEach(component => { - console.log('组件:', component.constructor.name); -}); -``` - -实体是 ECS 架构的核心概念之一,理解如何正确使用实体将帮助你构建高效、可维护的游戏代码。 - -## 实体句柄 (EntityHandle) - -实体句柄是一种安全的实体引用方式,用于解决"引用已销毁实体"的问题。 - -### 问题场景 - -假设你的 AI 系统需要追踪一个目标敌人: - -```typescript -// 错误做法:直接存储实体引用 -class AISystem extends EntitySystem { - private targetEnemy: Entity | null = null; - - setTarget(enemy: Entity) { - this.targetEnemy = enemy; - } - - process() { - if (this.targetEnemy) { - // 危险!敌人可能已被销毁,但引用还在 - // 更糟糕:这个内存位置可能被新实体复用了 - const health = this.targetEnemy.getComponent(Health); - // 可能操作了错误的实体! - } - } -} -``` - -### 使用句柄的正确做法 - -每个实体创建时会自动分配一个句柄,通过 `entity.handle` 获取: - -```typescript -import { EntityHandle, NULL_HANDLE, isValidHandle } from '@esengine/ecs-framework'; - -class AISystem extends EntitySystem { - // 存储句柄而非实体引用 - private targetHandle: EntityHandle = NULL_HANDLE; - - setTarget(enemy: Entity) { - // 保存敌人的句柄 - this.targetHandle = enemy.handle; - } - - process() { - if (!isValidHandle(this.targetHandle)) { - return; // 没有目标 - } - - // 通过句柄获取实体(自动检测是否有效) - const enemy = this.scene.findEntityByHandle(this.targetHandle); - - if (!enemy) { - // 敌人已被销毁,清空引用 - this.targetHandle = NULL_HANDLE; - return; - } - - // 安全操作 - const health = enemy.getComponent(Health); - } -} -``` - -### 完整示例:技能目标锁定 - -```typescript -import { - EntitySystem, Entity, EntityHandle, NULL_HANDLE, isValidHandle -} from '@esengine/ecs-framework'; - -@ECSSystem('SkillTargeting') -class SkillTargetingSystem extends EntitySystem { - // 存储多个目标的句柄 - private lockedTargets: Map = new Map(); - - // 锁定目标 - lockTarget(caster: Entity, target: Entity) { - this.lockedTargets.set(caster, target.handle); - } - - // 获取锁定的目标 - getLockedTarget(caster: Entity): Entity | null { - const handle = this.lockedTargets.get(caster); - - if (!handle || !isValidHandle(handle)) { - return null; - } - - // findEntityByHandle 会检查句柄是否有效 - const target = this.scene.findEntityByHandle(handle); - - if (!target) { - // 目标已死亡,清除锁定 - this.lockedTargets.delete(caster); - } - - return target; - } - - // 释放技能 - castSkill(caster: Entity) { - const target = this.getLockedTarget(caster); - - if (!target) { - console.log('目标丢失,技能取消'); - return; - } - - // 安全地对目标造成伤害 - const health = target.getComponent(Health); - if (health) { - health.current -= 10; - } - } -} -``` - -### 句柄 vs 实体引用 - -| 场景 | 推荐方式 | -|-----|---------| -| 同一帧内临时使用 | 直接用 `Entity` 引用 | -| 跨帧存储(如 AI 目标、技能目标) | 使用 `EntityHandle` | -| 需要序列化保存 | 使用 `EntityHandle`(数字类型) | -| 网络同步 | 使用 `EntityHandle`(可直接传输) | - -### API 速查 - -```typescript -// 获取实体的句柄 -const handle = entity.handle; - -// 检查句柄是否非空 -if (isValidHandle(handle)) { ... } - -// 通过句柄获取实体(自动检测有效性) -const entity = scene.findEntityByHandle(handle); - -// 检查句柄对应的实体是否存活 -const alive = scene.handleManager.isAlive(handle); - -// 空句柄常量 -const emptyHandle = NULL_HANDLE; -``` - -## 下一步 - -- 了解 [层级系统](./hierarchy/) 建立实体间的父子关系 -- 了解 [组件系统](./component/) 为实体添加功能 -- 了解 [场景管理](./scene/) 组织和管理实体 \ No newline at end of file diff --git a/docs/src/content/docs/guide/entity/component-operations.md b/docs/src/content/docs/guide/entity/component-operations.md new file mode 100644 index 00000000..74f17a72 --- /dev/null +++ b/docs/src/content/docs/guide/entity/component-operations.md @@ -0,0 +1,273 @@ +--- +title: "组件操作" +description: "实体的组件添加、获取、移除等操作详解" +--- + +实体通过添加组件来获得功能。本节详细介绍所有组件操作 API。 + +## 添加组件 + +### addComponent + +添加已创建的组件实例: + +```typescript +import { Component, ECSComponent } from '@esengine/ecs-framework'; + +@ECSComponent('Position') +class Position extends Component { + x: number = 0; + y: number = 0; + + constructor(x: number = 0, y: number = 0) { + super(); + this.x = x; + this.y = y; + } +} + +const player = scene.createEntity("Player"); +const position = new Position(100, 200); +player.addComponent(position); +``` + +### createComponent + +直接传入组件类型和构造参数,由实体创建组件实例(推荐方式): + +```typescript +// 创建并添加组件 +const position = player.createComponent(Position, 100, 200); +const health = player.createComponent(Health, 150); + +// 等价于 +// const position = new Position(100, 200); +// player.addComponent(position); +``` + +### addComponents + +批量添加多个组件: + +```typescript +const components = player.addComponents([ + new Position(100, 200), + new Health(150), + new Velocity(0, 0) +]); +``` + +:::note[注意事项] +- 同一实体不能添加相同类型的组件两次,会抛出异常 +- 实体必须已添加到场景后才能添加组件 +::: + +## 获取组件 + +### getComponent + +获取指定类型的组件: + +```typescript +// 返回 Position | null +const position = player.getComponent(Position); + +if (position) { + position.x += 10; + position.y += 20; +} +``` + +### hasComponent + +检查实体是否拥有指定类型的组件: + +```typescript +if (player.hasComponent(Position)) { + const position = player.getComponent(Position)!; + // 使用 ! 因为我们已经确认存在 +} +``` + +### getComponents + +获取指定类型的所有组件(支持同类型多组件场景): + +```typescript +const allHealthComponents = player.getComponents(Health); +``` + +### getComponentByType + +支持继承查找的组件获取,使用 `instanceof` 检查: + +```typescript +// 查找 CompositeNodeComponent 或其任意子类 +const composite = entity.getComponentByType(CompositeNodeComponent); +if (composite) { + // composite 可能是 SequenceNode, SelectorNode 等 +} +``` + +与 `getComponent()` 的区别: + +| 方法 | 查找方式 | 性能 | 使用场景 | +|-----|---------|-----|---------| +| `getComponent` | 精确类型匹配(位掩码) | 高 | 知道确切类型 | +| `getComponentByType` | `instanceof` 检查 | 较低 | 需要支持继承 | + +### getOrCreateComponent + +获取或创建组件,如果不存在则自动创建: + +```typescript +// 确保实体拥有 Position 组件 +const position = player.getOrCreateComponent(Position, 0, 0); +position.x = 100; + +// 如果已存在,返回现有组件 +// 如果不存在,使用 (0, 0) 参数创建新组件 +``` + +### components 属性 + +获取实体的所有组件(只读): + +```typescript +const allComponents = player.components; // readonly Component[] + +allComponents.forEach(component => { + console.log(component.constructor.name); +}); +``` + +## 移除组件 + +### removeComponent + +通过组件实例移除: + +```typescript +const healthComponent = player.getComponent(Health); +if (healthComponent) { + player.removeComponent(healthComponent); +} +``` + +### removeComponentByType + +通过组件类型移除: + +```typescript +const removedHealth = player.removeComponentByType(Health); +if (removedHealth) { + console.log("健康组件已被移除"); +} +``` + +### removeComponentsByTypes + +批量移除多种组件类型: + +```typescript +const removedComponents = player.removeComponentsByTypes([ + Position, + Health, + Velocity +]); +``` + +### removeAllComponents + +移除所有组件: + +```typescript +player.removeAllComponents(); +``` + +## 变更检测 + +### markDirty + +标记组件为已修改,用于帧级变更检测系统: + +```typescript +const pos = entity.getComponent(Position)!; +pos.x = 100; +entity.markDirty(pos); + +// 或标记多个组件 +const vel = entity.getComponent(Velocity)!; +entity.markDirty(pos, vel); +``` + +配合响应式查询使用: + +```typescript +// 在系统中查询本帧修改过的组件 +const changedQuery = scene.createReactiveQuery({ + all: [Position], + changed: [Position] // 只匹配本帧修改过的 +}); + +for (const entity of changedQuery.getEntities()) { + // 处理位置变化的实体 +} +``` + +## 组件掩码 + +每个实体维护一个组件位掩码,用于高效的 `hasComponent` 检查: + +```typescript +// 获取组件掩码(内部使用) +const mask = entity.componentMask; +``` + +## 完整示例 + +```typescript +import { Component, ECSComponent, Scene } from '@esengine/ecs-framework'; + +@ECSComponent('Position') +class Position extends Component { + constructor(public x = 0, public y = 0) { super(); } +} + +@ECSComponent('Health') +class Health extends Component { + constructor(public current = 100, public max = 100) { super(); } +} + +// 创建实体并添加组件 +const player = scene.createEntity("Player"); +player.createComponent(Position, 100, 200); +player.createComponent(Health, 150, 150); + +// 获取并修改组件 +const position = player.getComponent(Position); +if (position) { + position.x += 10; + player.markDirty(position); +} + +// 获取或创建组件 +const velocity = player.getOrCreateComponent(Velocity, 0, 0); + +// 检查组件存在 +if (player.hasComponent(Health)) { + const health = player.getComponent(Health)!; + health.current -= 10; +} + +// 移除组件 +player.removeComponentByType(Velocity); + +// 列出所有组件 +console.log(player.components.map(c => c.constructor.name)); +``` + +## 下一步 + +- [实体句柄](/guide/entity/entity-handle/) - 安全的跨帧实体引用 +- [组件系统](/guide/component/) - 组件的定义和生命周期 diff --git a/docs/src/content/docs/guide/entity/entity-handle.md b/docs/src/content/docs/guide/entity/entity-handle.md new file mode 100644 index 00000000..5e9a1021 --- /dev/null +++ b/docs/src/content/docs/guide/entity/entity-handle.md @@ -0,0 +1,265 @@ +--- +title: "实体句柄" +description: "使用 EntityHandle 安全地引用实体,避免引用已销毁实体的问题" +--- + +实体句柄(EntityHandle)是一种安全的实体引用方式,用于解决"引用已销毁实体"的问题。 + +## 问题场景 + +假设你的 AI 系统需要追踪一个目标敌人: + +```typescript +// ❌ 错误做法:直接存储实体引用 +class AISystem extends EntitySystem { + private targetEnemy: Entity | null = null; + + setTarget(enemy: Entity) { + this.targetEnemy = enemy; + } + + process() { + if (this.targetEnemy) { + // 危险!敌人可能已被销毁,但引用还在 + // 更糟糕:这个内存位置可能被新实体复用了 + const health = this.targetEnemy.getComponent(Health); + // 可能操作了错误的实体! + } + } +} +``` + +## 什么是 EntityHandle + +EntityHandle 是一个数值类型的实体标识符,包含: +- **索引(Index)**:实体在数组中的位置 +- **代数(Generation)**:实体被复用的次数 + +当实体被销毁后,即使其索引被新实体复用,代数也会增加,使得旧句柄失效。 + +```typescript +import { EntityHandle, NULL_HANDLE, isValidHandle } from '@esengine/ecs-framework'; + +// 每个实体创建时会自动分配句柄 +const handle: EntityHandle = entity.handle; + +// 空句柄常量 +const emptyHandle = NULL_HANDLE; + +// 检查句柄是否非空 +if (isValidHandle(handle)) { + // 句柄有效 +} +``` + +## 使用句柄的正确做法 + +```typescript +import { EntityHandle, NULL_HANDLE, isValidHandle } from '@esengine/ecs-framework'; + +class AISystem extends EntitySystem { + // ✅ 存储句柄而非实体引用 + private targetHandle: EntityHandle = NULL_HANDLE; + + setTarget(enemy: Entity) { + this.targetHandle = enemy.handle; + } + + process() { + if (!isValidHandle(this.targetHandle)) { + return; // 没有目标 + } + + // 通过句柄获取实体(自动检测是否有效) + const enemy = this.scene.findEntityByHandle(this.targetHandle); + + if (!enemy) { + // 敌人已被销毁,清空引用 + this.targetHandle = NULL_HANDLE; + return; + } + + // 安全操作 + const health = enemy.getComponent(Health); + if (health) { + // 对敌人造成伤害 + } + } +} +``` + +## API 参考 + +### 获取句柄 + +```typescript +// 从实体获取句柄 +const handle = entity.handle; +``` + +### 验证句柄 + +```typescript +import { isValidHandle, NULL_HANDLE } from '@esengine/ecs-framework'; + +// 检查句柄是否非空 +if (isValidHandle(handle)) { + // ... +} + +// 检查实体是否存活 +const alive = scene.handleManager.isAlive(handle); +``` + +### 通过句柄获取实体 + +```typescript +// 返回 Entity | null +const entity = scene.findEntityByHandle(handle); + +if (entity) { + // 实体存在且有效 +} +``` + +## 完整示例:技能目标锁定 + +```typescript +import { + EntitySystem, + Entity, + EntityHandle, + NULL_HANDLE, + isValidHandle +} from '@esengine/ecs-framework'; + +@ECSSystem('SkillTargeting') +class SkillTargetingSystem extends EntitySystem { + // 存储多个目标的句柄 + private lockedTargets: Map = new Map(); + + // 锁定目标 + lockTarget(casterId: number, target: Entity) { + this.lockedTargets.set(casterId, target.handle); + } + + // 获取锁定的目标 + getLockedTarget(casterId: number): Entity | null { + const handle = this.lockedTargets.get(casterId); + + if (!handle || !isValidHandle(handle)) { + return null; + } + + const target = this.scene.findEntityByHandle(handle); + + if (!target) { + // 目标已死亡,清除锁定 + this.lockedTargets.delete(casterId); + } + + return target; + } + + // 释放技能 + castSkill(caster: Entity) { + const target = this.getLockedTarget(caster.id); + + if (!target) { + console.log('目标丢失,技能取消'); + return; + } + + const health = target.getComponent(Health); + if (health) { + health.current -= 10; + } + } + + // 清除指定施法者的目标 + clearTarget(casterId: number) { + this.lockedTargets.delete(casterId); + } +} +``` + +## 使用场景指南 + +| 场景 | 推荐方式 | +|-----|---------| +| 同一帧内临时使用 | 直接用 `Entity` 引用 | +| 跨帧存储(AI 目标、技能目标) | 使用 `EntityHandle` | +| 需要序列化保存 | 使用 `EntityHandle`(数字类型) | +| 网络同步 | 使用 `EntityHandle`(可直接传输) | + +## 性能考虑 + +- EntityHandle 是数字类型,内存占用小 +- `findEntityByHandle` 是 O(1) 操作 +- 比每帧检查 `entity.isDestroyed` 更安全可靠 + +## 常见模式 + +### 可选目标引用 + +```typescript +class FollowComponent extends Component { + private _targetHandle: EntityHandle = NULL_HANDLE; + + setTarget(target: Entity | null) { + this._targetHandle = target?.handle ?? NULL_HANDLE; + } + + getTarget(scene: IScene): Entity | null { + if (!isValidHandle(this._targetHandle)) { + return null; + } + return scene.findEntityByHandle(this._targetHandle); + } + + hasTarget(): boolean { + return isValidHandle(this._targetHandle); + } +} +``` + +### 多目标追踪 + +```typescript +class MultiTargetComponent extends Component { + private targets: EntityHandle[] = []; + + addTarget(target: Entity) { + this.targets.push(target.handle); + } + + removeTarget(target: Entity) { + const index = this.targets.indexOf(target.handle); + if (index >= 0) { + this.targets.splice(index, 1); + } + } + + getValidTargets(scene: IScene): Entity[] { + const valid: Entity[] = []; + const stillValid: EntityHandle[] = []; + + for (const handle of this.targets) { + const entity = scene.findEntityByHandle(handle); + if (entity) { + valid.push(entity); + stillValid.push(handle); + } + } + + // 清理无效句柄 + this.targets = stillValid; + return valid; + } +} +``` + +## 下一步 + +- [生命周期](/guide/entity/lifecycle/) - 实体的销毁和持久化 +- [组件引用](/guide/component/entity-ref/) - 组件中的实体引用装饰器 diff --git a/docs/src/content/docs/guide/entity/index.md b/docs/src/content/docs/guide/entity/index.md new file mode 100644 index 00000000..effba22d --- /dev/null +++ b/docs/src/content/docs/guide/entity/index.md @@ -0,0 +1,174 @@ +--- +title: "实体概述" +description: "ECS 架构中实体的基本概念和使用方式" +--- + +在 ECS 架构中,实体(Entity)是游戏世界中的基本对象。实体本身不包含游戏逻辑或数据,它只是一个容器,用来组合不同的组件来实现各种功能。 + +## 基本概念 + +实体是一个轻量级的对象,主要用于: +- 作为组件的容器 +- 提供唯一标识(ID 和 persistentId) +- 管理组件的生命周期 + +:::tip[关于父子层级关系] +实体间的父子层级关系通过 `HierarchyComponent` 和 `HierarchySystem` 管理,而非 Entity 内置属性。这种设计遵循 ECS 组合原则 —— 只有需要层级关系的实体才添加此组件。 + +详见 [层级系统](/guide/hierarchy/) 文档。 +::: + +## 创建实体 + +**实体必须通过场景创建,不支持手动创建。** + +```typescript +// 正确的方式:通过场景创建实体 +const player = scene.createEntity("Player"); + +// ❌ 错误的方式:手动创建实体 +// const entity = new Entity("MyEntity", 1); +``` + +通过场景创建可以确保: +- 实体被正确添加到场景的实体管理系统中 +- 实体被添加到查询系统中,供系统使用 +- 实体获得正确的场景引用 +- 触发相关的生命周期事件 + +### 批量创建 + +框架提供了高性能的批量创建方法: + +```typescript +// 批量创建 100 个子弹实体 +const bullets = scene.createEntities(100, "Bullet"); + +bullets.forEach((bullet, index) => { + bullet.createComponent(Position, Math.random() * 800, Math.random() * 600); + bullet.createComponent(Velocity, Math.random() * 100, Math.random() * 100); +}); +``` + +`createEntities()` 会批量分配 ID、优化查询系统更新,减少系统缓存清理次数。 + +## 实体标识 + +每个实体有三种标识符: + +| 属性 | 类型 | 说明 | +|-----|------|-----| +| `id` | `number` | 运行时唯一标识符,用于快速查找 | +| `persistentId` | `string` | GUID,序列化时保持引用一致性 | +| `handle` | `EntityHandle` | 轻量级句柄,详见[实体句柄](/guide/entity/entity-handle/) | + +```typescript +const entity = scene.createEntity("Player"); + +console.log(entity.id); // 1 +console.log(entity.persistentId); // "a1b2c3d4-..." +console.log(entity.handle); // 数字类型句柄 +``` + +## 实体属性 + +### 名称和标签 + +```typescript +// 名称 - 用于调试和查找 +entity.name = "Player"; + +// 标签 - 用于快速分类和查询 +entity.tag = 1; // 玩家标签 +enemy.tag = 2; // 敌人标签 +``` + +### 状态控制 + +```typescript +// 启用/禁用状态 +entity.enabled = false; + +// 激活状态 +entity.active = false; + +// 更新顺序(数值越小越优先) +entity.updateOrder = 10; +``` + +## 实体查找 + +场景提供了多种查找方式: + +```typescript +// 通过名称查找 +const player = scene.findEntity("Player"); +// 或别名 +const player2 = scene.getEntityByName("Player"); + +// 通过 ID 查找 +const entity = scene.findEntityById(123); + +// 通过标签查找所有相关实体 +const enemies = scene.findEntitiesByTag(2); +// 或别名 +const allEnemies = scene.getEntitiesByTag(2); + +// 通过句柄查找 +const entity = scene.findEntityByHandle(handle); +``` + +## 实体事件 + +实体的变化会触发事件: + +```typescript +// 监听组件添加 +scene.eventSystem.on('component:added', (data) => { + console.log(`${data.entityName} 添加了 ${data.componentType}`); +}); + +// 监听组件移除 +scene.eventSystem.on('component:removed', (data) => { + console.log(`${data.entityName} 移除了 ${data.componentType}`); +}); + +// 监听实体创建 +scene.eventSystem.on('entity:created', (data) => { + console.log(`实体已创建: ${data.entityName}`); +}); + +// 监听激活状态变化 +scene.eventSystem.on('entity:activeChanged', (data) => { + console.log(`${data.entity.name} 激活状态: ${data.active}`); +}); +``` + +## 调试 + +```typescript +// 获取实体调试信息 +const debugInfo = entity.getDebugInfo(); +console.log(debugInfo); +// { +// name: "Player", +// id: 1, +// persistentId: "a1b2c3d4-...", +// enabled: true, +// active: true, +// destroyed: false, +// componentCount: 3, +// componentTypes: ["Position", "Health", "Velocity"], +// ... +// } + +// 实体字符串表示 +console.log(entity.toString()); +// "Entity[Player:1:a1b2c3d4]" +``` + +## 下一步 + +- [组件操作](/guide/entity/component-operations/) - 添加、获取、移除组件 +- [实体句柄](/guide/entity/entity-handle/) - 安全的实体引用方式 +- [生命周期](/guide/entity/lifecycle/) - 销毁和持久化 diff --git a/docs/src/content/docs/guide/entity/lifecycle.md b/docs/src/content/docs/guide/entity/lifecycle.md new file mode 100644 index 00000000..b3e89358 --- /dev/null +++ b/docs/src/content/docs/guide/entity/lifecycle.md @@ -0,0 +1,238 @@ +--- +title: "生命周期" +description: "实体的生命周期管理、销毁和持久化" +--- + +实体的生命周期包括创建、运行和销毁三个阶段。本节介绍如何正确管理实体的生命周期。 + +## 销毁实体 + +### 基本销毁 + +```typescript +// 销毁实体 +player.destroy(); + +// 检查实体是否已销毁 +if (player.isDestroyed) { + console.log("实体已被销毁"); +} +``` + +销毁实体时会: +1. 移除所有组件(触发 `onRemovedFromEntity` 回调) +2. 从查询系统中移除 +3. 从场景实体列表中移除 +4. 清理所有引用追踪 + +### 条件销毁 + +```typescript +// 常见模式:生命值耗尽时销毁 +const health = enemy.getComponent(Health); +if (health && health.current <= 0) { + enemy.destroy(); +} +``` + +### 销毁保护 + +销毁操作是幂等的,多次调用不会出错: + +```typescript +player.destroy(); +player.destroy(); // 安全,不会报错 +``` + +## 持久化实体 + +默认情况下,实体在场景切换时会被销毁。使用持久化可以让实体跨场景存活。 + +### 设置持久化 + +```typescript +// 方式一:链式调用 +const player = scene.createEntity('Player') + .setPersistent() + .createComponent(PlayerComponent); + +// 方式二:单独设置 +player.setPersistent(); + +// 检查是否持久化 +if (player.isPersistent) { + console.log("这是持久化实体"); +} +``` + +### 取消持久化 + +```typescript +// 恢复为场景本地实体 +player.setSceneLocal(); +``` + +### 生命周期策略 + +实体有两种生命周期策略: + +| 策略 | 说明 | +|-----|------| +| `SceneLocal` | 默认,随场景销毁 | +| `Persistent` | 跨场景保留 | + +```typescript +import { EEntityLifecyclePolicy } from '@esengine/ecs-framework'; + +// 获取当前策略 +const policy = entity.lifecyclePolicy; + +if (policy === EEntityLifecyclePolicy.Persistent) { + // 持久化实体 +} +``` + +### 使用场景 + +持久化实体适用于: +- 玩家角色 +- 全局管理器 +- UI 实体 +- 需要跨场景保留的游戏状态 + +```typescript +// 玩家角色 +const player = scene.createEntity('Player') + .setPersistent(); + +// 游戏管理器 +const gameManager = scene.createEntity('GameManager') + .setPersistent() + .createComponent(GameStateComponent); + +// 分数管理 +const scoreManager = scene.createEntity('ScoreManager') + .setPersistent() + .createComponent(ScoreComponent); +``` + +## 场景切换时的行为 + +```typescript +// 场景管理器切换场景 +sceneManager.loadScene('Level2'); + +// 切换时: +// 1. SceneLocal 实体被销毁 +// 2. Persistent 实体被迁移到新场景 +// 3. 新场景的实体被创建 +``` + +:::caution[注意] +持久化实体在场景切换时会自动迁移到新场景,但其引用的其他非持久化实体可能已被销毁。使用 [EntityHandle](/guide/entity/entity-handle/) 来安全地处理这种情况。 +::: + +## 实体引用清理 + +框架提供了引用追踪系统,在实体销毁时自动清理引用: + +```typescript +// 引用追踪会在实体销毁时清理指向该实体的所有引用 +scene.referenceTracker?.clearReferencesTo(entity.id); +``` + +配合 `@entityRef` 装饰器使用可以自动处理: + +```typescript +class FollowComponent extends Component { + @entityRef() + targetId: number | null = null; +} + +// 当 target 被销毁时,targetId 会自动设为 null +``` + +详见 [组件引用](/guide/component/entity-ref/)。 + +## 最佳实践 + +### 1. 及时销毁不需要的实体 + +```typescript +// 子弹飞出屏幕后销毁 +if (position.x < 0 || position.x > screenWidth) { + bullet.destroy(); +} +``` + +### 2. 使用对象池代替频繁创建销毁 + +```typescript +class BulletPool { + private pool: Entity[] = []; + + acquire(scene: Scene): Entity { + if (this.pool.length > 0) { + const bullet = this.pool.pop()!; + bullet.enabled = true; + return bullet; + } + return scene.createEntity('Bullet'); + } + + release(bullet: Entity) { + bullet.enabled = false; + this.pool.push(bullet); + } +} +``` + +### 3. 谨慎使用持久化 + +只对真正需要跨场景的实体使用持久化,过多的持久化实体会增加内存占用。 + +### 4. 销毁前清理引用 + +```typescript +// 销毁前通知相关系统 +const aiSystem = scene.getSystem(AISystem); +aiSystem?.clearTarget(enemy.id); + +enemy.destroy(); +``` + +## 生命周期事件 + +可以监听实体销毁事件: + +```typescript +// 方式一:通过事件系统 +scene.eventSystem.on('entity:destroyed', (data) => { + console.log(`实体 ${data.entityName} 已销毁`); +}); + +// 方式二:在组件中监听 +class MyComponent extends Component { + onRemovedFromEntity() { + console.log('组件被移除,实体可能正在销毁'); + // 清理资源 + } +} +``` + +## 调试 + +```typescript +// 获取实体状态 +const debugInfo = entity.getDebugInfo(); +console.log({ + destroyed: debugInfo.destroyed, + enabled: debugInfo.enabled, + active: debugInfo.active +}); +``` + +## 下一步 + +- [组件操作](/guide/entity/component-operations/) - 组件的添加和移除 +- [场景管理](/guide/scene/) - 场景切换和管理 diff --git a/docs/src/content/docs/modules/network/api.md b/docs/src/content/docs/modules/network/api.md new file mode 100644 index 00000000..85753f69 --- /dev/null +++ b/docs/src/content/docs/modules/network/api.md @@ -0,0 +1,288 @@ +--- +title: "API 参考" +description: "Network 模块完整 API 文档" +--- + +## NetworkPlugin + +客户端网络插件核心类。 + +```typescript +class NetworkPlugin implements IPlugin { + readonly name: string; + readonly version: string; + + // 访问器 + get networkService(): NetworkService; + get syncSystem(): NetworkSyncSystem; + get spawnSystem(): NetworkSpawnSystem; + get inputSystem(): NetworkInputSystem; + get isConnected(): boolean; + + // 生命周期 + install(core: Core, services: ServiceContainer): void; + uninstall(): void; + + // 连接管理 + connect(serverUrl: string, playerName: string, roomId?: string): Promise; + disconnect(): Promise; + + // 预制体注册 + registerPrefab(prefabType: string, factory: PrefabFactory): void; + + // 输入发送 + sendMoveInput(x: number, y: number): void; + sendActionInput(action: string): void; +} +``` + +## NetworkService + +网络服务,管理 WebSocket 连接。 + +```typescript +class NetworkService { + // 访问器 + get state(): ENetworkState; + get isConnected(): boolean; + get clientId(): number; + get roomId(): string; + + // 连接管理 + connect(serverUrl: string, playerName: string, roomId?: string): Promise; + disconnect(): Promise; + + // 输入发送 + sendInput(input: IPlayerInput): void; + + // 回调设置 + setCallbacks(callbacks: INetworkCallbacks): void; +} +``` + +## 枚举类型 + +### ENetworkState + +```typescript +const enum ENetworkState { + Disconnected = 0, + Connecting = 1, + Connected = 2 +} +``` + +## 接口类型 + +### INetworkCallbacks + +```typescript +interface INetworkCallbacks { + onConnected?: (clientId: number, roomId: string) => void; + onDisconnected?: () => void; + onSync?: (msg: MsgSync) => void; + onSpawn?: (msg: MsgSpawn) => void; + onDespawn?: (msg: MsgDespawn) => void; + onError?: (error: Error) => void; +} +``` + +### PrefabFactory + +```typescript +type PrefabFactory = (scene: Scene, spawn: MsgSpawn) => Entity; +``` + +### IPlayerInput + +```typescript +interface IPlayerInput { + seq?: number; + moveDir?: Vec2; + actions?: string[]; +} +``` + +## 组件 + +### NetworkIdentity + +```typescript +class NetworkIdentity extends Component { + netId: number; + ownerId: number; + bIsLocalPlayer: boolean; + bHasAuthority: boolean; +} +``` + +### NetworkTransform + +```typescript +class NetworkTransform extends Component { + position: { x: number; y: number }; + rotation: number; + velocity: { x: number; y: number }; +} +``` + +## 系统 + +### NetworkSyncSystem + +```typescript +class NetworkSyncSystem extends EntitySystem { + // 内部使用,由 NetworkPlugin 自动管理 +} +``` + +### NetworkSpawnSystem + +```typescript +class NetworkSpawnSystem extends EntitySystem { + registerPrefab(prefabType: string, factory: PrefabFactory): void; +} +``` + +### NetworkInputSystem + +```typescript +class NetworkInputSystem extends EntitySystem { + addMoveInput(x: number, y: number): void; + addActionInput(action: string): void; + clearInput(): void; +} +``` + +## 服务令牌 + +```typescript +import { + NetworkServiceToken, + NetworkSyncSystemToken, + NetworkSpawnSystemToken, + NetworkInputSystemToken +} from '@esengine/network'; + +// 使用 +const networkService = services.get(NetworkServiceToken); +``` + +## 服务器端 API + +### GameServer + +```typescript +class GameServer { + constructor(config: IGameServerConfig); + + start(): Promise; + stop(): Promise; + + getOrCreateRoom(roomId: string): Room; + getRoom(roomId: string): Room | undefined; + destroyRoom(roomId: string): void; +} +``` + +### Room + +```typescript +class Room { + readonly id: string; + readonly playerCount: number; + readonly isFull: boolean; + + addPlayer(name: string, connection: Connection): IPlayer | null; + removePlayer(clientId: number): void; + getPlayer(clientId: number): IPlayer | undefined; + handleInput(clientId: number, input: IPlayerInput): void; + destroy(): void; +} +``` + +### IPlayer + +```typescript +interface IPlayer { + clientId: number; + name: string; + connection: Connection; + netId: number; +} +``` + +## 协议消息 + +### MsgSync + +```typescript +interface MsgSync { + time: number; + entities: IEntityState[]; +} +``` + +### MsgSpawn + +```typescript +interface MsgSpawn { + netId: number; + ownerId: number; + prefab: string; + pos: Vec2; + rot: number; +} +``` + +### MsgDespawn + +```typescript +interface MsgDespawn { + netId: number; +} +``` + +### IEntityState + +```typescript +interface IEntityState { + netId: number; + pos?: Vec2; + rot?: number; +} +``` + +## 工具函数 + +### createSnapshotBuffer + +```typescript +function createSnapshotBuffer(config: { + maxSnapshots: number; + interpolationDelay: number; +}): ISnapshotBuffer; +``` + +### createTransformInterpolator + +```typescript +function createTransformInterpolator(): ITransformInterpolator; +``` + +### createHermiteTransformInterpolator + +```typescript +function createHermiteTransformInterpolator(config: { + bufferSize: number; +}): IHermiteTransformInterpolator; +``` + +### createClientPrediction + +```typescript +function createClientPrediction(config: { + maxPredictedInputs: number; + reconciliationThreshold: number; +}): IClientPrediction; +``` diff --git a/docs/src/content/docs/modules/network/client.md b/docs/src/content/docs/modules/network/client.md new file mode 100644 index 00000000..2840c4bb --- /dev/null +++ b/docs/src/content/docs/modules/network/client.md @@ -0,0 +1,256 @@ +--- +title: "客户端使用" +description: "NetworkPlugin、组件和系统的客户端使用指南" +--- + +## NetworkPlugin + +NetworkPlugin 是客户端网络功能的核心入口。 + +### 基本用法 + +```typescript +import { Core } from '@esengine/ecs-framework'; +import { NetworkPlugin } from '@esengine/network'; + +// 创建并安装插件 +const networkPlugin = new NetworkPlugin(); +await Core.installPlugin(networkPlugin); + +// 连接服务器 +const success = await networkPlugin.connect('ws://localhost:3000', 'PlayerName'); + +// 断开连接 +await networkPlugin.disconnect(); +``` + +### 属性和方法 + +```typescript +class NetworkPlugin { + readonly name: string; + readonly version: string; + + // 访问器 + get networkService(): NetworkService; + get syncSystem(): NetworkSyncSystem; + get spawnSystem(): NetworkSpawnSystem; + get inputSystem(): NetworkInputSystem; + get isConnected(): boolean; + + // 连接服务器 + connect(serverUrl: string, playerName: string, roomId?: string): Promise; + + // 断开连接 + disconnect(): Promise; + + // 注册预制体工厂 + registerPrefab(prefabType: string, factory: PrefabFactory): void; + + // 发送输入 + sendMoveInput(x: number, y: number): void; + sendActionInput(action: string): void; +} +``` + +## 组件 + +### NetworkIdentity + +网络标识组件,每个网络同步的实体必须拥有: + +```typescript +class NetworkIdentity extends Component { + netId: number; // 网络唯一 ID + ownerId: number; // 所有者客户端 ID + bIsLocalPlayer: boolean; // 是否为本地玩家 + bHasAuthority: boolean; // 是否有权限控制 +} +``` + +**使用示例:** + +```typescript +networkPlugin.registerPrefab('player', (scene, spawn) => { + const entity = scene.createEntity(`player_${spawn.netId}`); + + const identity = entity.addComponent(new NetworkIdentity()); + identity.netId = spawn.netId; + identity.ownerId = spawn.ownerId; + identity.bIsLocalPlayer = spawn.ownerId === networkPlugin.networkService.clientId; + + return entity; +}); +``` + +### NetworkTransform + +网络变换组件,用于位置和旋转同步: + +```typescript +class NetworkTransform extends Component { + position: { x: number; y: number }; + rotation: number; + velocity: { x: number; y: number }; +} +``` + +## 系统 + +### NetworkSyncSystem + +处理服务器状态同步和插值: + +- 接收服务器状态快照 +- 将状态存入快照缓冲区 +- 对远程实体进行插值平滑 + +### NetworkSpawnSystem + +处理实体的网络生成和销毁: + +- 监听 Spawn/Despawn 消息 +- 使用注册的预制体工厂创建实体 +- 管理网络实体的生命周期 + +### NetworkInputSystem + +处理本地玩家输入的网络发送: + +```typescript +class NetworkInputSystem extends EntitySystem { + addMoveInput(x: number, y: number): void; + addActionInput(action: string): void; + clearInput(): void; +} +``` + +**使用示例:** + +```typescript +// 方式 1:通过 NetworkPlugin(推荐) +networkPlugin.sendMoveInput(0, 1); +networkPlugin.sendActionInput('jump'); + +// 方式 2:直接使用 inputSystem +const inputSystem = networkPlugin.inputSystem; +inputSystem.addMoveInput(0, 1); +inputSystem.addActionInput('jump'); +``` + +## 预制体工厂 + +预制体工厂用于创建网络实体: + +```typescript +type PrefabFactory = (scene: Scene, spawn: MsgSpawn) => Entity; +``` + +**完整示例:** + +```typescript +// 注册玩家预制体 +networkPlugin.registerPrefab('player', (scene, spawn) => { + const entity = scene.createEntity(`player_${spawn.netId}`); + + const identity = entity.addComponent(new NetworkIdentity()); + identity.netId = spawn.netId; + identity.ownerId = spawn.ownerId; + identity.bIsLocalPlayer = spawn.ownerId === networkPlugin.networkService.clientId; + + entity.addComponent(new NetworkTransform()); + + // 本地玩家添加输入组件 + if (identity.bIsLocalPlayer) { + entity.addComponent(new LocalInputComponent()); + } + + return entity; +}); + +// 注册敌人预制体 +networkPlugin.registerPrefab('enemy', (scene, spawn) => { + const entity = scene.createEntity(`enemy_${spawn.netId}`); + + const identity = entity.addComponent(new NetworkIdentity()); + identity.netId = spawn.netId; + identity.ownerId = spawn.ownerId; + + entity.addComponent(new NetworkTransform()); + entity.addComponent(new EnemyComponent()); + + return entity; +}); +``` + +## 处理输入 + +创建自定义输入处理系统: + +```typescript +import { EntitySystem, Matcher, Entity } from '@esengine/ecs-framework'; +import { NetworkPlugin, NetworkIdentity } from '@esengine/network'; + +class LocalInputHandler extends EntitySystem { + private _networkPlugin: NetworkPlugin | null = null; + + constructor() { + super(Matcher.empty().all(NetworkIdentity, LocalInputComponent)); + } + + protected onAddedToScene(): void { + this._networkPlugin = Core.getPlugin(NetworkPlugin); + } + + protected processEntity(entity: Entity, dt: number): void { + if (!this._networkPlugin) return; + + const identity = entity.getComponent(NetworkIdentity)!; + if (!identity.bIsLocalPlayer) return; + + // 读取键盘输入 + let moveX = 0; + let moveY = 0; + + if (keyboard.isPressed('A')) moveX -= 1; + if (keyboard.isPressed('D')) moveX += 1; + if (keyboard.isPressed('W')) moveY += 1; + if (keyboard.isPressed('S')) moveY -= 1; + + if (moveX !== 0 || moveY !== 0) { + this._networkPlugin.sendMoveInput(moveX, moveY); + } + + if (keyboard.isJustPressed('Space')) { + this._networkPlugin.sendActionInput('jump'); + } + } +} +``` + +## 连接状态监听 + +```typescript +networkPlugin.networkService.setCallbacks({ + onConnected: (clientId, roomId) => { + console.log(`已连接: 客户端 ${clientId}, 房间 ${roomId}`); + }, + onDisconnected: () => { + console.log('已断开'); + // 处理重连逻辑 + }, + onError: (error) => { + console.error('网络错误:', error); + } +}); +``` + +## 最佳实践 + +1. **权限检查**:使用 `bHasAuthority` 检查是否有权限修改实体 + +2. **本地玩家标识**:通过 `bIsLocalPlayer` 区分本地和远程玩家 + +3. **预制体管理**:为每种网络实体类型注册对应的预制体工厂 + +4. **输入发送**:推荐使用 `NetworkPlugin.sendMoveInput()` 和 `sendActionInput()` 方法 diff --git a/docs/src/content/docs/modules/network/index.md b/docs/src/content/docs/modules/network/index.md index f36b4c90..9867fe20 100644 --- a/docs/src/content/docs/modules/network/index.md +++ b/docs/src/content/docs/modules/network/index.md @@ -1,5 +1,6 @@ --- title: "网络同步系统 (Network)" +description: "基于 TSRPC 的多人游戏网络同步解决方案" --- `@esengine/network` 提供基于 TSRPC 的客户端-服务器网络同步解决方案,用于多人游戏的实体同步、输入处理和状态插值。 @@ -24,49 +25,17 @@ npm install @esengine/network npm install @esengine/network-server ``` -## 使用 CLI 快速创建服务端 - -推荐使用 ESEngine CLI 快速创建完整的游戏服务端项目: - -```bash -# 创建项目目录 -mkdir my-game-server && cd my-game-server -npm init -y - -# 使用 CLI 初始化 Node.js 服务端 -npx @esengine/cli init -p nodejs -``` - -CLI 会自动生成以下项目结构: +## 架构 ``` -my-game-server/ -├── src/ -│ ├── index.ts # 入口文件 -│ ├── server/ -│ │ └── GameServer.ts # 网络服务器配置 -│ └── game/ -│ ├── Game.ts # ECS 游戏主类 -│ ├── scenes/ -│ │ └── MainScene.ts # 主场景 -│ ├── components/ # ECS 组件 -│ │ ├── PositionComponent.ts -│ │ └── VelocityComponent.ts -│ └── systems/ # ECS 系统 -│ └── MovementSystem.ts -├── tsconfig.json -├── package.json -└── README.md -``` - -启动服务端: - -```bash -# 开发模式(热重载) -npm run dev - -# 生产模式 -npm run start +客户端 服务器 +┌────────────────┐ ┌────────────────┐ +│ NetworkPlugin │◄──── WS ────► │ GameServer │ +│ ├─ Service │ │ ├─ Room │ +│ ├─ SyncSystem │ │ └─ Players │ +│ ├─ SpawnSystem │ └────────────────┘ +│ └─ InputSystem │ +└────────────────┘ ``` ## 快速开始 @@ -75,21 +44,16 @@ npm run start ```typescript import { Core, Scene } from '@esengine/ecs-framework'; -import { - NetworkPlugin, - NetworkIdentity, - NetworkTransform -} from '@esengine/network'; +import { NetworkPlugin, NetworkIdentity, NetworkTransform } from '@esengine/network'; // 定义游戏场景 class GameScene extends Scene { initialize(): void { this.name = 'Game'; - // 网络系统由 NetworkPlugin 自动添加 } } -// 初始化 Core +// 初始化 Core.create({ debug: false }); const scene = new GameScene(); Core.setScene(scene); @@ -105,7 +69,7 @@ networkPlugin.registerPrefab('player', (scene, spawn) => { const identity = entity.addComponent(new NetworkIdentity()); identity.netId = spawn.netId; identity.ownerId = spawn.ownerId; - identity.bIsLocalPlayer = spawn.ownerId === networkPlugin.networkService.localClientId; + identity.bIsLocalPlayer = spawn.ownerId === networkPlugin.networkService.clientId; entity.addComponent(new NetworkTransform()); return entity; @@ -116,20 +80,10 @@ const success = await networkPlugin.connect('ws://localhost:3000', 'PlayerName') if (success) { console.log('Connected!'); } - -// 游戏循环 -function gameLoop(dt: number) { - Core.update(dt); -} - -// 断开连接 -await networkPlugin.disconnect(); ``` ### 服务器端 -使用 CLI 创建服务端项目后,默认生成的代码已经配置好了 GameServer: - ```typescript import { GameServer } from '@esengine/network-server'; @@ -145,436 +99,39 @@ await server.start(); console.log('Server started on ws://localhost:3000'); ``` -## 核心概念 +## 使用 CLI 快速创建 -### 架构 +推荐使用 ESEngine CLI 快速创建完整的游戏服务端项目: -``` -客户端 服务器 -┌────────────────┐ ┌────────────────┐ -│ NetworkPlugin │◄──── WS ────► │ GameServer │ -│ ├─ Service │ │ ├─ Room │ -│ ├─ SyncSystem │ │ └─ Players │ -│ ├─ SpawnSystem │ └────────────────┘ -│ └─ InputSystem │ -└────────────────┘ +```bash +mkdir my-game-server && cd my-game-server +npm init -y +npx @esengine/cli init -p nodejs ``` -### 组件 +生成的项目结构: -#### NetworkIdentity - -网络标识组件,每个网络同步的实体必须拥有: - -```typescript -class NetworkIdentity extends Component { - netId: number; // 网络唯一 ID - ownerId: number; // 所有者客户端 ID - bIsLocalPlayer: boolean; // 是否为本地玩家 - bHasAuthority: boolean; // 是否有权限控制 -} +``` +my-game-server/ +├── src/ +│ ├── index.ts +│ ├── server/ +│ │ └── GameServer.ts +│ └── game/ +│ ├── Game.ts +│ ├── scenes/ +│ ├── components/ +│ └── systems/ +├── tsconfig.json +└── package.json ``` -#### NetworkTransform +## 文档导航 -网络变换组件,用于位置和旋转同步: - -```typescript -class NetworkTransform extends Component { - position: { x: number; y: number }; - rotation: number; - velocity: { x: number; y: number }; -} -``` - -### 系统 - -#### NetworkSyncSystem - -处理服务器状态同步和插值: - -- 接收服务器状态快照 -- 将状态存入快照缓冲区 -- 对远程实体进行插值平滑 - -#### NetworkSpawnSystem - -处理实体的网络生成和销毁: - -- 监听 Spawn/Despawn 消息 -- 使用注册的预制体工厂创建实体 -- 管理网络实体的生命周期 - -#### NetworkInputSystem - -处理本地玩家输入的网络发送: - -- 收集本地玩家输入 -- 发送输入到服务器 -- 支持移动和动作输入 - -## API 参考 - -### NetworkPlugin - -```typescript -class NetworkPlugin { - constructor(config: INetworkPluginConfig); - - // 安装插件 - install(services: ServiceContainer): void; - - // 连接服务器 - connect(playerName: string, roomId?: string): Promise; - - // 断开连接 - disconnect(): void; - - // 注册预制体工厂 - registerPrefab(prefab: string, factory: PrefabFactory): void; - - // 属性 - readonly localPlayerId: number | null; - readonly isConnected: boolean; -} -``` - -**配置选项:** - -| 属性 | 类型 | 必需 | 描述 | -|------|------|------|------| -| `serverUrl` | `string` | 是 | WebSocket 服务器地址 | - -### NetworkService - -网络服务,管理 WebSocket 连接: - -```typescript -class NetworkService { - // 连接状态 - readonly state: ENetworkState; - readonly isConnected: boolean; - readonly clientId: number | null; - readonly roomId: string | null; - - // 连接控制 - connect(serverUrl: string): Promise; - disconnect(): void; - - // 加入房间 - join(playerName: string, roomId?: string): Promise; - - // 发送输入 - sendInput(input: IPlayerInput): void; - - // 事件回调 - setCallbacks(callbacks: Partial): void; -} -``` - -**网络状态枚举:** - -```typescript -enum ENetworkState { - Disconnected = 'disconnected', - Connecting = 'connecting', - Connected = 'connected', - Joining = 'joining', - Joined = 'joined' -} -``` - -**回调接口:** - -```typescript -interface INetworkCallbacks { - onConnected?: () => void; - onDisconnected?: () => void; - onJoined?: (clientId: number, roomId: string) => void; - onSync?: (msg: MsgSync) => void; - onSpawn?: (msg: MsgSpawn) => void; - onDespawn?: (msg: MsgDespawn) => void; -} -``` - -### 预制体工厂 - -```typescript -type PrefabFactory = (scene: Scene, spawn: MsgSpawn) => Entity; -``` - -注册预制体工厂用于网络实体的创建: - -```typescript -networkPlugin.registerPrefab('enemy', (scene, spawn) => { - const entity = scene.createEntity(`enemy_${spawn.netId}`); - - const identity = entity.addComponent(new NetworkIdentity()); - identity.netId = spawn.netId; - identity.ownerId = spawn.ownerId; - - entity.addComponent(new NetworkTransform()); - entity.addComponent(new EnemyComponent()); - return entity; -}); -``` - -### 输入系统 - -#### NetworkInputSystem - -```typescript -class NetworkInputSystem extends EntitySystem { - // 添加移动输入 - addMoveInput(x: number, y: number): void; - - // 添加动作输入 - addActionInput(action: string): void; - - // 清除输入 - clearInput(): void; -} -``` - -使用示例: - -```typescript -// 通过 NetworkPlugin 发送输入(推荐) -networkPlugin.sendMoveInput(0, 1); // 移动 -networkPlugin.sendActionInput('jump'); // 动作 - -// 或直接使用 inputSystem -const inputSystem = networkPlugin.inputSystem; -if (keyboard.isPressed('W')) { - inputSystem.addMoveInput(0, 1); -} -if (keyboard.isPressed('Space')) { - inputSystem.addActionInput('jump'); -} -``` - -## 状态同步 - -### 快照缓冲区 - -用于存储服务器状态快照并进行插值: - -```typescript -import { createSnapshotBuffer, type IStateSnapshot } from '@esengine/network'; - -const buffer = createSnapshotBuffer({ - maxSnapshots: 30, // 最大快照数 - interpolationDelay: 100 // 插值延迟 (ms) -}); - -// 添加快照 -buffer.addSnapshot({ - time: serverTime, - entities: states -}); - -// 获取插值状态 -const interpolated = buffer.getInterpolatedState(clientTime); -``` - -### 变换插值器 - -#### 线性插值器 - -```typescript -import { createTransformInterpolator } from '@esengine/network'; - -const interpolator = createTransformInterpolator(); - -// 添加状态 -interpolator.addState(time, { x: 0, y: 0, rotation: 0 }); - -// 获取插值结果 -const state = interpolator.getInterpolatedState(currentTime); -``` - -#### Hermite 插值器 - -使用 Hermite 样条实现更平滑的插值: - -```typescript -import { createHermiteTransformInterpolator } from '@esengine/network'; - -const interpolator = createHermiteTransformInterpolator({ - bufferSize: 10 -}); - -// 添加带速度的状态 -interpolator.addState(time, { - x: 100, - y: 200, - rotation: 0, - vx: 5, - vy: 0 -}); - -// 获取平滑的插值结果 -const state = interpolator.getInterpolatedState(currentTime); -``` - -### 客户端预测 - -实现客户端预测和服务器校正: - -```typescript -import { createClientPrediction } from '@esengine/network'; - -const prediction = createClientPrediction({ - maxPredictedInputs: 60, - reconciliationThreshold: 0.1 -}); - -// 预测输入 -const seq = prediction.predict(inputState, currentState, (state, input) => { - // 应用输入到状态 - return applyInput(state, input); -}); - -// 服务器校正 -const corrected = prediction.reconcile( - serverState, - serverSeq, - (state, input) => applyInput(state, input) -); -``` - -## 服务器端 - -### GameServer - -```typescript -import { GameServer } from '@esengine/network-server'; - -const server = new GameServer({ - port: 3000, - roomConfig: { - maxPlayers: 16, // 房间最大玩家数 - tickRate: 20 // 同步频率 (Hz) - } -}); - -// 启动服务器 -await server.start(); - -// 获取房间 -const room = server.getOrCreateRoom('room-id'); - -// 停止服务器 -await server.stop(); -``` - -### Room - -```typescript -class Room { - readonly id: string; - readonly playerCount: number; - readonly isFull: boolean; - - // 添加玩家 - addPlayer(name: string, connection: Connection): IPlayer | null; - - // 移除玩家 - removePlayer(clientId: number): void; - - // 获取玩家 - getPlayer(clientId: number): IPlayer | undefined; - - // 处理输入 - handleInput(clientId: number, input: IPlayerInput): void; - - // 销毁房间 - destroy(): void; -} -``` - -**玩家接口:** - -```typescript -interface IPlayer { - clientId: number; // 客户端 ID - name: string; // 玩家名称 - connection: Connection; // 连接对象 - netId: number; // 网络实体 ID -} -``` - -## 协议类型 - -### 消息类型 - -```typescript -// 状态同步消息 -interface MsgSync { - time: number; - entities: IEntityState[]; -} - -// 实体状态 -interface IEntityState { - netId: number; - pos?: Vec2; - rot?: number; -} - -// 生成消息 -interface MsgSpawn { - netId: number; - ownerId: number; - prefab: string; - pos: Vec2; - rot: number; -} - -// 销毁消息 -interface MsgDespawn { - netId: number; -} - -// 输入消息 -interface MsgInput { - input: IPlayerInput; -} - -// 玩家输入 -interface IPlayerInput { - seq?: number; - moveDir?: Vec2; - actions?: string[]; -} -``` - -### API 类型 - -```typescript -// 加入请求 -interface ReqJoin { - playerName: string; - roomId?: string; -} - -// 加入响应 -interface ResJoin { - clientId: number; - roomId: string; - playerCount: number; -} -``` - -## 蓝图节点 - -网络模块提供了可视化脚本支持的蓝图节点: - -- `IsLocalPlayer` - 检查实体是否为本地玩家 -- `IsServer` - 检查是否运行在服务器端 -- `HasAuthority` - 检查是否有权限控制实体 -- `GetNetworkId` - 获取实体的网络 ID -- `GetLocalPlayerId` - 获取本地玩家 ID +- [客户端使用](/modules/network/client/) - NetworkPlugin、组件和系统 +- [服务器端](/modules/network/server/) - GameServer 和 Room 管理 +- [状态同步](/modules/network/sync/) - 插值、预测和快照 +- [API 参考](/modules/network/api/) - 完整 API 文档 ## 服务令牌 @@ -588,142 +145,15 @@ import { NetworkInputSystemToken } from '@esengine/network'; -// 获取服务 const networkService = services.get(NetworkServiceToken); ``` -## 实际示例 +## 蓝图节点 -### 完整的多人游戏客户端 +网络模块提供可视化脚本支持: -```typescript -import { Core, Scene, EntitySystem, Matcher, Entity } from '@esengine/ecs-framework'; -import { - NetworkPlugin, - NetworkIdentity, - NetworkTransform -} from '@esengine/network'; - -// 定义游戏场景 -class GameScene extends Scene { - initialize(): void { - this.name = 'MultiplayerGame'; - // 网络系统由 NetworkPlugin 自动添加 - // 添加自定义系统 - this.addSystem(new LocalInputHandler()); - } -} - -// 初始化 -async function initGame() { - Core.create({ debug: false }); - - const scene = new GameScene(); - Core.setScene(scene); - - // 安装网络插件 - const networkPlugin = new NetworkPlugin(); - await Core.installPlugin(networkPlugin); - - // 注册玩家预制体 - networkPlugin.registerPrefab('player', (scene, spawn) => { - const entity = scene.createEntity(`player_${spawn.netId}`); - - const identity = entity.addComponent(new NetworkIdentity()); - identity.netId = spawn.netId; - identity.ownerId = spawn.ownerId; - identity.bIsLocalPlayer = spawn.ownerId === networkPlugin.networkService.localClientId; - - entity.addComponent(new NetworkTransform()); - - // 如果是本地玩家,添加输入标记 - if (identity.bIsLocalPlayer) { - entity.addComponent(new LocalInputComponent()); - } - - return entity; - }); - - // 连接服务器 - const success = await networkPlugin.connect('ws://localhost:3000', 'Player1'); - if (success) { - console.log('已连接!'); - } else { - console.error('连接失败'); - } - - return networkPlugin; -} - -// 游戏循环 -function gameLoop(deltaTime: number) { - Core.update(deltaTime); -} - -initGame(); -``` - -### 处理输入 - -```typescript -class LocalInputHandler extends EntitySystem { - private _networkPlugin: NetworkPlugin | null = null; - - constructor() { - super(Matcher.empty().all(NetworkIdentity, LocalInputComponent)); - } - - protected onAddedToScene(): void { - // 获取 NetworkPlugin 引用 - this._networkPlugin = Core.getPlugin(NetworkPlugin); - } - - protected processEntity(entity: Entity, dt: number): void { - if (!this._networkPlugin) return; - - const identity = entity.getComponent(NetworkIdentity)!; - if (!identity.bIsLocalPlayer) return; - - // 读取键盘输入 - let moveX = 0; - let moveY = 0; - - if (keyboard.isPressed('A')) moveX -= 1; - if (keyboard.isPressed('D')) moveX += 1; - if (keyboard.isPressed('W')) moveY += 1; - if (keyboard.isPressed('S')) moveY -= 1; - - if (moveX !== 0 || moveY !== 0) { - this._networkPlugin.sendMoveInput(moveX, moveY); - } - - if (keyboard.isJustPressed('Space')) { - this._networkPlugin.sendActionInput('jump'); - } - } -} -``` - -## 最佳实践 - -1. **合理设置同步频率**:根据游戏类型选择合适的 `tickRate`,动作游戏通常需要 20-60 Hz - -2. **使用插值延迟**:设置适当的 `interpolationDelay` 来平衡延迟和平滑度 - -3. **客户端预测**:对于本地玩家使用客户端预测减少输入延迟 - -4. **预制体管理**:为每种网络实体类型注册对应的预制体工厂 - -5. **权限检查**:使用 `bHasAuthority` 检查是否有权限修改实体 - -6. **连接状态**:监听连接状态变化,处理断线重连 - -```typescript -networkService.setCallbacks({ - onConnected: () => console.log('已连接'), - onDisconnected: () => { - console.log('已断开'); - // 处理重连逻辑 - } -}); -``` +- `IsLocalPlayer` - 检查实体是否为本地玩家 +- `IsServer` - 检查是否运行在服务器端 +- `HasAuthority` - 检查是否有权限控制实体 +- `GetNetworkId` - 获取实体的网络 ID +- `GetLocalPlayerId` - 获取本地玩家 ID diff --git a/docs/src/content/docs/modules/network/server.md b/docs/src/content/docs/modules/network/server.md new file mode 100644 index 00000000..344cc0b1 --- /dev/null +++ b/docs/src/content/docs/modules/network/server.md @@ -0,0 +1,207 @@ +--- +title: "服务器端" +description: "GameServer 和 Room 管理" +--- + +## GameServer + +GameServer 是服务器端的核心类,管理 WebSocket 连接和房间。 + +### 基本用法 + +```typescript +import { GameServer } from '@esengine/network-server'; + +const server = new GameServer({ + port: 3000, + roomConfig: { + maxPlayers: 16, + tickRate: 20 + } +}); + +// 启动服务器 +await server.start(); +console.log('Server started on ws://localhost:3000'); + +// 停止服务器 +await server.stop(); +``` + +### 配置选项 + +| 属性 | 类型 | 描述 | +|------|------|------| +| `port` | `number` | WebSocket 端口 | +| `roomConfig.maxPlayers` | `number` | 房间最大玩家数 | +| `roomConfig.tickRate` | `number` | 同步频率 (Hz) | + +### 房间管理 + +```typescript +// 获取或创建房间 +const room = server.getOrCreateRoom('room-id'); + +// 获取已存在的房间 +const existingRoom = server.getRoom('room-id'); + +// 销毁房间 +server.destroyRoom('room-id'); +``` + +## Room + +Room 类管理单个游戏房间的玩家和状态。 + +### API + +```typescript +class Room { + readonly id: string; + readonly playerCount: number; + readonly isFull: boolean; + + // 添加玩家 + addPlayer(name: string, connection: Connection): IPlayer | null; + + // 移除玩家 + removePlayer(clientId: number): void; + + // 获取玩家 + getPlayer(clientId: number): IPlayer | undefined; + + // 处理输入 + handleInput(clientId: number, input: IPlayerInput): void; + + // 销毁房间 + destroy(): void; +} +``` + +### 玩家接口 + +```typescript +interface IPlayer { + clientId: number; // 客户端 ID + name: string; // 玩家名称 + connection: Connection; // 连接对象 + netId: number; // 网络实体 ID +} +``` + +## 协议类型 + +### 消息类型 + +```typescript +// 状态同步消息 +interface MsgSync { + time: number; + entities: IEntityState[]; +} + +// 实体状态 +interface IEntityState { + netId: number; + pos?: Vec2; + rot?: number; +} + +// 生成消息 +interface MsgSpawn { + netId: number; + ownerId: number; + prefab: string; + pos: Vec2; + rot: number; +} + +// 销毁消息 +interface MsgDespawn { + netId: number; +} + +// 输入消息 +interface MsgInput { + input: IPlayerInput; +} + +// 玩家输入 +interface IPlayerInput { + seq?: number; + moveDir?: Vec2; + actions?: string[]; +} +``` + +### API 类型 + +```typescript +// 加入请求 +interface ReqJoin { + playerName: string; + roomId?: string; +} + +// 加入响应 +interface ResJoin { + clientId: number; + roomId: string; + playerCount: number; +} +``` + +## 使用 CLI 创建服务端 + +推荐使用 ESEngine CLI 快速创建完整的游戏服务端: + +```bash +mkdir my-game-server && cd my-game-server +npm init -y +npx @esengine/cli init -p nodejs +``` + +生成的项目结构: + +``` +my-game-server/ +├── src/ +│ ├── index.ts # 入口文件 +│ ├── server/ +│ │ └── GameServer.ts # 网络服务器配置 +│ └── game/ +│ ├── Game.ts # ECS 游戏主类 +│ ├── scenes/ +│ │ └── MainScene.ts # 主场景 +│ ├── components/ # ECS 组件 +│ │ ├── PositionComponent.ts +│ │ └── VelocityComponent.ts +│ └── systems/ # ECS 系统 +│ └── MovementSystem.ts +├── tsconfig.json +├── package.json +└── README.md +``` + +启动服务端: + +```bash +# 开发模式(热重载) +npm run dev + +# 生产模式 +npm run start +``` + +## 最佳实践 + +1. **合理设置同步频率**:根据游戏类型选择合适的 `tickRate` + - 回合制游戏:5-10 Hz + - 休闲游戏:10-20 Hz + - 动作游戏:20-60 Hz + +2. **房间大小控制**:根据服务器性能设置合理的 `maxPlayers` + +3. **连接管理**:监听玩家连接/断开事件,处理异常情况 + +4. **状态验证**:服务器应验证客户端输入,防止作弊 diff --git a/docs/src/content/docs/modules/network/sync.md b/docs/src/content/docs/modules/network/sync.md new file mode 100644 index 00000000..a674765e --- /dev/null +++ b/docs/src/content/docs/modules/network/sync.md @@ -0,0 +1,174 @@ +--- +title: "状态同步" +description: "插值、预测和快照缓冲区" +--- + +## 快照缓冲区 + +用于存储服务器状态快照并进行插值: + +```typescript +import { createSnapshotBuffer, type IStateSnapshot } from '@esengine/network'; + +const buffer = createSnapshotBuffer({ + maxSnapshots: 30, // 最大快照数 + interpolationDelay: 100 // 插值延迟 (ms) +}); + +// 添加快照 +buffer.addSnapshot({ + time: serverTime, + entities: states +}); + +// 获取插值状态 +const interpolated = buffer.getInterpolatedState(clientTime); +``` + +### 配置选项 + +| 属性 | 类型 | 描述 | +|------|------|------| +| `maxSnapshots` | `number` | 缓冲区最大快照数 | +| `interpolationDelay` | `number` | 插值延迟(毫秒) | + +## 变换插值器 + +### 线性插值器 + +适用于简单的位置插值: + +```typescript +import { createTransformInterpolator } from '@esengine/network'; + +const interpolator = createTransformInterpolator(); + +// 添加状态 +interpolator.addState(time, { x: 0, y: 0, rotation: 0 }); + +// 获取插值结果 +const state = interpolator.getInterpolatedState(currentTime); +``` + +### Hermite 插值器 + +使用 Hermite 样条实现更平滑的插值,适合需要考虑速度的场景: + +```typescript +import { createHermiteTransformInterpolator } from '@esengine/network'; + +const interpolator = createHermiteTransformInterpolator({ + bufferSize: 10 +}); + +// 添加带速度的状态 +interpolator.addState(time, { + x: 100, + y: 200, + rotation: 0, + vx: 5, + vy: 0 +}); + +// 获取平滑的插值结果 +const state = interpolator.getInterpolatedState(currentTime); +``` + +### 插值器对比 + +| 类型 | 优点 | 缺点 | 适用场景 | +|------|------|------|---------| +| 线性插值 | 简单、计算快 | 可能不平滑 | 简单移动 | +| Hermite 插值 | 平滑、考虑速度 | 计算量较大 | 高速移动 | + +## 客户端预测 + +实现客户端预测和服务器校正,减少输入延迟: + +```typescript +import { createClientPrediction } from '@esengine/network'; + +const prediction = createClientPrediction({ + maxPredictedInputs: 60, + reconciliationThreshold: 0.1 +}); + +// 预测输入 +const seq = prediction.predict(inputState, currentState, (state, input) => { + // 应用输入到状态 + return applyInput(state, input); +}); + +// 服务器校正 +const corrected = prediction.reconcile( + serverState, + serverSeq, + (state, input) => applyInput(state, input) +); +``` + +### 预测配置 + +| 属性 | 类型 | 描述 | +|------|------|------| +| `maxPredictedInputs` | `number` | 最大预测输入数 | +| `reconciliationThreshold` | `number` | 校正阈值 | + +### 工作流程 + +``` +客户端 服务器 + │ │ + ├─ 1. 本地预测输入 ──────────────────► + │ │ + ├─ 2. 发送输入到服务器 │ + │ │ + │ ├─ 3. 处理输入 + │ │ + ◄──────────────────── 4. 返回权威状态 + │ │ + ├─ 5. 校正本地状态 │ + │ │ +``` + +## 使用建议 + +### 插值延迟设置 + +- **低延迟网络**(局域网):50-100ms +- **普通网络**:100-150ms +- **高延迟网络**:150-200ms + +```typescript +const buffer = createSnapshotBuffer({ + interpolationDelay: 100 // 根据网络情况调整 +}); +``` + +### 预测校正 + +对于本地玩家使用客户端预测: + +```typescript +// 本地玩家:预测 + 校正 +if (identity.bIsLocalPlayer) { + const predicted = prediction.predict(input, state, applyInput); + // 使用预测状态渲染 +} + +// 远程玩家:纯插值 +if (!identity.bIsLocalPlayer) { + const interpolated = interpolator.getInterpolatedState(time); + // 使用插值状态渲染 +} +``` + +## 最佳实践 + +1. **合理设置插值延迟**:太小会导致抖动,太大会增加延迟感 + +2. **客户端预测仅用于本地玩家**:远程玩家使用插值 + +3. **校正阈值**:根据游戏精度需求设置合适的阈值 + +4. **快照数量**:保持足够的快照以应对网络抖动 diff --git a/package.json b/package.json index 7a10a2b5..f6814eff 100644 --- a/package.json +++ b/package.json @@ -58,9 +58,9 @@ "contributors:add": "all-contributors add", "contributors:generate": "all-contributors generate", "contributors:check": "all-contributors check", - "docs:dev": "vitepress dev docs", - "docs:build": "npm run docs:api && vitepress build docs", - "docs:preview": "vitepress preview docs", + "docs:dev": "pnpm --filter @esengine/docs dev", + "docs:build": "pnpm run docs:api && pnpm --filter @esengine/docs build", + "docs:preview": "pnpm --filter @esengine/docs preview", "docs:api": "typedoc", "docs:api:watch": "typedoc --watch", "update:worker-demo": "npm run build:core && cd examples/worker-system-demo && npm run build && cd ../.. && npm run copy:worker-demo", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 939f1755..f0cda7a8 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -98,13 +98,13 @@ importers: version: 9.39.2(jiti@2.6.1) jest: specifier: ^29.7.0 - version: 29.7.0(@types/node@20.19.27)(ts-node@10.9.2(@swc/core@1.15.7)(@swc/wasm@1.15.7)(@types/node@20.19.27)(typescript@5.9.3)) + version: 29.7.0(@types/node@20.19.27)(ts-node@10.9.2(@swc/core@1.15.7(@swc/helpers@0.5.18))(@swc/wasm@1.15.7)(@types/node@20.19.27)(typescript@5.9.3)) jest-environment-jsdom: specifier: ^29.7.0 version: 29.7.0 lerna: specifier: ^8.1.8 - version: 8.2.4(@swc/core@1.15.7)(@types/node@20.19.27)(encoding@0.1.13) + version: 8.2.4(@swc/core@1.15.7(@swc/helpers@0.5.18))(@types/node@20.19.27)(encoding@0.1.13) prettier: specifier: ^3.6.2 version: 3.7.4 @@ -131,7 +131,7 @@ importers: version: 11.2.0 ts-jest: specifier: ^29.4.0 - version: 29.4.6(@babel/core@7.28.5)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.28.5))(jest-util@29.7.0)(jest@29.7.0(@types/node@20.19.27)(ts-node@10.9.2(@swc/core@1.15.7)(@swc/wasm@1.15.7)(@types/node@20.19.27)(typescript@5.9.3)))(typescript@5.9.3) + version: 29.4.6(@babel/core@7.28.5)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.28.5))(jest-util@29.7.0)(jest@29.7.0(@types/node@20.19.27)(ts-node@10.9.2(@swc/core@1.15.7(@swc/helpers@0.5.18))(@swc/wasm@1.15.7)(@types/node@20.19.27)(typescript@5.9.3)))(typescript@5.9.3) turbo: specifier: ^2.6.1 version: 2.7.2 @@ -152,7 +152,31 @@ importers: version: 22.5.0(@vue/compiler-sfc@3.5.26)(vue-template-compiler@2.7.16) vitepress: specifier: ^1.6.4 - version: 1.6.4(@algolia/client-search@5.46.2)(@types/node@20.19.27)(@types/react@18.3.27)(axios@1.13.2)(postcss@8.5.6)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(search-insights@2.17.3)(terser@5.44.1)(typescript@5.9.3) + version: 1.6.4(@algolia/client-search@5.46.2)(@types/node@20.19.27)(@types/react@18.3.27)(axios@1.13.2)(lightningcss@1.30.2)(postcss@8.5.6)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(search-insights@2.17.3)(terser@5.44.1)(typescript@5.9.3) + + docs: + dependencies: + '@astrojs/starlight': + specifier: ^0.37.1 + version: 0.37.1(astro@5.16.6(@types/node@20.19.27)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.54.0)(terser@5.44.1)(tsx@4.21.0)(typescript@5.9.3)(yaml@2.8.2)) + '@astrojs/vue': + specifier: ^5.1.3 + version: 5.1.3(@types/node@20.19.27)(astro@5.16.6(@types/node@20.19.27)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.54.0)(terser@5.44.1)(tsx@4.21.0)(typescript@5.9.3)(yaml@2.8.2))(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.54.0)(terser@5.44.1)(tsx@4.21.0)(vue@3.5.26(typescript@5.9.3))(yaml@2.8.2) + '@tailwindcss/vite': + specifier: ^4.1.18 + version: 4.1.18(vite@6.4.1(@types/node@20.19.27)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2)) + astro: + specifier: ^5.6.1 + version: 5.16.6(@types/node@20.19.27)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.54.0)(terser@5.44.1)(tsx@4.21.0)(typescript@5.9.3)(yaml@2.8.2) + sharp: + specifier: ^0.34.2 + version: 0.34.5 + tailwindcss: + specifier: ^4.1.18 + version: 4.1.18 + vue: + specifier: ^3.5.26 + version: 3.5.26(typescript@5.9.3) packages/editor/editor-app: dependencies: @@ -321,7 +345,7 @@ importers: devDependencies: '@swc/core': specifier: ^1.13.5 - version: 1.15.7 + version: 1.15.7(@swc/helpers@0.5.18) '@tauri-apps/cli': specifier: ^2.2.0 version: 2.9.6 @@ -336,10 +360,10 @@ importers: version: 18.3.7(@types/react@18.3.27) '@vitejs/plugin-react': specifier: ^4.3.4 - version: 4.7.0(vite@6.4.1(@types/node@20.19.27)(jiti@2.6.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2)) + version: 4.7.0(vite@6.4.1(@types/node@20.19.27)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2)) '@vitejs/plugin-react-swc': specifier: ^4.2.0 - version: 4.2.2(vite@6.4.1(@types/node@20.19.27)(jiti@2.6.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2)) + version: 4.2.2(@swc/helpers@0.5.18)(vite@6.4.1(@types/node@20.19.27)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2)) sharp: specifier: ^0.34.4 version: 0.34.5 @@ -348,16 +372,16 @@ importers: version: 5.9.3 vite: specifier: ^6.0.7 - version: 6.4.1(@types/node@20.19.27)(jiti@2.6.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2) + version: 6.4.1(@types/node@20.19.27)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2) vite-plugin-swc-transform: specifier: ^1.1.1 - version: 1.1.1(rollup@4.54.0)(vite@6.4.1(@types/node@20.19.27)(jiti@2.6.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2)) + version: 1.1.1(@swc/helpers@0.5.18)(rollup@4.54.0)(vite@6.4.1(@types/node@20.19.27)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2)) vite-plugin-top-level-await: specifier: ^1.6.0 - version: 1.6.0(rollup@4.54.0)(vite@6.4.1(@types/node@20.19.27)(jiti@2.6.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2)) + version: 1.6.0(@swc/helpers@0.5.18)(rollup@4.54.0)(vite@6.4.1(@types/node@20.19.27)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2)) vite-plugin-wasm: specifier: ^3.5.0 - version: 3.5.0(vite@6.4.1(@types/node@20.19.27)(jiti@2.6.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2)) + version: 3.5.0(vite@6.4.1(@types/node@20.19.27)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2)) packages/editor/editor-core: dependencies: @@ -424,7 +448,7 @@ importers: version: 9.39.2(jiti@2.6.1) jest: specifier: ^29.7.0 - version: 29.7.0(@types/node@20.19.27)(ts-node@10.9.2(@swc/core@1.15.7)(@swc/wasm@1.15.7)(@types/node@20.19.27)(typescript@5.9.3)) + version: 29.7.0(@types/node@20.19.27)(ts-node@10.9.2(@swc/core@1.15.7(@swc/helpers@0.5.18))(@swc/wasm@1.15.7)(@types/node@20.19.27)(typescript@5.9.3)) react: specifier: ^18.2.0 version: 18.3.1 @@ -442,7 +466,7 @@ importers: version: 7.8.2 ts-jest: specifier: ^29.4.0 - version: 29.4.6(@babel/core@7.28.5)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.28.5))(jest-util@29.7.0)(jest@29.7.0(@types/node@20.19.27)(ts-node@10.9.2(@swc/core@1.15.7)(@swc/wasm@1.15.7)(@types/node@20.19.27)(typescript@5.9.3)))(typescript@5.9.3) + version: 29.4.6(@babel/core@7.28.5)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.28.5))(jest-util@29.7.0)(jest@29.7.0(@types/node@20.19.27)(ts-node@10.9.2(@swc/core@1.15.7(@swc/helpers@0.5.18))(@swc/wasm@1.15.7)(@types/node@20.19.27)(typescript@5.9.3)))(typescript@5.9.3) tsyringe: specifier: ^4.8.0 version: 4.10.0 @@ -512,10 +536,10 @@ importers: version: 5.9.3 vite: specifier: ^6.0.7 - version: 6.4.1(@types/node@20.19.27)(jiti@2.6.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2) + version: 6.4.1(@types/node@20.19.27)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2) vite-plugin-dts: specifier: ^4.5.0 - version: 4.5.4(@types/node@20.19.27)(rollup@4.54.0)(typescript@5.9.3)(vite@6.4.1(@types/node@20.19.27)(jiti@2.6.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2)) + version: 4.5.4(@types/node@20.19.27)(rollup@4.54.0)(typescript@5.9.3)(vite@6.4.1(@types/node@20.19.27)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2)) zustand: specifier: ^5.0.8 version: 5.0.9(@types/react@18.3.27)(react@18.3.1)(use-sync-external-store@1.6.0(react@18.3.1)) @@ -534,7 +558,7 @@ importers: version: 5.0.10 tsup: specifier: ^8.0.0 - version: 8.5.1(@microsoft/api-extractor@7.55.2(@types/node@20.19.27))(@swc/core@1.15.7)(jiti@2.6.1)(postcss@8.5.6)(tsx@4.21.0)(typescript@5.9.3)(yaml@2.8.2) + version: 8.5.1(@microsoft/api-extractor@7.55.2(@types/node@20.19.27))(@swc/core@1.15.7(@swc/helpers@0.5.18))(jiti@2.6.1)(postcss@8.5.6)(tsx@4.21.0)(typescript@5.9.3)(yaml@2.8.2) typescript: specifier: ^5.8.3 version: 5.9.3 @@ -577,7 +601,7 @@ importers: version: 5.0.10 tsup: specifier: ^8.0.0 - version: 8.5.1(@microsoft/api-extractor@7.55.2(@types/node@20.19.27))(@swc/core@1.15.7)(jiti@2.6.1)(postcss@8.5.6)(tsx@4.21.0)(typescript@5.9.3)(yaml@2.8.2) + version: 8.5.1(@microsoft/api-extractor@7.55.2(@types/node@20.19.27))(@swc/core@1.15.7(@swc/helpers@0.5.18))(jiti@2.6.1)(postcss@8.5.6)(tsx@4.21.0)(typescript@5.9.3)(yaml@2.8.2) typescript: specifier: ^5.3.3 version: 5.9.3 @@ -620,7 +644,7 @@ importers: version: 5.0.10 tsup: specifier: ^8.0.0 - version: 8.5.1(@microsoft/api-extractor@7.55.2(@types/node@20.19.27))(@swc/core@1.15.7)(jiti@2.6.1)(postcss@8.5.6)(tsx@4.21.0)(typescript@5.9.3)(yaml@2.8.2) + version: 8.5.1(@microsoft/api-extractor@7.55.2(@types/node@20.19.27))(@swc/core@1.15.7(@swc/helpers@0.5.18))(jiti@2.6.1)(postcss@8.5.6)(tsx@4.21.0)(typescript@5.9.3)(yaml@2.8.2) typescript: specifier: ^5.3.3 version: 5.9.3 @@ -657,7 +681,7 @@ importers: version: 5.0.10 tsup: specifier: ^8.0.0 - version: 8.5.1(@microsoft/api-extractor@7.55.2(@types/node@20.19.27))(@swc/core@1.15.7)(jiti@2.6.1)(postcss@8.5.6)(tsx@4.21.0)(typescript@5.9.3)(yaml@2.8.2) + version: 8.5.1(@microsoft/api-extractor@7.55.2(@types/node@20.19.27))(@swc/core@1.15.7(@swc/helpers@0.5.18))(jiti@2.6.1)(postcss@8.5.6)(tsx@4.21.0)(typescript@5.9.3)(yaml@2.8.2) typescript: specifier: ^5.3.3 version: 5.9.3 @@ -697,7 +721,7 @@ importers: version: 5.0.10 tsup: specifier: ^8.0.0 - version: 8.5.1(@microsoft/api-extractor@7.55.2(@types/node@20.19.27))(@swc/core@1.15.7)(jiti@2.6.1)(postcss@8.5.6)(tsx@4.21.0)(typescript@5.9.3)(yaml@2.8.2) + version: 8.5.1(@microsoft/api-extractor@7.55.2(@types/node@20.19.27))(@swc/core@1.15.7(@swc/helpers@0.5.18))(jiti@2.6.1)(postcss@8.5.6)(tsx@4.21.0)(typescript@5.9.3)(yaml@2.8.2) typescript: specifier: ^5.3.3 version: 5.9.3 @@ -734,7 +758,7 @@ importers: version: 5.0.10 tsup: specifier: ^8.0.0 - version: 8.5.1(@microsoft/api-extractor@7.55.2(@types/node@20.19.27))(@swc/core@1.15.7)(jiti@2.6.1)(postcss@8.5.6)(tsx@4.21.0)(typescript@5.9.3)(yaml@2.8.2) + version: 8.5.1(@microsoft/api-extractor@7.55.2(@types/node@20.19.27))(@swc/core@1.15.7(@swc/helpers@0.5.18))(jiti@2.6.1)(postcss@8.5.6)(tsx@4.21.0)(typescript@5.9.3)(yaml@2.8.2) typescript: specifier: ^5.3.3 version: 5.9.3 @@ -780,7 +804,7 @@ importers: version: 5.0.10 tsup: specifier: ^8.0.0 - version: 8.5.1(@microsoft/api-extractor@7.55.2(@types/node@20.19.27))(@swc/core@1.15.7)(jiti@2.6.1)(postcss@8.5.6)(tsx@4.21.0)(typescript@5.9.3)(yaml@2.8.2) + version: 8.5.1(@microsoft/api-extractor@7.55.2(@types/node@20.19.27))(@swc/core@1.15.7(@swc/helpers@0.5.18))(jiti@2.6.1)(postcss@8.5.6)(tsx@4.21.0)(typescript@5.9.3)(yaml@2.8.2) typescript: specifier: ^5.3.3 version: 5.9.3 @@ -799,7 +823,7 @@ importers: version: 18.3.27 '@vitejs/plugin-react': specifier: ^4.7.0 - version: 4.7.0(vite@6.4.1(@types/node@20.19.27)(jiti@2.6.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2)) + version: 4.7.0(vite@6.4.1(@types/node@20.19.27)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2)) react: specifier: ^18.3.1 version: 18.3.1 @@ -811,10 +835,10 @@ importers: version: 5.9.3 vite: specifier: ^6.0.7 - version: 6.4.1(@types/node@20.19.27)(jiti@2.6.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2) + version: 6.4.1(@types/node@20.19.27)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2) vite-plugin-dts: specifier: ^3.7.0 - version: 3.9.1(@types/node@20.19.27)(rollup@4.54.0)(typescript@5.9.3)(vite@6.4.1(@types/node@20.19.27)(jiti@2.6.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2)) + version: 3.9.1(@types/node@20.19.27)(rollup@4.54.0)(typescript@5.9.3)(vite@6.4.1(@types/node@20.19.27)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2)) zustand: specifier: ^5.0.8 version: 5.0.9(@types/react@18.3.27)(react@18.3.1)(use-sync-external-store@1.6.0(react@18.3.1)) @@ -857,7 +881,7 @@ importers: version: 5.0.10 tsup: specifier: ^8.0.0 - version: 8.5.1(@microsoft/api-extractor@7.55.2(@types/node@20.19.27))(@swc/core@1.15.7)(jiti@2.6.1)(postcss@8.5.6)(tsx@4.21.0)(typescript@5.9.3)(yaml@2.8.2) + version: 8.5.1(@microsoft/api-extractor@7.55.2(@types/node@20.19.27))(@swc/core@1.15.7(@swc/helpers@0.5.18))(jiti@2.6.1)(postcss@8.5.6)(tsx@4.21.0)(typescript@5.9.3)(yaml@2.8.2) typescript: specifier: ^5.3.3 version: 5.9.3 @@ -897,7 +921,7 @@ importers: version: 5.0.10 tsup: specifier: ^8.0.0 - version: 8.5.1(@microsoft/api-extractor@7.55.2(@types/node@20.19.27))(@swc/core@1.15.7)(jiti@2.6.1)(postcss@8.5.6)(tsx@4.21.0)(typescript@5.9.3)(yaml@2.8.2) + version: 8.5.1(@microsoft/api-extractor@7.55.2(@types/node@20.19.27))(@swc/core@1.15.7(@swc/helpers@0.5.18))(jiti@2.6.1)(postcss@8.5.6)(tsx@4.21.0)(typescript@5.9.3)(yaml@2.8.2) typescript: specifier: ^5.3.3 version: 5.9.3 @@ -934,7 +958,7 @@ importers: version: 5.0.10 tsup: specifier: ^8.0.0 - version: 8.5.1(@microsoft/api-extractor@7.55.2(@types/node@20.19.27))(@swc/core@1.15.7)(jiti@2.6.1)(postcss@8.5.6)(tsx@4.21.0)(typescript@5.9.3)(yaml@2.8.2) + version: 8.5.1(@microsoft/api-extractor@7.55.2(@types/node@20.19.27))(@swc/core@1.15.7(@swc/helpers@0.5.18))(jiti@2.6.1)(postcss@8.5.6)(tsx@4.21.0)(typescript@5.9.3)(yaml@2.8.2) typescript: specifier: ^5.3.3 version: 5.9.3 @@ -977,7 +1001,7 @@ importers: version: 5.0.10 tsup: specifier: ^8.0.0 - version: 8.5.1(@microsoft/api-extractor@7.55.2(@types/node@20.19.27))(@swc/core@1.15.7)(jiti@2.6.1)(postcss@8.5.6)(tsx@4.21.0)(typescript@5.9.3)(yaml@2.8.2) + version: 8.5.1(@microsoft/api-extractor@7.55.2(@types/node@20.19.27))(@swc/core@1.15.7(@swc/helpers@0.5.18))(jiti@2.6.1)(postcss@8.5.6)(tsx@4.21.0)(typescript@5.9.3)(yaml@2.8.2) typescript: specifier: ^5.3.3 version: 5.9.3 @@ -1017,7 +1041,7 @@ importers: version: 5.0.10 tsup: specifier: ^8.0.0 - version: 8.5.1(@microsoft/api-extractor@7.55.2(@types/node@20.19.27))(@swc/core@1.15.7)(jiti@2.6.1)(postcss@8.5.6)(tsx@4.21.0)(typescript@5.9.3)(yaml@2.8.2) + version: 8.5.1(@microsoft/api-extractor@7.55.2(@types/node@20.19.27))(@swc/core@1.15.7(@swc/helpers@0.5.18))(jiti@2.6.1)(postcss@8.5.6)(tsx@4.21.0)(typescript@5.9.3)(yaml@2.8.2) typescript: specifier: ^5.3.3 version: 5.9.3 @@ -1057,7 +1081,7 @@ importers: version: 5.0.10 tsup: specifier: ^8.0.0 - version: 8.5.1(@microsoft/api-extractor@7.55.2(@types/node@20.19.27))(@swc/core@1.15.7)(jiti@2.6.1)(postcss@8.5.6)(tsx@4.21.0)(typescript@5.9.3)(yaml@2.8.2) + version: 8.5.1(@microsoft/api-extractor@7.55.2(@types/node@20.19.27))(@swc/core@1.15.7(@swc/helpers@0.5.18))(jiti@2.6.1)(postcss@8.5.6)(tsx@4.21.0)(typescript@5.9.3)(yaml@2.8.2) typescript: specifier: ^5.3.3 version: 5.9.3 @@ -1088,7 +1112,7 @@ importers: version: 5.0.10 tsup: specifier: ^8.0.0 - version: 8.5.1(@microsoft/api-extractor@7.55.2(@types/node@20.19.27))(@swc/core@1.15.7)(jiti@2.6.1)(postcss@8.5.6)(tsx@4.21.0)(typescript@5.9.3)(yaml@2.8.2) + version: 8.5.1(@microsoft/api-extractor@7.55.2(@types/node@20.19.27))(@swc/core@1.15.7(@swc/helpers@0.5.18))(jiti@2.6.1)(postcss@8.5.6)(tsx@4.21.0)(typescript@5.9.3)(yaml@2.8.2) typescript: specifier: ^5.8.3 version: 5.9.3 @@ -1122,7 +1146,7 @@ importers: version: 5.0.10 tsup: specifier: ^8.5.1 - version: 8.5.1(@microsoft/api-extractor@7.55.2(@types/node@20.19.27))(@swc/core@1.15.7)(jiti@2.6.1)(postcss@8.5.6)(tsx@4.21.0)(typescript@5.9.3)(yaml@2.8.2) + version: 8.5.1(@microsoft/api-extractor@7.55.2(@types/node@20.19.27))(@swc/core@1.15.7(@swc/helpers@0.5.18))(jiti@2.6.1)(postcss@8.5.6)(tsx@4.21.0)(typescript@5.9.3)(yaml@2.8.2) typescript: specifier: ^5.8.0 version: 5.9.3 @@ -1151,7 +1175,7 @@ importers: version: 5.0.10 tsup: specifier: ^8.0.0 - version: 8.5.1(@microsoft/api-extractor@7.55.2(@types/node@20.19.27))(@swc/core@1.15.7)(jiti@2.6.1)(postcss@8.5.6)(tsx@4.21.0)(typescript@5.9.3)(yaml@2.8.2) + version: 8.5.1(@microsoft/api-extractor@7.55.2(@types/node@20.19.27))(@swc/core@1.15.7(@swc/helpers@0.5.18))(jiti@2.6.1)(postcss@8.5.6)(tsx@4.21.0)(typescript@5.9.3)(yaml@2.8.2) typescript: specifier: ^5.3.3 version: 5.9.3 @@ -1175,7 +1199,7 @@ importers: version: 5.0.10 tsup: specifier: ^8.0.0 - version: 8.5.1(@microsoft/api-extractor@7.55.2(@types/node@20.19.27))(@swc/core@1.15.7)(jiti@2.6.1)(postcss@8.5.6)(tsx@4.21.0)(typescript@5.9.3)(yaml@2.8.2) + version: 8.5.1(@microsoft/api-extractor@7.55.2(@types/node@20.19.27))(@swc/core@1.15.7(@swc/helpers@0.5.18))(jiti@2.6.1)(postcss@8.5.6)(tsx@4.21.0)(typescript@5.9.3)(yaml@2.8.2) typescript: specifier: ^5.3.3 version: 5.9.3 @@ -1310,7 +1334,7 @@ importers: version: 5.0.10 tsup: specifier: ^8.0.0 - version: 8.5.1(@microsoft/api-extractor@7.55.2(@types/node@20.19.27))(@swc/core@1.15.7)(jiti@2.6.1)(postcss@8.5.6)(tsx@4.21.0)(typescript@5.9.3)(yaml@2.8.2) + version: 8.5.1(@microsoft/api-extractor@7.55.2(@types/node@20.19.27))(@swc/core@1.15.7(@swc/helpers@0.5.18))(jiti@2.6.1)(postcss@8.5.6)(tsx@4.21.0)(typescript@5.9.3)(yaml@2.8.2) typescript: specifier: ^5.3.3 version: 5.9.3 @@ -1341,7 +1365,7 @@ importers: version: 5.0.10 tsup: specifier: ^8.0.0 - version: 8.5.1(@microsoft/api-extractor@7.55.2(@types/node@20.19.27))(@swc/core@1.15.7)(jiti@2.6.1)(postcss@8.5.6)(tsx@4.21.0)(typescript@5.9.3)(yaml@2.8.2) + version: 8.5.1(@microsoft/api-extractor@7.55.2(@types/node@20.19.27))(@swc/core@1.15.7(@swc/helpers@0.5.18))(jiti@2.6.1)(postcss@8.5.6)(tsx@4.21.0)(typescript@5.9.3)(yaml@2.8.2) typescript: specifier: ^5.8.3 version: 5.9.3 @@ -1366,16 +1390,16 @@ importers: version: 20.19.27 jest: specifier: ^29.7.0 - version: 29.7.0(@types/node@20.19.27)(ts-node@10.9.2(@swc/core@1.15.7)(@swc/wasm@1.15.7)(@types/node@20.19.27)(typescript@5.9.3)) + version: 29.7.0(@types/node@20.19.27)(ts-node@10.9.2(@swc/core@1.15.7(@swc/helpers@0.5.18))(@swc/wasm@1.15.7)(@types/node@20.19.27)(typescript@5.9.3)) rimraf: specifier: ^5.0.0 version: 5.0.10 ts-jest: specifier: ^29.4.0 - version: 29.4.6(@babel/core@7.28.5)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.28.5))(jest-util@29.7.0)(jest@29.7.0(@types/node@20.19.27)(ts-node@10.9.2(@swc/core@1.15.7)(@swc/wasm@1.15.7)(@types/node@20.19.27)(typescript@5.9.3)))(typescript@5.9.3) + version: 29.4.6(@babel/core@7.28.5)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.28.5))(jest-util@29.7.0)(jest@29.7.0(@types/node@20.19.27)(ts-node@10.9.2(@swc/core@1.15.7(@swc/helpers@0.5.18))(@swc/wasm@1.15.7)(@types/node@20.19.27)(typescript@5.9.3)))(typescript@5.9.3) tsup: specifier: ^8.0.0 - version: 8.5.1(@microsoft/api-extractor@7.55.2(@types/node@20.19.27))(@swc/core@1.15.7)(jiti@2.6.1)(postcss@8.5.6)(tsx@4.21.0)(typescript@5.9.3)(yaml@2.8.2) + version: 8.5.1(@microsoft/api-extractor@7.55.2(@types/node@20.19.27))(@swc/core@1.15.7(@swc/helpers@0.5.18))(jiti@2.6.1)(postcss@8.5.6)(tsx@4.21.0)(typescript@5.9.3)(yaml@2.8.2) typescript: specifier: ^5.8.3 version: 5.9.3 @@ -1400,7 +1424,7 @@ importers: version: 5.0.10 tsup: specifier: ^8.0.0 - version: 8.5.1(@microsoft/api-extractor@7.55.2(@types/node@20.19.27))(@swc/core@1.15.7)(jiti@2.6.1)(postcss@8.5.6)(tsx@4.21.0)(typescript@5.9.3)(yaml@2.8.2) + version: 8.5.1(@microsoft/api-extractor@7.55.2(@types/node@20.19.27))(@swc/core@1.15.7(@swc/helpers@0.5.18))(jiti@2.6.1)(postcss@8.5.6)(tsx@4.21.0)(typescript@5.9.3)(yaml@2.8.2) typescript: specifier: ^5.8.3 version: 5.9.3 @@ -1452,7 +1476,7 @@ importers: version: 9.39.2(jiti@2.6.1) jest: specifier: ^29.7.0 - version: 29.7.0(@types/node@20.19.27)(ts-node@10.9.2(@swc/core@1.15.7)(@swc/wasm@1.15.7)(@types/node@20.19.27)(typescript@5.9.3)) + version: 29.7.0(@types/node@20.19.27)(ts-node@10.9.2(@swc/core@1.15.7(@swc/helpers@0.5.18))(@swc/wasm@1.15.7)(@types/node@20.19.27)(typescript@5.9.3)) jest-environment-jsdom: specifier: ^29.7.0 version: 29.7.0 @@ -1467,7 +1491,7 @@ importers: version: 6.3.0(rollup@4.54.0)(typescript@5.9.3) ts-jest: specifier: ^29.4.0 - version: 29.4.6(@babel/core@7.28.5)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.28.5))(jest-util@29.7.0)(jest@29.7.0(@types/node@20.19.27)(ts-node@10.9.2(@swc/core@1.15.7)(@swc/wasm@1.15.7)(@types/node@20.19.27)(typescript@5.9.3)))(typescript@5.9.3) + version: 29.4.6(@babel/core@7.28.5)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.28.5))(jest-util@29.7.0)(jest@29.7.0(@types/node@20.19.27)(ts-node@10.9.2(@swc/core@1.15.7(@swc/helpers@0.5.18))(@swc/wasm@1.15.7)(@types/node@20.19.27)(typescript@5.9.3)))(typescript@5.9.3) typescript: specifier: ^5.8.3 version: 5.9.3 @@ -1499,7 +1523,7 @@ importers: version: 5.0.10 tsup: specifier: ^8.0.0 - version: 8.5.1(@microsoft/api-extractor@7.55.2(@types/node@20.19.27))(@swc/core@1.15.7)(jiti@2.6.1)(postcss@8.5.6)(tsx@4.21.0)(typescript@5.9.3)(yaml@2.8.2) + version: 8.5.1(@microsoft/api-extractor@7.55.2(@types/node@20.19.27))(@swc/core@1.15.7(@swc/helpers@0.5.18))(jiti@2.6.1)(postcss@8.5.6)(tsx@4.21.0)(typescript@5.9.3)(yaml@2.8.2) typescript: specifier: ^5.8.3 version: 5.9.3 @@ -1523,7 +1547,7 @@ importers: version: 20.19.27 jest: specifier: ^29.7.0 - version: 29.7.0(@types/node@20.19.27)(ts-node@10.9.2(@swc/core@1.15.7)(@swc/wasm@1.15.7)(@types/node@20.19.27)(typescript@5.9.3)) + version: 29.7.0(@types/node@20.19.27)(ts-node@10.9.2(@swc/core@1.15.7(@swc/helpers@0.5.18))(@swc/wasm@1.15.7)(@types/node@20.19.27)(typescript@5.9.3)) jest-environment-jsdom: specifier: ^29.7.0 version: 29.7.0 @@ -1538,7 +1562,7 @@ importers: version: 6.3.0(rollup@4.54.0)(typescript@5.9.3) ts-jest: specifier: ^29.4.0 - version: 29.4.6(@babel/core@7.28.5)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.28.5))(jest-util@29.7.0)(jest@29.7.0(@types/node@20.19.27)(ts-node@10.9.2(@swc/core@1.15.7)(@swc/wasm@1.15.7)(@types/node@20.19.27)(typescript@5.9.3)))(typescript@5.9.3) + version: 29.4.6(@babel/core@7.28.5)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.28.5))(jest-util@29.7.0)(jest@29.7.0(@types/node@20.19.27)(ts-node@10.9.2(@swc/core@1.15.7(@swc/helpers@0.5.18))(@swc/wasm@1.15.7)(@types/node@20.19.27)(typescript@5.9.3)))(typescript@5.9.3) typescript: specifier: ^5.8.3 version: 5.9.3 @@ -1566,7 +1590,7 @@ importers: version: 5.0.10 tsup: specifier: ^8.0.0 - version: 8.5.1(@microsoft/api-extractor@7.55.2(@types/node@20.19.27))(@swc/core@1.15.7)(jiti@2.6.1)(postcss@8.5.6)(tsx@4.21.0)(typescript@5.9.3)(yaml@2.8.2) + version: 8.5.1(@microsoft/api-extractor@7.55.2(@types/node@20.19.27))(@swc/core@1.15.7(@swc/helpers@0.5.18))(jiti@2.6.1)(postcss@8.5.6)(tsx@4.21.0)(typescript@5.9.3)(yaml@2.8.2) typescript: specifier: ^5.3.3 version: 5.9.3 @@ -1585,10 +1609,10 @@ importers: version: 5.0.10 tsrpc-cli: specifier: ^2.4.5 - version: 2.4.5(@swc/core@1.15.7)(@swc/wasm@1.15.7)(@types/node@20.19.27) + version: 2.4.5(@swc/core@1.15.7(@swc/helpers@0.5.18))(@swc/wasm@1.15.7)(@types/node@20.19.27) tsup: specifier: ^8.0.0 - version: 8.5.1(@microsoft/api-extractor@7.55.2(@types/node@20.19.27))(@swc/core@1.15.7)(jiti@2.6.1)(postcss@8.5.6)(tsx@4.21.0)(typescript@5.9.3)(yaml@2.8.2) + version: 8.5.1(@microsoft/api-extractor@7.55.2(@types/node@20.19.27))(@swc/core@1.15.7(@swc/helpers@0.5.18))(jiti@2.6.1)(postcss@8.5.6)(tsx@4.21.0)(typescript@5.9.3)(yaml@2.8.2) typescript: specifier: ^5.3.3 version: 5.9.3 @@ -1606,7 +1630,7 @@ importers: version: link:../math tsup: specifier: ^8.0.0 - version: 8.5.1(@microsoft/api-extractor@7.55.2(@types/node@20.19.27))(@swc/core@1.15.7)(jiti@2.6.1)(postcss@8.5.6)(tsx@4.21.0)(typescript@5.9.3)(yaml@2.8.2) + version: 8.5.1(@microsoft/api-extractor@7.55.2(@types/node@20.19.27))(@swc/core@1.15.7(@swc/helpers@0.5.18))(jiti@2.6.1)(postcss@8.5.6)(tsx@4.21.0)(typescript@5.9.3)(yaml@2.8.2) typescript: specifier: ^5.8.0 version: 5.9.3 @@ -1634,7 +1658,7 @@ importers: version: 5.0.10 tsup: specifier: ^8.0.0 - version: 8.5.1(@microsoft/api-extractor@7.55.2(@types/node@20.19.27))(@swc/core@1.15.7)(jiti@2.6.1)(postcss@8.5.6)(tsx@4.21.0)(typescript@5.9.3)(yaml@2.8.2) + version: 8.5.1(@microsoft/api-extractor@7.55.2(@types/node@20.19.27))(@swc/core@1.15.7(@swc/helpers@0.5.18))(jiti@2.6.1)(postcss@8.5.6)(tsx@4.21.0)(typescript@5.9.3)(yaml@2.8.2) typescript: specifier: ^5.8.3 version: 5.9.3 @@ -1665,7 +1689,7 @@ importers: version: 5.0.10 tsup: specifier: ^8.0.0 - version: 8.5.1(@microsoft/api-extractor@7.55.2(@types/node@20.19.27))(@swc/core@1.15.7)(jiti@2.6.1)(postcss@8.5.6)(tsx@4.21.0)(typescript@5.9.3)(yaml@2.8.2) + version: 8.5.1(@microsoft/api-extractor@7.55.2(@types/node@20.19.27))(@swc/core@1.15.7(@swc/helpers@0.5.18))(jiti@2.6.1)(postcss@8.5.6)(tsx@4.21.0)(typescript@5.9.3)(yaml@2.8.2) typescript: specifier: ^5.8.3 version: 5.9.3 @@ -1693,7 +1717,7 @@ importers: version: 5.0.10 tsup: specifier: ^8.0.0 - version: 8.5.1(@microsoft/api-extractor@7.55.2(@types/node@20.19.27))(@swc/core@1.15.7)(jiti@2.6.1)(postcss@8.5.6)(tsx@4.21.0)(typescript@5.9.3)(yaml@2.8.2) + version: 8.5.1(@microsoft/api-extractor@7.55.2(@types/node@20.19.27))(@swc/core@1.15.7(@swc/helpers@0.5.18))(jiti@2.6.1)(postcss@8.5.6)(tsx@4.21.0)(typescript@5.9.3)(yaml@2.8.2) typescript: specifier: ^5.8.3 version: 5.9.3 @@ -1712,7 +1736,7 @@ importers: devDependencies: tsup: specifier: ^8.5.1 - version: 8.5.1(@microsoft/api-extractor@7.55.2(@types/node@20.19.27))(@swc/core@1.15.7)(jiti@2.6.1)(postcss@8.5.6)(tsx@4.21.0)(typescript@5.9.3)(yaml@2.8.2) + version: 8.5.1(@microsoft/api-extractor@7.55.2(@types/node@20.19.27))(@swc/core@1.15.7(@swc/helpers@0.5.18))(jiti@2.6.1)(postcss@8.5.6)(tsx@4.21.0)(typescript@5.9.3)(yaml@2.8.2) tsx: specifier: ^4.19.0 version: 4.21.0 @@ -1743,7 +1767,7 @@ importers: version: 5.0.10 tsup: specifier: ^8.0.0 - version: 8.5.1(@microsoft/api-extractor@7.55.2(@types/node@20.19.27))(@swc/core@1.15.7)(jiti@2.6.1)(postcss@8.5.6)(tsx@4.21.0)(typescript@5.9.3)(yaml@2.8.2) + version: 8.5.1(@microsoft/api-extractor@7.55.2(@types/node@20.19.27))(@swc/core@1.15.7(@swc/helpers@0.5.18))(jiti@2.6.1)(postcss@8.5.6)(tsx@4.21.0)(typescript@5.9.3)(yaml@2.8.2) typescript: specifier: ^5.8.3 version: 5.9.3 @@ -1755,7 +1779,7 @@ importers: version: 5.0.10 tsup: specifier: ^8.0.0 - version: 8.5.1(@microsoft/api-extractor@7.55.2(@types/node@20.19.27))(@swc/core@1.15.7)(jiti@2.6.1)(postcss@8.5.6)(tsx@4.21.0)(typescript@5.9.3)(yaml@2.8.2) + version: 8.5.1(@microsoft/api-extractor@7.55.2(@types/node@20.19.27))(@swc/core@1.15.7(@swc/helpers@0.5.18))(jiti@2.6.1)(postcss@8.5.6)(tsx@4.21.0)(typescript@5.9.3)(yaml@2.8.2) typescript: specifier: ^5.0.0 version: 5.9.3 @@ -1776,7 +1800,7 @@ importers: version: 5.0.10 tsup: specifier: ^8.0.0 - version: 8.5.1(@microsoft/api-extractor@7.55.2(@types/node@20.19.27))(@swc/core@1.15.7)(jiti@2.6.1)(postcss@8.5.6)(tsx@4.21.0)(typescript@5.9.3)(yaml@2.8.2) + version: 8.5.1(@microsoft/api-extractor@7.55.2(@types/node@20.19.27))(@swc/core@1.15.7(@swc/helpers@0.5.18))(jiti@2.6.1)(postcss@8.5.6)(tsx@4.21.0)(typescript@5.9.3)(yaml@2.8.2) typescript: specifier: ^5.3.3 version: 5.9.3 @@ -1800,7 +1824,7 @@ importers: version: 5.0.10 tsup: specifier: ^8.0.0 - version: 8.5.1(@microsoft/api-extractor@7.55.2(@types/node@20.19.27))(@swc/core@1.15.7)(jiti@2.6.1)(postcss@8.5.6)(tsx@4.21.0)(typescript@5.9.3)(yaml@2.8.2) + version: 8.5.1(@microsoft/api-extractor@7.55.2(@types/node@20.19.27))(@swc/core@1.15.7(@swc/helpers@0.5.18))(jiti@2.6.1)(postcss@8.5.6)(tsx@4.21.0)(typescript@5.9.3)(yaml@2.8.2) typescript: specifier: ^5.3.3 version: 5.9.3 @@ -1828,7 +1852,7 @@ importers: version: 5.0.10 tsup: specifier: ^8.0.0 - version: 8.5.1(@microsoft/api-extractor@7.55.2(@types/node@20.19.27))(@swc/core@1.15.7)(jiti@2.6.1)(postcss@8.5.6)(tsx@4.21.0)(typescript@5.9.3)(yaml@2.8.2) + version: 8.5.1(@microsoft/api-extractor@7.55.2(@types/node@20.19.27))(@swc/core@1.15.7(@swc/helpers@0.5.18))(jiti@2.6.1)(postcss@8.5.6)(tsx@4.21.0)(typescript@5.9.3)(yaml@2.8.2) typescript: specifier: ^5.8.3 version: 5.9.3 @@ -1862,7 +1886,7 @@ importers: version: 5.0.10 tsup: specifier: ^8.0.0 - version: 8.5.1(@microsoft/api-extractor@7.55.2(@types/node@20.19.27))(@swc/core@1.15.7)(jiti@2.6.1)(postcss@8.5.6)(tsx@4.21.0)(typescript@5.9.3)(yaml@2.8.2) + version: 8.5.1(@microsoft/api-extractor@7.55.2(@types/node@20.19.27))(@swc/core@1.15.7(@swc/helpers@0.5.18))(jiti@2.6.1)(postcss@8.5.6)(tsx@4.21.0)(typescript@5.9.3)(yaml@2.8.2) typescript: specifier: ^5.3.3 version: 5.9.3 @@ -1889,7 +1913,7 @@ importers: version: 5.0.10 tsup: specifier: ^8.0.0 - version: 8.5.1(@microsoft/api-extractor@7.55.2(@types/node@20.19.27))(@swc/core@1.15.7)(jiti@2.6.1)(postcss@8.5.6)(tsx@4.21.0)(typescript@5.9.3)(yaml@2.8.2) + version: 8.5.1(@microsoft/api-extractor@7.55.2(@types/node@20.19.27))(@swc/core@1.15.7(@swc/helpers@0.5.18))(jiti@2.6.1)(postcss@8.5.6)(tsx@4.21.0)(typescript@5.9.3)(yaml@2.8.2) typescript: specifier: ^5.3.3 version: 5.9.3 @@ -1926,7 +1950,7 @@ importers: version: 5.0.10 tsup: specifier: ^8.0.0 - version: 8.5.1(@microsoft/api-extractor@7.55.2(@types/node@20.19.27))(@swc/core@1.15.7)(jiti@2.6.1)(postcss@8.5.6)(tsx@4.21.0)(typescript@5.9.3)(yaml@2.8.2) + version: 8.5.1(@microsoft/api-extractor@7.55.2(@types/node@20.19.27))(@swc/core@1.15.7(@swc/helpers@0.5.18))(jiti@2.6.1)(postcss@8.5.6)(tsx@4.21.0)(typescript@5.9.3)(yaml@2.8.2) typescript: specifier: ^5.3.3 version: 5.9.3 @@ -1953,7 +1977,7 @@ importers: version: 5.0.10 tsup: specifier: ^8.0.0 - version: 8.5.1(@microsoft/api-extractor@7.55.2(@types/node@20.19.27))(@swc/core@1.15.7)(jiti@2.6.1)(postcss@8.5.6)(tsx@4.21.0)(typescript@5.9.3)(yaml@2.8.2) + version: 8.5.1(@microsoft/api-extractor@7.55.2(@types/node@20.19.27))(@swc/core@1.15.7(@swc/helpers@0.5.18))(jiti@2.6.1)(postcss@8.5.6)(tsx@4.21.0)(typescript@5.9.3)(yaml@2.8.2) typescript: specifier: ^5.3.3 version: 5.9.3 @@ -1990,7 +2014,7 @@ importers: version: 5.0.10 tsup: specifier: ^8.0.0 - version: 8.5.1(@microsoft/api-extractor@7.55.2(@types/node@20.19.27))(@swc/core@1.15.7)(jiti@2.6.1)(postcss@8.5.6)(tsx@4.21.0)(typescript@5.9.3)(yaml@2.8.2) + version: 8.5.1(@microsoft/api-extractor@7.55.2(@types/node@20.19.27))(@swc/core@1.15.7(@swc/helpers@0.5.18))(jiti@2.6.1)(postcss@8.5.6)(tsx@4.21.0)(typescript@5.9.3)(yaml@2.8.2) typescript: specifier: ^5.8.3 version: 5.9.3 @@ -2012,7 +2036,7 @@ importers: devDependencies: tsup: specifier: ^8.0.1 - version: 8.5.1(@microsoft/api-extractor@7.55.2(@types/node@20.19.27))(@swc/core@1.15.7)(jiti@2.6.1)(postcss@8.5.6)(tsx@4.21.0)(typescript@5.9.3)(yaml@2.8.2) + version: 8.5.1(@microsoft/api-extractor@7.55.2(@types/node@20.19.27))(@swc/core@1.15.7(@swc/helpers@0.5.18))(jiti@2.6.1)(postcss@8.5.6)(tsx@4.21.0)(typescript@5.9.3)(yaml@2.8.2) typescript: specifier: ^5.3.3 version: 5.9.3 @@ -2021,19 +2045,19 @@ importers: devDependencies: '@vitejs/plugin-react': specifier: ^4.3.4 - version: 4.7.0(vite@6.4.1(@types/node@20.19.27)(jiti@2.6.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2)) + version: 4.7.0(vite@6.4.1(@types/node@20.19.27)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2)) tsup: specifier: ^8.0.0 - version: 8.5.1(@microsoft/api-extractor@7.55.2(@types/node@20.19.27))(@swc/core@1.15.7)(jiti@2.6.1)(postcss@8.5.6)(tsx@4.21.0)(typescript@5.9.3)(yaml@2.8.2) + version: 8.5.1(@microsoft/api-extractor@7.55.2(@types/node@20.19.27))(@swc/core@1.15.7(@swc/helpers@0.5.18))(jiti@2.6.1)(postcss@8.5.6)(tsx@4.21.0)(typescript@5.9.3)(yaml@2.8.2) typescript: specifier: ^5.8.3 version: 5.9.3 vite: specifier: ^6.3.5 - version: 6.4.1(@types/node@20.19.27)(jiti@2.6.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2) + version: 6.4.1(@types/node@20.19.27)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2) vite-plugin-dts: specifier: ^4.5.4 - version: 4.5.4(@types/node@20.19.27)(rollup@4.54.0)(typescript@5.9.3)(vite@6.4.1(@types/node@20.19.27)(jiti@2.6.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2)) + version: 4.5.4(@types/node@20.19.27)(rollup@4.54.0)(typescript@5.9.3)(vite@6.4.1(@types/node@20.19.27)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2)) packages/tools/cli: dependencies: @@ -2132,7 +2156,7 @@ importers: version: 5.0.10 tsup: specifier: ^8.0.0 - version: 8.5.1(@microsoft/api-extractor@7.55.2(@types/node@20.19.27))(@swc/core@1.15.7)(jiti@2.6.1)(postcss@8.5.6)(tsx@4.21.0)(typescript@5.9.3)(yaml@2.8.2) + version: 8.5.1(@microsoft/api-extractor@7.55.2(@types/node@20.19.27))(@swc/core@1.15.7(@swc/helpers@0.5.18))(jiti@2.6.1)(postcss@8.5.6)(tsx@4.21.0)(typescript@5.9.3)(yaml@2.8.2) typescript: specifier: ^5.3.3 version: 5.9.3 @@ -2237,6 +2261,47 @@ packages: '@antfu/install-pkg@1.1.0': resolution: {integrity: sha512-MGQsmw10ZyI+EJo45CdSER4zEb+p31LpDAFp2Z3gkSd1yqVZGi0Ebx++YTEMonJy4oChEMLsxZ64j8FH6sSqtQ==} + '@antfu/utils@0.7.10': + resolution: {integrity: sha512-+562v9k4aI80m1+VuMHehNJWLOFjBnXn3tdOitzD0il5b7smkSBal4+a3oKiQTbrwMmN/TBUMDvbdoWDehgOww==} + + '@astrojs/compiler@2.13.0': + resolution: {integrity: sha512-mqVORhUJViA28fwHYaWmsXSzLO9osbdZ5ImUfxBarqsYdMlPbqAqGJCxsNzvppp1BEzc1mJNjOVvQqeDN8Vspw==} + + '@astrojs/internal-helpers@0.7.5': + resolution: {integrity: sha512-vreGnYSSKhAjFJCWAwe/CNhONvoc5lokxtRoZims+0wa3KbHBdPHSSthJsKxPd8d/aic6lWKpRTYGY/hsgK6EA==} + + '@astrojs/markdown-remark@6.3.10': + resolution: {integrity: sha512-kk4HeYR6AcnzC4QV8iSlOfh+N8TZ3MEStxPyenyCtemqn8IpEATBFMTJcfrNW32dgpt6MY3oCkMM/Tv3/I4G3A==} + + '@astrojs/mdx@4.3.13': + resolution: {integrity: sha512-IHDHVKz0JfKBy3//52JSiyWv089b7GVSChIXLrlUOoTLWowG3wr2/8hkaEgEyd/vysvNQvGk+QhysXpJW5ve6Q==} + engines: {node: 18.20.8 || ^20.3.0 || >=22.0.0} + peerDependencies: + astro: ^5.0.0 + + '@astrojs/prism@3.3.0': + resolution: {integrity: sha512-q8VwfU/fDZNoDOf+r7jUnMC2//H2l0TuQ6FkGJL8vD8nw/q5KiL3DS1KKBI3QhI9UQhpJ5dc7AtqfbXWuOgLCQ==} + engines: {node: 18.20.8 || ^20.3.0 || >=22.0.0} + + '@astrojs/sitemap@3.6.0': + resolution: {integrity: sha512-4aHkvcOZBWJigRmMIAJwRQXBS+ayoP5z40OklTXYXhUDhwusz+DyDl+nSshY6y9DvkVEavwNcFO8FD81iGhXjg==} + + '@astrojs/starlight@0.37.1': + resolution: {integrity: sha512-STNsR5PaDoiW4IgcX17Fp42FfyqwuweWPts/EWEMcFPAeg9Nvpu3UvVCorasYrgfJgaJTeydsOV++0ACA1KYDA==} + peerDependencies: + astro: ^5.5.0 + + '@astrojs/telemetry@3.3.0': + resolution: {integrity: sha512-UFBgfeldP06qu6khs/yY+q1cDAaArM2/7AEIqQ9Cuvf7B1hNLq0xDrZkct+QoIGyjq56y8IaE2I3CTvG99mlhQ==} + engines: {node: 18.20.8 || ^20.3.0 || >=22.0.0} + + '@astrojs/vue@5.1.3': + resolution: {integrity: sha512-4721964tsbx6Y+rXHYOOJc8QAXUvW3wfiy82hU7aVqGaE5SFtrrTD/OHICe1r03rUpTZ7nKKUPWW5dRYAigC3Q==} + engines: {node: 18.20.8 || ^20.3.0 || >=22.0.0} + peerDependencies: + astro: ^5.0.0 + vue: ^3.2.30 + '@babel/code-frame@7.27.1': resolution: {integrity: sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==} engines: {node: '>=6.9.0'} @@ -2375,6 +2440,12 @@ packages: peerDependencies: '@babel/core': ^7.0.0 + '@babel/plugin-proposal-decorators@7.28.0': + resolution: {integrity: sha512-zOiZqvANjWDUaUS9xMxbMcK/Zccztbe/6ikvUXaG9nsPH3w6qh5UaPGAnirI/WhIbZ8m3OHU0ReyPrknG+ZKeg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + '@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2': resolution: {integrity: sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==} engines: {node: '>=6.9.0'} @@ -2402,6 +2473,12 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 + '@babel/plugin-syntax-decorators@7.27.1': + resolution: {integrity: sha512-YMq8Z87Lhl8EGkmb0MwYkt36QnxC+fzCgrl66ereamPlYToRpIk5nUjKUY3QKLWq8mwUB1BgbeXcTJhZOCDg5A==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + '@babel/plugin-syntax-import-assertions@7.27.1': resolution: {integrity: sha512-UT/Jrhw57xg4ILHLFnzFpPDlMbcdEicaAtjPQpbj9wa8T4r5KVWCimHcL/460g8Ht0DMxDyjsLgiWSkVjnwPFg==} engines: {node: '>=6.9.0'} @@ -2778,6 +2855,12 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-typescript@7.28.5': + resolution: {integrity: sha512-x2Qa+v/CuEoX7Dr31iAfr0IhInrVOWZU/2vJMJ00FOR/2nM0BcBEclpaf9sWCDc+v5e9dMrhSH8/atq/kX7+bA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-unicode-escapes@7.27.1': resolution: {integrity: sha512-Ysg4v6AmF26k9vpfFuTZg8HRfVWzsh1kVfowA23y9j/Gu6dOuahdUVhkLqpObp3JIv27MLSii6noRnuKN8H0Mg==} engines: {node: '>=6.9.0'} @@ -2832,6 +2915,10 @@ packages: '@bcoe/v8-coverage@0.2.3': resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==} + '@capsizecss/unpack@3.0.1': + resolution: {integrity: sha512-8XqW8xGn++Eqqbz3e9wKuK7mxryeRjs4LOHLxbh2lwKeSbuNR4NFifDZT4KzvjU6HMOPbiNTsWpniK5EJfTWkg==} + engines: {node: '>=18'} + '@changesets/apply-release-plan@7.0.14': resolution: {integrity: sha512-ddBvf9PHdy2YY0OUiEl3TV78mH9sckndJR14QAt87KLEbIov81XO0q0QAmvooBxXlqRRP8I9B7XOzZwQG7JkWA==} @@ -2970,6 +3057,10 @@ packages: resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==} engines: {node: '>=12'} + '@ctrl/tinycolor@4.2.0': + resolution: {integrity: sha512-kzyuwOAQnXJNLS9PSyrk0CWk35nWJW/zl/6KvnTBMFK65gm7U1/Z5BqjxeapjZCIhQcM/DsrEmcbRwDyXyXK4A==} + engines: {node: '>=14'} + '@docsearch/css@3.8.2': resolution: {integrity: sha512-y05ayQFyUmCXze79+56v/4HpycYF3uFqB78pLPrSV5ZKAlDuIAAJNhaRi8tTdRNXh05yxX/TyNnzD6LwSM89vQ==} @@ -3490,6 +3581,18 @@ packages: resolution: {integrity: sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@expressive-code/core@0.41.5': + resolution: {integrity: sha512-II5TEy5eOoXiqPwqtpSqwamUd7lZS3YH3ofxR1ZyQMmygqORZn8/7SzgfF8G0kB7uKCBzFZT6RgKgCuHcJuPpA==} + + '@expressive-code/plugin-frames@0.41.5': + resolution: {integrity: sha512-qU0cvAQGfRLX7XwGf3/+hqIVmAc/mNNTlqVLR0iBfJF6EKvtP3R7/uAlPrAxnxQxn0meTazCz8D+PsPyOpHKrQ==} + + '@expressive-code/plugin-shiki@0.41.5': + resolution: {integrity: sha512-gw6OWvnmDmvcKJ5AZSzl2VkuixJMQ/zWSwPLFNzitqCa8aPfIFunb0K8IIOsE43LELgOWkie9lRFspOxwDVwrg==} + + '@expressive-code/plugin-text-markers@0.41.5': + resolution: {integrity: sha512-0DSiTsjWFEz6/iuLOGNNy2GaeCW41OwnVJMKx1tS+XKeQxAL89UkZP3egWNzxjWNHNMzEv3ZWWWYqbonEQlv/Q==} + '@gerrit0/mini-shiki@3.20.0': resolution: {integrity: sha512-Wa57i+bMpK6PGJZ1f2myxo3iO+K/kZikcyvH8NIqNNZhQUbDav7V9LQmWOXhf946mz5c1NZ19WMsGYiDKTryzQ==} @@ -3792,6 +3895,9 @@ packages: '@manypkg/get-packages@1.1.3': resolution: {integrity: sha512-fo+QhuU3qE/2TQMQmbVMqaQ6EWbMhi4ABWP+O4AM1NqPBuy0OrApV5LO6BrrgnhtAHS2NH6RrVk9OL181tTi8A==} + '@mdx-js/mdx@3.1.1': + resolution: {integrity: sha512-f6ZO2ifpwAQIpzGWaBQT2TXxPv6z3RBzQKpVftEWN78Vl/YweF1uwussDx8ECAXVtr3Rs89fKyG9YlzUs9DyGQ==} + '@microsoft/api-extractor-model@7.28.13': resolution: {integrity: sha512-39v/JyldX4MS9uzHcdfmjjfS6cYGAoXV+io8B5a338pkHiSt+gy2eXQ0Q7cGFJ7quSa1VqqlMdlPrB6sLR/cAw==} @@ -4093,6 +4199,42 @@ packages: '@octokit/types@14.1.0': resolution: {integrity: sha512-1y6DgTy8Jomcpu33N+p5w58l6xyt55Ar2I91RPiIA0xCJBXyUAhXCcmZaDWSANiha7R9a6qJJ2CRomGPZ6f46g==} + '@oslojs/encoding@1.1.0': + resolution: {integrity: sha512-70wQhgYmndg4GCPxPPxPGevRKqTIJ2Nh4OkiMWmDAVYsTQ+Ta7Sq+rPevXyXGdzr30/qZBnyOalCszoMxlyldQ==} + + '@pagefind/darwin-arm64@1.4.0': + resolution: {integrity: sha512-2vMqkbv3lbx1Awea90gTaBsvpzgRs7MuSgKDxW0m9oV1GPZCZbZBJg/qL83GIUEN2BFlY46dtUZi54pwH+/pTQ==} + cpu: [arm64] + os: [darwin] + + '@pagefind/darwin-x64@1.4.0': + resolution: {integrity: sha512-e7JPIS6L9/cJfow+/IAqknsGqEPjJnVXGjpGm25bnq+NPdoD3c/7fAwr1OXkG4Ocjx6ZGSCijXEV4ryMcH2E3A==} + cpu: [x64] + os: [darwin] + + '@pagefind/default-ui@1.4.0': + resolution: {integrity: sha512-wie82VWn3cnGEdIjh4YwNESyS1G6vRHwL6cNjy9CFgNnWW/PGRjsLq300xjVH5sfPFK3iK36UxvIBymtQIEiSQ==} + + '@pagefind/freebsd-x64@1.4.0': + resolution: {integrity: sha512-WcJVypXSZ+9HpiqZjFXMUobfFfZZ6NzIYtkhQ9eOhZrQpeY5uQFqNWLCk7w9RkMUwBv1HAMDW3YJQl/8OqsV0Q==} + cpu: [x64] + os: [freebsd] + + '@pagefind/linux-arm64@1.4.0': + resolution: {integrity: sha512-PIt8dkqt4W06KGmQjONw7EZbhDF+uXI7i0XtRLN1vjCUxM9vGPdtJc2mUyVPevjomrGz5M86M8bqTr6cgDp1Uw==} + cpu: [arm64] + os: [linux] + + '@pagefind/linux-x64@1.4.0': + resolution: {integrity: sha512-z4oddcWwQ0UHrTHR8psLnVlz6USGJ/eOlDPTDYZ4cI8TK8PgwRUPQZp9D2iJPNIPcS6Qx/E4TebjuGJOyK8Mmg==} + cpu: [x64] + os: [linux] + + '@pagefind/windows-x64@1.4.0': + resolution: {integrity: sha512-NkT+YAdgS2FPCn8mIA9bQhiBs+xmniMGq1LFPDhcFn0+2yIUEiIG06t7bsZlhdjknEQRTSdT7YitP6fC5qwP0g==} + cpu: [x64] + os: [win32] + '@pkgjs/parseargs@0.11.0': resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} engines: {node: '>=14'} @@ -4109,6 +4251,9 @@ packages: resolution: {integrity: sha512-c83qWb22rNRuB0UaVCI0uRPNRr8Z0FWnEIvT47jiHAmOIUHbBOg5XvV7pM5x+rKn9HRpjxquDbXYSXr3fAKFcw==} engines: {node: '>=12'} + '@polka/url@1.0.0-next.29': + resolution: {integrity: sha512-wwQAWhWSuHaag8c4q/KN/vCoeOJYshAIvMQwD4GpSb3OiZklFfvAgmj0VCBBImRpuF/aFgIRzllXlVX93Jevww==} + '@protobufjs/aspromise@1.1.2': resolution: {integrity: sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==} @@ -4452,9 +4597,15 @@ packages: '@shikijs/core@2.5.0': resolution: {integrity: sha512-uu/8RExTKtavlpH7XqnVYBrfBkUc20ngXiX9NSrBhOVZYv/7XQRKUyhtkeflY5QsxC0GbJThCerruZfsUaSldg==} + '@shikijs/core@3.20.0': + resolution: {integrity: sha512-f2ED7HYV4JEk827mtMDwe/yQ25pRiXZmtHjWF8uzZKuKiEsJR7Ce1nuQ+HhV9FzDcbIo4ObBCD9GPTzNuy9S1g==} + '@shikijs/engine-javascript@2.5.0': resolution: {integrity: sha512-VjnOpnQf8WuCEZtNUdjjwGUbtAVKuZkVQ/5cHy/tojVVRIRtlWMYVjyWhxOmIq05AlSOv72z7hRNRGVBgQOl0w==} + '@shikijs/engine-javascript@3.20.0': + resolution: {integrity: sha512-OFx8fHAZuk7I42Z9YAdZ95To6jDePQ9Rnfbw9uSRTSbBhYBp1kEOKv/3jOimcj3VRUKusDYM6DswLauwfhboLg==} + '@shikijs/engine-oniguruma@2.5.0': resolution: {integrity: sha512-pGd1wRATzbo/uatrCIILlAdFVKdxImWJGQ5rFiB5VZi2ve5xj3Ax9jny8QvkaV93btQEwR/rSz5ERFpC5mKNIw==} @@ -4619,12 +4770,105 @@ packages: '@swc/counter@0.1.3': resolution: {integrity: sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==} + '@swc/helpers@0.5.18': + resolution: {integrity: sha512-TXTnIcNJQEKwThMMqBXsZ4VGAza6bvN4pa41Rkqoio6QBKMvo+5lexeTMScGCIxtzgQJzElcvIltani+adC5PQ==} + '@swc/types@0.1.25': resolution: {integrity: sha512-iAoY/qRhNH8a/hBvm3zKj9qQ4oc2+3w1unPJa2XvTK3XjeLXtzcCingVPw/9e5mn1+0yPqxcBGp9Jf0pkfMb1g==} '@swc/wasm@1.15.7': resolution: {integrity: sha512-m1Cslgkp7gFIUB2ZiIUHMoUskwxOAi9uaf27inoKb7Oc8MkMjt+eNTeSyeGckkwRtMQiybKYTGGnA5imxSsedQ==} + '@tailwindcss/node@4.1.18': + resolution: {integrity: sha512-DoR7U1P7iYhw16qJ49fgXUlry1t4CpXeErJHnQ44JgTSKMaZUdf17cfn5mHchfJ4KRBZRFA/Coo+MUF5+gOaCQ==} + + '@tailwindcss/oxide-android-arm64@4.1.18': + resolution: {integrity: sha512-dJHz7+Ugr9U/diKJA0W6N/6/cjI+ZTAoxPf9Iz9BFRF2GzEX8IvXxFIi/dZBloVJX/MZGvRuFA9rqwdiIEZQ0Q==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [android] + + '@tailwindcss/oxide-darwin-arm64@4.1.18': + resolution: {integrity: sha512-Gc2q4Qhs660bhjyBSKgq6BYvwDz4G+BuyJ5H1xfhmDR3D8HnHCmT/BSkvSL0vQLy/nkMLY20PQ2OoYMO15Jd0A==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [darwin] + + '@tailwindcss/oxide-darwin-x64@4.1.18': + resolution: {integrity: sha512-FL5oxr2xQsFrc3X9o1fjHKBYBMD1QZNyc1Xzw/h5Qu4XnEBi3dZn96HcHm41c/euGV+GRiXFfh2hUCyKi/e+yw==} + engines: {node: '>= 10'} + cpu: [x64] + os: [darwin] + + '@tailwindcss/oxide-freebsd-x64@4.1.18': + resolution: {integrity: sha512-Fj+RHgu5bDodmV1dM9yAxlfJwkkWvLiRjbhuO2LEtwtlYlBgiAT4x/j5wQr1tC3SANAgD+0YcmWVrj8R9trVMA==} + engines: {node: '>= 10'} + cpu: [x64] + os: [freebsd] + + '@tailwindcss/oxide-linux-arm-gnueabihf@4.1.18': + resolution: {integrity: sha512-Fp+Wzk/Ws4dZn+LV2Nqx3IilnhH51YZoRaYHQsVq3RQvEl+71VGKFpkfHrLM/Li+kt5c0DJe/bHXK1eHgDmdiA==} + engines: {node: '>= 10'} + cpu: [arm] + os: [linux] + + '@tailwindcss/oxide-linux-arm64-gnu@4.1.18': + resolution: {integrity: sha512-S0n3jboLysNbh55Vrt7pk9wgpyTTPD0fdQeh7wQfMqLPM/Hrxi+dVsLsPrycQjGKEQk85Kgbx+6+QnYNiHalnw==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + + '@tailwindcss/oxide-linux-arm64-musl@4.1.18': + resolution: {integrity: sha512-1px92582HkPQlaaCkdRcio71p8bc8i/ap5807tPRDK/uw953cauQBT8c5tVGkOwrHMfc2Yh6UuxaH4vtTjGvHg==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + + '@tailwindcss/oxide-linux-x64-gnu@4.1.18': + resolution: {integrity: sha512-v3gyT0ivkfBLoZGF9LyHmts0Isc8jHZyVcbzio6Wpzifg/+5ZJpDiRiUhDLkcr7f/r38SWNe7ucxmGW3j3Kb/g==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + + '@tailwindcss/oxide-linux-x64-musl@4.1.18': + resolution: {integrity: sha512-bhJ2y2OQNlcRwwgOAGMY0xTFStt4/wyU6pvI6LSuZpRgKQwxTec0/3Scu91O8ir7qCR3AuepQKLU/kX99FouqQ==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + + '@tailwindcss/oxide-wasm32-wasi@4.1.18': + resolution: {integrity: sha512-LffYTvPjODiP6PT16oNeUQJzNVyJl1cjIebq/rWWBF+3eDst5JGEFSc5cWxyRCJ0Mxl+KyIkqRxk1XPEs9x8TA==} + engines: {node: '>=14.0.0'} + cpu: [wasm32] + bundledDependencies: + - '@napi-rs/wasm-runtime' + - '@emnapi/core' + - '@emnapi/runtime' + - '@tybys/wasm-util' + - '@emnapi/wasi-threads' + - tslib + + '@tailwindcss/oxide-win32-arm64-msvc@4.1.18': + resolution: {integrity: sha512-HjSA7mr9HmC8fu6bdsZvZ+dhjyGCLdotjVOgLA2vEqxEBZaQo9YTX4kwgEvPCpRh8o4uWc4J/wEoFzhEmjvPbA==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [win32] + + '@tailwindcss/oxide-win32-x64-msvc@4.1.18': + resolution: {integrity: sha512-bJWbyYpUlqamC8dpR7pfjA0I7vdF6t5VpUGMWRkXVE3AXgIZjYUYAK7II1GNaxR8J1SSrSrppRar8G++JekE3Q==} + engines: {node: '>= 10'} + cpu: [x64] + os: [win32] + + '@tailwindcss/oxide@4.1.18': + resolution: {integrity: sha512-EgCR5tTS5bUSKQgzeMClT6iCY3ToqE1y+ZB0AKldj809QXk1Y+3jB0upOYZrn9aGIzPtUsP7sX4QQ4XtjBB95A==} + engines: {node: '>= 10'} + + '@tailwindcss/vite@4.1.18': + resolution: {integrity: sha512-jVA+/UpKL1vRLg6Hkao5jldawNmRo7mQYrZtNHMIVpLfLhDml5nMRUo/8MwoX2vNXvnaXNNMedrMfMugAVX1nA==} + peerDependencies: + vite: ^5.2.0 || ^6 || ^7 + '@tauri-apps/api@2.9.1': resolution: {integrity: sha512-IGlhP6EivjXHepbBic618GOmiWe4URJiIeZFlB7x3czM0yDHHYviH1Xvoiv4FefdkQtn6v7TuwWCRfOGdnVUGw==} @@ -4783,6 +5027,9 @@ packages: '@types/express@5.0.6': resolution: {integrity: sha512-sKYVuV7Sv9fbPIt/442koC7+IIwK5olP1KWeD88e/idgoJqDm3JV/YUiPwkoKK92ylff2MGxSz1CSjsXelx0YA==} + '@types/fontkit@2.0.8': + resolution: {integrity: sha512-wN+8bYxIpJf+5oZdrdtaX04qUuWHcKxcDEgRS9Qm9ZClSHjzEn13SxUC+5eRM+4yXIeTYk8mTzLAWGF64847ew==} + '@types/graceful-fs@4.1.9': resolution: {integrity: sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==} @@ -4804,6 +5051,9 @@ packages: '@types/jest@29.5.14': resolution: {integrity: sha512-ZN+4sdnLUbo8EVvVc2ao0GFW6oVrQRPn4K2lglySj7APvSrgzxHiNNK99us4WDMi57xxA2yggblIAMNhXOotLQ==} + '@types/js-yaml@4.0.9': + resolution: {integrity: sha512-k4MGaQl5TGo/iipqb2UDG2UwjXziSWkh0uysQelTlJpX1qGlpUZYm8PnO4DxG1qBomtJUdYJ6qR6xdIah10JLg==} + '@types/jsdom@20.0.1': resolution: {integrity: sha512-d0r18sZPmMQr1eG35u12FZfhIXNrnsPU/g5wvRKCUf/tOGilKKwYMYGqh33BNR6ba+2gkHw1EUiHoN3mn7E5IQ==} @@ -4822,6 +5072,9 @@ packages: '@types/mdurl@2.0.0': resolution: {integrity: sha512-RGdgjQUZba5p6QEFAVx2OGb8rQDL/cPRG7GiedRzMcJ1tYnUANBncjbSB1NRGwbvjcPeikRABz2nshyPk1bhWg==} + '@types/mdx@2.0.13': + resolution: {integrity: sha512-+OWZQfAYyio6YkJb3HLxDrvnx6SWWDbC0zVPfBRzUk0/nqoDyf6dNxQi3eArPe8rJ473nobTMQ/8Zk+LxJ+Yuw==} + '@types/minimatch@3.0.5': resolution: {integrity: sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ==} @@ -4834,9 +5087,15 @@ packages: '@types/multer@1.4.13': resolution: {integrity: sha512-bhhdtPw7JqCiEfC9Jimx5LqX9BDIPJEh2q/fQ4bqbBPtyEZYr3cvF22NwG0DmPZNYA0CAf2CnqDB4KIGGpJcaw==} + '@types/nlcst@2.0.3': + resolution: {integrity: sha512-vSYNSDe6Ix3q+6Z7ri9lyWqgGhJTmzRjZRqyq15N0Z/1/UnVsno9G/N40NBijoYx2seFDIl0+B2mgAb9mezUCA==} + '@types/node@12.20.55': resolution: {integrity: sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==} + '@types/node@17.0.45': + resolution: {integrity: sha512-w+tIMs3rq2afQdsPJlODhoUEKzFP1ayaoyl1CcnwtIlsVe7K7bA1NGm4s3PraqTLlXnbIN84zuBlxBWo1u9BLw==} + '@types/node@20.19.27': resolution: {integrity: sha512-N2clP5pJhB2YnZJ3PIHFk5RkygRX5WO/5f0WC08tp0wd+sv0rsJk3MqWn3CbNmT2J505a5336jaQj4ph1AdMug==} @@ -4869,6 +5128,9 @@ packages: '@types/resolve@1.20.2': resolution: {integrity: sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q==} + '@types/sax@1.2.7': + resolution: {integrity: sha512-rO73L89PJxeYM3s3pPPjiPgVVcymqU490g0YO5n5By0k2Erzj6tay/4lr1CHAAU4JyOWd1rpQ8bCf6cZfHU96A==} + '@types/send@1.2.1': resolution: {integrity: sha512-arsCikDvlU99zl1g69TcAB3mzZPpxgw0UQnaHeC1Nwb015xp8bknZv5rIfri9xTOcMuaVgvabfIRA7PSZVuZIQ==} @@ -4979,6 +5241,20 @@ packages: peerDependencies: vite: ^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 + '@vitejs/plugin-vue-jsx@4.2.0': + resolution: {integrity: sha512-DSTrmrdLp+0LDNF77fqrKfx7X0ErRbOcUAgJL/HbSesqQwoUvUQ4uYQqaex+rovqgGcoPqVk+AwUh3v9CuiYIw==} + engines: {node: ^18.0.0 || >=20.0.0} + peerDependencies: + vite: ^5.0.0 || ^6.0.0 + vue: ^3.0.0 + + '@vitejs/plugin-vue@5.2.1': + resolution: {integrity: sha512-cxh314tzaWwOLqVes2gnnCtvBDcM1UMdn+iFR+UjAn411dPT3tOmqrJjbMd7koZpMAmBM/GqeV4n9ge7JSiJJQ==} + engines: {node: ^18.0.0 || >=20.0.0} + peerDependencies: + vite: ^5.0.0 || ^6.0.0 + vue: ^3.2.25 + '@vitejs/plugin-vue@5.2.4': resolution: {integrity: sha512-7Yx/SXSOcQq5HiiV3orevHUFn+pmMB4cgbEkDYgnkUWb0WfeQ/wa2yFv6D5ICiCQOVpjA7vYDXrC7AGO8yjDHA==} engines: {node: ^18.0.0 || >=20.0.0} @@ -5004,6 +5280,22 @@ packages: '@volar/typescript@2.4.27': resolution: {integrity: sha512-eWaYCcl/uAPInSK2Lze6IqVWaBu/itVqR5InXcHXFyles4zO++Mglt3oxdgj75BDcv1Knr9Y93nowS8U3wqhxg==} + '@vue/babel-helper-vue-transform-on@1.5.0': + resolution: {integrity: sha512-0dAYkerNhhHutHZ34JtTl2czVQHUNWv6xEbkdF5W+Yrv5pCWsqjeORdOgbtW2I9gWlt+wBmVn+ttqN9ZxR5tzA==} + + '@vue/babel-plugin-jsx@1.5.0': + resolution: {integrity: sha512-mneBhw1oOqCd2247O0Yw/mRwC9jIGACAJUlawkmMBiNmL4dGA2eMzuNZVNqOUfYTa6vqmND4CtOPzmEEEqLKFw==} + peerDependencies: + '@babel/core': ^7.0.0-0 + peerDependenciesMeta: + '@babel/core': + optional: true + + '@vue/babel-plugin-resolve-type@1.5.0': + resolution: {integrity: sha512-Wm/60o+53JwJODm4Knz47dxJnLDJ9FnKnGZJbUUf8nQRAtt6P+undLUAVU3Ha33LxOJe6IPoifRQ6F/0RrU31w==} + peerDependencies: + '@babel/core': ^7.0.0-0 + '@vue/compiler-core@3.5.26': resolution: {integrity: sha512-vXyI5GMfuoBCnv5ucIT7jhHKl55Y477yxP6fc4eUswjP8FG3FFVFd41eNDArR+Uk3QKn2Z85NavjaxLxOC19/w==} @@ -5022,6 +5314,11 @@ packages: '@vue/devtools-api@7.7.9': resolution: {integrity: sha512-kIE8wvwlcZ6TJTbNeU2HQNtaxLx3a84aotTITUuL/4bzfPxzajGBOoqjMhwZJ8L9qFYDU/lAYMEEm11dnZOD6g==} + '@vue/devtools-core@7.7.9': + resolution: {integrity: sha512-48jrBSwG4GVQRvVeeXn9p9+dlx+ISgasM7SxZZKczseohB0cBz+ITKr4YbLWjmJdy45UHL7UMPlR4Y0CWTRcSQ==} + peerDependencies: + vue: ^3.0.0 + '@vue/devtools-kit@7.7.9': resolution: {integrity: sha512-PyQ6odHSgiDVd4hnTP+aDk2X4gl2HmLDfiyEnn3/oV+ckFDuswRs4IbBT7vacMuGdwY/XemxBoh302ctbsptuA==} @@ -5210,6 +5507,9 @@ packages: engines: {node: '>=4'} hasBin: true + ansi-align@3.0.1: + resolution: {integrity: sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==} + ansi-colors@4.1.3: resolution: {integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==} engines: {node: '>=6'} @@ -5259,6 +5559,9 @@ packages: arg@4.1.3: resolution: {integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==} + arg@5.0.2: + resolution: {integrity: sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==} + argparse@1.0.10: resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} @@ -5268,6 +5571,10 @@ packages: argv-formatter@1.0.0: resolution: {integrity: sha512-F2+Hkm9xFaRg+GkaNnbwXNDV5O6pnCFEmqyhvfC/Ic5LbgOWjJh3L+mN/s91rxVL3znE7DYVpW0GJFT+4YBgWw==} + aria-query@5.3.2: + resolution: {integrity: sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==} + engines: {node: '>= 0.4'} + array-differ@3.0.0: resolution: {integrity: sha512-THtfYS6KtME/yIAhKjZ2ul7XI96lQGHRputJQHO80LAWQnuGP4iCIN8vdMRboGbIEYBwU33q8Tch1os2+X0kMg==} engines: {node: '>=8'} @@ -5275,6 +5582,9 @@ packages: array-ify@1.0.0: resolution: {integrity: sha512-c5AMf34bKdvPhQ7tBGhqkgKNUzMr4WUs+WDtC2ZUGOUncbxKMTvqxYctiseW3+L4bA8ec+GcZ6/A/FW4m8ukng==} + array-iterate@2.0.1: + resolution: {integrity: sha512-I1jXZMjAgCMmxT4qxXfPXa6SthSoE8h6gkSI9BGGNv8mP8G/v0blc+qFnZu6K42vTOiuME596QaLO0TP3Lk0xg==} + array-union@2.1.0: resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} engines: {node: '>=8'} @@ -5287,6 +5597,20 @@ packages: resolution: {integrity: sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==} engines: {node: '>=8'} + astring@1.9.0: + resolution: {integrity: sha512-LElXdjswlqjWrPpJFg1Fx4wpkOCxj1TDHlSV4PlaRxHGWko024xICaa97ZkMfs6DRKlCguiAI+rbXv5GWwXIkg==} + hasBin: true + + astro-expressive-code@0.41.5: + resolution: {integrity: sha512-6jfABbPO0fkRD1ROAPBQtJR2p7gjbmk/GjfblOpo5Z7F+gwhL7+s8bEhLz9GdW10yfbn+gJvwEf7f9Lu2clh2A==} + peerDependencies: + astro: ^4.0.0-beta || ^5.0.0-beta || ^3.3.0 + + astro@5.16.6: + resolution: {integrity: sha512-6mF/YrvwwRxLTu+aMEa5pwzKUNl5ZetWbTyZCs9Um0F12HUmxUiF5UHiZPy4rifzU3gtpM3xP2DfdmkNX9eZRg==} + engines: {node: 18.20.8 || ^20.3.0 || >=22.0.0, npm: '>=9.6.5', pnpm: '>=7.1.0'} + hasBin: true + async@3.2.6: resolution: {integrity: sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==} @@ -5296,6 +5620,10 @@ packages: axios@1.13.2: resolution: {integrity: sha512-VPk9ebNqPcy5lRGuSlKx752IlDatOjT9paPlm8A7yOuW2Fbvp4X3JznJtT4f0GzGLLiWE9W8onz51SqLYwzGaA==} + axobject-query@4.1.0: + resolution: {integrity: sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==} + engines: {node: '>= 0.4'} + babel-jest@29.7.0: resolution: {integrity: sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -5342,6 +5670,9 @@ packages: balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + base-64@1.0.0: + resolution: {integrity: sha512-kwDPIFCGx0NZHog36dj+tHiwP4QMzsZ3AgMViUBKI0+V5n4U0ufTCUMhnQ04diaRI8EX/QcPfql7zlhZ7j4zgg==} + base64-js@1.5.1: resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} @@ -5349,6 +5680,12 @@ packages: resolution: {integrity: sha512-Sg0xJUNDU1sJNGdfGWhVHX0kkZ+HWcvmVymJbj6NSgZZmW/8S9Y2HQ5euytnIgakgxN6papOAWiwDo1ctFDcoQ==} hasBin: true + bcp-47-match@2.0.3: + resolution: {integrity: sha512-JtTezzbAibu8G0R9op9zb3vcWZd9JF6M0xOYGPn0fNCd7wOpRB1mU2mH9T8gaBGbAAyIIVgB2G7xG0GP98zMAQ==} + + bcp-47@2.1.0: + resolution: {integrity: sha512-9IIS3UPrvIa1Ej+lVDdDwO7zLehjqsaByECw0bu2RRGP73jALm6FYbzI5gWbgHLvNdkvfXB5YrSbocZdOS0c0w==} + before-after-hook@2.2.3: resolution: {integrity: sha512-NzUnlZexiaH/46WDhANlyR2bXRopNg4F/zuSA3OpZnllCUgRaOF2znDioDWrmbNVsuZk6l9pMquQB38cfBZwkQ==} @@ -5373,9 +5710,16 @@ packages: bl@4.1.0: resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} + boolbase@1.0.0: + resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==} + bottleneck@2.19.5: resolution: {integrity: sha512-VHiNCbI1lKdl44tGrhNfU3lup0Tj/ZBMJB5/2ZbNXRCPuRCO7ed2mgcK4r17y+KB2EfuYuRaVlwNbAeaWGSpbw==} + boxen@8.0.1: + resolution: {integrity: sha512-F3PH5k5juxom4xktynS7MoFY+NUWH5LC4CnH11YB8NPew+HLpmBLCybSAEyb2F+4pRXhuhWqFesoQd6DAyc2hw==} + engines: {node: '>=18'} + brace-expansion@1.1.12: resolution: {integrity: sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==} @@ -5386,6 +5730,9 @@ packages: resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} engines: {node: '>=8'} + brotli@1.3.3: + resolution: {integrity: sha512-oTKjJdShmDuGW94SyyaoQvAjf30dZaHnjJ8uAF+u2/vGJkJbJPJAT1gDiOJP5v1Zb6f9KEyW/1HpuaWIXtGHPg==} + browserslist@4.28.1: resolution: {integrity: sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA==} engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} @@ -5404,6 +5751,10 @@ packages: buffer@5.7.1: resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} + bundle-name@4.1.0: + resolution: {integrity: sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q==} + engines: {node: '>=18'} + bundle-require@5.1.0: resolution: {integrity: sha512-3WrrOuZiyaaZPWiEt4G3+IffISVC9HYlWueJEBWED4ZH4aIAC2PnkdnuRrR94M+w6yGWn4AglWtJtBI8YqvgoA==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} @@ -5446,6 +5797,10 @@ packages: resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} engines: {node: '>=10'} + camelcase@8.0.0: + resolution: {integrity: sha512-8WB3Jcas3swSvjIeA2yvCJ+Miyz5l1ZmB6HFb9R1317dt9LCQoswg/BGrmAmkWVEszSrrg4RwmO46qIm2OEnSA==} + engines: {node: '>=16'} + caniuse-lite@1.0.30001761: resolution: {integrity: sha512-JF9ptu1vP2coz98+5051jZ4PwQgd2ni8A+gYSN7EA7dPKIMf0pDlSUxhdmVOaV3/fYK5uWBkgSXJaRLr4+3A6g==} @@ -5521,6 +5876,10 @@ packages: resolution: {integrity: sha512-9ngPTOhYGQqNVSfeJkYXHmF7AGWp4/nN5D/QqNQs3Dvxd1Kk/WpjHfNujKHYUQ/5CoGyOyFNoWSPk5afzP0QVg==} engines: {node: '>=14.16'} + cli-boxes@3.0.0: + resolution: {integrity: sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g==} + engines: {node: '>=10'} + cli-cursor@3.1.0: resolution: {integrity: sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==} engines: {node: '>=8'} @@ -5564,6 +5923,14 @@ packages: resolution: {integrity: sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==} engines: {node: '>=0.8'} + clone@2.1.2: + resolution: {integrity: sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==} + engines: {node: '>=0.8'} + + clsx@2.1.1: + resolution: {integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==} + engines: {node: '>=6'} + cmd-shim@6.0.3: resolution: {integrity: sha512-FMabTRlc5t5zjdenF6mS0MBeFZm0XqHqeOkcskKFb/LYCcRQ5fVgLOHVc4Lq9CqABd9zhjwPjMBCJvMCziSVtA==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} @@ -5578,6 +5945,9 @@ packages: coi-serviceworker@0.1.7: resolution: {integrity: sha512-bjSUqEngCPOkErY2vbyWsaIGCNRODYzlNycaREVw5s12/C8SM+RnRUUeX6pZbTtov6C52ZLY/+tvHK+BDxuUuA==} + collapse-white-space@2.1.0: + resolution: {integrity: sha512-loKTxY1zCOuG4j9f6EPnuyyYkf58RnhhWTvRoZEokgB+WbdXehfjFviyOVYkqzEWz1Q5kRiZdBYS5SwxbQYwzw==} + collect-v8-coverage@1.0.3: resolution: {integrity: sha512-1L5aqIkwPfiodaMgQunkF1zRhNqifHBmtbbbxcr6yVxxBnliw4TDOW6NxpO8DJLgJ16OT+Y4ztZqP6p/FtXnAw==} @@ -5725,6 +6095,13 @@ packages: convert-source-map@2.0.0: resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} + cookie-es@1.2.2: + resolution: {integrity: sha512-+W7VmiVINB+ywl1HGXJXmrqkOhpKrIiVZV6tQuV54ZyQC7MMuBt81Vc336GMLoHBq5hV/F9eXgt5Mnx0Rha5Fg==} + + cookie@1.1.1: + resolution: {integrity: sha512-ei8Aos7ja0weRpFzJnEA9UHJ/7XQmqglbRwnf2ATjcB9Wq874VKH9kfjjirM6UhU2/E5fFYadylyhFldcqSidQ==} + engines: {node: '>=18'} + copy-anything@4.0.5: resolution: {integrity: sha512-7Vv6asjS4gMOuILabD3l739tsaxFQmC+a7pLZm02zyvs8p977bL3zEgq3yDk5rn9B0PbYgIv++jmHcuUab4RhA==} engines: {node: '>=18'} @@ -5776,6 +6153,9 @@ packages: resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} engines: {node: '>= 8'} + crossws@0.3.5: + resolution: {integrity: sha512-ojKiDvcmByhwa8YYqbQI/hg7MEU0NC03+pSdEq4ZUnZR9xXpwk7E43SMNGkn+JxJGPFtNvQ48+vV2p+P1ml5PA==} + crypto-random-string@2.0.0: resolution: {integrity: sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==} engines: {node: '>=8'} @@ -5784,11 +6164,33 @@ packages: resolution: {integrity: sha512-x8dy3RnvYdlUcPOjkEHqozhiwzKNSq7GcPuXFbnyMOCHxX8V3OgIg/pYuabl2sbUPfIJaeAQB7PMOK8DFIdoRA==} engines: {node: '>=12'} + css-select@5.2.2: + resolution: {integrity: sha512-TizTzUddG/xYLA3NXodFM0fSbNizXjOKhqiQQwvhlspadZokn1KDy0NZFS0wuEubIYAV5/c1/lAr0TaaFXEXzw==} + + css-selector-parser@3.3.0: + resolution: {integrity: sha512-Y2asgMGFqJKF4fq4xHDSlFYIkeVfRsm69lQC1q9kbEsH5XtnINTMrweLkjYMeaUgiXBy/uvKeO/a1JHTNnmB2g==} + + css-tree@2.2.1: + resolution: {integrity: sha512-OA0mILzGc1kCOCSJerOeqDxDQ4HOh+G8NbOJFOTgOCzpw7fCBubk0fEyxp8AgOL/jvLgYA/uV0cMbe43ElF1JA==} + engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0, npm: '>=7.0.0'} + + css-tree@3.1.0: + resolution: {integrity: sha512-0eW44TGN5SQXU1mWSkKwFstI/22X2bG1nYzZTYMAWjylYURhse752YgbE4Cx46AC+bAvI+/dYTPRk1LqSUnu6w==} + engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0} + + css-what@6.2.2: + resolution: {integrity: sha512-u/O3vwbptzhMs3L1fQE82ZSLHQQfto5gyZzwteVIEyeaY5Fc7R4dapF/BvRoSYFeqfBk4m0V1Vafq5Pjv25wvA==} + engines: {node: '>= 6'} + cssesc@3.0.0: resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} engines: {node: '>=4'} hasBin: true + csso@5.0.5: + resolution: {integrity: sha512-0LrrStPOdJj+SPCCrGhzryycLjwcgUSHBtxNA8aIDxf0GLsRh1cKYhB00Gd1lDOS4yGH69+SNn13+TWbVHETFQ==} + engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0, npm: '>=7.0.0'} + cssom@0.3.8: resolution: {integrity: sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==} @@ -5869,6 +6271,14 @@ packages: resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} engines: {node: '>=0.10.0'} + default-browser-id@5.0.1: + resolution: {integrity: sha512-x1VCxdX4t+8wVfd1so/9w+vQ4vx7lKd2Qp5tDRutErwmR85OgmfX7RlLRMWafRMY7hbEiXIbudNrjOAPa/hL8Q==} + engines: {node: '>=18'} + + default-browser@5.4.0: + resolution: {integrity: sha512-XDuvSq38Hr1MdN47EDvYtx3U0MTqpCEn+F6ft8z2vYDzMrvQhVp0ui9oQdqW3MvK3vqUETglt1tVGgjLuJ5izg==} + engines: {node: '>=18'} + defaults@1.0.4: resolution: {integrity: sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==} @@ -5876,6 +6286,13 @@ packages: resolution: {integrity: sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==} engines: {node: '>=8'} + define-lazy-prop@3.0.0: + resolution: {integrity: sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==} + engines: {node: '>=12'} + + defu@6.1.4: + resolution: {integrity: sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg==} + del@6.1.1: resolution: {integrity: sha512-ua8BhapfP0JUJKC/zV9yHHDW/rDoDxP4Zhn3AkA6/xT6gY7jYXJiaeyBZznYVujhZZET+UgcbZiQ7sN3WqcImg==} engines: {node: '>=10'} @@ -5891,6 +6308,9 @@ packages: resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} engines: {node: '>=6'} + destr@2.0.5: + resolution: {integrity: sha512-ugFTXCtDZunbzasqBxrK93Ik/DRYsO6S/fedkWEMKqt04xZ4csmnmwGDBAb07QWNaGMAmnTIemsYZCksjATwsA==} + detect-indent@5.0.0: resolution: {integrity: sha512-rlpvsxUtM0PQvy9iZe640/IWwWYyBsTApREbA1pHOpmOUIl9MkP/U4z7vTtg4Oaojvqhxt7sdufnT0EzGaR31g==} engines: {node: '>=4'} @@ -5907,9 +6327,19 @@ packages: resolution: {integrity: sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==} engines: {node: '>=8'} + deterministic-object-hash@2.0.2: + resolution: {integrity: sha512-KxektNH63SrbfUyDiwXqRb1rLwKt33AmMv+5Nhsw1kqZ13SJBRTgZHtGbE+hH3a1mVW1cz+4pqSWVPAtLVXTzQ==} + engines: {node: '>=18'} + + devalue@5.6.1: + resolution: {integrity: sha512-jDwizj+IlEZBunHcOuuFVBnIMPAEHvTsJj0BcIp94xYguLRVBcXO853px/MyIJvbVzWdsGvrRweIUWJw8hBP7A==} + devlop@1.1.0: resolution: {integrity: sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==} + dfa@1.2.0: + resolution: {integrity: sha512-ED3jP8saaweFTjeGX8HQPjeC1YYyZs98jGNZx6IiBvxW7JG5v492kamAQB3m2wop07CvU/RQmzcKr6bgcC5D/Q==} + didyoumean@1.2.2: resolution: {integrity: sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==} @@ -5921,6 +6351,10 @@ packages: resolution: {integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==} engines: {node: '>=0.3.1'} + diff@5.2.0: + 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'} @@ -5929,14 +6363,34 @@ packages: resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} engines: {node: '>=8'} + direction@2.0.1: + resolution: {integrity: sha512-9S6m9Sukh1cZNknO1CWAr2QAWsbKLafQiyM5gZ7VgXHeuaoUwffKN4q6NC4A/Mf9iiPlOXQEKW/Mv/mh9/3YFA==} + hasBin: true + + dlv@1.1.3: + resolution: {integrity: sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==} + + dom-serializer@2.0.0: + resolution: {integrity: sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==} + + domelementtype@2.3.0: + resolution: {integrity: sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==} + domexception@4.0.0: resolution: {integrity: sha512-A2is4PLG+eeSfoTMA95/s4pvAoSo2mKtiM5jlHkAVewmiO8ISFTFKZjH7UAM1Atli/OT/7JHOrJRJiMKUZKYBw==} engines: {node: '>=12'} deprecated: Use your platform's native DOMException instead + domhandler@5.0.3: + resolution: {integrity: sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==} + engines: {node: '>= 4'} + dompurify@3.2.7: resolution: {integrity: sha512-WhL/YuveyGXJaerVlMYGWhvQswa7myDG17P7Vu65EWC05o8vfeNbvNf4d/BOvH99+ZW+LlQsc1GDKMa1vNK6dw==} + domutils@3.2.2: + resolution: {integrity: sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==} + dot-prop@5.3.0: resolution: {integrity: sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==} engines: {node: '>=8'} @@ -5953,6 +6407,10 @@ packages: resolution: {integrity: sha512-IrPdXQsk2BbzvCBGBOTmmSH5SodmqZNt4ERAZDmW4CT+tL8VtvinqywuANaFu4bOMWki16nqf0e4oC0QIaDr/g==} engines: {node: '>=10'} + dset@3.1.4: + resolution: {integrity: sha512-2QF/g9/zTaPDc3BjNcVTGoBbXBgYfMTTceLaYcFJ/W9kggFUkhxD/hMEeuLKbugyef9SqAx8cpgwlIP/jinUTA==} + engines: {node: '>=4'} + dunder-proto@1.0.1: resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} engines: {node: '>= 0.4'} @@ -5982,6 +6440,9 @@ packages: emoji-regex-xs@1.0.0: resolution: {integrity: sha512-LRlerrMYoIDrT6jgpeZ2YYl/L8EulRTt5hQcYjy5AInh7HWXKimpqx68aknBFpGL2+/IcogTcaydJEgaTmOpDg==} + emoji-regex@10.6.0: + resolution: {integrity: sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==} + emoji-regex@8.0.0: resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} @@ -5997,6 +6458,10 @@ packages: end-of-stream@1.4.5: resolution: {integrity: sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==} + enhanced-resolve@5.18.4: + resolution: {integrity: sha512-LgQMM4WXU3QI+SYgEc2liRgznaD5ojbmY3sb8LxyguVkIg5FxdpTkvk72te2R38/TGKxH634oLxXRGY6d7AP+Q==} + engines: {node: '>=10.13.0'} + enquirer@2.3.6: resolution: {integrity: sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==} engines: {node: '>=8.6'} @@ -6040,6 +6505,9 @@ packages: error-ex@1.3.4: resolution: {integrity: sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==} + error-stack-parser-es@0.1.5: + resolution: {integrity: sha512-xHku1X40RO+fO8yJ8Wh2f2rZWVjqyhb1zgq1yZ8aZRQkv6OOKhKWRUaht3eSCUbAOBaKIgM+ykwFLE+QUxgGeg==} + es-define-property@1.0.1: resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==} engines: {node: '>= 0.4'} @@ -6051,6 +6519,9 @@ packages: resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} engines: {node: '>= 0.4'} + es-module-lexer@1.7.0: + resolution: {integrity: sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==} + es-object-atoms@1.1.1: resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==} engines: {node: '>= 0.4'} @@ -6059,6 +6530,12 @@ packages: resolution: {integrity: sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==} engines: {node: '>= 0.4'} + esast-util-from-estree@2.0.0: + resolution: {integrity: sha512-4CyanoAudUSBAn5K13H4JhsMH6L9ZP7XbLVe/dKybkxMO7eDyLsT8UHl9TRNrU2Gr9nz+FovfSIjuXWJ81uVwQ==} + + esast-util-from-js@2.0.1: + resolution: {integrity: sha512-8Ja+rNJ0Lt56Pcf3TAmpBZjmx8ZcK5Ts4cAzIOjsjevg9oSXJnl6SUQ2EevU8tv3h6ZLWmoKL5H4fgWvdvfETw==} + esbuild@0.21.5: resolution: {integrity: sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==} engines: {node: '>=12'} @@ -6142,12 +6619,30 @@ packages: resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} engines: {node: '>=4.0'} + estree-util-attach-comments@3.0.0: + resolution: {integrity: sha512-cKUwm/HUcTDsYh/9FgnuFqpfquUbwIqwKM26BVCGDPVgvaCl/nDCCjUfiLlx6lsEZ3Z4RFxNbOQ60pkaEwFxGw==} + + estree-util-build-jsx@3.0.1: + resolution: {integrity: sha512-8U5eiL6BTrPxp/CHbs2yMgP8ftMhR5ww1eIKoWRMlqvltHF8fZn5LRDvTKuxD3DUn+shRbLGqXemcP51oFCsGQ==} + estree-util-is-identifier-name@3.0.0: resolution: {integrity: sha512-hFtqIDZTIUZ9BXLb8y4pYGyk6+wekIivNVTcmvk8NoOh+VeRn5y6cEHzbURrWbfp1fIqdVipilzj+lfaadNZmg==} + estree-util-scope@1.0.0: + resolution: {integrity: sha512-2CAASclonf+JFWBNJPndcOpA8EMJwa0Q8LUFJEKqXLW6+qBvbFZuF5gItbQOs/umBUkjviCSDCbBwU2cXbmrhQ==} + + estree-util-to-js@2.0.0: + resolution: {integrity: sha512-WDF+xj5rRWmD5tj6bIqRi6CkLIXbbNQUcxQHzGysQzvHmdYG2G7p/Tf0J0gpxGgkeMZNTIjT/AoSvC9Xehcgdg==} + + estree-util-visit@2.0.0: + resolution: {integrity: sha512-m5KgiH85xAhhW8Wta0vShLcUvOsh3LLPI2YVwcbio1l7E09NTLL1EyMZFM1OyWowoH0skScNbhOPl4kcBgzTww==} + estree-walker@2.0.2: resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} + estree-walker@3.0.3: + resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} + esutils@2.0.3: resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} engines: {node: '>=0.10.0'} @@ -6155,6 +6650,9 @@ packages: eventemitter3@4.0.7: resolution: {integrity: sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==} + eventemitter3@5.0.1: + resolution: {integrity: sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==} + execa@4.1.0: resolution: {integrity: sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA==} engines: {node: '>=10'} @@ -6186,6 +6684,9 @@ packages: exponential-backoff@3.1.3: resolution: {integrity: sha512-ZgEeZXj30q+I0EN+CbSSpIyPaJ5HVQD18Z1m+u1FXbAeT94mr1zw50q4q6jiiC447Nl/YTcIYSAftiGqetwXCA==} + expressive-code@0.41.5: + resolution: {integrity: sha512-iXl9BgDogQgzgE/WRSrcyU8upOcRZrXPMiu6tegEHML57YLQ65S0E3/sjAXmMZy0GXoPs60s9jbwoMo/mdEQOg==} + exsolve@1.0.8: resolution: {integrity: sha512-LmDxfWXwcTArk8fUEnOfSZpHOJ6zOMUJKOtFLFqJLoKJetuQG874Uc7/Kki7zFLzYybmZhp1M7+98pfMqeX8yA==} @@ -6298,6 +6799,10 @@ packages: flatted@3.3.3: resolution: {integrity: sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==} + flattie@1.1.1: + resolution: {integrity: sha512-9UbaD6XdAL97+k/n+N7JwX46K/M6Zc6KcFYskrYL8wbBV/Uyk0CTAMY0VT+qiK5PM7AIc9aTWYtq65U7T+aCNQ==} + engines: {node: '>=8'} + flexlayout-react@0.8.17: resolution: {integrity: sha512-F0utJcrIGBpF4btqRYLFOoITQcyFxUp19X4dvFvEceD/CJkRoefV96iN1lDU63t9ystgltmWw7AscgNbKJMlcA==} peerDependencies: @@ -6316,6 +6821,12 @@ packages: debug: optional: true + fontace@0.3.1: + resolution: {integrity: sha512-9f5g4feWT1jWT8+SbL85aLIRLIXUaDygaM2xPXRmzPYxrOMNok79Lr3FGJoKVNKibE0WCunNiEVG2mwuE+2qEg==} + + fontkit@2.0.4: + resolution: {integrity: sha512-syetQadaUEDNdxdugga9CpEYVaQIxOwk7GlwZWWZ19//qW4zE5bknOKeMBDYAASwnpaSHKJITRLMF9m1fp3s6g==} + foreground-child@3.3.1: resolution: {integrity: sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==} engines: {node: '>=14'} @@ -6380,6 +6891,10 @@ packages: resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} engines: {node: 6.* || 8.* || >= 10.*} + get-east-asian-width@1.4.0: + resolution: {integrity: sha512-QZjmEOC+IT1uk6Rx0sX22V6uHWVwbdbxf1faPqJ1QhLdGgsRGCZoyaQBm/piRdJy/D2um6hM1UP7ZEeQ4EkP+Q==} + engines: {node: '>=18'} + get-intrinsic@1.3.0: resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==} engines: {node: '>= 0.4'} @@ -6459,6 +6974,9 @@ packages: gitconfiglocal@1.0.0: resolution: {integrity: sha512-spLUXeTAVHxDtKsJc8FkFVgFtMdEN9qPGpL23VfSHx4fP4+Ds097IXLvymbnDH8FnmxX5Nr9bPw3A+AQ6mWEaQ==} + github-slugger@2.0.0: + resolution: {integrity: sha512-IaOQ9puYtjrkq7Y0Ygl9KDZnrf/aiUJYUpVf89y8kyaxbRG7Y1SrX/jaumrv81vc61+kiMempujsM3Yw7w5qcw==} + glob-parent@5.1.2: resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} engines: {node: '>= 6'} @@ -6505,6 +7023,9 @@ packages: graceful-fs@4.2.11: resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + h3@1.15.4: + resolution: {integrity: sha512-z5cFQWDffyOe4vQ9xIqNfCZdV4p//vy6fBnr8Q1AWnVZ0teurKMG66rLj++TKwKPUP3u7iMUvrvKaEUiQw2QWQ==} + handlebars@4.7.8: resolution: {integrity: sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==} engines: {node: '>=0.4.7'} @@ -6537,15 +7058,45 @@ packages: resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} engines: {node: '>= 0.4'} + hast-util-embedded@3.0.0: + resolution: {integrity: sha512-naH8sld4Pe2ep03qqULEtvYr7EjrLK2QHY8KJR6RJkTUjPGObe1vnx585uzem2hGra+s1q08DZZpfgDVYRbaXA==} + + hast-util-format@1.1.0: + resolution: {integrity: sha512-yY1UDz6bC9rDvCWHpx12aIBGRG7krurX0p0Fm6pT547LwDIZZiNr8a+IHDogorAdreULSEzP82Nlv5SZkHZcjA==} + + hast-util-from-html@2.0.3: + resolution: {integrity: sha512-CUSRHXyKjzHov8yKsQjGOElXy/3EKpyX56ELnkHH34vDVw1N1XSQ1ZcAvTyAPtGqLTuKP/uxM+aLkSPqF/EtMw==} + hast-util-from-parse5@8.0.3: resolution: {integrity: sha512-3kxEVkEKt0zvcZ3hCRYI8rqrgwtlIOFMWkbclACvjlDw8Li9S2hk/d51OI0nr/gIpdMHNepwgOKqZ/sy0Clpyg==} + hast-util-has-property@3.0.0: + resolution: {integrity: sha512-MNilsvEKLFpV604hwfhVStK0usFY/QmM5zX16bo7EjnAEGofr5YyI37kzopBlZJkHD4t887i+q/C8/tr5Q94cA==} + + hast-util-is-body-ok-link@3.0.1: + resolution: {integrity: sha512-0qpnzOBLztXHbHQenVB8uNuxTnm/QBFUOmdOSsEn7GnBtyY07+ENTWVFBAnXd/zEgd9/SUG3lRY7hSIBWRgGpQ==} + + hast-util-is-element@3.0.0: + resolution: {integrity: sha512-Val9mnv2IWpLbNPqc/pUem+a7Ipj2aHacCwgNfTiK0vJKl0LF+4Ba4+v1oPHFpf3bLYmreq0/l3Gud9S5OH42g==} + + hast-util-minify-whitespace@1.0.1: + resolution: {integrity: sha512-L96fPOVpnclQE0xzdWb/D12VT5FabA7SnZOUMtL1DbXmYiHJMXZvFkIZfiMmTCNJHUeO2K9UYNXoVyfz+QHuOw==} + hast-util-parse-selector@4.0.0: resolution: {integrity: sha512-wkQCkSYoOGCRKERFWcxMVMOcYE2K1AaNLU8DXS9arxnLOUEWbOXKXiJUNzEpqZ3JOKpnha3jkFrumEjVliDe7A==} + hast-util-phrasing@3.0.1: + resolution: {integrity: sha512-6h60VfI3uBQUxHqTyMymMZnEbNl1XmEGtOxxKYL7stY2o601COo62AWAYBQR9lZbYXYSBoxag8UpPRXK+9fqSQ==} + hast-util-raw@9.1.0: resolution: {integrity: sha512-Y8/SBAHkZGoNkpzqqfCldijcuUKh7/su31kEBp67cFY09Wy0mTRgtsLYsiIxMJxlu0f6AA5SUTbDR8K0rxnbUw==} + hast-util-select@6.0.4: + resolution: {integrity: sha512-RqGS1ZgI0MwxLaKLDxjprynNzINEkRHY2i8ln4DDjgv9ZhcYVIHN9rlpiYsqtFwrgpYU361SyWDQcGNIBVu3lw==} + + hast-util-to-estree@3.1.3: + resolution: {integrity: sha512-48+B/rJWAp0jamNbAAf9M7Uf//UVqAoMmgXhBdxTDJLGKY+LRnZ99qcG+Qjl5HfMpYNzS5v4EAwVEF34LeAj7w==} + hast-util-to-html@9.0.5: resolution: {integrity: sha512-OguPdidb+fbHQSU4Q4ZiLKnzWo8Wwsf5bZfbvu7//a9oTYoqD/fWpe96NuHkoS9h0ccGOTe0C4NGXdtS0iObOw==} @@ -6555,6 +7106,12 @@ packages: hast-util-to-parse5@8.0.1: resolution: {integrity: sha512-MlWT6Pjt4CG9lFCjiz4BH7l9wmrMkfkJYCxFwKQic8+RTZgWPuWxwAfjJElsXkex7DJjfSJsQIt931ilUgmwdA==} + hast-util-to-string@3.0.1: + resolution: {integrity: sha512-XelQVTDWvqcl3axRfI0xSeoVKzyIFPwsAGSLIsKdJKQMXDYJS4WYrBNF/8J7RdhIcFI2BOHgAifggsvsxp/3+A==} + + hast-util-to-text@4.0.2: + resolution: {integrity: sha512-KK6y/BN8lbaq654j7JgBydev7wuNMcID54lkRav1P0CaE1e47P72AWWPiGKXTJU271ooYzcvTAn/Zt0REnvc7A==} + hast-util-whitespace@3.0.0: resolution: {integrity: sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==} @@ -6593,6 +7150,9 @@ packages: html-escaper@2.0.2: resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} + html-escaper@3.0.3: + resolution: {integrity: sha512-RuMffC89BOWQoY0WKGpIhn5gX3iI54O6nRA0yC124NYVtzjmFWBIiFd8M0x+ZdX0P9R4lADg1mgP8C7PxGOWuQ==} + html-parse-stringify@3.0.1: resolution: {integrity: sha512-KknJ50kTInJ7qIScF3jeaFRpMpE8/lfiTdzf/twXyPBLAGrLRTmkz3AdTnKeh40X8k9L2fdYwEp/42WGXIRGcg==} @@ -6602,6 +7162,9 @@ packages: html-void-elements@3.0.0: resolution: {integrity: sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==} + html-whitespace-sensitive-tag-names@3.0.1: + resolution: {integrity: sha512-q+310vW8zmymYHALr1da4HyXUQ0zgiIwIicEfotYPWGN0OJVEN/58IJ3A4GBYcEq3LGAZqKb+ugvP0GNB9CEAA==} + http-cache-semantics@4.2.0: resolution: {integrity: sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ==} @@ -6641,6 +7204,9 @@ packages: resolution: {integrity: sha512-eKCa6bwnJhvxj14kZk5NCPc6Hb6BdsU9DZcOnmQKSnO1VKrfV0zCvtttPZUsBvjmNDn8rpcJfpwSYnHBjc95MQ==} engines: {node: '>=18.18.0'} + i18next@23.16.8: + resolution: {integrity: sha512-06r/TitrM88Mg5FdUXAKL96dJMzgqLE5dv3ryBAra4KCwD9mJ4ndOTS95ZuymIGoE+2hzfdaMak2X11/es7ZWg==} + i18next@25.7.3: resolution: {integrity: sha512-2XaT+HpYGuc2uTExq9TVRhLsso+Dxym6PWaKpn36wfBmTI779OQ7iP/XaZHzrnGyzU4SHpFrTYLKfVyBfAhVNA==} peerDependencies: @@ -6761,6 +7327,9 @@ packages: resolution: {integrity: sha512-XXADHxXmvT9+CRxhXg56LJovE+bmWnEWB78LB83VZTprKTmaC5QfruXocxzTZ2Kl0DNwKuBdlIhjL8LeY8Sf8Q==} engines: {node: '>= 12'} + iron-webcrypto@1.2.1: + resolution: {integrity: sha512-feOM6FaSr6rEABp/eDfVseKyTMDt+KGpeB35SkVn9Tyn0CqvVsY3EwI0v5i8nMHyJnzCIQf7nsy3p41TPkJZhg==} + is-alphabetical@2.0.1: resolution: {integrity: sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==} @@ -6790,6 +7359,11 @@ packages: engines: {node: '>=8'} hasBin: true + is-docker@3.0.0: + resolution: {integrity: sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + hasBin: true + is-extglob@2.1.1: resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} engines: {node: '>=0.10.0'} @@ -6809,6 +7383,11 @@ packages: is-hexadecimal@2.0.1: resolution: {integrity: sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==} + is-inside-container@1.0.0: + resolution: {integrity: sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==} + engines: {node: '>=14.16'} + hasBin: true + is-interactive@1.0.0: resolution: {integrity: sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==} engines: {node: '>=8'} @@ -6904,6 +7483,10 @@ packages: resolution: {integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==} engines: {node: '>=8'} + is-wsl@3.1.0: + resolution: {integrity: sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw==} + engines: {node: '>=16'} + isarray@1.0.0: resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} @@ -7229,6 +7812,10 @@ packages: resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==} engines: {node: '>=6'} + klona@2.0.6: + resolution: {integrity: sha512-dhG34DXATL5hSxJbIexCft8FChFXtmskoZYnoPWjXQuebWYCNkVeV3KkGegCK9CP1oswI/vQibS2GY7Em/sJJA==} + engines: {node: '>= 8'} + kolorist@1.8.0: resolution: {integrity: sha512-Y+60/zizpJ3HRH8DCss+q95yr6145JXZo46OTpFvDZWLfRCE4qChOyk1b26nMaNpfHHgxagk9dXT5OP0Tfe+dQ==} @@ -7260,6 +7847,76 @@ packages: lie@3.3.0: resolution: {integrity: sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==} + lightningcss-android-arm64@1.30.2: + resolution: {integrity: sha512-BH9sEdOCahSgmkVhBLeU7Hc9DWeZ1Eb6wNS6Da8igvUwAe0sqROHddIlvU06q3WyXVEOYDZ6ykBZQnjTbmo4+A==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [android] + + lightningcss-darwin-arm64@1.30.2: + resolution: {integrity: sha512-ylTcDJBN3Hp21TdhRT5zBOIi73P6/W0qwvlFEk22fkdXchtNTOU4Qc37SkzV+EKYxLouZ6M4LG9NfZ1qkhhBWA==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [darwin] + + lightningcss-darwin-x64@1.30.2: + resolution: {integrity: sha512-oBZgKchomuDYxr7ilwLcyms6BCyLn0z8J0+ZZmfpjwg9fRVZIR5/GMXd7r9RH94iDhld3UmSjBM6nXWM2TfZTQ==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [darwin] + + lightningcss-freebsd-x64@1.30.2: + resolution: {integrity: sha512-c2bH6xTrf4BDpK8MoGG4Bd6zAMZDAXS569UxCAGcA7IKbHNMlhGQ89eRmvpIUGfKWNVdbhSbkQaWhEoMGmGslA==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [freebsd] + + lightningcss-linux-arm-gnueabihf@1.30.2: + resolution: {integrity: sha512-eVdpxh4wYcm0PofJIZVuYuLiqBIakQ9uFZmipf6LF/HRj5Bgm0eb3qL/mr1smyXIS1twwOxNWndd8z0E374hiA==} + engines: {node: '>= 12.0.0'} + cpu: [arm] + os: [linux] + + lightningcss-linux-arm64-gnu@1.30.2: + resolution: {integrity: sha512-UK65WJAbwIJbiBFXpxrbTNArtfuznvxAJw4Q2ZGlU8kPeDIWEX1dg3rn2veBVUylA2Ezg89ktszWbaQnxD/e3A==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [linux] + + lightningcss-linux-arm64-musl@1.30.2: + resolution: {integrity: sha512-5Vh9dGeblpTxWHpOx8iauV02popZDsCYMPIgiuw97OJ5uaDsL86cnqSFs5LZkG3ghHoX5isLgWzMs+eD1YzrnA==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [linux] + + lightningcss-linux-x64-gnu@1.30.2: + resolution: {integrity: sha512-Cfd46gdmj1vQ+lR6VRTTadNHu6ALuw2pKR9lYq4FnhvgBc4zWY1EtZcAc6EffShbb1MFrIPfLDXD6Xprbnni4w==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [linux] + + lightningcss-linux-x64-musl@1.30.2: + resolution: {integrity: sha512-XJaLUUFXb6/QG2lGIW6aIk6jKdtjtcffUT0NKvIqhSBY3hh9Ch+1LCeH80dR9q9LBjG3ewbDjnumefsLsP6aiA==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [linux] + + lightningcss-win32-arm64-msvc@1.30.2: + resolution: {integrity: sha512-FZn+vaj7zLv//D/192WFFVA0RgHawIcHqLX9xuWiQt7P0PtdFEVaxgF9rjM/IRYHQXNnk61/H/gb2Ei+kUQ4xQ==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [win32] + + lightningcss-win32-x64-msvc@1.30.2: + resolution: {integrity: sha512-5g1yc73p+iAkid5phb4oVFMB45417DkRevRbt/El/gKXJk4jid+vPFF/AXbxn05Aky8PapwzZrdJShv5C0avjw==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [win32] + + lightningcss@1.30.2: + resolution: {integrity: sha512-utfs7Pr5uJyyvDETitgsaqSyjCb2qNRAtuqUeWIAKztsOYdcACf2KtARYXg2pSvhkt+9NfoaNY7fxjl6nuMjIQ==} + engines: {node: '>= 12.0.0'} + lilconfig@3.1.3: resolution: {integrity: sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==} engines: {node: '>=14'} @@ -7414,6 +8071,9 @@ packages: magic-string@0.30.21: resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==} + magicast@0.5.1: + resolution: {integrity: sha512-xrHS24IxaLrvuo613F719wvOIv9xPHFWQHuvGUBmPnCA/3MQxKI3b+r7n1jAoDHmsbC5bRhTZYR77invLAxVnw==} + make-asynchronous@1.0.1: resolution: {integrity: sha512-T9BPOmEOhp6SmV25SwLVcHK4E6JyG/coH3C6F1NjNXSziv/fd4GmsqMk8YR6qpPOswfaOCApSNkZv6fxoaYFcQ==} engines: {node: '>=18'} @@ -7451,6 +8111,10 @@ packages: mark.js@8.11.1: resolution: {integrity: sha512-1I+1qpDt4idfgLQG+BNWmrqku+7/2bi5nLf4YwF8y8zXvmfiTBY3PV3ZibfrjBueCByROpuBjLLFCajqkgYoLQ==} + markdown-extensions@2.0.0: + resolution: {integrity: sha512-o5vL7aDWatOTX8LzaS1WMoaoxIiLRQJuIKKe2wAw6IeULDHaqbiqiggmx+pKvZDb1Sj+pE46Sn1T7lCqfFtg1Q==} + engines: {node: '>=16'} + markdown-it@14.1.0: resolution: {integrity: sha512-a54IwgWPaeBCAAsv13YgmALOF1elABB08FxO9i+r4VFk5Vl4pKokRPeX8u5TCgSsPi6ec1otfLjdOpVcgbpshg==} hasBin: true @@ -7478,6 +8142,12 @@ packages: resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} engines: {node: '>= 0.4'} + mdast-util-definitions@6.0.0: + resolution: {integrity: sha512-scTllyX6pnYNZH/AIp/0ePz6s4cZtARxImwoPJ7kS42n+MnVsI4XbnG6d4ibehRIldYMWM2LD7ImQblVhUejVQ==} + + mdast-util-directive@3.1.0: + resolution: {integrity: sha512-I3fNFt+DHmpWCYAT7quoM6lHf9wuqtI+oCOfvILnoicNIqjh5E3dEJWiXuYME2gNe8vl1iMQwyUHa7bgFmak6Q==} + mdast-util-find-and-replace@3.0.2: resolution: {integrity: sha512-Tmd1Vg/m3Xz43afeNxDIhWRtFZgM2VLyaf4vSTYwudTyeuTneoL3qtWMA5jeLyz/O1vDJmmV4QuScFCA2tBPwg==} @@ -7508,6 +8178,9 @@ packages: mdast-util-mdx-jsx@3.2.0: resolution: {integrity: sha512-lj/z8v0r6ZtsN/cGNNtemmmfoLAFZnjMbNyLzBafjzikOM+glrjNHPlf6lQDOTccj9n5b0PPihEBbhneMyGs1Q==} + mdast-util-mdx@3.0.0: + resolution: {integrity: sha512-JfbYLAW7XnYTTbUsmpu0kdBUVe+yKVJZBItEjwyYJiDJuZ9w4eeaqks4HQO+R7objWgS2ymV60GYpI14Ug554w==} + mdast-util-mdxjs-esm@2.0.1: resolution: {integrity: sha512-EcmOpxsZ96CvlP03NghtH1EsLtr0n9Tm4lPUJUBccV9RwUOneqSycg19n5HGzCf+10LozMRSObtVr3ee1WoHtg==} @@ -7523,6 +8196,12 @@ packages: mdast-util-to-string@4.0.0: resolution: {integrity: sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==} + mdn-data@2.0.28: + resolution: {integrity: sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g==} + + mdn-data@2.12.2: + resolution: {integrity: sha512-IEn+pegP1aManZuckezWCO+XZQDplx1366JoVhTpMpBB1sPey/SbveZQUosKiKiGYjg1wH4pMlNgXbCiYgihQA==} + mdurl@2.0.0: resolution: {integrity: sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w==} @@ -7548,6 +8227,9 @@ packages: micromark-core-commonmark@2.0.3: resolution: {integrity: sha512-RDBrHEMSxVFLg6xvnXmb1Ayr2WzLAWjeSATAoxwKYJV94TeNavgoIdA0a9ytzDSVzBy2YKFK+emCPOEibLeCrg==} + micromark-extension-directive@3.0.2: + resolution: {integrity: sha512-wjcXHgk+PPdmvR58Le9d7zQYWy+vKEU9Se44p2CrCDPiLr2FMyiT4Fyb5UFKFC66wGB3kPlgD7q3TnoqPS7SZA==} + micromark-extension-gfm-autolink-literal@2.1.0: resolution: {integrity: sha512-oOg7knzhicgQ3t4QCjCWgTmfNhvQbDDnJeVu9v81r7NltNCVmhPy1fJRX27pISafdjL+SVc4d3l48Gb6pbRypw==} @@ -7569,12 +8251,30 @@ packages: micromark-extension-gfm@3.0.0: resolution: {integrity: sha512-vsKArQsicm7t0z2GugkCKtZehqUm31oeGBV/KVSorWSy8ZlNAv7ytjFhvaryUiCUJYqs+NoE6AFhpQvBTM6Q4w==} + micromark-extension-mdx-expression@3.0.1: + resolution: {integrity: sha512-dD/ADLJ1AeMvSAKBwO22zG22N4ybhe7kFIZ3LsDI0GlsNr2A3KYxb0LdC1u5rj4Nw+CHKY0RVdnHX8vj8ejm4Q==} + + micromark-extension-mdx-jsx@3.0.2: + resolution: {integrity: sha512-e5+q1DjMh62LZAJOnDraSSbDMvGJ8x3cbjygy2qFEi7HCeUT4BDKCvMozPozcD6WmOt6sVvYDNBKhFSz3kjOVQ==} + + micromark-extension-mdx-md@2.0.0: + resolution: {integrity: sha512-EpAiszsB3blw4Rpba7xTOUptcFeBFi+6PY8VnJ2hhimH+vCQDirWgsMpz7w1XcZE7LVrSAUGb9VJpG9ghlYvYQ==} + + micromark-extension-mdxjs-esm@3.0.0: + resolution: {integrity: sha512-DJFl4ZqkErRpq/dAPyeWp15tGrcrrJho1hKK5uBS70BCtfrIFg81sqcTVu3Ta+KD1Tk5vAtBNElWxtAa+m8K9A==} + + micromark-extension-mdxjs@3.0.0: + resolution: {integrity: sha512-A873fJfhnJ2siZyUrJ31l34Uqwy4xIFmvPY1oj+Ean5PHcPBYzEsvqvWGaWcfEIr11O5Dlw3p2y0tZWpKHDejQ==} + micromark-factory-destination@2.0.1: resolution: {integrity: sha512-Xe6rDdJlkmbFRExpTOmRj9N3MaWmbAgdpSrBQvCFqhezUn4AHqJHbaEnfbVYYiexVSs//tqOdY/DxhjdCiJnIA==} micromark-factory-label@2.0.1: resolution: {integrity: sha512-VFMekyQExqIW7xIChcXn4ok29YE3rnuyveW3wZQWWqF4Nv9Wk5rgJ99KzPvHjkmPXF93FXIbBp6YdW3t71/7Vg==} + micromark-factory-mdx-expression@2.0.3: + resolution: {integrity: sha512-kQnEtA3vzucU2BkrIa8/VaSAsP+EJ3CKOvhMuJgOEGg9KDC6OAY6nSnNDVRiVNRqj7Y4SlSzcStaH/5jge8JdQ==} + micromark-factory-space@2.0.1: resolution: {integrity: sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==} @@ -7605,6 +8305,9 @@ packages: micromark-util-encode@2.0.1: resolution: {integrity: sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==} + micromark-util-events-to-acorn@2.0.3: + resolution: {integrity: sha512-jmsiEIiZ1n7X1Rr5k8wVExBQCg5jy4UXVADItHmNk1zkwEVhBuIUKRu3fqv+hs4nxLISi2DQGlqIOGiFxgbfHg==} + micromark-util-html-tag-name@2.0.1: resolution: {integrity: sha512-2cNEiYDhCWKI+Gs9T0Tiysk136SnR13hhO8yW6BGNyhOC4qYFnwF1nKfD3HFAIXA5c45RrIG1ub11GiXeYd1xA==} @@ -7767,6 +8470,10 @@ packages: resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==} engines: {node: '>=4'} + mrmime@2.0.1: + resolution: {integrity: sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ==} + engines: {node: '>=10'} + ms@2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} @@ -7813,13 +8520,23 @@ packages: neo-async@2.6.2: resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} + neotraverse@0.6.18: + resolution: {integrity: sha512-Z4SmBUweYa09+o6pG+eASabEpP6QkQ70yHj351pQoEXIs8uHbaU2DWVmzBANKgflPa47A50PtB2+NgRpQvr7vA==} + engines: {node: '>= 10'} + nerf-dart@1.0.0: resolution: {integrity: sha512-EZSPZB70jiVsivaBLYDCyntd5eH8NTSMOn3rB+HxwdmKThGELLdYv8qVIMWvZEFy9w8ZZpW9h9OB32l1rGtj7g==} + nlcst-to-string@4.0.0: + resolution: {integrity: sha512-YKLBCcUYKAg0FNlOBT6aI91qFmSiFKiluk655WzPF+DDMA02qIyy8uiRqI8QXtcFpEvll12LpL5MXqEmAZ+dcA==} + node-emoji@2.2.0: resolution: {integrity: sha512-Z3lTE9pLaJF47NyMhd4ww1yFTAP8YhYI8SleJiHzM46Fgpm5cnNzSl9XfzFNqbaz+VlJrIj3fXQ4DeN1Rjm6cw==} engines: {node: '>=18'} + node-fetch-native@1.6.7: + resolution: {integrity: sha512-g9yhqoedzIUm0nTnTqAQvueMPVOuIY16bqgAJJC8XOOubYFNwz6IER9qs0Gq2Xd0+CecCKFjtdDTMA4u4xG06Q==} + node-fetch@2.6.7: resolution: {integrity: sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==} engines: {node: 4.x || >=6.0.0} @@ -7849,6 +8566,9 @@ packages: node-machine-id@1.1.12: resolution: {integrity: sha512-QNABxbrPa3qEIfrE6GOJ7BYIuignnJw7iQ2YPbc3Nla1HzRJjXzZOiikfF8m7eAMfichLt3M4VgLOetqgDmgGQ==} + node-mock-http@1.0.4: + resolution: {integrity: sha512-8DY+kFsDkNXy1sJglUfuODx1/opAGJGyrTuFqEoN90oRc2Vk0ZbD4K2qmKXBBEhZQzdKHIVfEJpDU8Ak2NJEvQ==} + node-releases@2.0.27: resolution: {integrity: sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==} @@ -7990,6 +8710,9 @@ packages: - which - write-file-atomic + nth-check@2.1.1: + resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==} + nwsapi@2.2.23: resolution: {integrity: sha512-7wfH4sLbt4M0gCDzGE6vzQBo0bfTKjU7Sfpqy/7gs1qBfYz2vEJH6vXcBKpO3+6Yu1telwd0t9HpyOoLEQQbIQ==} @@ -8009,6 +8732,12 @@ packages: resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} engines: {node: '>=0.10.0'} + ofetch@1.5.1: + resolution: {integrity: sha512-2W4oUZlVaqAPAil6FUg/difl6YhqhUR7x2eZY4bQCko22UXg3hptq9KLQdqFClV+Wu85UX7hNtdGTngi/1BxcA==} + + ohash@2.0.11: + resolution: {integrity: sha512-RdR9FQrFwNBNXAr4GixM8YaRZRJ5PUWbKYbE5eOsrwAjJW0q2REGcf79oYPsLyskQCZG1PLN+S/K1V00joZAoQ==} + once@1.4.0: resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} @@ -8020,9 +8749,19 @@ packages: resolution: {integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==} engines: {node: '>=12'} + oniguruma-parser@0.12.1: + resolution: {integrity: sha512-8Unqkvk1RYc6yq2WBYRj4hdnsAxVze8i7iPfQr8e4uSP3tRv0rpZcbGUDvxfQQcdwHt/e9PrMvGCsa8OqG9X3w==} + oniguruma-to-es@3.1.1: resolution: {integrity: sha512-bUH8SDvPkH3ho3dvwJwfonjlQ4R80vjyvrU8YpxuROddv55vAEJrTuCuCVUhhsHbtlD9tGGbaNApGQckXhS8iQ==} + oniguruma-to-es@4.3.4: + resolution: {integrity: sha512-3VhUGN3w2eYxnTzHn+ikMI+fp/96KoRSVK9/kMTcFqj1NRDh2IhQCKvYxDnWePKRXY/AqH+Fuiyb7VHSzBjHfA==} + + open@10.2.0: + resolution: {integrity: sha512-YgBpdJHPyQ2UE5x+hlSXcnejzAvD0b22U2OuAP+8OnlJT+PjWPxtgmGqKKc+RgTM63U9gN0YzrYc71R2WT/hTA==} + engines: {node: '>=18'} + open@8.4.2: resolution: {integrity: sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==} engines: {node: '>=12'} @@ -8098,6 +8837,10 @@ packages: resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} engines: {node: '>=10'} + p-limit@6.2.0: + resolution: {integrity: sha512-kuUqqHNUqoIWp/c467RI4X6mmyuojY5jGutNU0wVTmEOOfcuwLqyMVoAi9MKi2Ak+5i9+nhmrK4ufZE8069kHA==} + engines: {node: '>=18'} + p-locate@2.0.0: resolution: {integrity: sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg==} engines: {node: '>=4'} @@ -8138,6 +8881,10 @@ packages: resolution: {integrity: sha512-RwFpb72c/BhQLEXIZ5K2e+AhgNVmIejGlTgiB9MzZ0e93GRvqZ7uSi0dvRF7/XIXDeNkra2fNHBxTyPDGySpjQ==} engines: {node: '>=8'} + p-queue@8.1.1: + resolution: {integrity: sha512-aNZ+VfjobsWryoiPnEApGGmf5WmNsCo9xu8dfaYamG5qaLP7ClhLN6NgsFe6SwJ2UbLEBK5dv9x8Mn5+RVhMWQ==} + engines: {node: '>=18'} + p-reduce@2.1.0: resolution: {integrity: sha512-2USApvnsutq8uoxZBGbbWM0JIYLiEMJ9RlaN7fAzVNb9OZN0SHjjTTfIcb667XynS5Y1VhwDJVDa72TnPzAYWw==} engines: {node: '>=8'} @@ -8180,6 +8927,13 @@ packages: engines: {node: ^16.14.0 || >=18.0.0} hasBin: true + pagefind@1.4.0: + resolution: {integrity: sha512-z2kY1mQlL4J8q5EIsQkLzQjilovKzfNVhX8De6oyE6uHpfFtyBaqUpcl/XzJC/4fjD8vBDyh1zolimIcVrCn9g==} + hasBin: true + + pako@0.2.9: + resolution: {integrity: sha512-NUcwaKxUxWrZLpDG+z/xZaCgQITkA/Dv4V/T6bw7VON6l1Xz/VnrBqrYjZQ12TamKHzITTfOEIYUj48y2KXImA==} + pako@1.0.11: resolution: {integrity: sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==} @@ -8209,6 +8963,9 @@ packages: resolution: {integrity: sha512-ybiGyvspI+fAoRQbIPRddCcSTV9/LsJbf0e/S85VLowVGzRmokfneg2kwVW/KU5rOXrPSbF1qAKPMgNTqqROQQ==} engines: {node: '>=18'} + parse-latin@7.0.0: + resolution: {integrity: sha512-mhHgobPPua5kZ98EF4HWiH167JWBfl4pvAIXXdbaVohtK7a6YBOy56kvhCqduqyo/f3yrHFWmqmiMg/BkBkYYQ==} + parse-ms@4.0.0: resolution: {integrity: sha512-TXfryirbmq34y8QBwgqCVLi+8oA3oWx2eAnSn62ITyEhEYaWRlVZ2DvMM9eZbMs/RfxPu/PK/aBLyGj4IrqMHw==} engines: {node: '>=18'} @@ -8284,6 +9041,9 @@ packages: perfect-debounce@1.0.0: resolution: {integrity: sha512-xCy9V055GLEqoFaHoC1SoLIaLmWctgCUaBaWxDZ7/Zx4CTyX7cJQLJOok/orfjZAh9kEYpjJa4d0KcJmCbctZA==} + piccolore@0.1.3: + resolution: {integrity: sha512-o8bTeDWjE086iwKrROaDf31K0qC/BENdm15/uH9usSC/uZjJOKb2YGiVHfLY4GhwsERiPI1jmwI2XrA7ACOxVw==} + picocolors@1.1.1: resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} @@ -8351,6 +9111,12 @@ packages: yaml: optional: true + postcss-nested@6.2.0: + resolution: {integrity: sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ==} + engines: {node: '>=12.0'} + peerDependencies: + postcss: ^8.2.14 + postcss-selector-parser@6.1.2: resolution: {integrity: sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==} engines: {node: '>=4'} @@ -8384,6 +9150,10 @@ packages: resolution: {integrity: sha512-gjVS5hOP+M3wMm5nmNOucbIrqudzs9v/57bWRHQWLYklXqoXKrVfYW2W9+glfGsqtPgpiz5WwyEEB+ksXIx3gQ==} engines: {node: '>=18'} + prismjs@1.30.0: + resolution: {integrity: sha512-DEvV2ZF2r2/63V+tK8hQvrR2ZGn10srHbXviTlcv7Kpzw8jWiNTqbVgjO3IY8RxrrOUF8VPMQQFysYYYv0YZxw==} + engines: {node: '>=6'} + proc-log@4.2.0: resolution: {integrity: sha512-g8+OnU/L2v+wyiVK+D5fA34J7EH8jZ8DDlvwhRCMxmMj7UCBvxiO1mGeN+36JXIKF4zevU4kRBd8lVgG9vLelA==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} @@ -8470,6 +9240,9 @@ packages: resolution: {integrity: sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==} engines: {node: '>=8'} + radix3@1.1.2: + resolution: {integrity: sha512-b484I/7b8rDEdSDKckSSBA8knMpcdsXudlE/LNL639wFoHKwLbEkQFZHWEYwDC0wa0FKUcCY+GAF73Z7wxNVFA==} + ramda@0.27.2: resolution: {integrity: sha512-SbiLPU40JuJniHexQSAgad32hfwd+DRUdwF2PlVuI5RZD0/vahUco7R8vD86J/tcEKKF9vZrUVwgtmGCqlCKyA==} @@ -8578,6 +9351,20 @@ packages: resolution: {integrity: sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==} engines: {node: '>= 14.18.0'} + recma-build-jsx@1.0.0: + resolution: {integrity: sha512-8GtdyqaBcDfva+GUKDr3nev3VpKAhup1+RvkMvUxURHpW7QyIvk9F5wz7Vzo06CEMSilw6uArgRqhpiUcWp8ew==} + + recma-jsx@1.0.1: + resolution: {integrity: sha512-huSIy7VU2Z5OLv6oFLosQGGDqPqdO1iq6bWNAdhzMxSJP7RAso4fCZ1cKu8j9YHCZf3TPrq4dw3okhrylgcd7w==} + peerDependencies: + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + + recma-parse@1.0.0: + resolution: {integrity: sha512-OYLsIGBB5Y5wjnSnQW6t3Xg7q3fQ7FWbw/vcXtORTnyaSFscOtABg+7Pnz6YZ6c27fG1/aN8CjfwoUEUIdwqWQ==} + + recma-stringify@1.0.0: + resolution: {integrity: sha512-cjwII1MdIIVloKvC9ErQ+OgAtwHBmcZ0Bg4ciz78FtbT8In39aAYbaA7zvxQ61xVMSPE8WxhLwLbhif4Js2C+g==} + redent@3.0.0: resolution: {integrity: sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==} engines: {node: '>=8'} @@ -8616,18 +9403,46 @@ packages: resolution: {integrity: sha512-NZQZdC5wOE/H3UT28fVGL+ikOZcEzfMGk/c3iN9UGxzWHMa1op7274oyiUVrAG4B2EuFhus8SvkaYnhvW92p9Q==} hasBin: true + rehype-expressive-code@0.41.5: + resolution: {integrity: sha512-SzKJyu7heDpkt+XE/AqeWsYMSMocE/5mpJXD6CMgstqJHSE9bxGNcLp3zL9Wne3M5iBsS4GJyOD2syV77kRveA==} + + rehype-format@5.0.1: + resolution: {integrity: sha512-zvmVru9uB0josBVpr946OR8ui7nJEdzZobwLOOqHb/OOD88W0Vk2SqLwoVOj0fM6IPCCO6TaV9CvQvJMWwukFQ==} + + rehype-parse@9.0.1: + resolution: {integrity: sha512-ksCzCD0Fgfh7trPDxr2rSylbwq9iYDkSn8TCDmEJ49ljEUBxDVCzCHv7QNzZOfODanX4+bWQ4WZqLCRWYLfhag==} + rehype-raw@7.0.0: resolution: {integrity: sha512-/aE8hCfKlQeA8LmyeyQvQF3eBiLRGNlfBJEvWH7ivp9sBqs7TNqBL5X3v157rM4IFETqDnIOO+z5M/biZbo9Ww==} + rehype-recma@1.0.0: + resolution: {integrity: sha512-lqA4rGUf1JmacCNWWZx0Wv1dHqMwxzsDWYMTowuplHF3xH0N/MmrZ/G3BDZnzAkRmxDadujCjaKM2hqYdCBOGw==} + + rehype-stringify@10.0.1: + resolution: {integrity: sha512-k9ecfXHmIPuFVI61B9DeLPN0qFHfawM6RsuX48hoqlaKSF61RskNjSm1lI8PhBEM0MRdLxVVm4WmTqJQccH9mA==} + + rehype@13.0.2: + resolution: {integrity: sha512-j31mdaRFrwFRUIlxGeuPXXKWQxet52RBQRvCmzl5eCefn/KGbomK5GMHNMsOJf55fgo3qw5tST5neDuarDYR2A==} + + remark-directive@3.0.1: + resolution: {integrity: sha512-gwglrEQEZcZYgVyG1tQuA+h58EZfq5CSULw7J90AFuCTyib1thgHPoqQ+h9iFvU6R+vnZ5oNFQR5QKgGpk741A==} + remark-gfm@4.0.1: resolution: {integrity: sha512-1quofZ2RQ9EWdeN34S79+KExV1764+wCUGop5CPL1WGdD0ocPpu91lzPGbwWMECpEpd42kJGQwzRfyov9j4yNg==} + remark-mdx@3.1.1: + resolution: {integrity: sha512-Pjj2IYlUY3+D8x00UJsIOg5BEvfMyeI+2uLPn9VO9Wg4MEtN/VTIq2NEJQfde9PnX15KgtHyl9S0BcTnWrIuWg==} + remark-parse@11.0.0: resolution: {integrity: sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA==} remark-rehype@11.1.2: resolution: {integrity: sha512-Dh7l57ianaEoIpzbp0PC9UKAdCSVklD8E5Rpw7ETfbTl3FqcOOgq5q2LVDhgGCkaBv7p24JXikPdvhhmHvKMsw==} + remark-smartypants@3.0.2: + resolution: {integrity: sha512-ILTWeOriIluwEvPjv67v7Blgrcx+LZOkAUVtKI3putuhlZm84FnqDORNXPPm+HY3NdZOMhyDwZ1E+eZB/Df5dA==} + engines: {node: '>=16.0.0'} + remark-stringify@11.0.0: resolution: {integrity: sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw==} @@ -8680,6 +9495,21 @@ packages: resolution: {integrity: sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==} engines: {node: '>=8'} + restructure@3.0.2: + resolution: {integrity: sha512-gSfoiOEA0VPE6Tukkrr7I0RBdE0s7H1eFCDBk05l1KIQT1UIKNc5JZy6jdyW6eYH3aR3g5b3PuL77rq0hvwtAw==} + + retext-latin@4.0.0: + resolution: {integrity: sha512-hv9woG7Fy0M9IlRQloq/N6atV82NxLGveq+3H2WOi79dtIYWN8OaxogDm77f8YnVXJL2VD3bbqowu5E3EMhBYA==} + + retext-smartypants@6.2.0: + resolution: {integrity: sha512-kk0jOU7+zGv//kfjXEBjdIryL1Acl4i9XNkHxtM7Tm5lFiCog576fjNC9hjoR7LTKQ0DsPWy09JummSsH1uqfQ==} + + retext-stringify@4.0.0: + resolution: {integrity: sha512-rtfN/0o8kL1e+78+uxPTqu1Klt0yPzKuQ2BfWwwfgIUSayyzxpM1PJzkKt4V8803uB9qSy32MvI7Xep9khTpiA==} + + retext@9.0.0: + resolution: {integrity: sha512-sbMDcpHCNjvlheSgMfEcVrZko3cDzdbe1x/e7G66dFp0Ff7Mldvi2uv6JkJQzdRcvLYE8CA8Oe8siQx8ZOgTcA==} + retry@0.12.0: resolution: {integrity: sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==} engines: {node: '>= 4'} @@ -8717,6 +9547,10 @@ packages: engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true + run-applescript@7.1.0: + resolution: {integrity: sha512-DPe5pVFaAsinSaV6QjQ6gdiedWDcRCbUuiQfQa2wmWV7+xC9bGulGI8+TdRmoFkAPaBXk8CrAbnlY2ISniJ47Q==} + engines: {node: '>=18'} + run-async@2.4.1: resolution: {integrity: sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==} engines: {node: '>=0.12.0'} @@ -8740,6 +9574,9 @@ packages: safer-buffer@2.1.2: resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + sax@1.4.3: + resolution: {integrity: sha512-yqYn1JhPczigF94DMS+shiDMjDowYO6y9+wB/4WgO0Y19jWYk0lQ4tuG5KI7kj4FTp1wxPj5IFfcrz/s1c3jjQ==} + saxes@6.0.0: resolution: {integrity: sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==} engines: {node: '>=v12.22.7'} @@ -8824,6 +9661,9 @@ packages: shiki@2.5.0: resolution: {integrity: sha512-mI//trrsaiCIPsja5CNfsyNOqgAZUb6VpJA+340toL42UpzQlXpwRV9nch69X6gaUxrr9kaOOa6e3y3uAkGFxQ==} + shiki@3.20.0: + resolution: {integrity: sha512-kgCOlsnyWb+p0WU+01RjkCH+eBVsjL1jOwUYWv0YDWkM2/A46+LDKVs5yZCUXjJG6bj4ndFoAg5iLIIue6dulg==} + sigmund@1.0.1: resolution: {integrity: sha512-fCvEXfh6NWpm+YSuY2bpXb/VIihqWA6hLsgboC+0nl71Q7N7o2eaCW8mJa/NLvQhs6jpd3VZV4UiUQlV6+lc8g==} @@ -8842,9 +9682,18 @@ packages: resolution: {integrity: sha512-8G+/XDU8wNsJOQS5ysDVO0Etg9/2uA5gR9l4ZwijjlwxBcrU6RPfwi2+jJmbP+Ap1Hlp/nVAaEO4Fj22/SL2gQ==} engines: {node: ^16.14.0 || >=18.0.0} + sirv@3.0.2: + resolution: {integrity: sha512-2wcC/oGxHis/BoHkkPwldgiPSYcpZK3JU28WoMVv55yHJgcZ8rlXvuG9iZggz+sU1d4bRgIGASwyWqjxu3FM0g==} + engines: {node: '>=18'} + sisteransi@1.0.5: resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} + sitemap@8.0.2: + resolution: {integrity: sha512-LwktpJcyZDoa0IL6KT++lQ53pbSrx2c9ge41/SeLTyqy2XUNA6uR4+P9u5IVo5lPeL2arAcOKn1aZAxoYbCKlQ==} + engines: {node: '>=14.0.0', npm: '>=6.0.0'} + hasBin: true + size-limit@11.2.0: resolution: {integrity: sha512-2kpQq2DD/pRpx3Tal/qRW1SYwcIeQ0iq8li5CJHQgOC+FtPn2BVmuDtzUCgNnpCrbgtfEHqh+iWzxK+Tq6C+RQ==} engines: {node: ^18.0.0 || >=20.0.0} @@ -8869,6 +9718,10 @@ packages: smob@1.5.0: resolution: {integrity: sha512-g6T+p7QO8npa+/hNx9ohv1E5pVCmWrVCUzUXJyLdMmftX6ER0oiWY/w9knEonLpnOp6b6FenKnMfR8gqwWdwig==} + smol-toml@1.6.0: + resolution: {integrity: sha512-4zemZi0HvTnYwLfrpk/CF9LOd9Lt87kAt50GnqhMpyF9U3poDAP2+iukq2bZsO/ufegbYehBkqINbsWxj4l4cw==} + engines: {node: '>= 18'} + socks-proxy-agent@8.0.5: resolution: {integrity: sha512-HehCEsotFqbPW9sJ8WVYB6UbmIMv7kUUORIF2Nncq4VQvBfNBLibW9YZR5dlYCSUhwcD628pRllm7n+E+YTzJw==} engines: {node: '>= 14'} @@ -8954,6 +9807,9 @@ packages: stream-combiner2@1.1.1: resolution: {integrity: sha512-3PnJbYgS56AeWgtKF5jtJRT6uFJe56Z0Hc5Ngg/6sI6rIt8iiMBTa9cvdyFfpMQjaVHr8dusbNeFGIIonxOvKw==} + stream-replace-string@2.0.0: + resolution: {integrity: sha512-TlnjJ1C0QrmxRNrON00JvaFFlNh5TTG00APw23j74ET7gkQpTASi6/L2fuiav8pzK715HXtUeClpBTw2NPSn6w==} + string-argv@0.3.2: resolution: {integrity: sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==} engines: {node: '>=0.6.19'} @@ -8970,6 +9826,10 @@ packages: resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} engines: {node: '>=12'} + string-width@7.2.0: + resolution: {integrity: sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==} + engines: {node: '>=18'} + string_decoder@1.1.1: resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} @@ -9058,12 +9918,24 @@ packages: resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} engines: {node: '>= 0.4'} + svgo@4.0.0: + resolution: {integrity: sha512-VvrHQ+9uniE+Mvx3+C9IEe/lWasXCU0nXMY2kZeLrHNICuRiC8uMPyM14UEaMOFA5mhyQqEkB02VoQ16n3DLaw==} + engines: {node: '>=16'} + hasBin: true + symbol-tree@3.2.4: resolution: {integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==} tabbable@6.3.0: resolution: {integrity: sha512-EIHvdY5bPLuWForiR/AN2Bxngzpuwn1is4asboytXtpTgsArc+WmSJKVLlhdh71u7jFcryDqB2A8lQvj78MkyQ==} + tailwindcss@4.1.18: + resolution: {integrity: sha512-4+Z+0yiYyEtUVCScyfHCxOYP06L5Ne+JiHhY2IjR2KWMIWhJOYZKLSGZaP5HkZ8+bY0cxfzwDE5uOmzFXyIwxw==} + + tapable@2.3.0: + resolution: {integrity: sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg==} + engines: {node: '>=6'} + tar-stream@2.2.0: resolution: {integrity: sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==} engines: {node: '>=6'} @@ -9133,6 +10005,9 @@ packages: resolution: {integrity: sha512-75voc/9G4rDIJleOo4jPvN4/YC4GRZrY8yy1uU4lwrB3XEQbWve8zXoO5No4eFrGcTAMYyoY67p8jRQdtA1HbA==} engines: {node: '>=12'} + tiny-inflate@1.0.3: + resolution: {integrity: sha512-pkY1fj1cKHb2seWDy0B16HeWyczlJA9/WW3u3c4z/NiWDsO3DOU5D7nhTLE9CF0yXv/QZFY7sEJmj24dK+Rrqw==} + tinyexec@0.3.2: resolution: {integrity: sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==} @@ -9163,6 +10038,10 @@ packages: resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} engines: {node: '>=8.0'} + totalist@3.0.1: + resolution: {integrity: sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==} + engines: {node: '>=6'} + tough-cookie@4.1.4: resolution: {integrity: sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag==} engines: {node: '>=6'} @@ -9261,6 +10140,16 @@ packages: tsbuffer@2.2.23: resolution: {integrity: sha512-B5SENaf8X849oOtmC0Hgev2M3vC8BNyAIIwQD4NJmHPNjktCyplXpVIcjns3I8EnM2GNQwVaBvtnsUgkUj8Q9Q==} + tsconfck@3.1.6: + resolution: {integrity: sha512-ks6Vjr/jEw0P1gmOVwutM3B7fWxoWBL2KRDb1JfqGVawBmO5UsvmWOQFGHBPl5yxYz4eERr19E6L7NMv+Fej4w==} + engines: {node: ^18 || >=20} + hasBin: true + peerDependencies: + typescript: ^5.0.0 + peerDependenciesMeta: + typescript: + optional: true + tsconfig-paths@4.2.0: resolution: {integrity: sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg==} engines: {node: '>=6'} @@ -9458,6 +10347,12 @@ packages: engines: {node: '>=0.8.0'} hasBin: true + ultrahtml@1.6.0: + resolution: {integrity: sha512-R9fBn90VTJrqqLDwyMph+HGne8eqY1iPfYhPzZrvKpIfwkWZbcYlfpsb8B9dTvBfpy1/hqAD7Wi8EKfP9e8zdw==} + + uncrypto@0.1.3: + resolution: {integrity: sha512-Ql87qFHB3s/De2ClA9e0gsnS6zXG27SkTiSJwjCc9MebbfapQfuPzumMIUMi38ezPZVNFcHI9sUIepeQfw8J8Q==} + undici-types@6.21.0: resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} @@ -9477,10 +10372,16 @@ packages: resolution: {integrity: sha512-JQ84qTuMg4nVkx8ga4A16a1epI9H6uTXAknqxkGF/aFfRLw1xC/Bp24HNLaZhHSkWd3+84t8iXnp1J0kYcZHhg==} engines: {node: '>=4'} + unicode-properties@1.4.1: + resolution: {integrity: sha512-CLjCCLQ6UuMxWnbIylkisbRj31qxHPAurvena/0iwSVbQ2G1VY5/HjV0IRabOEbDHlzZlRdCrD4NhB0JtU40Pg==} + unicode-property-aliases-ecmascript@2.2.0: resolution: {integrity: sha512-hpbDzxUY9BFwX+UeBnxv3Sh1q7HFxj48DTmXchNgRa46lO8uj3/1iEn3MiNUYTg1g9ctIqXCCERn8gYZhHC5lQ==} engines: {node: '>=4'} + unicode-trie@2.0.0: + resolution: {integrity: sha512-x7bc76x0bm4prf1VLg79uhAzKw8DVboClSN5VxJuQ+LKDOVEW9CdH+VY7SP+vX7xCYQqzzgQpFqz15zeLvAtZQ==} + unicorn-magic@0.1.0: resolution: {integrity: sha512-lRfVq8fE8gz6QMBuDM6a+LO3IAzTi05H6gCVaUpir2E1Rwpo4ZUog45KpNXKC/Mn3Yb9UDuHumeFTo9iV/D9FQ==} engines: {node: '>=18'} @@ -9492,6 +10393,9 @@ packages: unified@11.0.5: resolution: {integrity: sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA==} + unifont@0.6.0: + resolution: {integrity: sha512-5Fx50fFQMQL5aeHyWnZX9122sSLckcDvcfFiBf3QYeHa7a1MKJooUy52b67moi2MJYkrfo/TWY+CoLdr/w0tTA==} + unique-filename@3.0.0: resolution: {integrity: sha512-afXhuC55wkAmZ0P18QsVE6kp8JaxrEokN2HGIoIVv2ijHQd419H0+6EigAFcIzXeMIkcIkNBpB3L/DXB3cTS/g==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} @@ -9508,15 +10412,30 @@ packages: resolution: {integrity: sha512-VGXBUVwxKMBUznyffQweQABPRRW1vHZAbadFZud4pLFAqRGvv/96vafgjWFqzourzr8YonlQiPgH0YCJfawoGQ==} engines: {node: '>=12'} + unist-util-find-after@5.0.0: + resolution: {integrity: sha512-amQa0Ep2m6hE2g72AugUItjbuM8X8cGQnFoHk0pGfrFeT9GZhzN5SW8nRsiGKK7Aif4CrACPENkA6P/Lw6fHGQ==} + unist-util-is@6.0.1: resolution: {integrity: sha512-LsiILbtBETkDz8I9p1dQ0uyRUWuaQzd/cuEeS1hoRSyW5E5XGmTzlwY1OrNzzakGowI9Dr/I8HVaw4hTtnxy8g==} + unist-util-modify-children@4.0.0: + resolution: {integrity: sha512-+tdN5fGNddvsQdIzUF3Xx82CU9sMM+fA0dLgR9vOmT0oPT2jH+P1nd5lSqfCfXAw+93NhcXNY2qqvTUtE4cQkw==} + + unist-util-position-from-estree@2.0.0: + resolution: {integrity: sha512-KaFVRjoqLyF6YXCbVLNad/eS4+OfPQQn2yOd7zF/h5T/CSL2v8NpN6a5TPvtbXthAGw5nG+PuTtq+DdIZr+cRQ==} + unist-util-position@5.0.0: resolution: {integrity: sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==} + unist-util-remove-position@5.0.0: + resolution: {integrity: sha512-Hp5Kh3wLxv0PHj9m2yZhhLt58KzPtEYKQQ4yxfYFEO7EvHwzyDYnduhHnY1mDxoqr7VUwVuHXk9RXKIiYS1N8Q==} + unist-util-stringify-position@4.0.0: resolution: {integrity: sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==} + unist-util-visit-children@3.0.0: + resolution: {integrity: sha512-RgmdTfSBOg04sdPcpTSD1jzoNBjt9a80/ZCzp5cI9n1qPzLZWF9YdvWGN2zmTumP1HWhXKdUWexjy/Wy/lJ7tA==} + unist-util-visit-parents@6.0.2: resolution: {integrity: sha512-goh1s1TBrqSqukSc8wrjwWhL0hiJxgA8m4kFxGlQ+8FYQ3C/m11FcTs4YYem7V664AhHVvgoQLk890Ssdsr2IQ==} @@ -9568,6 +10487,68 @@ packages: resolution: {integrity: sha512-5uKD0nqiYVzlmCRs01Fhs2BdkEgBS3SAVP6ndrBsuK42iC2+JHyxM05Rm9G8+5mkmRtzMZGY8Ct5+mliZxU/Ww==} engines: {node: '>=18.12.0'} + unstorage@1.17.3: + resolution: {integrity: sha512-i+JYyy0DoKmQ3FximTHbGadmIYb8JEpq7lxUjnjeB702bCPum0vzo6oy5Mfu0lpqISw7hCyMW2yj4nWC8bqJ3Q==} + peerDependencies: + '@azure/app-configuration': ^1.8.0 + '@azure/cosmos': ^4.2.0 + '@azure/data-tables': ^13.3.0 + '@azure/identity': ^4.6.0 + '@azure/keyvault-secrets': ^4.9.0 + '@azure/storage-blob': ^12.26.0 + '@capacitor/preferences': ^6.0.3 || ^7.0.0 + '@deno/kv': '>=0.9.0' + '@netlify/blobs': ^6.5.0 || ^7.0.0 || ^8.1.0 || ^9.0.0 || ^10.0.0 + '@planetscale/database': ^1.19.0 + '@upstash/redis': ^1.34.3 + '@vercel/blob': '>=0.27.1' + '@vercel/functions': ^2.2.12 || ^3.0.0 + '@vercel/kv': ^1.0.1 + aws4fetch: ^1.0.20 + db0: '>=0.2.1' + idb-keyval: ^6.2.1 + ioredis: ^5.4.2 + uploadthing: ^7.4.4 + peerDependenciesMeta: + '@azure/app-configuration': + optional: true + '@azure/cosmos': + optional: true + '@azure/data-tables': + optional: true + '@azure/identity': + optional: true + '@azure/keyvault-secrets': + optional: true + '@azure/storage-blob': + optional: true + '@capacitor/preferences': + optional: true + '@deno/kv': + optional: true + '@netlify/blobs': + optional: true + '@planetscale/database': + optional: true + '@upstash/redis': + optional: true + '@vercel/blob': + optional: true + '@vercel/functions': + optional: true + '@vercel/kv': + optional: true + aws4fetch: + optional: true + db0: + optional: true + idb-keyval: + optional: true + ioredis: + optional: true + uploadthing: + optional: true + upath@2.0.1: resolution: {integrity: sha512-1uEe95xksV1O0CYKXo8vQvN1JEbtJp7lb7C5U9HMsIp6IVwntkH/oNUzyVNQSd4S1sYk2FpSSW44FqMc8qee5w==} engines: {node: '>=4'} @@ -9631,6 +10612,11 @@ packages: vfile@6.0.3: resolution: {integrity: sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==} + vite-hot-client@2.1.0: + resolution: {integrity: sha512-7SpgZmU7R+dDnSmvXE1mfDtnHLHQSisdySVR7lO8ceAXvM0otZeuQQ6C8LrS5d/aYyP/QZ0hI0L+dIPrm4YlFQ==} + peerDependencies: + vite: ^2.6.0 || ^3.0.0 || ^4.0.0 || ^5.0.0-0 || ^6.0.0-0 || ^7.0.0-0 + vite-plugin-dts@3.9.1: resolution: {integrity: sha512-rVp2KM9Ue22NGWB8dNtWEr+KekN3rIgz1tWD050QnRGlriUCmaDwa7qA5zDEjbXg5lAXhYMSBJtx3q3hQIJZSg==} engines: {node: ^14.18.0 || >=16.0.0} @@ -9650,6 +10636,16 @@ packages: vite: optional: true + vite-plugin-inspect@0.8.9: + resolution: {integrity: sha512-22/8qn+LYonzibb1VeFZmISdVao5kC22jmEKm24vfFE8siEn47EpVcCLYMv6iKOYMJfjSvSJfueOwcFCkUnV3A==} + engines: {node: '>=14'} + peerDependencies: + '@nuxt/kit': '*' + vite: ^3.1.0 || ^4.0.0 || ^5.0.0-0 || ^6.0.1 + peerDependenciesMeta: + '@nuxt/kit': + optional: true + vite-plugin-swc-transform@1.1.1: resolution: {integrity: sha512-uef69pFsfSQTPM95ubXzhqKevWQWCAUh/VQ/FW7IsEgjDkK/OJOXrdmuCSQT0VHZPH6wyhO3I1PWkV4lHK2IZA==} engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} @@ -9661,6 +10657,17 @@ packages: peerDependencies: vite: '>=2.8' + vite-plugin-vue-devtools@7.7.9: + resolution: {integrity: sha512-08DvePf663SxqLFJeMVNW537zzVyakp9KIrI2K7lwgaTqA5R/ydN/N2K8dgZO34tg/Qmw0ch84fOKoBtCEdcGg==} + engines: {node: '>=v14.21.3'} + peerDependencies: + vite: ^3.1.0 || ^4.0.0-0 || ^5.0.0-0 || ^6.0.0-0 || ^7.0.0-0 + + vite-plugin-vue-inspector@5.3.2: + resolution: {integrity: sha512-YvEKooQcSiBTAs0DoYLfefNja9bLgkFM7NI2b07bE2SruuvX0MEa9cMaxjKVMkeCp5Nz9FRIdcN1rOdFVBeL6Q==} + peerDependencies: + vite: ^3.0.0-0 || ^4.0.0-0 || ^5.0.0-0 || ^6.0.0-0 || ^7.0.0-0 + vite-plugin-wasm@3.5.0: resolution: {integrity: sha512-X5VWgCnqiQEGb+omhlBVsvTfxikKtoOgAzQ95+BZ8gQ+VfMHIjSHr0wyvXFQCa0eKQ0fKyaL0kWcEnYqBac4lQ==} peerDependencies: @@ -9737,6 +10744,14 @@ packages: yaml: optional: true + vitefu@1.1.1: + resolution: {integrity: sha512-B/Fegf3i8zh0yFbpzZ21amWzHmuNlLlmJT6n7bu5e+pCHUKQIfXSYokrqOBGEMMe9UG2sostKQF9mml/vYaWJQ==} + peerDependencies: + vite: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0-beta.0 + peerDependenciesMeta: + vite: + optional: true + vitepress@1.6.4: resolution: {integrity: sha512-+2ym1/+0VVrbhNyRoFFesVvBvHAVMZMK0rw60E3X/5349M1GuVdKeazuksqopEdvkKwKGs21Q729jX81/bkBJg==} hasBin: true @@ -9820,6 +10835,10 @@ packages: which-module@2.0.1: resolution: {integrity: sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==} + which-pm-runs@1.1.0: + resolution: {integrity: sha512-n1brCuqClxfFfq/Rb0ICg9giSZqCS+pLtccdag6C2HyufBrh3fBOiy9nb6ggRMvWOVH5GrdJskj5iGTZNxd7SA==} + engines: {node: '>=4'} + which@2.0.2: resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} engines: {node: '>= 8'} @@ -9833,6 +10852,10 @@ packages: wide-align@1.1.5: resolution: {integrity: sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==} + widest-line@5.0.0: + resolution: {integrity: sha512-c9bZp7b5YtRj2wOe6dlj32MK+Bx/M/d+9VB2SHM1OtsUHR0aV0tdP6DWh/iMt0kWi1t5g1Iudu6hQRNd1A4PVA==} + engines: {node: '>=18'} + word-wrap@1.2.5: resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} engines: {node: '>=0.10.0'} @@ -9852,6 +10875,10 @@ packages: resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} engines: {node: '>=12'} + wrap-ansi@9.0.2: + resolution: {integrity: sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww==} + engines: {node: '>=18'} + wrappy@1.0.2: resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} @@ -9898,6 +10925,10 @@ packages: utf-8-validate: optional: true + wsl-utils@0.1.0: + resolution: {integrity: sha512-h3Fbisa2nKGPxCpm89Hk33lBLsnaGBvctQopaBSOW/uIs6FTe1ATyAnKFJrzVs9vpGdsTe73WF3V4lIsk4Gacw==} + engines: {node: '>=18'} + xml-name-validator@4.0.0: resolution: {integrity: sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==} engines: {node: '>=12'} @@ -9909,6 +10940,9 @@ packages: resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==} engines: {node: '>=0.4'} + xxhash-wasm@1.1.0: + resolution: {integrity: sha512-147y/6YNh+tlp6nd/2pWq38i9h6mz/EuQ6njIrmW8D1BS5nCqs0P6DG+m6zTGnNz5I+uhZ0SHxBs9BsPrwcKDA==} + y18n@4.0.3: resolution: {integrity: sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==} @@ -9962,6 +10996,14 @@ packages: resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} engines: {node: '>=10'} + yocto-queue@1.2.2: + resolution: {integrity: sha512-4LCcse/U2MHZ63HAJVE+v71o7yOdIe4cZ70Wpf8D/IyjDKYQLV5GD46B+hSTjJsvV5PztjvHoU580EftxjDZFQ==} + engines: {node: '>=12.20'} + + yocto-spinner@0.2.3: + resolution: {integrity: sha512-sqBChb33loEnkoXte1bLg45bEBsOP9N1kzQh5JZNKj/0rik4zAPTNSAVPj3uQAdc6slYJ0Ksc403G2XgxsJQFQ==} + engines: {node: '>=18.19'} + yoctocolors@2.1.2: resolution: {integrity: sha512-CzhO+pFNo8ajLM2d2IW/R93ipy99LWjtwblvC1RsoSUMZgyLbYFr221TnSNT7GjGdYui6P459mw9JH/g/zW2ug==} engines: {node: '>=18'} @@ -9971,6 +11013,20 @@ packages: engines: {node: '>=8.0.0'} hasBin: true + zod-to-json-schema@3.25.0: + resolution: {integrity: sha512-HvWtU2UG41LALjajJrML6uQejQhNJx+JBO9IflpSja4R03iNWfKXrj6W2h7ljuLyc1nKS+9yDyL/9tD1U/yBnQ==} + peerDependencies: + zod: ^3.25 || ^4 + + zod-to-ts@1.2.0: + resolution: {integrity: sha512-x30XE43V+InwGpvTySRNz9kB7qFU8DlyEy7BsSTCHPH1R0QasMmHWZDCzYm6bVXtj/9NNJAZF3jW8rzFvH5OFA==} + peerDependencies: + typescript: ^4.9.4 || ^5.0.2 + zod: ^3 + + zod@3.25.76: + resolution: {integrity: sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==} + zustand@5.0.9: resolution: {integrity: sha512-ALBtUj0AfjJt3uNRQoL1tL2tMvj6Gp/6e39dnfT6uzpelGru8v1tPOGBzayOWbPJvujM8JojDk3E1LxeFisBNg==} engines: {node: '>=12.20.0'} @@ -10111,6 +11167,138 @@ snapshots: package-manager-detector: 1.6.0 tinyexec: 1.0.2 + '@antfu/utils@0.7.10': {} + + '@astrojs/compiler@2.13.0': {} + + '@astrojs/internal-helpers@0.7.5': {} + + '@astrojs/markdown-remark@6.3.10': + dependencies: + '@astrojs/internal-helpers': 0.7.5 + '@astrojs/prism': 3.3.0 + github-slugger: 2.0.0 + hast-util-from-html: 2.0.3 + hast-util-to-text: 4.0.2 + import-meta-resolve: 4.2.0 + js-yaml: 4.1.1 + mdast-util-definitions: 6.0.0 + rehype-raw: 7.0.0 + rehype-stringify: 10.0.1 + remark-gfm: 4.0.1 + remark-parse: 11.0.0 + remark-rehype: 11.1.2 + remark-smartypants: 3.0.2 + shiki: 3.20.0 + smol-toml: 1.6.0 + unified: 11.0.5 + unist-util-remove-position: 5.0.0 + unist-util-visit: 5.0.0 + unist-util-visit-parents: 6.0.2 + vfile: 6.0.3 + transitivePeerDependencies: + - supports-color + + '@astrojs/mdx@4.3.13(astro@5.16.6(@types/node@20.19.27)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.54.0)(terser@5.44.1)(tsx@4.21.0)(typescript@5.9.3)(yaml@2.8.2))': + dependencies: + '@astrojs/markdown-remark': 6.3.10 + '@mdx-js/mdx': 3.1.1 + acorn: 8.15.0 + astro: 5.16.6(@types/node@20.19.27)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.54.0)(terser@5.44.1)(tsx@4.21.0)(typescript@5.9.3)(yaml@2.8.2) + es-module-lexer: 1.7.0 + estree-util-visit: 2.0.0 + hast-util-to-html: 9.0.5 + piccolore: 0.1.3 + rehype-raw: 7.0.0 + remark-gfm: 4.0.1 + remark-smartypants: 3.0.2 + source-map: 0.7.6 + unist-util-visit: 5.0.0 + vfile: 6.0.3 + transitivePeerDependencies: + - supports-color + + '@astrojs/prism@3.3.0': + dependencies: + prismjs: 1.30.0 + + '@astrojs/sitemap@3.6.0': + dependencies: + sitemap: 8.0.2 + stream-replace-string: 2.0.0 + zod: 3.25.76 + + '@astrojs/starlight@0.37.1(astro@5.16.6(@types/node@20.19.27)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.54.0)(terser@5.44.1)(tsx@4.21.0)(typescript@5.9.3)(yaml@2.8.2))': + dependencies: + '@astrojs/markdown-remark': 6.3.10 + '@astrojs/mdx': 4.3.13(astro@5.16.6(@types/node@20.19.27)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.54.0)(terser@5.44.1)(tsx@4.21.0)(typescript@5.9.3)(yaml@2.8.2)) + '@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.16.6(@types/node@20.19.27)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.54.0)(terser@5.44.1)(tsx@4.21.0)(typescript@5.9.3)(yaml@2.8.2) + astro-expressive-code: 0.41.5(astro@5.16.6(@types/node@20.19.27)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.54.0)(terser@5.44.1)(tsx@4.21.0)(typescript@5.9.3)(yaml@2.8.2)) + bcp-47: 2.1.0 + hast-util-from-html: 2.0.3 + hast-util-select: 6.0.4 + hast-util-to-string: 3.0.1 + hastscript: 9.0.1 + i18next: 23.16.8 + js-yaml: 4.1.1 + klona: 2.0.6 + magic-string: 0.30.21 + mdast-util-directive: 3.1.0 + mdast-util-to-markdown: 2.1.2 + mdast-util-to-string: 4.0.0 + pagefind: 1.4.0 + rehype: 13.0.2 + rehype-format: 5.0.1 + remark-directive: 3.0.1 + ultrahtml: 1.6.0 + unified: 11.0.5 + unist-util-visit: 5.0.0 + vfile: 6.0.3 + transitivePeerDependencies: + - supports-color + + '@astrojs/telemetry@3.3.0': + dependencies: + ci-info: 4.3.1 + debug: 4.4.3 + dlv: 1.1.3 + dset: 3.1.4 + is-docker: 3.0.0 + is-wsl: 3.1.0 + which-pm-runs: 1.1.0 + transitivePeerDependencies: + - supports-color + + '@astrojs/vue@5.1.3(@types/node@20.19.27)(astro@5.16.6(@types/node@20.19.27)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.54.0)(terser@5.44.1)(tsx@4.21.0)(typescript@5.9.3)(yaml@2.8.2))(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.54.0)(terser@5.44.1)(tsx@4.21.0)(vue@3.5.26(typescript@5.9.3))(yaml@2.8.2)': + dependencies: + '@vitejs/plugin-vue': 5.2.1(vite@6.4.1(@types/node@20.19.27)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2))(vue@3.5.26(typescript@5.9.3)) + '@vitejs/plugin-vue-jsx': 4.2.0(vite@6.4.1(@types/node@20.19.27)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2))(vue@3.5.26(typescript@5.9.3)) + '@vue/compiler-sfc': 3.5.26 + astro: 5.16.6(@types/node@20.19.27)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.54.0)(terser@5.44.1)(tsx@4.21.0)(typescript@5.9.3)(yaml@2.8.2) + vite: 6.4.1(@types/node@20.19.27)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2) + vite-plugin-vue-devtools: 7.7.9(rollup@4.54.0)(vite@6.4.1(@types/node@20.19.27)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2))(vue@3.5.26(typescript@5.9.3)) + vue: 3.5.26(typescript@5.9.3) + transitivePeerDependencies: + - '@nuxt/kit' + - '@types/node' + - jiti + - less + - lightningcss + - rollup + - sass + - sass-embedded + - stylus + - sugarss + - supports-color + - terser + - tsx + - yaml + '@babel/code-frame@7.27.1': dependencies: '@babel/helper-validator-identifier': 7.28.5 @@ -10304,6 +11492,15 @@ snapshots: transitivePeerDependencies: - supports-color + '@babel/plugin-proposal-decorators@7.28.0(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-create-class-features-plugin': 7.28.5(@babel/core@7.28.5) + '@babel/helper-plugin-utils': 7.27.1 + '@babel/plugin-syntax-decorators': 7.27.1(@babel/core@7.28.5) + transitivePeerDependencies: + - supports-color + '@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2(@babel/core@7.28.5)': dependencies: '@babel/core': 7.28.5 @@ -10328,6 +11525,11 @@ snapshots: '@babel/core': 7.28.5 '@babel/helper-plugin-utils': 7.27.1 + '@babel/plugin-syntax-decorators@7.27.1(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/plugin-syntax-import-assertions@7.27.1(@babel/core@7.28.5)': dependencies: '@babel/core': 7.28.5 @@ -10724,6 +11926,17 @@ snapshots: '@babel/core': 7.28.5 '@babel/helper-plugin-utils': 7.27.1 + '@babel/plugin-transform-typescript@7.28.5(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-annotate-as-pure': 7.27.3 + '@babel/helper-create-class-features-plugin': 7.28.5(@babel/core@7.28.5) + '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 + '@babel/plugin-syntax-typescript': 7.27.1(@babel/core@7.28.5) + transitivePeerDependencies: + - supports-color + '@babel/plugin-transform-unicode-escapes@7.27.1(@babel/core@7.28.5)': dependencies: '@babel/core': 7.28.5 @@ -10857,6 +12070,10 @@ snapshots: '@bcoe/v8-coverage@0.2.3': {} + '@capsizecss/unpack@3.0.1': + dependencies: + fontkit: 2.0.4 + '@changesets/apply-release-plan@7.0.14': dependencies: '@changesets/config': 3.1.2 @@ -11136,6 +12353,8 @@ snapshots: dependencies: '@jridgewell/trace-mapping': 0.3.9 + '@ctrl/tinycolor@4.2.0': {} + '@docsearch/css@3.8.2': {} '@docsearch/js@3.8.2(@algolia/client-search@5.46.2)(@types/react@18.3.27)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(search-insights@2.17.3)': @@ -11447,6 +12666,31 @@ snapshots: '@eslint/core': 0.17.0 levn: 0.4.1 + '@expressive-code/core@0.41.5': + dependencies: + '@ctrl/tinycolor': 4.2.0 + hast-util-select: 6.0.4 + hast-util-to-html: 9.0.5 + hast-util-to-text: 4.0.2 + hastscript: 9.0.1 + postcss: 8.5.6 + postcss-nested: 6.2.0(postcss@8.5.6) + unist-util-visit: 5.0.0 + unist-util-visit-parents: 6.0.2 + + '@expressive-code/plugin-frames@0.41.5': + dependencies: + '@expressive-code/core': 0.41.5 + + '@expressive-code/plugin-shiki@0.41.5': + dependencies: + '@expressive-code/core': 0.41.5 + shiki: 3.20.0 + + '@expressive-code/plugin-text-markers@0.41.5': + dependencies: + '@expressive-code/core': 0.41.5 + '@gerrit0/mini-shiki@3.20.0': dependencies: '@shikijs/engine-oniguruma': 3.20.0 @@ -11624,7 +12868,7 @@ snapshots: jest-util: 29.7.0 slash: 3.0.0 - '@jest/core@29.7.0(ts-node@10.9.2(@swc/core@1.15.7)(@swc/wasm@1.15.7)(@types/node@20.19.27)(typescript@5.9.3))': + '@jest/core@29.7.0(ts-node@10.9.2(@swc/core@1.15.7(@swc/helpers@0.5.18))(@swc/wasm@1.15.7)(@types/node@20.19.27)(typescript@5.9.3))': dependencies: '@jest/console': 29.7.0 '@jest/reporters': 29.7.0 @@ -11638,7 +12882,7 @@ snapshots: exit: 0.1.2 graceful-fs: 4.2.11 jest-changed-files: 29.7.0 - jest-config: 29.7.0(@types/node@20.19.27)(ts-node@10.9.2(@swc/core@1.15.7)(@swc/wasm@1.15.7)(@types/node@20.19.27)(typescript@5.9.3)) + jest-config: 29.7.0(@types/node@20.19.27)(ts-node@10.9.2(@swc/core@1.15.7(@swc/helpers@0.5.18))(@swc/wasm@1.15.7)(@types/node@20.19.27)(typescript@5.9.3)) jest-haste-map: 29.7.0 jest-message-util: 29.7.0 jest-regex-util: 29.6.3 @@ -11806,12 +13050,12 @@ snapshots: '@jridgewell/resolve-uri': 3.1.2 '@jridgewell/sourcemap-codec': 1.5.5 - '@lerna/create@8.2.4(@swc/core@1.15.7)(@types/node@20.19.27)(encoding@0.1.13)(typescript@5.9.3)': + '@lerna/create@8.2.4(@swc/core@1.15.7(@swc/helpers@0.5.18))(@types/node@20.19.27)(encoding@0.1.13)(typescript@5.9.3)': dependencies: '@npmcli/arborist': 7.5.4 '@npmcli/package-json': 5.2.0 '@npmcli/run-script': 8.1.0 - '@nx/devkit': 20.8.3(nx@20.8.3(@swc/core@1.15.7)) + '@nx/devkit': 20.8.3(nx@20.8.3(@swc/core@1.15.7(@swc/helpers@0.5.18))) '@octokit/plugin-enterprise-rest': 6.0.1 '@octokit/rest': 20.1.2 aproba: 2.0.0 @@ -11848,7 +13092,7 @@ snapshots: npm-package-arg: 11.0.2 npm-packlist: 8.0.2 npm-registry-fetch: 17.1.0 - nx: 20.8.3(@swc/core@1.15.7) + nx: 20.8.3(@swc/core@1.15.7(@swc/helpers@0.5.18)) p-map: 4.0.0 p-map-series: 2.1.0 p-queue: 6.6.2 @@ -11904,6 +13148,36 @@ snapshots: globby: 11.1.0 read-yaml-file: 1.1.0 + '@mdx-js/mdx@3.1.1': + dependencies: + '@types/estree': 1.0.8 + '@types/estree-jsx': 1.0.5 + '@types/hast': 3.0.4 + '@types/mdx': 2.0.13 + acorn: 8.15.0 + collapse-white-space: 2.1.0 + devlop: 1.1.0 + estree-util-is-identifier-name: 3.0.0 + estree-util-scope: 1.0.0 + estree-walker: 3.0.3 + hast-util-to-jsx-runtime: 2.3.6 + markdown-extensions: 2.0.0 + recma-build-jsx: 1.0.0 + recma-jsx: 1.0.1(acorn@8.15.0) + recma-stringify: 1.0.0 + rehype-recma: 1.0.0 + remark-mdx: 3.1.1 + remark-parse: 11.0.0 + remark-rehype: 11.1.2 + source-map: 0.7.6 + unified: 11.0.5 + unist-util-position-from-estree: 2.0.0 + unist-util-stringify-position: 4.0.0 + unist-util-visit: 5.0.0 + vfile: 6.0.3 + transitivePeerDependencies: + - supports-color + '@microsoft/api-extractor-model@7.28.13(@types/node@20.19.27)': dependencies: '@microsoft/tsdoc': 0.14.2 @@ -12134,13 +13408,13 @@ snapshots: - bluebird - supports-color - '@nx/devkit@20.8.3(nx@20.8.3(@swc/core@1.15.7))': + '@nx/devkit@20.8.3(nx@20.8.3(@swc/core@1.15.7(@swc/helpers@0.5.18)))': dependencies: ejs: 3.1.10 enquirer: 2.3.6 ignore: 5.3.2 minimatch: 9.0.3 - nx: 20.8.3(@swc/core@1.15.7) + nx: 20.8.3(@swc/core@1.15.7(@swc/helpers@0.5.18)) semver: 7.7.3 tmp: 0.2.5 tslib: 2.8.1 @@ -12324,6 +13598,28 @@ snapshots: dependencies: '@octokit/openapi-types': 25.1.0 + '@oslojs/encoding@1.1.0': {} + + '@pagefind/darwin-arm64@1.4.0': + optional: true + + '@pagefind/darwin-x64@1.4.0': + optional: true + + '@pagefind/default-ui@1.4.0': {} + + '@pagefind/freebsd-x64@1.4.0': + optional: true + + '@pagefind/linux-arm64@1.4.0': + optional: true + + '@pagefind/linux-x64@1.4.0': + optional: true + + '@pagefind/windows-x64@1.4.0': + optional: true + '@pkgjs/parseargs@0.11.0': optional: true @@ -12339,6 +13635,8 @@ snapshots: '@pnpm/network.ca-file': 1.0.2 config-chain: 1.1.13 + '@polka/url@1.0.0-next.29': {} + '@protobufjs/aspromise@1.1.2': {} '@protobufjs/base64@1.1.2': {} @@ -12738,12 +14036,25 @@ snapshots: '@types/hast': 3.0.4 hast-util-to-html: 9.0.5 + '@shikijs/core@3.20.0': + dependencies: + '@shikijs/types': 3.20.0 + '@shikijs/vscode-textmate': 10.0.2 + '@types/hast': 3.0.4 + hast-util-to-html: 9.0.5 + '@shikijs/engine-javascript@2.5.0': dependencies: '@shikijs/types': 2.5.0 '@shikijs/vscode-textmate': 10.0.2 oniguruma-to-es: 3.1.1 + '@shikijs/engine-javascript@3.20.0': + dependencies: + '@shikijs/types': 3.20.0 + '@shikijs/vscode-textmate': 10.0.2 + oniguruma-to-es: 4.3.4 + '@shikijs/engine-oniguruma@2.5.0': dependencies: '@shikijs/types': 2.5.0 @@ -12881,7 +14192,7 @@ snapshots: '@swc/core-win32-x64-msvc@1.15.7': optional: true - '@swc/core@1.15.7': + '@swc/core@1.15.7(@swc/helpers@0.5.18)': dependencies: '@swc/counter': 0.1.3 '@swc/types': 0.1.25 @@ -12896,15 +14207,88 @@ snapshots: '@swc/core-win32-arm64-msvc': 1.15.7 '@swc/core-win32-ia32-msvc': 1.15.7 '@swc/core-win32-x64-msvc': 1.15.7 + '@swc/helpers': 0.5.18 '@swc/counter@0.1.3': {} + '@swc/helpers@0.5.18': + dependencies: + tslib: 2.8.1 + '@swc/types@0.1.25': dependencies: '@swc/counter': 0.1.3 '@swc/wasm@1.15.7': {} + '@tailwindcss/node@4.1.18': + dependencies: + '@jridgewell/remapping': 2.3.5 + enhanced-resolve: 5.18.4 + jiti: 2.6.1 + lightningcss: 1.30.2 + magic-string: 0.30.21 + source-map-js: 1.2.1 + tailwindcss: 4.1.18 + + '@tailwindcss/oxide-android-arm64@4.1.18': + optional: true + + '@tailwindcss/oxide-darwin-arm64@4.1.18': + optional: true + + '@tailwindcss/oxide-darwin-x64@4.1.18': + optional: true + + '@tailwindcss/oxide-freebsd-x64@4.1.18': + optional: true + + '@tailwindcss/oxide-linux-arm-gnueabihf@4.1.18': + optional: true + + '@tailwindcss/oxide-linux-arm64-gnu@4.1.18': + optional: true + + '@tailwindcss/oxide-linux-arm64-musl@4.1.18': + optional: true + + '@tailwindcss/oxide-linux-x64-gnu@4.1.18': + optional: true + + '@tailwindcss/oxide-linux-x64-musl@4.1.18': + optional: true + + '@tailwindcss/oxide-wasm32-wasi@4.1.18': + optional: true + + '@tailwindcss/oxide-win32-arm64-msvc@4.1.18': + optional: true + + '@tailwindcss/oxide-win32-x64-msvc@4.1.18': + optional: true + + '@tailwindcss/oxide@4.1.18': + optionalDependencies: + '@tailwindcss/oxide-android-arm64': 4.1.18 + '@tailwindcss/oxide-darwin-arm64': 4.1.18 + '@tailwindcss/oxide-darwin-x64': 4.1.18 + '@tailwindcss/oxide-freebsd-x64': 4.1.18 + '@tailwindcss/oxide-linux-arm-gnueabihf': 4.1.18 + '@tailwindcss/oxide-linux-arm64-gnu': 4.1.18 + '@tailwindcss/oxide-linux-arm64-musl': 4.1.18 + '@tailwindcss/oxide-linux-x64-gnu': 4.1.18 + '@tailwindcss/oxide-linux-x64-musl': 4.1.18 + '@tailwindcss/oxide-wasm32-wasi': 4.1.18 + '@tailwindcss/oxide-win32-arm64-msvc': 4.1.18 + '@tailwindcss/oxide-win32-x64-msvc': 4.1.18 + + '@tailwindcss/vite@4.1.18(vite@6.4.1(@types/node@20.19.27)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2))': + dependencies: + '@tailwindcss/node': 4.1.18 + '@tailwindcss/oxide': 4.1.18 + tailwindcss: 4.1.18 + vite: 6.4.1(@types/node@20.19.27)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2) + '@tauri-apps/api@2.9.1': {} '@tauri-apps/cli-darwin-arm64@2.9.6': @@ -13061,6 +14445,10 @@ snapshots: '@types/express-serve-static-core': 5.1.0 '@types/serve-static': 2.2.0 + '@types/fontkit@2.0.8': + dependencies: + '@types/node': 20.19.27 + '@types/graceful-fs@4.1.9': dependencies: '@types/node': 20.19.27 @@ -13086,6 +14474,8 @@ snapshots: expect: 29.7.0 pretty-format: 29.7.0 + '@types/js-yaml@4.0.9': {} + '@types/jsdom@20.0.1': dependencies: '@types/node': 20.19.27 @@ -13107,6 +14497,8 @@ snapshots: '@types/mdurl@2.0.0': {} + '@types/mdx@2.0.13': {} + '@types/minimatch@3.0.5': {} '@types/minimist@1.2.5': {} @@ -13117,8 +14509,14 @@ snapshots: dependencies: '@types/express': 5.0.6 + '@types/nlcst@2.0.3': + dependencies: + '@types/unist': 3.0.3 + '@types/node@12.20.55': {} + '@types/node@17.0.45': {} + '@types/node@20.19.27': dependencies: undici-types: 6.21.0 @@ -13149,6 +14547,10 @@ snapshots: '@types/resolve@1.20.2': {} + '@types/sax@1.2.7': + dependencies: + '@types/node': 20.19.27 + '@types/send@1.2.1': dependencies: '@types/node': 20.19.27 @@ -13278,15 +14680,15 @@ snapshots: '@ungap/structured-clone@1.3.0': {} - '@vitejs/plugin-react-swc@4.2.2(vite@6.4.1(@types/node@20.19.27)(jiti@2.6.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2))': + '@vitejs/plugin-react-swc@4.2.2(@swc/helpers@0.5.18)(vite@6.4.1(@types/node@20.19.27)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2))': dependencies: '@rolldown/pluginutils': 1.0.0-beta.47 - '@swc/core': 1.15.7 - vite: 6.4.1(@types/node@20.19.27)(jiti@2.6.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2) + '@swc/core': 1.15.7(@swc/helpers@0.5.18) + vite: 6.4.1(@types/node@20.19.27)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2) transitivePeerDependencies: - '@swc/helpers' - '@vitejs/plugin-react@4.7.0(vite@6.4.1(@types/node@20.19.27)(jiti@2.6.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2))': + '@vitejs/plugin-react@4.7.0(vite@6.4.1(@types/node@20.19.27)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2))': dependencies: '@babel/core': 7.28.5 '@babel/plugin-transform-react-jsx-self': 7.27.1(@babel/core@7.28.5) @@ -13294,13 +14696,29 @@ snapshots: '@rolldown/pluginutils': 1.0.0-beta.27 '@types/babel__core': 7.20.5 react-refresh: 0.17.0 - vite: 6.4.1(@types/node@20.19.27)(jiti@2.6.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2) + vite: 6.4.1(@types/node@20.19.27)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2) transitivePeerDependencies: - supports-color - '@vitejs/plugin-vue@5.2.4(vite@5.4.21(@types/node@20.19.27)(terser@5.44.1))(vue@3.5.26(typescript@5.9.3))': + '@vitejs/plugin-vue-jsx@4.2.0(vite@6.4.1(@types/node@20.19.27)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2))(vue@3.5.26(typescript@5.9.3))': dependencies: - vite: 5.4.21(@types/node@20.19.27)(terser@5.44.1) + '@babel/core': 7.28.5 + '@babel/plugin-transform-typescript': 7.28.5(@babel/core@7.28.5) + '@rolldown/pluginutils': 1.0.0-beta.47 + '@vue/babel-plugin-jsx': 1.5.0(@babel/core@7.28.5) + vite: 6.4.1(@types/node@20.19.27)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2) + vue: 3.5.26(typescript@5.9.3) + transitivePeerDependencies: + - supports-color + + '@vitejs/plugin-vue@5.2.1(vite@6.4.1(@types/node@20.19.27)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2))(vue@3.5.26(typescript@5.9.3))': + dependencies: + vite: 6.4.1(@types/node@20.19.27)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2) + vue: 3.5.26(typescript@5.9.3) + + '@vitejs/plugin-vue@5.2.4(vite@5.4.21(@types/node@20.19.27)(lightningcss@1.30.2)(terser@5.44.1))(vue@3.5.26(typescript@5.9.3))': + dependencies: + vite: 5.4.21(@types/node@20.19.27)(lightningcss@1.30.2)(terser@5.44.1) vue: 3.5.26(typescript@5.9.3) '@volar/language-core@1.11.1': @@ -13328,6 +14746,35 @@ snapshots: path-browserify: 1.0.1 vscode-uri: 3.1.0 + '@vue/babel-helper-vue-transform-on@1.5.0': {} + + '@vue/babel-plugin-jsx@1.5.0(@babel/core@7.28.5)': + dependencies: + '@babel/helper-module-imports': 7.27.1 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/plugin-syntax-jsx': 7.27.1(@babel/core@7.28.5) + '@babel/template': 7.27.2 + '@babel/traverse': 7.28.5 + '@babel/types': 7.28.5 + '@vue/babel-helper-vue-transform-on': 1.5.0 + '@vue/babel-plugin-resolve-type': 1.5.0(@babel/core@7.28.5) + '@vue/shared': 3.5.26 + optionalDependencies: + '@babel/core': 7.28.5 + transitivePeerDependencies: + - supports-color + + '@vue/babel-plugin-resolve-type@1.5.0(@babel/core@7.28.5)': + dependencies: + '@babel/code-frame': 7.27.1 + '@babel/core': 7.28.5 + '@babel/helper-module-imports': 7.27.1 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/parser': 7.28.5 + '@vue/compiler-sfc': 3.5.26 + transitivePeerDependencies: + - supports-color + '@vue/compiler-core@3.5.26': dependencies: '@babel/parser': 7.28.5 @@ -13367,6 +14814,18 @@ snapshots: dependencies: '@vue/devtools-kit': 7.7.9 + '@vue/devtools-core@7.7.9(vite@6.4.1(@types/node@20.19.27)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2))(vue@3.5.26(typescript@5.9.3))': + dependencies: + '@vue/devtools-kit': 7.7.9 + '@vue/devtools-shared': 7.7.9 + mitt: 3.0.1 + nanoid: 5.1.6 + pathe: 2.0.3 + vite-hot-client: 2.1.0(vite@6.4.1(@types/node@20.19.27)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2)) + vue: 3.5.26(typescript@5.9.3) + transitivePeerDependencies: + - vite + '@vue/devtools-kit@7.7.9': dependencies: '@vue/devtools-shared': 7.7.9 @@ -13587,6 +15046,10 @@ snapshots: transitivePeerDependencies: - encoding + ansi-align@3.0.1: + dependencies: + string-width: 4.2.3 + ansi-colors@4.1.3: {} ansi-escapes@4.3.2: @@ -13624,6 +15087,8 @@ snapshots: arg@4.1.3: {} + arg@5.0.2: {} + argparse@1.0.10: dependencies: sprintf-js: 1.0.3 @@ -13632,16 +15097,129 @@ snapshots: argv-formatter@1.0.0: {} + aria-query@5.3.2: {} + array-differ@3.0.0: {} array-ify@1.0.0: {} + array-iterate@2.0.1: {} + array-union@2.1.0: {} arrify@1.0.1: {} arrify@2.0.1: {} + astring@1.9.0: {} + + astro-expressive-code@0.41.5(astro@5.16.6(@types/node@20.19.27)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.54.0)(terser@5.44.1)(tsx@4.21.0)(typescript@5.9.3)(yaml@2.8.2)): + dependencies: + astro: 5.16.6(@types/node@20.19.27)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.54.0)(terser@5.44.1)(tsx@4.21.0)(typescript@5.9.3)(yaml@2.8.2) + rehype-expressive-code: 0.41.5 + + astro@5.16.6(@types/node@20.19.27)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.54.0)(terser@5.44.1)(tsx@4.21.0)(typescript@5.9.3)(yaml@2.8.2): + dependencies: + '@astrojs/compiler': 2.13.0 + '@astrojs/internal-helpers': 0.7.5 + '@astrojs/markdown-remark': 6.3.10 + '@astrojs/telemetry': 3.3.0 + '@capsizecss/unpack': 3.0.1 + '@oslojs/encoding': 1.1.0 + '@rollup/pluginutils': 5.3.0(rollup@4.54.0) + acorn: 8.15.0 + aria-query: 5.3.2 + axobject-query: 4.1.0 + boxen: 8.0.1 + ci-info: 4.3.1 + clsx: 2.1.1 + common-ancestor-path: 1.0.1 + cookie: 1.1.1 + cssesc: 3.0.0 + debug: 4.4.3 + deterministic-object-hash: 2.0.2 + devalue: 5.6.1 + diff: 5.2.0 + dlv: 1.1.3 + dset: 3.1.4 + es-module-lexer: 1.7.0 + esbuild: 0.25.12 + estree-walker: 3.0.3 + flattie: 1.1.1 + fontace: 0.3.1 + github-slugger: 2.0.0 + html-escaper: 3.0.3 + http-cache-semantics: 4.2.0 + import-meta-resolve: 4.2.0 + js-yaml: 4.1.1 + magic-string: 0.30.21 + magicast: 0.5.1 + mrmime: 2.0.1 + neotraverse: 0.6.18 + p-limit: 6.2.0 + p-queue: 8.1.1 + package-manager-detector: 1.6.0 + piccolore: 0.1.3 + picomatch: 4.0.3 + prompts: 2.4.2 + rehype: 13.0.2 + semver: 7.7.3 + shiki: 3.20.0 + smol-toml: 1.6.0 + svgo: 4.0.0 + tinyexec: 1.0.2 + tinyglobby: 0.2.15 + tsconfck: 3.1.6(typescript@5.9.3) + ultrahtml: 1.6.0 + unifont: 0.6.0 + unist-util-visit: 5.0.0 + unstorage: 1.17.3 + vfile: 6.0.3 + vite: 6.4.1(@types/node@20.19.27)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2) + vitefu: 1.1.1(vite@6.4.1(@types/node@20.19.27)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2)) + xxhash-wasm: 1.1.0 + yargs-parser: 21.1.1 + yocto-spinner: 0.2.3 + zod: 3.25.76 + zod-to-json-schema: 3.25.0(zod@3.25.76) + zod-to-ts: 1.2.0(typescript@5.9.3)(zod@3.25.76) + optionalDependencies: + sharp: 0.34.5 + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@deno/kv' + - '@netlify/blobs' + - '@planetscale/database' + - '@types/node' + - '@upstash/redis' + - '@vercel/blob' + - '@vercel/functions' + - '@vercel/kv' + - aws4fetch + - db0 + - idb-keyval + - ioredis + - jiti + - less + - lightningcss + - rollup + - sass + - sass-embedded + - stylus + - sugarss + - supports-color + - terser + - tsx + - typescript + - uploadthing + - yaml + async@3.2.6: {} asynckit@0.4.0: {} @@ -13654,6 +15232,8 @@ snapshots: transitivePeerDependencies: - debug + axobject-query@4.1.0: {} + babel-jest@29.7.0(@babel/core@7.28.5): dependencies: '@babel/core': 7.28.5 @@ -13737,10 +15317,20 @@ snapshots: balanced-match@1.0.2: {} + base-64@1.0.0: {} + base64-js@1.5.1: {} baseline-browser-mapping@2.9.11: {} + bcp-47-match@2.0.3: {} + + bcp-47@2.1.0: + dependencies: + is-alphabetical: 2.0.1 + is-alphanumerical: 2.0.1 + is-decimal: 2.0.1 + before-after-hook@2.2.3: {} before-after-hook@3.0.2: {} @@ -13766,8 +15356,21 @@ snapshots: inherits: 2.0.4 readable-stream: 3.6.2 + boolbase@1.0.0: {} + bottleneck@2.19.5: {} + boxen@8.0.1: + dependencies: + ansi-align: 3.0.1 + camelcase: 8.0.0 + chalk: 5.6.2 + cli-boxes: 3.0.0 + string-width: 7.2.0 + type-fest: 4.41.0 + widest-line: 5.0.0 + wrap-ansi: 9.0.2 + brace-expansion@1.1.12: dependencies: balanced-match: 1.0.2 @@ -13781,6 +15384,10 @@ snapshots: dependencies: fill-range: 7.1.1 + brotli@1.3.3: + dependencies: + base64-js: 1.5.1 + browserslist@4.28.1: dependencies: baseline-browser-mapping: 2.9.11 @@ -13804,6 +15411,10 @@ snapshots: base64-js: 1.5.1 ieee754: 1.2.1 + bundle-name@4.1.0: + dependencies: + run-applescript: 7.1.0 + bundle-require@5.1.0(esbuild@0.27.2): dependencies: esbuild: 0.27.2 @@ -13847,6 +15458,8 @@ snapshots: camelcase@6.3.0: {} + camelcase@8.0.0: {} + caniuse-lite@1.0.30001761: {} ccount@2.0.1: {} @@ -13913,6 +15526,8 @@ snapshots: dependencies: escape-string-regexp: 5.0.0 + cli-boxes@3.0.0: {} + cli-cursor@3.1.0: dependencies: restore-cursor: 3.1.0 @@ -13964,6 +15579,10 @@ snapshots: clone@1.0.4: {} + clone@2.1.2: {} + + clsx@2.1.1: {} + cmd-shim@6.0.3: {} co@4.6.0: {} @@ -13972,6 +15591,8 @@ snapshots: coi-serviceworker@0.1.7: {} + collapse-white-space@2.1.0: {} + collect-v8-coverage@1.0.3: {} color-convert@1.9.3: @@ -14125,6 +15746,10 @@ snapshots: convert-source-map@2.0.0: {} + cookie-es@1.2.2: {} + + cookie@1.1.1: {} + copy-anything@4.0.5: dependencies: is-what: 5.5.0 @@ -14162,13 +15787,13 @@ snapshots: optionalDependencies: typescript: 5.9.3 - create-jest@29.7.0(@types/node@20.19.27)(ts-node@10.9.2(@swc/core@1.15.7)(@swc/wasm@1.15.7)(@types/node@20.19.27)(typescript@5.9.3)): + create-jest@29.7.0(@types/node@20.19.27)(ts-node@10.9.2(@swc/core@1.15.7(@swc/helpers@0.5.18))(@swc/wasm@1.15.7)(@types/node@20.19.27)(typescript@5.9.3)): dependencies: '@jest/types': 29.6.3 chalk: 4.1.2 exit: 0.1.2 graceful-fs: 4.2.11 - jest-config: 29.7.0(@types/node@20.19.27)(ts-node@10.9.2(@swc/core@1.15.7)(@swc/wasm@1.15.7)(@types/node@20.19.27)(typescript@5.9.3)) + jest-config: 29.7.0(@types/node@20.19.27)(ts-node@10.9.2(@swc/core@1.15.7(@swc/helpers@0.5.18))(@swc/wasm@1.15.7)(@types/node@20.19.27)(typescript@5.9.3)) jest-util: 29.7.0 prompts: 2.4.2 transitivePeerDependencies: @@ -14185,14 +15810,44 @@ snapshots: shebang-command: 2.0.0 which: 2.0.2 + crossws@0.3.5: + dependencies: + uncrypto: 0.1.3 + crypto-random-string@2.0.0: {} crypto-random-string@4.0.0: dependencies: type-fest: 1.4.0 + css-select@5.2.2: + dependencies: + boolbase: 1.0.0 + css-what: 6.2.2 + domhandler: 5.0.3 + domutils: 3.2.2 + nth-check: 2.1.1 + + css-selector-parser@3.3.0: {} + + css-tree@2.2.1: + dependencies: + mdn-data: 2.0.28 + source-map-js: 1.2.1 + + css-tree@3.1.0: + dependencies: + mdn-data: 2.12.2 + source-map-js: 1.2.1 + + css-what@6.2.2: {} + cssesc@3.0.0: {} + csso@5.0.5: + dependencies: + css-tree: 2.2.1 + cssom@0.3.8: {} cssom@0.5.0: {} @@ -14244,12 +15899,23 @@ snapshots: deepmerge@4.3.1: {} + default-browser-id@5.0.1: {} + + default-browser@5.4.0: + dependencies: + bundle-name: 4.1.0 + default-browser-id: 5.0.1 + defaults@1.0.4: dependencies: clone: 1.0.4 define-lazy-prop@2.0.0: {} + define-lazy-prop@3.0.0: {} + + defu@6.1.4: {} + del@6.1.1: dependencies: globby: 11.1.0 @@ -14267,6 +15933,8 @@ snapshots: dequal@2.0.3: {} + destr@2.0.5: {} + detect-indent@5.0.0: {} detect-indent@6.1.0: {} @@ -14275,30 +15943,62 @@ snapshots: detect-newline@3.1.0: {} + deterministic-object-hash@2.0.2: + dependencies: + base-64: 1.0.0 + + devalue@5.6.1: {} + devlop@1.1.0: dependencies: dequal: 2.0.3 + dfa@1.2.0: {} + didyoumean@1.2.2: {} diff-sequences@29.6.3: {} diff@4.0.2: {} + diff@5.2.0: {} + diff@8.0.2: {} dir-glob@3.0.1: dependencies: path-type: 4.0.0 + direction@2.0.1: {} + + dlv@1.1.3: {} + + dom-serializer@2.0.0: + dependencies: + domelementtype: 2.3.0 + domhandler: 5.0.3 + entities: 4.5.0 + + domelementtype@2.3.0: {} + domexception@4.0.0: dependencies: webidl-conversions: 7.0.0 + domhandler@5.0.3: + dependencies: + domelementtype: 2.3.0 + dompurify@3.2.7: optionalDependencies: '@types/trusted-types': 2.0.7 + domutils@3.2.2: + dependencies: + dom-serializer: 2.0.0 + domelementtype: 2.3.0 + domhandler: 5.0.3 + dot-prop@5.3.0: dependencies: is-obj: 2.0.0 @@ -14311,6 +16011,8 @@ snapshots: dotenv@8.6.0: {} + dset@3.1.4: {} + dunder-proto@1.0.1: dependencies: call-bind-apply-helpers: 1.0.2 @@ -14340,6 +16042,8 @@ snapshots: emoji-regex-xs@1.0.0: {} + emoji-regex@10.6.0: {} + emoji-regex@8.0.0: {} emoji-regex@9.2.2: {} @@ -14355,6 +16059,11 @@ snapshots: dependencies: once: 1.4.0 + enhanced-resolve@5.18.4: + dependencies: + graceful-fs: 4.2.11 + tapable: 2.3.0 + enquirer@2.3.6: dependencies: ansi-colors: 4.1.3 @@ -14387,6 +16096,8 @@ snapshots: dependencies: is-arrayish: 0.2.1 + error-stack-parser-es@0.1.5: {} + es-define-property@1.0.1: {} es-engine@file:packages/rust/engine/pkg: @@ -14394,6 +16105,8 @@ snapshots: es-errors@1.3.0: {} + es-module-lexer@1.7.0: {} + es-object-atoms@1.1.1: dependencies: es-errors: 1.3.0 @@ -14405,6 +16118,20 @@ snapshots: has-tostringtag: 1.0.2 hasown: 2.0.2 + esast-util-from-estree@2.0.0: + dependencies: + '@types/estree-jsx': 1.0.5 + devlop: 1.1.0 + estree-util-visit: 2.0.0 + unist-util-position-from-estree: 2.0.0 + + esast-util-from-js@2.0.1: + dependencies: + '@types/estree-jsx': 1.0.5 + acorn: 8.15.0 + esast-util-from-estree: 2.0.0 + vfile-message: 4.0.3 + esbuild@0.21.5: optionalDependencies: '@esbuild/aix-ppc64': 0.21.5 @@ -14575,14 +16302,47 @@ snapshots: estraverse@5.3.0: {} + estree-util-attach-comments@3.0.0: + dependencies: + '@types/estree': 1.0.8 + + estree-util-build-jsx@3.0.1: + dependencies: + '@types/estree-jsx': 1.0.5 + devlop: 1.1.0 + estree-util-is-identifier-name: 3.0.0 + estree-walker: 3.0.3 + estree-util-is-identifier-name@3.0.0: {} + estree-util-scope@1.0.0: + dependencies: + '@types/estree': 1.0.8 + devlop: 1.1.0 + + estree-util-to-js@2.0.0: + dependencies: + '@types/estree-jsx': 1.0.5 + astring: 1.9.0 + source-map: 0.7.6 + + estree-util-visit@2.0.0: + dependencies: + '@types/estree-jsx': 1.0.5 + '@types/unist': 3.0.3 + estree-walker@2.0.2: {} + estree-walker@3.0.3: + dependencies: + '@types/estree': 1.0.8 + esutils@2.0.3: {} eventemitter3@4.0.7: {} + eventemitter3@5.0.1: {} + execa@4.1.0: dependencies: cross-spawn: 7.0.6 @@ -14658,6 +16418,13 @@ snapshots: exponential-backoff@3.1.3: {} + expressive-code@0.41.5: + dependencies: + '@expressive-code/core': 0.41.5 + '@expressive-code/plugin-frames': 0.41.5 + '@expressive-code/plugin-shiki': 0.41.5 + '@expressive-code/plugin-text-markers': 0.41.5 + exsolve@1.0.8: {} extend@3.0.2: {} @@ -14766,6 +16533,8 @@ snapshots: flatted@3.3.3: {} + flattie@1.1.1: {} + flexlayout-react@0.8.17(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: react: 18.3.1 @@ -14777,6 +16546,23 @@ snapshots: follow-redirects@1.15.11: {} + fontace@0.3.1: + dependencies: + '@types/fontkit': 2.0.8 + fontkit: 2.0.4 + + fontkit@2.0.4: + dependencies: + '@swc/helpers': 0.5.18 + brotli: 1.3.3 + clone: 2.1.2 + dfa: 1.2.0 + fast-deep-equal: 3.1.3 + restructure: 3.0.2 + tiny-inflate: 1.0.3 + unicode-properties: 1.4.1 + unicode-trie: 2.0.0 + foreground-child@3.3.1: dependencies: cross-spawn: 7.0.6 @@ -14846,6 +16632,8 @@ snapshots: get-caller-file@2.0.5: {} + get-east-asian-width@1.4.0: {} + get-intrinsic@1.3.0: dependencies: call-bind-apply-helpers: 1.0.2 @@ -14942,6 +16730,8 @@ snapshots: dependencies: ini: 1.3.8 + github-slugger@2.0.0: {} + glob-parent@5.1.2: dependencies: is-glob: 4.0.3 @@ -15005,6 +16795,18 @@ snapshots: graceful-fs@4.2.11: {} + h3@1.15.4: + dependencies: + cookie-es: 1.2.2 + crossws: 0.3.5 + defu: 6.1.4 + destr: 2.0.5 + iron-webcrypto: 1.2.1 + node-mock-http: 1.0.4 + radix3: 1.1.2 + ufo: 1.6.1 + uncrypto: 0.1.3 + handlebars@4.7.8: dependencies: minimist: 1.2.8 @@ -15032,6 +16834,30 @@ snapshots: dependencies: function-bind: 1.1.2 + hast-util-embedded@3.0.0: + dependencies: + '@types/hast': 3.0.4 + hast-util-is-element: 3.0.0 + + hast-util-format@1.1.0: + dependencies: + '@types/hast': 3.0.4 + hast-util-embedded: 3.0.0 + hast-util-minify-whitespace: 1.0.1 + hast-util-phrasing: 3.0.1 + hast-util-whitespace: 3.0.0 + html-whitespace-sensitive-tag-names: 3.0.1 + unist-util-visit-parents: 6.0.2 + + hast-util-from-html@2.0.3: + dependencies: + '@types/hast': 3.0.4 + devlop: 1.1.0 + hast-util-from-parse5: 8.0.3 + parse5: 7.3.0 + vfile: 6.0.3 + vfile-message: 4.0.3 + hast-util-from-parse5@8.0.3: dependencies: '@types/hast': 3.0.4 @@ -15043,10 +16869,38 @@ snapshots: vfile-location: 5.0.3 web-namespaces: 2.0.1 + hast-util-has-property@3.0.0: + dependencies: + '@types/hast': 3.0.4 + + hast-util-is-body-ok-link@3.0.1: + dependencies: + '@types/hast': 3.0.4 + + hast-util-is-element@3.0.0: + dependencies: + '@types/hast': 3.0.4 + + hast-util-minify-whitespace@1.0.1: + dependencies: + '@types/hast': 3.0.4 + hast-util-embedded: 3.0.0 + hast-util-is-element: 3.0.0 + hast-util-whitespace: 3.0.0 + unist-util-is: 6.0.1 + hast-util-parse-selector@4.0.0: dependencies: '@types/hast': 3.0.4 + hast-util-phrasing@3.0.1: + dependencies: + '@types/hast': 3.0.4 + hast-util-embedded: 3.0.0 + hast-util-has-property: 3.0.0 + hast-util-is-body-ok-link: 3.0.1 + hast-util-is-element: 3.0.0 + hast-util-raw@9.1.0: dependencies: '@types/hast': 3.0.4 @@ -15063,6 +16917,45 @@ snapshots: web-namespaces: 2.0.1 zwitch: 2.0.4 + hast-util-select@6.0.4: + dependencies: + '@types/hast': 3.0.4 + '@types/unist': 3.0.3 + bcp-47-match: 2.0.3 + comma-separated-tokens: 2.0.3 + css-selector-parser: 3.3.0 + devlop: 1.1.0 + direction: 2.0.1 + hast-util-has-property: 3.0.0 + hast-util-to-string: 3.0.1 + hast-util-whitespace: 3.0.0 + nth-check: 2.1.1 + property-information: 7.1.0 + space-separated-tokens: 2.0.2 + unist-util-visit: 5.0.0 + zwitch: 2.0.4 + + hast-util-to-estree@3.1.3: + dependencies: + '@types/estree': 1.0.8 + '@types/estree-jsx': 1.0.5 + '@types/hast': 3.0.4 + comma-separated-tokens: 2.0.3 + devlop: 1.1.0 + estree-util-attach-comments: 3.0.0 + estree-util-is-identifier-name: 3.0.0 + hast-util-whitespace: 3.0.0 + mdast-util-mdx-expression: 2.0.1 + mdast-util-mdx-jsx: 3.2.0 + mdast-util-mdxjs-esm: 2.0.1 + property-information: 7.1.0 + space-separated-tokens: 2.0.2 + style-to-js: 1.1.21 + unist-util-position: 5.0.0 + zwitch: 2.0.4 + transitivePeerDependencies: + - supports-color + hast-util-to-html@9.0.5: dependencies: '@types/hast': 3.0.4 @@ -15107,6 +17000,17 @@ snapshots: web-namespaces: 2.0.1 zwitch: 2.0.4 + hast-util-to-string@3.0.1: + dependencies: + '@types/hast': 3.0.4 + + hast-util-to-text@4.0.2: + dependencies: + '@types/hast': 3.0.4 + '@types/unist': 3.0.3 + hast-util-is-element: 3.0.0 + unist-util-find-after: 5.0.0 + hast-util-whitespace@3.0.0: dependencies: '@types/hast': 3.0.4 @@ -15143,6 +17047,8 @@ snapshots: html-escaper@2.0.2: {} + html-escaper@3.0.3: {} + html-parse-stringify@3.0.1: dependencies: void-elements: 3.1.0 @@ -15151,6 +17057,8 @@ snapshots: html-void-elements@3.0.0: {} + html-whitespace-sensitive-tag-names@3.0.1: {} + http-cache-semantics@4.2.0: {} http-proxy-agent@5.0.0: @@ -15192,6 +17100,10 @@ snapshots: human-signals@8.0.1: {} + i18next@23.16.8: + dependencies: + '@babel/runtime': 7.28.4 + i18next@25.7.3(typescript@5.9.3): dependencies: '@babel/runtime': 7.28.4 @@ -15326,6 +17238,8 @@ snapshots: ip-address@10.1.0: {} + iron-webcrypto@1.2.1: {} + is-alphabetical@2.0.1: {} is-alphanumerical@2.0.1: @@ -15351,6 +17265,8 @@ snapshots: is-docker@2.2.1: {} + is-docker@3.0.0: {} + is-extglob@2.1.1: {} is-fullwidth-code-point@3.0.0: {} @@ -15363,6 +17279,10 @@ snapshots: is-hexadecimal@2.0.1: {} + is-inside-container@1.0.0: + dependencies: + is-docker: 3.0.0 + is-interactive@1.0.0: {} is-lambda@1.0.1: {} @@ -15427,6 +17347,10 @@ snapshots: dependencies: is-docker: 2.2.1 + is-wsl@3.1.0: + dependencies: + is-inside-container: 1.0.0 + isarray@1.0.0: {} isexe@2.0.0: {} @@ -15538,16 +17462,16 @@ snapshots: - babel-plugin-macros - supports-color - jest-cli@29.7.0(@types/node@20.19.27)(ts-node@10.9.2(@swc/core@1.15.7)(@swc/wasm@1.15.7)(@types/node@20.19.27)(typescript@5.9.3)): + jest-cli@29.7.0(@types/node@20.19.27)(ts-node@10.9.2(@swc/core@1.15.7(@swc/helpers@0.5.18))(@swc/wasm@1.15.7)(@types/node@20.19.27)(typescript@5.9.3)): dependencies: - '@jest/core': 29.7.0(ts-node@10.9.2(@swc/core@1.15.7)(@swc/wasm@1.15.7)(@types/node@20.19.27)(typescript@5.9.3)) + '@jest/core': 29.7.0(ts-node@10.9.2(@swc/core@1.15.7(@swc/helpers@0.5.18))(@swc/wasm@1.15.7)(@types/node@20.19.27)(typescript@5.9.3)) '@jest/test-result': 29.7.0 '@jest/types': 29.6.3 chalk: 4.1.2 - create-jest: 29.7.0(@types/node@20.19.27)(ts-node@10.9.2(@swc/core@1.15.7)(@swc/wasm@1.15.7)(@types/node@20.19.27)(typescript@5.9.3)) + create-jest: 29.7.0(@types/node@20.19.27)(ts-node@10.9.2(@swc/core@1.15.7(@swc/helpers@0.5.18))(@swc/wasm@1.15.7)(@types/node@20.19.27)(typescript@5.9.3)) exit: 0.1.2 import-local: 3.2.0 - jest-config: 29.7.0(@types/node@20.19.27)(ts-node@10.9.2(@swc/core@1.15.7)(@swc/wasm@1.15.7)(@types/node@20.19.27)(typescript@5.9.3)) + jest-config: 29.7.0(@types/node@20.19.27)(ts-node@10.9.2(@swc/core@1.15.7(@swc/helpers@0.5.18))(@swc/wasm@1.15.7)(@types/node@20.19.27)(typescript@5.9.3)) jest-util: 29.7.0 jest-validate: 29.7.0 yargs: 17.7.2 @@ -15557,7 +17481,7 @@ snapshots: - supports-color - ts-node - jest-config@29.7.0(@types/node@20.19.27)(ts-node@10.9.2(@swc/core@1.15.7)(@swc/wasm@1.15.7)(@types/node@20.19.27)(typescript@5.9.3)): + jest-config@29.7.0(@types/node@20.19.27)(ts-node@10.9.2(@swc/core@1.15.7(@swc/helpers@0.5.18))(@swc/wasm@1.15.7)(@types/node@20.19.27)(typescript@5.9.3)): dependencies: '@babel/core': 7.28.5 '@jest/test-sequencer': 29.7.0 @@ -15583,7 +17507,7 @@ snapshots: strip-json-comments: 3.1.1 optionalDependencies: '@types/node': 20.19.27 - ts-node: 10.9.2(@swc/core@1.15.7)(@swc/wasm@1.15.7)(@types/node@20.19.27)(typescript@5.9.3) + ts-node: 10.9.2(@swc/core@1.15.7(@swc/helpers@0.5.18))(@swc/wasm@1.15.7)(@types/node@20.19.27)(typescript@5.9.3) transitivePeerDependencies: - babel-plugin-macros - supports-color @@ -15818,12 +17742,12 @@ snapshots: merge-stream: 2.0.0 supports-color: 8.1.1 - jest@29.7.0(@types/node@20.19.27)(ts-node@10.9.2(@swc/core@1.15.7)(@swc/wasm@1.15.7)(@types/node@20.19.27)(typescript@5.9.3)): + jest@29.7.0(@types/node@20.19.27)(ts-node@10.9.2(@swc/core@1.15.7(@swc/helpers@0.5.18))(@swc/wasm@1.15.7)(@types/node@20.19.27)(typescript@5.9.3)): dependencies: - '@jest/core': 29.7.0(ts-node@10.9.2(@swc/core@1.15.7)(@swc/wasm@1.15.7)(@types/node@20.19.27)(typescript@5.9.3)) + '@jest/core': 29.7.0(ts-node@10.9.2(@swc/core@1.15.7(@swc/helpers@0.5.18))(@swc/wasm@1.15.7)(@types/node@20.19.27)(typescript@5.9.3)) '@jest/types': 29.6.3 import-local: 3.2.0 - jest-cli: 29.7.0(@types/node@20.19.27)(ts-node@10.9.2(@swc/core@1.15.7)(@swc/wasm@1.15.7)(@types/node@20.19.27)(typescript@5.9.3)) + jest-cli: 29.7.0(@types/node@20.19.27)(ts-node@10.9.2(@swc/core@1.15.7(@swc/helpers@0.5.18))(@swc/wasm@1.15.7)(@types/node@20.19.27)(typescript@5.9.3)) transitivePeerDependencies: - '@types/node' - babel-plugin-macros @@ -15961,19 +17885,21 @@ snapshots: kleur@3.0.3: {} + klona@2.0.6: {} + kolorist@1.8.0: {} lcid@3.1.1: dependencies: invert-kv: 3.0.1 - lerna@8.2.4(@swc/core@1.15.7)(@types/node@20.19.27)(encoding@0.1.13): + lerna@8.2.4(@swc/core@1.15.7(@swc/helpers@0.5.18))(@types/node@20.19.27)(encoding@0.1.13): dependencies: - '@lerna/create': 8.2.4(@swc/core@1.15.7)(@types/node@20.19.27)(encoding@0.1.13)(typescript@5.9.3) + '@lerna/create': 8.2.4(@swc/core@1.15.7(@swc/helpers@0.5.18))(@types/node@20.19.27)(encoding@0.1.13)(typescript@5.9.3) '@npmcli/arborist': 7.5.4 '@npmcli/package-json': 5.2.0 '@npmcli/run-script': 8.1.0 - '@nx/devkit': 20.8.3(nx@20.8.3(@swc/core@1.15.7)) + '@nx/devkit': 20.8.3(nx@20.8.3(@swc/core@1.15.7(@swc/helpers@0.5.18))) '@octokit/plugin-enterprise-rest': 6.0.1 '@octokit/rest': 20.1.2 aproba: 2.0.0 @@ -16016,7 +17942,7 @@ snapshots: npm-package-arg: 11.0.2 npm-packlist: 8.0.2 npm-registry-fetch: 17.1.0 - nx: 20.8.3(@swc/core@1.15.7) + nx: 20.8.3(@swc/core@1.15.7(@swc/helpers@0.5.18)) p-map: 4.0.0 p-map-series: 2.1.0 p-pipe: 3.1.0 @@ -16089,6 +18015,55 @@ snapshots: dependencies: immediate: 3.0.6 + lightningcss-android-arm64@1.30.2: + optional: true + + lightningcss-darwin-arm64@1.30.2: + optional: true + + lightningcss-darwin-x64@1.30.2: + optional: true + + lightningcss-freebsd-x64@1.30.2: + optional: true + + lightningcss-linux-arm-gnueabihf@1.30.2: + optional: true + + lightningcss-linux-arm64-gnu@1.30.2: + optional: true + + lightningcss-linux-arm64-musl@1.30.2: + optional: true + + lightningcss-linux-x64-gnu@1.30.2: + optional: true + + lightningcss-linux-x64-musl@1.30.2: + optional: true + + lightningcss-win32-arm64-msvc@1.30.2: + optional: true + + lightningcss-win32-x64-msvc@1.30.2: + optional: true + + lightningcss@1.30.2: + dependencies: + detect-libc: 2.1.2 + optionalDependencies: + lightningcss-android-arm64: 1.30.2 + lightningcss-darwin-arm64: 1.30.2 + lightningcss-darwin-x64: 1.30.2 + lightningcss-freebsd-x64: 1.30.2 + lightningcss-linux-arm-gnueabihf: 1.30.2 + lightningcss-linux-arm64-gnu: 1.30.2 + lightningcss-linux-arm64-musl: 1.30.2 + lightningcss-linux-x64-gnu: 1.30.2 + lightningcss-linux-x64-musl: 1.30.2 + lightningcss-win32-arm64-msvc: 1.30.2 + lightningcss-win32-x64-msvc: 1.30.2 + lilconfig@3.1.3: {} lines-and-columns@1.2.4: {} @@ -16223,6 +18198,12 @@ snapshots: dependencies: '@jridgewell/sourcemap-codec': 1.5.5 + magicast@0.5.1: + dependencies: + '@babel/parser': 7.28.5 + '@babel/types': 7.28.5 + source-map-js: 1.2.1 + make-asynchronous@1.0.1: dependencies: p-event: 6.0.1 @@ -16271,6 +18252,8 @@ snapshots: mark.js@8.11.1: {} + markdown-extensions@2.0.0: {} + markdown-it@14.1.0: dependencies: argparse: 2.0.1 @@ -16299,6 +18282,26 @@ snapshots: math-intrinsics@1.1.0: {} + mdast-util-definitions@6.0.0: + dependencies: + '@types/mdast': 4.0.4 + '@types/unist': 3.0.3 + unist-util-visit: 5.0.0 + + mdast-util-directive@3.1.0: + dependencies: + '@types/mdast': 4.0.4 + '@types/unist': 3.0.3 + ccount: 2.0.1 + devlop: 1.1.0 + mdast-util-from-markdown: 2.0.2 + mdast-util-to-markdown: 2.1.2 + parse-entities: 4.0.2 + stringify-entities: 4.0.4 + unist-util-visit-parents: 6.0.2 + transitivePeerDependencies: + - supports-color + mdast-util-find-and-replace@3.0.2: dependencies: '@types/mdast': 4.0.4 @@ -16408,6 +18411,16 @@ snapshots: transitivePeerDependencies: - supports-color + mdast-util-mdx@3.0.0: + dependencies: + mdast-util-from-markdown: 2.0.2 + mdast-util-mdx-expression: 2.0.1 + mdast-util-mdx-jsx: 3.2.0 + mdast-util-mdxjs-esm: 2.0.1 + mdast-util-to-markdown: 2.1.2 + transitivePeerDependencies: + - supports-color + mdast-util-mdxjs-esm@2.0.1: dependencies: '@types/estree-jsx': 1.0.5 @@ -16452,6 +18465,10 @@ snapshots: dependencies: '@types/mdast': 4.0.4 + mdn-data@2.0.28: {} + + mdn-data@2.12.2: {} + mdurl@2.0.0: {} mem@5.1.1: @@ -16499,6 +18516,16 @@ snapshots: micromark-util-symbol: 2.0.1 micromark-util-types: 2.0.2 + micromark-extension-directive@3.0.2: + dependencies: + devlop: 1.1.0 + micromark-factory-space: 2.0.1 + micromark-factory-whitespace: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + parse-entities: 4.0.2 + micromark-extension-gfm-autolink-literal@2.1.0: dependencies: micromark-util-character: 2.1.1 @@ -16557,6 +18584,57 @@ snapshots: micromark-util-combine-extensions: 2.0.1 micromark-util-types: 2.0.2 + micromark-extension-mdx-expression@3.0.1: + dependencies: + '@types/estree': 1.0.8 + devlop: 1.1.0 + micromark-factory-mdx-expression: 2.0.3 + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-events-to-acorn: 2.0.3 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-extension-mdx-jsx@3.0.2: + dependencies: + '@types/estree': 1.0.8 + devlop: 1.1.0 + estree-util-is-identifier-name: 3.0.0 + micromark-factory-mdx-expression: 2.0.3 + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-events-to-acorn: 2.0.3 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + vfile-message: 4.0.3 + + micromark-extension-mdx-md@2.0.0: + dependencies: + micromark-util-types: 2.0.2 + + micromark-extension-mdxjs-esm@3.0.0: + dependencies: + '@types/estree': 1.0.8 + devlop: 1.1.0 + micromark-core-commonmark: 2.0.3 + micromark-util-character: 2.1.1 + micromark-util-events-to-acorn: 2.0.3 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + unist-util-position-from-estree: 2.0.0 + vfile-message: 4.0.3 + + micromark-extension-mdxjs@3.0.0: + dependencies: + acorn: 8.15.0 + acorn-jsx: 5.3.2(acorn@8.15.0) + micromark-extension-mdx-expression: 3.0.1 + micromark-extension-mdx-jsx: 3.0.2 + micromark-extension-mdx-md: 2.0.0 + micromark-extension-mdxjs-esm: 3.0.0 + micromark-util-combine-extensions: 2.0.1 + micromark-util-types: 2.0.2 + micromark-factory-destination@2.0.1: dependencies: micromark-util-character: 2.1.1 @@ -16570,6 +18648,18 @@ snapshots: micromark-util-symbol: 2.0.1 micromark-util-types: 2.0.2 + micromark-factory-mdx-expression@2.0.3: + dependencies: + '@types/estree': 1.0.8 + devlop: 1.1.0 + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-events-to-acorn: 2.0.3 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + unist-util-position-from-estree: 2.0.0 + vfile-message: 4.0.3 + micromark-factory-space@2.0.1: dependencies: micromark-util-character: 2.1.1 @@ -16622,6 +18712,16 @@ snapshots: micromark-util-encode@2.0.1: {} + micromark-util-events-to-acorn@2.0.3: + dependencies: + '@types/estree': 1.0.8 + '@types/unist': 3.0.3 + devlop: 1.1.0 + estree-util-visit: 2.0.0 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + vfile-message: 4.0.3 + micromark-util-html-tag-name@2.0.1: {} micromark-util-normalize-identifier@2.0.1: @@ -16795,6 +18895,8 @@ snapshots: mri@1.2.0: {} + mrmime@2.0.1: {} + ms@2.1.3: {} muggle-string@0.3.1: {} @@ -16833,8 +18935,14 @@ snapshots: neo-async@2.6.2: {} + neotraverse@0.6.18: {} + nerf-dart@1.0.0: {} + nlcst-to-string@4.0.0: + dependencies: + '@types/nlcst': 2.0.3 + node-emoji@2.2.0: dependencies: '@sindresorhus/is': 4.6.0 @@ -16842,6 +18950,8 @@ snapshots: emojilib: 2.4.0 skin-tone: 2.0.0 + node-fetch-native@1.6.7: {} + node-fetch@2.6.7(encoding@0.1.13): dependencies: whatwg-url: 5.0.0 @@ -16873,6 +18983,8 @@ snapshots: node-machine-id@1.1.12: {} + node-mock-http@1.0.4: {} + node-releases@2.0.27: {} nopt@7.2.1: @@ -16959,9 +19071,13 @@ snapshots: npm@10.9.4: {} + nth-check@2.1.1: + dependencies: + boolbase: 1.0.0 + nwsapi@2.2.23: {} - nx@20.8.3(@swc/core@1.15.7): + nx@20.8.3(@swc/core@1.15.7(@swc/helpers@0.5.18)): dependencies: '@napi-rs/wasm-runtime': 0.2.4 '@yarnpkg/lockfile': 1.1.0 @@ -17008,12 +19124,20 @@ snapshots: '@nx/nx-linux-x64-musl': 20.8.3 '@nx/nx-win32-arm64-msvc': 20.8.3 '@nx/nx-win32-x64-msvc': 20.8.3 - '@swc/core': 1.15.7 + '@swc/core': 1.15.7(@swc/helpers@0.5.18) transitivePeerDependencies: - debug object-assign@4.1.1: {} + ofetch@1.5.1: + dependencies: + destr: 2.0.5 + node-fetch-native: 1.6.7 + ufo: 1.6.1 + + ohash@2.0.11: {} + once@1.4.0: dependencies: wrappy: 1.0.2 @@ -17026,12 +19150,27 @@ snapshots: dependencies: mimic-fn: 4.0.0 + oniguruma-parser@0.12.1: {} + oniguruma-to-es@3.1.1: dependencies: emoji-regex-xs: 1.0.0 regex: 6.1.0 regex-recursion: 6.0.2 + oniguruma-to-es@4.3.4: + dependencies: + oniguruma-parser: 0.12.1 + regex: 6.1.0 + regex-recursion: 6.0.2 + + open@10.2.0: + dependencies: + default-browser: 5.4.0 + define-lazy-prop: 3.0.0 + is-inside-container: 1.0.0 + wsl-utils: 0.1.0 + open@8.4.2: dependencies: define-lazy-prop: 2.0.0 @@ -17116,6 +19255,10 @@ snapshots: dependencies: yocto-queue: 0.1.0 + p-limit@6.2.0: + dependencies: + yocto-queue: 1.2.2 + p-locate@2.0.0: dependencies: p-limit: 1.3.0 @@ -17149,6 +19292,11 @@ snapshots: eventemitter3: 4.0.7 p-timeout: 3.2.0 + p-queue@8.1.1: + dependencies: + eventemitter3: 5.0.1 + p-timeout: 6.1.4 + p-reduce@2.1.0: {} p-reduce@3.0.0: {} @@ -17198,6 +19346,17 @@ snapshots: - bluebird - supports-color + pagefind@1.4.0: + optionalDependencies: + '@pagefind/darwin-arm64': 1.4.0 + '@pagefind/darwin-x64': 1.4.0 + '@pagefind/freebsd-x64': 1.4.0 + '@pagefind/linux-arm64': 1.4.0 + '@pagefind/linux-x64': 1.4.0 + '@pagefind/windows-x64': 1.4.0 + + pako@0.2.9: {} + pako@1.0.11: {} pako@2.1.0: {} @@ -17240,6 +19399,15 @@ snapshots: index-to-position: 1.2.0 type-fest: 4.41.0 + parse-latin@7.0.0: + dependencies: + '@types/nlcst': 2.0.3 + '@types/unist': 3.0.3 + nlcst-to-string: 4.0.0 + unist-util-modify-children: 4.0.0 + unist-util-visit-children: 3.0.0 + vfile: 6.0.3 + parse-ms@4.0.0: {} parse-path@7.1.0: @@ -17295,6 +19463,8 @@ snapshots: perfect-debounce@1.0.0: {} + piccolore@0.1.3: {} + picocolors@1.1.1: {} picomatch@2.3.1: {} @@ -17345,6 +19515,11 @@ snapshots: tsx: 4.21.0 yaml: 2.8.2 + postcss-nested@6.2.0(postcss@8.5.6): + dependencies: + postcss: 8.5.6 + postcss-selector-parser: 6.1.2 + postcss-selector-parser@6.1.2: dependencies: cssesc: 3.0.0 @@ -17374,6 +19549,8 @@ snapshots: dependencies: parse-ms: 4.0.0 + prismjs@1.30.0: {} + proc-log@4.2.0: {} process-nextick-args@2.0.1: {} @@ -17448,6 +19625,8 @@ snapshots: quick-lru@4.0.1: {} + radix3@1.1.2: {} + ramda@0.27.2: {} randombytes@2.1.0: @@ -17588,6 +19767,35 @@ snapshots: readdirp@4.1.2: {} + recma-build-jsx@1.0.0: + dependencies: + '@types/estree': 1.0.8 + estree-util-build-jsx: 3.0.1 + vfile: 6.0.3 + + recma-jsx@1.0.1(acorn@8.15.0): + dependencies: + acorn: 8.15.0 + acorn-jsx: 5.3.2(acorn@8.15.0) + estree-util-to-js: 2.0.0 + recma-parse: 1.0.0 + recma-stringify: 1.0.0 + unified: 11.0.5 + + recma-parse@1.0.0: + dependencies: + '@types/estree': 1.0.8 + esast-util-from-js: 2.0.1 + unified: 11.0.5 + vfile: 6.0.3 + + recma-stringify@1.0.0: + dependencies: + '@types/estree': 1.0.8 + estree-util-to-js: 2.0.0 + unified: 11.0.5 + vfile: 6.0.3 + redent@3.0.0: dependencies: indent-string: 4.0.0 @@ -17630,12 +19838,57 @@ snapshots: dependencies: jsesc: 3.1.0 + rehype-expressive-code@0.41.5: + dependencies: + expressive-code: 0.41.5 + + rehype-format@5.0.1: + dependencies: + '@types/hast': 3.0.4 + hast-util-format: 1.1.0 + + rehype-parse@9.0.1: + dependencies: + '@types/hast': 3.0.4 + hast-util-from-html: 2.0.3 + unified: 11.0.5 + rehype-raw@7.0.0: dependencies: '@types/hast': 3.0.4 hast-util-raw: 9.1.0 vfile: 6.0.3 + rehype-recma@1.0.0: + dependencies: + '@types/estree': 1.0.8 + '@types/hast': 3.0.4 + hast-util-to-estree: 3.1.3 + transitivePeerDependencies: + - supports-color + + rehype-stringify@10.0.1: + dependencies: + '@types/hast': 3.0.4 + hast-util-to-html: 9.0.5 + unified: 11.0.5 + + rehype@13.0.2: + dependencies: + '@types/hast': 3.0.4 + rehype-parse: 9.0.1 + rehype-stringify: 10.0.1 + unified: 11.0.5 + + remark-directive@3.0.1: + dependencies: + '@types/mdast': 4.0.4 + mdast-util-directive: 3.1.0 + micromark-extension-directive: 3.0.2 + unified: 11.0.5 + transitivePeerDependencies: + - supports-color + remark-gfm@4.0.1: dependencies: '@types/mdast': 4.0.4 @@ -17647,6 +19900,13 @@ snapshots: transitivePeerDependencies: - supports-color + remark-mdx@3.1.1: + dependencies: + mdast-util-mdx: 3.0.0 + micromark-extension-mdxjs: 3.0.0 + transitivePeerDependencies: + - supports-color + remark-parse@11.0.0: dependencies: '@types/mdast': 4.0.4 @@ -17664,6 +19924,13 @@ snapshots: unified: 11.0.5 vfile: 6.0.3 + remark-smartypants@3.0.2: + dependencies: + retext: 9.0.0 + retext-smartypants: 6.2.0 + unified: 11.0.5 + unist-util-visit: 5.0.0 + remark-stringify@11.0.0: dependencies: '@types/mdast': 4.0.4 @@ -17710,6 +19977,33 @@ snapshots: onetime: 5.1.2 signal-exit: 3.0.7 + restructure@3.0.2: {} + + retext-latin@4.0.0: + dependencies: + '@types/nlcst': 2.0.3 + parse-latin: 7.0.0 + unified: 11.0.5 + + retext-smartypants@6.2.0: + dependencies: + '@types/nlcst': 2.0.3 + nlcst-to-string: 4.0.0 + unist-util-visit: 5.0.0 + + retext-stringify@4.0.0: + dependencies: + '@types/nlcst': 2.0.3 + nlcst-to-string: 4.0.0 + unified: 11.0.5 + + retext@9.0.0: + dependencies: + '@types/nlcst': 2.0.3 + retext-latin: 4.0.0 + retext-stringify: 4.0.0 + unified: 11.0.5 + retry@0.12.0: {} reusify@1.1.0: {} @@ -17764,6 +20058,8 @@ snapshots: '@rollup/rollup-win32-x64-msvc': 4.54.0 fsevents: 2.3.3 + run-applescript@7.1.0: {} + run-async@2.4.1: {} run-parallel@1.2.0: @@ -17784,6 +20080,8 @@ snapshots: safer-buffer@2.1.2: {} + sax@1.4.3: {} + saxes@6.0.0: dependencies: xmlchars: 2.2.0 @@ -17932,6 +20230,17 @@ snapshots: '@shikijs/vscode-textmate': 10.0.2 '@types/hast': 3.0.4 + shiki@3.20.0: + dependencies: + '@shikijs/core': 3.20.0 + '@shikijs/engine-javascript': 3.20.0 + '@shikijs/engine-oniguruma': 3.20.0 + '@shikijs/langs': 3.20.0 + '@shikijs/themes': 3.20.0 + '@shikijs/types': 3.20.0 + '@shikijs/vscode-textmate': 10.0.2 + '@types/hast': 3.0.4 + sigmund@1.0.1: {} signal-exit@3.0.7: {} @@ -17955,8 +20264,21 @@ snapshots: transitivePeerDependencies: - supports-color + sirv@3.0.2: + dependencies: + '@polka/url': 1.0.0-next.29 + mrmime: 2.0.1 + totalist: 3.0.1 + sisteransi@1.0.5: {} + sitemap@8.0.2: + dependencies: + '@types/node': 17.0.45 + '@types/sax': 1.2.7 + arg: 5.0.2 + sax: 1.4.3 + size-limit@11.2.0: dependencies: bytes-iec: 3.1.1 @@ -17979,6 +20301,8 @@ snapshots: smob@1.5.0: {} + smol-toml@1.6.0: {} + socks-proxy-agent@8.0.5: dependencies: agent-base: 7.1.4 @@ -18068,6 +20392,8 @@ snapshots: duplexer2: 0.1.4 readable-stream: 2.3.8 + stream-replace-string@2.0.0: {} + string-argv@0.3.2: {} string-length@4.0.2: @@ -18087,6 +20413,12 @@ snapshots: emoji-regex: 9.2.2 strip-ansi: 7.1.2 + string-width@7.2.0: + dependencies: + emoji-regex: 10.6.0 + get-east-asian-width: 1.4.0 + strip-ansi: 7.1.2 + string_decoder@1.1.1: dependencies: safe-buffer: 5.1.2 @@ -18173,10 +20505,24 @@ snapshots: supports-preserve-symlinks-flag@1.0.0: {} + svgo@4.0.0: + dependencies: + commander: 11.1.0 + css-select: 5.2.2 + css-tree: 3.1.0 + css-what: 6.2.2 + csso: 5.0.5 + picocolors: 1.1.1 + sax: 1.4.3 + symbol-tree@3.2.4: {} tabbable@6.3.0: {} + tailwindcss@4.1.18: {} + + tapable@2.3.0: {} + tar-stream@2.2.0: dependencies: bl: 4.1.0 @@ -18257,6 +20603,8 @@ snapshots: dependencies: convert-hrtime: 5.0.0 + tiny-inflate@1.0.3: {} + tinyexec@0.3.2: {} tinyexec@1.0.2: {} @@ -18283,6 +20631,8 @@ snapshots: dependencies: is-number: 7.0.0 + totalist@3.0.1: {} + tough-cookie@4.1.4: dependencies: psl: 1.15.0 @@ -18314,12 +20664,12 @@ snapshots: ts-interface-checker@0.1.13: {} - ts-jest@29.4.6(@babel/core@7.28.5)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.28.5))(jest-util@29.7.0)(jest@29.7.0(@types/node@20.19.27)(ts-node@10.9.2(@swc/core@1.15.7)(@swc/wasm@1.15.7)(@types/node@20.19.27)(typescript@5.9.3)))(typescript@5.9.3): + ts-jest@29.4.6(@babel/core@7.28.5)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.28.5))(jest-util@29.7.0)(jest@29.7.0(@types/node@20.19.27)(ts-node@10.9.2(@swc/core@1.15.7(@swc/helpers@0.5.18))(@swc/wasm@1.15.7)(@types/node@20.19.27)(typescript@5.9.3)))(typescript@5.9.3): dependencies: bs-logger: 0.2.6 fast-json-stable-stringify: 2.1.0 handlebars: 4.7.8 - jest: 29.7.0(@types/node@20.19.27)(ts-node@10.9.2(@swc/core@1.15.7)(@swc/wasm@1.15.7)(@types/node@20.19.27)(typescript@5.9.3)) + jest: 29.7.0(@types/node@20.19.27)(ts-node@10.9.2(@swc/core@1.15.7(@swc/helpers@0.5.18))(@swc/wasm@1.15.7)(@types/node@20.19.27)(typescript@5.9.3)) json5: 2.2.3 lodash.memoize: 4.1.2 make-error: 1.3.6 @@ -18339,7 +20689,7 @@ snapshots: '@ts-morph/common': 0.22.0 code-block-writer: 12.0.0 - ts-node@10.9.2(@swc/core@1.15.7)(@swc/wasm@1.15.7)(@types/node@20.19.27)(typescript@4.9.5): + ts-node@10.9.2(@swc/core@1.15.7(@swc/helpers@0.5.18))(@swc/wasm@1.15.7)(@types/node@20.19.27)(typescript@4.9.5): dependencies: '@cspotcode/source-map-support': 0.8.1 '@tsconfig/node10': 1.0.12 @@ -18357,10 +20707,10 @@ snapshots: v8-compile-cache-lib: 3.0.1 yn: 3.1.1 optionalDependencies: - '@swc/core': 1.15.7 + '@swc/core': 1.15.7(@swc/helpers@0.5.18) '@swc/wasm': 1.15.7 - ts-node@10.9.2(@swc/core@1.15.7)(@swc/wasm@1.15.7)(@types/node@20.19.27)(typescript@5.9.3): + ts-node@10.9.2(@swc/core@1.15.7(@swc/helpers@0.5.18))(@swc/wasm@1.15.7)(@types/node@20.19.27)(typescript@5.9.3): dependencies: '@cspotcode/source-map-support': 0.8.1 '@tsconfig/node10': 1.0.12 @@ -18378,7 +20728,7 @@ snapshots: v8-compile-cache-lib: 3.0.1 yn: 3.1.1 optionalDependencies: - '@swc/core': 1.15.7 + '@swc/core': 1.15.7(@swc/helpers@0.5.18) '@swc/wasm': 1.15.7 optional: true @@ -18404,6 +20754,10 @@ snapshots: tsbuffer-validator: 2.1.3 tslib: 2.8.1 + tsconfck@3.1.6(typescript@5.9.3): + optionalDependencies: + typescript: 5.9.3 + tsconfig-paths@4.2.0: dependencies: json5: 2.2.3 @@ -18426,7 +20780,7 @@ snapshots: core-js: 3.47.0 tsrpc-base-client: 2.1.17 - tsrpc-cli@2.4.5(@swc/core@1.15.7)(@swc/wasm@1.15.7)(@types/node@20.19.27): + tsrpc-cli@2.4.5(@swc/core@1.15.7(@swc/helpers@0.5.18))(@swc/wasm@1.15.7)(@types/node@20.19.27): dependencies: chalk: 4.1.2 chokidar: 3.6.0 @@ -18437,7 +20791,7 @@ snapshots: minimist: 1.2.8 ora: 5.4.1 os-locale: 5.0.0 - ts-node: 10.9.2(@swc/core@1.15.7)(@swc/wasm@1.15.7)(@types/node@20.19.27)(typescript@4.9.5) + ts-node: 10.9.2(@swc/core@1.15.7(@swc/helpers@0.5.18))(@swc/wasm@1.15.7)(@types/node@20.19.27)(typescript@4.9.5) tsbuffer: 2.2.23 tsbuffer-proto-generator: 1.7.2 tsbuffer-schema: 2.2.0 @@ -18467,7 +20821,7 @@ snapshots: - bufferutil - utf-8-validate - tsup@8.5.1(@microsoft/api-extractor@7.55.2(@types/node@20.19.27))(@swc/core@1.15.7)(jiti@2.6.1)(postcss@8.5.6)(tsx@4.21.0)(typescript@5.9.3)(yaml@2.8.2): + tsup@8.5.1(@microsoft/api-extractor@7.55.2(@types/node@20.19.27))(@swc/core@1.15.7(@swc/helpers@0.5.18))(jiti@2.6.1)(postcss@8.5.6)(tsx@4.21.0)(typescript@5.9.3)(yaml@2.8.2): dependencies: bundle-require: 5.1.0(esbuild@0.27.2) cac: 6.7.14 @@ -18488,7 +20842,7 @@ snapshots: tree-kill: 1.2.2 optionalDependencies: '@microsoft/api-extractor': 7.55.2(@types/node@20.19.27) - '@swc/core': 1.15.7 + '@swc/core': 1.15.7(@swc/helpers@0.5.18) postcss: 8.5.6 typescript: 5.9.3 transitivePeerDependencies: @@ -18614,6 +20968,10 @@ snapshots: uglify-js@3.19.3: optional: true + ultrahtml@1.6.0: {} + + uncrypto@0.1.3: {} + undici-types@6.21.0: {} unicode-canonical-property-names-ecmascript@2.0.1: {} @@ -18627,8 +20985,18 @@ snapshots: unicode-match-property-value-ecmascript@2.2.1: {} + unicode-properties@1.4.1: + dependencies: + base64-js: 1.5.1 + unicode-trie: 2.0.0 + unicode-property-aliases-ecmascript@2.2.0: {} + unicode-trie@2.0.0: + dependencies: + pako: 0.2.9 + tiny-inflate: 1.0.3 + unicorn-magic@0.1.0: {} unicorn-magic@0.3.0: {} @@ -18643,6 +21011,12 @@ snapshots: trough: 2.2.0 vfile: 6.0.3 + unifont@0.6.0: + dependencies: + css-tree: 3.1.0 + ofetch: 1.5.1 + ohash: 2.0.11 + unique-filename@3.0.0: dependencies: unique-slug: 4.0.0 @@ -18659,18 +21033,41 @@ snapshots: dependencies: crypto-random-string: 4.0.0 + unist-util-find-after@5.0.0: + dependencies: + '@types/unist': 3.0.3 + unist-util-is: 6.0.1 + unist-util-is@6.0.1: dependencies: '@types/unist': 3.0.3 + unist-util-modify-children@4.0.0: + dependencies: + '@types/unist': 3.0.3 + array-iterate: 2.0.1 + + unist-util-position-from-estree@2.0.0: + dependencies: + '@types/unist': 3.0.3 + unist-util-position@5.0.0: dependencies: '@types/unist': 3.0.3 + unist-util-remove-position@5.0.0: + dependencies: + '@types/unist': 3.0.3 + unist-util-visit: 5.0.0 + unist-util-stringify-position@4.0.0: dependencies: '@types/unist': 3.0.3 + unist-util-visit-children@3.0.0: + dependencies: + '@types/unist': 3.0.3 + unist-util-visit-parents@6.0.2: dependencies: '@types/unist': 3.0.3 @@ -18712,6 +21109,17 @@ snapshots: picomatch: 4.0.3 webpack-virtual-modules: 0.6.2 + unstorage@1.17.3: + dependencies: + anymatch: 3.1.3 + chokidar: 4.0.3 + destr: 2.0.5 + h3: 1.15.4 + lru-cache: 10.4.3 + node-fetch-native: 1.6.7 + ofetch: 1.5.1 + ufo: 1.6.1 + upath@2.0.1: {} update-browserslist-db@1.2.3(browserslist@4.28.1): @@ -18773,7 +21181,11 @@ snapshots: '@types/unist': 3.0.3 vfile-message: 4.0.3 - vite-plugin-dts@3.9.1(@types/node@20.19.27)(rollup@4.54.0)(typescript@5.9.3)(vite@6.4.1(@types/node@20.19.27)(jiti@2.6.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2)): + vite-hot-client@2.1.0(vite@6.4.1(@types/node@20.19.27)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2)): + dependencies: + vite: 6.4.1(@types/node@20.19.27)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2) + + vite-plugin-dts@3.9.1(@types/node@20.19.27)(rollup@4.54.0)(typescript@5.9.3)(vite@6.4.1(@types/node@20.19.27)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2)): dependencies: '@microsoft/api-extractor': 7.43.0(@types/node@20.19.27) '@rollup/pluginutils': 5.3.0(rollup@4.54.0) @@ -18784,13 +21196,13 @@ snapshots: typescript: 5.9.3 vue-tsc: 1.8.27(typescript@5.9.3) optionalDependencies: - vite: 6.4.1(@types/node@20.19.27)(jiti@2.6.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2) + vite: 6.4.1(@types/node@20.19.27)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2) transitivePeerDependencies: - '@types/node' - rollup - supports-color - vite-plugin-dts@4.5.4(@types/node@20.19.27)(rollup@4.54.0)(typescript@5.9.3)(vite@6.4.1(@types/node@20.19.27)(jiti@2.6.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2)): + vite-plugin-dts@4.5.4(@types/node@20.19.27)(rollup@4.54.0)(typescript@5.9.3)(vite@6.4.1(@types/node@20.19.27)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2)): dependencies: '@microsoft/api-extractor': 7.55.2(@types/node@20.19.27) '@rollup/pluginutils': 5.3.0(rollup@4.54.0) @@ -18803,37 +21215,84 @@ snapshots: magic-string: 0.30.21 typescript: 5.9.3 optionalDependencies: - vite: 6.4.1(@types/node@20.19.27)(jiti@2.6.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2) + vite: 6.4.1(@types/node@20.19.27)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2) transitivePeerDependencies: - '@types/node' - rollup - supports-color - vite-plugin-swc-transform@1.1.1(rollup@4.54.0)(vite@6.4.1(@types/node@20.19.27)(jiti@2.6.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2)): + vite-plugin-inspect@0.8.9(rollup@4.54.0)(vite@6.4.1(@types/node@20.19.27)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2)): + dependencies: + '@antfu/utils': 0.7.10 + '@rollup/pluginutils': 5.3.0(rollup@4.54.0) + debug: 4.4.3 + error-stack-parser-es: 0.1.5 + fs-extra: 11.3.3 + open: 10.2.0 + perfect-debounce: 1.0.0 + picocolors: 1.1.1 + sirv: 3.0.2 + vite: 6.4.1(@types/node@20.19.27)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2) + transitivePeerDependencies: + - rollup + - supports-color + + vite-plugin-swc-transform@1.1.1(@swc/helpers@0.5.18)(rollup@4.54.0)(vite@6.4.1(@types/node@20.19.27)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2)): dependencies: '@rollup/pluginutils': 5.3.0(rollup@4.54.0) - '@swc/core': 1.15.7 - vite: 6.4.1(@types/node@20.19.27)(jiti@2.6.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2) + '@swc/core': 1.15.7(@swc/helpers@0.5.18) + vite: 6.4.1(@types/node@20.19.27)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2) transitivePeerDependencies: - '@swc/helpers' - rollup - vite-plugin-top-level-await@1.6.0(rollup@4.54.0)(vite@6.4.1(@types/node@20.19.27)(jiti@2.6.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2)): + vite-plugin-top-level-await@1.6.0(@swc/helpers@0.5.18)(rollup@4.54.0)(vite@6.4.1(@types/node@20.19.27)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2)): dependencies: '@rollup/plugin-virtual': 3.0.2(rollup@4.54.0) - '@swc/core': 1.15.7 + '@swc/core': 1.15.7(@swc/helpers@0.5.18) '@swc/wasm': 1.15.7 uuid: 10.0.0 - vite: 6.4.1(@types/node@20.19.27)(jiti@2.6.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2) + vite: 6.4.1(@types/node@20.19.27)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2) transitivePeerDependencies: - '@swc/helpers' - rollup - vite-plugin-wasm@3.5.0(vite@6.4.1(@types/node@20.19.27)(jiti@2.6.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2)): + vite-plugin-vue-devtools@7.7.9(rollup@4.54.0)(vite@6.4.1(@types/node@20.19.27)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2))(vue@3.5.26(typescript@5.9.3)): dependencies: - vite: 6.4.1(@types/node@20.19.27)(jiti@2.6.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2) + '@vue/devtools-core': 7.7.9(vite@6.4.1(@types/node@20.19.27)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2))(vue@3.5.26(typescript@5.9.3)) + '@vue/devtools-kit': 7.7.9 + '@vue/devtools-shared': 7.7.9 + execa: 9.6.1 + sirv: 3.0.2 + vite: 6.4.1(@types/node@20.19.27)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2) + vite-plugin-inspect: 0.8.9(rollup@4.54.0)(vite@6.4.1(@types/node@20.19.27)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2)) + vite-plugin-vue-inspector: 5.3.2(vite@6.4.1(@types/node@20.19.27)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2)) + transitivePeerDependencies: + - '@nuxt/kit' + - rollup + - supports-color + - vue - vite@5.4.21(@types/node@20.19.27)(terser@5.44.1): + vite-plugin-vue-inspector@5.3.2(vite@6.4.1(@types/node@20.19.27)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2)): + dependencies: + '@babel/core': 7.28.5 + '@babel/plugin-proposal-decorators': 7.28.0(@babel/core@7.28.5) + '@babel/plugin-syntax-import-attributes': 7.27.1(@babel/core@7.28.5) + '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.28.5) + '@babel/plugin-transform-typescript': 7.28.5(@babel/core@7.28.5) + '@vue/babel-plugin-jsx': 1.5.0(@babel/core@7.28.5) + '@vue/compiler-dom': 3.5.26 + kolorist: 1.8.0 + magic-string: 0.30.21 + vite: 6.4.1(@types/node@20.19.27)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2) + transitivePeerDependencies: + - supports-color + + vite-plugin-wasm@3.5.0(vite@6.4.1(@types/node@20.19.27)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2)): + dependencies: + vite: 6.4.1(@types/node@20.19.27)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2) + + vite@5.4.21(@types/node@20.19.27)(lightningcss@1.30.2)(terser@5.44.1): dependencies: esbuild: 0.21.5 postcss: 8.5.6 @@ -18841,9 +21300,10 @@ snapshots: optionalDependencies: '@types/node': 20.19.27 fsevents: 2.3.3 + lightningcss: 1.30.2 terser: 5.44.1 - vite@6.4.1(@types/node@20.19.27)(jiti@2.6.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2): + vite@6.4.1(@types/node@20.19.27)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2): dependencies: esbuild: 0.25.12 fdir: 6.5.0(picomatch@4.0.3) @@ -18855,11 +21315,16 @@ snapshots: '@types/node': 20.19.27 fsevents: 2.3.3 jiti: 2.6.1 + lightningcss: 1.30.2 terser: 5.44.1 tsx: 4.21.0 yaml: 2.8.2 - vitepress@1.6.4(@algolia/client-search@5.46.2)(@types/node@20.19.27)(@types/react@18.3.27)(axios@1.13.2)(postcss@8.5.6)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(search-insights@2.17.3)(terser@5.44.1)(typescript@5.9.3): + vitefu@1.1.1(vite@6.4.1(@types/node@20.19.27)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2)): + optionalDependencies: + vite: 6.4.1(@types/node@20.19.27)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2) + + vitepress@1.6.4(@algolia/client-search@5.46.2)(@types/node@20.19.27)(@types/react@18.3.27)(axios@1.13.2)(lightningcss@1.30.2)(postcss@8.5.6)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(search-insights@2.17.3)(terser@5.44.1)(typescript@5.9.3): dependencies: '@docsearch/css': 3.8.2 '@docsearch/js': 3.8.2(@algolia/client-search@5.46.2)(@types/react@18.3.27)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(search-insights@2.17.3) @@ -18868,7 +21333,7 @@ snapshots: '@shikijs/transformers': 2.5.0 '@shikijs/types': 2.5.0 '@types/markdown-it': 14.1.2 - '@vitejs/plugin-vue': 5.2.4(vite@5.4.21(@types/node@20.19.27)(terser@5.44.1))(vue@3.5.26(typescript@5.9.3)) + '@vitejs/plugin-vue': 5.2.4(vite@5.4.21(@types/node@20.19.27)(lightningcss@1.30.2)(terser@5.44.1))(vue@3.5.26(typescript@5.9.3)) '@vue/devtools-api': 7.7.9 '@vue/shared': 3.5.26 '@vueuse/core': 12.8.2(typescript@5.9.3) @@ -18877,7 +21342,7 @@ snapshots: mark.js: 8.11.1 minisearch: 7.2.0 shiki: 2.5.0 - vite: 5.4.21(@types/node@20.19.27)(terser@5.44.1) + vite: 5.4.21(@types/node@20.19.27)(lightningcss@1.30.2)(terser@5.44.1) vue: 3.5.26(typescript@5.9.3) optionalDependencies: postcss: 8.5.6 @@ -18976,6 +21441,8 @@ snapshots: which-module@2.0.1: {} + which-pm-runs@1.1.0: {} + which@2.0.2: dependencies: isexe: 2.0.0 @@ -18988,6 +21455,10 @@ snapshots: dependencies: string-width: 4.2.3 + widest-line@5.0.0: + dependencies: + string-width: 7.2.0 + word-wrap@1.2.5: {} wordwrap@1.0.0: {} @@ -19010,6 +21481,12 @@ snapshots: string-width: 5.1.2 strip-ansi: 7.1.2 + wrap-ansi@9.0.2: + dependencies: + ansi-styles: 6.2.3 + string-width: 7.2.0 + strip-ansi: 7.1.2 + wrappy@1.0.2: {} write-file-atomic@2.4.3: @@ -19047,12 +21524,18 @@ snapshots: ws@8.18.3: {} + wsl-utils@0.1.0: + dependencies: + is-wsl: 3.1.0 + xml-name-validator@4.0.0: {} xmlchars@2.2.0: {} xtend@4.0.2: {} + xxhash-wasm@1.1.0: {} + y18n@4.0.3: {} y18n@5.0.8: {} @@ -19112,6 +21595,12 @@ snapshots: yocto-queue@0.1.0: {} + yocto-queue@1.2.2: {} + + yocto-spinner@0.2.3: + dependencies: + yoctocolors: 2.1.2 + yoctocolors@2.1.2: {} z-schema@5.0.5: @@ -19122,6 +21611,17 @@ snapshots: optionalDependencies: commander: 9.5.0 + zod-to-json-schema@3.25.0(zod@3.25.76): + dependencies: + zod: 3.25.76 + + zod-to-ts@1.2.0(typescript@5.9.3)(zod@3.25.76): + dependencies: + typescript: 5.9.3 + zod: 3.25.76 + + zod@3.25.76: {} + zustand@5.0.9(@types/react@18.3.27)(react@18.3.1)(use-sync-external-store@1.6.0(react@18.3.1)): optionalDependencies: '@types/react': 18.3.27 diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 6abb5493..71b142c6 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -9,3 +9,4 @@ packages: - 'packages/editor/plugins/*' - 'packages/rust/*' - 'packages/tools/*' + - 'docs'