diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 27f83db0..556db2e3 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -163,6 +163,18 @@ jobs: run: pnpm install working-directory: parser + - name: Download v13 WASM Artifacts 📥 + uses: actions/download-artifact@v4 + with: + name: wasm-artifacts-v13 + path: versions/13/wasm/ + + - name: Download v14 WASM Artifacts 📥 + uses: actions/download-artifact@v4 + with: + name: wasm-artifacts-v14 + path: versions/14/wasm/ + - name: Download v15 WASM Artifacts 📥 uses: actions/download-artifact@v4 with: @@ -181,6 +193,15 @@ jobs: name: wasm-artifacts-v17 path: versions/17/wasm/ + - name: Build Types Packages 🏗 + run: | + for version in 13 14 15 16 17; do + echo "Building types for v${version}..." + cd types/${version} + pnpm run build + cd ../.. + done + - name: Build Parser 🏗 run: pnpm run build working-directory: parser @@ -234,6 +255,18 @@ jobs: run: pnpm install working-directory: parser + - name: Download v13 WASM Artifacts 📥 + uses: actions/download-artifact@v4 + with: + name: wasm-artifacts-v13 + path: versions/13/wasm/ + + - name: Download v14 WASM Artifacts 📥 + uses: actions/download-artifact@v4 + with: + name: wasm-artifacts-v14 + path: versions/14/wasm/ + - name: Download v15 WASM Artifacts 📥 uses: actions/download-artifact@v4 with: diff --git a/.gitignore b/.gitignore index de4837c3..b920b6e0 100644 --- a/.gitignore +++ b/.gitignore @@ -25,3 +25,4 @@ libpg_query/**/*.proto npm-debug.log .claude .openhands/ +.DS_Store diff --git a/PUBLISH.md b/PUBLISH.md index 80775227..74574b21 100644 --- a/PUBLISH.md +++ b/PUBLISH.md @@ -41,6 +41,39 @@ This interactive script will: - Build, prepare, and publish each selected version - Optionally promote pg17 to latest +### Parser Package + +The parser package supports multiple build configurations: + +#### Full Build (all versions 13-17) +```bash +pnpm run publish:parser +# or with specific build type +PARSER_BUILD_TYPE=full pnpm run publish:parser +``` + +#### LTS Build (versions 16-17) +```bash +PARSER_BUILD_TYPE=lts pnpm run publish:parser +``` + +#### Latest Only (version 17) +```bash +PARSER_BUILD_TYPE=latest pnpm run publish:parser +``` + +#### Legacy Build (versions 13-15) +```bash +PARSER_BUILD_TYPE=legacy pnpm run publish:parser +``` + +This command will: +- Navigate to the parser directory +- Build the parser with the specified configuration +- Publish the @pgsql/parser package to npm with appropriate dist-tag +- Note: You should manually bump the version and commit changes before running this +- **Prerequisite**: The version packages must be built first as the parser copies their WASM files during build + ## Manual Publishing ### Types Packages @@ -156,4 +189,118 @@ npm dist-tag add @libpg-query/parser@pg17 latest ```bash npm install @libpg-query/parser@pg17 # PostgreSQL 17 specific npm install @libpg-query/parser # Latest version +``` + +## Parser Package (@pgsql/parser) + +### Quick Publish +```bash +cd parser +pnpm version patch +git add . && git commit -m "release: bump @pgsql/parser version" +pnpm build +pnpm test +pnpm publish +``` + +### Build Configurations + +The parser package is now a simple distribution package that copies pre-built WASM files. No TypeScript compilation needed! + +#### Available Build Types: +- **full**: All versions (13, 14, 15, 16, 17) - Default +- **lts**: LTS versions only (16, 17) +- **latest**: Latest version only (17) +- **legacy**: Legacy versions (13, 14, 15) + +```bash +# Full build (default) +npm run build + +# Specific builds +npm run build:lts +npm run build:latest +npm run build:legacy + +# Or using environment variable +PARSER_BUILD_TYPE=lts npm run build +``` + +### Build Process +The simplified parser package: +1. Copies WASM files from the `versions/*/wasm/` directories +2. Copies TypeScript type definitions from the `types/*/dist/` directories +3. Updates import paths to use local types instead of `@pgsql/types` +4. Generates index files from templates based on the build configuration +5. Creates version-specific export files +6. Creates a `build-info.json` file documenting what was included + +The templates automatically adjust to include only the versions specified in the build configuration, ensuring proper TypeScript types and runtime validation. The package is completely self-contained with all necessary types bundled. + +**Note**: Build scripts use `cross-env` for Windows compatibility. + +**Important**: Before building the parser package, ensure that the version packages are built first: +```bash +# Build all version packages first +pnpm build # builds libpg-query versions + +# Then build the parser with desired configuration +cd parser +npm run build:lts # or build:full, build:latest, etc. +``` + +### Types Bundling +The parser build process automatically: +1. Copies TypeScript type definitions from `types/*/dist/` directories +2. Places them in `wasm/v*/types/` for each version +3. Updates all import references from `@pgsql/types` to `./types` +4. Makes the package self-contained without external type dependencies + +### Publishing with Different Tags + +```bash +# Publish full version as latest +npm run build:full +npm publish + +# Publish LTS version with lts tag +npm run build:lts +npm publish --tag lts + +# Publish legacy version with legacy tag +npm run build:legacy +npm publish --tag legacy +``` + +### What it does +- Publishes `@pgsql/parser` - a multi-version PostgreSQL parser with dynamic version selection +- Provides a unified interface to work with multiple PostgreSQL versions +- Supports different build configurations for different use cases +- Includes both CommonJS and ESM builds +- Exports version-specific parsers via subpaths (e.g., `@pgsql/parser/v17`) +- **Self-contained**: Bundles TypeScript types locally (no external @pgsql/types dependency) + +### Install published package +```bash +# Install latest (full build) +npm install @pgsql/parser + +# Install LTS version +npm install @pgsql/parser@lts + +# Install legacy version +npm install @pgsql/parser@legacy + +# Use version-specific imports: +# import { parse } from '@pgsql/parser/v17' +# import { parse } from '@pgsql/parser/v16' +# import { parse } from '@pgsql/parser/v13' +``` + +### Alternative: Using npm scripts from root +```bash +# From the repository root: +pnpm build:parser # Build the parser package (full build) +PARSER_BUILD_TYPE=lts pnpm build:parser # Build LTS version +pnpm publish:parser # Publish the parser package ``` \ No newline at end of file diff --git a/package.json b/package.json index 7bdd3df6..e5a75f63 100644 --- a/package.json +++ b/package.json @@ -21,6 +21,9 @@ "publish:versions": "node scripts/publish-versions.js", "update:versions-types": "node scripts/update-versions-types.js", "build:parser": "pnpm --filter @pgsql/parser build", + "build:parser:lts": "PARSER_BUILD_TYPE=lts pnpm --filter @pgsql/parser build", + "build:parser:full": "PARSER_BUILD_TYPE=full pnpm --filter @pgsql/parser build", + "build:parser:legacy": "PARSER_BUILD_TYPE=legacy pnpm --filter @pgsql/parser build", "test:parser": "pnpm --filter @pgsql/parser test", "publish:parser": "pnpm --filter @pgsql/parser publish" }, diff --git a/parser/.gitignore b/parser/.gitignore index 261743c3..83ceb6c1 100644 --- a/parser/.gitignore +++ b/parser/.gitignore @@ -1,10 +1,4 @@ node_modules/ -dist/ -dist-esm/ +wasm/ *.log -.DS_Store -src/wasm/*.wasm -src/wasm/*.js -src/types/15/ -src/types/16/ -src/types/17/ \ No newline at end of file +.DS_Store \ No newline at end of file diff --git a/parser/Makefile.shared b/parser/Makefile.shared deleted file mode 100644 index 16f69566..00000000 --- a/parser/Makefile.shared +++ /dev/null @@ -1,42 +0,0 @@ -# Shared Makefile for building PostgreSQL parser WASM -VERSION ?= 17 -TAG_15 = 15-4.2.4 -TAG_16 = 16-5.2.0 -TAG_17 = 17-6.1.0 -TAG = $(TAG_$(VERSION)) - -# Emscripten flags -EMCC_CFLAGS = -O3 -flto -s WASM=1 -s TOTAL_MEMORY=16777216 \ - -s EXPORTED_FUNCTIONS="['_parse_sql']" \ - -s EXPORTED_RUNTIME_METHODS="['ccall','cwrap']" \ - -s MODULARIZE=1 \ - -s EXPORT_NAME="LibPGQuery$(VERSION)" - -.PHONY: all -all: clean download build-wasm - -.PHONY: download -download: - @echo "Downloading libpg_query $(TAG)..." - curl -L "https://github.com/pganalyze/libpg_query/archive/refs/tags/$(TAG).tar.gz" | tar -xz - mv libpg_query-$(TAG) libpg_query - -.PHONY: build-wasm -build-wasm: - @echo "Building WASM for PostgreSQL $(VERSION)..." - cd libpg_query && make build_shared - emcc $(EMCC_CFLAGS) \ - -I./libpg_query \ - ./wasm_wrapper.c \ - ./libpg_query/libpg_query.a \ - -o libpg-query.js - -.PHONY: clean -clean: - rm -rf libpg_query libpg-query.js libpg-query.wasm - -.PHONY: info -info: - @echo "Building PostgreSQL $(VERSION) parser" - @echo "Tag: $(TAG)" - @echo "Export name: LibPGQuery$(VERSION)" \ No newline at end of file diff --git a/parser/README.md b/parser/README.md index fb4b4795..3cac1cf3 100644 --- a/parser/README.md +++ b/parser/README.md @@ -13,12 +13,19 @@

