add cq tooling

This commit is contained in:
2024-11-09 11:40:25 -05:00
parent 1541b63d85
commit ba0c279cbc
8 changed files with 1208 additions and 206 deletions

3
.gitignore vendored
View File

@@ -1 +1,2 @@
/.idea/
/.idea/
/node_modules/

32
.prettierrc Normal file
View File

@@ -0,0 +1,32 @@
{
"semi": true,
"singleQuote": true,
"trailingComma": "es5",
"tabWidth": 2,
"printWidth": 100,
"bracketSpacing": true,
"arrowParens": "avoid",
"endOfLine": "lf",
"jsxSingleQuote": false,
"quoteProps": "as-needed",
"bracketSameLine": false,
"proseWrap": "preserve",
"htmlWhitespaceSensitivity": "css",
"embeddedLanguageFormatting": "auto",
"singleAttributePerLine": false,
"overrides": [
{
"files": "*.md",
"options": {
"proseWrap": "always",
"printWidth": 80
}
},
{
"files": ["*.yml", "*.yaml"],
"options": {
"singleQuote": false
}
}
]
}

View File

@@ -1,7 +1,7 @@
# workflow-function-manifold
> A TypeScript/JavaScript library for building dynamic, LLM-driven workflows using a region-based execution model
> A TypeScript/JavaScript library for building dynamic, LLM-driven workflows
> using a region-based execution model
![License: MIT](https://img.shields.io/badge/License-MIT-green.svg)
![Node Version](https://img.shields.io/badge/node-%3E%3D%2014.0.0-brightgreen)
@@ -9,6 +9,7 @@
CLI: `npx workflow-function-manifold`
## Table of Contents
- [Overview](#overview)
- [Installation](#installation)
- [Quick Start](#quick-start)
@@ -24,6 +25,7 @@ CLI: `npx workflow-function-manifold`
## Overview
`workflow-function-manifold` enables you to create dynamic workflows that:
- Navigate between different execution regions based on LLM-interpreted intents.
- Execute operations within regions based on state and context.
- Maintain workflow state across operations.
@@ -64,11 +66,11 @@ npm install workflow-function-manifold
## Quick Start
```javascript
import {
WorkflowFunctionManifold,
ManifoldRegion,
WorkflowOperator,
DummyLlmService
import {
WorkflowFunctionManifold,
ManifoldRegion,
WorkflowOperator,
DummyLlmService,
} from 'workflow-function-manifold';
// Initialize the manifold with an LLM service
@@ -76,7 +78,7 @@ const llm = new DummyLlmService();
const manifold = new WorkflowFunctionManifold(llm);
// Create an operator
const analysisOperator = new WorkflowOperator('analysis', async (state) => {
const analysisOperator = new WorkflowOperator('analysis', async state => {
console.log('Analyzing data...');
return { ...state, analyzed: true };
});
@@ -86,13 +88,15 @@ const analysisRegion = new ManifoldRegion('analysis', [analysisOperator]);
manifold.addRegion(analysisRegion);
// Execute workflow
await manifold.navigate('analyze the data'); // This navigates to the 'analysis' region
await manifold.executeWorkflow('analyze the data'); // Executes the operator in the 'analysis' region
await manifold.navigate('analyze the data'); // This navigates to the 'analysis' region
await manifold.executeWorkflow('analyze the data'); // Executes the operator in the 'analysis' region
console.log(manifold.state); // { analyzed: true }
console.log(manifold.state); // { analyzed: true }
```
> **Note:** The `DummyLlmService` matches specific keywords in prompts. Ensure your prompts contain keywords like `'analyze'`, `'process'`, or `'transform'` for the default operators to function.
> **Note:** The `DummyLlmService` matches specific keywords in prompts. Ensure
> your prompts contain keywords like `'analyze'`, `'process'`, or `'transform'`
> for the default operators to function.
## Core Components
@@ -115,7 +119,8 @@ await manifold.executeWorkflow(prompt);
### ManifoldRegion
Represents a workflow region containing operators and connections to other regions.
Represents a workflow region containing operators and connections to other
regions.
```javascript
const region = new ManifoldRegion('regionName', [operator1, operator2]);
@@ -132,7 +137,7 @@ region.addOperator(newOperator);
Defines operations that can be executed within regions.
```javascript
const operator = new WorkflowOperator('operatorName', async (state) => {
const operator = new WorkflowOperator('operatorName', async state => {
// Modify state
return newState;
});
@@ -158,13 +163,13 @@ async function createWorkflow() {
const manifold = new WorkflowFunctionManifold(llm);
// Create operators
const analysisOp = new WorkflowOperator('analysis', async (state) => {
const analysisOp = new WorkflowOperator('analysis', async state => {
return { ...state, analyzed: true };
});
const processingOp = new WorkflowOperator('processing', async (state) => {
const processingOp = new WorkflowOperator('processing', async state => {
return { ...state, processed: true };
});
const transformOp = new WorkflowOperator('transformation', async (state) => {
const transformOp = new WorkflowOperator('transformation', async state => {
return { ...state, transformed: true };
});
@@ -189,7 +194,7 @@ const manifold = await createWorkflow();
const prompts = [
'analyze the data',
'process the results',
'transform the output'
'transform the output',
];
for (const prompt of prompts) {
@@ -197,7 +202,7 @@ for (const prompt of prompts) {
await manifold.executeWorkflow(prompt);
}
console.log(manifold.state); // Final state after all operations
console.log(manifold.state); // Final state after all operations
```
## API Reference
@@ -205,9 +210,11 @@ console.log(manifold.state); // Final state after all operations
### WorkflowFunctionManifold
#### Constructor
- `constructor(llmService: LLMService)`
#### Methods
- `addRegion(region: ManifoldRegion): void`
- `async navigate(prompt: string): Promise<boolean>`
- `async executeWorkflow(prompt: string): Promise<boolean>`
@@ -215,9 +222,11 @@ console.log(manifold.state); // Final state after all operations
### ManifoldRegion
#### Constructor
- `constructor(name: string, operators: WorkflowOperator[] = [])`
#### Methods
- `addOperator(operator: WorkflowOperator): void`
- `connectTo(region: ManifoldRegion): void`
- `async getValidOperators(state: any): Promise<WorkflowOperator[]>`
@@ -225,24 +234,27 @@ console.log(manifold.state); // Final state after all operations
### WorkflowOperator
#### Constructor
- `constructor(name: string, operation: (state: any) => Promise<any>)`
#### Methods
- `async execute(state: any): Promise<any>`
## State Management
The workflow maintains state across operations. Each operator can access and modify the state:
The workflow maintains state across operations. Each operator can access and
modify the state:
```javascript
const operator = new WorkflowOperator('example', async (state) => {
const operator = new WorkflowOperator('example', async state => {
// Access existing state
const { previousValue } = state;
// Return modified state
return {
...state,
newValue: 'updated'
newValue: 'updated',
};
});
```
@@ -251,7 +263,9 @@ The updated state persists across operators and regions.
## LLM Integration
The system uses LLM services for intent recognition. The default `DummyLlmService` provides basic intent matching, but you can implement your own LLM service:
The system uses LLM services for intent recognition. The default
`DummyLlmService` provides basic intent matching, but you can implement your own
LLM service:
```javascript
class CustomLLMService {
@@ -259,7 +273,7 @@ class CustomLLMService {
// Implement custom LLM logic
return {
confidence: number,
action: string
action: string,
};
}
}
@@ -267,21 +281,27 @@ class CustomLLMService {
## Error Handling
This library includes basic error handling to ensure workflows run smoothly, even when unexpected issues arise.
This library includes basic error handling to ensure workflows run smoothly,
even when unexpected issues arise.
### Navigation Errors
- If a prompt doesn't match a valid adjacent region:
- Logs a warning: `No valid region found for prompt: "<prompt>"`.
- Logs a warning: `No valid region found for prompt: "<prompt>"`.
### Operator Execution Errors
- If no matching operator is found:
- Logs a warning: `No matching operator found for intent: <intent>`.
- Logs a warning: `No matching operator found for intent: <intent>`.
### LLM Query Errors
- If issues arise during LLM queries:
- Logs an error: `Error during navigation for prompt "<prompt>": <error message>`.
- Logs an error:
`Error during navigation for prompt "<prompt>": <error message>`.
### Example Error Logging
```javascript
try {
await manifold.navigate('unknown command');
@@ -306,4 +326,4 @@ try {
## License
MIT © 2024 Geoff Seemueller
MIT © 2024 Geoff Seemueller

89
bin.js
View File

@@ -1,62 +1,63 @@
#!/usr/bin/env node
import {DummyLlmService, ManifoldRegion, WorkflowFunctionManifold, WorkflowOperator} from "./lib.js";
import {
DummyLlmService,
ManifoldRegion,
WorkflowFunctionManifold,
WorkflowOperator,
} from './lib.js';
async function demonstrateManifold() {
// Initialize services and manifold
const llm = new DummyLlmService();
const manifold = new WorkflowFunctionManifold(llm);
// Initialize services and manifold
const llm = new DummyLlmService();
const manifold = new WorkflowFunctionManifold(llm);
// Create operators
const dataAnalysisOp = new WorkflowOperator('analysis', async (state) => {
console.log('Performing data analysis...');
return { ...state, analyzed: true };
});
// Create operators
const dataAnalysisOp = new WorkflowOperator('analysis', async state => {
console.log('Performing data analysis...');
return { ...state, analyzed: true };
});
const dataProcessingOp = new WorkflowOperator('processing', async (state) => {
console.log('Processing data...');
return { ...state, processed: true };
});
const dataProcessingOp = new WorkflowOperator('processing', async state => {
console.log('Processing data...');
return { ...state, processed: true };
});
const dataTransformOp = new WorkflowOperator('transformation', async (state) => {
console.log('Transforming data...');
return { ...state, transformed: true };
});
const dataTransformOp = new WorkflowOperator('transformation', async state => {
console.log('Transforming data...');
return { ...state, transformed: true };
});
// Create regions
const analysisRegion = new ManifoldRegion('analysis', [dataAnalysisOp]);
const processingRegion = new ManifoldRegion('processing', [dataProcessingOp]);
const transformationRegion = new ManifoldRegion('transformation', [dataTransformOp]);
// Create regions
const analysisRegion = new ManifoldRegion('analysis', [dataAnalysisOp]);
const processingRegion = new ManifoldRegion('processing', [dataProcessingOp]);
const transformationRegion = new ManifoldRegion('transformation', [dataTransformOp]);
// Connect regions
analysisRegion.connectTo(processingRegion);
processingRegion.connectTo(transformationRegion);
// Connect regions
analysisRegion.connectTo(processingRegion);
processingRegion.connectTo(transformationRegion);
// Add regions to manifold
manifold.addRegion(analysisRegion);
manifold.addRegion(processingRegion);
manifold.addRegion(transformationRegion);
// Add regions to manifold
manifold.addRegion(analysisRegion);
manifold.addRegion(processingRegion);
manifold.addRegion(transformationRegion);
// Demonstrate workflow execution
console.log('Starting workflow demonstration...');
// Demonstrate workflow execution
console.log('Starting workflow demonstration...');
const prompts = [
'analyze the data',
'process the results',
'transform the output'
];
const prompts = ['analyze the data', 'process the results', 'transform the output'];
for (const prompt of prompts) {
console.log(`\nExecuting prompt: "${prompt}"`);
await manifold.navigate(prompt);
const executed = await manifold.executeWorkflow(prompt);
console.log(`Current state:`, manifold.state);
console.log(`Current region: ${manifold.currentRegion.name}`);
console.log(`Operation executed: ${executed}`);
}
for (const prompt of prompts) {
console.log(`\nExecuting prompt: "${prompt}"`);
await manifold.navigate(prompt);
const executed = await manifold.executeWorkflow(prompt);
console.log('Current state:', manifold.state);
console.log(`Current region: ${manifold.currentRegion.name}`);
console.log(`Operation executed: ${executed}`);
}
}
// Run the demonstration
demonstrateManifold().catch(console.error);
export {}
export {};

74
eslint.config.js Normal file
View File

@@ -0,0 +1,74 @@
import globals from 'globals';
import js from '@eslint/js';
/** @type {import('eslint').Linter.Config[]} */
export default [
{
ignores: ['dist/**', 'node_modules/**', '*.min.js', '*.d.ts'],
},
{
languageOptions: {
ecmaVersion: 2024,
sourceType: 'module',
globals: {
...globals.node,
...globals.browser,
},
},
linterOptions: {
reportUnusedDisableDirectives: true,
},
rules: {
...js.configs.recommended.rules,
'no-console': process.env.NODE_ENV === 'production' ? 'warn' : 'off',
'no-debugger': process.env.NODE_ENV === 'production' ? 'error' : 'off',
'no-unused-vars': ['error', { argsIgnorePattern: '^_' }],
'no-constant-condition': ['error', { checkLoops: false }],
'no-multiple-empty-lines': ['error', { max: 1, maxEOF: 0 }],
quotes: ['error', 'single', { avoidEscape: true }],
semi: ['error', 'always'],
indent: ['error', 2, { SwitchCase: 1 }],
'comma-dangle': ['error', 'always-multiline'],
'arrow-parens': ['error', 'as-needed'], // Changed from 'avoid' to 'as-needed'
'object-curly-spacing': ['error', 'always'],
'array-bracket-spacing': ['error', 'never'],
'space-before-function-paren': [
'error',
{
anonymous: 'never',
named: 'never',
asyncArrow: 'always',
},
],
'no-trailing-spaces': 'error',
'eol-last': ['error', 'always'],
'prefer-const': 'error',
'no-var': 'error',
eqeqeq: ['error', 'always'],
curly: ['error', 'all'],
'brace-style': ['error', '1tbs', { allowSingleLine: false }],
'keyword-spacing': ['error', { before: true, after: true }],
'space-infix-ops': 'error',
'comma-spacing': ['error', { before: false, after: true }],
'no-multi-spaces': 'error',
'no-irregular-whitespace': 'error',
'no-mixed-spaces-and-tabs': 'error',
'no-else-return': 'error',
},
},
{
files: ['src/TokenCleaner.js'],
rules: {
'no-useless-escape': 'off',
},
},
{
files: ['**/*.test.js', '**/*.spec.js'],
languageOptions: {
globals: {
...globals.jest,
},
},
},
];

258
lib.js
View File

@@ -3,23 +3,24 @@
* Simulates a Large Language Model (LLM) service for intent detection.
*/
export class DummyLlmService {
/**
* Queries the simulated LLM with a prompt.
* @param {string} prompt - The input prompt to query the LLM.
* @returns {Promise<{confidence: number, action: string}>} - The detected intent with confidence and action.
*/
async query(prompt) {
const intents = {
'analyze': { confidence: 0.9, action: 'analysis' },
'process': { confidence: 0.8, action: 'processing' },
'transform': { confidence: 0.7, action: 'transformation' }
};
/**
* Queries the simulated LLM with a prompt.
* @param {string} prompt - The input prompt to query the LLM.
* @returns {Promise<{confidence: number, action: string}>} - The detected intent with confidence and action.
*/
async query(prompt) {
const intents = {
analyze: { confidence: 0.9, action: 'analysis' },
process: { confidence: 0.8, action: 'processing' },
transform: { confidence: 0.7, action: 'transformation' },
};
const matchedIntent = Object.entries(intents)
.find(([key]) => prompt.toLowerCase().includes(key));
const matchedIntent = Object.entries(intents).find(([key]) =>
prompt.toLowerCase().includes(key),
);
return matchedIntent ? matchedIntent[1] : { confidence: 0.1, action: 'unknown' };
}
return matchedIntent ? matchedIntent[1] : { confidence: 0.1, action: 'unknown' };
}
}
// Interface for workflow operators
@@ -27,24 +28,24 @@ export class DummyLlmService {
* Represents a workflow operator responsible for performing a specific operation.
*/
export class WorkflowOperator {
/**
* Creates an instance of WorkflowOperator.
* @param {string} name - The name of the operator.
* @param {function(object): Promise<object>} operation - The operation function executed by the operator.
*/
constructor(name, operation) {
this.name = name;
this.operation = operation;
}
/**
* Creates an instance of WorkflowOperator.
* @param {string} name - The name of the operator.
* @param {function(object): Promise<object>} operation - The operation function executed by the operator.
*/
constructor(name, operation) {
this.name = name;
this.operation = operation;
}
/**
* Executes the operator's operation with the given state.
* @param {object} state - The current state to be processed.
* @returns {Promise<object>} - The updated state after the operation.
*/
async execute(state) {
return await this.operation(state);
}
/**
* Executes the operator's operation with the given state.
* @param {object} state - The current state to be processed.
* @returns {Promise<object>} - The updated state after the operation.
*/
async execute(state) {
return await this.operation(state);
}
}
// Interface for manifold regions
@@ -52,42 +53,42 @@ export class WorkflowOperator {
* Represents a region within the manifold, containing workflow operators.
*/
export class ManifoldRegion {
/**
* Creates an instance of ManifoldRegion.
* @param {string} name - The name of the region.
* @param {WorkflowOperator[]} [operators=[]] - The operators available in this region.
*/
constructor(name, operators = []) {
this.name = name;
this.operators = operators;
this.adjacentRegions = new Set();
}
/**
* Creates an instance of ManifoldRegion.
* @param {string} name - The name of the region.
* @param {WorkflowOperator[]} [operators=[]] - The operators available in this region.
*/
constructor(name, operators = []) {
this.name = name;
this.operators = operators;
this.adjacentRegions = new Set();
}
/**
* Adds an operator to the region.
* @param {WorkflowOperator} operator - The operator to be added.
*/
addOperator(operator) {
this.operators.push(operator);
}
/**
* Adds an operator to the region.
* @param {WorkflowOperator} operator - The operator to be added.
*/
addOperator(operator) {
this.operators.push(operator);
}
/**
* Establishes a connection to another region.
* @param {ManifoldRegion} region - The region to connect to.
*/
connectTo(region) {
this.adjacentRegions.add(region);
region.adjacentRegions.add(this);
}
/**
* Establishes a connection to another region.
* @param {ManifoldRegion} region - The region to connect to.
*/
connectTo(region) {
this.adjacentRegions.add(region);
region.adjacentRegions.add(this);
}
/**
* Retrieves valid operators for the given state.
* @param {object} state - The current state.
* @returns {Promise<WorkflowOperator[]>} - The list of valid operators.
*/
async getValidOperators(state) {
return this.operators;
}
/**
* Retrieves valid operators for the given state.
* @param {object} _state - The current state.
* @returns {Promise<WorkflowOperator[]>} - The list of valid operators.
*/
async getValidOperators(_state) {
return this.operators;
}
}
// Main manifold implementation
@@ -95,75 +96,74 @@ export class ManifoldRegion {
* Represents the workflow function manifold managing regions and state transitions.
*/
export class WorkflowFunctionManifold {
/**
* Creates an instance of WorkflowFunctionManifold.
* @param {DummyLlmService} llmService - The LLM service used for intent detection.
*/
constructor(llmService) {
this.llmService = llmService;
this.regions = new Map();
this.currentRegion = null;
this.state = {};
/**
* Creates an instance of WorkflowFunctionManifold.
* @param {DummyLlmService} llmService - The LLM service used for intent detection.
*/
constructor(llmService) {
this.llmService = llmService;
this.regions = new Map();
this.currentRegion = null;
this.state = {};
}
/**
* Adds a region to the manifold.
* @param {ManifoldRegion} region - The region to be added.
*/
addRegion(region) {
this.regions.set(region.name, region);
if (!this.currentRegion) {
this.currentRegion = region;
}
}
/**
* Adds a region to the manifold.
* @param {ManifoldRegion} region - The region to be added.
*/
addRegion(region) {
this.regions.set(region.name, region);
if (!this.currentRegion) {
this.currentRegion = region;
}
/**
* Navigates to the next region based on the provided prompt.
* @param {string} prompt - The input prompt for intent matching.
* @returns {Promise<boolean>} - Whether navigation was successful.
*/
async navigate(prompt) {
try {
const intent = await this.llmService.query(prompt);
const nextRegion = Array.from(this.currentRegion.adjacentRegions).find(region =>
region.name.toLowerCase().includes(intent.action),
);
if (nextRegion && intent.confidence > 0.5) {
this.currentRegion = nextRegion;
return true;
}
console.warn(`No valid region found for prompt: "${prompt}"`);
return false;
} catch (error) {
console.error(`Error during navigation for prompt "${prompt}":`, error);
return false;
}
}
/**
* Navigates to the next region based on the provided prompt.
* @param {string} prompt - The input prompt for intent matching.
* @returns {Promise<boolean>} - Whether navigation was successful.
*/
async navigate(prompt) {
try {
const intent = await this.llmService.query(prompt);
/**
* Executes the workflow based on the current region and provided prompt.
* @param {string} prompt - The input prompt for intent matching.
* @returns {Promise<boolean>} - Whether the workflow execution was successful.
*/
async executeWorkflow(prompt) {
try {
const operators = await this.currentRegion.getValidOperators(this.state);
const intent = await this.llmService.query(prompt);
const nextRegion = Array.from(this.currentRegion.adjacentRegions)
.find(region => region.name.toLowerCase().includes(intent.action));
const matchedOperator = operators.find(op => op.name.toLowerCase().includes(intent.action));
if (nextRegion && intent.confidence > 0.5) {
this.currentRegion = nextRegion;
return true;
} else {
console.warn(`No valid region found for prompt: "${prompt}"`);
return false;
}
} catch (error) {
console.error(`Error during navigation for prompt "${prompt}":`, error);
return false;
}
}
/**
* Executes the workflow based on the current region and provided prompt.
* @param {string} prompt - The input prompt for intent matching.
* @returns {Promise<boolean>} - Whether the workflow execution was successful.
*/
async executeWorkflow(prompt) {
try {
const operators = await this.currentRegion.getValidOperators(this.state);
const intent = await this.llmService.query(prompt);
const matchedOperator = operators.find(op => op.name.toLowerCase().includes(intent.action));
if (matchedOperator) {
this.state = await matchedOperator.execute(this.state);
return true;
} else {
console.warn(`No matching operator found for intent: ${intent.action}`);
return false;
}
} catch (error) {
console.error(`Error during workflow execution for prompt "${prompt}":`, error);
return false;
}
if (matchedOperator) {
this.state = await matchedOperator.execute(this.state);
return true;
}
console.warn(`No matching operator found for intent: ${intent.action}`);
return false;
} catch (error) {
console.error(`Error during workflow execution for prompt "${prompt}":`, error);
return false;
}
}
}

View File

@@ -8,9 +8,19 @@
},
"scripts": {
"start": "node index.js",
"test": "echo \"Error: no test specified\" && exit 1"
"test": "echo \"Error: no test specified\" && exit 1",
"lint": "eslint . --ext .js,.jsx,.ts,.tsx",
"lint:fix": "eslint . --fix",
"format": "prettier --write \"**/*.{js,jsx,ts,tsx,json,md,yml,yaml}\"",
"fix": "pnpm format && pnpm lint:fix"
},
"keywords": [],
"author": "geoffsee",
"license": "MIT"
"license": "MIT",
"devDependencies": {
"@eslint/js": "^9.14.0",
"eslint": "^9.14.0",
"globals": "^15.12.0",
"prettier": "^3.3.3"
}
}

864
pnpm-lock.yaml generated Normal file
View File

@@ -0,0 +1,864 @@
lockfileVersion: "6.0"
settings:
autoInstallPeers: true
excludeLinksFromLockfile: false
devDependencies:
"@eslint/js":
specifier: ^9.14.0
version: 9.14.0
eslint:
specifier: ^9.14.0
version: 9.14.0
globals:
specifier: ^15.12.0
version: 15.12.0
prettier:
specifier: ^3.3.3
version: 3.3.3
packages:
/@eslint-community/eslint-utils@4.4.1(eslint@9.14.0):
resolution:
{
integrity: sha512-s3O3waFUrMV8P/XaF/+ZTp1X9XBZW1a4B97ZnjQF2KYWaFD2A8KyFBsrsfSjEmjn3RGWAIuvlneuZm3CUK3jbA==,
}
engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 }
peerDependencies:
eslint: ^6.0.0 || ^7.0.0 || >=8.0.0
dependencies:
eslint: 9.14.0
eslint-visitor-keys: 3.4.3
dev: true
/@eslint-community/regexpp@4.12.1:
resolution:
{
integrity: sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==,
}
engines: { node: ^12.0.0 || ^14.0.0 || >=16.0.0 }
dev: true
/@eslint/config-array@0.18.0:
resolution:
{
integrity: sha512-fTxvnS1sRMu3+JjXwJG0j/i4RT9u4qJ+lqS/yCGap4lH4zZGzQ7tu+xZqQmcMZq5OBZDL4QRxQzRjkWcGt8IVw==,
}
engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 }
dependencies:
"@eslint/object-schema": 2.1.4
debug: 4.3.7
minimatch: 3.1.2
transitivePeerDependencies:
- supports-color
dev: true
/@eslint/core@0.7.0:
resolution:
{
integrity: sha512-xp5Jirz5DyPYlPiKat8jaq0EmYvDXKKpzTbxXMpT9eqlRJkRKIz9AGMdlvYjih+im+QlhWrpvVjl8IPC/lHlUw==,
}
engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 }
dev: true
/@eslint/eslintrc@3.1.0:
resolution:
{
integrity: sha512-4Bfj15dVJdoy3RfZmmo86RK1Fwzn6SstsvK9JS+BaVKqC6QQQQyXekNaC+g+LKNgkQ+2VhGAzm6hO40AhMR3zQ==,
}
engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 }
dependencies:
ajv: 6.12.6
debug: 4.3.7
espree: 10.3.0
globals: 14.0.0
ignore: 5.3.2
import-fresh: 3.3.0
js-yaml: 4.1.0
minimatch: 3.1.2
strip-json-comments: 3.1.1
transitivePeerDependencies:
- supports-color
dev: true
/@eslint/js@9.14.0:
resolution:
{
integrity: sha512-pFoEtFWCPyDOl+C6Ift+wC7Ro89otjigCf5vcuWqWgqNSQbRrpjSvdeE6ofLz4dHmyxD5f7gIdGT4+p36L6Twg==,
}
engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 }
dev: true
/@eslint/object-schema@2.1.4:
resolution:
{
integrity: sha512-BsWiH1yFGjXXS2yvrf5LyuoSIIbPrGUWob917o+BTKuZ7qJdxX8aJLRxs1fS9n6r7vESrq1OUqb68dANcFXuQQ==,
}
engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 }
dev: true
/@eslint/plugin-kit@0.2.2:
resolution:
{
integrity: sha512-CXtq5nR4Su+2I47WPOlWud98Y5Lv8Kyxp2ukhgFx/eW6Blm18VXJO5WuQylPugRo8nbluoi6GvvxBLqHcvqUUw==,
}
engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 }
dependencies:
levn: 0.4.1
dev: true
/@humanfs/core@0.19.1:
resolution:
{
integrity: sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==,
}
engines: { node: ">=18.18.0" }
dev: true
/@humanfs/node@0.16.6:
resolution:
{
integrity: sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw==,
}
engines: { node: ">=18.18.0" }
dependencies:
"@humanfs/core": 0.19.1
"@humanwhocodes/retry": 0.3.1
dev: true
/@humanwhocodes/module-importer@1.0.1:
resolution:
{
integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==,
}
engines: { node: ">=12.22" }
dev: true
/@humanwhocodes/retry@0.3.1:
resolution:
{
integrity: sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==,
}
engines: { node: ">=18.18" }
dev: true
/@humanwhocodes/retry@0.4.1:
resolution:
{
integrity: sha512-c7hNEllBlenFTHBky65mhq8WD2kbN9Q6gk0bTk8lSBvc554jpXSkST1iePudpt7+A/AQvuHs9EMqjHDXMY1lrA==,
}
engines: { node: ">=18.18" }
dev: true
/@types/estree@1.0.6:
resolution:
{
integrity: sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==,
}
dev: true
/@types/json-schema@7.0.15:
resolution:
{
integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==,
}
dev: true
/acorn-jsx@5.3.2(acorn@8.14.0):
resolution:
{
integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==,
}
peerDependencies:
acorn: ^6.0.0 || ^7.0.0 || ^8.0.0
dependencies:
acorn: 8.14.0
dev: true
/acorn@8.14.0:
resolution:
{
integrity: sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==,
}
engines: { node: ">=0.4.0" }
hasBin: true
dev: true
/ajv@6.12.6:
resolution:
{
integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==,
}
dependencies:
fast-deep-equal: 3.1.3
fast-json-stable-stringify: 2.1.0
json-schema-traverse: 0.4.1
uri-js: 4.4.1
dev: true
/ansi-styles@4.3.0:
resolution:
{
integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==,
}
engines: { node: ">=8" }
dependencies:
color-convert: 2.0.1
dev: true
/argparse@2.0.1:
resolution:
{
integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==,
}
dev: true
/balanced-match@1.0.2:
resolution:
{
integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==,
}
dev: true
/brace-expansion@1.1.11:
resolution:
{
integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==,
}
dependencies:
balanced-match: 1.0.2
concat-map: 0.0.1
dev: true
/callsites@3.1.0:
resolution:
{
integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==,
}
engines: { node: ">=6" }
dev: true
/chalk@4.1.2:
resolution:
{
integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==,
}
engines: { node: ">=10" }
dependencies:
ansi-styles: 4.3.0
supports-color: 7.2.0
dev: true
/color-convert@2.0.1:
resolution:
{
integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==,
}
engines: { node: ">=7.0.0" }
dependencies:
color-name: 1.1.4
dev: true
/color-name@1.1.4:
resolution:
{
integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==,
}
dev: true
/concat-map@0.0.1:
resolution:
{
integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==,
}
dev: true
/cross-spawn@7.0.5:
resolution:
{
integrity: sha512-ZVJrKKYunU38/76t0RMOulHOnUcbU9GbpWKAOZ0mhjr7CX6FVrH+4FrAapSOekrgFQ3f/8gwMEuIft0aKq6Hug==,
}
engines: { node: ">= 8" }
dependencies:
path-key: 3.1.1
shebang-command: 2.0.0
which: 2.0.2
dev: true
/debug@4.3.7:
resolution:
{
integrity: sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==,
}
engines: { node: ">=6.0" }
peerDependencies:
supports-color: "*"
peerDependenciesMeta:
supports-color:
optional: true
dependencies:
ms: 2.1.3
dev: true
/deep-is@0.1.4:
resolution:
{
integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==,
}
dev: true
/escape-string-regexp@4.0.0:
resolution:
{
integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==,
}
engines: { node: ">=10" }
dev: true
/eslint-scope@8.2.0:
resolution:
{
integrity: sha512-PHlWUfG6lvPc3yvP5A4PNyBL1W8fkDUccmI21JUu/+GKZBoH/W5u6usENXUrWFRsyoW5ACUjFGgAFQp5gUlb/A==,
}
engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 }
dependencies:
esrecurse: 4.3.0
estraverse: 5.3.0
dev: true
/eslint-visitor-keys@3.4.3:
resolution:
{
integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==,
}
engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 }
dev: true
/eslint-visitor-keys@4.2.0:
resolution:
{
integrity: sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==,
}
engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 }
dev: true
/eslint@9.14.0:
resolution:
{
integrity: sha512-c2FHsVBr87lnUtjP4Yhvk4yEhKrQavGafRA/Se1ouse8PfbfC/Qh9Mxa00yWsZRlqeUB9raXip0aiiUZkgnr9g==,
}
engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 }
hasBin: true
peerDependencies:
jiti: "*"
peerDependenciesMeta:
jiti:
optional: true
dependencies:
"@eslint-community/eslint-utils": 4.4.1(eslint@9.14.0)
"@eslint-community/regexpp": 4.12.1
"@eslint/config-array": 0.18.0
"@eslint/core": 0.7.0
"@eslint/eslintrc": 3.1.0
"@eslint/js": 9.14.0
"@eslint/plugin-kit": 0.2.2
"@humanfs/node": 0.16.6
"@humanwhocodes/module-importer": 1.0.1
"@humanwhocodes/retry": 0.4.1
"@types/estree": 1.0.6
"@types/json-schema": 7.0.15
ajv: 6.12.6
chalk: 4.1.2
cross-spawn: 7.0.5
debug: 4.3.7
escape-string-regexp: 4.0.0
eslint-scope: 8.2.0
eslint-visitor-keys: 4.2.0
espree: 10.3.0
esquery: 1.6.0
esutils: 2.0.3
fast-deep-equal: 3.1.3
file-entry-cache: 8.0.0
find-up: 5.0.0
glob-parent: 6.0.2
ignore: 5.3.2
imurmurhash: 0.1.4
is-glob: 4.0.3
json-stable-stringify-without-jsonify: 1.0.1
lodash.merge: 4.6.2
minimatch: 3.1.2
natural-compare: 1.4.0
optionator: 0.9.4
text-table: 0.2.0
transitivePeerDependencies:
- supports-color
dev: true
/espree@10.3.0:
resolution:
{
integrity: sha512-0QYC8b24HWY8zjRnDTL6RiHfDbAWn63qb4LMj1Z4b076A4une81+z03Kg7l7mn/48PUTqoLptSXez8oknU8Clg==,
}
engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 }
dependencies:
acorn: 8.14.0
acorn-jsx: 5.3.2(acorn@8.14.0)
eslint-visitor-keys: 4.2.0
dev: true
/esquery@1.6.0:
resolution:
{
integrity: sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==,
}
engines: { node: ">=0.10" }
dependencies:
estraverse: 5.3.0
dev: true
/esrecurse@4.3.0:
resolution:
{
integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==,
}
engines: { node: ">=4.0" }
dependencies:
estraverse: 5.3.0
dev: true
/estraverse@5.3.0:
resolution:
{
integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==,
}
engines: { node: ">=4.0" }
dev: true
/esutils@2.0.3:
resolution:
{
integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==,
}
engines: { node: ">=0.10.0" }
dev: true
/fast-deep-equal@3.1.3:
resolution:
{
integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==,
}
dev: true
/fast-json-stable-stringify@2.1.0:
resolution:
{
integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==,
}
dev: true
/fast-levenshtein@2.0.6:
resolution:
{
integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==,
}
dev: true
/file-entry-cache@8.0.0:
resolution:
{
integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==,
}
engines: { node: ">=16.0.0" }
dependencies:
flat-cache: 4.0.1
dev: true
/find-up@5.0.0:
resolution:
{
integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==,
}
engines: { node: ">=10" }
dependencies:
locate-path: 6.0.0
path-exists: 4.0.0
dev: true
/flat-cache@4.0.1:
resolution:
{
integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==,
}
engines: { node: ">=16" }
dependencies:
flatted: 3.3.1
keyv: 4.5.4
dev: true
/flatted@3.3.1:
resolution:
{
integrity: sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==,
}
dev: true
/glob-parent@6.0.2:
resolution:
{
integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==,
}
engines: { node: ">=10.13.0" }
dependencies:
is-glob: 4.0.3
dev: true
/globals@14.0.0:
resolution:
{
integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==,
}
engines: { node: ">=18" }
dev: true
/globals@15.12.0:
resolution:
{
integrity: sha512-1+gLErljJFhbOVyaetcwJiJ4+eLe45S2E7P5UiZ9xGfeq3ATQf5DOv9G7MH3gGbKQLkzmNh2DxfZwLdw+j6oTQ==,
}
engines: { node: ">=18" }
dev: true
/has-flag@4.0.0:
resolution:
{
integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==,
}
engines: { node: ">=8" }
dev: true
/ignore@5.3.2:
resolution:
{
integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==,
}
engines: { node: ">= 4" }
dev: true
/import-fresh@3.3.0:
resolution:
{
integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==,
}
engines: { node: ">=6" }
dependencies:
parent-module: 1.0.1
resolve-from: 4.0.0
dev: true
/imurmurhash@0.1.4:
resolution:
{
integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==,
}
engines: { node: ">=0.8.19" }
dev: true
/is-extglob@2.1.1:
resolution:
{
integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==,
}
engines: { node: ">=0.10.0" }
dev: true
/is-glob@4.0.3:
resolution:
{
integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==,
}
engines: { node: ">=0.10.0" }
dependencies:
is-extglob: 2.1.1
dev: true
/isexe@2.0.0:
resolution:
{
integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==,
}
dev: true
/js-yaml@4.1.0:
resolution:
{
integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==,
}
hasBin: true
dependencies:
argparse: 2.0.1
dev: true
/json-buffer@3.0.1:
resolution:
{
integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==,
}
dev: true
/json-schema-traverse@0.4.1:
resolution:
{
integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==,
}
dev: true
/json-stable-stringify-without-jsonify@1.0.1:
resolution:
{
integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==,
}
dev: true
/keyv@4.5.4:
resolution:
{
integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==,
}
dependencies:
json-buffer: 3.0.1
dev: true
/levn@0.4.1:
resolution:
{
integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==,
}
engines: { node: ">= 0.8.0" }
dependencies:
prelude-ls: 1.2.1
type-check: 0.4.0
dev: true
/locate-path@6.0.0:
resolution:
{
integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==,
}
engines: { node: ">=10" }
dependencies:
p-locate: 5.0.0
dev: true
/lodash.merge@4.6.2:
resolution:
{
integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==,
}
dev: true
/minimatch@3.1.2:
resolution:
{
integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==,
}
dependencies:
brace-expansion: 1.1.11
dev: true
/ms@2.1.3:
resolution:
{
integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==,
}
dev: true
/natural-compare@1.4.0:
resolution:
{
integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==,
}
dev: true
/optionator@0.9.4:
resolution:
{
integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==,
}
engines: { node: ">= 0.8.0" }
dependencies:
deep-is: 0.1.4
fast-levenshtein: 2.0.6
levn: 0.4.1
prelude-ls: 1.2.1
type-check: 0.4.0
word-wrap: 1.2.5
dev: true
/p-limit@3.1.0:
resolution:
{
integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==,
}
engines: { node: ">=10" }
dependencies:
yocto-queue: 0.1.0
dev: true
/p-locate@5.0.0:
resolution:
{
integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==,
}
engines: { node: ">=10" }
dependencies:
p-limit: 3.1.0
dev: true
/parent-module@1.0.1:
resolution:
{
integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==,
}
engines: { node: ">=6" }
dependencies:
callsites: 3.1.0
dev: true
/path-exists@4.0.0:
resolution:
{
integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==,
}
engines: { node: ">=8" }
dev: true
/path-key@3.1.1:
resolution:
{
integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==,
}
engines: { node: ">=8" }
dev: true
/prelude-ls@1.2.1:
resolution:
{
integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==,
}
engines: { node: ">= 0.8.0" }
dev: true
/prettier@3.3.3:
resolution:
{
integrity: sha512-i2tDNA0O5IrMO757lfrdQZCc2jPNDVntV0m/+4whiDfWaTKfMNgR7Qz0NAeGz/nRqF4m5/6CLzbP4/liHt12Ew==,
}
engines: { node: ">=14" }
hasBin: true
dev: true
/punycode@2.3.1:
resolution:
{
integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==,
}
engines: { node: ">=6" }
dev: true
/resolve-from@4.0.0:
resolution:
{
integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==,
}
engines: { node: ">=4" }
dev: true
/shebang-command@2.0.0:
resolution:
{
integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==,
}
engines: { node: ">=8" }
dependencies:
shebang-regex: 3.0.0
dev: true
/shebang-regex@3.0.0:
resolution:
{
integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==,
}
engines: { node: ">=8" }
dev: true
/strip-json-comments@3.1.1:
resolution:
{
integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==,
}
engines: { node: ">=8" }
dev: true
/supports-color@7.2.0:
resolution:
{
integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==,
}
engines: { node: ">=8" }
dependencies:
has-flag: 4.0.0
dev: true
/text-table@0.2.0:
resolution:
{
integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==,
}
dev: true
/type-check@0.4.0:
resolution:
{
integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==,
}
engines: { node: ">= 0.8.0" }
dependencies:
prelude-ls: 1.2.1
dev: true
/uri-js@4.4.1:
resolution:
{
integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==,
}
dependencies:
punycode: 2.3.1
dev: true
/which@2.0.2:
resolution:
{
integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==,
}
engines: { node: ">= 8" }
hasBin: true
dependencies:
isexe: 2.0.0
dev: true
/word-wrap@1.2.5:
resolution:
{
integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==,
}
engines: { node: ">=0.10.0" }
dev: true
/yocto-queue@0.1.0:
resolution:
{
integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==,
}
engines: { node: ">=10" }
dev: true