From d3a88787c45774e03b31de4a8321de3d44e78bb2 Mon Sep 17 00:00:00 2001 From: Kaj Kowalski Date: Sat, 24 May 2025 01:14:35 +0200 Subject: [PATCH] Refactor code for consistency and readability - Updated import statements to use consistent formatting across files. - Adjusted method definitions and class constructors for uniform spacing and style. - Simplified promise handling and error messages in state handlers. - Enhanced state transition logic in various state handlers. - Improved quirk animation handling in WaitStateHandler. - Streamlined animation loading and caching mechanisms in AnimationLoader. - Updated Vite configuration for aliasing. --- .eslintrc.json | 70 - .gitignore | 41 +- CHANGELOG.md | 123 +- README.md | 5 +- examples/basic-demo-fixed.js | 332 --- examples/basic-demo.js | 229 +- examples/index.html | 64 +- examples/simple-example.js | 119 +- package-lock.json | 3311 +++++++++++++++++++++++++++- package.json | 35 +- src/animation/AnimationClip.js | 142 +- src/constants.js | 92 +- src/core/OwenAnimationContext.js | 168 +- src/factories/OwenSystemFactory.js | 98 +- src/index.js | 34 +- src/loaders/AnimationLoader.js | 72 +- src/states/ReactStateHandler.js | 172 +- src/states/SleepStateHandler.js | 72 +- src/states/StateFactory.js | 46 +- src/states/StateHandler.js | 46 +- src/states/TypeStateHandler.js | 74 +- src/states/WaitStateHandler.js | 142 +- vite.config.js | 6 +- 23 files changed, 4212 insertions(+), 1281 deletions(-) delete mode 100644 .eslintrc.json delete mode 100644 examples/basic-demo-fixed.js diff --git a/.eslintrc.json b/.eslintrc.json deleted file mode 100644 index 9f8cf58..0000000 --- a/.eslintrc.json +++ /dev/null @@ -1,70 +0,0 @@ -{ - "extends": [ - "eslint:recommended" - ], - "env": { - "browser": true, - "es2022": true, - "node": true - }, - "parserOptions": { - "ecmaVersion": 2022, - "sourceType": "module" - }, - "rules": { - "indent": [ - "error", - 2 - ], - "linebreak-style": [ - "error", - "unix" - ], - "quotes": [ - "error", - "single" - ], - "semi": [ - "error", - "always" - ], - "no-unused-vars": [ - "warn", - { - "argsIgnorePattern": "^_" - } - ], - "no-console": [ - "warn" - ], - "max-len": [ - "warn", - { - "code": 120 - } - ] - }, - "overrides": [ - { - "files": [ - "examples/**/*.js" - ], - "rules": { - "no-console": "off" - } - }, - { - "files": [ - "src/**/*.js" - ], - "rules": { - "no-console": "off" - } - } - ], - "ignorePatterns": [ - "node_modules/", - "dist/", - "docs/" - ] -} diff --git a/.gitignore b/.gitignore index 6210893..0462f8a 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,30 @@ +# Temporary files +*.tmp +*.temp + +# Documentation output +/docs/ + +# Animation assets (if storing locally) +/assets/models/ +/assets/animations/ + +# Example build outputs +/examples/dist/ + +# 3D Models (optional - remove if you want to commit models) +*.gltf +*.glb +*.fbx +*.obj +*.dae + +# Three.js cache +.three-cache/ + +# Editor (optional - remove if you want to commit editor files) +.vscode/ + # Created by https://www.toptal.com/developers/gitignore/api/windows,macos,linux,visualstudiocode,webstorm,vim,emacs,node # Edit at https://www.toptal.com/developers/gitignore?templates=windows,macos,linux,visualstudiocode,webstorm,vim,emacs,node @@ -418,17 +445,3 @@ $RECYCLE.BIN/ *.lnk # End of https://www.toptal.com/developers/gitignore/api/windows,macos,linux,visualstudiocode,webstorm,vim,emacs,node - -# Build outputs -docs/ - -# Temporary files -*.tmp -*.temp - -# 3D Models (optional - remove if you want to commit models) -*.gltf -*.glb -*.fbx -*.obj -*.dae diff --git a/CHANGELOG.md b/CHANGELOG.md index 3469677..9681a8f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,74 +5,89 @@ All notable changes to the Owen Animation System will be documented in this file The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## [1.0.1] - 2025-05-24 + +### Changed + +- šŸŽØ Standardized code style throughout the codebase +- šŸ”§ Converted semicolons to non-semicolons according to JavaScript Standard Style +- šŸ“ Improved code consistency and readability + ## [1.0.0] - 2025-05-23 ### Added -- šŸŽ‰ Initial release of Owen Animation System -- ✨ Complete state machine implementation with Wait, React, Type, and Sleep states -- šŸ¤– Emotional response system for character animations -- šŸ—ļø Clean architecture with dependency injection and factory patterns -- šŸ“ Animation naming convention parser -- šŸ”„ Smooth animation transitions with fade in/out support -- ⚔ Performance-optimized animation caching -- 🧩 Extensible design for custom states and emotions -- šŸ“Š Comprehensive JSDoc documentation -- šŸŽ® Interactive demo with keyboard controls -- šŸ“¦ TypeScript type definitions -- šŸ› ļø Development tooling (ESLint, Vite, JSDoc) + +- šŸŽ‰ Initial release of Owen Animation System +- ✨ Complete state machine implementation with Wait, React, Type, and Sleep states +- šŸ¤– Emotional response system for character animations +- šŸ—ļø Clean architecture with dependency injection and factory patterns +- šŸ“ Animation naming convention parser +- šŸ”„ Smooth animation transitions with fade in/out support +- ⚔ Performance-optimized animation caching +- 🧩 Extensible design for custom states and emotions +- šŸ“Š Comprehensive JSDoc documentation +- šŸŽ® Interactive demo with keyboard controls +- šŸ“¦ TypeScript type definitions +- šŸ› ļø Development tooling (ESLint, Vite, JSDoc) + +[1.0.1]: https://gitea.kajkowalski.nl/kjanat/Owen/releases/tag/v1.0.1 ### Architecture -- **Core Classes:** - - `OwenAnimationContext` - Main system controller - - `AnimationClip` - Individual animation management - - `AnimationClipFactory` - Animation creation with metadata parsing - - `StateHandler` - Abstract base for state implementations - - `StateFactory` - Dynamic state handler creation -- **State Handlers:** - - `WaitStateHandler` - Idle state with quirk animations - - `ReactStateHandler` - User input response with emotion analysis - - `TypeStateHandler` - Typing state with emotional variations - - `SleepStateHandler` - Inactive state management +- **Core Classes:** + - `OwenAnimationContext` - Main system controller + - `AnimationClip` - Individual animation management + - `AnimationClipFactory` - Animation creation with metadata parsing + - `StateHandler` - Abstract base for state implementations + - `StateFactory` - Dynamic state handler creation -- **Animation Loaders:** - - `AnimationLoader` - Abstract animation loading interface - - `GLTFAnimationLoader` - GLTF/GLB model animation loader +- **State Handlers:** + - `WaitStateHandler` - Idle state with quirk animations + - `ReactStateHandler` - User input response with emotion analysis + - `TypeStateHandler` - Typing state with emotional variations + - `SleepStateHandler` - Inactive state management -- **Factories:** - - `OwenSystemFactory` - Main system assembly factory +- **Animation Loaders:** + - `AnimationLoader` - Abstract animation loading interface + - `GLTFAnimationLoader` - GLTF/GLB model animation loader + +- **Factories:** + - `OwenSystemFactory` - Main system assembly factory ### Features -- **Animation System:** - - Support for Loop (L), Quirk (Q), Transition (T), and Nested animations - - Automatic metadata parsing from animation names - - Efficient animation caching and resource management - - Smooth transitions between states and emotions -- **State Machine:** - - Four core states: Wait, React, Type, Sleep - - Emotional state transitions (Neutral, Angry, Shocked, Happy, Sad) - - Automatic inactivity detection and sleep transitions - - Message analysis for emotional response determination +- **Animation System:** + - Support for Loop (L), Quirk (Q), Transition (T), and Nested animations + - Automatic metadata parsing from animation names + - Efficient animation caching and resource management + - Smooth transitions between states and emotions -- **Developer Experience:** - - Comprehensive TypeScript type definitions - - JSDoc documentation for all public APIs - - Example implementations and demos - - ESLint configuration for code quality - - Vite development server setup +- **State Machine:** + - Four core states: Wait, React, Type, Sleep + - Emotional state transitions (Neutral, Angry, Shocked, Happy, Sad) + - Automatic inactivity detection and sleep transitions + - Message analysis for emotional response determination + +- **Developer Experience:** + - Comprehensive TypeScript type definitions + - JSDoc documentation for all public APIs + - Example implementations and demos + - ESLint configuration for code quality + - Vite development server setup ### Documentation -- Complete README with installation and usage instructions -- API documentation via JSDoc -- Code examples for basic and advanced usage -- Animation naming convention guide -- Troubleshooting section + +- Complete README with installation and usage instructions +- API documentation via JSDoc +- Code examples for basic and advanced usage +- Animation naming convention guide +- Troubleshooting section ### Examples -- Basic browser demo with Three.js integration -- Simple Node.js example for testing -- Interactive controls for state transitions -- Mock model implementation for development -[1.0.0]: https://github.com/your-username/owen-animation-system/releases/tag/v1.0.0 +- Basic browser demo with Three.js integration +- Simple Node.js example for testing +- Interactive controls for state transitions +- Mock model implementation for development + +[1.0.0]: https://gitea.kajkowalski.nl/kjanat/Owen/releases/tag/v1.0.0 diff --git a/README.md b/README.md index 1b75b11..37bef67 100644 --- a/README.md +++ b/README.md @@ -181,7 +181,6 @@ Owen/ │ └── basic-demo.js # Basic usage example ā”œā”€ā”€ package.json ā”œā”€ā”€ vite.config.js -ā”œā”€ā”€ .eslintrc.json ā”œā”€ā”€ jsdoc.config.json └── README.md ``` @@ -228,8 +227,8 @@ Documentation will be generated in the `docs/` directory. - `npm run dev` - Start development server - `npm run build` - Build for production - `npm run preview` - Preview production build -- `npm run lint` - Run ESLint -- `npm run lint:fix` - Fix ESLint issues +- `npm run lint` - Run StandardJS linting +- `npm run lint:fix` - Fix StandardJS issues - `npm run docs` - Generate JSDoc documentation ## šŸŽ® Demo Controls diff --git a/examples/basic-demo-fixed.js b/examples/basic-demo-fixed.js deleted file mode 100644 index 1848a66..0000000 --- a/examples/basic-demo-fixed.js +++ /dev/null @@ -1,332 +0,0 @@ -/** - * @fileoverview Basic example of using the Owen Animation System - * @author Owen Animation System - */ - -import * as THREE from 'three'; -import { GLTFLoader } from 'three/examples/jsm/loaders/GLTFLoader.js'; -import { OwenSystemFactory, States } from '../src/index.js'; - -/** - * Basic Owen Animation System demo - * @class - */ -class OwenDemo { - /** - * Create the demo - */ - constructor() { - /** - * The Three.js scene - * @type {THREE.Scene} - */ - this.scene = new THREE.Scene(); - - /** - * The Three.js camera - * @type {THREE.PerspectiveCamera} - */ - this.camera = new THREE.PerspectiveCamera(75, window.innerWidth / window.innerHeight, 0.1, 1000); - - /** - * The Three.js renderer - * @type {THREE.WebGLRenderer} - */ - this.renderer = new THREE.WebGLRenderer({ antialias: true }); - - /** - * The Owen animation system - * @type {OwenAnimationContext|null} - */ - this.owenSystem = null; - - /** - * Clock for tracking time - * @type {THREE.Clock} - */ - this.clock = new THREE.Clock(); - } - - /** - * Initialize the demo - * @returns {Promise} - */ - async init() { - // Setup renderer - this.renderer.setSize(window.innerWidth, window.innerHeight); - this.renderer.setClearColor(0x1a1a1a); - this.renderer.shadowMap.enabled = true; - this.renderer.shadowMap.type = THREE.PCFSoftShadowMap; - document.body.appendChild(this.renderer.domElement); - - // Setup camera - this.camera.position.set(0, 1.6, 3); - this.camera.lookAt(0, 1, 0); - - // Add lighting - this.setupLighting(); - - // Load Owen model (replace with your model path) - await this.loadOwenModel(); - - // Setup event listeners - this.setupEventListeners(); - - // Start render loop - this.animate(); - - console.log('Owen Demo initialized'); - } - - /** - * Setup scene lighting - * @private - * @returns {void} - */ - setupLighting() { - // Ambient light - const ambientLight = new THREE.AmbientLight(0x404040, 0.4); - this.scene.add(ambientLight); - - // Directional light - const directionalLight = new THREE.DirectionalLight(0xffffff, 0.8); - directionalLight.position.set(5, 10, 5); - directionalLight.castShadow = true; - directionalLight.shadow.mapSize.width = 2048; - directionalLight.shadow.mapSize.height = 2048; - this.scene.add(directionalLight); - - // Fill light - const fillLight = new THREE.DirectionalLight(0x8bb7f0, 0.3); - fillLight.position.set(-5, 5, -5); - this.scene.add(fillLight); - } - - /** - * Load the Owen character model - * @private - * @returns {Promise} - */ - async loadOwenModel() { - try { - const loader = new GLTFLoader(); - - // Replace 'path/to/owen.gltf' with your actual model path - const gltf = await new Promise((resolve, reject) => { - loader.load( - 'path/to/owen.gltf', // Update this path - resolve, - (progress) => console.log('Loading progress:', progress.loaded / progress.total * 100 + '%'), - reject - ); - }); - - const model = gltf.scene; - model.position.set(0, 0, 0); - model.scale.setScalar(1); - - // Enable shadows - model.traverse((child) => { - if (child.isMesh) { - child.castShadow = true; - child.receiveShadow = true; - } - }); - - this.scene.add(model); - - // Create Owen animation system - this.owenSystem = await OwenSystemFactory.createOwenSystem(gltf, this.scene); - - console.log('Owen model loaded and animation system created'); - this.logSystemInfo(); - - } catch (error) { - console.error('Error loading Owen model:', error); - - // Create a placeholder cube for demo purposes - this.createPlaceholderModel(); - } - } - - /** - * Create a placeholder model for demo purposes - * @private - * @returns {void} - */ - createPlaceholderModel() { - const geometry = new THREE.BoxGeometry(1, 2, 1); - const material = new THREE.MeshPhongMaterial({ color: 0x6699ff }); - const cube = new THREE.Mesh(geometry, material); - cube.position.set(0, 1, 0); - cube.castShadow = true; - cube.receiveShadow = true; - this.scene.add(cube); - - console.log('Created placeholder model (cube)'); - } - - /** - * Setup event listeners for user interaction - * @private - * @returns {void} - */ - setupEventListeners() { - // Keyboard controls - document.addEventListener('keydown', (event) => { - if (!this.owenSystem) return; - - switch (event.key) { - case '1': - this.owenSystem.transitionTo(States.WAIT); - break; - case '2': - this.owenSystem.transitionTo(States.REACT); - break; - case '3': - this.owenSystem.transitionTo(States.TYPE); - break; - case '4': - this.owenSystem.transitionTo(States.SLEEP); - break; - case ' ': - this.sendTestMessage(); - break; - } - }); - - // Mouse interaction - document.addEventListener('click', () => { - if (this.owenSystem) { - this.owenSystem.onUserActivity(); - } - }); - - // Window resize - window.addEventListener('resize', () => { - this.camera.aspect = window.innerWidth / window.innerHeight; - this.camera.updateProjectionMatrix(); - this.renderer.setSize(window.innerWidth, window.innerHeight); - }); - - // Add instructions to the page - this.addInstructions(); - } - - /** - * Add on-screen instructions - * @private - * @returns {void} - */ - addInstructions() { - const instructions = document.createElement('div'); - instructions.innerHTML = ` -
-

Owen Animation System Demo

-

Controls:

-

1 - Wait State

-

2 - React State

-

3 - Type State

-

4 - Sleep State

-

Space - Send Test Message

-

Click - User Activity

-
-

Current State: -

-

Available Transitions: -

