From 01ca6380f5056db4c62be0975c873f198047ff96 Mon Sep 17 00:00:00 2001 From: Dan Lynch Date: Sun, 22 Jun 2025 19:41:00 -0700 Subject: [PATCH 1/4] parser --- README.md | 4 +- full/README.md | 4 +- package.json | 5 +- parser/.gitignore | 10 + parser/Makefile.shared | 42 ++ parser/README.md | 130 ++++++ parser/package.json | 57 +++ parser/scripts/build.js | 48 ++ parser/src/index.ts | 75 ++++ parser/src/v15.ts | 2 + parser/src/v16.ts | 2 + parser/src/v17.ts | 2 + parser/test/parser.test.ts | 59 +++ parser/tsconfig.esm.json | 7 + parser/tsconfig.json | 18 + pnpm-lock.yaml | 890 +++++++++++++++++++++++++++++++++++++ pnpm-workspace.yaml | 1 + versions/13/README.md | 4 +- versions/14/README.md | 4 +- versions/15/README.md | 4 +- versions/16/README.md | 4 +- versions/17/README.md | 4 +- 22 files changed, 1361 insertions(+), 15 deletions(-) create mode 100644 parser/.gitignore create mode 100644 parser/Makefile.shared create mode 100644 parser/README.md create mode 100644 parser/package.json create mode 100644 parser/scripts/build.js create mode 100644 parser/src/index.ts create mode 100644 parser/src/v15.ts create mode 100644 parser/src/v16.ts create mode 100644 parser/src/v17.ts create mode 100644 parser/test/parser.test.ts create mode 100644 parser/tsconfig.esm.json create mode 100644 parser/tsconfig.json diff --git a/README.md b/README.md index ac2f4a6a..4a9e00e6 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ # libpg-query

- webincubator + hyperweb.io