-Multi-version PostgreSQL parser with dynamic version selection. This package provides a unified interface to parse PostgreSQL queries using different parser versions (15, 16, 17). +Multi-version PostgreSQL parser with dynamic version selection. This package provides a unified interface to parse PostgreSQL queries using different parser versions (13, 14, 15, 16, 17). ## Installation ```bash +# Install latest (full build with all versions) npm install @pgsql/parser + +# Install LTS version (PostgreSQL 16-17 only) +npm install @pgsql/parser@lts + +# Install legacy version (PostgreSQL 13-15 only) +npm install @pgsql/parser@legacy ``` ## Usage @@ -71,12 +78,12 @@ if (result.error) { ## API -### `parse(query: string, version?: 15 | 16 | 17): Promise` +### `parse(query: string, version?: 13 | 14 | 15 | 16 | 17): Promise` Parse a SQL query with the specified PostgreSQL version. - `query`: The SQL query string to parse -- `version`: PostgreSQL version (15, 16, or 17). Defaults to 17. +- `version`: PostgreSQL version (13, 14, 15, 16, or 17). Defaults to 17. Returns a promise that resolves to: - On success: `{ version: number, result: AST }` @@ -88,12 +95,14 @@ Class for creating a parser instance with a specific version. ```javascript const parser = new PgParser(version); -await parser.parse(query); -parser.parseSync(query); // Only available after first parse() +const result = await parser.parse(query); +const syncResult = parser.parseSync(query); // Only available after first parse() ``` ## Version Exports +- `@pgsql/parser/v13` - PostgreSQL 13 parser +- `@pgsql/parser/v14` - PostgreSQL 14 parser - `@pgsql/parser/v15` - PostgreSQL 15 parser - `@pgsql/parser/v16` - PostgreSQL 16 parser - `@pgsql/parser/v17` - PostgreSQL 17 parser @@ -103,6 +112,20 @@ Each version export provides: - `parse(query)`: Parse a query (async) - `parseSync(query)`: Parse a query (sync, requires loadModule first) +## Build Configurations + +This package supports different build configurations for different use cases: + +- **full** (default): All versions (13, 14, 15, 16, 17) +- **lts**: LTS versions only (16, 17) +- **latest**: Latest version only (17) +- **legacy**: Legacy versions (13, 14, 15) + +When installing from npm, you can choose the appropriate build using tags: +- `npm install @pgsql/parser` - Full build +- `npm install @pgsql/parser@lts` - LTS build +- `npm install @pgsql/parser@legacy` - Legacy build + ## Credits Built on the excellent work of several contributors: diff --git a/parser/package.json b/parser/package.json index a0106269..8a6bcb4f 100644 --- a/parser/package.json +++ b/parser/package.json @@ -1,6 +1,6 @@ { "name": "@pgsql/parser", - "version": "1.0.0", + "version": "1.0.2", "author": "Dan Lynch ", "description": "Multi-version PostgreSQL parser with dynamic version selection", "main": "./wasm/index.cjs", @@ -12,6 +12,16 @@ "require": "./wasm/index.cjs", "types": "./wasm/index.d.ts" }, + "./v13": { + "import": "./wasm/v13.js", + "require": "./wasm/v13.cjs", + "types": "./wasm/v13.d.ts" + }, + "./v14": { + "import": "./wasm/v14.js", + "require": "./wasm/v14.cjs", + "types": "./wasm/v14.d.ts" + }, "./v15": { "import": "./wasm/v15.js", "require": "./wasm/v15.cjs", @@ -29,13 +39,17 @@ } }, "files": [ - "wasm" + "wasm/**/*" ], "scripts": { - "clean": "rimraf wasm/*.js wasm/*.cjs wasm/*.d.ts cjs esm", - "build:js": "node scripts/build.js", - "build": "pnpm clean && pnpm build:js", - "test": "vitest" + "clean": "rimraf wasm", + "prepare": "node scripts/prepare.js", + "build": "npm run clean && npm run prepare", + "build:full": "npm run clean && cross-env PARSER_BUILD_TYPE=full npm run prepare", + "build:lts": "npm run clean && cross-env PARSER_BUILD_TYPE=lts npm run prepare", + "build:latest": "npm run clean && cross-env PARSER_BUILD_TYPE=latest npm run prepare", + "build:legacy": "npm run clean && cross-env PARSER_BUILD_TYPE=legacy npm run prepare", + "test": "node --test test/parser.test.js" }, "keywords": [ "postgresql", @@ -46,6 +60,7 @@ ], "license": "MIT", "devDependencies": { - "vitest": "^1.0.0" + "cross-env": "^7.0.3", + "rimraf": "^5.0.0" } } diff --git a/parser/scripts/build.js b/parser/scripts/build.js deleted file mode 100644 index 90a73ecb..00000000 --- a/parser/scripts/build.js +++ /dev/null @@ -1,61 +0,0 @@ -const fs = require('fs'); -const path = require('path'); -const { execSync } = require('child_process'); - -// Run TypeScript compilation -console.log('Compiling TypeScript...'); - -// Try to find tsc in different locations -let tscPath = path.join(__dirname, '../node_modules/.bin/tsc'); -if (!fs.existsSync(tscPath)) { - // Try workspace root - tscPath = path.join(__dirname, '../../../node_modules/.bin/tsc'); -} -if (!fs.existsSync(tscPath)) { - // Try using npx as fallback - console.log('Using npx to run TypeScript compiler...'); - execSync('npx tsc', { stdio: 'inherit', cwd: path.join(__dirname, '..') }); - execSync('npx tsc -p tsconfig.esm.json', { stdio: 'inherit', cwd: path.join(__dirname, '..') }); -} else { - execSync(`${tscPath}`, { stdio: 'inherit', cwd: path.join(__dirname, '..') }); - execSync(`${tscPath} -p tsconfig.esm.json`, { stdio: 'inherit', cwd: path.join(__dirname, '..') }); -} - -// Rename files to have correct extensions -const wasmDir = path.join(__dirname, '../wasm'); -const cjsDir = path.join(__dirname, '../cjs'); -const esmDir = path.join(__dirname, '../esm'); - -// Ensure wasm directory exists -if (!fs.existsSync(wasmDir)) { - fs.mkdirSync(wasmDir, { recursive: true }); -} - -// Function to rename and move files -function moveFile(from, to) { - if (fs.existsSync(from)) { - fs.renameSync(from, to); - } -} - -// Move main index files -moveFile(path.join(cjsDir, 'index.js'), path.join(wasmDir, 'index.cjs')); -moveFile(path.join(esmDir, 'index.js'), path.join(wasmDir, 'index.js')); -moveFile(path.join(cjsDir, 'index.d.ts'), path.join(wasmDir, 'index.d.ts')); - -// Move version-specific files -['v15', 'v16', 'v17'].forEach(version => { - moveFile(path.join(cjsDir, `${version}.js`), path.join(wasmDir, `${version}.cjs`)); - moveFile(path.join(esmDir, `${version}.js`), path.join(wasmDir, `${version}.js`)); - moveFile(path.join(cjsDir, `${version}.d.ts`), path.join(wasmDir, `${version}.d.ts`)); -}); - -// Clean up temporary directories -if (fs.existsSync(cjsDir)) { - fs.rmSync(cjsDir, { recursive: true }); -} -if (fs.existsSync(esmDir)) { - fs.rmSync(esmDir, { recursive: true }); -} - -console.log('Build completed successfully!'); \ No newline at end of file diff --git a/parser/scripts/prepare.js b/parser/scripts/prepare.js new file mode 100644 index 00000000..5d037b21 --- /dev/null +++ b/parser/scripts/prepare.js @@ -0,0 +1,203 @@ +const fs = require('fs'); +const path = require('path'); + +// Build configurations for different tags +const BUILD_CONFIGS = { + 'full': { + versions: ['13', '14', '15', '16', '17'], + description: 'Full build with all PostgreSQL versions (13-17)' + }, + 'lts': { + versions: ['15', '16', '17'], // Current LTS versions + description: 'LTS build with PostgreSQL 16 and 17' + }, + 'legacy': { + versions: ['13', '14', '15'], + description: 'Legacy versions (13-15)' + } +}; + +// Get build type from environment or default to 'full' +const buildType = process.env.PARSER_BUILD_TYPE || 'full'; +const config = BUILD_CONFIGS[buildType]; + +if (!config) { + console.error(`Invalid build type: ${buildType}`); + console.error('Available build types:', Object.keys(BUILD_CONFIGS).join(', ')); + process.exit(1); +} + +console.log(`Building parser package: ${buildType}`); +console.log(`Description: ${config.description}`); +console.log(`Versions: ${config.versions.join(', ')}`); +console.log(''); + +// Ensure wasm directory exists +const wasmDir = path.join(__dirname, '../wasm'); +if (!fs.existsSync(wasmDir)) { + fs.mkdirSync(wasmDir, { recursive: true }); +} + +// Helper function to generate template variables +function generateTemplateVars(versions) { + const defaultVersion = versions[versions.length - 1]; // Use highest version as default + + // For JavaScript array: [13, 14, 15, 16, 17] + const versionsArray = versions.join(', '); + + // For TypeScript union: 13 | 14 | 15 | 16 | 17 + const versionUnion = versions.join(' | '); + + // For ESM exports: export * as v13 from './v13/index.js'; + const versionExports = versions.map(v => `export * as v${v} from './v${v}/index.js';`).join('\n'); + + // For CommonJS requires: v13: require('./v13/index.cjs'), + const versionRequires = versions.map(v => ` v${v}: require('./v${v}/index.cjs')`).join(',\n'); + + // For TypeScript exports: export * as v13 from './v13/index'; + const versionTypeExports = versions.map(v => `export * as v${v} from './v${v}/index';`).join('\n'); + + return { + DEFAULT_VERSION: defaultVersion, + VERSIONS: versionsArray, + VERSION_UNION: versionUnion, + VERSION_EXPORTS: versionExports, + VERSION_REQUIRES: versionRequires, + VERSION_TYPE_EXPORTS: versionTypeExports + }; +} + +// Process template file +function processTemplate(templatePath, outputPath, vars) { + let content = fs.readFileSync(templatePath, 'utf8'); + + // Replace all template variables + Object.entries(vars).forEach(([key, value]) => { + const regex = new RegExp(`\\$\\{${key}\\}`, 'g'); + content = content.replace(regex, value); + }); + + fs.writeFileSync(outputPath, content); + console.log(`Generated ${path.basename(outputPath)} from template`); +} + +// Copy WASM files for each version in the config +config.versions.forEach(version => { + const versionWasmDir = path.join(wasmDir, `v${version}`); + const sourceWasmDir = path.join(__dirname, `../../versions/${version}/wasm`); + + // Create version directory + if (!fs.existsSync(versionWasmDir)) { + fs.mkdirSync(versionWasmDir, { recursive: true }); + } + + // Check if source WASM files exist + if (!fs.existsSync(sourceWasmDir)) { + console.error(`Warning: WASM files for version ${version} not found at ${sourceWasmDir}`); + console.error(`Please build version ${version} first with: cd versions/${version} && pnpm build`); + return; + } + + // Copy all files from source wasm directory + const files = fs.readdirSync(sourceWasmDir); + files.forEach(file => { + const sourcePath = path.join(sourceWasmDir, file); + const destPath = path.join(versionWasmDir, file); + + if (fs.statSync(sourcePath).isFile()) { + console.log(`Copying ${file} for v${version}...`); + fs.copyFileSync(sourcePath, destPath); + + // Update any references to @pgsql/types to use local types + if (file.endsWith('.js') || file.endsWith('.cjs') || file.endsWith('.d.ts')) { + let content = fs.readFileSync(destPath, 'utf8'); + content = content.replace(/@pgsql\/types/g, './types'); + fs.writeFileSync(destPath, content); + } + } + }); + + // Copy types files + const typesSourceDir = path.join(__dirname, `../../types/${version}/dist`); + const typesTargetDir = path.join(versionWasmDir, 'types'); + + if (fs.existsSync(typesSourceDir)) { + // Create types directory + if (!fs.existsSync(typesTargetDir)) { + fs.mkdirSync(typesTargetDir, { recursive: true }); + } + + // Copy essential type files + const typeFiles = ['index.d.ts', 'index.js', 'types.d.ts', 'types.js', 'enums.d.ts', 'enums.js']; + typeFiles.forEach(file => { + const sourcePath = path.join(typesSourceDir, file); + const destPath = path.join(typesTargetDir, file); + + if (fs.existsSync(sourcePath)) { + console.log(`Copying types/${file} for v${version}...`); + fs.copyFileSync(sourcePath, destPath); + } + }); + } else { + console.warn(`Warning: Types for version ${version} not found at ${typesSourceDir}`); + } +}); + +// Generate files from templates +const templateDir = path.join(__dirname, '../templates'); +const templateVars = generateTemplateVars(config.versions); + +// Process each template +const templates = [ + { template: 'index.js.template', output: 'index.js' }, + { template: 'index.cjs.template', output: 'index.cjs' }, + { template: 'index.d.ts.template', output: 'index.d.ts' } +]; + +templates.forEach(({ template, output }) => { + const templatePath = path.join(templateDir, template); + const outputPath = path.join(wasmDir, output); + + if (fs.existsSync(templatePath)) { + processTemplate(templatePath, outputPath, templateVars); + } else { + console.error(`Template not found: ${templatePath}`); + } +}); + +// Create version-specific export files +config.versions.forEach(version => { + // ESM version + const esmContent = `// Re-export everything from the v${version} parser +export * from './v${version}/index.js'; +`; + fs.writeFileSync(path.join(wasmDir, `v${version}.js`), esmContent); + + // CJS version + const cjsContent = `// Re-export everything from the v${version} parser +module.exports = require('./v${version}/index.cjs'); +`; + fs.writeFileSync(path.join(wasmDir, `v${version}.cjs`), cjsContent); + + // TypeScript definitions + const dtsContent = `// Re-export types from the v${version} parser +export * from './v${version}/index'; +`; + fs.writeFileSync(path.join(wasmDir, `v${version}.d.ts`), dtsContent); +}); + +// Create a build info file +const buildInfo = { + buildType, + versions: config.versions, + description: config.description, + buildTime: new Date().toISOString() +}; + +fs.writeFileSync( + path.join(wasmDir, 'build-info.json'), + JSON.stringify(buildInfo, null, 2) +); + +console.log('\nPrepare completed successfully!'); +console.log(`Build info saved to wasm/build-info.json`); \ No newline at end of file diff --git a/parser/src/index.ts b/parser/src/index.ts deleted file mode 100644 index 5f683114..00000000 --- a/parser/src/index.ts +++ /dev/null @@ -1,75 +0,0 @@ -// Dynamic parser that loads the specified version at runtime -export class PgParser { - private version: 15 | 16 | 17; - private parser: any; - - constructor(version: 15 | 16 | 17 = 17) { - this.version = version; - } - - private async loadParser() { - if (this.parser) return; - - switch (this.version) { - case 15: - this.parser = await import('../../versions/15/wasm/index.js'); - break; - case 16: - this.parser = await import('../../versions/16/wasm/index.js'); - break; - case 17: - this.parser = await import('../../versions/17/wasm/index.js'); - break; - } - - if (this.parser.loadModule) { - await this.parser.loadModule(); - } - } - - async parse(query: string): Promise { - await this.loadParser(); - try { - const result = await this.parser.parse(query); - return { version: this.version, result }; - } catch (error: any) { - return { - version: this.version, - error: { - type: 'syntax', - message: error.message, - position: 0 - } - }; - } - } - - parseSync(query: string): any { - if (!this.parser) { - throw new Error('Parser not loaded. Call parse() first or use parseSync after parse()'); - } - try { - const result = this.parser.parseSync(query); - return { version: this.version, result }; - } catch (error: any) { - return { - version: this.version, - error: { - type: 'syntax', - message: error.message, - position: 0 - } - }; - } - } -} - -// Convenience functions -export async function parse(query: string, version: 15 | 16 | 17 = 17) { - const parser = new PgParser(version); - return parser.parse(query); -} - -export function parseSync(query: string, version: 15 | 16 | 17 = 17) { - throw new Error('parseSync requires parser to be loaded first. Use parse() or create a PgParser instance.'); -} \ No newline at end of file diff --git a/parser/src/v15.ts b/parser/src/v15.ts deleted file mode 100644 index 71eef236..00000000 --- a/parser/src/v15.ts +++ /dev/null @@ -1,2 +0,0 @@ -// Re-export everything from the v15 parser -export * from '../../versions/15/wasm/index.js'; \ No newline at end of file diff --git a/parser/src/v16.ts b/parser/src/v16.ts deleted file mode 100644 index f45e4e2e..00000000 --- a/parser/src/v16.ts +++ /dev/null @@ -1,2 +0,0 @@ -// Re-export everything from the v16 parser -export * from '../../versions/16/wasm/index.js'; \ No newline at end of file diff --git a/parser/src/v17.ts b/parser/src/v17.ts deleted file mode 100644 index e421ce77..00000000 --- a/parser/src/v17.ts +++ /dev/null @@ -1,2 +0,0 @@ -// Re-export everything from the v17 parser -export * from '../../versions/17/wasm/index.js'; \ No newline at end of file diff --git a/parser/templates/index.cjs.template b/parser/templates/index.cjs.template new file mode 100644 index 00000000..7f595cb1 --- /dev/null +++ b/parser/templates/index.cjs.template @@ -0,0 +1,69 @@ +// CommonJS entry point for @pgsql/parser +// Provides dynamic version loading for PostgreSQL parsers + +class Parser { + constructor(version = ${DEFAULT_VERSION}) { + if (![${VERSIONS}].includes(version)) { + throw new Error(`Unsupported PostgreSQL version: ${version}. Supported versions are ${VERSIONS}.`); + } + this.version = version; + this.parser = null; + } + + async loadParser() { + if (this.parser) return; + + // Dynamic require for CommonJS + this.parser = require(`./v${this.version}/index.cjs`); + + if (this.parser.loadModule) { + await this.parser.loadModule(); + } + } + + async parse(query) { + await this.loadParser(); + try { + return this.parser.parse(query); + } catch (error) { + throw new Error(`Parse error in PostgreSQL ${this.version}: ${error.message}`); + } + } + + parseSync(query) { + if (!this.parser) { + throw new Error('Parser not loaded. Call parse() first or use parseSync after loading.'); + } + if (!this.parser.parseSync) { + throw new Error(`parseSync not supported in PostgreSQL ${this.version}`); + } + try { + return this.parser.parseSync(query); + } catch (error) { + throw new Error(`Parse error in PostgreSQL ${this.version}: ${error.message}`); + } + } + + async fingerprint(query) { + await this.loadParser(); + if (this.parser.fingerprint) { + return this.parser.fingerprint(query); + } + throw new Error(`Fingerprint not supported in PostgreSQL ${this.version}`); + } + + async normalize(query) { + await this.loadParser(); + if (this.parser.normalize) { + return this.parser.normalize(query); + } + throw new Error(`Normalize not supported in PostgreSQL ${this.version}`); + } +} + +// Export versions +module.exports = { + Parser, + default: Parser, +${VERSION_REQUIRES} +}; \ No newline at end of file diff --git a/parser/templates/index.d.ts.template b/parser/templates/index.d.ts.template new file mode 100644 index 00000000..39ffd96f --- /dev/null +++ b/parser/templates/index.d.ts.template @@ -0,0 +1,30 @@ +// TypeScript definitions for @pgsql/parser + +export interface ParseResult { + parse_tree?: any; + stderr_buffer?: string; + error?: { + message: string; + funcname: string; + filename: string; + lineno: number; + cursorpos: number; + context?: string; + }; +} + +export declare class Parser { + constructor(version?: ${VERSION_UNION}); + parse(query: string): Promise; + parseSync(query: string): ParseResult; + fingerprint(query: string): Promise; + normalize(query: string): Promise; +} + +export default Parser; + +// Version-specific exports +${VERSION_TYPE_EXPORTS} + +// Re-export types from the default version +export * from './v${DEFAULT_VERSION}/types'; \ No newline at end of file diff --git a/parser/templates/index.js.template b/parser/templates/index.js.template new file mode 100644 index 00000000..e7ff6fdf --- /dev/null +++ b/parser/templates/index.js.template @@ -0,0 +1,68 @@ +// Main entry point for @pgsql/parser +// Provides dynamic version loading for PostgreSQL parsers + +export class Parser { + constructor(version = ${DEFAULT_VERSION}) { + if (![${VERSIONS}].includes(version)) { + throw new Error(`Unsupported PostgreSQL version: ${version}. Supported versions are ${VERSIONS}.`); + } + this.version = version; + this.parser = null; + } + + async loadParser() { + if (this.parser) return; + + const module = await import(`./v${this.version}/index.js`); + this.parser = module; + + if (this.parser.loadModule) { + await this.parser.loadModule(); + } + } + + async parse(query) { + await this.loadParser(); + try { + return this.parser.parse(query); + } catch (error) { + throw new Error(`Parse error in PostgreSQL ${this.version}: ${error.message}`); + } + } + + parseSync(query) { + if (!this.parser) { + throw new Error('Parser not loaded. Call parse() first or use parseSync after loading.'); + } + if (!this.parser.parseSync) { + throw new Error(`parseSync not supported in PostgreSQL ${this.version}`); + } + try { + return this.parser.parseSync(query); + } catch (error) { + throw new Error(`Parse error in PostgreSQL ${this.version}: ${error.message}`); + } + } + + async fingerprint(query) { + await this.loadParser(); + if (this.parser.fingerprint) { + return this.parser.fingerprint(query); + } + throw new Error(`Fingerprint not supported in PostgreSQL ${this.version}`); + } + + async normalize(query) { + await this.loadParser(); + if (this.parser.normalize) { + return this.parser.normalize(query); + } + throw new Error(`Normalize not supported in PostgreSQL ${this.version}`); + } +} + +// Re-export all versions for direct access +${VERSION_EXPORTS} + +// Default export +export default Parser; \ No newline at end of file diff --git a/parser/test/parser.test.js b/parser/test/parser.test.js new file mode 100644 index 00000000..dfc5f940 --- /dev/null +++ b/parser/test/parser.test.js @@ -0,0 +1,91 @@ +const { describe, it, before } = require('node:test'); +const assert = require('node:assert/strict'); +const { Parser } = require('../wasm/index.cjs'); + +describe('Parser', () => { + describe('Dynamic API', () => { + it('should parse SQL with default version', async () => { + const parser = new Parser(); + const result = await parser.parse('SELECT 1+1 as sum'); + assert.ok(result); + assert.ok(result.stmts); + assert.equal(result.stmts.length, 1); + }); + + it('should parse SQL with specific version', async () => { + // Get available versions from the Parser class + const parser = new Parser(); + const defaultVersion = parser.version; + + // Test with a different version if available + const testVersion = defaultVersion === 17 ? 16 : 15; + try { + const versionParser = new Parser(testVersion); + const result = await versionParser.parse('SELECT 1+1 as sum'); + assert.equal(versionParser.version, testVersion); + assert.ok(result); + } catch (e) { + // Version might not be available in this build + console.log(`Version ${testVersion} not available in this build`); + } + }); + + it('should handle parse errors', async () => { + const parser = new Parser(); + try { + await parser.parse('INVALID SQL'); + assert.fail('Should have thrown an error'); + } catch (error) { + assert.ok(error); + assert.ok(error.message.includes('syntax error')); + } + }); + + it('should work with Parser class', async () => { + const parser = new Parser(); + const result = await parser.parse('SELECT * FROM users'); + assert.ok(result); + assert.ok(result.stmts); + }); + + it('should validate version in constructor', () => { + // Test invalid version + assert.throws(() => { + new Parser(99); + }, /Unsupported PostgreSQL version/); + }); + + it('should support parseSync after initial parse', async () => { + const parser = new Parser(); + + // First parse to initialize + await parser.parse('SELECT 1'); + + // Now parseSync should work + const result = parser.parseSync('SELECT 2+2 as sum'); + assert.ok(result); + assert.ok(result.stmts); + assert.equal(result.stmts.length, 1); + }); + }); + + describe('Version-specific imports', () => { + // Dynamically test available version imports + const versions = [13, 14, 15, 16, 17]; + + for (const version of versions) { + it(`should parse with v${version} if available`, async () => { + try { + const versionModule = require(`../wasm/v${version}.cjs`); + await versionModule.loadModule(); + const result = await versionModule.parse('SELECT 1'); + assert.ok(result); + assert.equal(result.stmts.length, 1); + } catch (e) { + // Version not available in this build + console.log(`Version ${version} not available in this build`); + } + }); + } + }); +}); \ No newline at end of file diff --git a/parser/tsconfig.esm.json b/parser/tsconfig.esm.json deleted file mode 100644 index 487f9c55..00000000 --- a/parser/tsconfig.esm.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "extends": "./tsconfig.json", - "compilerOptions": { - "module": "esnext", - "outDir": "esm/" - } -} diff --git a/parser/tsconfig.json b/parser/tsconfig.json deleted file mode 100644 index d7da207b..00000000 --- a/parser/tsconfig.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "compilerOptions": { - "target": "es2022", - "module": "commonjs", - "esModuleInterop": true, - "forceConsistentCasingInFileNames": true, - "strict": true, - "strictNullChecks": false, - "skipLibCheck": true, - "sourceMap": false, - "declaration": true, - "resolveJsonModule": true, - "moduleResolution": "node", - "outDir": "cjs/", - "rootDir": "src" - }, - "exclude": ["cjs", "esm", "wasm", "node_modules", "**/*.test.ts"] -} \ No newline at end of file diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index a9e7eb60..5f66af9f 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -80,9 +80,12 @@ importers: parser: devDependencies: - vitest: - specifier: ^1.0.0 - version: 1.6.1(@types/node@20.19.1) + cross-env: + specifier: ^7.0.3 + version: 7.0.3 + rimraf: + specifier: ^5.0.0 + version: 5.0.10 types/13: devDependencies: @@ -269,213 +272,6 @@ packages: '@jridgewell/trace-mapping': 0.3.9 dev: true - /@esbuild/aix-ppc64@0.21.5: - resolution: {integrity: sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==} - engines: {node: '>=12'} - cpu: [ppc64] - os: [aix] - requiresBuild: true - dev: true - optional: true - - /@esbuild/android-arm64@0.21.5: - resolution: {integrity: sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==} - engines: {node: '>=12'} - cpu: [arm64] - os: [android] - requiresBuild: true - dev: true - optional: true - - /@esbuild/android-arm@0.21.5: - resolution: {integrity: sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==} - engines: {node: '>=12'} - cpu: [arm] - os: [android] - requiresBuild: true - dev: true - optional: true - - /@esbuild/android-x64@0.21.5: - resolution: {integrity: sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==} - engines: {node: '>=12'} - cpu: [x64] - os: [android] - requiresBuild: true - dev: true - optional: true - - /@esbuild/darwin-arm64@0.21.5: - resolution: {integrity: sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==} - engines: {node: '>=12'} - cpu: [arm64] - os: [darwin] - requiresBuild: true - dev: true - optional: true - - /@esbuild/darwin-x64@0.21.5: - resolution: {integrity: sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==} - engines: {node: '>=12'} - cpu: [x64] - os: [darwin] - requiresBuild: true - dev: true - optional: true - - /@esbuild/freebsd-arm64@0.21.5: - resolution: {integrity: sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==} - engines: {node: '>=12'} - cpu: [arm64] - os: [freebsd] - requiresBuild: true - dev: true - optional: true - - /@esbuild/freebsd-x64@0.21.5: - resolution: {integrity: sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==} - engines: {node: '>=12'} - cpu: [x64] - os: [freebsd] - requiresBuild: true - dev: true - optional: true - - /@esbuild/linux-arm64@0.21.5: - resolution: {integrity: sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==} - engines: {node: '>=12'} - cpu: [arm64] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@esbuild/linux-arm@0.21.5: - resolution: {integrity: sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==} - engines: {node: '>=12'} - cpu: [arm] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@esbuild/linux-ia32@0.21.5: - resolution: {integrity: sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==} - engines: {node: '>=12'} - cpu: [ia32] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@esbuild/linux-loong64@0.21.5: - resolution: {integrity: sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==} - engines: {node: '>=12'} - cpu: [loong64] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@esbuild/linux-mips64el@0.21.5: - resolution: {integrity: sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==} - engines: {node: '>=12'} - cpu: [mips64el] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@esbuild/linux-ppc64@0.21.5: - resolution: {integrity: sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==} - engines: {node: '>=12'} - cpu: [ppc64] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@esbuild/linux-riscv64@0.21.5: - resolution: {integrity: sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==} - engines: {node: '>=12'} - cpu: [riscv64] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@esbuild/linux-s390x@0.21.5: - resolution: {integrity: sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==} - engines: {node: '>=12'} - cpu: [s390x] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@esbuild/linux-x64@0.21.5: - resolution: {integrity: sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==} - engines: {node: '>=12'} - cpu: [x64] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@esbuild/netbsd-x64@0.21.5: - resolution: {integrity: sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==} - engines: {node: '>=12'} - cpu: [x64] - os: [netbsd] - requiresBuild: true - dev: true - optional: true - - /@esbuild/openbsd-x64@0.21.5: - resolution: {integrity: sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==} - engines: {node: '>=12'} - cpu: [x64] - os: [openbsd] - requiresBuild: true - dev: true - optional: true - - /@esbuild/sunos-x64@0.21.5: - resolution: {integrity: sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==} - engines: {node: '>=12'} - cpu: [x64] - os: [sunos] - requiresBuild: true - dev: true - optional: true - - /@esbuild/win32-arm64@0.21.5: - resolution: {integrity: sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==} - engines: {node: '>=12'} - cpu: [arm64] - os: [win32] - requiresBuild: true - dev: true - optional: true - - /@esbuild/win32-ia32@0.21.5: - resolution: {integrity: sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==} - engines: {node: '>=12'} - cpu: [ia32] - os: [win32] - requiresBuild: true - dev: true - optional: true - - /@esbuild/win32-x64@0.21.5: - resolution: {integrity: sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==} - engines: {node: '>=12'} - cpu: [x64] - os: [win32] - requiresBuild: true - dev: true - optional: true - /@isaacs/cliui@8.0.2: resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} engines: {node: '>=12'} @@ -488,13 +284,6 @@ packages: wrap-ansi-cjs: /wrap-ansi@7.0.0 dev: true - /@jest/schemas@29.6.3: - resolution: {integrity: sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@sinclair/typebox': 0.27.8 - dev: true - /@jridgewell/gen-mapping@0.3.8: resolution: {integrity: sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==} engines: {node: '>=6.0.0'} @@ -654,170 +443,6 @@ packages: /@protobufjs/utf8@1.1.0: resolution: {integrity: sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==} - /@rollup/rollup-android-arm-eabi@4.44.0: - resolution: {integrity: sha512-xEiEE5oDW6tK4jXCAyliuntGR+amEMO7HLtdSshVuhFnKTYoeYMyXQK7pLouAJJj5KHdwdn87bfHAR2nSdNAUA==} - cpu: [arm] - os: [android] - requiresBuild: true - dev: true - optional: true - - /@rollup/rollup-android-arm64@4.44.0: - resolution: {integrity: sha512-uNSk/TgvMbskcHxXYHzqwiyBlJ/lGcv8DaUfcnNwict8ba9GTTNxfn3/FAoFZYgkaXXAdrAA+SLyKplyi349Jw==} - cpu: [arm64] - os: [android] - requiresBuild: true - dev: true - optional: true - - /@rollup/rollup-darwin-arm64@4.44.0: - resolution: {integrity: sha512-VGF3wy0Eq1gcEIkSCr8Ke03CWT+Pm2yveKLaDvq51pPpZza3JX/ClxXOCmTYYq3us5MvEuNRTaeyFThCKRQhOA==} - cpu: [arm64] - os: [darwin] - requiresBuild: true - dev: true - optional: true - - /@rollup/rollup-darwin-x64@4.44.0: - resolution: {integrity: sha512-fBkyrDhwquRvrTxSGH/qqt3/T0w5Rg0L7ZIDypvBPc1/gzjJle6acCpZ36blwuwcKD/u6oCE/sRWlUAcxLWQbQ==} - cpu: [x64] - os: [darwin] - requiresBuild: true - dev: true - optional: true - - /@rollup/rollup-freebsd-arm64@4.44.0: - resolution: {integrity: sha512-u5AZzdQJYJXByB8giQ+r4VyfZP+walV+xHWdaFx/1VxsOn6eWJhK2Vl2eElvDJFKQBo/hcYIBg/jaKS8ZmKeNQ==} - cpu: [arm64] - os: [freebsd] - requiresBuild: true - dev: true - optional: true - - /@rollup/rollup-freebsd-x64@4.44.0: - resolution: {integrity: sha512-qC0kS48c/s3EtdArkimctY7h3nHicQeEUdjJzYVJYR3ct3kWSafmn6jkNCA8InbUdge6PVx6keqjk5lVGJf99g==} - cpu: [x64] - os: [freebsd] - requiresBuild: true - dev: true - optional: true - - /@rollup/rollup-linux-arm-gnueabihf@4.44.0: - resolution: {integrity: sha512-x+e/Z9H0RAWckn4V2OZZl6EmV0L2diuX3QB0uM1r6BvhUIv6xBPL5mrAX2E3e8N8rEHVPwFfz/ETUbV4oW9+lQ==} - cpu: [arm] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@rollup/rollup-linux-arm-musleabihf@4.44.0: - resolution: {integrity: sha512-1exwiBFf4PU/8HvI8s80icyCcnAIB86MCBdst51fwFmH5dyeoWVPVgmQPcKrMtBQ0W5pAs7jBCWuRXgEpRzSCg==} - cpu: [arm] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@rollup/rollup-linux-arm64-gnu@4.44.0: - resolution: {integrity: sha512-ZTR2mxBHb4tK4wGf9b8SYg0Y6KQPjGpR4UWwTFdnmjB4qRtoATZ5dWn3KsDwGa5Z2ZBOE7K52L36J9LueKBdOQ==} - cpu: [arm64] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@rollup/rollup-linux-arm64-musl@4.44.0: - resolution: {integrity: sha512-GFWfAhVhWGd4r6UxmnKRTBwP1qmModHtd5gkraeW2G490BpFOZkFtem8yuX2NyafIP/mGpRJgTJ2PwohQkUY/Q==} - cpu: [arm64] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@rollup/rollup-linux-loongarch64-gnu@4.44.0: - resolution: {integrity: sha512-xw+FTGcov/ejdusVOqKgMGW3c4+AgqrfvzWEVXcNP6zq2ue+lsYUgJ+5Rtn/OTJf7e2CbgTFvzLW2j0YAtj0Gg==} - cpu: [loong64] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@rollup/rollup-linux-powerpc64le-gnu@4.44.0: - resolution: {integrity: sha512-bKGibTr9IdF0zr21kMvkZT4K6NV+jjRnBoVMt2uNMG0BYWm3qOVmYnXKzx7UhwrviKnmK46IKMByMgvpdQlyJQ==} - cpu: [ppc64] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@rollup/rollup-linux-riscv64-gnu@4.44.0: - resolution: {integrity: sha512-vV3cL48U5kDaKZtXrti12YRa7TyxgKAIDoYdqSIOMOFBXqFj2XbChHAtXquEn2+n78ciFgr4KIqEbydEGPxXgA==} - cpu: [riscv64] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@rollup/rollup-linux-riscv64-musl@4.44.0: - resolution: {integrity: sha512-TDKO8KlHJuvTEdfw5YYFBjhFts2TR0VpZsnLLSYmB7AaohJhM8ctDSdDnUGq77hUh4m/djRafw+9zQpkOanE2Q==} - cpu: [riscv64] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@rollup/rollup-linux-s390x-gnu@4.44.0: - resolution: {integrity: sha512-8541GEyktXaw4lvnGp9m84KENcxInhAt6vPWJ9RodsB/iGjHoMB2Pp5MVBCiKIRxrxzJhGCxmNzdu+oDQ7kwRA==} - cpu: [s390x] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@rollup/rollup-linux-x64-gnu@4.44.0: - resolution: {integrity: sha512-iUVJc3c0o8l9Sa/qlDL2Z9UP92UZZW1+EmQ4xfjTc1akr0iUFZNfxrXJ/R1T90h/ILm9iXEY6+iPrmYB3pXKjw==} - cpu: [x64] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@rollup/rollup-linux-x64-musl@4.44.0: - resolution: {integrity: sha512-PQUobbhLTQT5yz/SPg116VJBgz+XOtXt8D1ck+sfJJhuEsMj2jSej5yTdp8CvWBSceu+WW+ibVL6dm0ptG5fcA==} - cpu: [x64] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@rollup/rollup-win32-arm64-msvc@4.44.0: - resolution: {integrity: sha512-M0CpcHf8TWn+4oTxJfh7LQuTuaYeXGbk0eageVjQCKzYLsajWS/lFC94qlRqOlyC2KvRT90ZrfXULYmukeIy7w==} - cpu: [arm64] - os: [win32] - requiresBuild: true - dev: true - optional: true - - /@rollup/rollup-win32-ia32-msvc@4.44.0: - resolution: {integrity: sha512-3XJ0NQtMAXTWFW8FqZKcw3gOQwBtVWP/u8TpHP3CRPXD7Pd6s8lLdH3sHWh8vqKCyyiI8xW5ltJScQmBU9j7WA==} - cpu: [ia32] - os: [win32] - requiresBuild: true - dev: true - optional: true - - /@rollup/rollup-win32-x64-msvc@4.44.0: - resolution: {integrity: sha512-Q2Mgwt+D8hd5FIPUuPDsvPR7Bguza6yTkJxspDGkZj7tBRn2y4KSWYuIXpftFSjBra76TbKerCV7rgFPQrn+wQ==} - cpu: [x64] - os: [win32] - requiresBuild: true - dev: true - optional: true - - /@sinclair/typebox@0.27.8: - resolution: {integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==} - dev: true - /@tsconfig/node10@1.0.11: resolution: {integrity: sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==} dev: true @@ -834,10 +459,6 @@ packages: resolution: {integrity: sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==} dev: true - /@types/estree@1.0.8: - resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} - dev: true - /@types/linkify-it@5.0.0: resolution: {integrity: sha512-sVDA58zAw4eWAffKOaQH5/5j3XeayukzDk+ewSsnv3p4yJEZHCCzMDiZM8e0OUrRvmpGZ85jf4yDHkHsgBNr9Q==} dev: true @@ -858,45 +479,6 @@ packages: dependencies: undici-types: 6.21.0 - /@vitest/expect@1.6.1: - resolution: {integrity: sha512-jXL+9+ZNIJKruofqXuuTClf44eSpcHlgj3CiuNihUF3Ioujtmc0zIa3UJOW5RjDK1YLBJZnWBlPuqhYycLioog==} - dependencies: - '@vitest/spy': 1.6.1 - '@vitest/utils': 1.6.1 - chai: 4.5.0 - dev: true - - /@vitest/runner@1.6.1: - resolution: {integrity: sha512-3nSnYXkVkf3mXFfE7vVyPmi3Sazhb/2cfZGGs0JRzFsPFvAMBEcrweV1V1GsrstdXeKCTXlJbvnQwGWgEIHmOA==} - dependencies: - '@vitest/utils': 1.6.1 - p-limit: 5.0.0 - pathe: 1.1.2 - dev: true - - /@vitest/snapshot@1.6.1: - resolution: {integrity: sha512-WvidQuWAzU2p95u8GAKlRMqMyN1yOJkGHnx3M1PL9Raf7AQ1kwLKg04ADlCa3+OXUZE7BceOhVZiuWAbzCKcUQ==} - dependencies: - magic-string: 0.30.17 - pathe: 1.1.2 - pretty-format: 29.7.0 - dev: true - - /@vitest/spy@1.6.1: - resolution: {integrity: sha512-MGcMmpGkZebsMZhbQKkAf9CX5zGvjkBTqf8Zx3ApYWXr3wG+QvEu2eXWfnIIWYSJExIp4V9FCKDEeygzkYrXMw==} - dependencies: - tinyspy: 2.2.1 - dev: true - - /@vitest/utils@1.6.1: - resolution: {integrity: sha512-jOrrUvXM4Av9ZWiG1EajNto0u96kWAhJ1LmPmJhXXQx/32MecEKd10pOLYgS2BQx1TgkGhloPU1ArDW2vvaY6g==} - dependencies: - diff-sequences: 29.6.3 - estree-walker: 3.0.3 - loupe: 2.3.7 - pretty-format: 29.7.0 - dev: true - /@yamlize/cli@0.8.0: resolution: {integrity: sha512-OuhQ/gYLCuMjENdLMF8UXgM32p7blBB0FxwS4R2Mw4jk/9uvv87uCz2ptq9VB7GjNTNbnRTQKw+bAbwCXyngCA==} hasBin: true @@ -946,11 +528,6 @@ packages: color-convert: 2.0.1 dev: true - /ansi-styles@5.2.0: - resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} - engines: {node: '>=10'} - dev: true - /ansi-styles@6.2.1: resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} engines: {node: '>=12'} @@ -964,10 +541,6 @@ packages: resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} dev: true - /assertion-error@1.1.0: - resolution: {integrity: sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==} - dev: true - /balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} dev: true @@ -989,11 +562,6 @@ packages: balanced-match: 1.0.2 dev: true - /cac@6.7.14: - resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} - engines: {node: '>=8'} - dev: true - /case@1.6.3: resolution: {integrity: sha512-mzDSXIPaFwVDvZAHqZ9VlbyF4yyXRuX6IvB06WvPYkqJVO24kX1PPhv9bfpKNFZyxYFmmgo03HUiD8iklmJYRQ==} engines: {node: '>= 0.8.0'} @@ -1006,19 +574,6 @@ packages: lodash: 4.17.21 dev: true - /chai@4.5.0: - resolution: {integrity: sha512-RITGBfijLkBddZvnn8jdqoTypxvqbOLYQkGGxXzeFjVHvudaPw0HNFD9x928/eUwYWd2dPCugVqspGALTZZQKw==} - engines: {node: '>=4'} - dependencies: - assertion-error: 1.1.0 - check-error: 1.0.3 - deep-eql: 4.1.4 - get-func-name: 2.0.2 - loupe: 2.3.7 - pathval: 1.1.1 - type-detect: 4.1.0 - dev: true - /chalk@4.1.0: resolution: {integrity: sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==} engines: {node: '>=10'} @@ -1035,12 +590,6 @@ packages: supports-color: 7.2.0 dev: true - /check-error@1.0.3: - resolution: {integrity: sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==} - dependencies: - get-func-name: 2.0.2 - dev: true - /cliui@7.0.4: resolution: {integrity: sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==} dependencies: @@ -1064,10 +613,6 @@ packages: resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} dev: true - /confbox@0.1.8: - resolution: {integrity: sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==} - dev: true - /copyfiles@2.4.1: resolution: {integrity: sha512-fereAvAvxDrQDOXybk3Qu3dPbOoKoysFMWtkY3mv5BsL8//OSZVL5DCLYqgRfY5cWirgRzlC+WSrxp6Bo3eNZg==} hasBin: true @@ -1089,6 +634,14 @@ packages: resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==} dev: true + /cross-env@7.0.3: + resolution: {integrity: sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw==} + engines: {node: '>=10.14', npm: '>=6', yarn: '>=1'} + hasBin: true + dependencies: + cross-spawn: 7.0.6 + dev: true + /cross-spawn@7.0.6: resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} engines: {node: '>= 8'} @@ -1110,13 +663,6 @@ packages: ms: 2.1.3 dev: true - /deep-eql@4.1.4: - resolution: {integrity: sha512-SUwdGfqdKOwxCPeVYjwSyRpJ7Z+fhpwIAtmCUdZIWZ/YP5R9WAsyuSgpLVDi9bjWoN2LXHNss/dk3urXtdQxGg==} - engines: {node: '>=6'} - dependencies: - type-detect: 4.1.0 - dev: true - /deep-is@0.1.4: resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} dev: true @@ -1126,11 +672,6 @@ packages: engines: {node: '>=0.10.0'} dev: true - /diff-sequences@29.6.3: - resolution: {integrity: sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dev: true - /diff@4.0.2: resolution: {integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==} engines: {node: '>=0.3.1'} @@ -1153,37 +694,6 @@ packages: engines: {node: '>=0.12'} dev: true - /esbuild@0.21.5: - resolution: {integrity: sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==} - engines: {node: '>=12'} - hasBin: true - requiresBuild: true - optionalDependencies: - '@esbuild/aix-ppc64': 0.21.5 - '@esbuild/android-arm': 0.21.5 - '@esbuild/android-arm64': 0.21.5 - '@esbuild/android-x64': 0.21.5 - '@esbuild/darwin-arm64': 0.21.5 - '@esbuild/darwin-x64': 0.21.5 - '@esbuild/freebsd-arm64': 0.21.5 - '@esbuild/freebsd-x64': 0.21.5 - '@esbuild/linux-arm': 0.21.5 - '@esbuild/linux-arm64': 0.21.5 - '@esbuild/linux-ia32': 0.21.5 - '@esbuild/linux-loong64': 0.21.5 - '@esbuild/linux-mips64el': 0.21.5 - '@esbuild/linux-ppc64': 0.21.5 - '@esbuild/linux-riscv64': 0.21.5 - '@esbuild/linux-s390x': 0.21.5 - '@esbuild/linux-x64': 0.21.5 - '@esbuild/netbsd-x64': 0.21.5 - '@esbuild/openbsd-x64': 0.21.5 - '@esbuild/sunos-x64': 0.21.5 - '@esbuild/win32-arm64': 0.21.5 - '@esbuild/win32-ia32': 0.21.5 - '@esbuild/win32-x64': 0.21.5 - dev: true - /escalade@3.2.0: resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} engines: {node: '>=6'} @@ -1237,32 +747,11 @@ packages: engines: {node: '>=4.0'} dev: true - /estree-walker@3.0.3: - resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} - dependencies: - '@types/estree': 1.0.8 - dev: true - /esutils@2.0.3: resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} engines: {node: '>=0.10.0'} dev: true - /execa@8.0.1: - resolution: {integrity: sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==} - engines: {node: '>=16.17'} - dependencies: - cross-spawn: 7.0.6 - get-stream: 8.0.1 - human-signals: 5.0.0 - is-stream: 3.0.0 - merge-stream: 2.0.0 - npm-run-path: 5.3.0 - onetime: 6.0.0 - signal-exit: 4.1.0 - strip-final-newline: 3.0.0 - dev: true - /fast-levenshtein@2.0.6: resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} dev: true @@ -1279,28 +768,11 @@ packages: resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} dev: true - /fsevents@2.3.3: - resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} - engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} - os: [darwin] - requiresBuild: true - dev: true - optional: true - /get-caller-file@2.0.5: resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} engines: {node: 6.* || 8.* || >= 10.*} dev: true - /get-func-name@2.0.2: - resolution: {integrity: sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==} - dev: true - - /get-stream@8.0.1: - resolution: {integrity: sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==} - engines: {node: '>=16'} - dev: true - /glob@10.4.5: resolution: {integrity: sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==} hasBin: true @@ -1351,11 +823,6 @@ packages: engines: {node: '>=8'} dev: true - /human-signals@5.0.0: - resolution: {integrity: sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==} - engines: {node: '>=16.17.0'} - dev: true - /inflight@1.0.6: resolution: {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. @@ -1391,11 +858,6 @@ packages: engines: {node: '>=8'} dev: true - /is-stream@3.0.0: - resolution: {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - dev: true - /isarray@0.0.1: resolution: {integrity: sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==} dev: true @@ -1420,10 +882,6 @@ packages: resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} dev: true - /js-tokens@9.0.1: - resolution: {integrity: sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ==} - dev: true - /js-yaml@4.1.0: resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} hasBin: true @@ -1485,14 +943,6 @@ packages: uc.micro: 2.1.0 dev: true - /local-pkg@0.5.1: - resolution: {integrity: sha512-9rrA30MRRP3gBD3HTGnC6cDFpaE1kVDWxWgqWJUN0RvDNAo+Nz/9GxB+nHOH0ifbVFy0hSA1V6vFDvnx54lTEQ==} - engines: {node: '>=14'} - dependencies: - mlly: 1.7.4 - pkg-types: 1.3.1 - dev: true - /lodash@4.17.21: resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} dev: true @@ -1500,22 +950,10 @@ packages: /long@5.3.2: resolution: {integrity: sha512-mNAgZ1GmyNhD7AuqnTG3/VQ26o760+ZYBPKjPvugO8+nLbYfX6TVpJPseBvopbdY+qpZ/lKUnmEc1LeZYS3QAA==} - /loupe@2.3.7: - resolution: {integrity: sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==} - dependencies: - get-func-name: 2.0.2 - dev: true - /lru-cache@10.4.3: resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} dev: true - /magic-string@0.30.17: - resolution: {integrity: sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==} - dependencies: - '@jridgewell/sourcemap-codec': 1.5.0 - dev: true - /make-error@1.3.6: resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} dev: true @@ -1552,15 +990,6 @@ packages: resolution: {integrity: sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w==} dev: true - /merge-stream@2.0.0: - resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} - dev: true - - /mimic-fn@4.0.0: - resolution: {integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==} - engines: {node: '>=12'} - dev: true - /minimatch@3.1.2: resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} dependencies: @@ -1602,25 +1031,10 @@ packages: hasBin: true dev: true - /mlly@1.7.4: - resolution: {integrity: sha512-qmdSIPC4bDJXgZTCR7XosJiNKySV7O215tsPtDN9iEO/7q/76b/ijtgRu/+epFXSJhijtTCCGp3DWS549P3xKw==} - dependencies: - acorn: 8.15.0 - pathe: 2.0.3 - pkg-types: 1.3.1 - ufo: 1.6.1 - dev: true - /ms@2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} dev: true - /nanoid@3.3.11: - resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==} - engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} - hasBin: true - dev: true - /nested-obj@0.0.1: resolution: {integrity: sha512-kB1WKTng+IePQhZVs1UXtFaHBx4QEM5a0XKGAzYfCKvdx5DhNjCytNDWMUGpNNpHLotln+tiwcA52kWCIgGq1Q==} dev: true @@ -1632,26 +1046,12 @@ packages: readable-stream: 1.0.34 dev: true - /npm-run-path@5.3.0: - resolution: {integrity: sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - dependencies: - path-key: 4.0.0 - dev: true - /once@1.4.0: resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} dependencies: wrappy: 1.0.2 dev: true - /onetime@6.0.0: - resolution: {integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==} - engines: {node: '>=12'} - dependencies: - mimic-fn: 4.0.0 - dev: true - /optionator@0.8.3: resolution: {integrity: sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==} engines: {node: '>= 0.8.0'} @@ -1664,13 +1064,6 @@ packages: word-wrap: 1.2.5 dev: true - /p-limit@5.0.0: - resolution: {integrity: sha512-/Eaoq+QyLSiXQ4lyYV23f14mZRQcXnxfHrN0vCai+ak9G0pp9iEQukIIZq5NccEvwRB8PUnZT0KsOoDCINS1qQ==} - engines: {node: '>=18'} - dependencies: - yocto-queue: 1.2.1 - dev: true - /package-json-from-dist@1.0.1: resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==} dev: true @@ -1685,11 +1078,6 @@ packages: engines: {node: '>=8'} dev: true - /path-key@4.0.0: - resolution: {integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==} - engines: {node: '>=12'} - dev: true - /path-scurry@1.11.1: resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==} engines: {node: '>=16 || 14 >=14.18'} @@ -1698,18 +1086,6 @@ packages: minipass: 7.1.2 dev: true - /pathe@1.1.2: - resolution: {integrity: sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==} - dev: true - - /pathe@2.0.3: - resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==} - dev: true - - /pathval@1.1.1: - resolution: {integrity: sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==} - dev: true - /pg-proto-parser@1.28.2: resolution: {integrity: sha512-W+IywDGhYnsWf0pADeeXx9ORmAfUUK4Be6thyXO+uPycdG5EqCHG85G9BG7BubIxHomYxk2xJRgpxfTRfJ49fw==} dependencies: @@ -1730,37 +1106,11 @@ packages: resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} dev: true - /pkg-types@1.3.1: - resolution: {integrity: sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==} - dependencies: - confbox: 0.1.8 - mlly: 1.7.4 - pathe: 2.0.3 - dev: true - - /postcss@8.5.6: - resolution: {integrity: sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==} - engines: {node: ^10 || ^12 || >=14} - dependencies: - nanoid: 3.3.11 - picocolors: 1.1.1 - source-map-js: 1.2.1 - dev: true - /prelude-ls@1.1.2: resolution: {integrity: sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==} engines: {node: '>= 0.8.0'} dev: true - /pretty-format@29.7.0: - resolution: {integrity: sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@jest/schemas': 29.6.3 - ansi-styles: 5.2.0 - react-is: 18.3.1 - dev: true - /process-nextick-args@2.0.1: resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} dev: true @@ -1770,10 +1120,6 @@ packages: engines: {node: '>=6'} dev: true - /react-is@18.3.1: - resolution: {integrity: sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==} - dev: true - /readable-stream@1.0.34: resolution: {integrity: sha512-ok1qVCJuRkNmvebYikljxJA/UEsKwLl2nI1OmaqAu4/UE+h0wKCHok4XkL/gvi39OacXvw59RJUOFUkDib2rHg==} dependencies: @@ -1813,36 +1159,6 @@ packages: glob: 10.4.5 dev: true - /rollup@4.44.0: - resolution: {integrity: sha512-qHcdEzLCiktQIfwBq420pn2dP+30uzqYxv9ETm91wdt2R9AFcWfjNAmje4NWlnCIQ5RMTzVf0ZyisOKqHR6RwA==} - engines: {node: '>=18.0.0', npm: '>=8.0.0'} - hasBin: true - dependencies: - '@types/estree': 1.0.8 - optionalDependencies: - '@rollup/rollup-android-arm-eabi': 4.44.0 - '@rollup/rollup-android-arm64': 4.44.0 - '@rollup/rollup-darwin-arm64': 4.44.0 - '@rollup/rollup-darwin-x64': 4.44.0 - '@rollup/rollup-freebsd-arm64': 4.44.0 - '@rollup/rollup-freebsd-x64': 4.44.0 - '@rollup/rollup-linux-arm-gnueabihf': 4.44.0 - '@rollup/rollup-linux-arm-musleabihf': 4.44.0 - '@rollup/rollup-linux-arm64-gnu': 4.44.0 - '@rollup/rollup-linux-arm64-musl': 4.44.0 - '@rollup/rollup-linux-loongarch64-gnu': 4.44.0 - '@rollup/rollup-linux-powerpc64le-gnu': 4.44.0 - '@rollup/rollup-linux-riscv64-gnu': 4.44.0 - '@rollup/rollup-linux-riscv64-musl': 4.44.0 - '@rollup/rollup-linux-s390x-gnu': 4.44.0 - '@rollup/rollup-linux-x64-gnu': 4.44.0 - '@rollup/rollup-linux-x64-musl': 4.44.0 - '@rollup/rollup-win32-arm64-msvc': 4.44.0 - '@rollup/rollup-win32-ia32-msvc': 4.44.0 - '@rollup/rollup-win32-x64-msvc': 4.44.0 - fsevents: 2.3.3 - dev: true - /safe-buffer@5.1.2: resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} dev: true @@ -1865,20 +1181,11 @@ packages: engines: {node: '>=8'} dev: true - /siginfo@2.0.0: - resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==} - dev: true - /signal-exit@4.1.0: resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} engines: {node: '>=14'} dev: true - /source-map-js@1.2.1: - resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} - engines: {node: '>=0.10.0'} - dev: true - /source-map@0.6.1: resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} engines: {node: '>=0.10.0'} @@ -1886,14 +1193,6 @@ packages: dev: true optional: true - /stackback@0.0.2: - resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} - dev: true - - /std-env@3.9.0: - resolution: {integrity: sha512-UGvjygr6F6tpH7o2qyqR6QYpwraIjKSdtzyBdyytFOHmPZY917kwdwLG0RbOjWOnKmnm3PeHjaoLLMie7kPLQw==} - dev: true - /strfy-js@3.0.1: resolution: {integrity: sha512-GVN7Kz2mZ8ZSXyo5neALGObmah+JVw/nr8zNapzNtrObO+tcW0wOmlOBfRdux+XfIaA/87qe5MWXtscE7VeY+g==} dependencies: @@ -1942,22 +1241,11 @@ packages: ansi-regex: 6.1.0 dev: true - /strip-final-newline@3.0.0: - resolution: {integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==} - engines: {node: '>=12'} - dev: true - /strip-json-comments@3.1.1: resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} engines: {node: '>=8'} dev: true - /strip-literal@2.1.1: - resolution: {integrity: sha512-631UJ6O00eNGfMiWG78ck80dfBab8X6IVFB51jZK5Icd7XAs60Z5y7QdSd/wGIklnWvRbUNloVzhOKKmutxQ6Q==} - dependencies: - js-tokens: 9.0.1 - dev: true - /supports-color@7.2.0: resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} engines: {node: '>=8'} @@ -1972,20 +1260,6 @@ packages: xtend: 4.0.2 dev: true - /tinybench@2.9.0: - resolution: {integrity: sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==} - dev: true - - /tinypool@0.8.4: - resolution: {integrity: sha512-i11VH5gS6IFeLY3gMBQ00/MmLncVP7JLXOw1vlgkytLmJK7QnEr7NXf0LBdxfmNPAeyetukOk0bOYrJrFGjYJQ==} - engines: {node: '>=14.0.0'} - dev: true - - /tinyspy@2.2.1: - resolution: {integrity: sha512-KYad6Vy5VDWV4GH3fjpseMQ/XU2BhIYP7Vzd0LG44qRWm/Yt2WCOTicFdvmgo6gWaqooMQCawTtILVQJupKu7A==} - engines: {node: '>=14.0.0'} - dev: true - /tmp@0.2.3: resolution: {integrity: sha512-nZD7m9iCPC5g0pYmcaxogYKggSfLsdxl8of3Q/oIbqCqLLIO9IAF0GWjX1z9NZRHPiXv8Wex4yDCaZsgEw0Y8w==} engines: {node: '>=14.14'} @@ -2034,11 +1308,6 @@ packages: prelude-ls: 1.1.2 dev: true - /type-detect@4.1.0: - resolution: {integrity: sha512-Acylog8/luQ8L7il+geoSxhEkazvkslg7PSNKOX59mbB9cOveP5aq9h74Y7YU8yDpJwetzQQrfIwtf4Wp4LKcw==} - engines: {node: '>=4'} - dev: true - /typescript@5.8.3: resolution: {integrity: sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==} engines: {node: '>=14.17'} @@ -2049,10 +1318,6 @@ packages: resolution: {integrity: sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==} dev: true - /ufo@1.6.1: - resolution: {integrity: sha512-9a4/uxlTWJ4+a5i0ooc1rU7C7YOw3wT+UGqdeNNHWnOF9qcMBgLRS+4IYUqbczewFx4mLEig6gawh7X6mFlEkA==} - dev: true - /uglify-js@3.19.3: resolution: {integrity: sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ==} engines: {node: '>=0.8.0'} @@ -2079,124 +1344,6 @@ packages: resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==} dev: true - /vite-node@1.6.1(@types/node@20.19.1): - resolution: {integrity: sha512-YAXkfvGtuTzwWbDSACdJSg4A4DZiAqckWe90Zapc/sEX3XvHcw1NdurM/6od8J207tSDqNbSsgdCacBgvJKFuA==} - engines: {node: ^18.0.0 || >=20.0.0} - hasBin: true - dependencies: - cac: 6.7.14 - debug: 4.4.1 - pathe: 1.1.2 - picocolors: 1.1.1 - vite: 5.4.19(@types/node@20.19.1) - transitivePeerDependencies: - - '@types/node' - - less - - lightningcss - - sass - - sass-embedded - - stylus - - sugarss - - supports-color - - terser - dev: true - - /vite@5.4.19(@types/node@20.19.1): - resolution: {integrity: sha512-qO3aKv3HoQC8QKiNSTuUM1l9o/XX3+c+VTgLHbJWHZGeTPVAg2XwazI9UWzoxjIJCGCV2zU60uqMzjeLZuULqA==} - engines: {node: ^18.0.0 || >=20.0.0} - hasBin: true - peerDependencies: - '@types/node': ^18.0.0 || >=20.0.0 - less: '*' - lightningcss: ^1.21.0 - sass: '*' - sass-embedded: '*' - stylus: '*' - sugarss: '*' - terser: ^5.4.0 - peerDependenciesMeta: - '@types/node': - optional: true - less: - optional: true - lightningcss: - optional: true - sass: - optional: true - sass-embedded: - optional: true - stylus: - optional: true - sugarss: - optional: true - terser: - optional: true - dependencies: - '@types/node': 20.19.1 - esbuild: 0.21.5 - postcss: 8.5.6 - rollup: 4.44.0 - optionalDependencies: - fsevents: 2.3.3 - dev: true - - /vitest@1.6.1(@types/node@20.19.1): - resolution: {integrity: sha512-Ljb1cnSJSivGN0LqXd/zmDbWEM0RNNg2t1QW/XUhYl/qPqyu7CsqeWtqQXHVaJsecLPuDoak2oJcZN2QoRIOag==} - engines: {node: ^18.0.0 || >=20.0.0} - hasBin: true - peerDependencies: - '@edge-runtime/vm': '*' - '@types/node': ^18.0.0 || >=20.0.0 - '@vitest/browser': 1.6.1 - '@vitest/ui': 1.6.1 - happy-dom: '*' - jsdom: '*' - peerDependenciesMeta: - '@edge-runtime/vm': - optional: true - '@types/node': - optional: true - '@vitest/browser': - optional: true - '@vitest/ui': - optional: true - happy-dom: - optional: true - jsdom: - optional: true - dependencies: - '@types/node': 20.19.1 - '@vitest/expect': 1.6.1 - '@vitest/runner': 1.6.1 - '@vitest/snapshot': 1.6.1 - '@vitest/spy': 1.6.1 - '@vitest/utils': 1.6.1 - acorn-walk: 8.3.4 - chai: 4.5.0 - debug: 4.4.1 - execa: 8.0.1 - local-pkg: 0.5.1 - magic-string: 0.30.17 - pathe: 1.1.2 - picocolors: 1.1.1 - std-env: 3.9.0 - strip-literal: 2.1.1 - tinybench: 2.9.0 - tinypool: 0.8.4 - vite: 5.4.19(@types/node@20.19.1) - vite-node: 1.6.1(@types/node@20.19.1) - why-is-node-running: 2.3.0 - transitivePeerDependencies: - - less - - lightningcss - - sass - - sass-embedded - - stylus - - sugarss - - supports-color - - terser - dev: true - /which@2.0.2: resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} engines: {node: '>= 8'} @@ -2205,15 +1352,6 @@ packages: isexe: 2.0.0 dev: true - /why-is-node-running@2.3.0: - resolution: {integrity: sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==} - engines: {node: '>=8'} - hasBin: true - dependencies: - siginfo: 2.0.0 - stackback: 0.0.2 - dev: true - /word-wrap@1.2.5: resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} engines: {node: '>=0.10.0'} @@ -2285,8 +1423,3 @@ packages: resolution: {integrity: sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==} engines: {node: '>=6'} dev: true - - /yocto-queue@1.2.1: - resolution: {integrity: sha512-AyeEbWOu/TAXdxlV9wmGcR0+yh2j3vYPGOECcIj2S7MkrLyC7ne+oye2BKTItt0ii2PHk4cDy+95+LshzbXnGg==} - engines: {node: '>=12.20'} - dev: true