-
- `; - document.body.appendChild(instructions); - } - - /** - * Send a test message to Owen - * @private - * @returns {void} - */ - sendTestMessage() { - if (!this.owenSystem) return; - - const testMessages = [ - 'Hello Owen!', - 'How are you doing?', - 'This is urgent!', - 'Great work!', - 'Error in the system!', - 'I\'m feeling sad today' - ]; - - const randomMessage = testMessages[Math.floor(Math.random() * testMessages.length)]; - console.log(`Sending message: "${randomMessage}"`); - this.owenSystem.handleUserMessage(randomMessage); - } - - /** - * Log system information - * @private - * @returns {void} - */ - logSystemInfo() { - if (!this.owenSystem) return; - - console.log('=== Owen System Info ==='); - console.log('Available States:', this.owenSystem.getAvailableStates()); - console.log('Available Clips:', this.owenSystem.getAvailableClips()); - console.log('Current State:', this.owenSystem.getCurrentState()); - console.log('========================'); - } - - /** - * Update UI with current system state - * @private - * @returns {void} - */ - updateUI() { - if (!this.owenSystem) return; - - const currentStateElement = document.getElementById('current-state'); - const transitionsElement = document.getElementById('transitions'); - - if (currentStateElement) { - currentStateElement.textContent = this.owenSystem.getCurrentState(); - } - - if (transitionsElement) { - transitionsElement.textContent = this.owenSystem.getAvailableTransitions().join(', '); - } - } - - /** - * Main animation loop - * @private - * @returns {void} - */ - animate() { - requestAnimationFrame(() => this.animate()); - - const deltaTime = this.clock.getDelta() * 1000; // Convert to milliseconds - - // Update Owen system - if (this.owenSystem) { - this.owenSystem.update(deltaTime); - } - - // Update UI - this.updateUI(); - - // Render scene - this.renderer.render(this.scene, this.camera); - } -} - -// Initialize the demo when the page loads -window.addEventListener('load', async () => { - const demo = new OwenDemo(); - try { - await demo.init(); - } catch (error) { - console.error('Failed to initialize Owen demo:', error); - } -}); - -export default OwenDemo; diff --git a/examples/basic-demo.js b/examples/basic-demo.js index 311bc33..a44062a 100644 --- a/examples/basic-demo.js +++ b/examples/basic-demo.js @@ -3,9 +3,9 @@ * @author Owen Animation System */ -import * as THREE from 'three'; -import { GLTFLoader } from 'three/examples/jsm/loaders/GLTFLoader.js'; -import { OwenSystemFactory, States } from '../src/index.js'; +import * as THREE from 'three' +import { GLTFLoader } from 'three/examples/jsm/loaders/GLTFLoader.js' +import { OwenSystemFactory, States } from '../src/index.js' /** * Basic Owen Animation System demo @@ -15,67 +15,67 @@ class OwenDemo { /** * Create the demo */ - constructor() { + constructor () { /** * The Three.js scene * @type {THREE.Scene} */ - this.scene = new THREE.Scene(); + this.scene = new THREE.Scene() /** * The Three.js camera * @type {THREE.PerspectiveCamera} */ - this.camera = new THREE.PerspectiveCamera(75, window.innerWidth / window.innerHeight, 0.1, 1000); + this.camera = new THREE.PerspectiveCamera(75, window.innerWidth / window.innerHeight, 0.1, 1000) /** * The Three.js renderer * @type {THREE.WebGLRenderer} */ - this.renderer = new THREE.WebGLRenderer({ antialias: true }); + this.renderer = new THREE.WebGLRenderer({ antialias: true }) /** * The Owen animation system * @type {OwenAnimationContext|null} */ - this.owenSystem = null; + this.owenSystem = null /** * Clock for tracking time * @type {THREE.Clock} */ - this.clock = new THREE.Clock(); + this.clock = new THREE.Clock() } /** * Initialize the demo * @returns {Promise} */ - async init() { + async init () { // Setup renderer - this.renderer.setSize(window.innerWidth, window.innerHeight); - this.renderer.setClearColor(0x1a1a1a); - this.renderer.shadowMap.enabled = true; - this.renderer.shadowMap.type = THREE.PCFSoftShadowMap; - document.body.appendChild(this.renderer.domElement); + this.renderer.setSize(window.innerWidth, window.innerHeight) + this.renderer.setClearColor(0x1a1a1a) + this.renderer.shadowMap.enabled = true + this.renderer.shadowMap.type = THREE.PCFSoftShadowMap + document.body.appendChild(this.renderer.domElement) // Setup camera - this.camera.position.set(0, 1.6, 3); - this.camera.lookAt(0, 1, 0); + this.camera.position.set(0, 1.6, 3) + this.camera.lookAt(0, 1, 0) // Add lighting - this.setupLighting(); + this.setupLighting() // Load Owen model (replace with your model path) - await this.loadOwenModel(); + await this.loadOwenModel() // Setup event listeners - this.setupEventListeners(); + this.setupEventListeners() // Start render loop - this.animate(); + this.animate() - console.log('Owen Demo initialized'); + console.log('Owen Demo initialized') } /** @@ -83,23 +83,23 @@ class OwenDemo { * @private * @returns {void} */ - setupLighting() { + setupLighting () { // Ambient light - const ambientLight = new THREE.AmbientLight(0x404040, 0.4); - this.scene.add(ambientLight); + const ambientLight = new THREE.AmbientLight(0x404040, 0.4) + this.scene.add(ambientLight) // Directional light - const directionalLight = new THREE.DirectionalLight(0xffffff, 0.8); - directionalLight.position.set(5, 10, 5); - directionalLight.castShadow = true; - directionalLight.shadow.mapSize.width = 2048; - directionalLight.shadow.mapSize.height = 2048; - this.scene.add(directionalLight); + const directionalLight = new THREE.DirectionalLight(0xffffff, 0.8) + directionalLight.position.set(5, 10, 5) + directionalLight.castShadow = true + directionalLight.shadow.mapSize.width = 2048 + directionalLight.shadow.mapSize.height = 2048 + this.scene.add(directionalLight) // Fill light - const fillLight = new THREE.DirectionalLight(0x8bb7f0, 0.3); - fillLight.position.set(-5, 5, -5); - this.scene.add(fillLight); + const fillLight = new THREE.DirectionalLight(0x8bb7f0, 0.3) + fillLight.position.set(-5, 5, -5) + this.scene.add(fillLight) } /** @@ -107,9 +107,9 @@ class OwenDemo { * @private * @returns {Promise} */ - async loadOwenModel() { + async loadOwenModel () { try { - const loader = new GLTFLoader(); + const loader = new GLTFLoader() // Replace 'path/to/owen.gltf' with your actual model path const gltf = await new Promise((resolve, reject) => { @@ -118,34 +118,33 @@ class OwenDemo { resolve, (progress) => console.log('Loading progress:', progress.loaded / progress.total * 100 + '%'), reject - ); - }); + ) + }) - const model = gltf.scene; - model.position.set(0, 0, 0); - model.scale.setScalar(1); + const model = gltf.scene + model.position.set(0, 0, 0) + model.scale.setScalar(1) // Enable shadows model.traverse((child) => { if (child.isMesh) { - child.castShadow = true; - child.receiveShadow = true; + child.castShadow = true + child.receiveShadow = true } - }); + }) - this.scene.add(model); + this.scene.add(model) // Create Owen animation system - this.owenSystem = await OwenSystemFactory.createOwenSystem(gltf, this.scene); - - console.log('Owen model loaded and animation system created'); - this.logSystemInfo(); + this.owenSystem = await OwenSystemFactory.createOwenSystem(gltf, this.scene) + console.log('Owen model loaded and animation system created') + this.logSystemInfo() } catch (error) { - console.error('Error loading Owen model:', error); + console.error('Error loading Owen model:', error) // Create a placeholder cube for demo purposes - this.createPlaceholderModel(); + this.createPlaceholderModel() } } @@ -154,16 +153,16 @@ class OwenDemo { * @private * @returns {void} */ - createPlaceholderModel() { - const geometry = new THREE.BoxGeometry(1, 2, 1); - const material = new THREE.MeshPhongMaterial({ color: 0x6699ff }); - const cube = new THREE.Mesh(geometry, material); - cube.position.set(0, 1, 0); - cube.castShadow = true; - cube.receiveShadow = true; - this.scene.add(cube); + createPlaceholderModel () { + const geometry = new THREE.BoxGeometry(1, 2, 1) + const material = new THREE.MeshPhongMaterial({ color: 0x6699ff }) + const cube = new THREE.Mesh(geometry, material) + cube.position.set(0, 1, 0) + cube.castShadow = true + cube.receiveShadow = true + this.scene.add(cube) - console.log('Created placeholder model (cube)'); + console.log('Created placeholder model (cube)') } /** @@ -171,46 +170,46 @@ class OwenDemo { * @private * @returns {void} */ - setupEventListeners() { + setupEventListeners () { // Keyboard controls document.addEventListener('keydown', (event) => { - if (!this.owenSystem) return; + if (!this.owenSystem) return switch (event.key) { case '1': - this.owenSystem.transitionTo(States.WAIT); - break; + this.owenSystem.transitionTo(States.WAIT) + break case '2': - this.owenSystem.transitionTo(States.REACT); - break; + this.owenSystem.transitionTo(States.REACT) + break case '3': - this.owenSystem.transitionTo(States.TYPE); - break; + this.owenSystem.transitionTo(States.TYPE) + break case '4': - this.owenSystem.transitionTo(States.SLEEP); - break; + this.owenSystem.transitionTo(States.SLEEP) + break case ' ': - this.sendTestMessage(); - break; + this.sendTestMessage() + break } - }); + }) // Mouse interaction document.addEventListener('click', () => { if (this.owenSystem) { - this.owenSystem.onUserActivity(); + this.owenSystem.onUserActivity() } - }); + }) // Window resize window.addEventListener('resize', () => { - this.camera.aspect = window.innerWidth / window.innerHeight; - this.camera.updateProjectionMatrix(); - this.renderer.setSize(window.innerWidth, window.innerHeight); - }); + this.camera.aspect = window.innerWidth / window.innerHeight + this.camera.updateProjectionMatrix() + this.renderer.setSize(window.innerWidth, window.innerHeight) + }) // Add instructions to the page - this.addInstructions(); + this.addInstructions() } /** @@ -218,11 +217,11 @@ class OwenDemo { * @private * @returns {void} */ - addInstructions() { - const instructions = document.createElement('div'); + addInstructions () { + const instructions = document.createElement('div') instructions.innerHTML = `
+ `font-family: monospace; font-size: 14px; line-height: 1.4;">

Owen Animation System Demo

Controls:

1 - Wait State

@@ -235,8 +234,8 @@ class OwenDemo {

Current State: -

Available Transitions: -

- `; - document.body.appendChild(instructions); + ` + document.body.appendChild(instructions) } /** @@ -244,8 +243,8 @@ class OwenDemo { * @private * @returns {void} */ - sendTestMessage() { - if (!this.owenSystem) return; + sendTestMessage () { + if (!this.owenSystem) return const testMessages = [ 'Hello Owen!', @@ -254,11 +253,11 @@ class OwenDemo { 'Great work!', 'Error in the system!', 'I\'m feeling sad today' - ]; + ] - const randomMessage = testMessages[ Math.floor(Math.random() * testMessages.length) ]; - console.log(`Sending message: "${randomMessage}"`); - this.owenSystem.handleUserMessage(randomMessage); + const randomMessage = testMessages[Math.floor(Math.random() * testMessages.length)] + console.log(`Sending message: "${randomMessage}"`) + this.owenSystem.handleUserMessage(randomMessage) } /** @@ -266,14 +265,14 @@ class OwenDemo { * @private * @returns {void} */ - logSystemInfo() { - if (!this.owenSystem) return; + logSystemInfo () { + if (!this.owenSystem) return - console.log('=== Owen System Info ==='); - console.log('Available States:', this.owenSystem.getAvailableStates()); - console.log('Available Clips:', this.owenSystem.getAvailableClips()); - console.log('Current State:', this.owenSystem.getCurrentState()); - console.log('========================'); + console.log('=== Owen System Info ===') + console.log('Available States:', this.owenSystem.getAvailableStates()) + console.log('Available Clips:', this.owenSystem.getAvailableClips()) + console.log('Current State:', this.owenSystem.getCurrentState()) + console.log('========================') } /** @@ -281,18 +280,18 @@ class OwenDemo { * @private * @returns {void} */ - updateUI() { - if (!this.owenSystem) return; + updateUI () { + if (!this.owenSystem) return - const currentStateElement = document.getElementById('current-state'); - const transitionsElement = document.getElementById('transitions'); + const currentStateElement = document.getElementById('current-state') + const transitionsElement = document.getElementById('transitions') if (currentStateElement) { - currentStateElement.textContent = this.owenSystem.getCurrentState(); + currentStateElement.textContent = this.owenSystem.getCurrentState() } if (transitionsElement) { - transitionsElement.textContent = this.owenSystem.getAvailableTransitions().join(', '); + transitionsElement.textContent = this.owenSystem.getAvailableTransitions().join(', ') } } @@ -301,32 +300,32 @@ class OwenDemo { * @private * @returns {void} */ - animate() { - requestAnimationFrame(() => this.animate()); + animate () { + requestAnimationFrame(() => this.animate()) - const deltaTime = this.clock.getDelta() * 1000; // Convert to milliseconds + const deltaTime = this.clock.getDelta() * 1000 // Convert to milliseconds // Update Owen system if (this.owenSystem) { - this.owenSystem.update(deltaTime); + this.owenSystem.update(deltaTime) } // Update UI - this.updateUI(); + this.updateUI() // Render scene - this.renderer.render(this.scene, this.camera); + this.renderer.render(this.scene, this.camera) } } // Initialize the demo when the page loads window.addEventListener('load', async () => { - const demo = new OwenDemo(); + const demo = new OwenDemo() try { - await demo.init(); + await demo.init() } catch (error) { - console.error('Failed to initialize Owen demo:', error); + console.error('Failed to initialize Owen demo:', error) } -}); +}) -export default OwenDemo; +export default OwenDemo diff --git a/examples/index.html b/examples/index.html index 3616b01..d82854c 100644 --- a/examples/index.html +++ b/examples/index.html @@ -1,45 +1,45 @@ - - - + + + Owen Animation System - Basic Demo - - + +
Loading Owen Animation System...
- + diff --git a/examples/simple-example.js b/examples/simple-example.js index b784aaf..3a0991d 100644 --- a/examples/simple-example.js +++ b/examples/simple-example.js @@ -3,39 +3,38 @@ * @author Owen Animation System */ -import { OwenSystemFactory, States } from '../src/index.js'; +import { OwenSystemFactory, States } from '../src/index.js' /** * Simple example of using Owen Animation System * This example shows how to use the system without a browser environment */ class SimpleOwenExample { - constructor() { - this.owenSystem = null; + constructor () { + this.owenSystem = null } /** * Initialize the Owen system with a mock model * @returns {Promise} */ - async init() { + async init () { try { // Create a mock GLTF model for demonstration - const mockModel = this.createMockModel(); + const mockModel = this.createMockModel() // Create the Owen system - this.owenSystem = await OwenSystemFactory.createBasicOwenSystem(mockModel); + this.owenSystem = await OwenSystemFactory.createBasicOwenSystem(mockModel) - console.log('āœ… Owen Animation System initialized successfully!'); - console.log('šŸ“Š System Info:'); - console.log(` Available States: ${this.owenSystem.getAvailableStates().join(', ')}`); - console.log(` Current State: ${this.owenSystem.getCurrentState()}`); + console.log('āœ… Owen Animation System initialized successfully!') + console.log('šŸ“Š System Info:') + console.log(` Available States: ${this.owenSystem.getAvailableStates().join(', ')}`) + console.log(` Current State: ${this.owenSystem.getCurrentState()}`) // Run some example interactions - await this.runExamples(); - + await this.runExamples() } catch (error) { - console.error('āŒ Failed to initialize Owen system:', error.message); + console.error('āŒ Failed to initialize Owen system:', error.message) } } @@ -43,7 +42,7 @@ class SimpleOwenExample { * Create a mock 3D model for demonstration purposes * @returns {Object} Mock model object */ - createMockModel() { + createMockModel () { return { animations: [ { name: 'wait_idle_L' }, @@ -63,46 +62,46 @@ class SimpleOwenExample { ], scene: {}, userData: {} - }; + } } /** * Run example interactions with the Owen system * @returns {Promise} */ - async runExamples() { - console.log('\nšŸŽ¬ Running example interactions...\n'); + async runExamples () { + console.log('\nšŸŽ¬ Running example interactions...\n') // Example 1: Basic state transitions - console.log('šŸ“ Example 1: Manual state transitions'); - await this.demonstrateStateTransitions(); + console.log('šŸ“ Example 1: Manual state transitions') + await this.demonstrateStateTransitions() // Example 2: Message handling - console.log('\nšŸ“ Example 2: Message handling with emotions'); - await this.demonstrateMessageHandling(); + console.log('\nšŸ“ Example 2: Message handling with emotions') + await this.demonstrateMessageHandling() // Example 3: System update loop - console.log('\nšŸ“ Example 3: System update simulation'); - this.demonstrateUpdateLoop(); + console.log('\nšŸ“ Example 3: System update simulation') + this.demonstrateUpdateLoop() - console.log('\n✨ All examples completed!'); + console.log('\n✨ All examples completed!') } /** * Demonstrate manual state transitions * @returns {Promise} */ - async demonstrateStateTransitions() { - const states = [ States.REACT, States.TYPE, States.WAIT, States.SLEEP ]; + async demonstrateStateTransitions () { + const states = [States.REACT, States.TYPE, States.WAIT, States.SLEEP] for (const state of states) { - console.log(`šŸ”„ Transitioning to ${state.toUpperCase()} state...`); - await this.owenSystem.transitionTo(state); - console.log(` āœ“ Current state: ${this.owenSystem.getCurrentState()}`); - console.log(` āœ“ Available transitions: ${this.owenSystem.getAvailableTransitions().join(', ')}`); + console.log(`šŸ”„ Transitioning to ${state.toUpperCase()} state...`) + await this.owenSystem.transitionTo(state) + console.log(` āœ“ Current state: ${this.owenSystem.getCurrentState()}`) + console.log(` āœ“ Available transitions: ${this.owenSystem.getAvailableTransitions().join(', ')}`) // Simulate some time passing - await this.sleep(500); + await this.sleep(500) } } @@ -110,23 +109,23 @@ class SimpleOwenExample { * Demonstrate message handling with emotional responses * @returns {Promise} */ - async demonstrateMessageHandling() { + async demonstrateMessageHandling () { const messages = [ { text: 'Hello Owen!', expected: 'neutral response' }, { text: 'This is urgent!', expected: 'angry/urgent response' }, { text: 'Great work!', expected: 'happy response' }, { text: 'There\'s an error in the system', expected: 'shocked response' }, { text: 'I\'m feeling sad today', expected: 'sad response' } - ]; + ] for (const message of messages) { - console.log(`šŸ’¬ Sending message: "${message.text}"`); - console.log(` Expected: ${message.expected}`); + console.log(`šŸ’¬ Sending message: "${message.text}"`) + console.log(` Expected: ${message.expected}`) - await this.owenSystem.handleUserMessage(message.text); - console.log(` āœ“ Current state after message: ${this.owenSystem.getCurrentState()}`); + await this.owenSystem.handleUserMessage(message.text) + console.log(` āœ“ Current state after message: ${this.owenSystem.getCurrentState()}`) - await this.sleep(300); + await this.sleep(300) } } @@ -134,26 +133,26 @@ class SimpleOwenExample { * Demonstrate the system update loop * @returns {void} */ - demonstrateUpdateLoop() { - console.log('ā±ļø Simulating update loop for 3 seconds...'); + demonstrateUpdateLoop () { + console.log('ā±ļø Simulating update loop for 3 seconds...') - let iterations = 0; - const startTime = Date.now(); + let iterations = 0 + const startTime = Date.now() const updateLoop = () => { - const deltaTime = 16.67; // ~60 FPS - this.owenSystem.update(deltaTime); - iterations++; + const deltaTime = 16.67 // ~60 FPS + this.owenSystem.update(deltaTime) + iterations++ if (Date.now() - startTime < 3000) { - setTimeout(updateLoop, 16); + setTimeout(updateLoop, 16) } else { - console.log(` āœ“ Completed ${iterations} update iterations`); - console.log(` āœ“ Final state: ${this.owenSystem.getCurrentState()}`); + console.log(` āœ“ Completed ${iterations} update iterations`) + console.log(` āœ“ Final state: ${this.owenSystem.getCurrentState()}`) } - }; + } - updateLoop(); + updateLoop() } /** @@ -161,24 +160,24 @@ class SimpleOwenExample { * @param {number} ms - Milliseconds to sleep * @returns {Promise} */ - sleep(ms) { - return new Promise(resolve => setTimeout(resolve, ms)); + sleep (ms) { + return new Promise(resolve => setTimeout(resolve, ms)) } } // Run the example if this file is executed directly -if (import.meta.url === `file://${process.argv[ 1 ]}`) { - console.log('šŸš€ Starting Owen Animation System Example\n'); +if (import.meta.url === `file://${process.argv[1]}`) { + console.log('šŸš€ Starting Owen Animation System Example\n') - const example = new SimpleOwenExample(); + const example = new SimpleOwenExample() example.init() .then(() => { - console.log('\nšŸŽ‰ Example completed successfully!'); - console.log('šŸ’” Try modifying this example or check out the browser demo in examples/index.html'); + console.log('\nšŸŽ‰ Example completed successfully!') + console.log('šŸ’” Try modifying this example or check out the browser demo in examples/index.html') }) .catch(error => { - console.error('\nšŸ’„ Example failed:', error); - }); + console.error('\nšŸ’„ Example failed:', error) + }) } -export default SimpleOwenExample; +export default SimpleOwenExample diff --git a/package-lock.json b/package-lock.json index 6a8d361..b1c346f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -7,13 +7,14 @@ "": { "name": "owen-animation-system", "version": "1.0.0", - "license": "MIT", + "license": "AGPL-3.0-only OR LicenseRef-Commercial", "dependencies": { "three": "^0.176.0" }, "devDependencies": { - "eslint": "^9.27.0", "jsdoc": "^4.0.2", + "pre-commit": "^1.2.2", + "standard": "*", "vite": "^6.3.5" }, "engines": { @@ -530,6 +531,7 @@ "integrity": "sha512-fxlS1kkIjx8+vy2SjuCB94q3htSNrufYTXubwiBFeaQHbH6Ipi43gFJq2zCMt6PHhImH3Xmr0NksKDvchWlpQQ==", "dev": true, "license": "Apache-2.0", + "peer": true, "dependencies": { "@eslint/object-schema": "^2.1.6", "debug": "^4.3.1", @@ -545,6 +547,7 @@ "integrity": "sha512-+GPzk8PlG0sPpzdU5ZvIRMPidzAnZDl/s9L+y13iodqvb8leL53bTannOrQ/Im7UkpsmFU5Ily5U60LWixnmLg==", "dev": true, "license": "Apache-2.0", + "peer": true, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } @@ -555,6 +558,7 @@ "integrity": "sha512-qIbV0/JZr7iSDjqAc60IqbLdsj9GDt16xQtWD+B78d/HAlvysGdZZ6rpJHGAc2T0FQx1X6thsSPdnoiGKdNtdg==", "dev": true, "license": "Apache-2.0", + "peer": true, "dependencies": { "@types/json-schema": "^7.0.15" }, @@ -568,6 +572,7 @@ "integrity": "sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "ajv": "^6.12.4", "debug": "^4.3.2", @@ -586,12 +591,27 @@ "url": "https://opencollective.com/eslint" } }, + "node_modules/@eslint/eslintrc/node_modules/globals": { + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", + "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/@eslint/js": { "version": "9.27.0", "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.27.0.tgz", "integrity": "sha512-G5JD9Tu5HJEu4z2Uo4aHY2sLV64B7CDMXxFzqzjl3NKd6RVzSXNoE80jk7Y0lJkTTkjiIhBAqmlYwjuBY3tvpA==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, @@ -605,6 +625,7 @@ "integrity": "sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA==", "dev": true, "license": "Apache-2.0", + "peer": true, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } @@ -615,6 +636,7 @@ "integrity": "sha512-0J+zgWxHN+xXONWIyPWKFMgVuJoZuGiIFu8yxk7RJjxkzpGmyja5wRFqZIVtjDVOQpV+Rw0iOAjYPE2eQyjr0w==", "dev": true, "license": "Apache-2.0", + "peer": true, "dependencies": { "@eslint/core": "^0.14.0", "levn": "^0.4.1" @@ -629,6 +651,7 @@ "integrity": "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==", "dev": true, "license": "Apache-2.0", + "peer": true, "engines": { "node": ">=18.18.0" } @@ -639,6 +662,7 @@ "integrity": "sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw==", "dev": true, "license": "Apache-2.0", + "peer": true, "dependencies": { "@humanfs/core": "^0.19.1", "@humanwhocodes/retry": "^0.3.0" @@ -653,6 +677,7 @@ "integrity": "sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==", "dev": true, "license": "Apache-2.0", + "peer": true, "engines": { "node": ">=18.18" }, @@ -661,6 +686,22 @@ "url": "https://github.com/sponsors/nzakas" } }, + "node_modules/@humanwhocodes/config-array": { + "version": "0.13.0", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.13.0.tgz", + "integrity": "sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==", + "deprecated": "Use @eslint/config-array instead", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@humanwhocodes/object-schema": "^2.0.3", + "debug": "^4.3.1", + "minimatch": "^3.0.5" + }, + "engines": { + "node": ">=10.10.0" + } + }, "node_modules/@humanwhocodes/module-importer": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", @@ -675,12 +716,21 @@ "url": "https://github.com/sponsors/nzakas" } }, + "node_modules/@humanwhocodes/object-schema": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz", + "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==", + "deprecated": "Use @eslint/object-schema instead", + "dev": true, + "license": "BSD-3-Clause" + }, "node_modules/@humanwhocodes/retry": { "version": "0.4.3", "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.3.tgz", "integrity": "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==", "dev": true, "license": "Apache-2.0", + "peer": true, "engines": { "node": ">=18.18" }, @@ -702,6 +752,44 @@ "node": ">=v12.0.0" } }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, "node_modules/@rollup/rollup-android-arm-eabi": { "version": "4.41.0", "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.41.0.tgz", @@ -982,6 +1070,13 @@ "win32" ] }, + "node_modules/@rtsao/scc": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@rtsao/scc/-/scc-1.1.0.tgz", + "integrity": "sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==", + "dev": true, + "license": "MIT" + }, "node_modules/@types/estree": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.7.tgz", @@ -994,6 +1089,14 @@ "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/@types/json5": { + "version": "0.0.29", + "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", + "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", + "dev": true, "license": "MIT" }, "node_modules/@types/linkify-it": { @@ -1021,6 +1124,13 @@ "dev": true, "license": "MIT" }, + "node_modules/@ungap/structured-clone": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.0.tgz", + "integrity": "sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==", + "dev": true, + "license": "ISC" + }, "node_modules/acorn": { "version": "8.14.1", "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.1.tgz", @@ -1061,6 +1171,16 @@ "url": "https://github.com/sponsors/epoberezkin" } }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", @@ -1084,6 +1204,190 @@ "dev": true, "license": "Python-2.0" }, + "node_modules/array-buffer-byte-length": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.2.tgz", + "integrity": "sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "is-array-buffer": "^3.0.5" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array-includes": { + "version": "3.1.8", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.8.tgz", + "integrity": "sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.4", + "is-string": "^1.0.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.findlast": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/array.prototype.findlast/-/array.prototype.findlast-1.2.5.tgz", + "integrity": "sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.findlastindex": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.6.tgz", + "integrity": "sha512-F/TKATkzseUExPlfvmwQKGITM3DGTK+vkAsCZoDc5daVygbJBnjEUCbgkAvVFsgfXfX4YIqZ/27G3k3tdXrTxQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.9", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "es-shim-unscopables": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.flat": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.3.tgz", + "integrity": "sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.flatmap": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.3.tgz", + "integrity": "sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.tosorted": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.4.tgz", + "integrity": "sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.3", + "es-errors": "^1.3.0", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/arraybuffer.prototype.slice": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.4.tgz", + "integrity": "sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-buffer-byte-length": "^1.0.1", + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "is-array-buffer": "^3.0.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/async-function": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/async-function/-/async-function-1.0.0.tgz", + "integrity": "sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/available-typed-arrays": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", + "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "possible-typed-array-names": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", @@ -1109,6 +1413,86 @@ "concat-map": "0.0.1" } }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/builtins": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/builtins/-/builtins-5.1.0.tgz", + "integrity": "sha512-SW9lzGTLvWTP1AY8xeAMZimqDrIaSdLQUcVr9DMef51niJ022Ri87SwRRKYm4A6iHfkPaiVUu/Duw2Wc4J7kKg==", + "dev": true, + "license": "MIT", + "dependencies": { + "semver": "^7.0.0" + } + }, + "node_modules/builtins/node_modules/semver": { + "version": "7.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", + "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/call-bind": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz", + "integrity": "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.0", + "es-define-property": "^1.0.0", + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/call-bound": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", + "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "get-intrinsic": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/callsites": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", @@ -1176,6 +1560,29 @@ "dev": true, "license": "MIT" }, + "node_modules/concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "dev": true, + "engines": [ + "node >= 0.8" + ], + "license": "MIT", + "dependencies": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + } + }, + "node_modules/core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", + "dev": true, + "license": "MIT" + }, "node_modules/cross-spawn": { "version": "7.0.6", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", @@ -1191,6 +1598,60 @@ "node": ">= 8" } }, + "node_modules/data-view-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.2.tgz", + "integrity": "sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/data-view-byte-length": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.2.tgz", + "integrity": "sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/inspect-js" + } + }, + "node_modules/data-view-byte-offset": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.1.tgz", + "integrity": "sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/debug": { "version": "4.4.1", "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz", @@ -1216,6 +1677,70 @@ "dev": true, "license": "MIT" }, + "node_modules/define-data-property": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/define-properties": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-data-property": "^1.0.1", + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/entities": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", @@ -1229,6 +1754,190 @@ "url": "https://github.com/fb55/entities?sponsor=1" } }, + "node_modules/error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/es-abstract": { + "version": "1.23.10", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.10.tgz", + "integrity": "sha512-MtUbM072wlJNyeYAe0mhzrD+M6DIJa96CZAOBBrhDbgKnB4MApIKefcyAB1eOdYn8cUNZgvwBvEzdoAYsxgEIw==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-buffer-byte-length": "^1.0.2", + "arraybuffer.prototype.slice": "^1.0.4", + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "data-view-buffer": "^1.0.2", + "data-view-byte-length": "^1.0.2", + "data-view-byte-offset": "^1.0.1", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "es-set-tostringtag": "^2.1.0", + "es-to-primitive": "^1.3.0", + "function.prototype.name": "^1.1.8", + "get-intrinsic": "^1.3.0", + "get-proto": "^1.0.1", + "get-symbol-description": "^1.1.0", + "globalthis": "^1.0.4", + "gopd": "^1.2.0", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "internal-slot": "^1.1.0", + "is-array-buffer": "^3.0.5", + "is-callable": "^1.2.7", + "is-data-view": "^1.0.2", + "is-regex": "^1.2.1", + "is-shared-array-buffer": "^1.0.4", + "is-string": "^1.1.1", + "is-typed-array": "^1.1.15", + "is-weakref": "^1.1.1", + "math-intrinsics": "^1.1.0", + "object-inspect": "^1.13.4", + "object-keys": "^1.1.1", + "object.assign": "^4.1.7", + "own-keys": "^1.0.1", + "regexp.prototype.flags": "^1.5.4", + "safe-array-concat": "^1.1.3", + "safe-push-apply": "^1.0.0", + "safe-regex-test": "^1.1.0", + "set-proto": "^1.0.0", + "string.prototype.trim": "^1.2.10", + "string.prototype.trimend": "^1.0.9", + "string.prototype.trimstart": "^1.0.8", + "typed-array-buffer": "^1.0.3", + "typed-array-byte-length": "^1.0.3", + "typed-array-byte-offset": "^1.0.4", + "typed-array-length": "^1.0.7", + "unbox-primitive": "^1.1.0", + "which-typed-array": "^1.1.19" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-iterator-helpers": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.2.1.tgz", + "integrity": "sha512-uDn+FE1yrDzyC0pCo961B2IHbdM8y/ACZsKD4dG6WqrjV53BADjwa7D+1aom2rsNVfLyDgU/eigvlJGJ08OQ4w==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.6", + "es-errors": "^1.3.0", + "es-set-tostringtag": "^2.0.3", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.6", + "globalthis": "^1.0.4", + "gopd": "^1.2.0", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.2.0", + "has-symbols": "^1.1.0", + "internal-slot": "^1.1.0", + "iterator.prototype": "^1.1.4", + "safe-array-concat": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-object-atoms": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", + "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-shim-unscopables": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.1.0.tgz", + "integrity": "sha512-d9T8ucsEhh8Bi1woXCf+TIKDIROLG5WCkxg8geBCbvk22kzwC5G2OnXVMO6FUsvQlgUUXQ2itephWDLqDzbeCw==", + "dev": true, + "license": "MIT", + "dependencies": { + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-to-primitive": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.3.0.tgz", + "integrity": "sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-callable": "^1.2.7", + "is-date-object": "^1.0.5", + "is-symbol": "^1.0.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/esbuild": { "version": "0.25.4", "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.4.tgz", @@ -1289,6 +1998,7 @@ "integrity": "sha512-ixRawFQuMB9DZ7fjU3iGGganFDp3+45bPOdaRurcFHSXO1e/sYwUX/FtQZpLZJR6SjMoJH8hR2pPEAfDyCoU2Q==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.12.1", @@ -1344,12 +2054,259 @@ } } }, + "node_modules/eslint-import-resolver-node": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz", + "integrity": "sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^3.2.7", + "is-core-module": "^2.13.0", + "resolve": "^1.22.4" + } + }, + "node_modules/eslint-import-resolver-node/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-module-utils": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.12.0.tgz", + "integrity": "sha512-wALZ0HFoytlyh/1+4wuZ9FJCD/leWHQzzrxJ8+rebyReSLk7LApMyd3WJaLVoN+D5+WIdJyDK1c6JnE65V4Zyg==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^3.2.7" + }, + "engines": { + "node": ">=4" + }, + "peerDependenciesMeta": { + "eslint": { + "optional": true + } + } + }, + "node_modules/eslint-module-utils/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-plugin-es": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-es/-/eslint-plugin-es-4.1.0.tgz", + "integrity": "sha512-GILhQTnjYE2WorX5Jyi5i4dz5ALWxBIdQECVQavL6s7cI76IZTDWleTHkxz/QT3kvcs2QlGHvKLYsSlPOlPXnQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "eslint-utils": "^2.0.0", + "regexpp": "^3.0.0" + }, + "engines": { + "node": ">=8.10.0" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + }, + "peerDependencies": { + "eslint": ">=4.19.1" + } + }, + "node_modules/eslint-plugin-es/node_modules/eslint-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", + "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", + "dev": true, + "license": "MIT", + "dependencies": { + "eslint-visitor-keys": "^1.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + } + }, + "node_modules/eslint-plugin-es/node_modules/eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=4" + } + }, + "node_modules/eslint-plugin-import": { + "version": "2.31.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.31.0.tgz", + "integrity": "sha512-ixmkI62Rbc2/w8Vfxyh1jQRTdRTF52VxwRVHl/ykPAmqG+Nb7/kNn+byLP0LxPgI7zWA16Jt82SybJInmMia3A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@rtsao/scc": "^1.1.0", + "array-includes": "^3.1.8", + "array.prototype.findlastindex": "^1.2.5", + "array.prototype.flat": "^1.3.2", + "array.prototype.flatmap": "^1.3.2", + "debug": "^3.2.7", + "doctrine": "^2.1.0", + "eslint-import-resolver-node": "^0.3.9", + "eslint-module-utils": "^2.12.0", + "hasown": "^2.0.2", + "is-core-module": "^2.15.1", + "is-glob": "^4.0.3", + "minimatch": "^3.1.2", + "object.fromentries": "^2.0.8", + "object.groupby": "^1.0.3", + "object.values": "^1.2.0", + "semver": "^6.3.1", + "string.prototype.trimend": "^1.0.8", + "tsconfig-paths": "^3.15.0" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 || ^9" + } + }, + "node_modules/eslint-plugin-import/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-plugin-n": { + "version": "15.7.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-n/-/eslint-plugin-n-15.7.0.tgz", + "integrity": "sha512-jDex9s7D/Qial8AGVIHq4W7NswpUD5DPDL2RH8Lzd9EloWUuvUkHfv4FRLMipH5q2UtyurorBkPeNi1wVWNh3Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "builtins": "^5.0.1", + "eslint-plugin-es": "^4.1.0", + "eslint-utils": "^3.0.0", + "ignore": "^5.1.1", + "is-core-module": "^2.11.0", + "minimatch": "^3.1.2", + "resolve": "^1.22.1", + "semver": "^7.3.8" + }, + "engines": { + "node": ">=12.22.0" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + }, + "peerDependencies": { + "eslint": ">=7.0.0" + } + }, + "node_modules/eslint-plugin-n/node_modules/semver": { + "version": "7.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", + "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/eslint-plugin-promise": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-promise/-/eslint-plugin-promise-6.6.0.tgz", + "integrity": "sha512-57Zzfw8G6+Gq7axm2Pdo3gW/Rx3h9Yywgn61uE/3elTCOePEHVrn2i5CdfBwA1BLK0Q0WqctICIUSqXZW/VprQ==", + "dev": true, + "license": "ISC", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + }, + "peerDependencies": { + "eslint": "^7.0.0 || ^8.0.0 || ^9.0.0" + } + }, + "node_modules/eslint-plugin-react": { + "version": "7.37.5", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.37.5.tgz", + "integrity": "sha512-Qteup0SqU15kdocexFNAJMvCJEfa2xUKNV4CC1xsVMrIIqEy3SQ/rqyxCWNzfrd3/ldy6HMlD2e0JDVpDg2qIA==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-includes": "^3.1.8", + "array.prototype.findlast": "^1.2.5", + "array.prototype.flatmap": "^1.3.3", + "array.prototype.tosorted": "^1.1.4", + "doctrine": "^2.1.0", + "es-iterator-helpers": "^1.2.1", + "estraverse": "^5.3.0", + "hasown": "^2.0.2", + "jsx-ast-utils": "^2.4.1 || ^3.0.0", + "minimatch": "^3.1.2", + "object.entries": "^1.1.9", + "object.fromentries": "^2.0.8", + "object.values": "^1.2.1", + "prop-types": "^15.8.1", + "resolve": "^2.0.0-next.5", + "semver": "^6.3.1", + "string.prototype.matchall": "^4.0.12", + "string.prototype.repeat": "^1.0.0" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7" + } + }, + "node_modules/eslint-plugin-react/node_modules/resolve": { + "version": "2.0.0-next.5", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.5.tgz", + "integrity": "sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/eslint-scope": { "version": "8.3.0", "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.3.0.tgz", "integrity": "sha512-pUNxi75F8MJ/GdeKtVLSbYg4ZI34J6C0C7sbL4YOp2exGwen7ZsuBqKzUhXd0qMQ362yET3z+uPwKeg/0C2XCQ==", "dev": true, "license": "BSD-2-Clause", + "peer": true, "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^5.2.0" @@ -1361,6 +2318,35 @@ "url": "https://opencollective.com/eslint" } }, + "node_modules/eslint-utils": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", + "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "eslint-visitor-keys": "^2.0.0" + }, + "engines": { + "node": "^10.0.0 || ^12.0.0 || >= 14.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + }, + "peerDependencies": { + "eslint": ">=5" + } + }, + "node_modules/eslint-utils/node_modules/eslint-visitor-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", + "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=10" + } + }, "node_modules/eslint-visitor-keys": { "version": "3.4.3", "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", @@ -1380,6 +2366,7 @@ "integrity": "sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==", "dev": true, "license": "Apache-2.0", + "peer": true, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, @@ -1393,6 +2380,7 @@ "integrity": "sha512-0QYC8b24HWY8zjRnDTL6RiHfDbAWn63qb4LMj1Z4b076A4une81+z03Kg7l7mn/48PUTqoLptSXez8oknU8Clg==", "dev": true, "license": "BSD-2-Clause", + "peer": true, "dependencies": { "acorn": "^8.14.0", "acorn-jsx": "^5.3.2", @@ -1411,6 +2399,7 @@ "integrity": "sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==", "dev": true, "license": "Apache-2.0", + "peer": true, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, @@ -1485,6 +2474,16 @@ "dev": true, "license": "MIT" }, + "node_modules/fastq": { + "version": "1.19.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.1.tgz", + "integrity": "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "reusify": "^1.0.4" + } + }, "node_modules/fdir": { "version": "6.4.4", "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.4.4.tgz", @@ -1506,6 +2505,7 @@ "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "flat-cache": "^4.0.0" }, @@ -1536,6 +2536,7 @@ "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "flatted": "^3.2.9", "keyv": "^4.5.4" @@ -1551,6 +2552,29 @@ "dev": true, "license": "ISC" }, + "node_modules/for-each": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.5.tgz", + "integrity": "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-callable": "^1.2.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true, + "license": "ISC" + }, "node_modules/fsevents": { "version": "2.3.3", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", @@ -1566,6 +2590,139 @@ "node": "^8.16.0 || ^10.6.0 || >=11.0.0" } }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/function.prototype.name": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.8.tgz", + "integrity": "sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "functions-have-names": "^1.2.3", + "hasown": "^2.0.2", + "is-callable": "^1.2.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/functions-have-names": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-intrinsic": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "dev": true, + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/get-stdin": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-8.0.0.tgz", + "integrity": "sha512-sY22aA6xchAzprjyqmSEQv4UbAAzRN0L2dQB0NlN5acTTK9Don6nhoc3eAbUnpZiCANAMfd/+40kVdKfFygohg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/get-symbol-description": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.1.0.tgz", + "integrity": "sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "dev": true, + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/glob-parent": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", @@ -1579,17 +2736,34 @@ "node": ">=10.13.0" } }, - "node_modules/globals": { - "version": "14.0.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", - "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", + "node_modules/globalthis": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz", + "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-properties": "^1.2.1", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", "dev": true, "license": "MIT", "engines": { - "node": ">=18" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/graceful-fs": { @@ -1599,6 +2773,26 @@ "dev": true, "license": "ISC" }, + "node_modules/graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", + "dev": true, + "license": "MIT" + }, + "node_modules/has-bigints": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.1.0.tgz", + "integrity": "sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", @@ -1609,6 +2803,77 @@ "node": ">=8" } }, + "node_modules/has-property-descriptors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-proto": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.2.0.tgz", + "integrity": "sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-symbols": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/ignore": { "version": "5.3.2", "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", @@ -1646,6 +2911,182 @@ "node": ">=0.8.19" } }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", + "dev": true, + "license": "ISC", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/internal-slot": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.1.0.tgz", + "integrity": "sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "hasown": "^2.0.2", + "side-channel": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/is-array-buffer": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.5.tgz", + "integrity": "sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "get-intrinsic": "^1.2.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", + "dev": true, + "license": "MIT" + }, + "node_modules/is-async-function": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.1.1.tgz", + "integrity": "sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "async-function": "^1.0.0", + "call-bound": "^1.0.3", + "get-proto": "^1.0.1", + "has-tostringtag": "^1.0.2", + "safe-regex-test": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-bigint": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.1.0.tgz", + "integrity": "sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-bigints": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-boolean-object": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.2.2.tgz", + "integrity": "sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-callable": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-core-module": { + "version": "2.16.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", + "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", + "dev": true, + "license": "MIT", + "dependencies": { + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-data-view": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.2.tgz", + "integrity": "sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "get-intrinsic": "^1.2.6", + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-date-object": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.1.0.tgz", + "integrity": "sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", @@ -1656,6 +3097,41 @@ "node": ">=0.10.0" } }, + "node_modules/is-finalizationregistry": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.1.1.tgz", + "integrity": "sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-generator-function": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.1.0.tgz", + "integrity": "sha512-nPUB5km40q9e8UfN/Zc24eLlzdSf9OfKByBw9CIdw4H1giPMeA0OIJvbchsCu4npfI2QcMVBsGEBHKZ7wLTWmQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "get-proto": "^1.0.0", + "has-tostringtag": "^1.0.2", + "safe-regex-test": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-glob": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", @@ -1669,6 +3145,198 @@ "node": ">=0.10.0" } }, + "node_modules/is-map": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz", + "integrity": "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-number-object": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.1.1.tgz", + "integrity": "sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-regex": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz", + "integrity": "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "gopd": "^1.2.0", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-set": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz", + "integrity": "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-shared-array-buffer": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.4.tgz", + "integrity": "sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-string": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.1.1.tgz", + "integrity": "sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-symbol": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.1.1.tgz", + "integrity": "sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "has-symbols": "^1.1.0", + "safe-regex-test": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-typed-array": { + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.15.tgz", + "integrity": "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "which-typed-array": "^1.1.16" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakmap": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz", + "integrity": "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakref": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.1.1.tgz", + "integrity": "sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakset": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.4.tgz", + "integrity": "sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "get-intrinsic": "^1.2.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true, + "license": "MIT" + }, "node_modules/isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", @@ -1676,6 +3344,31 @@ "dev": true, "license": "ISC" }, + "node_modules/iterator.prototype": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.5.tgz", + "integrity": "sha512-H0dkQoCa3b2VEeKQBOxFph+JAbcrQdE7KC0UkqwpLmv2EC4P41QXP+rqo9wYodACiG5/WM5s9oDApTU8utwj9g==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-data-property": "^1.1.4", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.6", + "get-proto": "^1.0.0", + "has-symbols": "^1.1.0", + "set-function-name": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true, + "license": "MIT" + }, "node_modules/js-yaml": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", @@ -1746,6 +3439,13 @@ "dev": true, "license": "MIT" }, + "node_modules/json-parse-better-errors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", + "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", + "dev": true, + "license": "MIT" + }, "node_modules/json-schema-traverse": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", @@ -1760,6 +3460,35 @@ "dev": true, "license": "MIT" }, + "node_modules/json5": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", + "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", + "dev": true, + "license": "MIT", + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" + } + }, + "node_modules/jsx-ast-utils": { + "version": "3.3.5", + "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz", + "integrity": "sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-includes": "^3.1.6", + "array.prototype.flat": "^1.3.1", + "object.assign": "^4.1.4", + "object.values": "^1.1.6" + }, + "engines": { + "node": ">=4.0" + } + }, "node_modules/keyv": { "version": "4.5.4", "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", @@ -1804,6 +3533,23 @@ "uc.micro": "^2.0.0" } }, + "node_modules/load-json-file": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-5.3.0.tgz", + "integrity": "sha512-cJGP40Jc/VXUsp8/OrnyKyTZ1y6v/dphm3bioS+RrKXjK2BB6wHUd6JptZEFDGgGahMT+InnZO5i1Ei9mpC8Bw==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.1.15", + "parse-json": "^4.0.0", + "pify": "^4.0.1", + "strip-bom": "^3.0.0", + "type-fest": "^0.3.0" + }, + "engines": { + "node": ">=6" + } + }, "node_modules/locate-path": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", @@ -1834,6 +3580,30 @@ "dev": true, "license": "MIT" }, + "node_modules/loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, + "node_modules/lru-cache": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", + "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", + "dev": true, + "license": "ISC", + "dependencies": { + "pseudomap": "^1.0.2", + "yallist": "^2.1.2" + } + }, "node_modules/markdown-it": { "version": "14.1.0", "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-14.1.0.tgz", @@ -1876,6 +3646,16 @@ "node": ">= 12" } }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, "node_modules/mdurl": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-2.0.0.tgz", @@ -1896,6 +3676,16 @@ "node": "*" } }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/mkdirp": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", @@ -1942,6 +3732,139 @@ "dev": true, "license": "MIT" }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-inspect": { + "version": "1.13.4", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", + "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.assign": { + "version": "4.1.7", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.7.tgz", + "integrity": "sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0", + "has-symbols": "^1.1.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.entries": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.9.tgz", + "integrity": "sha512-8u/hfXFRBD1O0hPUjioLhoWFHRmt6tKA4/vZPyckBr18l1KE9uHrFaFaUi8MDRTpi4uak2goyPTSNJLXX2k2Hw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.fromentries": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.8.tgz", + "integrity": "sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.groupby": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.3.tgz", + "integrity": "sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.values": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.2.1.tgz", + "integrity": "sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "license": "ISC", + "dependencies": { + "wrappy": "1" + } + }, "node_modules/optionator": { "version": "0.9.4", "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", @@ -1960,6 +3883,33 @@ "node": ">= 0.8.0" } }, + "node_modules/os-shim": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/os-shim/-/os-shim-0.1.3.tgz", + "integrity": "sha512-jd0cvB8qQ5uVt0lvCIexBaROw1KyKm5sbulg2fWOHjETisuCzWyt+eTZKEMs8v6HwzoGs8xik26jg7eCM6pS+A==", + "dev": true, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/own-keys": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/own-keys/-/own-keys-1.0.1.tgz", + "integrity": "sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==", + "dev": true, + "license": "MIT", + "dependencies": { + "get-intrinsic": "^1.2.6", + "object-keys": "^1.1.1", + "safe-push-apply": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/p-limit": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", @@ -1992,6 +3942,16 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, "node_modules/parent-module": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", @@ -2005,6 +3965,20 @@ "node": ">=6" } }, + "node_modules/parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==", + "dev": true, + "license": "MIT", + "dependencies": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/path-exists": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", @@ -2015,6 +3989,16 @@ "node": ">=8" } }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/path-key": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", @@ -2025,6 +4009,13 @@ "node": ">=8" } }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true, + "license": "MIT" + }, "node_modules/picocolors": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", @@ -2045,6 +4036,106 @@ "url": "https://github.com/sponsors/jonschlinkert" } }, + "node_modules/pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/pkg-conf": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/pkg-conf/-/pkg-conf-3.1.0.tgz", + "integrity": "sha512-m0OTbR/5VPNPqO1ph6Fqbj7Hv6QU7gR/tQW40ZqrL1rjgCU85W6C1bJn0BItuJqnR98PWzw7Z8hHeChD1WrgdQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "find-up": "^3.0.0", + "load-json-file": "^5.2.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/pkg-conf/node_modules/find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/pkg-conf/node_modules/locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/pkg-conf/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pkg-conf/node_modules/p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/pkg-conf/node_modules/path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/possible-typed-array-names": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz", + "integrity": "sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, "node_modules/postcss": { "version": "8.5.3", "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.3.tgz", @@ -2074,6 +4165,67 @@ "node": "^10 || ^12 || >=14" } }, + "node_modules/pre-commit": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/pre-commit/-/pre-commit-1.2.2.tgz", + "integrity": "sha512-qokTiqxD6GjODy5ETAIgzsRgnBWWQHQH2ghy86PU7mIn/wuWeTwF3otyNQZxWBwVn8XNr8Tdzj/QfUXpH+gRZA==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "cross-spawn": "^5.0.1", + "spawn-sync": "^1.0.15", + "which": "1.2.x" + } + }, + "node_modules/pre-commit/node_modules/cross-spawn": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", + "integrity": "sha512-pTgQJ5KC0d2hcY8eyL1IzlBPYjTkyH72XRZPnLyKus2mBfNjQs3klqbJU2VILqZryAZUt9JOb3h/mWMy23/f5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "lru-cache": "^4.0.1", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + }, + "node_modules/pre-commit/node_modules/shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==", + "dev": true, + "license": "MIT", + "dependencies": { + "shebang-regex": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pre-commit/node_modules/shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pre-commit/node_modules/which": { + "version": "1.2.14", + "resolved": "https://registry.npmjs.org/which/-/which-1.2.14.tgz", + "integrity": "sha512-16uPglFkRPzgiUXYMi1Jf8Z5EzN1iB4V0ZtMXcHZnwsBtQhhHeCqoWw7tsUY42hJGNDWtUsVLTjakIa5BgAxCw==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } + }, "node_modules/prelude-ls": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", @@ -2084,6 +4236,32 @@ "node": ">= 0.8.0" } }, + "node_modules/process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "dev": true, + "license": "MIT" + }, + "node_modules/prop-types": { + "version": "15.8.1", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", + "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", + "dev": true, + "license": "MIT", + "dependencies": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.13.1" + } + }, + "node_modules/pseudomap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", + "integrity": "sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ==", + "dev": true, + "license": "ISC" + }, "node_modules/punycode": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", @@ -2104,6 +4282,114 @@ "node": ">=6" } }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dev": true, + "license": "MIT", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/readable-stream/node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/reflect.getprototypeof": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.10.tgz", + "integrity": "sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.9", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.7", + "get-proto": "^1.0.1", + "which-builtin-type": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/regexp.prototype.flags": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.4.tgz", + "integrity": "sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-errors": "^1.3.0", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "set-function-name": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/regexpp": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", + "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + } + }, "node_modules/requizzle": { "version": "0.2.4", "resolved": "https://registry.npmjs.org/requizzle/-/requizzle-0.2.4.tgz", @@ -2114,6 +4400,27 @@ "lodash": "^4.17.21" } }, + "node_modules/resolve": { + "version": "1.22.10", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz", + "integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-core-module": "^2.16.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/resolve-from": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", @@ -2124,6 +4431,34 @@ "node": ">=4" } }, + "node_modules/reusify": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", + "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", + "dev": true, + "license": "MIT", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", + "dev": true, + "license": "ISC", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/rollup": { "version": "4.41.0", "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.41.0.tgz", @@ -2164,6 +4499,151 @@ "fsevents": "~2.3.2" } }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/safe-array-concat": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.3.tgz", + "integrity": "sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.2", + "get-intrinsic": "^1.2.6", + "has-symbols": "^1.1.0", + "isarray": "^2.0.5" + }, + "engines": { + "node": ">=0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true, + "license": "MIT" + }, + "node_modules/safe-push-apply": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/safe-push-apply/-/safe-push-apply-1.0.0.tgz", + "integrity": "sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "isarray": "^2.0.5" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safe-regex-test": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.1.0.tgz", + "integrity": "sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "is-regex": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/set-function-length": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/set-function-name": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", + "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "functions-have-names": "^1.2.3", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/set-proto": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/set-proto/-/set-proto-1.0.0.tgz", + "integrity": "sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==", + "dev": true, + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", @@ -2187,6 +4667,82 @@ "node": ">=8" } }, + "node_modules/side-channel": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", + "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3", + "side-channel-list": "^1.0.0", + "side-channel-map": "^1.0.1", + "side-channel-weakmap": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-list": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", + "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-map": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", + "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-weakmap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", + "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3", + "side-channel-map": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/source-map-js": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", @@ -2197,6 +4753,468 @@ "node": ">=0.10.0" } }, + "node_modules/spawn-sync": { + "version": "1.0.15", + "resolved": "https://registry.npmjs.org/spawn-sync/-/spawn-sync-1.0.15.tgz", + "integrity": "sha512-9DWBgrgYZzNghseho0JOuh+5fg9u6QWhAWa51QC7+U5rCheZ/j1DrEZnyE0RBBRqZ9uEXGPgSSM0nky6burpVw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "concat-stream": "^1.4.7", + "os-shim": "^0.1.2" + } + }, + "node_modules/standard": { + "version": "17.1.2", + "resolved": "https://registry.npmjs.org/standard/-/standard-17.1.2.tgz", + "integrity": "sha512-WLm12WoXveKkvnPnPnaFUUHuOB2cUdAsJ4AiGHL2G0UNMrcRAWY2WriQaV8IQ3oRmYr0AWUbLNr94ekYFAHOrA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "eslint": "^8.41.0", + "eslint-config-standard": "17.1.0", + "eslint-config-standard-jsx": "^11.0.0", + "eslint-plugin-import": "^2.27.5", + "eslint-plugin-n": "^15.7.0", + "eslint-plugin-promise": "^6.1.1", + "eslint-plugin-react": "^7.36.1", + "standard-engine": "^15.1.0", + "version-guard": "^1.1.1" + }, + "bin": { + "standard": "bin/cmd.cjs" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/standard-engine": { + "version": "15.1.0", + "resolved": "https://registry.npmjs.org/standard-engine/-/standard-engine-15.1.0.tgz", + "integrity": "sha512-VHysfoyxFu/ukT+9v49d4BRXIokFRZuH3z1VRxzFArZdjSCFpro6rEIU3ji7e4AoAtuSfKBkiOmsrDqKW5ZSRw==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "get-stdin": "^8.0.0", + "minimist": "^1.2.6", + "pkg-conf": "^3.1.0", + "xdg-basedir": "^4.0.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/standard/node_modules/@eslint/eslintrc": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", + "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.6.0", + "globals": "^13.19.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/standard/node_modules/@eslint/js": { + "version": "8.57.1", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.1.tgz", + "integrity": "sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/standard/node_modules/doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/standard/node_modules/eslint": { + "version": "8.57.1", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.1.tgz", + "integrity": "sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==", + "deprecated": "This version is no longer supported. Please see https://eslint.org/version-support for other options.", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.6.1", + "@eslint/eslintrc": "^2.1.4", + "@eslint/js": "8.57.1", + "@humanwhocodes/config-array": "^0.13.0", + "@humanwhocodes/module-importer": "^1.0.1", + "@nodelib/fs.walk": "^1.2.8", + "@ungap/structured-clone": "^1.2.0", + "ajv": "^6.12.4", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "doctrine": "^3.0.0", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^7.2.2", + "eslint-visitor-keys": "^3.4.3", + "espree": "^9.6.1", + "esquery": "^1.4.2", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "globals": "^13.19.0", + "graphemer": "^1.4.0", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "is-path-inside": "^3.0.3", + "js-yaml": "^4.1.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3", + "strip-ansi": "^6.0.1", + "text-table": "^0.2.0" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/standard/node_modules/eslint-config-standard": { + "version": "17.1.0", + "resolved": "https://registry.npmjs.org/eslint-config-standard/-/eslint-config-standard-17.1.0.tgz", + "integrity": "sha512-IwHwmaBNtDK4zDHQukFDW5u/aTb8+meQWZvNFWkiGmbWjD6bqyuSSBxxXKkCftCUzc1zwCH2m/baCNDLGmuO5Q==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "eslint": "^8.0.1", + "eslint-plugin-import": "^2.25.2", + "eslint-plugin-n": "^15.0.0 || ^16.0.0 ", + "eslint-plugin-promise": "^6.0.0" + } + }, + "node_modules/standard/node_modules/eslint-config-standard-jsx": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/eslint-config-standard-jsx/-/eslint-config-standard-jsx-11.0.0.tgz", + "integrity": "sha512-+1EV/R0JxEK1L0NGolAr8Iktm3Rgotx3BKwgaX+eAuSX8D952LULKtjgZD3F+e6SvibONnhLwoTi9DPxN5LvvQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "peerDependencies": { + "eslint": "^8.8.0", + "eslint-plugin-react": "^7.28.0" + } + }, + "node_modules/standard/node_modules/eslint-scope": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", + "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/standard/node_modules/espree": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", + "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "acorn": "^8.9.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/standard/node_modules/file-entry-cache": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "dev": true, + "license": "MIT", + "dependencies": { + "flat-cache": "^3.0.4" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/standard/node_modules/flat-cache": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", + "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", + "dev": true, + "license": "MIT", + "dependencies": { + "flatted": "^3.2.9", + "keyv": "^4.5.3", + "rimraf": "^3.0.2" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/standard/node_modules/globals": { + "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/standard/node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/string.prototype.matchall": { + "version": "4.0.12", + "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.12.tgz", + "integrity": "sha512-6CC9uyBL+/48dYizRf7H7VAYCMCNTBeM78x/VTUe9bFEaxBepPJDa1Ow99LqI/1yF7kuy7Q3cQsYMrcjGUcskA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.6", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.6", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "internal-slot": "^1.1.0", + "regexp.prototype.flags": "^1.5.3", + "set-function-name": "^2.0.2", + "side-channel": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.repeat": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/string.prototype.repeat/-/string.prototype.repeat-1.0.0.tgz", + "integrity": "sha512-0u/TldDbKD8bFCQ/4f5+mNRrXwZ8hg2w7ZR8wa16e8z9XpePWl3eGEcUD0OXpEH/VJH/2G3gjUtR3ZOiBe2S/w==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5" + } + }, + "node_modules/string.prototype.trim": { + "version": "1.2.10", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.10.tgz", + "integrity": "sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.2", + "define-data-property": "^1.1.4", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-object-atoms": "^1.0.0", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimend": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.9.tgz", + "integrity": "sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.2", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimstart": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz", + "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, "node_modules/strip-json-comments": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", @@ -2223,6 +5241,26 @@ "node": ">=8" } }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", + "dev": true, + "license": "MIT" + }, "node_modules/three": { "version": "0.176.0", "resolved": "https://registry.npmjs.org/three/-/three-0.176.0.tgz", @@ -2246,6 +5284,19 @@ "url": "https://github.com/sponsors/SuperchupuDev" } }, + "node_modules/tsconfig-paths": { + "version": "3.15.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz", + "integrity": "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/json5": "^0.0.29", + "json5": "^1.0.2", + "minimist": "^1.2.6", + "strip-bom": "^3.0.0" + } + }, "node_modules/type-check": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", @@ -2259,6 +5310,101 @@ "node": ">= 0.8.0" } }, + "node_modules/type-fest": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.3.1.tgz", + "integrity": "sha512-cUGJnCdr4STbePCgqNFbpVNCepa+kAVohJs1sLhxzdH+gnEoOd8VhbYa7pD3zZYGiURWM2xzEII3fQcRizDkYQ==", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=6" + } + }, + "node_modules/typed-array-buffer": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz", + "integrity": "sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-typed-array": "^1.1.14" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/typed-array-byte-length": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.3.tgz", + "integrity": "sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "for-each": "^0.3.3", + "gopd": "^1.2.0", + "has-proto": "^1.2.0", + "is-typed-array": "^1.1.14" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-byte-offset": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.4.tgz", + "integrity": "sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", + "for-each": "^0.3.3", + "gopd": "^1.2.0", + "has-proto": "^1.2.0", + "is-typed-array": "^1.1.15", + "reflect.getprototypeof": "^1.0.9" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-length": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.7.tgz", + "integrity": "sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "is-typed-array": "^1.1.13", + "possible-typed-array-names": "^1.0.0", + "reflect.getprototypeof": "^1.0.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==", + "dev": true, + "license": "MIT" + }, "node_modules/uc.micro": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-2.1.0.tgz", @@ -2266,6 +5412,25 @@ "dev": true, "license": "MIT" }, + "node_modules/unbox-primitive": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.1.0.tgz", + "integrity": "sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "has-bigints": "^1.0.2", + "has-symbols": "^1.1.0", + "which-boxed-primitive": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/underscore": { "version": "1.13.7", "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.13.7.tgz", @@ -2283,6 +5448,23 @@ "punycode": "^2.1.0" } }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "dev": true, + "license": "MIT" + }, + "node_modules/version-guard": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/version-guard/-/version-guard-1.1.3.tgz", + "integrity": "sha512-JwPr6erhX53EWH/HCSzfy1tTFrtPXUe927wdM1jqBBeYp1OM+qPHjWbsvv6pIBduqdgxxS+ScfG7S28pzyr2DQ==", + "dev": true, + "license": "0BSD", + "engines": { + "node": ">=0.10.48" + } + }, "node_modules/vite": { "version": "6.3.5", "resolved": "https://registry.npmjs.org/vite/-/vite-6.3.5.tgz", @@ -2374,6 +5556,95 @@ "node": ">= 8" } }, + "node_modules/which-boxed-primitive": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.1.1.tgz", + "integrity": "sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-bigint": "^1.1.0", + "is-boolean-object": "^1.2.1", + "is-number-object": "^1.1.1", + "is-string": "^1.1.1", + "is-symbol": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-builtin-type": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.2.1.tgz", + "integrity": "sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "function.prototype.name": "^1.1.6", + "has-tostringtag": "^1.0.2", + "is-async-function": "^2.0.0", + "is-date-object": "^1.1.0", + "is-finalizationregistry": "^1.1.0", + "is-generator-function": "^1.0.10", + "is-regex": "^1.2.1", + "is-weakref": "^1.0.2", + "isarray": "^2.0.5", + "which-boxed-primitive": "^1.1.0", + "which-collection": "^1.0.2", + "which-typed-array": "^1.1.16" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-collection": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.2.tgz", + "integrity": "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-map": "^2.0.3", + "is-set": "^2.0.3", + "is-weakmap": "^2.0.2", + "is-weakset": "^2.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-typed-array": { + "version": "1.1.19", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.19.tgz", + "integrity": "sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw==", + "dev": true, + "license": "MIT", + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "for-each": "^0.3.5", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/word-wrap": { "version": "1.2.5", "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", @@ -2384,6 +5655,23 @@ "node": ">=0.10.0" } }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/xdg-basedir": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-4.0.0.tgz", + "integrity": "sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/xmlcreate": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/xmlcreate/-/xmlcreate-2.0.4.tgz", @@ -2391,6 +5679,13 @@ "dev": true, "license": "Apache-2.0" }, + "node_modules/yallist": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", + "integrity": "sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==", + "dev": true, + "license": "ISC" + }, "node_modules/yocto-queue": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", diff --git a/package.json b/package.json index cbff68f..caab341 100644 --- a/package.json +++ b/package.json @@ -1,17 +1,18 @@ { - "name": "owen-animation-system", - "version": "1.0.0", + "name": "@kjanat/owen", + "version": "1.0.1", "description": "A comprehensive Three.js animation system for character state management with clean architecture principles", "main": "src/index.js", "types": "src/index.d.ts", "type": "module", "scripts": { - "dev": "vite", + "dev": "vite --host", "build": "vite build", "preview": "vite preview", - "lint": "eslint src --ext .js", - "lint:fix": "eslint src --ext .js --fix", - "docs": "jsdoc -c jsdoc.config.json" + "lint": "standard", + "lint:fix": "standard --fix", + "docs": "jsdoc -c jsdoc.config.json", + "format": "npx prettier --ignore-path --write '**/*.{html,css}' 'docs/**/*.{html,css}'" }, "keywords": [ "three.js", @@ -21,17 +22,29 @@ "gltf", "3d" ], - "author": "Owen Animation System", + "author": "Kaj \"@kjanat\" Kowalski", "license": "AGPL-3.0-only OR LicenseRef-Commercial", "dependencies": { "three": "^0.176.0" }, "devDependencies": { - "vite": "^6.3.5", - "eslint": "^9.27.0", - "jsdoc": "^4.0.2" + "jsdoc": "^4.0.2", + "pre-commit": "^1.2.2", + "standard": "*", + "vite": "^6.3.5" }, "engines": { "node": ">=16.0.0" - } + }, + "standard": { + "globals": [ + "requestAnimationFrame" + ] + }, + "pre-commit": [ + "lint:fix", + "lint", + "docs", + "format" + ] } diff --git a/src/animation/AnimationClip.js b/src/animation/AnimationClip.js index 1e40a02..966b97d 100644 --- a/src/animation/AnimationClip.js +++ b/src/animation/AnimationClip.js @@ -3,8 +3,8 @@ * @module animation */ -import * as THREE from 'three'; -import { ClipTypes, Config } from '../constants.js'; +import * as THREE from 'three' +import { ClipTypes, Config } from '../constants.js' /** * Represents a single animation clip with metadata and Three.js action @@ -17,36 +17,36 @@ export class AnimationClip { * @param {THREE.AnimationClip} threeAnimation - The Three.js animation clip * @param {Object} metadata - Parsed metadata from animation name */ - constructor(name, threeAnimation, metadata) { + constructor (name, threeAnimation, metadata) { /** * The name of the animation clip * @type {string} */ - this.name = name; + this.name = name /** * The Three.js animation clip * @type {THREE.AnimationClip} */ - this.animation = threeAnimation; + this.animation = threeAnimation /** * Parsed metadata about the animation * @type {Object} */ - this.metadata = metadata; + this.metadata = metadata /** * The Three.js animation action * @type {THREE.AnimationAction|null} */ - this.action = null; + this.action = null /** * The animation mixer * @type {THREE.AnimationMixer|null} */ - this.mixer = null; + this.mixer = null } /** @@ -54,22 +54,22 @@ export class AnimationClip { * @param {THREE.AnimationMixer} mixer - The animation mixer * @returns {THREE.AnimationAction} The created action */ - createAction(mixer) { - this.mixer = mixer; - this.action = mixer.clipAction(this.animation); + createAction (mixer) { + this.mixer = mixer + this.action = mixer.clipAction(this.animation) // Configure based on type if ( this.metadata.type === ClipTypes.LOOP || this.metadata.type === ClipTypes.NESTED_LOOP ) { - this.action.setLoop(THREE.LoopRepeat, Infinity); + this.action.setLoop(THREE.LoopRepeat, Infinity) } else { - this.action.setLoop(THREE.LoopOnce); - this.action.clampWhenFinished = true; + this.action.setLoop(THREE.LoopOnce) + this.action.clampWhenFinished = true } - return this.action; + return this.action } /** @@ -77,11 +77,11 @@ export class AnimationClip { * @param {number} [fadeInDuration=0.3] - Fade in duration in seconds * @returns {Promise} Promise that resolves when fade in completes */ - play(fadeInDuration = Config.DEFAULT_FADE_IN) { + play (fadeInDuration = Config.DEFAULT_FADE_IN) { if (this.action) { - this.action.reset(); - this.action.fadeIn(fadeInDuration); - this.action.play(); + this.action.reset() + this.action.fadeIn(fadeInDuration) + this.action.play() } } @@ -90,14 +90,14 @@ export class AnimationClip { * @param {number} [fadeOutDuration=0.3] - Fade out duration in seconds * @returns {Promise} Promise that resolves when fade out completes */ - stop(fadeOutDuration = Config.DEFAULT_FADE_OUT) { + stop (fadeOutDuration = Config.DEFAULT_FADE_OUT) { if (this.action) { - this.action.fadeOut(fadeOutDuration); + this.action.fadeOut(fadeOutDuration) setTimeout(() => { if (this.action) { - this.action.stop(); + this.action.stop() } - }, fadeOutDuration * 1000); + }, fadeOutDuration * 1000) } } @@ -105,8 +105,8 @@ export class AnimationClip { * Check if the animation is currently playing * @returns {boolean} True if playing, false otherwise */ - isPlaying() { - return this.action?.isRunning() || false; + isPlaying () { + return this.action?.isRunning() || false } } @@ -119,18 +119,18 @@ export class AnimationClipFactory { * Create an animation clip factory * @param {AnimationLoader} animationLoader - The animation loader instance */ - constructor(animationLoader) { + constructor (animationLoader) { /** * The animation loader for loading animation data * @type {AnimationLoader} */ - this.animationLoader = animationLoader; + this.animationLoader = animationLoader /** * Cache for created animation clips * @type {Map} */ - this.clipCache = new Map(); + this.clipCache = new Map() } /** @@ -139,67 +139,67 @@ export class AnimationClipFactory { * @param {string} name - The animation name to parse * @returns {Object} Parsed metadata object */ - parseAnimationName(name) { - const parts = name.split('_'); - const state = parts[ 0 ]; - const action = parts[ 1 ]; + parseAnimationName (name) { + const parts = name.split('_') + const state = parts[0] + const action = parts[1] // Handle transitions with emotions - if (parts[ 2 ]?.includes('2') && parts[ 3 ] === ClipTypes.TRANSITION) { - const [ , toState ] = parts[ 2 ].split('2'); + if (parts[2]?.includes('2') && parts[3] === ClipTypes.TRANSITION) { + const [, toState] = parts[2].split('2') return { state, action, toState, - emotion: parts[ 2 ] || '', + emotion: parts[2] || '', type: ClipTypes.TRANSITION, isTransition: true, - hasEmotion: true, - }; + hasEmotion: true + } } // Handle regular transitions - if (parts[ 2 ] === ClipTypes.TRANSITION) { + if (parts[2] === ClipTypes.TRANSITION) { return { state, action, type: ClipTypes.TRANSITION, - isTransition: true, - }; + isTransition: true + } } // Handle nested animations - if (parts[ 2 ] === ClipTypes.NESTED_IN || parts[ 2 ] === ClipTypes.NESTED_OUT) { + if (parts[2] === ClipTypes.NESTED_IN || parts[2] === ClipTypes.NESTED_OUT) { return { state, action, - type: parts[ 2 ], - nestedType: parts[ 3 ], - isNested: true, - }; + type: parts[2], + nestedType: parts[3], + isNested: true + } } // Handle nested loops and quirks if ( - parts[ 3 ] === ClipTypes.NESTED_LOOP || - parts[ 3 ] === ClipTypes.NESTED_QUIRK + parts[3] === ClipTypes.NESTED_LOOP || + parts[3] === ClipTypes.NESTED_QUIRK ) { return { state, action, - subAction: parts[ 2 ], - type: parts[ 3 ], - isNested: true, - }; + subAction: parts[2], + type: parts[3], + isNested: true + } } // Handle standard loops and quirks return { state, action, - type: parts[ 2 ], - isStandard: true, - }; + type: parts[2], + isStandard: true + } } /** @@ -207,18 +207,18 @@ export class AnimationClipFactory { * @param {string} name - The animation name * @returns {Promise} The created animation clip */ - async createClip(name) { + async createClip (name) { if (this.clipCache.has(name)) { - return this.clipCache.get(name); + return this.clipCache.get(name) } - const metadata = this.parseAnimationName(name); - const animation = await this.animationLoader.loadAnimation(name); + const metadata = this.parseAnimationName(name) + const animation = await this.animationLoader.loadAnimation(name) - const clip = new AnimationClip(name, animation, metadata); - this.clipCache.set(name, clip); + const clip = new AnimationClip(name, animation, metadata) + this.clipCache.set(name, clip) - return clip; + return clip } /** @@ -226,24 +226,24 @@ export class AnimationClipFactory { * @param {THREE.Object3D} model - The 3D model containing animations * @returns {Promise>} Map of animation name to clip */ - async createClipsFromModel(model) { - const clips = new Map(); - const animations = model.animations || []; + async createClipsFromModel (model) { + const clips = new Map() + const animations = model.animations || [] for (const animation of animations) { - const clip = await this.createClip(animation.name, model); - clips.set(animation.name, clip); + const clip = await this.createClip(animation.name, model) + clips.set(animation.name, clip) } - return clips; + return clips } /** * Clear the clip cache * @returns {void} */ - clearCache() { - this.clipCache.clear(); + clearCache () { + this.clipCache.clear() } /** @@ -251,7 +251,7 @@ export class AnimationClipFactory { * @param {string} name - The animation name * @returns {AnimationClip|undefined} The cached clip or undefined */ - getCachedClip(name) { - return this.clipCache.get(name); + getCachedClip (name) { + return this.clipCache.get(name) } } diff --git a/src/constants.js b/src/constants.js index 4941583..d755cb6 100644 --- a/src/constants.js +++ b/src/constants.js @@ -9,21 +9,21 @@ * @enum {string} */ export const ClipTypes = { - /** Loop animation */ - LOOP: 'L', - /** Quirk animation */ - QUIRK: 'Q', - /** Nested loop animation */ - NESTED_LOOP: 'NL', - /** Nested quirk animation */ - NESTED_QUIRK: 'NQ', - /** Nested in transition */ - NESTED_IN: 'IN_NT', - /** Nested out transition */ - NESTED_OUT: 'OUT_NT', - /** Transition animation */ - TRANSITION: 'T', -}; + /** Loop animation */ + LOOP: 'L', + /** Quirk animation */ + QUIRK: 'Q', + /** Nested loop animation */ + NESTED_LOOP: 'NL', + /** Nested quirk animation */ + NESTED_QUIRK: 'NQ', + /** Nested in transition */ + NESTED_IN: 'IN_NT', + /** Nested out transition */ + NESTED_OUT: 'OUT_NT', + /** Transition animation */ + TRANSITION: 'T' +} /** * Character animation states @@ -31,15 +31,15 @@ export const ClipTypes = { * @enum {string} */ export const States = { - /** Waiting/idle state */ - WAIT: 'wait', - /** Reacting to input state */ - REACT: 'react', - /** Typing response state */ - TYPE: 'type', - /** Sleep/inactive state */ - SLEEP: 'sleep', -}; + /** Waiting/idle state */ + WAIT: 'wait', + /** Reacting to input state */ + REACT: 'react', + /** Typing response state */ + TYPE: 'type', + /** Sleep/inactive state */ + SLEEP: 'sleep' +} /** * Character emotional states @@ -47,17 +47,17 @@ export const States = { * @enum {string} */ export const Emotions = { - /** Neutral emotion */ - NEUTRAL: '', - /** Angry emotion */ - ANGRY: 'an', - /** Shocked emotion */ - SHOCKED: 'sh', - /** Happy emotion */ - HAPPY: 'ha', - /** Sad emotion */ - SAD: 'sa', -}; + /** Neutral emotion */ + NEUTRAL: '', + /** Angry emotion */ + ANGRY: 'an', + /** Shocked emotion */ + SHOCKED: 'sh', + /** Happy emotion */ + HAPPY: 'ha', + /** Sad emotion */ + SAD: 'sa' +} /** * Default configuration values @@ -65,14 +65,14 @@ export const Emotions = { * @type {Object} */ export const Config = { - /** Default fade in duration for animations (ms) */ - DEFAULT_FADE_IN: 0.3, - /** Default fade out duration for animations (ms) */ - DEFAULT_FADE_OUT: 0.3, - /** Default quirk interval (ms) */ - QUIRK_INTERVAL: 5000, - /** Default inactivity timeout (ms) */ - INACTIVITY_TIMEOUT: 60000, - /** Quirk probability threshold */ - QUIRK_PROBABILITY: 0.3, -}; + /** Default fade in duration for animations (ms) */ + DEFAULT_FADE_IN: 0.3, + /** Default fade out duration for animations (ms) */ + DEFAULT_FADE_OUT: 0.3, + /** Default quirk interval (ms) */ + QUIRK_INTERVAL: 5000, + /** Default inactivity timeout (ms) */ + INACTIVITY_TIMEOUT: 60000, + /** Quirk probability threshold */ + QUIRK_PROBABILITY: 0.3 +} diff --git a/src/core/OwenAnimationContext.js b/src/core/OwenAnimationContext.js index 69dc25f..2e777ca 100644 --- a/src/core/OwenAnimationContext.js +++ b/src/core/OwenAnimationContext.js @@ -3,7 +3,7 @@ * @module core */ -import { States, Emotions, Config } from '../constants.js'; +import { States, Emotions, Config } from '../constants.js' /** * Main controller for the Owen animation system @@ -18,97 +18,97 @@ export class OwenAnimationContext { * @param {AnimationClipFactory} animationClipFactory - Factory for creating clips * @param {StateFactory} stateFactory - Factory for creating state handlers */ - constructor(model, mixer, animationClipFactory, stateFactory) { + constructor (model, mixer, animationClipFactory, stateFactory) { /** * The 3D character model * @type {THREE.Object3D} */ - this.model = model; + this.model = model /** * The Three.js animation mixer * @type {THREE.AnimationMixer} */ - this.mixer = mixer; + this.mixer = mixer /** * Factory for creating animation clips * @type {AnimationClipFactory} */ - this.animationClipFactory = animationClipFactory; + this.animationClipFactory = animationClipFactory /** * Factory for creating state handlers * @type {StateFactory} */ - this.stateFactory = stateFactory; + this.stateFactory = stateFactory /** * Map of animation clips by name * @type {Map} */ - this.clips = new Map(); + this.clips = new Map() /** * Map of state handlers by name * @type {Map} */ - this.states = new Map(); + this.states = new Map() /** * Current active state * @type {string} */ - this.currentState = States.WAIT; + this.currentState = States.WAIT /** * Current active state handler * @type {StateHandler|null} */ - this.currentStateHandler = null; + this.currentStateHandler = null /** * Timer for inactivity detection * @type {number} */ - this.inactivityTimer = 0; + this.inactivityTimer = 0 /** * Inactivity timeout in milliseconds * @type {number} */ - this.inactivityTimeout = Config.INACTIVITY_TIMEOUT; + this.inactivityTimeout = Config.INACTIVITY_TIMEOUT /** * Whether the system is initialized * @type {boolean} */ - this.initialized = false; + this.initialized = false } /** * Initialize the animation system * @returns {Promise} */ - async initialize() { - if (this.initialized) return; + async initialize () { + if (this.initialized) return // Create animation clips from model - this.clips = await this.animationClipFactory.createClipsFromModel(this.model); + this.clips = await this.animationClipFactory.createClipsFromModel(this.model) // Create actions for all clips - for (const [ , clip ] of this.clips) { - clip.createAction(this.mixer); + for (const [, clip] of this.clips) { + clip.createAction(this.mixer) } // Initialize state handlers - this.initializeStates(); + this.initializeStates() // Start in wait state - await this.transitionTo(States.WAIT); + await this.transitionTo(States.WAIT) - this.initialized = true; - console.log('Owen Animation System initialized'); + this.initialized = true + console.log('Owen Animation System initialized') } /** @@ -116,12 +116,12 @@ export class OwenAnimationContext { * @private * @returns {void} */ - initializeStates() { - const stateNames = this.stateFactory.getAvailableStates(); + initializeStates () { + const stateNames = this.stateFactory.getAvailableStates() for (const stateName of stateNames) { - const handler = this.stateFactory.createStateHandler(stateName, this); - this.states.set(stateName, handler); + const handler = this.stateFactory.createStateHandler(stateName, this) + this.states.set(stateName, handler) } } @@ -132,28 +132,28 @@ export class OwenAnimationContext { * @returns {Promise} * @throws {Error} If state is not found or transition is invalid */ - async transitionTo(newStateName, emotion = Emotions.NEUTRAL) { + async transitionTo (newStateName, emotion = Emotions.NEUTRAL) { if (!this.states.has(newStateName)) { - throw new Error(`State '${newStateName}' not found`); + throw new Error(`State '${newStateName}' not found`) } - const oldState = this.currentState; - const newStateHandler = this.states.get(newStateName); + const oldState = this.currentState + const newStateHandler = this.states.get(newStateName) - console.log(`Transitioning from ${oldState} to ${newStateName}`); + console.log(`Transitioning from ${oldState} to ${newStateName}`) // Exit current state if (this.currentStateHandler) { - await this.currentStateHandler.exit(newStateName, emotion); + await this.currentStateHandler.exit(newStateName, emotion) } // Enter new state - this.currentState = newStateName; - this.currentStateHandler = newStateHandler; - await this.currentStateHandler.enter(oldState, emotion); + this.currentState = newStateName + this.currentStateHandler = newStateHandler + await this.currentStateHandler.enter(oldState, emotion) // Reset inactivity timer - this.resetActivityTimer(); + this.resetActivityTimer() } /** @@ -161,26 +161,26 @@ export class OwenAnimationContext { * @param {string} message - The user message * @returns {Promise} */ - async handleUserMessage(message) { - console.log(`Handling user message: "${message}"`); + async handleUserMessage (message) { + console.log(`Handling user message: "${message}"`) - this.onUserActivity(); + this.onUserActivity() // If sleeping, wake up first if (this.currentState === States.SLEEP) { - await this.transitionTo(States.REACT); + await this.transitionTo(States.REACT) } // Let current state handle the message if (this.currentStateHandler) { - await this.currentStateHandler.handleMessage(message); + await this.currentStateHandler.handleMessage(message) } // Transition to appropriate next state based on current state if (this.currentState === States.WAIT) { - await this.transitionTo(States.REACT); + await this.transitionTo(States.REACT) } else if (this.currentState === States.REACT) { - await this.transitionTo(States.TYPE); + await this.transitionTo(States.TYPE) } } @@ -188,12 +188,12 @@ export class OwenAnimationContext { * Called when user activity is detected * @returns {void} */ - onUserActivity() { - this.resetActivityTimer(); + onUserActivity () { + this.resetActivityTimer() // Wake up if sleeping if (this.currentState === States.SLEEP) { - this.transitionTo(States.WAIT); + this.transitionTo(States.WAIT) } } @@ -202,8 +202,8 @@ export class OwenAnimationContext { * @private * @returns {void} */ - resetActivityTimer() { - this.inactivityTimer = 0; + resetActivityTimer () { + this.inactivityTimer = 0 } /** @@ -211,9 +211,9 @@ export class OwenAnimationContext { * @private * @returns {Promise} */ - async handleInactivity() { - console.log('Inactivity detected, transitioning to sleep'); - await this.transitionTo(States.SLEEP); + async handleInactivity () { + console.log('Inactivity detected, transitioning to sleep') + await this.transitionTo(States.SLEEP) } /** @@ -221,21 +221,21 @@ export class OwenAnimationContext { * @param {number} deltaTime - Time elapsed since last update (ms) * @returns {void} */ - update(deltaTime) { - if (!this.initialized) return; + update (deltaTime) { + if (!this.initialized) return // Update Three.js mixer - this.mixer.update(deltaTime / 1000); // Convert to seconds + this.mixer.update(deltaTime / 1000) // Convert to seconds // Update current state if (this.currentStateHandler) { - this.currentStateHandler.update(deltaTime); + this.currentStateHandler.update(deltaTime) } // Update inactivity timer - this.inactivityTimer += deltaTime; + this.inactivityTimer += deltaTime if (this.inactivityTimer > this.inactivityTimeout && this.currentState !== States.SLEEP) { - this.handleInactivity(); + this.handleInactivity() } } @@ -244,8 +244,8 @@ export class OwenAnimationContext { * @param {string} name - The animation clip name * @returns {AnimationClip|undefined} The animation clip or undefined if not found */ - getClip(name) { - return this.clips.get(name); + getClip (name) { + return this.clips.get(name) } /** @@ -253,80 +253,80 @@ export class OwenAnimationContext { * @param {string} pattern - Pattern to match (supports * wildcards) * @returns {AnimationClip[]} Array of matching clips */ - getClipsByPattern(pattern) { - const regex = new RegExp(pattern.replace(/\*/g, '.*')); - const matches = []; + getClipsByPattern (pattern) { + const regex = new RegExp(pattern.replace(/\*/g, '.*')) + const matches = [] - for (const [ name, clip ] of this.clips) { + for (const [name, clip] of this.clips) { if (regex.test(name)) { - matches.push(clip); + matches.push(clip) } } - return matches; + return matches } /** * Get the current state name * @returns {string} The current state name */ - getCurrentState() { - return this.currentState; + getCurrentState () { + return this.currentState } /** * Get the current state handler * @returns {StateHandler|null} The current state handler */ - getCurrentStateHandler() { - return this.currentStateHandler; + getCurrentStateHandler () { + return this.currentStateHandler } /** * Get available transitions from current state * @returns {string[]} Array of available state transitions */ - getAvailableTransitions() { + getAvailableTransitions () { if (this.currentStateHandler) { - return this.currentStateHandler.getAvailableTransitions(); + return this.currentStateHandler.getAvailableTransitions() } - return []; + return [] } /** * Get all available animation clip names * @returns {string[]} Array of clip names */ - getAvailableClips() { - return Array.from(this.clips.keys()); + getAvailableClips () { + return Array.from(this.clips.keys()) } /** * Get all available state names * @returns {string[]} Array of state names */ - getAvailableStates() { - return Array.from(this.states.keys()); + getAvailableStates () { + return Array.from(this.states.keys()) } /** * Dispose of the animation system and clean up resources * @returns {void} */ - dispose() { + dispose () { // Stop all animations - for (const [ , clip ] of this.clips) { + for (const [, clip] of this.clips) { if (clip.action) { - clip.action.stop(); + clip.action.stop() } } // Clear caches - this.clips.clear(); - this.states.clear(); - this.animationClipFactory.clearCache(); + this.clips.clear() + this.states.clear() + this.animationClipFactory.clearCache() - this.initialized = false; - console.log('Owen Animation System disposed'); + this.initialized = false + console.log('Owen Animation System disposed') } } diff --git a/src/factories/OwenSystemFactory.js b/src/factories/OwenSystemFactory.js index 3997e98..4e19065 100644 --- a/src/factories/OwenSystemFactory.js +++ b/src/factories/OwenSystemFactory.js @@ -3,18 +3,18 @@ * @module factories */ -import * as THREE from 'three'; -import { OwenAnimationContext } from '../core/OwenAnimationContext.js'; -import { AnimationClipFactory } from '../animation/AnimationClip.js'; -import { GLTFAnimationLoader } from '../loaders/AnimationLoader.js'; -import { StateFactory } from '../states/StateFactory.js'; +import * as THREE from 'three' +import { OwenAnimationContext } from '../core/OwenAnimationContext.js' +import { AnimationClipFactory } from '../animation/AnimationClip.js' +import { GLTFAnimationLoader } from '../loaders/AnimationLoader.js' +import { StateFactory } from '../states/StateFactory.js' /** * Main factory for creating the complete Owen animation system * @class */ export class OwenSystemFactory { - /** + /** * Create a complete Owen animation system * @param {THREE.Object3D} gltfModel - The loaded GLTF model * @param {THREE.Scene} scene - The Three.js scene @@ -22,70 +22,70 @@ export class OwenSystemFactory { * @param {THREE.GLTFLoader} [options.gltfLoader] - Custom GLTF loader * @returns {Promise} The configured Owen system */ - static async createOwenSystem(gltfModel, scene, options = {}) { - // Create Three.js animation mixer - const mixer = new THREE.AnimationMixer(gltfModel); + static async createOwenSystem (gltfModel, scene, options = {}) { + // Create Three.js animation mixer + const mixer = new THREE.AnimationMixer(gltfModel) - // Create GLTF loader if not provided - const gltfLoader = options.gltfLoader || new THREE.GLTFLoader(); + // Create GLTF loader if not provided + const gltfLoader = options.gltfLoader || new THREE.GLTFLoader() - // Create animation loader - const animationLoader = new GLTFAnimationLoader(gltfLoader); + // Create animation loader + const animationLoader = new GLTFAnimationLoader(gltfLoader) - // Preload animations from the model - await animationLoader.preloadAnimations(gltfModel); + // Preload animations from the model + await animationLoader.preloadAnimations(gltfModel) - // Create animation clip factory - const animationClipFactory = new AnimationClipFactory(animationLoader); + // Create animation clip factory + const animationClipFactory = new AnimationClipFactory(animationLoader) - // Create state factory - const stateFactory = new StateFactory(); + // Create state factory + const stateFactory = new StateFactory() - // Create the main Owen context - const owenContext = new OwenAnimationContext( - gltfModel, - mixer, - animationClipFactory, - stateFactory - ); + // Create the main Owen context + const owenContext = new OwenAnimationContext( + gltfModel, + mixer, + animationClipFactory, + stateFactory + ) - // Initialize the system - await owenContext.initialize(); + // Initialize the system + await owenContext.initialize() - return owenContext; - } + return owenContext + } - /** + /** * Create a basic Owen system with minimal configuration * @param {THREE.Object3D} model - The 3D model * @returns {Promise} The configured Owen system */ - static async createBasicOwenSystem(model) { - const scene = new THREE.Scene(); - scene.add(model); + static async createBasicOwenSystem (model) { + const scene = new THREE.Scene() + scene.add(model) - return await OwenSystemFactory.createOwenSystem(model, scene); - } + return await OwenSystemFactory.createOwenSystem(model, scene) + } - /** + /** * Create an Owen system with custom state handlers * @param {THREE.Object3D} gltfModel - The loaded GLTF model * @param {THREE.Scene} scene - The Three.js scene * @param {Map} customStates - Map of state name to handler class * @returns {Promise} The configured Owen system */ - static async createCustomOwenSystem(gltfModel, scene, customStates) { - const system = await OwenSystemFactory.createOwenSystem(gltfModel, scene); + static async createCustomOwenSystem (gltfModel, scene, customStates) { + const system = await OwenSystemFactory.createOwenSystem(gltfModel, scene) - // Register custom state handlers - const stateFactory = system.stateFactory; - for (const [ stateName, handlerClass ] of customStates) { - stateFactory.registerStateHandler(stateName, handlerClass); - } - - // Reinitialize with custom states - system.initializeStates(); - - return system; + // Register custom state handlers + const stateFactory = system.stateFactory + for (const [stateName, handlerClass] of customStates) { + stateFactory.registerStateHandler(stateName, handlerClass) } + + // Reinitialize with custom states + system.initializeStates() + + return system + } } diff --git a/src/index.js b/src/index.js index 7225075..83ffcb8 100644 --- a/src/index.js +++ b/src/index.js @@ -4,32 +4,32 @@ */ // Core exports -export { OwenAnimationContext } from './core/OwenAnimationContext.js'; +// Import for default export +import { OwenSystemFactory } from './factories/OwenSystemFactory.js' +import { OwenAnimationContext } from './core/OwenAnimationContext.js' +import { States, Emotions, ClipTypes, Config } from './constants.js' + +export { OwenAnimationContext } from './core/OwenAnimationContext.js' // Animation system exports -export { AnimationClip, AnimationClipFactory } from './animation/AnimationClip.js'; +export { AnimationClip, AnimationClipFactory } from './animation/AnimationClip.js' // Loader exports -export { AnimationLoader, GLTFAnimationLoader } from './loaders/AnimationLoader.js'; +export { AnimationLoader, GLTFAnimationLoader } from './loaders/AnimationLoader.js' // State system exports -export { StateHandler } from './states/StateHandler.js'; -export { WaitStateHandler } from './states/WaitStateHandler.js'; -export { ReactStateHandler } from './states/ReactStateHandler.js'; -export { TypeStateHandler } from './states/TypeStateHandler.js'; -export { SleepStateHandler } from './states/SleepStateHandler.js'; -export { StateFactory } from './states/StateFactory.js'; +export { StateHandler } from './states/StateHandler.js' +export { WaitStateHandler } from './states/WaitStateHandler.js' +export { ReactStateHandler } from './states/ReactStateHandler.js' +export { TypeStateHandler } from './states/TypeStateHandler.js' +export { SleepStateHandler } from './states/SleepStateHandler.js' +export { StateFactory } from './states/StateFactory.js' // Factory exports -export { OwenSystemFactory } from './factories/OwenSystemFactory.js'; +export { OwenSystemFactory } from './factories/OwenSystemFactory.js' // Constants exports -export { ClipTypes, States, Emotions, Config } from './constants.js'; - -// Import for default export -import { OwenSystemFactory } from './factories/OwenSystemFactory.js'; -import { OwenAnimationContext } from './core/OwenAnimationContext.js'; -import { States, Emotions, ClipTypes, Config } from './constants.js'; +export { ClipTypes, States, Emotions, Config } from './constants.js' /** * Default export - the main factory for easy usage @@ -41,4 +41,4 @@ export default { Emotions, ClipTypes, Config -}; +} diff --git a/src/loaders/AnimationLoader.js b/src/loaders/AnimationLoader.js index 98059b2..a74f66a 100644 --- a/src/loaders/AnimationLoader.js +++ b/src/loaders/AnimationLoader.js @@ -9,16 +9,16 @@ * @class */ export class AnimationLoader { - /** + /** * Load an animation by name * @abstract * @param {string} _name - The animation name to load (unused in base class) * @returns {Promise} The loaded animation clip * @throws {Error} Must be implemented by subclasses */ - async loadAnimation(_name) { - throw new Error('loadAnimation method must be implemented by subclasses'); - } + async loadAnimation (_name) { + throw new Error('loadAnimation method must be implemented by subclasses') + } } /** @@ -27,68 +27,68 @@ export class AnimationLoader { * @extends AnimationLoader */ export class GLTFAnimationLoader extends AnimationLoader { - /** + /** * Create a GLTF animation loader * @param {THREE.GLTFLoader} gltfLoader - The Three.js GLTF loader instance */ - constructor(gltfLoader) { - super(); + constructor (gltfLoader) { + super() - /** + /** * The Three.js GLTF loader * @type {THREE.GLTFLoader} */ - this.gltfLoader = gltfLoader; + this.gltfLoader = gltfLoader - /** + /** * Cache for loaded animations * @type {Map} */ - this.animationCache = new Map(); - } + this.animationCache = new Map() + } - /** + /** * Load an animation from GLTF by name * @param {string} name - The animation name to load * @returns {Promise} The loaded animation clip * @throws {Error} If animation is not found */ - async loadAnimation(name) { - if (this.animationCache.has(name)) { - return this.animationCache.get(name); - } - - // In a real implementation, this would load from GLTF files - // For now, we'll assume animations are already loaded in the model - throw new Error(`Animation '${name}' not found. Implement GLTF loading logic.`); + async loadAnimation (name) { + if (this.animationCache.has(name)) { + return this.animationCache.get(name) } - /** + // In a real implementation, this would load from GLTF files + // For now, we'll assume animations are already loaded in the model + throw new Error(`Animation '${name}' not found. Implement GLTF loading logic.`) + } + + /** * Preload animations from a GLTF model * @param {Object} gltfModel - The loaded GLTF model * @returns {Promise} */ - async preloadAnimations(gltfModel) { - if (gltfModel.animations) { - for (const animation of gltfModel.animations) { - this.animationCache.set(animation.name, animation); - } - } + async preloadAnimations (gltfModel) { + if (gltfModel.animations) { + for (const animation of gltfModel.animations) { + this.animationCache.set(animation.name, animation) + } } + } - /** + /** * Clear the animation cache * @returns {void} */ - clearCache() { - this.animationCache.clear(); - } + clearCache () { + this.animationCache.clear() + } - /** + /** * Get all cached animation names * @returns {string[]} Array of cached animation names */ - getCachedAnimationNames() { - return Array.from(this.animationCache.keys()); - } + getCachedAnimationNames () { + return Array.from(this.animationCache.keys()) + } } diff --git a/src/states/ReactStateHandler.js b/src/states/ReactStateHandler.js index 49a5dbe..33f8a10 100644 --- a/src/states/ReactStateHandler.js +++ b/src/states/ReactStateHandler.js @@ -3,8 +3,8 @@ * @module states */ -import { StateHandler } from './StateHandler.js'; -import { States, Emotions } from '../constants.js'; +import { StateHandler } from './StateHandler.js' +import { States, Emotions } from '../constants.js' /** * Handler for the React state @@ -12,148 +12,148 @@ import { States, Emotions } from '../constants.js'; * @extends StateHandler */ export class ReactStateHandler extends StateHandler { - /** + /** * Create a react state handler * @param {OwenAnimationContext} context - The animation context */ - constructor(context) { - super(States.REACT, context); + constructor (context) { + super(States.REACT, context) - /** + /** * Current emotional state * @type {string} */ - this.emotion = Emotions.NEUTRAL; - } + this.emotion = Emotions.NEUTRAL + } - /** + /** * Enter the react state * @param {string|null} [_fromState=null] - The previous state (unused) * @param {string} [emotion=Emotions.NEUTRAL] - The emotion to enter with * @returns {Promise} */ - async enter(_fromState = null, emotion = Emotions.NEUTRAL) { - console.log(`Entering REACT state with emotion: ${emotion}`); - this.emotion = emotion; + async enter (_fromState = null, emotion = Emotions.NEUTRAL) { + console.log(`Entering REACT state with emotion: ${emotion}`) + this.emotion = emotion - // Play appropriate reaction - const reactionClip = this.context.getClip('react_idle_L'); - if (reactionClip) { - await reactionClip.play(); - this.currentClip = reactionClip; - } + // Play appropriate reaction + const reactionClip = this.context.getClip('react_idle_L') + if (reactionClip) { + await reactionClip.play() + this.currentClip = reactionClip } + } - /** + /** * Exit the react state * @param {string|null} [toState=null] - The next state * @param {string} [emotion=Emotions.NEUTRAL] - The emotion to exit with * @returns {Promise} */ - async exit(toState = null, emotion = Emotions.NEUTRAL) { - console.log(`Exiting REACT state to ${toState} with emotion: ${emotion}`); + async exit (toState = null, emotion = Emotions.NEUTRAL) { + console.log(`Exiting REACT state to ${toState} with emotion: ${emotion}`) - if (this.currentClip) { - await this.stopCurrentClip(); - } - - // Play emotional transition if available - let transitionName; - if (emotion !== Emotions.NEUTRAL) { - transitionName = `react_${this.emotion}2${toState}_${emotion}_T`; - } else { - transitionName = `react_2${toState}_T`; - } - - const transition = this.context.getClip(transitionName); - if (transition) { - await transition.play(); - await this.waitForClipEnd(transition); - } + if (this.currentClip) { + await this.stopCurrentClip() } - /** + // Play emotional transition if available + let transitionName + if (emotion !== Emotions.NEUTRAL) { + transitionName = `react_${this.emotion}2${toState}_${emotion}_T` + } else { + transitionName = `react_2${toState}_T` + } + + const transition = this.context.getClip(transitionName) + if (transition) { + await transition.play() + await this.waitForClipEnd(transition) + } + } + + /** * Handle a user message in react state * @param {string} message - The user message * @returns {Promise} */ - async handleMessage(message) { - // Analyze message sentiment to determine emotion - const emotion = this.analyzeMessageEmotion(message); - this.emotion = emotion; + async handleMessage (message) { + // Analyze message sentiment to determine emotion + const emotion = this.analyzeMessageEmotion(message) + this.emotion = emotion - // Play emotional reaction if needed - if (emotion !== Emotions.NEUTRAL) { - const emotionalReaction = this.context.getClip(`react_${emotion}_Q`); - if (emotionalReaction) { - if (this.currentClip) { - await this.stopCurrentClip(0.2); - } - await emotionalReaction.play(); - await this.waitForClipEnd(emotionalReaction); - } + // Play emotional reaction if needed + if (emotion !== Emotions.NEUTRAL) { + const emotionalReaction = this.context.getClip(`react_${emotion}_Q`) + if (emotionalReaction) { + if (this.currentClip) { + await this.stopCurrentClip(0.2) } + await emotionalReaction.play() + await this.waitForClipEnd(emotionalReaction) + } } + } - /** + /** * Analyze message to determine emotional response * @private * @param {string} message - The message to analyze * @returns {string} The determined emotion */ - analyzeMessageEmotion(message) { - const text = message.toLowerCase(); + analyzeMessageEmotion (message) { + const text = message.toLowerCase() - // Check for urgent/angry indicators - if ( - text.includes('!') || + // Check for urgent/angry indicators + if ( + text.includes('!') || text.includes('urgent') || text.includes('asap') || text.includes('hurry') - ) { - return Emotions.ANGRY; - } + ) { + return Emotions.ANGRY + } - // Check for error/shocked indicators - if ( - text.includes('error') || + // Check for error/shocked indicators + if ( + text.includes('error') || text.includes('problem') || text.includes('issue') || text.includes('bug') || text.includes('broken') - ) { - return Emotions.SHOCKED; - } + ) { + return Emotions.SHOCKED + } - // Check for positive/happy indicators - if ( - text.includes('great') || + // Check for positive/happy indicators + if ( + text.includes('great') || text.includes('awesome') || text.includes('good') || text.includes('excellent') || text.includes('perfect') - ) { - return Emotions.HAPPY; - } + ) { + return Emotions.HAPPY + } - // Check for sad indicators - if ( - text.includes('sad') || + // Check for sad indicators + if ( + text.includes('sad') || text.includes('disappointed') || text.includes('failed') || text.includes('wrong') - ) { - return Emotions.SAD; - } - - return Emotions.NEUTRAL; + ) { + return Emotions.SAD } - /** + return Emotions.NEUTRAL + } + + /** * Get available transitions from react state * @returns {string[]} Array of available state transitions */ - getAvailableTransitions() { - return [ States.TYPE, States.WAIT ]; - } + getAvailableTransitions () { + return [States.TYPE, States.WAIT] + } } diff --git a/src/states/SleepStateHandler.js b/src/states/SleepStateHandler.js index 559ce9a..680880d 100644 --- a/src/states/SleepStateHandler.js +++ b/src/states/SleepStateHandler.js @@ -3,8 +3,8 @@ * @module states */ -import { StateHandler } from './StateHandler.js'; -import { States, Emotions } from '../constants.js'; +import { StateHandler } from './StateHandler.js' +import { States, Emotions } from '../constants.js' /** * Handler for the Sleep state @@ -16,20 +16,20 @@ export class SleepStateHandler extends StateHandler { * Create a sleep state handler * @param {OwenAnimationContext} context - The animation context */ - constructor(context) { - super(States.SLEEP, context); + constructor (context) { + super(States.SLEEP, context) /** * Sleep animation clip * @type {AnimationClip|null} */ - this.sleepClip = null; + this.sleepClip = null /** * Whether the character is in deep sleep * @type {boolean} */ - this.isDeepSleep = false; + this.isDeepSleep = false } /** @@ -38,24 +38,24 @@ export class SleepStateHandler extends StateHandler { * @param {string} [_emotion=Emotions.NEUTRAL] - The emotion to enter with (unused) * @returns {Promise} */ - async enter(fromState = null, _emotion = Emotions.NEUTRAL) { - console.log(`Entering SLEEP state from ${fromState}`); + async enter (fromState = null, _emotion = Emotions.NEUTRAL) { + console.log(`Entering SLEEP state from ${fromState}`) // Play sleep transition if available - const sleepTransition = this.context.getClip('wait_2sleep_T'); + const sleepTransition = this.context.getClip('wait_2sleep_T') if (sleepTransition) { - await sleepTransition.play(); - await this.waitForClipEnd(sleepTransition); + await sleepTransition.play() + await this.waitForClipEnd(sleepTransition) } // Start sleep loop - this.sleepClip = this.context.getClip('sleep_idle_L'); + this.sleepClip = this.context.getClip('sleep_idle_L') if (this.sleepClip) { - await this.sleepClip.play(); - this.currentClip = this.sleepClip; + await this.sleepClip.play() + this.currentClip = this.sleepClip } - this.isDeepSleep = true; + this.isDeepSleep = true } /** @@ -64,27 +64,27 @@ export class SleepStateHandler extends StateHandler { * @param {string} [emotion=Emotions.NEUTRAL] - The emotion to exit with * @returns {Promise} */ - async exit(toState = null, _emotion = Emotions.NEUTRAL) { - console.log(`Exiting SLEEP state to ${toState}`); - this.isDeepSleep = false; + async exit (toState = null, _emotion = Emotions.NEUTRAL) { + console.log(`Exiting SLEEP state to ${toState}`) + this.isDeepSleep = false if (this.currentClip) { - await this.stopCurrentClip(); + await this.stopCurrentClip() } // Play wake up animation - const wakeUpClip = this.context.getClip('sleep_wakeup_T'); + const wakeUpClip = this.context.getClip('sleep_wakeup_T') if (wakeUpClip) { - await wakeUpClip.play(); - await this.waitForClipEnd(wakeUpClip); + await wakeUpClip.play() + await this.waitForClipEnd(wakeUpClip) } // Play transition to next state if available - const transitionName = `sleep_2${toState}_T`; - const transition = this.context.getClip(transitionName); + const transitionName = `sleep_2${toState}_T` + const transition = this.context.getClip(transitionName) if (transition) { - await transition.play(); - await this.waitForClipEnd(transition); + await transition.play() + await this.waitForClipEnd(transition) } } @@ -93,7 +93,7 @@ export class SleepStateHandler extends StateHandler { * @param {number} _deltaTime - Time elapsed since last update (ms, unused) * @returns {void} */ - update(_deltaTime) { + update (_deltaTime) { // Sleep state doesn't need regular updates // Character remains asleep until external stimulus } @@ -103,12 +103,12 @@ export class SleepStateHandler extends StateHandler { * @param {string} _message - The user message (unused, just triggers wake up) * @returns {Promise} */ - async handleMessage(_message) { + async handleMessage (_message) { // Any message should wake up the character if (this.isDeepSleep) { - console.log('Waking up due to user message'); + console.log('Waking up due to user message') // This will trigger a state transition to REACT - await this.context.transitionTo(States.REACT); + await this.context.transitionTo(States.REACT) } } @@ -116,25 +116,25 @@ export class SleepStateHandler extends StateHandler { * Get available transitions from sleep state * @returns {string[]} Array of available state transitions */ - getAvailableTransitions() { - return [ States.WAIT, States.REACT ]; + getAvailableTransitions () { + return [States.WAIT, States.REACT] } /** * Check if in deep sleep * @returns {boolean} True if in deep sleep, false otherwise */ - isInDeepSleep() { - return this.isDeepSleep; + isInDeepSleep () { + return this.isDeepSleep } /** * Force wake up from sleep * @returns {Promise} */ - async wakeUp() { + async wakeUp () { if (this.isDeepSleep) { - await this.context.transitionTo(States.WAIT); + await this.context.transitionTo(States.WAIT) } } } diff --git a/src/states/StateFactory.js b/src/states/StateFactory.js index 176a01f..4ca4f6b 100644 --- a/src/states/StateFactory.js +++ b/src/states/StateFactory.js @@ -3,11 +3,11 @@ * @module states */ -import { WaitStateHandler } from './WaitStateHandler.js'; -import { ReactStateHandler } from './ReactStateHandler.js'; -import { TypeStateHandler } from './TypeStateHandler.js'; -import { SleepStateHandler } from './SleepStateHandler.js'; -import { States } from '../constants.js'; +import { WaitStateHandler } from './WaitStateHandler.js' +import { ReactStateHandler } from './ReactStateHandler.js' +import { TypeStateHandler } from './TypeStateHandler.js' +import { SleepStateHandler } from './SleepStateHandler.js' +import { States } from '../constants.js' /** * Factory for creating state handlers using dependency injection @@ -17,19 +17,19 @@ export class StateFactory { /** * Create a state factory */ - constructor() { + constructor () { /** * Registry of state handler classes * @type {Map} * @private */ - this.stateHandlers = new Map(); + this.stateHandlers = new Map() // Register default state handlers - this.registerStateHandler(States.WAIT, WaitStateHandler); - this.registerStateHandler(States.REACT, ReactStateHandler); - this.registerStateHandler(States.TYPE, TypeStateHandler); - this.registerStateHandler(States.SLEEP, SleepStateHandler); + this.registerStateHandler(States.WAIT, WaitStateHandler) + this.registerStateHandler(States.REACT, ReactStateHandler) + this.registerStateHandler(States.TYPE, TypeStateHandler) + this.registerStateHandler(States.SLEEP, SleepStateHandler) } /** @@ -38,8 +38,8 @@ export class StateFactory { * @param {Function} handlerClass - The handler class constructor * @returns {void} */ - registerStateHandler(stateName, handlerClass) { - this.stateHandlers.set(stateName, handlerClass); + registerStateHandler (stateName, handlerClass) { + this.stateHandlers.set(stateName, handlerClass) } /** @@ -49,21 +49,21 @@ export class StateFactory { * @returns {StateHandler} The created state handler * @throws {Error} If state handler is not registered */ - createStateHandler(stateName, context) { - const HandlerClass = this.stateHandlers.get(stateName); + createStateHandler (stateName, context) { + const HandlerClass = this.stateHandlers.get(stateName) if (!HandlerClass) { - throw new Error(`No handler registered for state: ${stateName}`); + throw new Error(`No handler registered for state: ${stateName}`) } - return new HandlerClass(context); + return new HandlerClass(context) } /** * Get all available state names * @returns {string[]} Array of registered state names */ - getAvailableStates() { - return Array.from(this.stateHandlers.keys()); + getAvailableStates () { + return Array.from(this.stateHandlers.keys()) } /** @@ -71,8 +71,8 @@ export class StateFactory { * @param {string} stateName - The state name to check * @returns {boolean} True if registered, false otherwise */ - isStateRegistered(stateName) { - return this.stateHandlers.has(stateName); + isStateRegistered (stateName) { + return this.stateHandlers.has(stateName) } /** @@ -80,7 +80,7 @@ export class StateFactory { * @param {string} stateName - The state name to unregister * @returns {boolean} True if removed, false if not found */ - unregisterStateHandler(stateName) { - return this.stateHandlers.delete(stateName); + unregisterStateHandler (stateName) { + return this.stateHandlers.delete(stateName) } } diff --git a/src/states/StateHandler.js b/src/states/StateHandler.js index 1ddcdd1..4358a17 100644 --- a/src/states/StateHandler.js +++ b/src/states/StateHandler.js @@ -3,7 +3,7 @@ * @module StateHandler */ -import { Emotions, Config } from '../constants.js'; +import { Emotions, Config } from '../constants.js' /** * Abstract base class for state handlers @@ -16,30 +16,30 @@ export class StateHandler { * @param {string} stateName - The name of the state * @param {OwenAnimationContext} context - The animation context */ - constructor(stateName, context) { + constructor (stateName, context) { /** * The name of this state * @type {string} */ - this.stateName = stateName; + this.stateName = stateName /** * The animation context * @type {OwenAnimationContext} */ - this.context = context; + this.context = context /** * Currently playing animation clip * @type {AnimationClip|null} */ - this.currentClip = null; + this.currentClip = null /** * Nested state information * @type {Object|null} */ - this.nestedState = null; + this.nestedState = null } /** @@ -50,8 +50,8 @@ export class StateHandler { * @returns {Promise} * @throws {Error} Must be implemented by subclasses */ - async enter(_fromState = null, _emotion = Emotions.NEUTRAL) { - throw new Error('enter method must be implemented by subclasses'); + async enter (_fromState = null, _emotion = Emotions.NEUTRAL) { + throw new Error('enter method must be implemented by subclasses') } /** @@ -62,8 +62,8 @@ export class StateHandler { * @returns {Promise} * @throws {Error} Must be implemented by subclasses */ - async exit(_toState = null, _emotion = Emotions.NEUTRAL) { - throw new Error('exit method must be implemented by subclasses'); + async exit (_toState = null, _emotion = Emotions.NEUTRAL) { + throw new Error('exit method must be implemented by subclasses') } /** @@ -71,7 +71,7 @@ export class StateHandler { * @param {number} _deltaTime - Time elapsed since last update (ms, unused in base class) * @returns {void} */ - update(_deltaTime) { + update (_deltaTime) { // Override in subclasses if needed } @@ -80,7 +80,7 @@ export class StateHandler { * @param {string} _message - The user message (unused in base class) * @returns {Promise} */ - async handleMessage(_message) { + async handleMessage (_message) { // Override in subclasses if needed } @@ -88,8 +88,8 @@ export class StateHandler { * Get available transitions from this state * @returns {string[]} Array of state names that can be transitioned to */ - getAvailableTransitions() { - return []; + getAvailableTransitions () { + return [] } /** @@ -98,17 +98,17 @@ export class StateHandler { * @param {AnimationClip} clip - The animation clip to wait for * @returns {Promise} Promise that resolves when the clip finishes */ - async waitForClipEnd(clip) { + async waitForClipEnd (clip) { return new Promise((resolve) => { const checkFinished = () => { if (!clip.isPlaying()) { - resolve(); + resolve() } else { - requestAnimationFrame(checkFinished); + requestAnimationFrame(checkFinished) } - }; - checkFinished(); - }); + } + checkFinished() + }) } /** @@ -117,10 +117,10 @@ export class StateHandler { * @param {number} [fadeOutDuration] - Fade out duration * @returns {Promise} */ - async stopCurrentClip(fadeOutDuration = Config.DEFAULT_FADE_OUT) { + async stopCurrentClip (fadeOutDuration = Config.DEFAULT_FADE_OUT) { if (this.currentClip) { - await this.currentClip.stop(fadeOutDuration); - this.currentClip = null; + await this.currentClip.stop(fadeOutDuration) + this.currentClip = null } } } diff --git a/src/states/TypeStateHandler.js b/src/states/TypeStateHandler.js index 18942b6..da26775 100644 --- a/src/states/TypeStateHandler.js +++ b/src/states/TypeStateHandler.js @@ -3,8 +3,8 @@ * @module states */ -import { StateHandler } from './StateHandler.js'; -import { States, Emotions } from '../constants.js'; +import { StateHandler } from './StateHandler.js' +import { States, Emotions } from '../constants.js' /** * Handler for the Type state @@ -16,20 +16,20 @@ export class TypeStateHandler extends StateHandler { * Create a type state handler * @param {OwenAnimationContext} context - The animation context */ - constructor(context) { - super(States.TYPE, context); + constructor (context) { + super(States.TYPE, context) /** * Current emotional state * @type {string} */ - this.emotion = Emotions.NEUTRAL; + this.emotion = Emotions.NEUTRAL /** * Whether currently typing * @type {boolean} */ - this.isTyping = false; + this.isTyping = false } /** @@ -38,21 +38,21 @@ export class TypeStateHandler extends StateHandler { * @param {string} [emotion=Emotions.NEUTRAL] - The emotion to enter with * @returns {Promise} */ - async enter(_fromState = null, emotion = Emotions.NEUTRAL) { - console.log(`Entering TYPE state with emotion: ${emotion}`); - this.emotion = emotion; - this.isTyping = true; + async enter (_fromState = null, emotion = Emotions.NEUTRAL) { + console.log(`Entering TYPE state with emotion: ${emotion}`) + this.emotion = emotion + this.isTyping = true // Play appropriate typing animation - let typingClipName = 'type_idle_L'; + let typingClipName = 'type_idle_L' if (emotion !== Emotions.NEUTRAL) { - typingClipName = `type_${emotion}_L`; + typingClipName = `type_${emotion}_L` } - const typingClip = this.context.getClip(typingClipName); + const typingClip = this.context.getClip(typingClipName) if (typingClip) { - await typingClip.play(); - this.currentClip = typingClip; + await typingClip.play() + this.currentClip = typingClip } } @@ -62,24 +62,24 @@ export class TypeStateHandler extends StateHandler { * @param {string} [_emotion=Emotions.NEUTRAL] - The emotion to exit with (unused) * @returns {Promise} */ - async exit(toState = null, _emotion = Emotions.NEUTRAL) { - console.log(`Exiting TYPE state to ${toState}`); - this.isTyping = false; + async exit (toState = null, _emotion = Emotions.NEUTRAL) { + console.log(`Exiting TYPE state to ${toState}`) + this.isTyping = false if (this.currentClip) { - await this.stopCurrentClip(); + await this.stopCurrentClip() } // Play transition if available - let transitionName = `type_2${toState}_T`; + let transitionName = `type_2${toState}_T` if (this.emotion !== Emotions.NEUTRAL) { - transitionName = `type_${this.emotion}2${toState}_T`; + transitionName = `type_${this.emotion}2${toState}_T` } - const transition = this.context.getClip(transitionName); + const transition = this.context.getClip(transitionName) if (transition) { - await transition.play(); - await this.waitForClipEnd(transition); + await transition.play() + await this.waitForClipEnd(transition) } } @@ -87,34 +87,34 @@ export class TypeStateHandler extends StateHandler { * Finish typing and prepare to transition * @returns {Promise} */ - async finishTyping() { - if (!this.isTyping) return; + async finishTyping () { + if (!this.isTyping) return // Play typing finish animation if available - const finishClip = this.context.getClip('type_finish_Q'); + const finishClip = this.context.getClip('type_finish_Q') if (finishClip && this.currentClip) { - await this.stopCurrentClip(0.2); - await finishClip.play(); - await this.waitForClipEnd(finishClip); + await this.stopCurrentClip(0.2) + await finishClip.play() + await this.waitForClipEnd(finishClip) } - this.isTyping = false; + this.isTyping = false } /** * Get available transitions from type state * @returns {string[]} Array of available state transitions */ - getAvailableTransitions() { - return [ States.WAIT, States.REACT ]; + getAvailableTransitions () { + return [States.WAIT, States.REACT] } /** * Check if currently typing * @returns {boolean} True if typing, false otherwise */ - getIsTyping() { - return this.isTyping; + getIsTyping () { + return this.isTyping } /** @@ -122,7 +122,7 @@ export class TypeStateHandler extends StateHandler { * @param {boolean} typing - Whether currently typing * @returns {void} */ - setTyping(typing) { - this.isTyping = typing; + setTyping (typing) { + this.isTyping = typing } } diff --git a/src/states/WaitStateHandler.js b/src/states/WaitStateHandler.js index ca96cf2..b6e3922 100644 --- a/src/states/WaitStateHandler.js +++ b/src/states/WaitStateHandler.js @@ -3,8 +3,8 @@ * @module states */ -import { StateHandler } from './StateHandler.js'; -import { States, Emotions, Config } from '../constants.js'; +import { StateHandler } from './StateHandler.js' +import { States, Emotions, Config } from '../constants.js' /** * Handler for the Wait/Idle state @@ -12,127 +12,127 @@ import { States, Emotions, Config } from '../constants.js'; * @extends StateHandler */ export class WaitStateHandler extends StateHandler { - /** + /** * Create a wait state handler * @param {OwenAnimationContext} context - The animation context */ - constructor(context) { - super(States.WAIT, context); + constructor (context) { + super(States.WAIT, context) - /** + /** * The main idle animation clip * @type {AnimationClip|null} */ - this.idleClip = null; + this.idleClip = null - /** + /** * Available quirk animations * @type {AnimationClip[]} */ - this.quirks = []; + this.quirks = [] - /** + /** * Timer for quirk animations * @type {number} */ - this.quirkTimer = 0; + this.quirkTimer = 0 - /** + /** * Interval between quirk attempts (ms) * @type {number} */ - this.quirkInterval = Config.QUIRK_INTERVAL; - } + this.quirkInterval = Config.QUIRK_INTERVAL + } - /** + /** * Enter the wait state * @param {string|null} [fromState=null] - The previous state * @param {string} [emotion=Emotions.NEUTRAL] - The emotion to enter with * @returns {Promise} */ - async enter(fromState = null, _emotion = Emotions.NEUTRAL) { - console.log(`Entering WAIT state from ${fromState}`); + async enter (fromState = null, _emotion = Emotions.NEUTRAL) { + console.log(`Entering WAIT state from ${fromState}`) - // Play idle loop - this.idleClip = this.context.getClip('wait_idle_L'); - if (this.idleClip) { - await this.idleClip.play(); - this.currentClip = this.idleClip; - } - - // Collect available quirks - this.quirks = this.context.getClipsByPattern('wait_*_Q'); - this.quirkTimer = 0; + // Play idle loop + this.idleClip = this.context.getClip('wait_idle_L') + if (this.idleClip) { + await this.idleClip.play() + this.currentClip = this.idleClip } - /** + // Collect available quirks + this.quirks = this.context.getClipsByPattern('wait_*_Q') + this.quirkTimer = 0 + } + + /** * Exit the wait state * @param {string|null} [toState=null] - The next state * @param {string} [emotion=Emotions.NEUTRAL] - The emotion to exit with * @returns {Promise} */ - async exit(toState = null, _emotion = Emotions.NEUTRAL) { - console.log(`Exiting WAIT state to ${toState}`); + async exit (toState = null, _emotion = Emotions.NEUTRAL) { + console.log(`Exiting WAIT state to ${toState}`) - if (this.currentClip) { - await this.stopCurrentClip(); - } - - // Play transition if available - const transitionName = `wait_2${toState}_T`; - const transition = this.context.getClip(transitionName); - if (transition) { - await transition.play(); - await this.waitForClipEnd(transition); - } + if (this.currentClip) { + await this.stopCurrentClip() } - /** + // Play transition if available + const transitionName = `wait_2${toState}_T` + const transition = this.context.getClip(transitionName) + if (transition) { + await transition.play() + await this.waitForClipEnd(transition) + } + } + + /** * Update the wait state * @param {number} deltaTime - Time elapsed since last update (ms) * @returns {void} */ - update(deltaTime) { - this.quirkTimer += deltaTime; + update (deltaTime) { + this.quirkTimer += deltaTime - // Randomly play quirks - if (this.quirkTimer > this.quirkInterval && Math.random() < Config.QUIRK_PROBABILITY) { - this.playRandomQuirk(); - this.quirkTimer = 0; - } + // Randomly play quirks + if (this.quirkTimer > this.quirkInterval && Math.random() < Config.QUIRK_PROBABILITY) { + this.playRandomQuirk() + this.quirkTimer = 0 } + } - /** + /** * Play a random quirk animation * @private * @returns {Promise} */ - async playRandomQuirk() { - if (this.quirks.length === 0) return; + async playRandomQuirk () { + if (this.quirks.length === 0) return - const quirk = this.quirks[ Math.floor(Math.random() * this.quirks.length) ]; + const quirk = this.quirks[Math.floor(Math.random() * this.quirks.length)] - // Fade out idle - if (this.idleClip) { - await this.idleClip.stop(0.2); - } - - // Play quirk - await quirk.play(); - await this.waitForClipEnd(quirk); - - // Return to idle - if (this.idleClip) { - await this.idleClip.play(); - this.currentClip = this.idleClip; - } + // Fade out idle + if (this.idleClip) { + await this.idleClip.stop(0.2) } - /** + // Play quirk + await quirk.play() + await this.waitForClipEnd(quirk) + + // Return to idle + if (this.idleClip) { + await this.idleClip.play() + this.currentClip = this.idleClip + } + } + + /** * Get available transitions from wait state * @returns {string[]} Array of available state transitions */ - getAvailableTransitions() { - return [ States.REACT, States.SLEEP ]; - } + getAvailableTransitions () { + return [States.REACT, States.SLEEP] + } } diff --git a/vite.config.js b/vite.config.js index 79d0ef0..ff985e4 100644 --- a/vite.config.js +++ b/vite.config.js @@ -1,4 +1,4 @@ -import { defineConfig } from 'vite'; +import { defineConfig } from 'vite' export default defineConfig({ root: 'examples', @@ -17,7 +17,7 @@ export default defineConfig({ }, resolve: { alias: { - 'owen': '/src/index.js' + owen: '/src/index.js' } } -}); +})