@@ -30,7 +30,7 @@ Built to power [pgsql-parser](https://github.com/pyramation/pgsql-parser), this * ๐ŸŒ **Node.js & Browser Support** โ€“ Consistent behavior in any JS environment * ๐Ÿ“ฆ **No Native Builds Required** โ€“ No compilation, no system-specific dependencies * ๐Ÿง  **Spec-Accurate Parsing** โ€“ Produces faithful, standards-compliant ASTs -* ๐Ÿš€ **Production-Grade** โ€“ Millions of downloads powering 1000s of projects +* ๐Ÿš€ **Production-Grade** โ€“ Millions of downloads and trusted by countless projects and top teams ## ๐Ÿš€ For Round-trip Codegen diff --git a/full/README.md b/full/README.md index d7233848..9dff5da8 100644 --- a/full/README.md +++ b/full/README.md @@ -1,7 +1,7 @@ # @libpg-query/parser

- webincubator + hyperweb.io

@@ -30,7 +30,7 @@ Built to power [pgsql-parser](https://github.com/pyramation/pgsql-parser), this * ๐ŸŒ **Node.js & Browser Support** โ€“ Consistent behavior in any JS environment * ๐Ÿ“ฆ **No Native Builds Required** โ€“ No compilation, no system-specific dependencies * ๐Ÿง  **Spec-Accurate Parsing** โ€“ Produces faithful, standards-compliant ASTs -* ๐Ÿš€ **Production-Grade** โ€“ Millions of downloads powering 1000s of projects +* ๐Ÿš€ **Production-Grade** โ€“ Millions of downloads and trusted by countless projects and top teams ## ๐Ÿš€ For Round-trip Codegen diff --git a/package.json b/package.json index 5766b8c4..7bdd3df6 100644 --- a/package.json +++ b/package.json @@ -19,7 +19,10 @@ "publish:types": "node scripts/publish-types.js", "publish:enums": "node scripts/publish-enums.js", "publish:versions": "node scripts/publish-versions.js", - "update:versions-types": "node scripts/update-versions-types.js" + "update:versions-types": "node scripts/update-versions-types.js", + "build:parser": "pnpm --filter @pgsql/parser build", + "test:parser": "pnpm --filter @pgsql/parser test", + "publish:parser": "pnpm --filter @pgsql/parser publish" }, "devDependencies": { "@types/node": "^20.0.0", diff --git a/parser/.gitignore b/parser/.gitignore new file mode 100644 index 00000000..261743c3 --- /dev/null +++ b/parser/.gitignore @@ -0,0 +1,10 @@ +node_modules/ +dist/ +dist-esm/ +*.log +.DS_Store +src/wasm/*.wasm +src/wasm/*.js +src/types/15/ +src/types/16/ +src/types/17/ \ No newline at end of file diff --git a/parser/Makefile.shared b/parser/Makefile.shared new file mode 100644 index 00000000..16f69566 --- /dev/null +++ b/parser/Makefile.shared @@ -0,0 +1,42 @@ +# 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 new file mode 100644 index 00000000..459287c3 --- /dev/null +++ b/parser/README.md @@ -0,0 +1,130 @@ +# @pgsql/parser + +

+ hyperweb.io +

+ +

+ +
+ + + + +

+ +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). + +## Installation + +```bash +npm install @pgsql/parser +``` + +## Usage + +### Dynamic Version Selection + +```javascript +import { parse, PgParser } from '@pgsql/parser'; + +// Parse with default version (17) +const result = await parse('SELECT 1+1 as sum'); +console.log(result); +// { version: 17, result: { version: 170004, stmts: [...] } } + +// Parse with specific version +const result15 = await parse('SELECT 1+1 as sum', 15); +console.log(result15); +// { version: 15, result: { version: 150007, stmts: [...] } } + +// Using PgParser class +const parser = new PgParser(16); +const result16 = await parser.parse('SELECT * FROM users'); +``` + +### Static Version Imports + +For better tree-shaking and when you know which version you need: + +```javascript +// Import specific version +import * as pg17 from '@pgsql/parser/v17'; + +await pg17.loadModule(); +const result = await pg17.parse('SELECT 1'); +console.log(result); +// { version: 170004, stmts: [...] } +``` + +### Error Handling + +The parser returns errors in a consistent format: + +```javascript +const result = await parse('INVALID SQL'); +if (result.error) { + console.error(result.error); + // { type: 'syntax', message: 'syntax error at or near "INVALID"', position: 0 } +} +``` + +## API + +### `parse(query: string, version?: 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. + +Returns a promise that resolves to: +- On success: `{ version: number, result: AST }` +- On error: `{ version: number, error: { type: string, message: string, position: number } }` + +### `PgParser` + +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() +``` + +## Version Exports + +- `@pgsql/parser/v15` - PostgreSQL 15 parser +- `@pgsql/parser/v16` - PostgreSQL 16 parser +- `@pgsql/parser/v17` - PostgreSQL 17 parser + +Each version export provides: +- `loadModule()`: Initialize the WASM module +- `parse(query)`: Parse a query (async) +- `parseSync(query)`: Parse a query (sync, requires loadModule first) + +## Credits + +Built on the excellent work of several contributors: + +* **[Dan Lynch](https://github.com/pyramation)** โ€” official maintainer since 2018 and architect of the current implementation +* **[Lukas Fittl](https://github.com/lfittl)** for [libpg_query](https://github.com/pganalyze/libpg_query) โ€” the core PostgreSQL parser that powers this project +* **[Greg Richardson](https://github.com/gregnr)** for AST guidance and pushing the transition to WASM for better interoperability +* **[Ethan Resnick](https://github.com/ethanresnick)** for the original Node.js N-API bindings +* **[Zac McCormick](https://github.com/zhm)** for the foundational [node-pg-query-native](https://github.com/zhm/node-pg-query-native) parser + +## Related + +* [pgsql-parser](https://www.npmjs.com/package/pgsql-parser): The real PostgreSQL parser for Node.js, providing symmetric parsing and deparsing of SQL statements with actual PostgreSQL parser integration. +* [pgsql-deparser](https://www.npmjs.com/package/pgsql-deparser): A streamlined tool designed for converting PostgreSQL ASTs back into SQL queries, focusing solely on deparser functionality to complement `pgsql-parser`. +* [@pgsql/types](https://www.npmjs.com/package/@pgsql/types): Offers TypeScript type definitions for PostgreSQL AST nodes, facilitating type-safe construction, analysis, and manipulation of ASTs. +* [@pgsql/enums](https://www.npmjs.com/package/@pgsql/enums): Provides TypeScript enum definitions for PostgreSQL constants, enabling type-safe usage of PostgreSQL enums and constants in your applications. +* [@pgsql/utils](https://www.npmjs.com/package/@pgsql/utils): A comprehensive utility library for PostgreSQL, offering type-safe AST node creation and enum value conversions, simplifying the construction and manipulation of PostgreSQL ASTs. +* [pg-proto-parser](https://www.npmjs.com/package/pg-proto-parser): A TypeScript tool that parses PostgreSQL Protocol Buffers definitions to generate TypeScript interfaces, utility functions, and JSON mappings for enums. +* [libpg-query](https://github.com/launchql/libpg-query-node): The real PostgreSQL parser exposed for Node.js, used primarily in `pgsql-parser` for parsing and deparsing SQL queries. + +## Disclaimer + +AS DESCRIBED IN THE LICENSES, THE SOFTWARE IS PROVIDED "AS IS", AT YOUR OWN RISK, AND WITHOUT WARRANTIES OF ANY KIND. + +No developer or entity involved in creating Software will be liable for any claims or damages whatsoever associated with your use, inability to use, or your interaction with other users of the Software code or Software CLI, including any direct, indirect, incidental, special, exemplary, punitive or consequential damages, or loss of profits, cryptocurrencies, tokens, or anything else of value. \ No newline at end of file diff --git a/parser/package.json b/parser/package.json new file mode 100644 index 00000000..250504b1 --- /dev/null +++ b/parser/package.json @@ -0,0 +1,57 @@ +{ + "name": "@pgsql/parser", + "version": "1.0.0", + "description": "Multi-version PostgreSQL parser with dynamic version selection", + "main": "./wasm/index.cjs", + "module": "./wasm/index.js", + "types": "./wasm/index.d.ts", + "exports": { + ".": { + "import": "./wasm/index.js", + "require": "./wasm/index.cjs", + "types": "./wasm/index.d.ts" + }, + "./v15": { + "import": "./wasm/v15.js", + "require": "./wasm/v15.cjs", + "types": "./wasm/v15.d.ts" + }, + "./v16": { + "import": "./wasm/v16.js", + "require": "./wasm/v16.cjs", + "types": "./wasm/v16.d.ts" + }, + "./v17": { + "import": "./wasm/v17.js", + "require": "./wasm/v17.cjs", + "types": "./wasm/v17.d.ts" + } + }, + "files": [ + "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" + }, + "keywords": [ + "postgresql", + "parser", + "sql", + "ast", + "multi-version" + ], + "author": "", + "license": "MIT", + "dependencies": { + "@pgsql/types": "^17.6.0" + }, + "devDependencies": { + "@types/node": "^20.0.0", + "rimraf": "^5.0.10", + "typescript": "^5.0.0", + "vitest": "^1.0.0" + } +} diff --git a/parser/scripts/build.js b/parser/scripts/build.js new file mode 100644 index 00000000..3007d631 --- /dev/null +++ b/parser/scripts/build.js @@ -0,0 +1,48 @@ +const fs = require('fs'); +const path = require('path'); +const { execSync } = require('child_process'); + +// Run TypeScript compilation +console.log('Compiling TypeScript...'); +const tscPath = path.join(__dirname, '../node_modules/.bin/tsc'); +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/src/index.ts b/parser/src/index.ts new file mode 100644 index 00000000..5f683114 --- /dev/null +++ b/parser/src/index.ts @@ -0,0 +1,75 @@ +// 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 new file mode 100644 index 00000000..71eef236 --- /dev/null +++ b/parser/src/v15.ts @@ -0,0 +1,2 @@ +// 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 new file mode 100644 index 00000000..f45e4e2e --- /dev/null +++ b/parser/src/v16.ts @@ -0,0 +1,2 @@ +// 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 new file mode 100644 index 00000000..e421ce77 --- /dev/null +++ b/parser/src/v17.ts @@ -0,0 +1,2 @@ +// Re-export everything from the v17 parser +export * from '../../versions/17/wasm/index.js'; \ No newline at end of file diff --git a/parser/test/parser.test.ts b/parser/test/parser.test.ts new file mode 100644 index 00000000..8f2b1197 --- /dev/null +++ b/parser/test/parser.test.ts @@ -0,0 +1,59 @@ +import { describe, it, expect } from 'vitest'; +import { PgParser, parse } from '../wasm/index.js'; +import * as v15 from '../wasm/v15.js'; +import * as v16 from '../wasm/v16.js'; +import * as v17 from '../wasm/v17.js'; + +describe('PgParser', () => { + describe('Dynamic API', () => { + it('should parse SQL with default version (17)', async () => { + const result = await parse('SELECT 1+1 as sum'); + expect(result.version).toBe(17); + expect(result.result).toBeDefined(); + expect(result.result.stmts).toHaveLength(1); + }); + + it('should parse SQL with version 15', async () => { + const result = await parse('SELECT 1+1 as sum', 15); + expect(result.version).toBe(15); + expect(result.result).toBeDefined(); + }); + + it('should handle parse errors', async () => { + const result = await parse('INVALID SQL'); + expect(result.error).toBeDefined(); + expect(result.error.type).toBe('syntax'); + expect(result.error.message).toContain('syntax error'); + }); + + it('should work with PgParser class', async () => { + const parser = new PgParser(16); + const result = await parser.parse('SELECT * FROM users'); + expect(result.version).toBe(16); + expect(result.result).toBeDefined(); + }); + }); + + describe('Static imports', () => { + it('should parse with v15', async () => { + await v15.loadModule(); + const result = await v15.parse('SELECT 1'); + expect(result).toBeDefined(); + expect(result.stmts).toHaveLength(1); + }); + + it('should parse with v16', async () => { + await v16.loadModule(); + const result = await v16.parse('SELECT 1'); + expect(result).toBeDefined(); + expect(result.stmts).toHaveLength(1); + }); + + it('should parse with v17', async () => { + await v17.loadModule(); + const result = await v17.parse('SELECT 1'); + expect(result).toBeDefined(); + expect(result.stmts).toHaveLength(1); + }); + }); +}); \ No newline at end of file diff --git a/parser/tsconfig.esm.json b/parser/tsconfig.esm.json new file mode 100644 index 00000000..487f9c55 --- /dev/null +++ b/parser/tsconfig.esm.json @@ -0,0 +1,7 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "module": "esnext", + "outDir": "esm/" + } +} diff --git a/parser/tsconfig.json b/parser/tsconfig.json new file mode 100644 index 00000000..d7da207b --- /dev/null +++ b/parser/tsconfig.json @@ -0,0 +1,18 @@ +{ + "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 2dd3eec9..9d536b02 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -78,6 +78,18 @@ importers: specifier: ^0.8.0 version: 0.8.0 + parser: + devDependencies: + '@types/node': + specifier: ^20.0.0 + version: 20.19.1 + typescript: + specifier: ^5.0.0 + version: 5.8.3 + vitest: + specifier: ^1.0.0 + version: 1.6.1(@types/node@20.19.1) + types/13: devDependencies: pg-proto-parser: @@ -263,6 +275,213 @@ 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'} @@ -275,6 +494,13 @@ 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'} @@ -434,6 +660,170 @@ 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 @@ -450,6 +840,10 @@ 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 @@ -470,6 +864,45 @@ 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 @@ -519,6 +952,11 @@ 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'} @@ -532,6 +970,10 @@ 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 @@ -553,6 +995,11 @@ 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'} @@ -565,6 +1012,19 @@ 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'} @@ -581,6 +1041,12 @@ 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: @@ -604,6 +1070,10 @@ 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 @@ -646,6 +1116,13 @@ 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 @@ -655,6 +1132,11 @@ 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'} @@ -677,6 +1159,37 @@ 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'} @@ -730,11 +1243,32 @@ 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 @@ -751,11 +1285,28 @@ 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 @@ -806,6 +1357,11 @@ 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. @@ -841,6 +1397,11 @@ 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 @@ -865,6 +1426,10 @@ 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 @@ -926,6 +1491,14 @@ 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 @@ -933,10 +1506,22 @@ 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 @@ -973,6 +1558,15 @@ 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: @@ -1014,10 +1608,25 @@ 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 @@ -1029,12 +1638,26 @@ 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'} @@ -1047,6 +1670,13 @@ 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 @@ -1061,6 +1691,11 @@ 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'} @@ -1069,6 +1704,18 @@ 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: @@ -1089,11 +1736,37 @@ 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 @@ -1103,6 +1776,10 @@ 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: @@ -1142,6 +1819,36 @@ 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 @@ -1164,11 +1871,20 @@ 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'} @@ -1176,6 +1892,14 @@ 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: @@ -1224,11 +1948,22 @@ 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'} @@ -1243,6 +1978,20 @@ 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'} @@ -1291,6 +2040,11 @@ 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'} @@ -1301,6 +2055,10 @@ 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'} @@ -1327,6 +2085,124 @@ 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'} @@ -1335,6 +2211,15 @@ 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'} @@ -1406,3 +2291,8 @@ 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 diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 8b0debbc..39d90fec 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -1,4 +1,5 @@ packages: + - 'parser' - 'full' - 'versions/17' - 'versions/16' diff --git a/versions/13/README.md b/versions/13/README.md index d44debd9..489aa291 100644 --- a/versions/13/README.md +++ b/versions/13/README.md @@ -1,7 +1,7 @@ # libpg-query

- webincubator + hyperweb.io

@@ -30,7 +30,7 @@ Built to power [pgsql-parser](https://github.com/pyramation/pgsql-parser), this * ๐ŸŒ **Node.js & Browser Support** โ€“ Consistent behavior in any JS environment * ๐Ÿ“ฆ **No Native Builds Required** โ€“ No compilation, no system-specific dependencies * ๐Ÿง  **Spec-Accurate Parsing** โ€“ Produces faithful, standards-compliant ASTs -* ๐Ÿš€ **Production-Grade** โ€“ Millions of downloads powering 1000s of projects +* ๐Ÿš€ **Production-Grade** โ€“ Millions of downloads and trusted by countless projects and top teams ## ๐Ÿš€ For Round-trip Codegen diff --git a/versions/14/README.md b/versions/14/README.md index d44debd9..489aa291 100644 --- a/versions/14/README.md +++ b/versions/14/README.md @@ -1,7 +1,7 @@ # libpg-query

- webincubator + hyperweb.io

@@ -30,7 +30,7 @@ Built to power [pgsql-parser](https://github.com/pyramation/pgsql-parser), this * ๐ŸŒ **Node.js & Browser Support** โ€“ Consistent behavior in any JS environment * ๐Ÿ“ฆ **No Native Builds Required** โ€“ No compilation, no system-specific dependencies * ๐Ÿง  **Spec-Accurate Parsing** โ€“ Produces faithful, standards-compliant ASTs -* ๐Ÿš€ **Production-Grade** โ€“ Millions of downloads powering 1000s of projects +* ๐Ÿš€ **Production-Grade** โ€“ Millions of downloads and trusted by countless projects and top teams ## ๐Ÿš€ For Round-trip Codegen diff --git a/versions/15/README.md b/versions/15/README.md index d44debd9..489aa291 100644 --- a/versions/15/README.md +++ b/versions/15/README.md @@ -1,7 +1,7 @@ # libpg-query

- webincubator + hyperweb.io

@@ -30,7 +30,7 @@ Built to power [pgsql-parser](https://github.com/pyramation/pgsql-parser), this * ๐ŸŒ **Node.js & Browser Support** โ€“ Consistent behavior in any JS environment * ๐Ÿ“ฆ **No Native Builds Required** โ€“ No compilation, no system-specific dependencies * ๐Ÿง  **Spec-Accurate Parsing** โ€“ Produces faithful, standards-compliant ASTs -* ๐Ÿš€ **Production-Grade** โ€“ Millions of downloads powering 1000s of projects +* ๐Ÿš€ **Production-Grade** โ€“ Millions of downloads and trusted by countless projects and top teams ## ๐Ÿš€ For Round-trip Codegen diff --git a/versions/16/README.md b/versions/16/README.md index d44debd9..489aa291 100644 --- a/versions/16/README.md +++ b/versions/16/README.md @@ -1,7 +1,7 @@ # libpg-query

- webincubator + hyperweb.io

@@ -30,7 +30,7 @@ Built to power [pgsql-parser](https://github.com/pyramation/pgsql-parser), this * ๐ŸŒ **Node.js & Browser Support** โ€“ Consistent behavior in any JS environment * ๐Ÿ“ฆ **No Native Builds Required** โ€“ No compilation, no system-specific dependencies * ๐Ÿง  **Spec-Accurate Parsing** โ€“ Produces faithful, standards-compliant ASTs -* ๐Ÿš€ **Production-Grade** โ€“ Millions of downloads powering 1000s of projects +* ๐Ÿš€ **Production-Grade** โ€“ Millions of downloads and trusted by countless projects and top teams ## ๐Ÿš€ For Round-trip Codegen diff --git a/versions/17/README.md b/versions/17/README.md index d44debd9..489aa291 100644 --- a/versions/17/README.md +++ b/versions/17/README.md @@ -1,7 +1,7 @@ # libpg-query

- webincubator + hyperweb.io

@@ -30,7 +30,7 @@ Built to power [pgsql-parser](https://github.com/pyramation/pgsql-parser), this * ๐ŸŒ **Node.js & Browser Support** โ€“ Consistent behavior in any JS environment * ๐Ÿ“ฆ **No Native Builds Required** โ€“ No compilation, no system-specific dependencies * ๐Ÿง  **Spec-Accurate Parsing** โ€“ Produces faithful, standards-compliant ASTs -* ๐Ÿš€ **Production-Grade** โ€“ Millions of downloads powering 1000s of projects +* ๐Ÿš€ **Production-Grade** โ€“ Millions of downloads and trusted by countless projects and top teams ## ๐Ÿš€ For Round-trip Codegen From 6026cfc87eb796566f3257e6f593d94a2d2e2afb Mon Sep 17 00:00:00 2001 From: Dan Lynch Date: Sun, 22 Jun 2025 19:49:32 -0700 Subject: [PATCH 2/4] parser workflow --- .github/workflows/ci.yml | 129 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 129 insertions(+) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 2bbabd0b..98a8a879 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -124,3 +124,132 @@ jobs: - name: Run Tests ๐Ÿ” run: pnpm run test working-directory: ${{ matrix.package.path }} + + build-parser: + name: Build Parser Package ๐Ÿ“ฆ + needs: build-wasm + runs-on: ubuntu-latest + steps: + - name: Checkout Repository ๐Ÿ“ฅ + uses: actions/checkout@v4 + + - name: Setup Node.js ๐ŸŒ + uses: actions/setup-node@v4 + with: + node-version: '20.x' + + - name: Setup pnpm ๐Ÿ“ฆ + uses: pnpm/action-setup@v2 + with: + version: 8.15.1 + + - name: Get pnpm store directory ๐Ÿ“ + shell: bash + run: | + echo "STORE_PATH=$(pnpm store path --silent)" >> $GITHUB_ENV + + - name: Setup pnpm cache ๐Ÿ—„๏ธ + uses: actions/cache@v3 + with: + path: ${{ env.STORE_PATH }} + key: ${{ runner.os }}-pnpm-store-${{ hashFiles('**/pnpm-lock.yaml') }} + restore-keys: | + ${{ runner.os }}-pnpm-store- + + - name: Install Dependencies ๐Ÿงถ + run: pnpm install + + - name: Download v15 WASM Artifacts ๐Ÿ“ฅ + uses: actions/download-artifact@v4 + with: + name: wasm-artifacts-v15 + path: versions/15/wasm/ + + - name: Download v16 WASM Artifacts ๐Ÿ“ฅ + uses: actions/download-artifact@v4 + with: + name: wasm-artifacts-v16 + path: versions/16/wasm/ + + - name: Download v17 WASM Artifacts ๐Ÿ“ฅ + uses: actions/download-artifact@v4 + with: + name: wasm-artifacts-v17 + path: versions/17/wasm/ + + - name: Build Parser ๐Ÿ— + run: pnpm run build + working-directory: parser + + - name: Upload Parser Artifacts ๐Ÿ“ฆ + uses: actions/upload-artifact@v4 + with: + name: parser-artifacts + path: parser/wasm/ + retention-days: 1 + + test-parser: + name: Test Parser on ${{ matrix.os }} ${{ matrix.os == 'ubuntu-latest' && '๐Ÿง' || matrix.os == 'macos-latest' && '๐ŸŽ' || '๐ŸชŸ' }} + needs: build-parser + strategy: + matrix: + os: [ubuntu-latest, macos-latest, windows-latest] + fail-fast: false + runs-on: ${{ matrix.os }} + steps: + - name: Checkout Repository ๐Ÿ“ฅ + uses: actions/checkout@v4 + + - name: Setup Node.js ๐ŸŒ + uses: actions/setup-node@v4 + with: + node-version: '20.x' + + - name: Setup pnpm ๐Ÿ“ฆ + uses: pnpm/action-setup@v2 + with: + version: 8.15.1 + + - name: Get pnpm store directory ๐Ÿ“ + shell: bash + run: | + echo "STORE_PATH=$(pnpm store path --silent)" >> $GITHUB_ENV + + - name: Setup pnpm cache ๐Ÿ—„๏ธ + uses: actions/cache@v3 + with: + path: ${{ env.STORE_PATH }} + key: ${{ runner.os }}-pnpm-store-${{ hashFiles('**/pnpm-lock.yaml') }} + restore-keys: | + ${{ runner.os }}-pnpm-store- + + - name: Install Dependencies ๐Ÿงถ + run: pnpm install + + - name: Download v15 WASM Artifacts ๐Ÿ“ฅ + uses: actions/download-artifact@v4 + with: + name: wasm-artifacts-v15 + path: versions/15/wasm/ + + - name: Download v16 WASM Artifacts ๐Ÿ“ฅ + uses: actions/download-artifact@v4 + with: + name: wasm-artifacts-v16 + path: versions/16/wasm/ + + - name: Download v17 WASM Artifacts ๐Ÿ“ฅ + uses: actions/download-artifact@v4 + with: + name: wasm-artifacts-v17 + path: versions/17/wasm/ + + - name: Download Parser Artifacts ๐Ÿ“ฅ + uses: actions/download-artifact@v4 + with: + name: parser-artifacts + path: parser/wasm/ + + - name: Run Parser Tests ๐Ÿ” + run: pnpm run test + working-directory: parser From bc68c5307d420096305bb5ae137333e61afca7d6 Mon Sep 17 00:00:00 2001 From: Dan Lynch Date: Sun, 22 Jun 2025 19:52:44 -0700 Subject: [PATCH 3/4] lock --- pnpm-lock.yaml | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 9d536b02..001dee8e 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -79,10 +79,17 @@ importers: version: 0.8.0 parser: + dependencies: + '@pgsql/types': + specifier: ^17.6.0 + version: 17.6.0 devDependencies: '@types/node': specifier: ^20.0.0 version: 20.19.1 + rimraf: + specifier: ^5.0.10 + version: 5.0.10 typescript: specifier: ^5.0.0 version: 5.8.3 From 72ba897b09a7f95bd154ffad0f5340b3dbf7d977 Mon Sep 17 00:00:00 2001 From: Dan Lynch Date: Sun, 22 Jun 2025 19:57:24 -0700 Subject: [PATCH 4/4] parser workflow fix --- .github/workflows/ci.yml | 8 ++++++++ parser/scripts/build.js | 19 ++++++++++++++++--- 2 files changed, 24 insertions(+), 3 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 98a8a879..27f83db0 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -159,6 +159,10 @@ jobs: - name: Install Dependencies ๐Ÿงถ run: pnpm install + - name: Install Parser Dependencies ๐Ÿ“ฆ + run: pnpm install + working-directory: parser + - name: Download v15 WASM Artifacts ๐Ÿ“ฅ uses: actions/download-artifact@v4 with: @@ -226,6 +230,10 @@ jobs: - name: Install Dependencies ๐Ÿงถ run: pnpm install + - name: Install Parser Dependencies ๐Ÿ“ฆ + run: pnpm install + working-directory: parser + - name: Download v15 WASM Artifacts ๐Ÿ“ฅ uses: actions/download-artifact@v4 with: diff --git a/parser/scripts/build.js b/parser/scripts/build.js index 3007d631..90a73ecb 100644 --- a/parser/scripts/build.js +++ b/parser/scripts/build.js @@ -4,9 +4,22 @@ const { execSync } = require('child_process'); // Run TypeScript compilation console.log('Compiling TypeScript...'); -const tscPath = path.join(__dirname, '../node_modules/.bin/tsc'); -execSync(`${tscPath}`, { stdio: 'inherit', cwd: path.join(__dirname, '..') }); -execSync(`${tscPath} -p tsconfig.esm.json`, { stdio: 'inherit', cwd: path.join(__dirname, '..') }); + +// 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');