diff --git a/Makefile.packages b/Makefile.packages
new file mode 100644
index 00000000..0337bc95
--- /dev/null
+++ b/Makefile.packages
@@ -0,0 +1,34 @@
+.PHONY: install build clean test pg17-full pg17
+
+# Package management Makefile for pg17-full and pg17 packages
+# Use this to build both packages: make -f Makefile.packages build
+
+# Default target
+all: install build
+
+# Install dependencies in both packages
+install:
+ cd pg17-full && yarn install
+ cd pg17 && yarn install
+
+# Build both packages using their individual build scripts
+build:
+ cd pg17-full && yarn build
+ cd pg17 && yarn build
+
+# Clean both packages
+clean:
+ cd pg17-full && yarn clean || true
+ cd pg17 && yarn clean || true
+
+# Test both packages
+test:
+ cd pg17-full && yarn test
+ cd pg17 && yarn test
+
+# Individual package targets
+pg17-full:
+ cd pg17-full && yarn && yarn build
+
+pg17:
+ cd pg17 && yarn && yarn build
diff --git a/README.md b/README.md
index 5e8b06c8..17ef2e51 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,4 @@
-# libpg-query
+# libpg-query-node
@@ -17,28 +17,100 @@
The real PostgreSQL parser for Node.js, powered by **WebAssembly (WASM)** for true cross-platform compatibility.
-A WASM-based PostgreSQL query parser that provides the same functionality as the native PostgreSQL parser without requiring native compilation or platform-specific binaries. Primarily used for the node.js parser and deparser [pgsql-parser](https://github.com/pyramation/pgsql-parser).
+This repository provides two distinct packages:
+
+- **pg17-full**: Complete PostgreSQL parser with all functionality including scan, deparse, and protobuf support
+- **pg17**: Minimal PostgreSQL parser focused on core parsing, fingerprinting, and normalization (excludes scan/deparse functionality)
+
+Both packages are WASM-based PostgreSQL query parsers that provide the same core functionality as the native PostgreSQL parser without requiring native compilation or platform-specific binaries.
## Table of Contents
-1. [Installation](#installation)
-2. [Usage](#usage)
-3. [Build Instructions](#build-instructions)
-4. [Testing](#testing)
-5. [Versions](#versions)
-6. [Related Projects](#related-projects)
-7. [Credit](#credit)
+1. [Package Structure](#package-structure)
+2. [Installation](#installation)
+3. [Building Both Packages](#building-both-packages)
+4. [Usage](#usage)
+5. [Build Instructions](#build-instructions)
+6. [Testing](#testing)
+7. [Versions](#versions)
+8. [Related Projects](#related-projects)
+9. [Credit](#credit)
+
+## Package Structure
+
+This repository contains two packages:
+### pg17-full (Complete Package)
+- Full PostgreSQL parsing functionality
+- Includes scan, deparse, and protobuf support
+- Larger package size due to complete feature set
+- Located in `./pg17-full/`
+
+### pg17 (Minimal Package)
+- Core PostgreSQL parsing functionality
+- Excludes scan, deparse, and protobuf features
+- Smaller package size optimized for basic parsing needs
+- Located in `./pg17/`
## Installation
-```sh
-npm install libpg-query
+Choose the package that best fits your needs:
+
+**For full functionality:**
+```bash
+cd pg17-full
+npm install
+```
+
+**For minimal parsing:**
+```bash
+cd pg17
+npm install
+```
+
+## Building Both Packages
+
+Use the package management Makefile to build both packages:
+
+```bash
+# Install dependencies for both packages
+make -f Makefile.packages install
+
+# Build both packages
+make -f Makefile.packages build
+
+# Clean both packages
+make -f Makefile.packages clean
+
+# Test both packages
+make -f Makefile.packages test
```
## Usage
+### Basic Examples
+
+**pg17-full (Complete Package):**
+```typescript
+import { parse, deparse, scan } from './pg17-full/src/index.js';
+
+const result = await parse('SELECT * FROM users WHERE active = true');
+const sql = await deparse(result);
+const tokens = await scan('SELECT * FROM users');
+console.log(JSON.stringify(result, null, 2));
+```
+
+**pg17 (Minimal Package):**
+```typescript
+import { parse, fingerprint, normalize } from './pg17/src/index.js';
+
+const result = await parse('SELECT * FROM users WHERE active = true');
+const fp = await fingerprint('SELECT * FROM users');
+const norm = await normalize('SELECT * FROM users');
+console.log(JSON.stringify(result, null, 2));
+```
+
### `parse(query: string): Promise`
Parses the SQL and returns a Promise for the parse tree. May reject with a parse error.
diff --git a/README.md.backup b/README.md.backup
new file mode 100644
index 00000000..5e8b06c8
--- /dev/null
+++ b/README.md.backup
@@ -0,0 +1,375 @@
+# libpg-query
+
+
+
+
+
+
+
+
+
+ 
+
+
+
+
+
+
+The real PostgreSQL parser for Node.js, powered by **WebAssembly (WASM)** for true cross-platform compatibility.
+
+A WASM-based PostgreSQL query parser that provides the same functionality as the native PostgreSQL parser without requiring native compilation or platform-specific binaries. Primarily used for the node.js parser and deparser [pgsql-parser](https://github.com/pyramation/pgsql-parser).
+
+
+## Table of Contents
+
+1. [Installation](#installation)
+2. [Usage](#usage)
+3. [Build Instructions](#build-instructions)
+4. [Testing](#testing)
+5. [Versions](#versions)
+6. [Related Projects](#related-projects)
+7. [Credit](#credit)
+
+
+## Installation
+
+```sh
+npm install libpg-query
+```
+
+## Usage
+
+### `parse(query: string): Promise`
+
+Parses the SQL and returns a Promise for the parse tree. May reject with a parse error.
+
+```typescript
+import { parse } from 'libpg-query';
+
+const result = await parse('SELECT * FROM users WHERE active = true');
+// Returns: ParseResult - parsed query object
+```
+
+### `parseSync(query: string): ParseResult`
+
+Synchronous version that returns the parse tree directly. May throw a parse error.
+
+```typescript
+import { parseSync } from 'libpg-query';
+
+const result = parseSync('SELECT * FROM users WHERE active = true');
+// Returns: ParseResult - parsed query object
+```
+
+### `parsePlPgSQL(funcsSql: string): Promise`
+
+Parses the contents of a PL/pgSQL function from a `CREATE FUNCTION` declaration. Returns a Promise for the parse tree.
+
+```typescript
+import { parsePlPgSQL } from 'libpg-query';
+
+const functionSql = `
+CREATE FUNCTION get_user_count() RETURNS integer AS $$
+BEGIN
+ RETURN (SELECT COUNT(*) FROM users);
+END;
+$$ LANGUAGE plpgsql;
+`;
+
+const result = await parsePlPgSQL(functionSql);
+```
+
+### `parsePlPgSQLSync(funcsSql: string): ParseResult`
+
+Synchronous version of PL/pgSQL parsing.
+
+```typescript
+import { parsePlPgSQLSync } from 'libpg-query';
+
+const result = parsePlPgSQLSync(functionSql);
+```
+
+### `deparse(parseTree: ParseResult): Promise`
+
+Converts a parse tree back to SQL string. Returns a Promise for the SQL string.
+
+```typescript
+import { parse, deparse } from 'libpg-query';
+
+const parseTree = await parse('SELECT * FROM users WHERE active = true');
+const sql = await deparse(parseTree);
+// Returns: string - reconstructed SQL query
+```
+
+### `deparseSync(parseTree: ParseResult): string`
+
+Synchronous version that converts a parse tree back to SQL string directly.
+
+```typescript
+import { parseSync, deparseSync } from 'libpg-query';
+
+const parseTree = parseSync('SELECT * FROM users WHERE active = true');
+const sql = deparseSync(parseTree);
+// Returns: string - reconstructed SQL query
+```
+
+### `fingerprint(sql: string): Promise`
+
+Generates a unique fingerprint for a SQL query that can be used for query identification and caching. Returns a Promise for a 16-character fingerprint string.
+
+```typescript
+import { fingerprint } from 'libpg-query';
+
+const fp = await fingerprint('SELECT * FROM users WHERE active = $1');
+// Returns: string - unique 16-character fingerprint (e.g., "50fde20626009aba")
+```
+
+### `fingerprintSync(sql: string): string`
+
+Synchronous version that generates a unique fingerprint for a SQL query directly.
+
+```typescript
+import { fingerprintSync } from 'libpg-query';
+
+const fp = fingerprintSync('SELECT * FROM users WHERE active = $1');
+// Returns: string - unique 16-character fingerprint
+```
+
+### `normalize(sql: string): Promise`
+
+Normalizes a SQL query by removing comments, standardizing whitespace, and converting to a canonical form. Returns a Promise for the normalized SQL string.
+
+```typescript
+import { normalize } from 'libpg-query';
+
+const normalized = await normalize('SELECT * FROM users WHERE active = true');
+// Returns: string - normalized SQL query
+```
+
+### `normalizeSync(sql: string): string`
+
+Synchronous version that normalizes a SQL query directly.
+
+```typescript
+import { normalizeSync } from 'libpg-query';
+
+const normalized = normalizeSync('SELECT * FROM users WHERE active = true');
+// Returns: string - normalized SQL query
+```
+
+### `scan(sql: string): Promise`
+
+Scans (tokenizes) a SQL query and returns detailed information about each token. Returns a Promise for a ScanResult containing all tokens with their positions, types, and classifications.
+
+```typescript
+import { scan } from 'libpg-query';
+
+const result = await scan('SELECT * FROM users WHERE id = $1');
+// Returns: ScanResult - detailed tokenization information
+console.log(result.tokens[0]); // { start: 0, end: 6, text: "SELECT", tokenType: 651, tokenName: "UNKNOWN", keywordKind: 4, keywordName: "RESERVED_KEYWORD" }
+```
+
+### `scanSync(sql: string): ScanResult`
+
+Synchronous version that scans (tokenizes) a SQL query directly.
+
+```typescript
+import { scanSync } from 'libpg-query';
+
+const result = scanSync('SELECT * FROM users WHERE id = $1');
+// Returns: ScanResult - detailed tokenization information
+```
+
+### Initialization
+
+The library provides both async and sync methods. Async methods handle initialization automatically, while sync methods require explicit initialization.
+
+#### Async Methods (Recommended)
+
+Async methods handle initialization automatically and are always safe to use:
+
+```typescript
+import { parse, deparse, scan } from 'libpg-query';
+
+// These handle initialization automatically
+const result = await parse('SELECT * FROM users');
+const sql = await deparse(result);
+const tokens = await scan('SELECT * FROM users');
+```
+
+#### Sync Methods
+
+Sync methods require explicit initialization using `loadModule()`:
+
+```typescript
+import { loadModule, parseSync, scanSync } from 'libpg-query';
+
+// Initialize first
+await loadModule();
+
+// Now safe to use sync methods
+const result = parseSync('SELECT * FROM users');
+const tokens = scanSync('SELECT * FROM users');
+```
+
+### `loadModule(): Promise`
+
+Explicitly initializes the WASM module. Required before using any sync methods.
+
+```typescript
+import { loadModule, parseSync, scanSync } from 'libpg-query';
+
+// Initialize before using sync methods
+await loadModule();
+const result = parseSync('SELECT * FROM users');
+const tokens = scanSync('SELECT * FROM users');
+```
+
+Note: We recommend using async methods as they handle initialization automatically. Use sync methods only when necessary, and always call `loadModule()` first.
+
+### Type Definitions
+
+```typescript
+interface ParseResult {
+ version: number;
+ stmts: Statement[];
+}
+
+interface Statement {
+ stmt_type: string;
+ stmt_len: number;
+ stmt_location: number;
+ query: string;
+}
+
+interface ScanResult {
+ version: number;
+ tokens: ScanToken[];
+}
+
+interface ScanToken {
+ start: number; // Starting position in the SQL string
+ end: number; // Ending position in the SQL string
+ text: string; // The actual token text
+ tokenType: number; // Numeric token type identifier
+ tokenName: string; // Human-readable token type name
+ keywordKind: number; // Numeric keyword classification
+ keywordName: string; // Human-readable keyword classification
+}
+```
+
+**Note:** The return value is an array, as multiple queries may be provided in a single string (semicolon-delimited, as PostgreSQL expects).
+
+## Build Instructions
+
+This package uses a **WASM-only build system** for true cross-platform compatibility without native compilation dependencies.
+
+### Prerequisites
+
+- Node.js (version 16 or higher recommended)
+
+### Building WASM Artifacts
+
+1. **Install dependencies:**
+ ```bash
+ npm install
+ ```
+
+2. **Build WASM artifacts:**
+ ```bash
+ npm run wasm:build
+ ```
+
+3. **Clean WASM build (if needed):**
+ ```bash
+ npm run wasm:clean
+ ```
+
+4. **Rebuild WASM artifacts from scratch:**
+ ```bash
+ npm run wasm:clean && npm run wasm:build
+ ```
+
+### Build Process Details
+
+The WASM build process:
+- Uses Emscripten SDK for compilation
+- Compiles C wrapper code to WebAssembly
+- Generates `wasm/libpg-query.js` and `wasm/libpg-query.wasm` files
+- No native compilation or node-gyp dependencies required
+
+## Testing
+
+### Running Tests
+
+```bash
+npm test
+```
+
+### Test Requirements
+
+- WASM artifacts must be built before running tests
+- If tests fail with "fetch failed" errors, rebuild WASM artifacts:
+ ```bash
+ npm run wasm:clean && npm run wasm:build && npm test
+ ```
+
+
+
+## Versions
+
+Our latest is built with `17-latest` branch from libpg_query
+
+
+| PG Major Version | libpg_query | Branch | npm
+|--------------------------|-------------|------------------------------------------------------------------------------------------------|---------|
+| 17 | 17-latest | [`17-latest`](https://github.com/launchql/libpg-query-node/tree/17-latest) | [`libpg-query@17.2.0`](https://www.npmjs.com/package/libpg-query/v/latest)
+| 16 | 16-latest | [`16-latest`](https://github.com/launchql/libpg-query-node/tree/16-latest) | [`libpg-query@16.2.0`](https://www.npmjs.com/package/libpg-query/v/16.2.0)
+| 15 | 15-latest | [`15-latest`](https://github.com/launchql/libpg-query-node/tree/15-latest) | [`libpg-query@15.1.0`](https://www.npmjs.com/package/libpg-query/v/15.1.0)
+| 14 | 14-latest | [`14-latest`](https://github.com/launchql/libpg-query-node/tree/14-latest) | [`libpg-query@14.0.0`](https://www.npmjs.com/package/libpg-query/v/14.0.0)
+| 13 | 13-latest | [`13-latest`](https://github.com/launchql/libpg-query-node/tree/13-latest) | [`libpg-query@13.3.1`](https://www.npmjs.com/package/libpg-query/v/13.3.1)
+| 12 | (n/a) | |
+| 11 | (n/a) | |
+| 10 | 10-latest | | `@1.3.1` ([tree](https://github.com/pyramation/pgsql-parser/tree/39b7b1adc8914253226e286a48105785219a81ca)) |
+
+
+## Troubleshooting
+
+### Common Issues
+
+**"fetch failed" errors during tests:**
+- This indicates stale or missing WASM artifacts
+- Solution: `npm run wasm:clean && npm run wasm:build`
+
+**"WASM module not initialized" errors:**
+- Ensure you call an async method first to initialize the WASM module
+- Or use the async versions of methods which handle initialization automatically
+
+**Build environment issues:**
+- Ensure Emscripten SDK is properly installed and configured
+- Check that all required build dependencies are available
+
+### Build Artifacts
+
+The build process generates these files:
+- `wasm/libpg-query.js` - Emscripten-generated JavaScript loader
+- `wasm/libpg-query.wasm` - WebAssembly binary
+- `wasm/index.js` - ES module exports
+- `wasm/index.cjs` - CommonJS exports with sync wrappers
+
+## Related Projects
+
+* [libpg_query](https://github.com/pganalyze/libpg_query)
+* [pgsql-parser](https://github.com/pyramation/pgsql-parser)
+* [pg_query](https://github.com/lfittl/pg_query)
+* [pg_query.go](https://github.com/lfittl/pg_query.go)
+
+## Credit
+
+This is based on the output of [libpg_query](https://github.com/pganalyze/libpg_query). This wraps the static library output and links it into a node module for use in js.
+
+All credit for the hard problems goes to [Lukas Fittl](https://github.com/lfittl).
+
+Additional thanks for the original Node.js integration work by [Ethan Resnick](https://github.com/ethanresnick).
+
+Original [Code](https://github.com/zhm/node-pg-query-native) and [License](https://github.com/zhm/node-pg-query-native/blob/master/LICENSE.md)
diff --git a/.github/workflows/build-wasm-no-docker.yaml b/pg17-full/.github/workflows/build-wasm-no-docker.yaml
similarity index 100%
rename from .github/workflows/build-wasm-no-docker.yaml
rename to pg17-full/.github/workflows/build-wasm-no-docker.yaml
diff --git a/.github/workflows/build-wasm.yml b/pg17-full/.github/workflows/build-wasm.yml
similarity index 100%
rename from .github/workflows/build-wasm.yml
rename to pg17-full/.github/workflows/build-wasm.yml
diff --git a/.github/workflows/ci.yml b/pg17-full/.github/workflows/ci.yml
similarity index 100%
rename from .github/workflows/ci.yml
rename to pg17-full/.github/workflows/ci.yml
diff --git a/.gitignore b/pg17-full/.gitignore
similarity index 100%
rename from .gitignore
rename to pg17-full/.gitignore
diff --git a/.npmignore b/pg17-full/.npmignore
similarity index 100%
rename from .npmignore
rename to pg17-full/.npmignore
diff --git a/.yamlize/config/config.yaml b/pg17-full/.yamlize/config/config.yaml
similarity index 100%
rename from .yamlize/config/config.yaml
rename to pg17-full/.yamlize/config/config.yaml
diff --git a/.yamlize/workflows/build.yaml b/pg17-full/.yamlize/workflows/build.yaml
similarity index 100%
rename from .yamlize/workflows/build.yaml
rename to pg17-full/.yamlize/workflows/build.yaml
diff --git a/.yamlize/workflows/yaml/build-wasm.yaml b/pg17-full/.yamlize/workflows/yaml/build-wasm.yaml
similarity index 100%
rename from .yamlize/workflows/yaml/build-wasm.yaml
rename to pg17-full/.yamlize/workflows/yaml/build-wasm.yaml
diff --git a/.yamlize/workflows/yaml/emscripten/build.yaml b/pg17-full/.yamlize/workflows/yaml/emscripten/build.yaml
similarity index 100%
rename from .yamlize/workflows/yaml/emscripten/build.yaml
rename to pg17-full/.yamlize/workflows/yaml/emscripten/build.yaml
diff --git a/.yamlize/workflows/yaml/emscripten/install.yaml b/pg17-full/.yamlize/workflows/yaml/emscripten/install.yaml
similarity index 100%
rename from .yamlize/workflows/yaml/emscripten/install.yaml
rename to pg17-full/.yamlize/workflows/yaml/emscripten/install.yaml
diff --git a/.yamlize/workflows/yaml/git/checkout.yaml b/pg17-full/.yamlize/workflows/yaml/git/checkout.yaml
similarity index 100%
rename from .yamlize/workflows/yaml/git/checkout.yaml
rename to pg17-full/.yamlize/workflows/yaml/git/checkout.yaml
diff --git a/.yamlize/workflows/yaml/git/configure.yaml b/pg17-full/.yamlize/workflows/yaml/git/configure.yaml
similarity index 100%
rename from .yamlize/workflows/yaml/git/configure.yaml
rename to pg17-full/.yamlize/workflows/yaml/git/configure.yaml
diff --git a/.yamlize/workflows/yaml/node/setup.yaml b/pg17-full/.yamlize/workflows/yaml/node/setup.yaml
similarity index 100%
rename from .yamlize/workflows/yaml/node/setup.yaml
rename to pg17-full/.yamlize/workflows/yaml/node/setup.yaml
diff --git a/CHANGELOG.md b/pg17-full/CHANGELOG.md
similarity index 100%
rename from CHANGELOG.md
rename to pg17-full/CHANGELOG.md
diff --git a/LICENSE b/pg17-full/LICENSE
similarity index 100%
rename from LICENSE
rename to pg17-full/LICENSE
diff --git a/pg17-full/Makefile b/pg17-full/Makefile
new file mode 100644
index 00000000..ba93a976
--- /dev/null
+++ b/pg17-full/Makefile
@@ -0,0 +1,88 @@
+WASM_OUT_DIR := wasm
+WASM_OUT_NAME := libpg-query
+WASM_MODULE_NAME := PgQueryModule
+LIBPG_QUERY_REPO := https://github.com/pganalyze/libpg_query.git
+LIBPG_QUERY_TAG := 17-6.1.0
+
+CACHE_DIR := .cache
+
+OS ?= $(shell uname -s)
+ARCH ?= $(shell uname -m)
+
+ifdef EMSCRIPTEN
+PLATFORM := emscripten
+else ifeq ($(OS),Darwin)
+PLATFORM := darwin
+else ifeq ($(OS),Linux)
+PLATFORM := linux
+else
+$(error Unsupported platform: $(OS))
+endif
+
+ifdef EMSCRIPTEN
+ARCH := wasm
+endif
+
+PLATFORM_ARCH := $(PLATFORM)-$(ARCH)
+SRC_FILES := src/wasm_wrapper.c
+LIBPG_QUERY_DIR := $(CACHE_DIR)/$(PLATFORM_ARCH)/libpg_query/$(LIBPG_QUERY_TAG)
+LIBPG_QUERY_ARCHIVE := $(LIBPG_QUERY_DIR)/libpg_query.a
+LIBPG_QUERY_HEADER := $(LIBPG_QUERY_DIR)/pg_query.h
+CXXFLAGS := -O3
+
+ifdef EMSCRIPTEN
+OUT_FILES := $(foreach EXT,.js .wasm,$(WASM_OUT_DIR)/$(WASM_OUT_NAME)$(EXT))
+else
+$(error Native builds are no longer supported. Use EMSCRIPTEN=1 for WASM builds only.)
+endif
+
+# Clone libpg_query source (lives in CACHE_DIR)
+$(LIBPG_QUERY_DIR):
+ mkdir -p $(CACHE_DIR)
+ git clone -b $(LIBPG_QUERY_TAG) --single-branch $(LIBPG_QUERY_REPO) $(LIBPG_QUERY_DIR)
+
+$(LIBPG_QUERY_HEADER): $(LIBPG_QUERY_DIR)
+
+# Build libpg_query
+$(LIBPG_QUERY_ARCHIVE): $(LIBPG_QUERY_DIR)
+ cd $(LIBPG_QUERY_DIR); $(MAKE) build
+
+# Build libpg-query-node WASM module
+$(OUT_FILES): $(LIBPG_QUERY_ARCHIVE) $(LIBPG_QUERY_HEADER) $(SRC_FILES)
+ifdef EMSCRIPTEN
+ $(CC) \
+ -v \
+ $(CXXFLAGS) \
+ -I$(LIBPG_QUERY_DIR) \
+ -I$(LIBPG_QUERY_DIR)/vendor \
+ -L$(LIBPG_QUERY_DIR) \
+ -sEXPORTED_FUNCTIONS="['_malloc','_free','_wasm_parse_query','_wasm_parse_query_protobuf','_wasm_get_protobuf_len','_wasm_deparse_protobuf','_wasm_parse_plpgsql','_wasm_fingerprint','_wasm_normalize_query','_wasm_scan','_wasm_parse_query_detailed','_wasm_free_detailed_result','_wasm_free_string']" \
+ -sEXPORTED_RUNTIME_METHODS="['lengthBytesUTF8','stringToUTF8','UTF8ToString','HEAPU8','HEAPU32']" \
+ -sEXPORT_NAME="$(WASM_MODULE_NAME)" \
+ -sENVIRONMENT="web,node" \
+ -sMODULARIZE=1 \
+ -sEXPORT_ES6=1 \
+ -sALLOW_MEMORY_GROWTH=1 \
+ -lpg_query \
+ -o $@ \
+ $(SRC_FILES)
+else
+$(error Native builds are no longer supported. Use EMSCRIPTEN=1 for WASM builds only.)
+endif
+
+# Commands
+build: $(OUT_FILES)
+
+build-cache: $(LIBPG_QUERY_ARCHIVE) $(LIBPG_QUERY_HEADER)
+
+rebuild: clean build
+
+rebuild-cache: clean-cache build-cache
+
+clean:
+ -@ rm -r $(OUT_FILES) > /dev/null 2>&1
+
+clean-cache:
+ -@ rm -rf $(LIBPG_QUERY_DIR)
+
+.PHONY: build build-cache rebuild rebuild-cache clean clean-cache
diff --git a/SCAN.md b/pg17-full/SCAN.md
similarity index 100%
rename from SCAN.md
rename to pg17-full/SCAN.md
diff --git a/libpg_query.md b/pg17-full/libpg_query.md
similarity index 100%
rename from libpg_query.md
rename to pg17-full/libpg_query.md
diff --git a/libpg_query/protobuf/.gitkeep b/pg17-full/libpg_query/protobuf/.gitkeep
similarity index 100%
rename from libpg_query/protobuf/.gitkeep
rename to pg17-full/libpg_query/protobuf/.gitkeep
diff --git a/pg17-full/original_Makefile b/pg17-full/original_Makefile
new file mode 100644
index 00000000..ba93a976
--- /dev/null
+++ b/pg17-full/original_Makefile
@@ -0,0 +1,88 @@
+WASM_OUT_DIR := wasm
+WASM_OUT_NAME := libpg-query
+WASM_MODULE_NAME := PgQueryModule
+LIBPG_QUERY_REPO := https://github.com/pganalyze/libpg_query.git
+LIBPG_QUERY_TAG := 17-6.1.0
+
+CACHE_DIR := .cache
+
+OS ?= $(shell uname -s)
+ARCH ?= $(shell uname -m)
+
+ifdef EMSCRIPTEN
+PLATFORM := emscripten
+else ifeq ($(OS),Darwin)
+PLATFORM := darwin
+else ifeq ($(OS),Linux)
+PLATFORM := linux
+else
+$(error Unsupported platform: $(OS))
+endif
+
+ifdef EMSCRIPTEN
+ARCH := wasm
+endif
+
+PLATFORM_ARCH := $(PLATFORM)-$(ARCH)
+SRC_FILES := src/wasm_wrapper.c
+LIBPG_QUERY_DIR := $(CACHE_DIR)/$(PLATFORM_ARCH)/libpg_query/$(LIBPG_QUERY_TAG)
+LIBPG_QUERY_ARCHIVE := $(LIBPG_QUERY_DIR)/libpg_query.a
+LIBPG_QUERY_HEADER := $(LIBPG_QUERY_DIR)/pg_query.h
+CXXFLAGS := -O3
+
+ifdef EMSCRIPTEN
+OUT_FILES := $(foreach EXT,.js .wasm,$(WASM_OUT_DIR)/$(WASM_OUT_NAME)$(EXT))
+else
+$(error Native builds are no longer supported. Use EMSCRIPTEN=1 for WASM builds only.)
+endif
+
+# Clone libpg_query source (lives in CACHE_DIR)
+$(LIBPG_QUERY_DIR):
+ mkdir -p $(CACHE_DIR)
+ git clone -b $(LIBPG_QUERY_TAG) --single-branch $(LIBPG_QUERY_REPO) $(LIBPG_QUERY_DIR)
+
+$(LIBPG_QUERY_HEADER): $(LIBPG_QUERY_DIR)
+
+# Build libpg_query
+$(LIBPG_QUERY_ARCHIVE): $(LIBPG_QUERY_DIR)
+ cd $(LIBPG_QUERY_DIR); $(MAKE) build
+
+# Build libpg-query-node WASM module
+$(OUT_FILES): $(LIBPG_QUERY_ARCHIVE) $(LIBPG_QUERY_HEADER) $(SRC_FILES)
+ifdef EMSCRIPTEN
+ $(CC) \
+ -v \
+ $(CXXFLAGS) \
+ -I$(LIBPG_QUERY_DIR) \
+ -I$(LIBPG_QUERY_DIR)/vendor \
+ -L$(LIBPG_QUERY_DIR) \
+ -sEXPORTED_FUNCTIONS="['_malloc','_free','_wasm_parse_query','_wasm_parse_query_protobuf','_wasm_get_protobuf_len','_wasm_deparse_protobuf','_wasm_parse_plpgsql','_wasm_fingerprint','_wasm_normalize_query','_wasm_scan','_wasm_parse_query_detailed','_wasm_free_detailed_result','_wasm_free_string']" \
+ -sEXPORTED_RUNTIME_METHODS="['lengthBytesUTF8','stringToUTF8','UTF8ToString','HEAPU8','HEAPU32']" \
+ -sEXPORT_NAME="$(WASM_MODULE_NAME)" \
+ -sENVIRONMENT="web,node" \
+ -sMODULARIZE=1 \
+ -sEXPORT_ES6=1 \
+ -sALLOW_MEMORY_GROWTH=1 \
+ -lpg_query \
+ -o $@ \
+ $(SRC_FILES)
+else
+$(error Native builds are no longer supported. Use EMSCRIPTEN=1 for WASM builds only.)
+endif
+
+# Commands
+build: $(OUT_FILES)
+
+build-cache: $(LIBPG_QUERY_ARCHIVE) $(LIBPG_QUERY_HEADER)
+
+rebuild: clean build
+
+rebuild-cache: clean-cache build-cache
+
+clean:
+ -@ rm -r $(OUT_FILES) > /dev/null 2>&1
+
+clean-cache:
+ -@ rm -rf $(LIBPG_QUERY_DIR)
+
+.PHONY: build build-cache rebuild rebuild-cache clean clean-cache
diff --git a/package-lock.json b/pg17-full/package-lock.json
similarity index 100%
rename from package-lock.json
rename to pg17-full/package-lock.json
diff --git a/package.json b/pg17-full/package.json
similarity index 100%
rename from package.json
rename to pg17-full/package.json
diff --git a/proto.js b/pg17-full/proto.js
similarity index 100%
rename from proto.js
rename to pg17-full/proto.js
diff --git a/scripts/build.js b/pg17-full/scripts/build.js
similarity index 100%
rename from scripts/build.js
rename to pg17-full/scripts/build.js
diff --git a/scripts/protogen.js b/pg17-full/scripts/protogen.js
similarity index 100%
rename from scripts/protogen.js
rename to pg17-full/scripts/protogen.js
diff --git a/scripts/yamlize.js b/pg17-full/scripts/yamlize.js
similarity index 100%
rename from scripts/yamlize.js
rename to pg17-full/scripts/yamlize.js
diff --git a/src/index.ts b/pg17-full/src/index.ts
similarity index 100%
rename from src/index.ts
rename to pg17-full/src/index.ts
diff --git a/src/libpg-query.d.ts b/pg17-full/src/libpg-query.d.ts
similarity index 100%
rename from src/libpg-query.d.ts
rename to pg17-full/src/libpg-query.d.ts
diff --git a/src/proto.d.ts b/pg17-full/src/proto.d.ts
similarity index 100%
rename from src/proto.d.ts
rename to pg17-full/src/proto.d.ts
diff --git a/src/wasm_wrapper.c b/pg17-full/src/wasm_wrapper.c
similarity index 100%
rename from src/wasm_wrapper.c
rename to pg17-full/src/wasm_wrapper.c
diff --git a/test/deparsing.test.js b/pg17-full/test/deparsing.test.js
similarity index 100%
rename from test/deparsing.test.js
rename to pg17-full/test/deparsing.test.js
diff --git a/test/fingerprint.test.js b/pg17-full/test/fingerprint.test.js
similarity index 100%
rename from test/fingerprint.test.js
rename to pg17-full/test/fingerprint.test.js
diff --git a/test/normalize.test.js b/pg17-full/test/normalize.test.js
similarity index 100%
rename from test/normalize.test.js
rename to pg17-full/test/normalize.test.js
diff --git a/test/parsing.test.js b/pg17-full/test/parsing.test.js
similarity index 100%
rename from test/parsing.test.js
rename to pg17-full/test/parsing.test.js
diff --git a/test/plpgsql.test.js b/pg17-full/test/plpgsql.test.js
similarity index 100%
rename from test/plpgsql.test.js
rename to pg17-full/test/plpgsql.test.js
diff --git a/test/scan.test.js b/pg17-full/test/scan.test.js
similarity index 100%
rename from test/scan.test.js
rename to pg17-full/test/scan.test.js
diff --git a/tsconfig.esm.json b/pg17-full/tsconfig.esm.json
similarity index 100%
rename from tsconfig.esm.json
rename to pg17-full/tsconfig.esm.json
diff --git a/tsconfig.json b/pg17-full/tsconfig.json
similarity index 100%
rename from tsconfig.json
rename to pg17-full/tsconfig.json
diff --git a/wasm/index.cjs b/pg17-full/wasm/index.cjs
similarity index 100%
rename from wasm/index.cjs
rename to pg17-full/wasm/index.cjs
diff --git a/wasm/index.d.ts b/pg17-full/wasm/index.d.ts
similarity index 100%
rename from wasm/index.d.ts
rename to pg17-full/wasm/index.d.ts
diff --git a/wasm/index.js b/pg17-full/wasm/index.js
similarity index 100%
rename from wasm/index.js
rename to pg17-full/wasm/index.js
diff --git a/yarn.lock b/pg17-full/yarn.lock
similarity index 100%
rename from yarn.lock
rename to pg17-full/yarn.lock
diff --git a/pg17/.github/workflows/build-wasm-no-docker.yaml b/pg17/.github/workflows/build-wasm-no-docker.yaml
new file mode 100644
index 00000000..62c745d1
--- /dev/null
+++ b/pg17/.github/workflows/build-wasm-no-docker.yaml
@@ -0,0 +1,36 @@
+name: Build Wasm ๐
+'on':
+ workflow_dispatch: null
+jobs:
+ 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
+ cache: yarn
+ - name: Install and Build ๐
+ run: |
+ yarn
+ - name: Install Emscripten โ๐ป
+ run: |
+ sudo apt-get update
+ sudo apt-get install cmake python3 python3-pip
+ git clone --branch 3.1.59 --depth 1 https://github.com/emscripten-core/emsdk.git
+ cd emsdk
+ ./emsdk install 3.1.59
+ ./emsdk activate 3.1.59
+ source ./emsdk_env.sh
+ - name: Build with Emscripten ๐
+ run: |
+ source ./emsdk/emsdk_env.sh
+ emmake make
+ emmake make build
+ - name: Archive production artifacts ๐
+ uses: actions/upload-artifact@v4
+ with:
+ name: wasm-artifacts
+ path: wasm
diff --git a/pg17/.github/workflows/build-wasm.yml b/pg17/.github/workflows/build-wasm.yml
new file mode 100644
index 00000000..836363b4
--- /dev/null
+++ b/pg17/.github/workflows/build-wasm.yml
@@ -0,0 +1,30 @@
+name: Build Wasm ๐
+
+on:
+ workflow_dispatch:
+
+jobs:
+ 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'
+ cache: 'yarn'
+
+ - name: Install Dependencies ๐งถ
+ run: yarn install
+
+ - name: Build WASM ๐
+ run: npm run wasm:build
+
+ - name: Archive production artifacts ๐
+ uses: actions/upload-artifact@v4
+ with:
+ name: wasm-artifacts
+ path: wasm/
+ retention-days: 7
diff --git a/pg17/.github/workflows/ci.yml b/pg17/.github/workflows/ci.yml
new file mode 100644
index 00000000..d6479ee4
--- /dev/null
+++ b/pg17/.github/workflows/ci.yml
@@ -0,0 +1,65 @@
+name: CI ๐
+
+on:
+ pull_request:
+ types: [opened, synchronize, reopened]
+ push:
+ branches: [main, master]
+ workflow_dispatch:
+
+jobs:
+ build-wasm:
+ name: 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'
+ cache: 'yarn'
+
+ - name: Install Dependencies ๐งถ
+ run: yarn install
+
+ - name: Build WASM ๐
+ run: npm run wasm:build
+
+ - name: Upload WASM Artifacts ๐ฆ
+ uses: actions/upload-artifact@v4
+ with:
+ name: wasm-artifacts
+ path: wasm/
+ retention-days: 1
+
+ test:
+ name: Test on ${{ matrix.os }} ${{ matrix.os == 'ubuntu-latest' && '๐ง' || matrix.os == 'macos-latest' && '๐' || '๐ช' }}
+ needs: build-wasm
+ 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'
+ cache: 'yarn'
+
+ - name: Install Dependencies ๐งถ
+ run: yarn install
+
+ - name: Download WASM Artifacts ๐ฅ
+ uses: actions/download-artifact@v4
+ with:
+ name: wasm-artifacts
+ path: wasm/
+
+ - name: Run Tests ๐
+ run: yarn test
diff --git a/pg17/.gitignore b/pg17/.gitignore
new file mode 100644
index 00000000..079f990d
--- /dev/null
+++ b/pg17/.gitignore
@@ -0,0 +1,11 @@
+node_modules/
+build/
+libs/
+npm-debug.log
+libpg_query/**/*.proto
+wasm/libpg-query.js
+*.wasm
+.cache
+esm/
+cjs/
+.claude
diff --git a/pg17/.npmignore b/pg17/.npmignore
new file mode 100644
index 00000000..5099528c
--- /dev/null
+++ b/pg17/.npmignore
@@ -0,0 +1,18 @@
+# project files
+test
+.gitignore
+package.json
+build
+
+*.log
+npm-debug.log*
+
+# Dependency directories
+node_modules
+
+libpg_query/*
+
+# npm package lock
+package-lock.json
+yarn.lock
+
diff --git a/pg17/.yamlize/config/config.yaml b/pg17/.yamlize/config/config.yaml
new file mode 100644
index 00000000..81d6284f
--- /dev/null
+++ b/pg17/.yamlize/config/config.yaml
@@ -0,0 +1,5 @@
+git:
+ USER_NAME: Hyperweb
+ USER_EMAIL: developers@hyperweb.io
+EMSCRIPTEN_VERSION: '3.1.59'
+NODE_VERSION: '20.x'
diff --git a/pg17/.yamlize/workflows/build.yaml b/pg17/.yamlize/workflows/build.yaml
new file mode 100644
index 00000000..62452358
--- /dev/null
+++ b/pg17/.yamlize/workflows/build.yaml
@@ -0,0 +1,8 @@
+name: Build Wasm ๐
+
+on:
+ workflow_dispatch:
+
+jobs:
+ build-wasm:
+ import-yaml: yaml/build-wasm.yaml
\ No newline at end of file
diff --git a/pg17/.yamlize/workflows/yaml/build-wasm.yaml b/pg17/.yamlize/workflows/yaml/build-wasm.yaml
new file mode 100644
index 00000000..72584c3a
--- /dev/null
+++ b/pg17/.yamlize/workflows/yaml/build-wasm.yaml
@@ -0,0 +1,19 @@
+runs-on: ubuntu-latest
+steps:
+ - import-yaml: git/checkout.yaml
+
+ - import-yaml: node/setup.yaml
+
+ - name: Install and Build ๐
+ run: |
+ yarn
+
+ - import-yaml: emscripten/install.yaml
+
+ - import-yaml: emscripten/build.yaml
+
+ - name: Archive production artifacts ๐
+ uses: actions/upload-artifact@v4
+ with:
+ name: wasm-artifacts
+ path: wasm
diff --git a/pg17/.yamlize/workflows/yaml/emscripten/build.yaml b/pg17/.yamlize/workflows/yaml/emscripten/build.yaml
new file mode 100644
index 00000000..7c52e90e
--- /dev/null
+++ b/pg17/.yamlize/workflows/yaml/emscripten/build.yaml
@@ -0,0 +1,5 @@
+name: Build with Emscripten ๐
+run: |
+ source ./emsdk/emsdk_env.sh
+ emmake make
+ emmake make build
diff --git a/pg17/.yamlize/workflows/yaml/emscripten/install.yaml b/pg17/.yamlize/workflows/yaml/emscripten/install.yaml
new file mode 100644
index 00000000..5ab8fb0f
--- /dev/null
+++ b/pg17/.yamlize/workflows/yaml/emscripten/install.yaml
@@ -0,0 +1,9 @@
+name: Install Emscripten โ๐ป
+run: |
+ sudo apt-get update
+ sudo apt-get install cmake python3 python3-pip
+ git clone --branch ${{yamlize.EMSCRIPTEN_VERSION}} --depth 1 https://github.com/emscripten-core/emsdk.git
+ cd emsdk
+ ./emsdk install ${{yamlize.EMSCRIPTEN_VERSION}}
+ ./emsdk activate ${{yamlize.EMSCRIPTEN_VERSION}}
+ source ./emsdk_env.sh
\ No newline at end of file
diff --git a/pg17/.yamlize/workflows/yaml/git/checkout.yaml b/pg17/.yamlize/workflows/yaml/git/checkout.yaml
new file mode 100644
index 00000000..6e308353
--- /dev/null
+++ b/pg17/.yamlize/workflows/yaml/git/checkout.yaml
@@ -0,0 +1,2 @@
+name: Checkout Repository ๐ฅ
+uses: actions/checkout@v4
\ No newline at end of file
diff --git a/pg17/.yamlize/workflows/yaml/git/configure.yaml b/pg17/.yamlize/workflows/yaml/git/configure.yaml
new file mode 100644
index 00000000..4877e8de
--- /dev/null
+++ b/pg17/.yamlize/workflows/yaml/git/configure.yaml
@@ -0,0 +1,4 @@
+name: Configure Git ๐
+run: |
+ git config user.name "${{yamlize.git.USER_NAME}}"
+ git config user.email "${{yamlize.git.USER_EMAIL}}"
diff --git a/pg17/.yamlize/workflows/yaml/node/setup.yaml b/pg17/.yamlize/workflows/yaml/node/setup.yaml
new file mode 100644
index 00000000..37115566
--- /dev/null
+++ b/pg17/.yamlize/workflows/yaml/node/setup.yaml
@@ -0,0 +1,5 @@
+name: Setup Node.js ๐
+uses: actions/setup-node@v4
+with:
+ node-version: ${{yamlize.NODE_VERSION}}
+ cache: 'yarn'
\ No newline at end of file
diff --git a/pg17/CHANGELOG.md b/pg17/CHANGELOG.md
new file mode 100644
index 00000000..1e26c64c
--- /dev/null
+++ b/pg17/CHANGELOG.md
@@ -0,0 +1,38 @@
+# 17.2.1
+* Add normalize() and normalizeSync() functions for SQL normalization
+* Add fingerprint() and fingerprintSync() functions for query fingerprinting
+* Add isReady() function to check WASM module initialization status
+* Improve memory management and error handling in WASM wrapper
+* Remove unused dependencies (lodash, deasync, @launchql/protobufjs)
+* Split test suite into separate files for better organization
+* Update documentation with comprehensive function examples
+
+# 1.2.1
+* Rename package
+
+# 1.2.0
+* Add TS typings
+
+# 1.1.2 (07/23/19)
+* Fix build script
+
+# 1.1.0 (Republish, 07/23/19)
+* Rewrite to use Node-Addons-API (C++ wrapper for the stable N-API)
+* Support PL/PGSql Parsing
+* Support async parsing
+
+## 0.0.5 (November 19, 2015)
+* Update libpg_query to include latest A_CONST fixes
+
+## 0.0.4 (November 16, 2015)
+* Update libpg_query to include fix for empty string constants
+* Warning fixed in 0.0.3 is back for now until libpg_query has support for custom CFLAGS
+
+## 0.0.3 (November 14, 2015)
+* Update OSX static library to include `-mmacosx-version-min=10.5` to fix warnings on installation
+
+## 0.0.2 (November 14, 2015)
+* Rename repo to pg-query-native
+
+## 0.0.1 (November 14, 2015)
+* First version
diff --git a/pg17/LICENSE b/pg17/LICENSE
new file mode 100644
index 00000000..883d29d0
--- /dev/null
+++ b/pg17/LICENSE
@@ -0,0 +1,22 @@
+The MIT License (MIT)
+
+Copyright (c) 2021 Dan Lynch
+Copyright (c) 2025 Interweb, Inc.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/pg17/Makefile b/pg17/Makefile
new file mode 100644
index 00000000..25aa0745
--- /dev/null
+++ b/pg17/Makefile
@@ -0,0 +1,88 @@
+WASM_OUT_DIR := wasm
+WASM_OUT_NAME := libpg-query
+WASM_MODULE_NAME := PgQueryModule
+LIBPG_QUERY_REPO := https://github.com/pganalyze/libpg_query.git
+LIBPG_QUERY_TAG := 17-6.1.0
+
+CACHE_DIR := .cache
+
+OS ?= $(shell uname -s)
+ARCH ?= $(shell uname -m)
+
+ifdef EMSCRIPTEN
+PLATFORM := emscripten
+else ifeq ($(OS),Darwin)
+PLATFORM := darwin
+else ifeq ($(OS),Linux)
+PLATFORM := linux
+else
+$(error Unsupported platform: $(OS))
+endif
+
+ifdef EMSCRIPTEN
+ARCH := wasm
+endif
+
+PLATFORM_ARCH := $(PLATFORM)-$(ARCH)
+SRC_FILES := src/wasm_wrapper.c
+LIBPG_QUERY_DIR := $(CACHE_DIR)/$(PLATFORM_ARCH)/libpg_query/$(LIBPG_QUERY_TAG)
+LIBPG_QUERY_ARCHIVE := $(LIBPG_QUERY_DIR)/libpg_query.a
+LIBPG_QUERY_HEADER := $(LIBPG_QUERY_DIR)/pg_query.h
+CXXFLAGS := -O3
+
+ifdef EMSCRIPTEN
+OUT_FILES := $(foreach EXT,.js .wasm,$(WASM_OUT_DIR)/$(WASM_OUT_NAME)$(EXT))
+else
+$(error Native builds are no longer supported. Use EMSCRIPTEN=1 for WASM builds only.)
+endif
+
+# Clone libpg_query source (lives in CACHE_DIR)
+$(LIBPG_QUERY_DIR):
+ mkdir -p $(CACHE_DIR)
+ git clone -b $(LIBPG_QUERY_TAG) --single-branch $(LIBPG_QUERY_REPO) $(LIBPG_QUERY_DIR)
+
+$(LIBPG_QUERY_HEADER): $(LIBPG_QUERY_DIR)
+
+# Build libpg_query
+$(LIBPG_QUERY_ARCHIVE): $(LIBPG_QUERY_DIR)
+ cd $(LIBPG_QUERY_DIR); $(MAKE) build
+
+# Build libpg-query-node WASM module
+$(OUT_FILES): $(LIBPG_QUERY_ARCHIVE) $(LIBPG_QUERY_HEADER) $(SRC_FILES)
+ifdef EMSCRIPTEN
+ $(CC) \
+ -v \
+ $(CXXFLAGS) \
+ -I$(LIBPG_QUERY_DIR) \
+ -I$(LIBPG_QUERY_DIR)/vendor \
+ -L$(LIBPG_QUERY_DIR) \
+ -sEXPORTED_FUNCTIONS="['_malloc','_free','_wasm_parse_query','_wasm_parse_query_protobuf','_wasm_get_protobuf_len','_wasm_parse_plpgsql','_wasm_fingerprint','_wasm_normalize_query','_wasm_parse_query_detailed','_wasm_free_detailed_result','_wasm_free_string']" \
+ -sEXPORTED_RUNTIME_METHODS="['lengthBytesUTF8','stringToUTF8','UTF8ToString','HEAPU8','HEAPU32']" \
+ -sEXPORT_NAME="$(WASM_MODULE_NAME)" \
+ -sENVIRONMENT="web,node" \
+ -sMODULARIZE=1 \
+ -sEXPORT_ES6=1 \
+ -sALLOW_MEMORY_GROWTH=1 \
+ -lpg_query \
+ -o $@ \
+ $(SRC_FILES)
+else
+$(error Native builds are no longer supported. Use EMSCRIPTEN=1 for WASM builds only.)
+endif
+
+# Commands
+build: $(OUT_FILES)
+
+build-cache: $(LIBPG_QUERY_ARCHIVE) $(LIBPG_QUERY_HEADER)
+
+rebuild: clean build
+
+rebuild-cache: clean-cache build-cache
+
+clean:
+ -@ rm -r $(OUT_FILES) > /dev/null 2>&1
+
+clean-cache:
+ -@ rm -rf $(LIBPG_QUERY_DIR)
+
+.PHONY: build build-cache rebuild rebuild-cache clean clean-cache
diff --git a/pg17/libpg_query.md b/pg17/libpg_query.md
new file mode 100644
index 00000000..2b4e4e8b
--- /dev/null
+++ b/pg17/libpg_query.md
@@ -0,0 +1,558 @@
+# libpg_query API Documentation
+
+This document provides comprehensive documentation for the libpg_query API, focusing on the core parsing, scanning, and deparsing functionality.
+
+## Overview
+
+libpg_query is a C library that provides PostgreSQL SQL parsing functionality. It exposes the PostgreSQL parser as a standalone library, allowing you to parse SQL statements into parse trees, scan for tokens, and deparse parse trees back into SQL.
+
+## Core Data Structures
+
+### PgQueryError
+```c
+typedef struct {
+ char* message; // exception message
+ char* funcname; // source function of exception (e.g. SearchSysCache)
+ char* filename; // source of exception (e.g. parse.l)
+ int lineno; // source of exception (e.g. 104)
+ int cursorpos; // char in query at which exception occurred
+ char* context; // additional context (optional, can be NULL)
+} PgQueryError;
+```
+
+### PgQueryProtobuf
+```c
+typedef struct {
+ size_t len;
+ char* data;
+} PgQueryProtobuf;
+```
+
+### Parser Options
+```c
+typedef enum {
+ PG_QUERY_PARSE_DEFAULT = 0,
+ PG_QUERY_PARSE_TYPE_NAME,
+ PG_QUERY_PARSE_PLPGSQL_EXPR,
+ PG_QUERY_PARSE_PLPGSQL_ASSIGN1,
+ PG_QUERY_PARSE_PLPGSQL_ASSIGN2,
+ PG_QUERY_PARSE_PLPGSQL_ASSIGN3
+} PgQueryParseMode;
+```
+
+### Parser Option Flags
+- `PG_QUERY_DISABLE_BACKSLASH_QUOTE` (16) - backslash_quote = off
+- `PG_QUERY_DISABLE_STANDARD_CONFORMING_STRINGS` (32) - standard_conforming_strings = off
+- `PG_QUERY_DISABLE_ESCAPE_STRING_WARNING` (64) - escape_string_warning = off
+
+## Core API Functions
+
+### Scanning Functions
+
+#### pg_query_scan
+```c
+PgQueryScanResult pg_query_scan(const char* input);
+```
+**Description**: Scans SQL input and returns tokens in protobuf format.
+
+**Parameters**:
+- `input`: SQL string to scan
+
+**Returns**: `PgQueryScanResult` containing:
+- `pbuf`: Protobuf data with scan results
+- `stderr_buffer`: Any stderr output during scanning
+- `error`: Error information if scanning failed
+
+**Usage**: Use this when you need to tokenize SQL without full parsing.
+
+## Scanning and Token Processing
+
+### Working with Scan Results
+
+The `pg_query_scan` function returns tokens in protobuf format that need to be unpacked to access individual tokens. Here's the complete workflow:
+
+### Step 1: Scan SQL
+```c
+const char* sql = "SELECT * FROM users WHERE id = $1";
+PgQueryScanResult result = pg_query_scan(sql);
+
+if (result.error) {
+ printf("Scan error: %s at position %d\n",
+ result.error->message, result.error->cursorpos);
+ pg_query_free_scan_result(result);
+ return;
+}
+```
+
+### Step 2: Unpack Protobuf Data
+```c
+#include "protobuf/pg_query.pb-c.h"
+
+PgQuery__ScanResult *scan_result = pg_query__scan_result__unpack(
+ NULL, // Use default allocator
+ result.pbuf.len, // Length of protobuf data
+ (void *) result.pbuf.data // Protobuf data
+);
+
+printf("Found %zu tokens\n", scan_result->n_tokens);
+```
+
+### Step 3: Process Individual Tokens
+```c
+for (size_t i = 0; i < scan_result->n_tokens; i++) {
+ PgQuery__ScanToken *token = scan_result->tokens[i];
+
+ // Extract token text from original SQL
+ int token_length = token->end - token->start;
+ char token_text[token_length + 1];
+ strncpy(token_text, &sql[token->start], token_length);
+ token_text[token_length] = '\0';
+
+ // Get token type name
+ const ProtobufCEnumValue *token_kind =
+ protobuf_c_enum_descriptor_get_value(&pg_query__token__descriptor, token->token);
+
+ // Get keyword classification
+ const ProtobufCEnumValue *keyword_kind =
+ protobuf_c_enum_descriptor_get_value(&pg_query__keyword_kind__descriptor, token->keyword_kind);
+
+ printf("Token %zu: \"%s\" [%d-%d] Type: %s, Keyword: %s\n",
+ i, token_text, token->start, token->end,
+ token_kind->name, keyword_kind->name);
+}
+```
+
+### Step 4: Clean Up Memory
+```c
+// Free the unpacked protobuf data
+pg_query__scan_result__free_unpacked(scan_result, NULL);
+
+// Free the original scan result
+pg_query_free_scan_result(result);
+```
+
+## Token Structure Details
+
+### PgQuery__ScanResult Structure
+```c
+struct PgQuery__ScanResult {
+ ProtobufCMessage base;
+ int32_t version; // Protocol version
+ size_t n_tokens; // Number of tokens
+ PgQuery__ScanToken **tokens; // Array of token pointers
+};
+```
+
+### PgQuery__ScanToken Structure
+```c
+struct PgQuery__ScanToken {
+ ProtobufCMessage base;
+ int32_t start; // Starting position in SQL string
+ int32_t end; // Ending position in SQL string
+ PgQuery__Token token; // Token type enum
+ PgQuery__KeywordKind keyword_kind; // Keyword classification
+};
+```
+
+## Token Types and Classifications
+
+### Keyword Classifications (PgQuery__KeywordKind)
+- `PG_QUERY__KEYWORD_KIND__NO_KEYWORD` (0) - Not a keyword
+- `PG_QUERY__KEYWORD_KIND__UNRESERVED_KEYWORD` (1) - Unreserved keyword
+- `PG_QUERY__KEYWORD_KIND__COL_NAME_KEYWORD` (2) - Column name keyword
+- `PG_QUERY__KEYWORD_KIND__TYPE_FUNC_NAME_KEYWORD` (3) - Type/function name keyword
+- `PG_QUERY__KEYWORD_KIND__RESERVED_KEYWORD` (4) - Reserved keyword
+
+### Common Token Types (PgQuery__Token)
+**Special/Control Tokens:**
+- `PG_QUERY__TOKEN__NUL` (0) - Null token
+
+**Single-Character Operators:**
+- `PG_QUERY__TOKEN__ASCII_40` (40) - "("
+- `PG_QUERY__TOKEN__ASCII_41` (41) - ")"
+- `PG_QUERY__TOKEN__ASCII_42` (42) - "*"
+- `PG_QUERY__TOKEN__ASCII_44` (44) - ","
+- `PG_QUERY__TOKEN__ASCII_59` (59) - ";"
+- `PG_QUERY__TOKEN__ASCII_61` (61) - "="
+
+**Named Lexical Tokens:**
+- `PG_QUERY__TOKEN__IDENT` (258) - Regular identifier
+- `PG_QUERY__TOKEN__SCONST` (261) - String constant
+- `PG_QUERY__TOKEN__ICONST` (266) - Integer constant
+- `PG_QUERY__TOKEN__FCONST` (260) - Float constant
+- `PG_QUERY__TOKEN__PARAM` (267) - Parameter marker ($1, $2, etc.)
+
+**Multi-Character Operators:**
+- `PG_QUERY__TOKEN__TYPECAST` (268) - "::"
+- `PG_QUERY__TOKEN__DOT_DOT` (269) - ".."
+- `PG_QUERY__TOKEN__LESS_EQUALS` (272) - "<="
+- `PG_QUERY__TOKEN__GREATER_EQUALS` (273) - ">="
+- `PG_QUERY__TOKEN__NOT_EQUALS` (274) - "!=" or "<>"
+
+**Common SQL Keywords:**
+- `PG_QUERY__TOKEN__SELECT` - SELECT keyword
+- `PG_QUERY__TOKEN__FROM` - FROM keyword
+- `PG_QUERY__TOKEN__WHERE` - WHERE keyword
+- `PG_QUERY__TOKEN__INSERT` - INSERT keyword
+- `PG_QUERY__TOKEN__UPDATE` - UPDATE keyword
+- `PG_QUERY__TOKEN__DELETE` - DELETE keyword
+
+**Comments:**
+- `PG_QUERY__TOKEN__SQL_COMMENT` (275) - SQL-style comment (-- comment)
+- `PG_QUERY__TOKEN__C_COMMENT` (276) - C-style comment (/* comment */)
+
+## Protobuf Helper Functions
+
+### Unpacking Functions
+```c
+// Unpack scan result
+PgQuery__ScanResult *pg_query__scan_result__unpack(
+ ProtobufCAllocator *allocator, // NULL for default
+ size_t len, // Length of data
+ const uint8_t *data // Protobuf data
+);
+
+// Free unpacked scan result
+void pg_query__scan_result__free_unpacked(
+ PgQuery__ScanResult *message, // Message to free
+ ProtobufCAllocator *allocator // NULL for default
+);
+```
+
+### Enum Value Lookup Functions
+```c
+// Get token type name
+const ProtobufCEnumValue *protobuf_c_enum_descriptor_get_value(
+ const ProtobufCEnumDescriptor *desc, // &pg_query__token__descriptor
+ int value // token->token
+);
+
+// Get keyword kind name
+const ProtobufCEnumValue *protobuf_c_enum_descriptor_get_value(
+ const ProtobufCEnumDescriptor *desc, // &pg_query__keyword_kind__descriptor
+ int value // token->keyword_kind
+);
+```
+
+## Complete Example: SQL Tokenizer
+
+```c
+#include
+#include
+#include
+#include
+#include "protobuf/pg_query.pb-c.h"
+
+void print_tokens(const char* sql) {
+ PgQueryScanResult result = pg_query_scan(sql);
+
+ if (result.error) {
+ printf("Error: %s at position %d\n",
+ result.error->message, result.error->cursorpos);
+ pg_query_free_scan_result(result);
+ return;
+ }
+
+ PgQuery__ScanResult *scan_result = pg_query__scan_result__unpack(
+ NULL, result.pbuf.len, (void *) result.pbuf.data);
+
+ printf("SQL: %s\n", sql);
+ printf("Tokens (%zu):\n", scan_result->n_tokens);
+
+ for (size_t i = 0; i < scan_result->n_tokens; i++) {
+ PgQuery__ScanToken *token = scan_result->tokens[i];
+
+ // Extract token text
+ int len = token->end - token->start;
+ printf(" [%zu] \"%.*s\" (%d-%d) ",
+ i, len, &sql[token->start], token->start, token->end);
+
+ // Get token type
+ const ProtobufCEnumValue *token_kind =
+ protobuf_c_enum_descriptor_get_value(&pg_query__token__descriptor, token->token);
+ printf("Type: %s", token_kind->name);
+
+ // Get keyword classification if applicable
+ if (token->keyword_kind != PG_QUERY__KEYWORD_KIND__NO_KEYWORD) {
+ const ProtobufCEnumValue *keyword_kind =
+ protobuf_c_enum_descriptor_get_value(&pg_query__keyword_kind__descriptor, token->keyword_kind);
+ printf(", Keyword: %s", keyword_kind->name);
+ }
+ printf("\n");
+ }
+
+ pg_query__scan_result__free_unpacked(scan_result, NULL);
+ pg_query_free_scan_result(result);
+}
+
+int main() {
+ print_tokens("SELECT * FROM users WHERE id = $1");
+ print_tokens("INSERT INTO table VALUES (1, 'text', 3.14)");
+ print_tokens("-- Comment\nUPDATE table SET col = col + 1");
+
+ pg_query_exit();
+ return 0;
+}
+```
+
+## Build Requirements
+
+To use scanning functionality, compile with:
+```bash
+gcc -I. -I./protobuf your_program.c -lpg_query -lprotobuf-c
+```
+
+Make sure to include:
+- `pg_query.h` - Main API header
+- `protobuf/pg_query.pb-c.h` - Protobuf definitions
+
+### Parsing Functions
+
+#### pg_query_parse
+```c
+PgQueryParseResult pg_query_parse(const char* input);
+```
+**Description**: Parses SQL input into a JSON parse tree.
+
+**Parameters**:
+- `input`: SQL string to parse
+
+**Returns**: `PgQueryParseResult` containing:
+- `parse_tree`: JSON representation of the parse tree
+- `stderr_buffer`: Any stderr output during parsing
+- `error`: Error information if parsing failed
+
+#### pg_query_parse_opts
+```c
+PgQueryParseResult pg_query_parse_opts(const char* input, int parser_options);
+```
+**Description**: Parses SQL input with custom parser options.
+
+**Parameters**:
+- `input`: SQL string to parse
+- `parser_options`: Bitwise OR of parser options and flags
+
+**Returns**: Same as `pg_query_parse`
+
+#### pg_query_parse_protobuf
+```c
+PgQueryProtobufParseResult pg_query_parse_protobuf(const char* input);
+```
+**Description**: Parses SQL input into protobuf format parse tree.
+
+**Parameters**:
+- `input`: SQL string to parse
+
+**Returns**: `PgQueryProtobufParseResult` containing:
+- `parse_tree`: Protobuf representation of the parse tree
+- `stderr_buffer`: Any stderr output during parsing
+- `error`: Error information if parsing failed
+
+#### pg_query_parse_protobuf_opts
+```c
+PgQueryProtobufParseResult pg_query_parse_protobuf_opts(const char* input, int parser_options);
+```
+**Description**: Parses SQL input into protobuf format with custom options.
+
+**Parameters**:
+- `input`: SQL string to parse
+- `parser_options`: Bitwise OR of parser options and flags
+
+**Returns**: Same as `pg_query_parse_protobuf`
+
+#### pg_query_parse_plpgsql
+```c
+PgQueryPlpgsqlParseResult pg_query_parse_plpgsql(const char* input);
+```
+**Description**: Parses PL/pgSQL code.
+
+**Parameters**:
+- `input`: PL/pgSQL code to parse
+
+**Returns**: `PgQueryPlpgsqlParseResult` containing:
+- `plpgsql_funcs`: JSON representation of PL/pgSQL functions
+- `error`: Error information if parsing failed
+
+### Deparsing Functions
+
+#### pg_query_deparse_protobuf
+```c
+PgQueryDeparseResult pg_query_deparse_protobuf(PgQueryProtobuf parse_tree);
+```
+**Description**: Converts a protobuf parse tree back into SQL.
+
+**Parameters**:
+- `parse_tree`: Protobuf parse tree to deparse
+
+**Returns**: `PgQueryDeparseResult` containing:
+- `query`: Deparsed SQL string
+- `error`: Error information if deparsing failed
+
+**Usage**: Use this to convert parse trees back to SQL, useful for query transformation.
+
+### Utility Functions
+
+#### pg_query_normalize
+```c
+PgQueryNormalizeResult pg_query_normalize(const char* input);
+```
+**Description**: Normalizes a SQL query by removing comments and standardizing formatting.
+
+**Parameters**:
+- `input`: SQL string to normalize
+
+**Returns**: `PgQueryNormalizeResult` containing:
+- `normalized_query`: Normalized SQL string
+- `error`: Error information if normalization failed
+
+#### pg_query_normalize_utility
+```c
+PgQueryNormalizeResult pg_query_normalize_utility(const char* input);
+```
+**Description**: Normalizes utility statements (DDL, etc.).
+
+**Parameters**:
+- `input`: SQL string to normalize
+
+**Returns**: Same as `pg_query_normalize`
+
+#### pg_query_fingerprint
+```c
+PgQueryFingerprintResult pg_query_fingerprint(const char* input);
+```
+**Description**: Generates a fingerprint for a SQL query.
+
+**Parameters**:
+- `input`: SQL string to fingerprint
+
+**Returns**: `PgQueryFingerprintResult` containing:
+- `fingerprint`: 64-bit fingerprint hash
+- `fingerprint_str`: String representation of fingerprint
+- `stderr_buffer`: Any stderr output
+- `error`: Error information if fingerprinting failed
+
+#### pg_query_fingerprint_opts
+```c
+PgQueryFingerprintResult pg_query_fingerprint_opts(const char* input, int parser_options);
+```
+**Description**: Generates a fingerprint with custom parser options.
+
+**Parameters**:
+- `input`: SQL string to fingerprint
+- `parser_options`: Bitwise OR of parser options and flags
+
+**Returns**: Same as `pg_query_fingerprint`
+
+### Statement Splitting Functions
+
+#### pg_query_split_with_scanner
+```c
+PgQuerySplitResult pg_query_split_with_scanner(const char *input);
+```
+**Description**: Splits multi-statement SQL using the scanner. Use when statements may contain parse errors.
+
+**Parameters**:
+- `input`: SQL string containing multiple statements
+
+**Returns**: `PgQuerySplitResult` containing:
+- `stmts`: Array of statement locations and lengths
+- `n_stmts`: Number of statements found
+- `stderr_buffer`: Any stderr output
+- `error`: Error information if splitting failed
+
+#### pg_query_split_with_parser
+```c
+PgQuerySplitResult pg_query_split_with_parser(const char *input);
+```
+**Description**: Splits multi-statement SQL using the parser (recommended for better accuracy).
+
+**Parameters**:
+- `input`: SQL string containing multiple statements
+
+**Returns**: Same as `pg_query_split_with_scanner`
+
+## Memory Management
+
+### Cleanup Functions
+All result structures must be freed using their corresponding cleanup functions:
+
+```c
+void pg_query_free_normalize_result(PgQueryNormalizeResult result);
+void pg_query_free_scan_result(PgQueryScanResult result);
+void pg_query_free_parse_result(PgQueryParseResult result);
+void pg_query_free_split_result(PgQuerySplitResult result);
+void pg_query_free_deparse_result(PgQueryDeparseResult result);
+void pg_query_free_protobuf_parse_result(PgQueryProtobufParseResult result);
+void pg_query_free_plpgsql_parse_result(PgQueryPlpgsqlParseResult result);
+void pg_query_free_fingerprint_result(PgQueryFingerprintResult result);
+```
+
+### Global Cleanup
+```c
+void pg_query_exit(void);
+```
+**Description**: Optional cleanup of top-level memory context. Automatically done for threads that exit.
+
+## Error Handling
+
+All functions return result structures that include an `error` field. Always check this field before using other result data:
+
+```c
+PgQueryParseResult result = pg_query_parse(sql);
+if (result.error) {
+ printf("Parse error: %s\n", result.error->message);
+ printf("Location: %s:%d\n", result.error->filename, result.error->lineno);
+ if (result.error->cursorpos > 0) {
+ printf("Position: %d\n", result.error->cursorpos);
+ }
+} else {
+ // Use result.parse_tree
+}
+pg_query_free_parse_result(result);
+```
+
+## Example Usage
+
+### Basic Parsing
+```c
+#include "pg_query.h"
+
+const char* sql = "SELECT * FROM users WHERE id = $1";
+PgQueryParseResult result = pg_query_parse(sql);
+
+if (result.error) {
+ printf("Error: %s\n", result.error->message);
+} else {
+ printf("Parse tree: %s\n", result.parse_tree);
+}
+
+pg_query_free_parse_result(result);
+```
+
+### Parse and Deparse Cycle
+```c
+// Parse to protobuf
+PgQueryProtobufParseResult parse_result = pg_query_parse_protobuf(sql);
+if (!parse_result.error) {
+ // Deparse back to SQL
+ PgQueryDeparseResult deparse_result = pg_query_deparse_protobuf(parse_result.parse_tree);
+ if (!deparse_result.error) {
+ printf("Deparsed: %s\n", deparse_result.query);
+ }
+ pg_query_free_deparse_result(deparse_result);
+}
+pg_query_free_protobuf_parse_result(parse_result);
+```
+
+## Version Information
+
+- PostgreSQL Version: 17.4 (PG_VERSION_NUM: 170004)
+- Major Version: 17
+
+## Notes
+
+- The library is thread-safe
+- Always free result structures to avoid memory leaks
+- Use protobuf format for better performance when doing parse/deparse cycles
+- Scanner-based splitting is more robust for malformed SQL
+- Parser-based splitting is more accurate for well-formed SQL
\ No newline at end of file
diff --git a/pg17/libpg_query/protobuf/.gitkeep b/pg17/libpg_query/protobuf/.gitkeep
new file mode 100644
index 00000000..e69de29b
diff --git a/pg17/original_Makefile b/pg17/original_Makefile
new file mode 100644
index 00000000..ba93a976
--- /dev/null
+++ b/pg17/original_Makefile
@@ -0,0 +1,88 @@
+WASM_OUT_DIR := wasm
+WASM_OUT_NAME := libpg-query
+WASM_MODULE_NAME := PgQueryModule
+LIBPG_QUERY_REPO := https://github.com/pganalyze/libpg_query.git
+LIBPG_QUERY_TAG := 17-6.1.0
+
+CACHE_DIR := .cache
+
+OS ?= $(shell uname -s)
+ARCH ?= $(shell uname -m)
+
+ifdef EMSCRIPTEN
+PLATFORM := emscripten
+else ifeq ($(OS),Darwin)
+PLATFORM := darwin
+else ifeq ($(OS),Linux)
+PLATFORM := linux
+else
+$(error Unsupported platform: $(OS))
+endif
+
+ifdef EMSCRIPTEN
+ARCH := wasm
+endif
+
+PLATFORM_ARCH := $(PLATFORM)-$(ARCH)
+SRC_FILES := src/wasm_wrapper.c
+LIBPG_QUERY_DIR := $(CACHE_DIR)/$(PLATFORM_ARCH)/libpg_query/$(LIBPG_QUERY_TAG)
+LIBPG_QUERY_ARCHIVE := $(LIBPG_QUERY_DIR)/libpg_query.a
+LIBPG_QUERY_HEADER := $(LIBPG_QUERY_DIR)/pg_query.h
+CXXFLAGS := -O3
+
+ifdef EMSCRIPTEN
+OUT_FILES := $(foreach EXT,.js .wasm,$(WASM_OUT_DIR)/$(WASM_OUT_NAME)$(EXT))
+else
+$(error Native builds are no longer supported. Use EMSCRIPTEN=1 for WASM builds only.)
+endif
+
+# Clone libpg_query source (lives in CACHE_DIR)
+$(LIBPG_QUERY_DIR):
+ mkdir -p $(CACHE_DIR)
+ git clone -b $(LIBPG_QUERY_TAG) --single-branch $(LIBPG_QUERY_REPO) $(LIBPG_QUERY_DIR)
+
+$(LIBPG_QUERY_HEADER): $(LIBPG_QUERY_DIR)
+
+# Build libpg_query
+$(LIBPG_QUERY_ARCHIVE): $(LIBPG_QUERY_DIR)
+ cd $(LIBPG_QUERY_DIR); $(MAKE) build
+
+# Build libpg-query-node WASM module
+$(OUT_FILES): $(LIBPG_QUERY_ARCHIVE) $(LIBPG_QUERY_HEADER) $(SRC_FILES)
+ifdef EMSCRIPTEN
+ $(CC) \
+ -v \
+ $(CXXFLAGS) \
+ -I$(LIBPG_QUERY_DIR) \
+ -I$(LIBPG_QUERY_DIR)/vendor \
+ -L$(LIBPG_QUERY_DIR) \
+ -sEXPORTED_FUNCTIONS="['_malloc','_free','_wasm_parse_query','_wasm_parse_query_protobuf','_wasm_get_protobuf_len','_wasm_deparse_protobuf','_wasm_parse_plpgsql','_wasm_fingerprint','_wasm_normalize_query','_wasm_scan','_wasm_parse_query_detailed','_wasm_free_detailed_result','_wasm_free_string']" \
+ -sEXPORTED_RUNTIME_METHODS="['lengthBytesUTF8','stringToUTF8','UTF8ToString','HEAPU8','HEAPU32']" \
+ -sEXPORT_NAME="$(WASM_MODULE_NAME)" \
+ -sENVIRONMENT="web,node" \
+ -sMODULARIZE=1 \
+ -sEXPORT_ES6=1 \
+ -sALLOW_MEMORY_GROWTH=1 \
+ -lpg_query \
+ -o $@ \
+ $(SRC_FILES)
+else
+$(error Native builds are no longer supported. Use EMSCRIPTEN=1 for WASM builds only.)
+endif
+
+# Commands
+build: $(OUT_FILES)
+
+build-cache: $(LIBPG_QUERY_ARCHIVE) $(LIBPG_QUERY_HEADER)
+
+rebuild: clean build
+
+rebuild-cache: clean-cache build-cache
+
+clean:
+ -@ rm -r $(OUT_FILES) > /dev/null 2>&1
+
+clean-cache:
+ -@ rm -rf $(LIBPG_QUERY_DIR)
+
+.PHONY: build build-cache rebuild rebuild-cache clean clean-cache
diff --git a/pg17/package-lock.json b/pg17/package-lock.json
new file mode 100644
index 00000000..bb72aa84
--- /dev/null
+++ b/pg17/package-lock.json
@@ -0,0 +1,2782 @@
+{
+ "name": "libpg-query",
+ "version": "17.2.0",
+ "lockfileVersion": 3,
+ "requires": true,
+ "packages": {
+ "": {
+ "name": "libpg-query",
+ "version": "17.2.0",
+ "license": "LICENSE IN LICENSE",
+ "dependencies": {
+ "@launchql/protobufjs": "7.2.6",
+ "@pgsql/types": "^17.0.0"
+ },
+ "devDependencies": {
+ "@launchql/proto-cli": "1.25.0",
+ "@yamlize/cli": "^0.8.0",
+ "chai": "^3.5.0",
+ "mocha": "^11.7.0",
+ "rimraf": "5.0.0",
+ "typescript": "^5.3.3"
+ }
+ },
+ "node_modules/@babel/code-frame": {
+ "version": "7.24.2",
+ "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.2.tgz",
+ "integrity": "sha512-y5+tLQyV8pg3fsiln67BVLD1P13Eg4lh5RW9mF0zUuvLrv9uIQ4MCL+CRT+FTsBlBjcIan6PGsLcBN0m3ClUyQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/highlight": "^7.24.2",
+ "picocolors": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/generator": {
+ "version": "7.24.5",
+ "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.24.5.tgz",
+ "integrity": "sha512-x32i4hEXvr+iI0NEoEfDKzlemF8AmtOP8CcrRaEcpzysWuoEb1KknpcvMsHKPONoKZiDuItklgWhB18xEhr9PA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/types": "^7.24.5",
+ "@jridgewell/gen-mapping": "^0.3.5",
+ "@jridgewell/trace-mapping": "^0.3.25",
+ "jsesc": "^2.5.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/generator/node_modules/@babel/types": {
+ "version": "7.24.5",
+ "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.24.5.tgz",
+ "integrity": "sha512-6mQNsaLeXTw0nxYUYu+NSa4Hx4BlF1x1x8/PMFbiR+GBSr+2DkECc69b8hgy2frEodNcvPffeH8YfWd3LI6jhQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-string-parser": "^7.24.1",
+ "@babel/helper-validator-identifier": "^7.24.5",
+ "to-fast-properties": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-environment-visitor": {
+ "version": "7.22.20",
+ "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz",
+ "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-function-name": {
+ "version": "7.23.0",
+ "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz",
+ "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/template": "^7.22.15",
+ "@babel/types": "^7.23.0"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-hoist-variables": {
+ "version": "7.22.5",
+ "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz",
+ "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/types": "^7.22.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-split-export-declaration": {
+ "version": "7.24.5",
+ "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.24.5.tgz",
+ "integrity": "sha512-5CHncttXohrHk8GWOFCcCl4oRD9fKosWlIRgWm4ql9VYioKm52Mk2xsmoohvm7f3JoiLSM5ZgJuRaf5QZZYd3Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/types": "^7.24.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-split-export-declaration/node_modules/@babel/types": {
+ "version": "7.24.5",
+ "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.24.5.tgz",
+ "integrity": "sha512-6mQNsaLeXTw0nxYUYu+NSa4Hx4BlF1x1x8/PMFbiR+GBSr+2DkECc69b8hgy2frEodNcvPffeH8YfWd3LI6jhQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-string-parser": "^7.24.1",
+ "@babel/helper-validator-identifier": "^7.24.5",
+ "to-fast-properties": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-string-parser": {
+ "version": "7.24.1",
+ "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.24.1.tgz",
+ "integrity": "sha512-2ofRCjnnA9y+wk8b9IAREroeUP02KHp431N2mhKniy2yKIDKpbrHv9eXwm8cBeWQYcJmzv5qKCu65P47eCF7CQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-validator-identifier": {
+ "version": "7.24.5",
+ "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.5.tgz",
+ "integrity": "sha512-3q93SSKX2TWCG30M2G2kwaKeTYgEUp5Snjuj8qm729SObL6nbtUldAi37qbxkD5gg3xnBio+f9nqpSepGZMvxA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/highlight": {
+ "version": "7.24.5",
+ "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.5.tgz",
+ "integrity": "sha512-8lLmua6AVh/8SLJRRVD6V8p73Hir9w5mJrhE+IPpILG31KKlI9iz5zmBYKcWPS59qSfgP9RaSBQSHHE81WKuEw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-validator-identifier": "^7.24.5",
+ "chalk": "^2.4.2",
+ "js-tokens": "^4.0.0",
+ "picocolors": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/highlight/node_modules/ansi-styles": {
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
+ "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "color-convert": "^1.9.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/@babel/highlight/node_modules/chalk": {
+ "version": "2.4.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
+ "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-styles": "^3.2.1",
+ "escape-string-regexp": "^1.0.5",
+ "supports-color": "^5.3.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/@babel/highlight/node_modules/color-convert": {
+ "version": "1.9.3",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
+ "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "color-name": "1.1.3"
+ }
+ },
+ "node_modules/@babel/highlight/node_modules/color-name": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
+ "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@babel/highlight/node_modules/escape-string-regexp": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
+ "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.8.0"
+ }
+ },
+ "node_modules/@babel/highlight/node_modules/has-flag": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
+ "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/@babel/highlight/node_modules/supports-color": {
+ "version": "5.5.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
+ "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "has-flag": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/@babel/parser": {
+ "version": "7.24.5",
+ "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.5.tgz",
+ "integrity": "sha512-EOv5IK8arwh3LI47dz1b0tKUb/1uhHAnHJOrjgtQMIpu1uXd9mlFrJg9IUgGUgZ41Ch0K8REPTYpO7B76b4vJg==",
+ "dev": true,
+ "license": "MIT",
+ "bin": {
+ "parser": "bin/babel-parser.js"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/@babel/template": {
+ "version": "7.24.0",
+ "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.24.0.tgz",
+ "integrity": "sha512-Bkf2q8lMB0AFpX0NFEqSbx1OkTHf0f+0j82mkw+ZpzBnkk7e9Ql0891vlfgi+kHwOk8tQjiQHpqh4LaSa0fKEA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/code-frame": "^7.23.5",
+ "@babel/parser": "^7.24.0",
+ "@babel/types": "^7.24.0"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/traverse": {
+ "version": "7.24.1",
+ "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.24.1.tgz",
+ "integrity": "sha512-xuU6o9m68KeqZbQuDt2TcKSxUw/mrsvavlEqQ1leZ/B+C9tk6E4sRWy97WaXgvq5E+nU3cXMxv3WKOCanVMCmQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/code-frame": "^7.24.1",
+ "@babel/generator": "^7.24.1",
+ "@babel/helper-environment-visitor": "^7.22.20",
+ "@babel/helper-function-name": "^7.23.0",
+ "@babel/helper-hoist-variables": "^7.22.5",
+ "@babel/helper-split-export-declaration": "^7.22.6",
+ "@babel/parser": "^7.24.1",
+ "@babel/types": "^7.24.0",
+ "debug": "^4.3.1",
+ "globals": "^11.1.0"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/types": {
+ "version": "7.24.0",
+ "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.24.0.tgz",
+ "integrity": "sha512-+j7a5c253RfKh8iABBhywc8NSfP5LURe7Uh4qpsh6jc+aLJguvmIUBdjSdEMQv2bENrCR5MfRdjGo7vzS/ob7w==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-string-parser": "^7.23.4",
+ "@babel/helper-validator-identifier": "^7.22.20",
+ "to-fast-properties": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@isaacs/cliui": {
+ "version": "8.0.2",
+ "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz",
+ "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "string-width": "^5.1.2",
+ "string-width-cjs": "npm:string-width@^4.2.0",
+ "strip-ansi": "^7.0.1",
+ "strip-ansi-cjs": "npm:strip-ansi@^6.0.1",
+ "wrap-ansi": "^8.1.0",
+ "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@jridgewell/gen-mapping": {
+ "version": "0.3.5",
+ "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz",
+ "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@jridgewell/set-array": "^1.2.1",
+ "@jridgewell/sourcemap-codec": "^1.4.10",
+ "@jridgewell/trace-mapping": "^0.3.24"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/@jridgewell/resolve-uri": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz",
+ "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/@jridgewell/set-array": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz",
+ "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/@jridgewell/sourcemap-codec": {
+ "version": "1.4.15",
+ "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz",
+ "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@jridgewell/trace-mapping": {
+ "version": "0.3.25",
+ "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz",
+ "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@jridgewell/resolve-uri": "^3.1.0",
+ "@jridgewell/sourcemap-codec": "^1.4.14"
+ }
+ },
+ "node_modules/@jsdoc/salty": {
+ "version": "0.2.8",
+ "resolved": "https://registry.npmjs.org/@jsdoc/salty/-/salty-0.2.8.tgz",
+ "integrity": "sha512-5e+SFVavj1ORKlKaKr2BmTOekmXbelU7dC0cDkQLqag7xfuTPuGMUFx7KWJuv4bYZrTsoL2Z18VVCOKYxzoHcg==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "lodash": "^4.17.21"
+ },
+ "engines": {
+ "node": ">=v12.0.0"
+ }
+ },
+ "node_modules/@launchql/proto-cli": {
+ "version": "1.25.0",
+ "resolved": "https://registry.npmjs.org/@launchql/proto-cli/-/proto-cli-1.25.0.tgz",
+ "integrity": "sha512-W5U2U3QS6133GLeM7iqjaIez8wazjEvtPwm3EzgiEDtV7n0I5fQDYXXabCjGTIy/WQ6pHos53pB95EcV+ey93Q==",
+ "dev": true,
+ "license": "SEE LICENSE IN LICENSE",
+ "dependencies": {
+ "@launchql/protobufjs": "7.2.6",
+ "@launchql/protobufjs-cli": "1.1.5",
+ "chalk": "^4.1.0",
+ "glob": "8.0.3",
+ "inquirerer": "1.9.0",
+ "minimist": "1.2.8",
+ "mkdirp": "3.0.1",
+ "nested-obj": "^0.0.1",
+ "pg-proto-parser": "^1.23.0"
+ },
+ "bin": {
+ "pg-proto-parser": "main/index.js"
+ }
+ },
+ "node_modules/@launchql/protobufjs": {
+ "version": "7.2.6",
+ "resolved": "https://registry.npmjs.org/@launchql/protobufjs/-/protobufjs-7.2.6.tgz",
+ "integrity": "sha512-vwi1nG2/heVFsIMHQU1KxTjUp5c757CTtRAZn/jutApCkFlle1iv8tzM/DHlSZJKDldxaYqnNYTg0pTyp8Bbtg==",
+ "hasInstallScript": true,
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "@protobufjs/aspromise": "^1.1.2",
+ "@protobufjs/base64": "^1.1.2",
+ "@protobufjs/codegen": "^2.0.4",
+ "@protobufjs/eventemitter": "^1.1.0",
+ "@protobufjs/fetch": "^1.1.0",
+ "@protobufjs/float": "^1.0.2",
+ "@protobufjs/inquire": "^1.1.0",
+ "@protobufjs/path": "^1.1.2",
+ "@protobufjs/pool": "^1.1.0",
+ "@protobufjs/utf8": "^1.1.0",
+ "@types/node": ">=13.7.0",
+ "long": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=12.0.0"
+ }
+ },
+ "node_modules/@launchql/protobufjs-cli": {
+ "version": "1.1.5",
+ "resolved": "https://registry.npmjs.org/@launchql/protobufjs-cli/-/protobufjs-cli-1.1.5.tgz",
+ "integrity": "sha512-k9Zr2Ny0CKlBGV5w+1ZBgsN2sQMKdbCwYSM1Ogo/het+S3YgYFbddyIz8us/z/2EDuuexGNCVaXsU8+wRTCDng==",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "chalk": "^4.0.0",
+ "escodegen": "^1.13.0",
+ "espree": "^9.0.0",
+ "estraverse": "^5.1.0",
+ "glob": "^8.0.0",
+ "jsdoc": "^4.0.0",
+ "minimist": "^1.2.0",
+ "semver": "^7.1.2",
+ "tmp": "^0.2.1",
+ "uglify-js": "^3.7.7"
+ },
+ "bin": {
+ "pbjs": "bin/pbjs",
+ "pbts": "bin/pbts"
+ },
+ "engines": {
+ "node": ">=12.0.0"
+ },
+ "peerDependencies": {
+ "@launchql/protobufjs": "^7.0.0"
+ }
+ },
+ "node_modules/@pgsql/types": {
+ "version": "17.0.0",
+ "resolved": "https://registry.npmjs.org/@pgsql/types/-/types-17.0.0.tgz",
+ "integrity": "sha512-bbGk9TPI2vB58McRuADIvVPGqOznzrXuIPzcyHfoisvXswIrNuw73Sjj7ortvdiI3jypdevJkAAsKGLJkD65SQ==",
+ "license": "SEE LICENSE IN LICENSE"
+ },
+ "node_modules/@pkgjs/parseargs": {
+ "version": "0.11.0",
+ "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz",
+ "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "engines": {
+ "node": ">=14"
+ }
+ },
+ "node_modules/@protobufjs/aspromise": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz",
+ "integrity": "sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==",
+ "license": "BSD-3-Clause"
+ },
+ "node_modules/@protobufjs/base64": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz",
+ "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==",
+ "license": "BSD-3-Clause"
+ },
+ "node_modules/@protobufjs/codegen": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz",
+ "integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==",
+ "license": "BSD-3-Clause"
+ },
+ "node_modules/@protobufjs/eventemitter": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz",
+ "integrity": "sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==",
+ "license": "BSD-3-Clause"
+ },
+ "node_modules/@protobufjs/fetch": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz",
+ "integrity": "sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==",
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "@protobufjs/aspromise": "^1.1.1",
+ "@protobufjs/inquire": "^1.1.0"
+ }
+ },
+ "node_modules/@protobufjs/float": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz",
+ "integrity": "sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==",
+ "license": "BSD-3-Clause"
+ },
+ "node_modules/@protobufjs/inquire": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz",
+ "integrity": "sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==",
+ "license": "BSD-3-Clause"
+ },
+ "node_modules/@protobufjs/path": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz",
+ "integrity": "sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==",
+ "license": "BSD-3-Clause"
+ },
+ "node_modules/@protobufjs/pool": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz",
+ "integrity": "sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==",
+ "license": "BSD-3-Clause"
+ },
+ "node_modules/@protobufjs/utf8": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz",
+ "integrity": "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==",
+ "license": "BSD-3-Clause"
+ },
+ "node_modules/@types/linkify-it": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/@types/linkify-it/-/linkify-it-5.0.0.tgz",
+ "integrity": "sha512-sVDA58zAw4eWAffKOaQH5/5j3XeayukzDk+ewSsnv3p4yJEZHCCzMDiZM8e0OUrRvmpGZ85jf4yDHkHsgBNr9Q==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@types/markdown-it": {
+ "version": "14.1.1",
+ "resolved": "https://registry.npmjs.org/@types/markdown-it/-/markdown-it-14.1.1.tgz",
+ "integrity": "sha512-4NpsnpYl2Gt1ljyBGrKMxFYAYvpqbnnkgP/i/g+NLpjEUa3obn1XJCur9YbEXKDAkaXqsR1LbDnGEJ0MmKFxfg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/linkify-it": "^5",
+ "@types/mdurl": "^2"
+ }
+ },
+ "node_modules/@types/mdurl": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/@types/mdurl/-/mdurl-2.0.0.tgz",
+ "integrity": "sha512-RGdgjQUZba5p6QEFAVx2OGb8rQDL/cPRG7GiedRzMcJ1tYnUANBncjbSB1NRGwbvjcPeikRABz2nshyPk1bhWg==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@types/node": {
+ "version": "20.12.8",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-20.12.8.tgz",
+ "integrity": "sha512-NU0rJLJnshZWdE/097cdCBbyW1h4hEg0xpovcoAQYHl8dnEyp/NAOiE45pvc+Bd1Dt+2r94v2eGFpQJ4R7g+2w==",
+ "license": "MIT",
+ "dependencies": {
+ "undici-types": "~5.26.4"
+ }
+ },
+ "node_modules/@yamlize/cli": {
+ "version": "0.8.0",
+ "resolved": "https://registry.npmjs.org/@yamlize/cli/-/cli-0.8.0.tgz",
+ "integrity": "sha512-OuhQ/gYLCuMjENdLMF8UXgM32p7blBB0FxwS4R2Mw4jk/9uvv87uCz2ptq9VB7GjNTNbnRTQKw+bAbwCXyngCA==",
+ "dev": true,
+ "license": "SEE LICENSE IN LICENSE",
+ "dependencies": {
+ "chalk": "4.1.0",
+ "inquirerer": "^1.9.0",
+ "js-yaml": "^4.1.0",
+ "minimist": "1.2.8",
+ "yamlize": "^0.8.0"
+ },
+ "bin": {
+ "yamlize": "index.js"
+ }
+ },
+ "node_modules/@yamlize/cli/node_modules/chalk": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz",
+ "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/chalk?sponsor=1"
+ }
+ },
+ "node_modules/acorn": {
+ "version": "8.11.3",
+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz",
+ "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==",
+ "dev": true,
+ "license": "MIT",
+ "bin": {
+ "acorn": "bin/acorn"
+ },
+ "engines": {
+ "node": ">=0.4.0"
+ }
+ },
+ "node_modules/acorn-jsx": {
+ "version": "5.3.2",
+ "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz",
+ "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==",
+ "dev": true,
+ "license": "MIT",
+ "peerDependencies": {
+ "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0"
+ }
+ },
+ "node_modules/ansi-regex": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz",
+ "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-regex?sponsor=1"
+ }
+ },
+ "node_modules/ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "color-convert": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ }
+ },
+ "node_modules/argparse": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
+ "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==",
+ "dev": true,
+ "license": "Python-2.0"
+ },
+ "node_modules/assertion-error": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz",
+ "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/ast-types": {
+ "version": "0.16.1",
+ "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.16.1.tgz",
+ "integrity": "sha512-6t10qk83GOG8p0vKmaCr8eiilZwO171AvbROMtvvNiwrTly62t+7XkA8RdIIVbpMhCASAsxgAzdRSwh6nw/5Dg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "tslib": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/balanced-match": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
+ "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/bluebird": {
+ "version": "3.7.2",
+ "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz",
+ "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/boolbase": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz",
+ "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/brace-expansion": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
+ "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "balanced-match": "^1.0.0"
+ }
+ },
+ "node_modules/browser-stdout": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz",
+ "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/camelcase": {
+ "version": "6.3.0",
+ "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz",
+ "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/case": {
+ "version": "1.6.3",
+ "resolved": "https://registry.npmjs.org/case/-/case-1.6.3.tgz",
+ "integrity": "sha512-mzDSXIPaFwVDvZAHqZ9VlbyF4yyXRuX6IvB06WvPYkqJVO24kX1PPhv9bfpKNFZyxYFmmgo03HUiD8iklmJYRQ==",
+ "dev": true,
+ "license": "(MIT OR GPL-3.0-or-later)",
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/catharsis": {
+ "version": "0.9.0",
+ "resolved": "https://registry.npmjs.org/catharsis/-/catharsis-0.9.0.tgz",
+ "integrity": "sha512-prMTQVpcns/tzFgFVkVp6ak6RykZyWb3gu8ckUpd6YkTlacOd3DXGJjIpD4Q6zJirizvaiAjSSHlOsA+6sNh2A==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "lodash": "^4.17.15"
+ },
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/chai": {
+ "version": "3.5.0",
+ "resolved": "https://registry.npmjs.org/chai/-/chai-3.5.0.tgz",
+ "integrity": "sha512-eRYY0vPS2a9zt5w5Z0aCeWbrXTEyvk7u/Xf71EzNObrjSCPgMm1Nku/D/u2tiqHBX5j40wWhj54YJLtgn8g55A==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "assertion-error": "^1.0.1",
+ "deep-eql": "^0.1.3",
+ "type-detect": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4.0"
+ }
+ },
+ "node_modules/chalk": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
+ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/chalk?sponsor=1"
+ }
+ },
+ "node_modules/chokidar": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz",
+ "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "readdirp": "^4.0.1"
+ },
+ "engines": {
+ "node": ">= 14.16.0"
+ },
+ "funding": {
+ "url": "https://paulmillr.com/funding/"
+ }
+ },
+ "node_modules/cliui": {
+ "version": "8.0.1",
+ "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz",
+ "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "string-width": "^4.2.0",
+ "strip-ansi": "^6.0.1",
+ "wrap-ansi": "^7.0.0"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/cliui/node_modules/ansi-regex": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
+ "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/cliui/node_modules/emoji-regex": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
+ "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/cliui/node_modules/string-width": {
+ "version": "4.2.3",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
+ "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "emoji-regex": "^8.0.0",
+ "is-fullwidth-code-point": "^3.0.0",
+ "strip-ansi": "^6.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/cliui/node_modules/strip-ansi": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
+ "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-regex": "^5.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/cliui/node_modules/wrap-ansi": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
+ "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-styles": "^4.0.0",
+ "string-width": "^4.1.0",
+ "strip-ansi": "^6.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
+ }
+ },
+ "node_modules/color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "color-name": "~1.1.4"
+ },
+ "engines": {
+ "node": ">=7.0.0"
+ }
+ },
+ "node_modules/color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/cross-spawn": {
+ "version": "7.0.3",
+ "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz",
+ "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "path-key": "^3.1.0",
+ "shebang-command": "^2.0.0",
+ "which": "^2.0.1"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/css-select": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.1.0.tgz",
+ "integrity": "sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "boolbase": "^1.0.0",
+ "css-what": "^6.1.0",
+ "domhandler": "^5.0.2",
+ "domutils": "^3.0.1",
+ "nth-check": "^2.0.1"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/fb55"
+ }
+ },
+ "node_modules/css-what": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz",
+ "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "engines": {
+ "node": ">= 6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/fb55"
+ }
+ },
+ "node_modules/debug": {
+ "version": "4.4.1",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz",
+ "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ms": "^2.1.3"
+ },
+ "engines": {
+ "node": ">=6.0"
+ },
+ "peerDependenciesMeta": {
+ "supports-color": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/decamelize": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz",
+ "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/deep-eql": {
+ "version": "0.1.3",
+ "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-0.1.3.tgz",
+ "integrity": "sha512-6sEotTRGBFiNcqVoeHwnfopbSpi5NbH1VWJmYCVkmxMmaVTT0bUTrNaGyBwhgP4MZL012W/mkzIn3Da+iDYweg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "type-detect": "0.1.1"
+ },
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/deep-eql/node_modules/type-detect": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-0.1.1.tgz",
+ "integrity": "sha512-5rqszGVwYgBoDkIm2oUtvkfZMQ0vk29iDMU0W2qCa3rG0vPDNczCMT4hV/bLBgLg8k8ri6+u3Zbt+S/14eMzlA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/deep-is": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz",
+ "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/deepmerge": {
+ "version": "4.3.1",
+ "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz",
+ "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/diff": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/diff/-/diff-7.0.0.tgz",
+ "integrity": "sha512-PJWHUb1RFevKCwaFA9RlG5tCd+FO5iRh9A8HEtkmBH2Li03iJriB6m6JIN4rGz3K3JLawI7/veA1xzRKP6ISBw==",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "engines": {
+ "node": ">=0.3.1"
+ }
+ },
+ "node_modules/dom-serializer": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz",
+ "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "domelementtype": "^2.3.0",
+ "domhandler": "^5.0.2",
+ "entities": "^4.2.0"
+ },
+ "funding": {
+ "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1"
+ }
+ },
+ "node_modules/domelementtype": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz",
+ "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/fb55"
+ }
+ ],
+ "license": "BSD-2-Clause"
+ },
+ "node_modules/domhandler": {
+ "version": "5.0.3",
+ "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz",
+ "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "domelementtype": "^2.3.0"
+ },
+ "engines": {
+ "node": ">= 4"
+ },
+ "funding": {
+ "url": "https://github.com/fb55/domhandler?sponsor=1"
+ }
+ },
+ "node_modules/domutils": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.1.0.tgz",
+ "integrity": "sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "dom-serializer": "^2.0.0",
+ "domelementtype": "^2.3.0",
+ "domhandler": "^5.0.3"
+ },
+ "funding": {
+ "url": "https://github.com/fb55/domutils?sponsor=1"
+ }
+ },
+ "node_modules/eastasianwidth": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz",
+ "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/emoji-regex": {
+ "version": "9.2.2",
+ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz",
+ "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/entities": {
+ "version": "4.5.0",
+ "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz",
+ "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "engines": {
+ "node": ">=0.12"
+ },
+ "funding": {
+ "url": "https://github.com/fb55/entities?sponsor=1"
+ }
+ },
+ "node_modules/escalade": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz",
+ "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/escape-string-regexp": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz",
+ "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/escodegen": {
+ "version": "1.14.3",
+ "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.14.3.tgz",
+ "integrity": "sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "esprima": "^4.0.1",
+ "estraverse": "^4.2.0",
+ "esutils": "^2.0.2",
+ "optionator": "^0.8.1"
+ },
+ "bin": {
+ "escodegen": "bin/escodegen.js",
+ "esgenerate": "bin/esgenerate.js"
+ },
+ "engines": {
+ "node": ">=4.0"
+ },
+ "optionalDependencies": {
+ "source-map": "~0.6.1"
+ }
+ },
+ "node_modules/escodegen/node_modules/estraverse": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz",
+ "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "engines": {
+ "node": ">=4.0"
+ }
+ },
+ "node_modules/eslint-visitor-keys": {
+ "version": "3.4.3",
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz",
+ "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "node_modules/espree": {
+ "version": "9.6.1",
+ "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz",
+ "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "acorn": "^8.9.0",
+ "acorn-jsx": "^5.3.2",
+ "eslint-visitor-keys": "^3.4.1"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "node_modules/esprima": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz",
+ "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "bin": {
+ "esparse": "bin/esparse.js",
+ "esvalidate": "bin/esvalidate.js"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/estraverse": {
+ "version": "5.3.0",
+ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz",
+ "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "engines": {
+ "node": ">=4.0"
+ }
+ },
+ "node_modules/esutils": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz",
+ "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/fast-levenshtein": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
+ "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/find-up": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz",
+ "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "locate-path": "^6.0.0",
+ "path-exists": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/flat": {
+ "version": "5.0.2",
+ "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz",
+ "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "bin": {
+ "flat": "cli.js"
+ }
+ },
+ "node_modules/foreground-child": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.1.1.tgz",
+ "integrity": "sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "cross-spawn": "^7.0.0",
+ "signal-exit": "^4.0.1"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/fs.realpath": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
+ "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/get-caller-file": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz",
+ "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": "6.* || 8.* || >= 10.*"
+ }
+ },
+ "node_modules/glob": {
+ "version": "8.0.3",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-8.0.3.tgz",
+ "integrity": "sha512-ull455NHSHI/Y1FqGaaYFaLGkNMMJbavMrEGFXG/PGrg6y7sutWHUHrz6gy6WEBH6akM1M414dWKCNs+IhKdiQ==",
+ "deprecated": "Glob versions prior to v9 are no longer supported",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "fs.realpath": "^1.0.0",
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "^5.0.1",
+ "once": "^1.3.0"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/globals": {
+ "version": "11.12.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz",
+ "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/graceful-fs": {
+ "version": "4.2.11",
+ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz",
+ "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/he": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz",
+ "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==",
+ "dev": true,
+ "license": "MIT",
+ "bin": {
+ "he": "bin/he"
+ }
+ },
+ "node_modules/inflight": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
+ "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==",
+ "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "once": "^1.3.0",
+ "wrappy": "1"
+ }
+ },
+ "node_modules/inherits": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
+ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/inquirerer": {
+ "version": "1.9.0",
+ "resolved": "https://registry.npmjs.org/inquirerer/-/inquirerer-1.9.0.tgz",
+ "integrity": "sha512-/LAn/F70YvRQZWz9r1q1seoO2oRMiSCSK8xKHGlkNebSibx5FppUKZLEjXgkCy1tgccas933q/Y7qNccFxrYkw==",
+ "dev": true,
+ "license": "SEE LICENSE IN LICENSE",
+ "dependencies": {
+ "chalk": "^4.1.0",
+ "deepmerge": "^4.3.1",
+ "js-yaml": "^4.1.0",
+ "minimist": "^1.2.8"
+ }
+ },
+ "node_modules/is-fullwidth-code-point": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
+ "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/is-plain-obj": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz",
+ "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/is-unicode-supported": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz",
+ "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/isexe": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
+ "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/jackspeak": {
+ "version": "2.3.6",
+ "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-2.3.6.tgz",
+ "integrity": "sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==",
+ "dev": true,
+ "license": "BlueOak-1.0.0",
+ "dependencies": {
+ "@isaacs/cliui": "^8.0.2"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ },
+ "optionalDependencies": {
+ "@pkgjs/parseargs": "^0.11.0"
+ }
+ },
+ "node_modules/js-tokens": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
+ "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/js-yaml": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz",
+ "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "argparse": "^2.0.1"
+ },
+ "bin": {
+ "js-yaml": "bin/js-yaml.js"
+ }
+ },
+ "node_modules/js2xmlparser": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/js2xmlparser/-/js2xmlparser-4.0.2.tgz",
+ "integrity": "sha512-6n4D8gLlLf1n5mNLQPRfViYzu9RATblzPEtm1SthMX1Pjao0r9YI9nw7ZIfRxQMERS87mcswrg+r/OYrPRX6jA==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "xmlcreate": "^2.0.4"
+ }
+ },
+ "node_modules/jsdoc": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/jsdoc/-/jsdoc-4.0.3.tgz",
+ "integrity": "sha512-Nu7Sf35kXJ1MWDZIMAuATRQTg1iIPdzh7tqJ6jjvaU/GfDf+qi5UV8zJR3Mo+/pYFvm8mzay4+6O5EWigaQBQw==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@babel/parser": "^7.20.15",
+ "@jsdoc/salty": "^0.2.1",
+ "@types/markdown-it": "^14.1.1",
+ "bluebird": "^3.7.2",
+ "catharsis": "^0.9.0",
+ "escape-string-regexp": "^2.0.0",
+ "js2xmlparser": "^4.0.2",
+ "klaw": "^3.0.0",
+ "markdown-it": "^14.1.0",
+ "markdown-it-anchor": "^8.6.7",
+ "marked": "^4.0.10",
+ "mkdirp": "^1.0.4",
+ "requizzle": "^0.2.3",
+ "strip-json-comments": "^3.1.0",
+ "underscore": "~1.13.2"
+ },
+ "bin": {
+ "jsdoc": "jsdoc.js"
+ },
+ "engines": {
+ "node": ">=12.0.0"
+ }
+ },
+ "node_modules/jsdoc/node_modules/mkdirp": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz",
+ "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==",
+ "dev": true,
+ "license": "MIT",
+ "bin": {
+ "mkdirp": "bin/cmd.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/jsesc": {
+ "version": "2.5.2",
+ "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz",
+ "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==",
+ "dev": true,
+ "license": "MIT",
+ "bin": {
+ "jsesc": "bin/jsesc"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/klaw": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/klaw/-/klaw-3.0.0.tgz",
+ "integrity": "sha512-0Fo5oir+O9jnXu5EefYbVK+mHMBeEVEy2cmctR1O1NECcCkPRreJKrS6Qt/j3KC2C148Dfo9i3pCmCMsdqGr0g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "graceful-fs": "^4.1.9"
+ }
+ },
+ "node_modules/levn": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz",
+ "integrity": "sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "prelude-ls": "~1.1.2",
+ "type-check": "~0.3.2"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/linkify-it": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-5.0.0.tgz",
+ "integrity": "sha512-5aHCbzQRADcdP+ATqnDuhhJ/MRIqDkZX5pyjFHRRysS8vZ5AbqGEoFIb6pYHPZ+L/OC2Lc+xT8uHVVR5CAK/wQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "uc.micro": "^2.0.0"
+ }
+ },
+ "node_modules/locate-path": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz",
+ "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "p-locate": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/lodash": {
+ "version": "4.17.21",
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
+ "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/log-symbols": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz",
+ "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "chalk": "^4.1.0",
+ "is-unicode-supported": "^0.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/long": {
+ "version": "5.2.3",
+ "resolved": "https://registry.npmjs.org/long/-/long-5.2.3.tgz",
+ "integrity": "sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q==",
+ "license": "Apache-2.0"
+ },
+ "node_modules/lru-cache": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
+ "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "yallist": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/markdown-it": {
+ "version": "14.1.0",
+ "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-14.1.0.tgz",
+ "integrity": "sha512-a54IwgWPaeBCAAsv13YgmALOF1elABB08FxO9i+r4VFk5Vl4pKokRPeX8u5TCgSsPi6ec1otfLjdOpVcgbpshg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "argparse": "^2.0.1",
+ "entities": "^4.4.0",
+ "linkify-it": "^5.0.0",
+ "mdurl": "^2.0.0",
+ "punycode.js": "^2.3.1",
+ "uc.micro": "^2.1.0"
+ },
+ "bin": {
+ "markdown-it": "bin/markdown-it.mjs"
+ }
+ },
+ "node_modules/markdown-it-anchor": {
+ "version": "8.6.7",
+ "resolved": "https://registry.npmjs.org/markdown-it-anchor/-/markdown-it-anchor-8.6.7.tgz",
+ "integrity": "sha512-FlCHFwNnutLgVTflOYHPW2pPcl2AACqVzExlkGQNsi4CJgqOHN7YTgDd4LuhgN1BFO3TS0vLAruV1Td6dwWPJA==",
+ "dev": true,
+ "license": "Unlicense",
+ "peerDependencies": {
+ "@types/markdown-it": "*",
+ "markdown-it": "*"
+ }
+ },
+ "node_modules/marked": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/marked/-/marked-4.3.0.tgz",
+ "integrity": "sha512-PRsaiG84bK+AMvxziE/lCFss8juXjNaWzVbN5tXAm4XjeaS9NAHhop+PjQxz2A9h8Q4M/xGmzP8vqNwy6JeK0A==",
+ "dev": true,
+ "license": "MIT",
+ "bin": {
+ "marked": "bin/marked.js"
+ },
+ "engines": {
+ "node": ">= 12"
+ }
+ },
+ "node_modules/mdurl": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-2.0.0.tgz",
+ "integrity": "sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/minimatch": {
+ "version": "5.1.6",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz",
+ "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/minimist": {
+ "version": "1.2.8",
+ "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz",
+ "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==",
+ "dev": true,
+ "license": "MIT",
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/minipass": {
+ "version": "7.1.2",
+ "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz",
+ "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": ">=16 || 14 >=14.17"
+ }
+ },
+ "node_modules/mkdirp": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-3.0.1.tgz",
+ "integrity": "sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==",
+ "dev": true,
+ "license": "MIT",
+ "bin": {
+ "mkdirp": "dist/cjs/src/bin.js"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/mocha": {
+ "version": "11.7.0",
+ "resolved": "https://registry.npmjs.org/mocha/-/mocha-11.7.0.tgz",
+ "integrity": "sha512-bXfLy/mI8n4QICg+pWj1G8VduX5vC0SHRwFpiR5/Fxc8S2G906pSfkyMmHVsdJNQJQNh3LE67koad9GzEvkV6g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "browser-stdout": "^1.3.1",
+ "chokidar": "^4.0.1",
+ "debug": "^4.3.5",
+ "diff": "^7.0.0",
+ "escape-string-regexp": "^4.0.0",
+ "find-up": "^5.0.0",
+ "glob": "^10.4.5",
+ "he": "^1.2.0",
+ "js-yaml": "^4.1.0",
+ "log-symbols": "^4.1.0",
+ "minimatch": "^9.0.5",
+ "ms": "^2.1.3",
+ "picocolors": "^1.1.1",
+ "serialize-javascript": "^6.0.2",
+ "strip-json-comments": "^3.1.1",
+ "supports-color": "^8.1.1",
+ "workerpool": "^9.2.0",
+ "yargs": "^17.7.2",
+ "yargs-parser": "^21.1.1",
+ "yargs-unparser": "^2.0.0"
+ },
+ "bin": {
+ "_mocha": "bin/_mocha",
+ "mocha": "bin/mocha.js"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ }
+ },
+ "node_modules/mocha/node_modules/escape-string-regexp": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
+ "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/mocha/node_modules/glob": {
+ "version": "10.4.5",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz",
+ "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "foreground-child": "^3.1.0",
+ "jackspeak": "^3.1.2",
+ "minimatch": "^9.0.4",
+ "minipass": "^7.1.2",
+ "package-json-from-dist": "^1.0.0",
+ "path-scurry": "^1.11.1"
+ },
+ "bin": {
+ "glob": "dist/esm/bin.mjs"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/mocha/node_modules/jackspeak": {
+ "version": "3.4.3",
+ "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz",
+ "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==",
+ "dev": true,
+ "license": "BlueOak-1.0.0",
+ "dependencies": {
+ "@isaacs/cliui": "^8.0.2"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ },
+ "optionalDependencies": {
+ "@pkgjs/parseargs": "^0.11.0"
+ }
+ },
+ "node_modules/mocha/node_modules/minimatch": {
+ "version": "9.0.5",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz",
+ "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=16 || 14 >=14.17"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/mocha/node_modules/supports-color": {
+ "version": "8.1.1",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz",
+ "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/supports-color?sponsor=1"
+ }
+ },
+ "node_modules/ms": {
+ "version": "2.1.3",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
+ "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/nested-obj": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/nested-obj/-/nested-obj-0.0.1.tgz",
+ "integrity": "sha512-kB1WKTng+IePQhZVs1UXtFaHBx4QEM5a0XKGAzYfCKvdx5DhNjCytNDWMUGpNNpHLotln+tiwcA52kWCIgGq1Q==",
+ "dev": true,
+ "license": "SEE LICENSE IN LICENSE"
+ },
+ "node_modules/node-html-parser": {
+ "version": "6.1.12",
+ "resolved": "https://registry.npmjs.org/node-html-parser/-/node-html-parser-6.1.12.tgz",
+ "integrity": "sha512-/bT/Ncmv+fbMGX96XG9g05vFt43m/+SYKIs9oAemQVYyVcZmDAI2Xq/SbNcpOA35eF0Zk2av3Ksf+Xk8Vt8abA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "css-select": "^5.1.0",
+ "he": "1.2.0"
+ }
+ },
+ "node_modules/nth-check": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz",
+ "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "boolbase": "^1.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/fb55/nth-check?sponsor=1"
+ }
+ },
+ "node_modules/once": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
+ "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "wrappy": "1"
+ }
+ },
+ "node_modules/optionator": {
+ "version": "0.8.3",
+ "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz",
+ "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "deep-is": "~0.1.3",
+ "fast-levenshtein": "~2.0.6",
+ "levn": "~0.3.0",
+ "prelude-ls": "~1.1.2",
+ "type-check": "~0.3.2",
+ "word-wrap": "~1.2.3"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/p-limit": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz",
+ "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "yocto-queue": "^0.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/p-locate": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz",
+ "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "p-limit": "^3.0.2"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/package-json-from-dist": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz",
+ "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==",
+ "dev": true,
+ "license": "BlueOak-1.0.0"
+ },
+ "node_modules/path-exists": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
+ "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/path-key": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
+ "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/path-scurry": {
+ "version": "1.11.1",
+ "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz",
+ "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==",
+ "dev": true,
+ "license": "BlueOak-1.0.0",
+ "dependencies": {
+ "lru-cache": "^10.2.0",
+ "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0"
+ },
+ "engines": {
+ "node": ">=16 || 14 >=14.18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/path-scurry/node_modules/lru-cache": {
+ "version": "10.2.2",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.2.2.tgz",
+ "integrity": "sha512-9hp3Vp2/hFQUiIwKo8XCeFVnrg8Pk3TYNPIR7tJADKi5YfcF7vEaK7avFHTlSy3kOKYaJQaalfEo6YuXdceBOQ==",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": "14 || >=16.14"
+ }
+ },
+ "node_modules/pg-proto-parser": {
+ "version": "1.23.0",
+ "resolved": "https://registry.npmjs.org/pg-proto-parser/-/pg-proto-parser-1.23.0.tgz",
+ "integrity": "sha512-LzX7va8HdHwAK1QLwWYmF8wfeHYV39lWbQICgSyBX5idv/ctsurQhej4WxK1CVt0B075t5Ojvf/rgw2KZVP/AA==",
+ "dev": true,
+ "license": "SEE LICENSE IN LICENSE",
+ "dependencies": {
+ "@babel/generator": "^7.23.6",
+ "@babel/parser": "^7.23.6",
+ "@babel/traverse": "7.24.1",
+ "@babel/types": "7.24.0",
+ "@launchql/protobufjs": "7.2.6",
+ "case": "1.6.3",
+ "deepmerge": "4.3.1",
+ "nested-obj": "^0.0.1",
+ "node-html-parser": "6.1.12",
+ "recast": "0.23.6"
+ }
+ },
+ "node_modules/picocolors": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz",
+ "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/prelude-ls": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz",
+ "integrity": "sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/punycode.js": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/punycode.js/-/punycode.js-2.3.1.tgz",
+ "integrity": "sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/randombytes": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz",
+ "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "safe-buffer": "^5.1.0"
+ }
+ },
+ "node_modules/readdirp": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz",
+ "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 14.18.0"
+ },
+ "funding": {
+ "type": "individual",
+ "url": "https://paulmillr.com/funding/"
+ }
+ },
+ "node_modules/recast": {
+ "version": "0.23.6",
+ "resolved": "https://registry.npmjs.org/recast/-/recast-0.23.6.tgz",
+ "integrity": "sha512-9FHoNjX1yjuesMwuthAmPKabxYQdOgihFYmT5ebXfYGBcnqXZf3WOVz+5foEZ8Y83P4ZY6yQD5GMmtV+pgCCAQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ast-types": "^0.16.1",
+ "esprima": "~4.0.0",
+ "source-map": "~0.6.1",
+ "tiny-invariant": "^1.3.3",
+ "tslib": "^2.0.1"
+ },
+ "engines": {
+ "node": ">= 4"
+ }
+ },
+ "node_modules/require-directory": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
+ "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/requizzle": {
+ "version": "0.2.4",
+ "resolved": "https://registry.npmjs.org/requizzle/-/requizzle-0.2.4.tgz",
+ "integrity": "sha512-JRrFk1D4OQ4SqovXOgdav+K8EAhSB/LJZqCz8tbX0KObcdeM15Ss59ozWMBWmmINMagCwmqn4ZNryUGpBsl6Jw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "lodash": "^4.17.21"
+ }
+ },
+ "node_modules/rimraf": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-5.0.0.tgz",
+ "integrity": "sha512-Jf9llaP+RvaEVS5nPShYFhtXIrb3LRKP281ib3So0KkeZKo2wIKyq0Re7TOSwanasA423PSr6CCIL4bP6T040g==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "glob": "^10.0.0"
+ },
+ "bin": {
+ "rimraf": "dist/cjs/src/bin.js"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/rimraf/node_modules/glob": {
+ "version": "10.3.12",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.12.tgz",
+ "integrity": "sha512-TCNv8vJ+xz4QiqTpfOJA7HvYv+tNIRHKfUWw/q+v2jdgN4ebz+KY9tGx5J4rHP0o84mNP+ApH66HRX8us3Khqg==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "foreground-child": "^3.1.0",
+ "jackspeak": "^2.3.6",
+ "minimatch": "^9.0.1",
+ "minipass": "^7.0.4",
+ "path-scurry": "^1.10.2"
+ },
+ "bin": {
+ "glob": "dist/esm/bin.mjs"
+ },
+ "engines": {
+ "node": ">=16 || 14 >=14.17"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/rimraf/node_modules/minimatch": {
+ "version": "9.0.4",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.4.tgz",
+ "integrity": "sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=16 || 14 >=14.17"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/safe-buffer": {
+ "version": "5.2.1",
+ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
+ "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ],
+ "license": "MIT"
+ },
+ "node_modules/semver": {
+ "version": "7.6.0",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz",
+ "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "lru-cache": "^6.0.0"
+ },
+ "bin": {
+ "semver": "bin/semver.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/serialize-javascript": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz",
+ "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "randombytes": "^2.1.0"
+ }
+ },
+ "node_modules/shebang-command": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
+ "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "shebang-regex": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/shebang-regex": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
+ "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/signal-exit": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz",
+ "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/string-width": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz",
+ "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "eastasianwidth": "^0.2.0",
+ "emoji-regex": "^9.2.2",
+ "strip-ansi": "^7.0.1"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/string-width-cjs": {
+ "name": "string-width",
+ "version": "4.2.3",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
+ "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "emoji-regex": "^8.0.0",
+ "is-fullwidth-code-point": "^3.0.0",
+ "strip-ansi": "^6.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/string-width-cjs/node_modules/ansi-regex": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
+ "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/string-width-cjs/node_modules/emoji-regex": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
+ "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/string-width-cjs/node_modules/strip-ansi": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
+ "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-regex": "^5.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/strip-ansi": {
+ "version": "7.1.0",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz",
+ "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-regex": "^6.0.1"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/strip-ansi?sponsor=1"
+ }
+ },
+ "node_modules/strip-ansi-cjs": {
+ "name": "strip-ansi",
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
+ "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-regex": "^5.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/strip-ansi-cjs/node_modules/ansi-regex": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
+ "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/strip-json-comments": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz",
+ "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/supports-color": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/tiny-invariant": {
+ "version": "1.3.3",
+ "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.3.3.tgz",
+ "integrity": "sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/tmp": {
+ "version": "0.2.3",
+ "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.3.tgz",
+ "integrity": "sha512-nZD7m9iCPC5g0pYmcaxogYKggSfLsdxl8of3Q/oIbqCqLLIO9IAF0GWjX1z9NZRHPiXv8Wex4yDCaZsgEw0Y8w==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=14.14"
+ }
+ },
+ "node_modules/to-fast-properties": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz",
+ "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/tslib": {
+ "version": "2.6.2",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz",
+ "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==",
+ "dev": true,
+ "license": "0BSD"
+ },
+ "node_modules/type-check": {
+ "version": "0.3.2",
+ "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz",
+ "integrity": "sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "prelude-ls": "~1.1.2"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/type-detect": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-1.0.0.tgz",
+ "integrity": "sha512-f9Uv6ezcpvCQjJU0Zqbg+65qdcszv3qUQsZfjdRbWiZ7AMenrX1u0lNk9EoWWX6e1F+NULyg27mtdeZ5WhpljA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/typescript": {
+ "version": "5.8.3",
+ "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.8.3.tgz",
+ "integrity": "sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "bin": {
+ "tsc": "bin/tsc",
+ "tsserver": "bin/tsserver"
+ },
+ "engines": {
+ "node": ">=14.17"
+ }
+ },
+ "node_modules/uc.micro": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-2.1.0.tgz",
+ "integrity": "sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/uglify-js": {
+ "version": "3.17.4",
+ "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.17.4.tgz",
+ "integrity": "sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "bin": {
+ "uglifyjs": "bin/uglifyjs"
+ },
+ "engines": {
+ "node": ">=0.8.0"
+ }
+ },
+ "node_modules/underscore": {
+ "version": "1.13.6",
+ "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.13.6.tgz",
+ "integrity": "sha512-+A5Sja4HP1M08MaXya7p5LvjuM7K6q/2EaC0+iovj/wOcMsTzMvDFbasi/oSapiwOlt252IqsKqPjCl7huKS0A==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/undici-types": {
+ "version": "5.26.5",
+ "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz",
+ "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==",
+ "license": "MIT"
+ },
+ "node_modules/which": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
+ "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "isexe": "^2.0.0"
+ },
+ "bin": {
+ "node-which": "bin/node-which"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/word-wrap": {
+ "version": "1.2.5",
+ "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz",
+ "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/workerpool": {
+ "version": "9.3.2",
+ "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-9.3.2.tgz",
+ "integrity": "sha512-Xz4Nm9c+LiBHhDR5bDLnNzmj6+5F+cyEAWPMkbs2awq/dYazR/efelZzUAjB/y3kNHL+uzkHvxVVpaOfGCPV7A==",
+ "dev": true,
+ "license": "Apache-2.0"
+ },
+ "node_modules/wrap-ansi": {
+ "version": "8.1.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz",
+ "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-styles": "^6.1.0",
+ "string-width": "^5.0.1",
+ "strip-ansi": "^7.0.1"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
+ }
+ },
+ "node_modules/wrap-ansi-cjs": {
+ "name": "wrap-ansi",
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
+ "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-styles": "^4.0.0",
+ "string-width": "^4.1.0",
+ "strip-ansi": "^6.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
+ }
+ },
+ "node_modules/wrap-ansi-cjs/node_modules/ansi-regex": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
+ "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
+ "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/wrap-ansi-cjs/node_modules/string-width": {
+ "version": "4.2.3",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
+ "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "emoji-regex": "^8.0.0",
+ "is-fullwidth-code-point": "^3.0.0",
+ "strip-ansi": "^6.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/wrap-ansi-cjs/node_modules/strip-ansi": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
+ "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-regex": "^5.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/wrap-ansi/node_modules/ansi-styles": {
+ "version": "6.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz",
+ "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ }
+ },
+ "node_modules/wrappy": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
+ "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/xmlcreate": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/xmlcreate/-/xmlcreate-2.0.4.tgz",
+ "integrity": "sha512-nquOebG4sngPmGPICTS5EnxqhKbCmz5Ox5hsszI2T6U5qdrJizBc+0ilYSEjTSzU0yZcmvppztXe/5Al5fUwdg==",
+ "dev": true,
+ "license": "Apache-2.0"
+ },
+ "node_modules/y18n": {
+ "version": "5.0.8",
+ "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz",
+ "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/yallist": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
+ "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/yamlize": {
+ "version": "0.8.0",
+ "resolved": "https://registry.npmjs.org/yamlize/-/yamlize-0.8.0.tgz",
+ "integrity": "sha512-2sXxXTr4gZuIP1TmVmm9yJc/WirEKsqctk/gk4MzPGuochfSAY4+OxKXXqFj02HejQmEgAFRun7b0Ec6YjlE7A==",
+ "dev": true,
+ "license": "SEE LICENSE IN LICENSE",
+ "dependencies": {
+ "js-yaml": "^4.1.0",
+ "mkdirp": "3.0.1",
+ "nested-obj": "^0.0.1"
+ }
+ },
+ "node_modules/yargs": {
+ "version": "17.7.2",
+ "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz",
+ "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "cliui": "^8.0.1",
+ "escalade": "^3.1.1",
+ "get-caller-file": "^2.0.5",
+ "require-directory": "^2.1.1",
+ "string-width": "^4.2.3",
+ "y18n": "^5.0.5",
+ "yargs-parser": "^21.1.1"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/yargs-parser": {
+ "version": "21.1.1",
+ "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz",
+ "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/yargs-unparser": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz",
+ "integrity": "sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "camelcase": "^6.0.0",
+ "decamelize": "^4.0.0",
+ "flat": "^5.0.2",
+ "is-plain-obj": "^2.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/yargs/node_modules/ansi-regex": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
+ "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/yargs/node_modules/emoji-regex": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
+ "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/yargs/node_modules/string-width": {
+ "version": "4.2.3",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
+ "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "emoji-regex": "^8.0.0",
+ "is-fullwidth-code-point": "^3.0.0",
+ "strip-ansi": "^6.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/yargs/node_modules/strip-ansi": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
+ "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-regex": "^5.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/yocto-queue": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz",
+ "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ }
+ }
+}
diff --git a/pg17/package.json b/pg17/package.json
new file mode 100644
index 00000000..85117915
--- /dev/null
+++ b/pg17/package.json
@@ -0,0 +1,62 @@
+{
+ "name": "libpg-query",
+ "version": "17.2.0",
+ "description": "The real PostgreSQL query parser",
+ "homepage": "https://github.com/launchql/libpg-query-node",
+ "main": "./wasm/index.cjs",
+ "typings": "./wasm/index.d.ts",
+ "publishConfig": {
+ "access": "public"
+ },
+ "files": [
+ "wasm/*",
+ "proto.js"
+ ],
+ "exports": {
+ ".": {
+ "types": "./wasm/index.d.ts",
+ "import": "./wasm/index.js",
+ "require": "./wasm/index.cjs"
+ }
+ },
+ "scripts": {
+ "clean": "yarn wasm:clean && rimraf cjs esm",
+ "build:js": "node scripts/build.js",
+ "build": "yarn clean; yarn wasm:build; yarn build:js",
+ "wasm:make": "docker run --rm -v $(pwd):/src -u $(id -u):$(id -g) emscripten/emsdk emmake make",
+ "wasm:build": "yarn wasm:make build",
+ "wasm:rebuild": "yarn wasm:make rebuild",
+ "wasm:clean": "yarn wasm:make clean",
+ "wasm:clean-cache": "yarn wasm:make clean-cache",
+ "test": "mocha test/*.test.js --timeout 5000",
+ "yamlize": "node ./scripts/yamlize.js",
+ "protogen": "node ./scripts/protogen.js"
+ },
+ "author": "Dan Lynch (http://github.com/pyramation)",
+ "license": "LICENSE IN LICENSE",
+ "repository": {
+ "type": "git",
+ "url": "git://github.com/launchql/libpg-query-node.git"
+ },
+ "devDependencies": {
+ "@launchql/proto-cli": "1.25.0",
+ "@yamlize/cli": "^0.8.0",
+ "chai": "^3.5.0",
+ "mocha": "^11.7.0",
+ "rimraf": "5.0.0",
+ "typescript": "^5.3.3"
+ },
+ "dependencies": {
+ "@pgsql/types": "^17.0.0",
+ "@launchql/protobufjs": "7.2.6"
+ },
+ "keywords": [
+ "sql",
+ "postgres",
+ "postgresql",
+ "pg",
+ "query",
+ "plpgsql",
+ "database"
+ ]
+}
diff --git a/pg17/scripts/build.js b/pg17/scripts/build.js
new file mode 100644
index 00000000..271c4648
--- /dev/null
+++ b/pg17/scripts/build.js
@@ -0,0 +1,33 @@
+const fs = require('fs');
+const path = require('path');
+const { execSync } = require('child_process');
+
+// Run TypeScript compilation
+console.log('Compiling TypeScript...');
+execSync('tsc', { stdio: 'inherit' });
+execSync('tsc -p tsconfig.esm.json', { stdio: 'inherit' });
+
+// Rename files to have correct extensions
+const wasmDir = path.join(__dirname, '../wasm');
+const cjsDir = path.join(__dirname, '../cjs');
+const esmDir = path.join(__dirname, '../esm');
+
+// Rename CommonJS files
+fs.renameSync(
+ path.join(cjsDir, 'index.js'),
+ path.join(wasmDir, 'index.cjs')
+);
+
+// Rename ESM files
+fs.renameSync(
+ path.join(esmDir, 'index.js'),
+ path.join(wasmDir, 'index.js')
+);
+
+// Rename declaration files
+fs.renameSync(
+ path.join(cjsDir, 'index.d.ts'),
+ path.join(wasmDir, 'index.d.ts')
+);
+
+console.log('Build completed successfully!');
\ No newline at end of file
diff --git a/pg17/scripts/protogen.js b/pg17/scripts/protogen.js
new file mode 100644
index 00000000..073e10ed
--- /dev/null
+++ b/pg17/scripts/protogen.js
@@ -0,0 +1,40 @@
+const { exec } = require('child_process');
+
+// IMPORTANT โ SEE ISSUE: https://github.com/launchql/libpg-query-node/issues/92
+
+// Configuration Variables
+const branchName = '17-6.1.0';
+const protoUrl = `https://raw.githubusercontent.com/pganalyze/libpg_query/${branchName}/protobuf/pg_query.proto`;
+const inFile = 'libpg_query/protobuf/pg_query.proto';
+const outFile = 'proto.js';
+
+const protogenCmd = [
+ 'pg-proto-parser',
+ 'protogen',
+ '--protoUrl',
+ protoUrl,
+ '--inFile',
+ inFile,
+ '--outFile',
+ outFile,
+ '--originalPackageName',
+ 'protobufjs/minimal',
+ '--newPackageName',
+ '@launchql/protobufjs/minimal'
+];
+
+// Step 2: Generate proto.js using pbjs (Assuming pbjs is installed and accessible)
+function generateProtoJS(callback) {
+ exec(protogenCmd.join(' '), (error, stdout, stderr) => {
+ if (error) {
+ console.error(`Error during code generation: ${error.message}`);
+ return;
+ }
+ console.log('Generated proto.js from proto file.');
+ callback();
+ });
+}
+
+ generateProtoJS(() => {
+ console.log('all done ๐');
+ });
\ No newline at end of file
diff --git a/pg17/scripts/yamlize.js b/pg17/scripts/yamlize.js
new file mode 100644
index 00000000..77b3a340
--- /dev/null
+++ b/pg17/scripts/yamlize.js
@@ -0,0 +1,25 @@
+const { exec } = require('child_process');
+const { join } = require('path');
+
+const yamldir = (s) => join(__dirname, '/../.yamlize/', s);
+const workflowDir = (s) => join(__dirname, '/../.github/workflows/', s);
+
+const cmd = () => ([
+ 'yamlize',
+ '--config',
+ yamldir(`config/config.yaml`),
+
+ '--inFile',
+ yamldir(`workflows/build.yaml`),
+
+ '--outFile',
+ workflowDir(`build-wasm-no-docker.yaml`),
+].join(' '));
+
+
+exec(cmd(), (error, _stdout, _stderr) => {
+ if (error) {
+ console.error(`Error: ${error.message}`);
+ return;
+ }
+});
\ No newline at end of file
diff --git a/pg17/src/index.ts b/pg17/src/index.ts
new file mode 100644
index 00000000..9335c4e6
--- /dev/null
+++ b/pg17/src/index.ts
@@ -0,0 +1,238 @@
+import { ParseResult } from "@pgsql/types";
+export * from "@pgsql/types";
+
+// @ts-ignore
+import PgQueryModule from './libpg-query.js';
+
+interface WasmModule {
+ _malloc: (size: number) => number;
+ _free: (ptr: number) => void;
+ _wasm_free_string: (ptr: number) => void;
+ _wasm_parse_query: (queryPtr: number) => number;
+ _wasm_parse_plpgsql: (queryPtr: number) => number;
+ _wasm_fingerprint: (queryPtr: number) => number;
+ _wasm_normalize_query: (queryPtr: number) => number;
+ lengthBytesUTF8: (str: string) => number;
+ stringToUTF8: (str: string, ptr: number, len: number) => void;
+ UTF8ToString: (ptr: number) => string;
+}
+
+let wasmModule: WasmModule;
+
+const initPromise = PgQueryModule().then((module: WasmModule) => {
+ wasmModule = module;
+});
+
+export async function loadModule(): Promise {
+ if (!wasmModule) {
+ await initPromise;
+ }
+}
+
+function awaitInit Promise>(fn: T): T {
+ return (async (...args: Parameters) => {
+ await initPromise;
+ return fn(...args);
+ }) as T;
+}
+
+function stringToPtr(str: string): number {
+ const len = wasmModule.lengthBytesUTF8(str) + 1;
+ const ptr = wasmModule._malloc(len);
+ try {
+ wasmModule.stringToUTF8(str, ptr, len);
+ return ptr;
+ } catch (error) {
+ wasmModule._free(ptr);
+ throw error;
+ }
+}
+
+function ptrToString(ptr: number): string {
+ return wasmModule.UTF8ToString(ptr);
+}
+
+export const parse = awaitInit(async (query: string): Promise => {
+ const queryPtr = stringToPtr(query);
+ let resultPtr = 0;
+
+ try {
+ resultPtr = wasmModule._wasm_parse_query(queryPtr);
+ const resultStr = ptrToString(resultPtr);
+
+ if (resultStr.startsWith('syntax error') || resultStr.startsWith('deparse error') || resultStr.includes('ERROR')) {
+ throw new Error(resultStr);
+ }
+
+ return JSON.parse(resultStr);
+ } finally {
+ wasmModule._free(queryPtr);
+ if (resultPtr) {
+ wasmModule._wasm_free_string(resultPtr);
+ }
+ }
+});
+
+
+
+export const parsePlPgSQL = awaitInit(async (query: string): Promise => {
+ const queryPtr = stringToPtr(query);
+ let resultPtr = 0;
+
+ try {
+ resultPtr = wasmModule._wasm_parse_plpgsql(queryPtr);
+ const resultStr = ptrToString(resultPtr);
+
+ if (resultStr.startsWith('syntax error') || resultStr.startsWith('deparse error') || resultStr.includes('ERROR')) {
+ throw new Error(resultStr);
+ }
+
+ return JSON.parse(resultStr);
+ } finally {
+ wasmModule._free(queryPtr);
+ if (resultPtr) {
+ wasmModule._wasm_free_string(resultPtr);
+ }
+ }
+});
+
+export const fingerprint = awaitInit(async (query: string): Promise => {
+ const queryPtr = stringToPtr(query);
+ let resultPtr = 0;
+
+ try {
+ resultPtr = wasmModule._wasm_fingerprint(queryPtr);
+ const resultStr = ptrToString(resultPtr);
+
+ if (resultStr.startsWith('syntax error') || resultStr.startsWith('deparse error') || resultStr.includes('ERROR')) {
+ throw new Error(resultStr);
+ }
+
+ return resultStr;
+ } finally {
+ wasmModule._free(queryPtr);
+ if (resultPtr) {
+ wasmModule._wasm_free_string(resultPtr);
+ }
+ }
+});
+
+export const normalize = awaitInit(async (query: string): Promise => {
+ const queryPtr = stringToPtr(query);
+ let resultPtr = 0;
+
+ try {
+ resultPtr = wasmModule._wasm_normalize_query(queryPtr);
+ const resultStr = ptrToString(resultPtr);
+
+ if (resultStr.startsWith('syntax error') || resultStr.startsWith('deparse error') || resultStr.includes('ERROR')) {
+ throw new Error(resultStr);
+ }
+
+ return resultStr;
+ } finally {
+ wasmModule._free(queryPtr);
+ if (resultPtr) {
+ wasmModule._wasm_free_string(resultPtr);
+ }
+ }
+});
+
+// Sync versions
+export function parseSync(query: string): ParseResult {
+ if (!wasmModule) {
+ throw new Error('WASM module not initialized. Call loadModule() first.');
+ }
+ const queryPtr = stringToPtr(query);
+ let resultPtr = 0;
+
+ try {
+ resultPtr = wasmModule._wasm_parse_query(queryPtr);
+ const resultStr = ptrToString(resultPtr);
+
+ if (resultStr.startsWith('syntax error') || resultStr.startsWith('deparse error') || resultStr.includes('ERROR')) {
+ throw new Error(resultStr);
+ }
+
+ return JSON.parse(resultStr);
+ } finally {
+ wasmModule._free(queryPtr);
+ if (resultPtr) {
+ wasmModule._wasm_free_string(resultPtr);
+ }
+ }
+}
+
+
+
+export function parsePlPgSQLSync(query: string): ParseResult {
+ if (!wasmModule) {
+ throw new Error('WASM module not initialized. Call loadModule() first.');
+ }
+ const queryPtr = stringToPtr(query);
+ let resultPtr = 0;
+
+ try {
+ resultPtr = wasmModule._wasm_parse_plpgsql(queryPtr);
+ const resultStr = ptrToString(resultPtr);
+
+ if (resultStr.startsWith('syntax error') || resultStr.startsWith('deparse error') || resultStr.includes('ERROR')) {
+ throw new Error(resultStr);
+ }
+
+ return JSON.parse(resultStr);
+ } finally {
+ wasmModule._free(queryPtr);
+ if (resultPtr) {
+ wasmModule._wasm_free_string(resultPtr);
+ }
+ }
+}
+
+export function fingerprintSync(query: string): string {
+ if (!wasmModule) {
+ throw new Error('WASM module not initialized. Call loadModule() first.');
+ }
+ const queryPtr = stringToPtr(query);
+ let resultPtr = 0;
+
+ try {
+ resultPtr = wasmModule._wasm_fingerprint(queryPtr);
+ const resultStr = ptrToString(resultPtr);
+
+ if (resultStr.startsWith('syntax error') || resultStr.startsWith('deparse error') || resultStr.includes('ERROR')) {
+ throw new Error(resultStr);
+ }
+
+ return resultStr;
+ } finally {
+ wasmModule._free(queryPtr);
+ if (resultPtr) {
+ wasmModule._wasm_free_string(resultPtr);
+ }
+ }
+}
+
+export function normalizeSync(query: string): string {
+ if (!wasmModule) {
+ throw new Error('WASM module not initialized. Call loadModule() first.');
+ }
+ const queryPtr = stringToPtr(query);
+ let resultPtr = 0;
+
+ try {
+ resultPtr = wasmModule._wasm_normalize_query(queryPtr);
+ const resultStr = ptrToString(resultPtr);
+
+ if (resultStr.startsWith('syntax error') || resultStr.startsWith('deparse error') || resultStr.includes('ERROR')) {
+ throw new Error(resultStr);
+ }
+
+ return resultStr;
+ } finally {
+ wasmModule._free(queryPtr);
+ if (resultPtr) {
+ wasmModule._wasm_free_string(resultPtr);
+ }
+ }
+}
\ No newline at end of file
diff --git a/pg17/src/libpg-query.d.ts b/pg17/src/libpg-query.d.ts
new file mode 100644
index 00000000..6c9004a1
--- /dev/null
+++ b/pg17/src/libpg-query.d.ts
@@ -0,0 +1,19 @@
+declare module './libpg-query.js' {
+ interface WasmModule {
+ _malloc: (size: number) => number;
+ _free: (ptr: number) => void;
+ _wasm_free_string: (ptr: number) => void;
+ _wasm_parse_query: (queryPtr: number) => number;
+
+ _wasm_parse_plpgsql: (queryPtr: number) => number;
+ _wasm_fingerprint: (queryPtr: number) => number;
+ _wasm_normalize_query: (queryPtr: number) => number;
+ lengthBytesUTF8: (str: string) => number;
+ stringToUTF8: (str: string, ptr: number, len: number) => void;
+ UTF8ToString: (ptr: number) => string;
+
+ }
+
+ const PgQueryModule: () => Promise;
+ export default PgQueryModule;
+}
\ No newline at end of file
diff --git a/pg17/src/proto.d.ts b/pg17/src/proto.d.ts
new file mode 100644
index 00000000..55a504f3
--- /dev/null
+++ b/pg17/src/proto.d.ts
@@ -0,0 +1,20 @@
+declare module '../proto.js' {
+ export namespace pg_query {
+ interface ParseResult {
+ version: number;
+ stmts: Statement[];
+ }
+
+ interface Statement {
+ stmt_type: string;
+ stmt_len: number;
+ stmt_location: number;
+ query: string;
+ }
+
+ class ParseResult {
+ static fromObject(obj: ParseResult): ParseResult;
+ static encode(msg: ParseResult): { finish(): Uint8Array };
+ }
+ }
+}
\ No newline at end of file
diff --git a/pg17/src/wasm_wrapper.c b/pg17/src/wasm_wrapper.c
new file mode 100644
index 00000000..790736a4
--- /dev/null
+++ b/pg17/src/wasm_wrapper.c
@@ -0,0 +1,269 @@
+#include "pg_query.h"
+#include "protobuf/pg_query.pb-c.h"
+#include
+#include
+#include
+#include
+#include
+
+static int validate_input(const char* input) {
+ return input != NULL && strlen(input) > 0;
+}
+
+static char* safe_strdup(const char* str) {
+ if (!str) return NULL;
+ char* result = strdup(str);
+ if (!result) {
+ return NULL;
+ }
+ return result;
+}
+
+static void* safe_malloc(size_t size) {
+ void* ptr = malloc(size);
+ if (!ptr && size > 0) {
+ return NULL;
+ }
+ return ptr;
+}
+
+EMSCRIPTEN_KEEPALIVE
+char* wasm_parse_query(const char* input) {
+ if (!validate_input(input)) {
+ return safe_strdup("Invalid input: query cannot be null or empty");
+ }
+
+ PgQueryParseResult result = pg_query_parse(input);
+
+ if (result.error) {
+ char* error_msg = safe_strdup(result.error->message);
+ pg_query_free_parse_result(result);
+ return error_msg ? error_msg : safe_strdup("Memory allocation failed");
+ }
+
+ char* parse_tree = safe_strdup(result.parse_tree);
+ pg_query_free_parse_result(result);
+ return parse_tree;
+}
+
+
+
+EMSCRIPTEN_KEEPALIVE
+char* wasm_parse_plpgsql(const char* input) {
+ if (!validate_input(input)) {
+ return safe_strdup("Invalid input: query cannot be null or empty");
+ }
+
+ PgQueryPlpgsqlParseResult result = pg_query_parse_plpgsql(input);
+
+ if (result.error) {
+ char* error_msg = safe_strdup(result.error->message);
+ pg_query_free_plpgsql_parse_result(result);
+ return error_msg ? error_msg : safe_strdup("Memory allocation failed");
+ }
+
+ if (!result.plpgsql_funcs) {
+ pg_query_free_plpgsql_parse_result(result);
+ return safe_strdup("{\"plpgsql_funcs\":[]}");
+ }
+
+ size_t funcs_len = strlen(result.plpgsql_funcs);
+ size_t json_len = strlen("{\"plpgsql_funcs\":}") + funcs_len + 1;
+ char* wrapped_result = safe_malloc(json_len);
+
+ if (!wrapped_result) {
+ pg_query_free_plpgsql_parse_result(result);
+ return safe_strdup("Memory allocation failed");
+ }
+
+ int written = snprintf(wrapped_result, json_len, "{\"plpgsql_funcs\":%s}", result.plpgsql_funcs);
+
+ if (written >= json_len) {
+ free(wrapped_result);
+ pg_query_free_plpgsql_parse_result(result);
+ return safe_strdup("Buffer overflow prevented");
+ }
+
+ pg_query_free_plpgsql_parse_result(result);
+ return wrapped_result;
+}
+
+EMSCRIPTEN_KEEPALIVE
+char* wasm_fingerprint(const char* input) {
+ if (!validate_input(input)) {
+ return safe_strdup("Invalid input: query cannot be null or empty");
+ }
+
+ PgQueryFingerprintResult result = pg_query_fingerprint(input);
+
+ if (result.error) {
+ char* error_msg = safe_strdup(result.error->message);
+ pg_query_free_fingerprint_result(result);
+ return error_msg ? error_msg : safe_strdup("Memory allocation failed");
+ }
+
+ char* fingerprint_str = safe_strdup(result.fingerprint_str);
+ pg_query_free_fingerprint_result(result);
+ return fingerprint_str;
+}
+
+EMSCRIPTEN_KEEPALIVE
+char* wasm_parse_query_protobuf(const char* input, int* out_len) {
+ if (!validate_input(input)) {
+ *out_len = 0;
+ return safe_strdup("Invalid input: query cannot be null or empty");
+ }
+
+ PgQueryProtobufParseResult result = pg_query_parse_protobuf(input);
+
+ if (result.error) {
+ *out_len = 0;
+ char* error_msg = safe_strdup(result.error->message);
+ pg_query_free_protobuf_parse_result(result);
+ return error_msg ? error_msg : safe_strdup("Memory allocation failed");
+ }
+
+ char* protobuf_data = safe_malloc(result.parse_tree.len);
+ if (!protobuf_data) {
+ pg_query_free_protobuf_parse_result(result);
+ *out_len = 0;
+ return NULL;
+ }
+ memcpy(protobuf_data, result.parse_tree.data, result.parse_tree.len);
+ *out_len = (int)result.parse_tree.len;
+
+ pg_query_free_protobuf_parse_result(result);
+ return protobuf_data;
+}
+
+EMSCRIPTEN_KEEPALIVE
+int wasm_get_protobuf_len(const char* input) {
+ if (!validate_input(input)) {
+ return -1;
+ }
+
+ PgQueryProtobufParseResult result = pg_query_parse_protobuf(input);
+
+ if (result.error) {
+ pg_query_free_protobuf_parse_result(result);
+ return -1;
+ }
+
+ int len = (int)result.parse_tree.len;
+ pg_query_free_protobuf_parse_result(result);
+ return len;
+}
+
+EMSCRIPTEN_KEEPALIVE
+char* wasm_normalize_query(const char* input) {
+ if (!validate_input(input)) {
+ return safe_strdup("Invalid input: query cannot be null or empty");
+ }
+
+ PgQueryNormalizeResult result = pg_query_normalize(input);
+
+ if (result.error) {
+ char* error_msg = safe_strdup(result.error->message);
+ pg_query_free_normalize_result(result);
+ return error_msg ? error_msg : safe_strdup("Memory allocation failed");
+ }
+
+ char* normalized = safe_strdup(result.normalized_query);
+ pg_query_free_normalize_result(result);
+
+ if (!normalized) {
+ return safe_strdup("Memory allocation failed");
+ }
+
+ return normalized;
+}
+
+
+
+
+
+typedef struct {
+ int has_error;
+ char* message;
+ char* funcname;
+ char* filename;
+ int lineno;
+ int cursorpos;
+ char* context;
+ char* data;
+ size_t data_len;
+} WasmDetailedResult;
+
+EMSCRIPTEN_KEEPALIVE
+WasmDetailedResult* wasm_parse_query_detailed(const char* input) {
+ WasmDetailedResult* result = safe_malloc(sizeof(WasmDetailedResult));
+ if (!result) {
+ return NULL;
+ }
+ memset(result, 0, sizeof(WasmDetailedResult));
+
+ if (!validate_input(input)) {
+ result->has_error = 1;
+ result->message = safe_strdup("Invalid input: query cannot be null or empty");
+ return result;
+ }
+
+ PgQueryParseResult parse_result = pg_query_parse(input);
+
+ if (parse_result.error) {
+ result->has_error = 1;
+ size_t message_len = strlen("Parse error: at line , position ") + strlen(parse_result.error->message) + 20;
+ char* prefixed_message = safe_malloc(message_len);
+ if (!prefixed_message) {
+ result->has_error = 1;
+ result->message = safe_strdup("Memory allocation failed");
+ pg_query_free_parse_result(parse_result);
+ return result;
+ }
+ snprintf(prefixed_message, message_len,
+ "Parse error: %s at line %d, position %d",
+ parse_result.error->message,
+ parse_result.error->lineno,
+ parse_result.error->cursorpos);
+ result->message = prefixed_message;
+ char* funcname_copy = parse_result.error->funcname ? safe_strdup(parse_result.error->funcname) : NULL;
+ char* filename_copy = parse_result.error->filename ? safe_strdup(parse_result.error->filename) : NULL;
+ char* context_copy = parse_result.error->context ? safe_strdup(parse_result.error->context) : NULL;
+
+ result->funcname = funcname_copy;
+ result->filename = filename_copy;
+ result->lineno = parse_result.error->lineno;
+ result->cursorpos = parse_result.error->cursorpos;
+ result->context = context_copy;
+ } else {
+ result->data = safe_strdup(parse_result.parse_tree);
+ if (result->data) {
+ result->data_len = strlen(result->data);
+ } else {
+ result->has_error = 1;
+ result->message = safe_strdup("Memory allocation failed");
+ }
+ }
+
+ pg_query_free_parse_result(parse_result);
+ return result;
+}
+
+EMSCRIPTEN_KEEPALIVE
+void wasm_free_detailed_result(WasmDetailedResult* result) {
+ if (result) {
+ free(result->message);
+ free(result->funcname);
+ free(result->filename);
+ free(result->context);
+ free(result->data);
+ free(result);
+ }
+}
+
+
+
+EMSCRIPTEN_KEEPALIVE
+void wasm_free_string(char* str) {
+ free(str);
+}
diff --git a/pg17/test/fingerprint.test.js b/pg17/test/fingerprint.test.js
new file mode 100644
index 00000000..70d2f47d
--- /dev/null
+++ b/pg17/test/fingerprint.test.js
@@ -0,0 +1,66 @@
+const query = require("../");
+const { expect } = require("chai");
+
+describe("Query Fingerprinting", () => {
+ before(async () => {
+ await query.parse("SELECT 1");
+ });
+
+ describe("Sync Fingerprinting", () => {
+ it("should return a fingerprint for a simple query", () => {
+ const fingerprint = query.fingerprintSync("select 1");
+ expect(fingerprint).to.be.a("string");
+ expect(fingerprint).to.have.lengthOf(16);
+ });
+
+ it("should return same fingerprint for equivalent queries", () => {
+ const fp1 = query.fingerprintSync("select 1");
+ const fp2 = query.fingerprintSync("SELECT 1");
+ const fp3 = query.fingerprintSync("select 1");
+
+ expect(fp1).to.eq(fp2);
+ expect(fp1).to.eq(fp3);
+ });
+
+ it("should return different fingerprints for different queries", () => {
+ const fp1 = query.fingerprintSync("select name from users");
+ const fp2 = query.fingerprintSync("select id from customers");
+
+ expect(fp1).to.not.eq(fp2);
+ });
+
+ it("should normalize parameter values", () => {
+ const fp1 = query.fingerprintSync("select * from users where id = 123");
+ const fp2 = query.fingerprintSync("select * from users where id = 456");
+
+ expect(fp1).to.eq(fp2);
+ });
+
+ it("should fail on invalid queries", () => {
+ expect(() => query.fingerprintSync("NOT A QUERY")).to.throw(Error);
+ });
+ });
+
+ describe("Async Fingerprinting", () => {
+ it("should return a promise resolving to same result", async () => {
+ const testQuery = "select * from users";
+ const fpPromise = query.fingerprint(testQuery);
+ const fp = await fpPromise;
+
+ expect(fpPromise).to.be.instanceof(Promise);
+ expect(fp).to.eq(query.fingerprintSync(testQuery));
+ });
+
+ it("should reject on bogus queries", async () => {
+ return query.fingerprint("NOT A QUERY").then(
+ () => {
+ throw new Error("should have rejected");
+ },
+ (e) => {
+ expect(e).instanceof(Error);
+ expect(e.message).to.match(/NOT/);
+ }
+ );
+ });
+ });
+});
diff --git a/pg17/test/normalize.test.js b/pg17/test/normalize.test.js
new file mode 100644
index 00000000..a93a572c
--- /dev/null
+++ b/pg17/test/normalize.test.js
@@ -0,0 +1,68 @@
+const query = require("../");
+const { expect } = require("chai");
+
+describe("Query Normalization", () => {
+ before(async () => {
+ await query.parse("SELECT 1");
+ });
+
+ describe("Sync Normalization", () => {
+ it("should normalize a simple query", () => {
+ const normalized = query.normalizeSync("select 1");
+ expect(normalized).to.be.a("string");
+ expect(normalized).to.include("$1");
+ });
+
+ it("should normalize parameter values", () => {
+ const normalized1 = query.normalizeSync("select * from users where id = 123");
+ const normalized2 = query.normalizeSync("select * from users where id = 456");
+
+ expect(normalized1).to.eq(normalized2);
+ expect(normalized1).to.include("$1");
+ });
+
+ it("should normalize string literals", () => {
+ const normalized1 = query.normalizeSync("select * from users where name = 'john'");
+ const normalized2 = query.normalizeSync("select * from users where name = 'jane'");
+
+ expect(normalized1).to.eq(normalized2);
+ expect(normalized1).to.include("$1");
+ });
+
+ it("should preserve query structure", () => {
+ const normalized = query.normalizeSync("SELECT id, name FROM users WHERE active = true ORDER BY name");
+
+ expect(normalized).to.include("SELECT");
+ expect(normalized).to.include("FROM");
+ expect(normalized).to.include("WHERE");
+ expect(normalized).to.include("ORDER BY");
+ });
+
+ it("should fail on invalid queries", () => {
+ expect(() => query.normalizeSync("NOT A QUERY")).to.throw(Error);
+ });
+ });
+
+ describe("Async Normalization", () => {
+ it("should return a promise resolving to same result", async () => {
+ const testQuery = "select * from users where id = 123";
+ const normalizedPromise = query.normalize(testQuery);
+ const normalized = await normalizedPromise;
+
+ expect(normalizedPromise).to.be.instanceof(Promise);
+ expect(normalized).to.eq(query.normalizeSync(testQuery));
+ });
+
+ it("should reject on bogus queries", async () => {
+ return query.normalize("NOT A QUERY").then(
+ () => {
+ throw new Error("should have rejected");
+ },
+ (e) => {
+ expect(e).instanceof(Error);
+ expect(e.message).to.match(/NOT/);
+ }
+ );
+ });
+ });
+});
diff --git a/pg17/test/parsing.test.js b/pg17/test/parsing.test.js
new file mode 100644
index 00000000..25e1fd3d
--- /dev/null
+++ b/pg17/test/parsing.test.js
@@ -0,0 +1,83 @@
+const query = require("../");
+const { expect } = require("chai");
+
+function removeLocationProperties(obj) {
+ if (typeof obj !== 'object' || obj === null) {
+ return obj;
+ }
+
+ if (Array.isArray(obj)) {
+ return obj.map(item => removeLocationProperties(item));
+ }
+
+ const result = {};
+ for (const key in obj) {
+ if (obj.hasOwnProperty(key)) {
+ if (key === 'location' || key === 'stmt_len' || key === 'stmt_location') {
+ continue; // Skip location-related properties
+ }
+ result[key] = removeLocationProperties(obj[key]);
+ }
+ }
+ return result;
+}
+
+describe("Query Parsing", () => {
+ before(async () => {
+ await query.parse("SELECT 1");
+ });
+
+ describe("Sync Parsing", () => {
+ it("should return a single-item parse result for common queries", () => {
+ const queries = ["select 1", "select null", "select ''", "select a, b"];
+ const results = queries.map(query.parseSync);
+ results.forEach((res) => {
+ expect(res.stmts).to.have.lengthOf(1);
+ });
+
+ const selectedDatas = results.map(
+ (it) => it.stmts[0].stmt.SelectStmt.targetList
+ );
+
+ expect(selectedDatas[0][0].ResTarget.val.A_Const.ival.ival).to.eq(1);
+ expect(selectedDatas[1][0].ResTarget.val.A_Const.isnull).to.eq(true);
+ expect(selectedDatas[2][0].ResTarget.val.A_Const.sval.sval).to.eq("");
+ expect(selectedDatas[3]).to.have.lengthOf(2);
+ });
+
+ it("should support parsing multiple queries", () => {
+ const res = query.parseSync("select 1; select null;");
+ expect(res.stmts.map(removeLocationProperties)).to.deep.eq([
+ ...query.parseSync("select 1;").stmts.map(removeLocationProperties),
+ ...query.parseSync("select null;").stmts.map(removeLocationProperties),
+ ]);
+ });
+
+ it("should not parse a bogus query", () => {
+ expect(() => query.parseSync("NOT A QUERY")).to.throw(Error);
+ });
+ });
+
+ describe("Async parsing", () => {
+ it("should return a promise resolving to same result", async () => {
+ const testQuery = "select * from john;";
+ const resPromise = query.parse(testQuery);
+ const res = await resPromise;
+
+ expect(resPromise).to.be.instanceof(Promise);
+ expect(res).to.deep.eq(query.parseSync(testQuery));
+ });
+
+ it("should reject on bogus queries", async () => {
+ return query.parse("NOT A QUERY").then(
+ () => {
+ throw new Error("should have rejected");
+ },
+ (e) => {
+ expect(e).instanceof(Error);
+ expect(e.message).to.match(/NOT/);
+ }
+ );
+ });
+ });
+});
diff --git a/pg17/test/plpgsql.test.js b/pg17/test/plpgsql.test.js
new file mode 100644
index 00000000..c89d3a24
--- /dev/null
+++ b/pg17/test/plpgsql.test.js
@@ -0,0 +1,74 @@
+const query = require("../");
+const { expect } = require("chai");
+
+describe("PL/pgSQL Parsing", () => {
+ before(async () => {
+ await query.parse("SELECT 1");
+ });
+
+ describe("Sync PL/pgSQL Parsing", () => {
+ it("should parse a simple PL/pgSQL function", () => {
+ const funcSql = `
+ CREATE OR REPLACE FUNCTION test_func()
+ RETURNS INTEGER AS $$
+ BEGIN
+ RETURN 42;
+ END;
+ $$ LANGUAGE plpgsql;
+ `;
+
+ const result = query.parsePlPgSQLSync(funcSql);
+ expect(result).to.be.an("object");
+ expect(result.plpgsql_funcs).to.be.an("array");
+ });
+
+ it("should parse function with parameters", () => {
+ const funcSql = `
+ CREATE OR REPLACE FUNCTION add_numbers(a INTEGER, b INTEGER)
+ RETURNS INTEGER AS $$
+ BEGIN
+ RETURN a + b;
+ END;
+ $$ LANGUAGE plpgsql;
+ `;
+
+ const result = query.parsePlPgSQLSync(funcSql);
+ expect(result.plpgsql_funcs).to.have.length.greaterThan(0);
+ });
+
+ it("should fail on invalid PL/pgSQL", () => {
+ expect(() => query.parsePlPgSQLSync("NOT A FUNCTION")).to.throw(Error);
+ });
+ });
+
+ describe("Async PL/pgSQL Parsing", () => {
+ it("should return a promise resolving to same result", async () => {
+ const funcSql = `
+ CREATE OR REPLACE FUNCTION test_func()
+ RETURNS INTEGER AS $$
+ BEGIN
+ RETURN 42;
+ END;
+ $$ LANGUAGE plpgsql;
+ `;
+
+ const resultPromise = query.parsePlPgSQL(funcSql);
+ const result = await resultPromise;
+
+ expect(resultPromise).to.be.instanceof(Promise);
+ expect(result).to.deep.eq(query.parsePlPgSQLSync(funcSql));
+ });
+
+ it("should reject on invalid PL/pgSQL", async () => {
+ return query.parsePlPgSQL("NOT A FUNCTION").then(
+ () => {
+ throw new Error("should have rejected");
+ },
+ (e) => {
+ expect(e).instanceof(Error);
+ expect(e.message).to.match(/NOT/);
+ }
+ );
+ });
+ });
+});
diff --git a/pg17/tsconfig.esm.json b/pg17/tsconfig.esm.json
new file mode 100644
index 00000000..63012c17
--- /dev/null
+++ b/pg17/tsconfig.esm.json
@@ -0,0 +1,9 @@
+{
+ "extends": "./tsconfig.json",
+ "compilerOptions": {
+ "module": "es2022",
+ "rootDir": "src/",
+ "declaration": false,
+ "outDir": "esm/"
+ }
+ }
\ No newline at end of file
diff --git a/pg17/tsconfig.json b/pg17/tsconfig.json
new file mode 100644
index 00000000..d7da207b
--- /dev/null
+++ b/pg17/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/pg17/wasm/index.cjs b/pg17/wasm/index.cjs
new file mode 100644
index 00000000..5e00d236
--- /dev/null
+++ b/pg17/wasm/index.cjs
@@ -0,0 +1,215 @@
+"use strict";
+var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
+ if (k2 === undefined) k2 = k;
+ var desc = Object.getOwnPropertyDescriptor(m, k);
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
+ desc = { enumerable: true, get: function() { return m[k]; } };
+ }
+ Object.defineProperty(o, k2, desc);
+}) : (function(o, m, k, k2) {
+ if (k2 === undefined) k2 = k;
+ o[k2] = m[k];
+}));
+var __exportStar = (this && this.__exportStar) || function(m, exports) {
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
+};
+var __importDefault = (this && this.__importDefault) || function (mod) {
+ return (mod && mod.__esModule) ? mod : { "default": mod };
+};
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.normalize = exports.fingerprint = exports.parsePlPgSQL = exports.parse = void 0;
+exports.loadModule = loadModule;
+exports.parseSync = parseSync;
+exports.parsePlPgSQLSync = parsePlPgSQLSync;
+exports.fingerprintSync = fingerprintSync;
+exports.normalizeSync = normalizeSync;
+__exportStar(require("@pgsql/types"), exports);
+// @ts-ignore
+const libpg_query_js_1 = __importDefault(require("./libpg-query.js"));
+let wasmModule;
+const initPromise = (0, libpg_query_js_1.default)().then((module) => {
+ wasmModule = module;
+});
+async function loadModule() {
+ if (!wasmModule) {
+ await initPromise;
+ }
+}
+function awaitInit(fn) {
+ return (async (...args) => {
+ await initPromise;
+ return fn(...args);
+ });
+}
+function stringToPtr(str) {
+ const len = wasmModule.lengthBytesUTF8(str) + 1;
+ const ptr = wasmModule._malloc(len);
+ try {
+ wasmModule.stringToUTF8(str, ptr, len);
+ return ptr;
+ }
+ catch (error) {
+ wasmModule._free(ptr);
+ throw error;
+ }
+}
+function ptrToString(ptr) {
+ return wasmModule.UTF8ToString(ptr);
+}
+exports.parse = awaitInit(async (query) => {
+ const queryPtr = stringToPtr(query);
+ let resultPtr = 0;
+ try {
+ resultPtr = wasmModule._wasm_parse_query(queryPtr);
+ const resultStr = ptrToString(resultPtr);
+ if (resultStr.startsWith('syntax error') || resultStr.startsWith('deparse error') || resultStr.includes('ERROR')) {
+ throw new Error(resultStr);
+ }
+ return JSON.parse(resultStr);
+ }
+ finally {
+ wasmModule._free(queryPtr);
+ if (resultPtr) {
+ wasmModule._wasm_free_string(resultPtr);
+ }
+ }
+});
+exports.parsePlPgSQL = awaitInit(async (query) => {
+ const queryPtr = stringToPtr(query);
+ let resultPtr = 0;
+ try {
+ resultPtr = wasmModule._wasm_parse_plpgsql(queryPtr);
+ const resultStr = ptrToString(resultPtr);
+ if (resultStr.startsWith('syntax error') || resultStr.startsWith('deparse error') || resultStr.includes('ERROR')) {
+ throw new Error(resultStr);
+ }
+ return JSON.parse(resultStr);
+ }
+ finally {
+ wasmModule._free(queryPtr);
+ if (resultPtr) {
+ wasmModule._wasm_free_string(resultPtr);
+ }
+ }
+});
+exports.fingerprint = awaitInit(async (query) => {
+ const queryPtr = stringToPtr(query);
+ let resultPtr = 0;
+ try {
+ resultPtr = wasmModule._wasm_fingerprint(queryPtr);
+ const resultStr = ptrToString(resultPtr);
+ if (resultStr.startsWith('syntax error') || resultStr.startsWith('deparse error') || resultStr.includes('ERROR')) {
+ throw new Error(resultStr);
+ }
+ return resultStr;
+ }
+ finally {
+ wasmModule._free(queryPtr);
+ if (resultPtr) {
+ wasmModule._wasm_free_string(resultPtr);
+ }
+ }
+});
+exports.normalize = awaitInit(async (query) => {
+ const queryPtr = stringToPtr(query);
+ let resultPtr = 0;
+ try {
+ resultPtr = wasmModule._wasm_normalize_query(queryPtr);
+ const resultStr = ptrToString(resultPtr);
+ if (resultStr.startsWith('syntax error') || resultStr.startsWith('deparse error') || resultStr.includes('ERROR')) {
+ throw new Error(resultStr);
+ }
+ return resultStr;
+ }
+ finally {
+ wasmModule._free(queryPtr);
+ if (resultPtr) {
+ wasmModule._wasm_free_string(resultPtr);
+ }
+ }
+});
+// Sync versions
+function parseSync(query) {
+ if (!wasmModule) {
+ throw new Error('WASM module not initialized. Call loadModule() first.');
+ }
+ const queryPtr = stringToPtr(query);
+ let resultPtr = 0;
+ try {
+ resultPtr = wasmModule._wasm_parse_query(queryPtr);
+ const resultStr = ptrToString(resultPtr);
+ if (resultStr.startsWith('syntax error') || resultStr.startsWith('deparse error') || resultStr.includes('ERROR')) {
+ throw new Error(resultStr);
+ }
+ return JSON.parse(resultStr);
+ }
+ finally {
+ wasmModule._free(queryPtr);
+ if (resultPtr) {
+ wasmModule._wasm_free_string(resultPtr);
+ }
+ }
+}
+function parsePlPgSQLSync(query) {
+ if (!wasmModule) {
+ throw new Error('WASM module not initialized. Call loadModule() first.');
+ }
+ const queryPtr = stringToPtr(query);
+ let resultPtr = 0;
+ try {
+ resultPtr = wasmModule._wasm_parse_plpgsql(queryPtr);
+ const resultStr = ptrToString(resultPtr);
+ if (resultStr.startsWith('syntax error') || resultStr.startsWith('deparse error') || resultStr.includes('ERROR')) {
+ throw new Error(resultStr);
+ }
+ return JSON.parse(resultStr);
+ }
+ finally {
+ wasmModule._free(queryPtr);
+ if (resultPtr) {
+ wasmModule._wasm_free_string(resultPtr);
+ }
+ }
+}
+function fingerprintSync(query) {
+ if (!wasmModule) {
+ throw new Error('WASM module not initialized. Call loadModule() first.');
+ }
+ const queryPtr = stringToPtr(query);
+ let resultPtr = 0;
+ try {
+ resultPtr = wasmModule._wasm_fingerprint(queryPtr);
+ const resultStr = ptrToString(resultPtr);
+ if (resultStr.startsWith('syntax error') || resultStr.startsWith('deparse error') || resultStr.includes('ERROR')) {
+ throw new Error(resultStr);
+ }
+ return resultStr;
+ }
+ finally {
+ wasmModule._free(queryPtr);
+ if (resultPtr) {
+ wasmModule._wasm_free_string(resultPtr);
+ }
+ }
+}
+function normalizeSync(query) {
+ if (!wasmModule) {
+ throw new Error('WASM module not initialized. Call loadModule() first.');
+ }
+ const queryPtr = stringToPtr(query);
+ let resultPtr = 0;
+ try {
+ resultPtr = wasmModule._wasm_normalize_query(queryPtr);
+ const resultStr = ptrToString(resultPtr);
+ if (resultStr.startsWith('syntax error') || resultStr.startsWith('deparse error') || resultStr.includes('ERROR')) {
+ throw new Error(resultStr);
+ }
+ return resultStr;
+ }
+ finally {
+ wasmModule._free(queryPtr);
+ if (resultPtr) {
+ wasmModule._wasm_free_string(resultPtr);
+ }
+ }
+}
diff --git a/pg17/wasm/index.d.ts b/pg17/wasm/index.d.ts
new file mode 100644
index 00000000..7165032e
--- /dev/null
+++ b/pg17/wasm/index.d.ts
@@ -0,0 +1,11 @@
+import { ParseResult } from "@pgsql/types";
+export * from "@pgsql/types";
+export declare function loadModule(): Promise;
+export declare const parse: (query: string) => Promise;
+export declare const parsePlPgSQL: (query: string) => Promise;
+export declare const fingerprint: (query: string) => Promise;
+export declare const normalize: (query: string) => Promise;
+export declare function parseSync(query: string): ParseResult;
+export declare function parsePlPgSQLSync(query: string): ParseResult;
+export declare function fingerprintSync(query: string): string;
+export declare function normalizeSync(query: string): string;
diff --git a/pg17/wasm/index.js b/pg17/wasm/index.js
new file mode 100644
index 00000000..f0877c4c
--- /dev/null
+++ b/pg17/wasm/index.js
@@ -0,0 +1,190 @@
+export * from "@pgsql/types";
+// @ts-ignore
+import PgQueryModule from './libpg-query.js';
+let wasmModule;
+const initPromise = PgQueryModule().then((module) => {
+ wasmModule = module;
+});
+export async function loadModule() {
+ if (!wasmModule) {
+ await initPromise;
+ }
+}
+function awaitInit(fn) {
+ return (async (...args) => {
+ await initPromise;
+ return fn(...args);
+ });
+}
+function stringToPtr(str) {
+ const len = wasmModule.lengthBytesUTF8(str) + 1;
+ const ptr = wasmModule._malloc(len);
+ try {
+ wasmModule.stringToUTF8(str, ptr, len);
+ return ptr;
+ }
+ catch (error) {
+ wasmModule._free(ptr);
+ throw error;
+ }
+}
+function ptrToString(ptr) {
+ return wasmModule.UTF8ToString(ptr);
+}
+export const parse = awaitInit(async (query) => {
+ const queryPtr = stringToPtr(query);
+ let resultPtr = 0;
+ try {
+ resultPtr = wasmModule._wasm_parse_query(queryPtr);
+ const resultStr = ptrToString(resultPtr);
+ if (resultStr.startsWith('syntax error') || resultStr.startsWith('deparse error') || resultStr.includes('ERROR')) {
+ throw new Error(resultStr);
+ }
+ return JSON.parse(resultStr);
+ }
+ finally {
+ wasmModule._free(queryPtr);
+ if (resultPtr) {
+ wasmModule._wasm_free_string(resultPtr);
+ }
+ }
+});
+export const parsePlPgSQL = awaitInit(async (query) => {
+ const queryPtr = stringToPtr(query);
+ let resultPtr = 0;
+ try {
+ resultPtr = wasmModule._wasm_parse_plpgsql(queryPtr);
+ const resultStr = ptrToString(resultPtr);
+ if (resultStr.startsWith('syntax error') || resultStr.startsWith('deparse error') || resultStr.includes('ERROR')) {
+ throw new Error(resultStr);
+ }
+ return JSON.parse(resultStr);
+ }
+ finally {
+ wasmModule._free(queryPtr);
+ if (resultPtr) {
+ wasmModule._wasm_free_string(resultPtr);
+ }
+ }
+});
+export const fingerprint = awaitInit(async (query) => {
+ const queryPtr = stringToPtr(query);
+ let resultPtr = 0;
+ try {
+ resultPtr = wasmModule._wasm_fingerprint(queryPtr);
+ const resultStr = ptrToString(resultPtr);
+ if (resultStr.startsWith('syntax error') || resultStr.startsWith('deparse error') || resultStr.includes('ERROR')) {
+ throw new Error(resultStr);
+ }
+ return resultStr;
+ }
+ finally {
+ wasmModule._free(queryPtr);
+ if (resultPtr) {
+ wasmModule._wasm_free_string(resultPtr);
+ }
+ }
+});
+export const normalize = awaitInit(async (query) => {
+ const queryPtr = stringToPtr(query);
+ let resultPtr = 0;
+ try {
+ resultPtr = wasmModule._wasm_normalize_query(queryPtr);
+ const resultStr = ptrToString(resultPtr);
+ if (resultStr.startsWith('syntax error') || resultStr.startsWith('deparse error') || resultStr.includes('ERROR')) {
+ throw new Error(resultStr);
+ }
+ return resultStr;
+ }
+ finally {
+ wasmModule._free(queryPtr);
+ if (resultPtr) {
+ wasmModule._wasm_free_string(resultPtr);
+ }
+ }
+});
+// Sync versions
+export function parseSync(query) {
+ if (!wasmModule) {
+ throw new Error('WASM module not initialized. Call loadModule() first.');
+ }
+ const queryPtr = stringToPtr(query);
+ let resultPtr = 0;
+ try {
+ resultPtr = wasmModule._wasm_parse_query(queryPtr);
+ const resultStr = ptrToString(resultPtr);
+ if (resultStr.startsWith('syntax error') || resultStr.startsWith('deparse error') || resultStr.includes('ERROR')) {
+ throw new Error(resultStr);
+ }
+ return JSON.parse(resultStr);
+ }
+ finally {
+ wasmModule._free(queryPtr);
+ if (resultPtr) {
+ wasmModule._wasm_free_string(resultPtr);
+ }
+ }
+}
+export function parsePlPgSQLSync(query) {
+ if (!wasmModule) {
+ throw new Error('WASM module not initialized. Call loadModule() first.');
+ }
+ const queryPtr = stringToPtr(query);
+ let resultPtr = 0;
+ try {
+ resultPtr = wasmModule._wasm_parse_plpgsql(queryPtr);
+ const resultStr = ptrToString(resultPtr);
+ if (resultStr.startsWith('syntax error') || resultStr.startsWith('deparse error') || resultStr.includes('ERROR')) {
+ throw new Error(resultStr);
+ }
+ return JSON.parse(resultStr);
+ }
+ finally {
+ wasmModule._free(queryPtr);
+ if (resultPtr) {
+ wasmModule._wasm_free_string(resultPtr);
+ }
+ }
+}
+export function fingerprintSync(query) {
+ if (!wasmModule) {
+ throw new Error('WASM module not initialized. Call loadModule() first.');
+ }
+ const queryPtr = stringToPtr(query);
+ let resultPtr = 0;
+ try {
+ resultPtr = wasmModule._wasm_fingerprint(queryPtr);
+ const resultStr = ptrToString(resultPtr);
+ if (resultStr.startsWith('syntax error') || resultStr.startsWith('deparse error') || resultStr.includes('ERROR')) {
+ throw new Error(resultStr);
+ }
+ return resultStr;
+ }
+ finally {
+ wasmModule._free(queryPtr);
+ if (resultPtr) {
+ wasmModule._wasm_free_string(resultPtr);
+ }
+ }
+}
+export function normalizeSync(query) {
+ if (!wasmModule) {
+ throw new Error('WASM module not initialized. Call loadModule() first.');
+ }
+ const queryPtr = stringToPtr(query);
+ let resultPtr = 0;
+ try {
+ resultPtr = wasmModule._wasm_normalize_query(queryPtr);
+ const resultStr = ptrToString(resultPtr);
+ if (resultStr.startsWith('syntax error') || resultStr.startsWith('deparse error') || resultStr.includes('ERROR')) {
+ throw new Error(resultStr);
+ }
+ return resultStr;
+ }
+ finally {
+ wasmModule._free(queryPtr);
+ if (resultPtr) {
+ wasmModule._wasm_free_string(resultPtr);
+ }
+ }
+}
diff --git a/pg17/yarn.lock b/pg17/yarn.lock
new file mode 100644
index 00000000..f8958b6b
--- /dev/null
+++ b/pg17/yarn.lock
@@ -0,0 +1,1385 @@
+# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
+# yarn lockfile v1
+
+
+"@babel/code-frame@^7.24.1", "@babel/code-frame@^7.27.1":
+ version "7.27.1"
+ resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.27.1.tgz#200f715e66d52a23b221a9435534a91cc13ad5be"
+ integrity sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==
+ dependencies:
+ "@babel/helper-validator-identifier" "^7.27.1"
+ js-tokens "^4.0.0"
+ picocolors "^1.1.1"
+
+"@babel/generator@^7.23.6", "@babel/generator@^7.24.1":
+ version "7.27.5"
+ resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.27.5.tgz#3eb01866b345ba261b04911020cbe22dd4be8c8c"
+ integrity sha512-ZGhA37l0e/g2s1Cnzdix0O3aLYm66eF8aufiVteOgnwxgnRP8GoyMj7VWsgWnQbVKXyge7hqrFh2K2TQM6t1Hw==
+ dependencies:
+ "@babel/parser" "^7.27.5"
+ "@babel/types" "^7.27.3"
+ "@jridgewell/gen-mapping" "^0.3.5"
+ "@jridgewell/trace-mapping" "^0.3.25"
+ jsesc "^3.0.2"
+
+"@babel/helper-environment-visitor@^7.22.20":
+ version "7.24.7"
+ resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.24.7.tgz#4b31ba9551d1f90781ba83491dd59cf9b269f7d9"
+ integrity sha512-DoiN84+4Gnd0ncbBOM9AZENV4a5ZiL39HYMyZJGZ/AZEykHYdJw0wW3kdcsh9/Kn+BRXHLkkklZ51ecPKmI1CQ==
+ dependencies:
+ "@babel/types" "^7.24.7"
+
+"@babel/helper-function-name@^7.23.0":
+ version "7.24.7"
+ resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.24.7.tgz#75f1e1725742f39ac6584ee0b16d94513da38dd2"
+ integrity sha512-FyoJTsj/PEUWu1/TYRiXTIHc8lbw+TDYkZuoE43opPS5TrI7MyONBE1oNvfguEXAD9yhQRrVBnXdXzSLQl9XnA==
+ dependencies:
+ "@babel/template" "^7.24.7"
+ "@babel/types" "^7.24.7"
+
+"@babel/helper-hoist-variables@^7.22.5":
+ version "7.24.7"
+ resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.24.7.tgz#b4ede1cde2fd89436397f30dc9376ee06b0f25ee"
+ integrity sha512-MJJwhkoGy5c4ehfoRyrJ/owKeMl19U54h27YYftT0o2teQ3FJ3nQUf/I3LlJsX4l3qlw7WRXUmiyajvHXoTubQ==
+ dependencies:
+ "@babel/types" "^7.24.7"
+
+"@babel/helper-split-export-declaration@^7.22.6":
+ version "7.24.7"
+ resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.24.7.tgz#83949436890e07fa3d6873c61a96e3bbf692d856"
+ integrity sha512-oy5V7pD+UvfkEATUKvIjvIAH/xCzfsFVw7ygW2SI6NClZzquT+mwdTfgfdbUiceh6iQO0CHtCPsyze/MZ2YbAA==
+ dependencies:
+ "@babel/types" "^7.24.7"
+
+"@babel/helper-string-parser@^7.23.4", "@babel/helper-string-parser@^7.27.1":
+ version "7.27.1"
+ resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz#54da796097ab19ce67ed9f88b47bb2ec49367687"
+ integrity sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==
+
+"@babel/helper-validator-identifier@^7.22.20", "@babel/helper-validator-identifier@^7.27.1":
+ version "7.27.1"
+ resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz#a7054dcc145a967dd4dc8fee845a57c1316c9df8"
+ integrity sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==
+
+"@babel/parser@^7.20.15", "@babel/parser@^7.23.6", "@babel/parser@^7.24.1", "@babel/parser@^7.27.2", "@babel/parser@^7.27.5":
+ version "7.27.5"
+ resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.27.5.tgz#ed22f871f110aa285a6fd934a0efed621d118826"
+ integrity sha512-OsQd175SxWkGlzbny8J3K8TnnDD0N3lrIUtB92xwyRpzaenGZhxDvxN/JgU00U3CDZNj9tPuDJ5H0WS4Nt3vKg==
+ dependencies:
+ "@babel/types" "^7.27.3"
+
+"@babel/template@^7.24.7":
+ version "7.27.2"
+ resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.27.2.tgz#fa78ceed3c4e7b63ebf6cb39e5852fca45f6809d"
+ integrity sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==
+ dependencies:
+ "@babel/code-frame" "^7.27.1"
+ "@babel/parser" "^7.27.2"
+ "@babel/types" "^7.27.1"
+
+"@babel/traverse@7.24.1":
+ version "7.24.1"
+ resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.24.1.tgz#d65c36ac9dd17282175d1e4a3c49d5b7988f530c"
+ integrity sha512-xuU6o9m68KeqZbQuDt2TcKSxUw/mrsvavlEqQ1leZ/B+C9tk6E4sRWy97WaXgvq5E+nU3cXMxv3WKOCanVMCmQ==
+ dependencies:
+ "@babel/code-frame" "^7.24.1"
+ "@babel/generator" "^7.24.1"
+ "@babel/helper-environment-visitor" "^7.22.20"
+ "@babel/helper-function-name" "^7.23.0"
+ "@babel/helper-hoist-variables" "^7.22.5"
+ "@babel/helper-split-export-declaration" "^7.22.6"
+ "@babel/parser" "^7.24.1"
+ "@babel/types" "^7.24.0"
+ debug "^4.3.1"
+ globals "^11.1.0"
+
+"@babel/types@7.24.0":
+ version "7.24.0"
+ resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.24.0.tgz#3b951f435a92e7333eba05b7566fd297960ea1bf"
+ integrity sha512-+j7a5c253RfKh8iABBhywc8NSfP5LURe7Uh4qpsh6jc+aLJguvmIUBdjSdEMQv2bENrCR5MfRdjGo7vzS/ob7w==
+ dependencies:
+ "@babel/helper-string-parser" "^7.23.4"
+ "@babel/helper-validator-identifier" "^7.22.20"
+ to-fast-properties "^2.0.0"
+
+"@babel/types@^7.24.0", "@babel/types@^7.24.7", "@babel/types@^7.27.1", "@babel/types@^7.27.3":
+ version "7.27.6"
+ resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.27.6.tgz#a434ca7add514d4e646c80f7375c0aa2befc5535"
+ integrity sha512-ETyHEk2VHHvl9b9jZP5IHPavHYk57EhanlRRuae9XCpb/j5bDCbPPMOBfCWhnl/7EDJz0jEMCi/RhccCE8r1+Q==
+ dependencies:
+ "@babel/helper-string-parser" "^7.27.1"
+ "@babel/helper-validator-identifier" "^7.27.1"
+
+"@isaacs/cliui@^8.0.2":
+ version "8.0.2"
+ resolved "https://registry.yarnpkg.com/@isaacs/cliui/-/cliui-8.0.2.tgz#b37667b7bc181c168782259bab42474fbf52b550"
+ integrity sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==
+ dependencies:
+ string-width "^5.1.2"
+ string-width-cjs "npm:string-width@^4.2.0"
+ strip-ansi "^7.0.1"
+ strip-ansi-cjs "npm:strip-ansi@^6.0.1"
+ wrap-ansi "^8.1.0"
+ wrap-ansi-cjs "npm:wrap-ansi@^7.0.0"
+
+"@jridgewell/gen-mapping@^0.3.5":
+ version "0.3.5"
+ resolved "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz"
+ integrity sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==
+ dependencies:
+ "@jridgewell/set-array" "^1.2.1"
+ "@jridgewell/sourcemap-codec" "^1.4.10"
+ "@jridgewell/trace-mapping" "^0.3.24"
+
+"@jridgewell/resolve-uri@^3.1.0":
+ version "3.1.2"
+ resolved "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz"
+ integrity sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==
+
+"@jridgewell/set-array@^1.2.1":
+ version "1.2.1"
+ resolved "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz"
+ integrity sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==
+
+"@jridgewell/sourcemap-codec@^1.4.10", "@jridgewell/sourcemap-codec@^1.4.14":
+ version "1.4.15"
+ resolved "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz"
+ integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==
+
+"@jridgewell/trace-mapping@^0.3.24", "@jridgewell/trace-mapping@^0.3.25":
+ version "0.3.25"
+ resolved "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz"
+ integrity sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==
+ dependencies:
+ "@jridgewell/resolve-uri" "^3.1.0"
+ "@jridgewell/sourcemap-codec" "^1.4.14"
+
+"@jsdoc/salty@^0.2.1":
+ version "0.2.9"
+ resolved "https://registry.yarnpkg.com/@jsdoc/salty/-/salty-0.2.9.tgz#4d8c147f7ca011532681ce86352a77a0178f1dec"
+ integrity sha512-yYxMVH7Dqw6nO0d5NIV8OQWnitU8k6vXH8NtgqAfIa/IUqRMxRv/NUJJ08VEKbAakwxlgBl5PJdrU0dMPStsnw==
+ dependencies:
+ lodash "^4.17.21"
+
+"@launchql/proto-cli@1.25.0":
+ version "1.25.0"
+ resolved "https://registry.yarnpkg.com/@launchql/proto-cli/-/proto-cli-1.25.0.tgz#1a939d59fb715f7e3187e12b6435d9ad0ec7b61a"
+ integrity sha512-W5U2U3QS6133GLeM7iqjaIez8wazjEvtPwm3EzgiEDtV7n0I5fQDYXXabCjGTIy/WQ6pHos53pB95EcV+ey93Q==
+ dependencies:
+ "@launchql/protobufjs" "7.2.6"
+ "@launchql/protobufjs-cli" "1.1.5"
+ chalk "^4.1.0"
+ glob "8.0.3"
+ inquirerer "1.9.0"
+ minimist "1.2.8"
+ mkdirp "3.0.1"
+ nested-obj "^0.0.1"
+ pg-proto-parser "^1.23.0"
+
+"@launchql/protobufjs-cli@1.1.5":
+ version "1.1.5"
+ resolved "https://registry.yarnpkg.com/@launchql/protobufjs-cli/-/protobufjs-cli-1.1.5.tgz#bdcd08179377d2edcd0009b7d82530b0183f615f"
+ integrity sha512-k9Zr2Ny0CKlBGV5w+1ZBgsN2sQMKdbCwYSM1Ogo/het+S3YgYFbddyIz8us/z/2EDuuexGNCVaXsU8+wRTCDng==
+ dependencies:
+ chalk "^4.0.0"
+ escodegen "^1.13.0"
+ espree "^9.0.0"
+ estraverse "^5.1.0"
+ glob "^8.0.0"
+ jsdoc "^4.0.0"
+ minimist "^1.2.0"
+ semver "^7.1.2"
+ tmp "^0.2.1"
+ uglify-js "^3.7.7"
+
+"@launchql/protobufjs@7.2.6":
+ version "7.2.6"
+ resolved "https://registry.yarnpkg.com/@launchql/protobufjs/-/protobufjs-7.2.6.tgz#f8b8fe02ca411d496390064eb398ba5245ca4e22"
+ integrity sha512-vwi1nG2/heVFsIMHQU1KxTjUp5c757CTtRAZn/jutApCkFlle1iv8tzM/DHlSZJKDldxaYqnNYTg0pTyp8Bbtg==
+ dependencies:
+ "@protobufjs/aspromise" "^1.1.2"
+ "@protobufjs/base64" "^1.1.2"
+ "@protobufjs/codegen" "^2.0.4"
+ "@protobufjs/eventemitter" "^1.1.0"
+ "@protobufjs/fetch" "^1.1.0"
+ "@protobufjs/float" "^1.0.2"
+ "@protobufjs/inquire" "^1.1.0"
+ "@protobufjs/path" "^1.1.2"
+ "@protobufjs/pool" "^1.1.0"
+ "@protobufjs/utf8" "^1.1.0"
+ "@types/node" ">=13.7.0"
+ long "^5.0.0"
+
+"@pgsql/types@^17.0.0":
+ version "17.0.0"
+ resolved "https://registry.yarnpkg.com/@pgsql/types/-/types-17.0.0.tgz#a351a051597b17b81314a038495754fb0a3a3919"
+ integrity sha512-bbGk9TPI2vB58McRuADIvVPGqOznzrXuIPzcyHfoisvXswIrNuw73Sjj7ortvdiI3jypdevJkAAsKGLJkD65SQ==
+
+"@pkgjs/parseargs@^0.11.0":
+ version "0.11.0"
+ resolved "https://registry.yarnpkg.com/@pkgjs/parseargs/-/parseargs-0.11.0.tgz#a77ea742fab25775145434eb1d2328cf5013ac33"
+ integrity sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==
+
+"@protobufjs/aspromise@^1.1.1", "@protobufjs/aspromise@^1.1.2":
+ version "1.1.2"
+ resolved "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz"
+ integrity sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==
+
+"@protobufjs/base64@^1.1.2":
+ version "1.1.2"
+ resolved "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz"
+ integrity sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==
+
+"@protobufjs/codegen@^2.0.4":
+ version "2.0.4"
+ resolved "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz"
+ integrity sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==
+
+"@protobufjs/eventemitter@^1.1.0":
+ version "1.1.0"
+ resolved "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz"
+ integrity sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==
+
+"@protobufjs/fetch@^1.1.0":
+ version "1.1.0"
+ resolved "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz"
+ integrity sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==
+ dependencies:
+ "@protobufjs/aspromise" "^1.1.1"
+ "@protobufjs/inquire" "^1.1.0"
+
+"@protobufjs/float@^1.0.2":
+ version "1.0.2"
+ resolved "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz"
+ integrity sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==
+
+"@protobufjs/inquire@^1.1.0":
+ version "1.1.0"
+ resolved "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz"
+ integrity sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==
+
+"@protobufjs/path@^1.1.2":
+ version "1.1.2"
+ resolved "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz"
+ integrity sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==
+
+"@protobufjs/pool@^1.1.0":
+ version "1.1.0"
+ resolved "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz"
+ integrity sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==
+
+"@protobufjs/utf8@^1.1.0":
+ version "1.1.0"
+ resolved "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz"
+ integrity sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==
+
+"@types/linkify-it@^5":
+ version "5.0.0"
+ resolved "https://registry.yarnpkg.com/@types/linkify-it/-/linkify-it-5.0.0.tgz#21413001973106cda1c3a9b91eedd4ccd5469d76"
+ integrity sha512-sVDA58zAw4eWAffKOaQH5/5j3XeayukzDk+ewSsnv3p4yJEZHCCzMDiZM8e0OUrRvmpGZ85jf4yDHkHsgBNr9Q==
+
+"@types/markdown-it@^14.1.1":
+ version "14.1.2"
+ resolved "https://registry.yarnpkg.com/@types/markdown-it/-/markdown-it-14.1.2.tgz#57f2532a0800067d9b934f3521429a2e8bfb4c61"
+ integrity sha512-promo4eFwuiW+TfGxhi+0x3czqTYJkG8qB17ZUJiVF10Xm7NLVRSLUsfRTU/6h1e24VvRnXCx+hG7li58lkzog==
+ dependencies:
+ "@types/linkify-it" "^5"
+ "@types/mdurl" "^2"
+
+"@types/mdurl@^2":
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/@types/mdurl/-/mdurl-2.0.0.tgz#d43878b5b20222682163ae6f897b20447233bdfd"
+ integrity sha512-RGdgjQUZba5p6QEFAVx2OGb8rQDL/cPRG7GiedRzMcJ1tYnUANBncjbSB1NRGwbvjcPeikRABz2nshyPk1bhWg==
+
+"@types/node@>=13.7.0":
+ version "20.12.8"
+ resolved "https://registry.npmjs.org/@types/node/-/node-20.12.8.tgz"
+ integrity sha512-NU0rJLJnshZWdE/097cdCBbyW1h4hEg0xpovcoAQYHl8dnEyp/NAOiE45pvc+Bd1Dt+2r94v2eGFpQJ4R7g+2w==
+ dependencies:
+ undici-types "~5.26.4"
+
+"@yamlize/cli@^0.8.0":
+ version "0.8.0"
+ resolved "https://registry.yarnpkg.com/@yamlize/cli/-/cli-0.8.0.tgz#c86673a6ee59a36f6a5621a073cb688b5db00d77"
+ integrity sha512-OuhQ/gYLCuMjENdLMF8UXgM32p7blBB0FxwS4R2Mw4jk/9uvv87uCz2ptq9VB7GjNTNbnRTQKw+bAbwCXyngCA==
+ dependencies:
+ chalk "4.1.0"
+ inquirerer "^1.9.0"
+ js-yaml "^4.1.0"
+ minimist "1.2.8"
+ yamlize "^0.8.0"
+
+acorn-jsx@^5.3.2:
+ version "5.3.2"
+ resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937"
+ integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==
+
+acorn@^8.9.0:
+ version "8.15.0"
+ resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.15.0.tgz#a360898bc415edaac46c8241f6383975b930b816"
+ integrity sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==
+
+ansi-regex@^5.0.1:
+ version "5.0.1"
+ resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz"
+ integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==
+
+ansi-regex@^6.0.1:
+ version "6.1.0"
+ resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-6.1.0.tgz#95ec409c69619d6cb1b8b34f14b660ef28ebd654"
+ integrity sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==
+
+ansi-styles@^4.0.0, ansi-styles@^4.1.0:
+ version "4.3.0"
+ resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz"
+ integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==
+ dependencies:
+ color-convert "^2.0.1"
+
+ansi-styles@^6.1.0:
+ version "6.2.1"
+ resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-6.2.1.tgz#0e62320cf99c21afff3b3012192546aacbfb05c5"
+ integrity sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==
+
+argparse@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38"
+ integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==
+
+assertion-error@^1.0.1:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/assertion-error/-/assertion-error-1.1.0.tgz#e60b6b0e8f301bd97e5375215bda406c85118c0b"
+ integrity sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==
+
+ast-types@^0.16.1:
+ version "0.16.1"
+ resolved "https://registry.yarnpkg.com/ast-types/-/ast-types-0.16.1.tgz#7a9da1617c9081bc121faafe91711b4c8bb81da2"
+ integrity sha512-6t10qk83GOG8p0vKmaCr8eiilZwO171AvbROMtvvNiwrTly62t+7XkA8RdIIVbpMhCASAsxgAzdRSwh6nw/5Dg==
+ dependencies:
+ tslib "^2.0.1"
+
+balanced-match@^1.0.0:
+ version "1.0.2"
+ resolved "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz"
+ integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==
+
+bluebird@^3.7.2:
+ version "3.7.2"
+ resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.7.2.tgz#9f229c15be272454ffa973ace0dbee79a1b0c36f"
+ integrity sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==
+
+boolbase@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/boolbase/-/boolbase-1.0.0.tgz#68dff5fbe60c51eb37725ea9e3ed310dcc1e776e"
+ integrity sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==
+
+brace-expansion@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz"
+ integrity sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==
+ dependencies:
+ balanced-match "^1.0.0"
+
+browser-stdout@^1.3.1:
+ version "1.3.1"
+ resolved "https://registry.yarnpkg.com/browser-stdout/-/browser-stdout-1.3.1.tgz#baa559ee14ced73452229bad7326467c61fabd60"
+ integrity sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==
+
+camelcase@^6.0.0:
+ version "6.3.0"
+ resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a"
+ integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==
+
+case@1.6.3:
+ version "1.6.3"
+ resolved "https://registry.yarnpkg.com/case/-/case-1.6.3.tgz#0a4386e3e9825351ca2e6216c60467ff5f1ea1c9"
+ integrity sha512-mzDSXIPaFwVDvZAHqZ9VlbyF4yyXRuX6IvB06WvPYkqJVO24kX1PPhv9bfpKNFZyxYFmmgo03HUiD8iklmJYRQ==
+
+catharsis@^0.9.0:
+ version "0.9.0"
+ resolved "https://registry.yarnpkg.com/catharsis/-/catharsis-0.9.0.tgz#40382a168be0e6da308c277d3a2b3eb40c7d2121"
+ integrity sha512-prMTQVpcns/tzFgFVkVp6ak6RykZyWb3gu8ckUpd6YkTlacOd3DXGJjIpD4Q6zJirizvaiAjSSHlOsA+6sNh2A==
+ dependencies:
+ lodash "^4.17.15"
+
+chai@^3.5.0:
+ version "3.5.0"
+ resolved "https://registry.yarnpkg.com/chai/-/chai-3.5.0.tgz#4d02637b067fe958bdbfdd3a40ec56fef7373247"
+ integrity sha512-eRYY0vPS2a9zt5w5Z0aCeWbrXTEyvk7u/Xf71EzNObrjSCPgMm1Nku/D/u2tiqHBX5j40wWhj54YJLtgn8g55A==
+ dependencies:
+ assertion-error "^1.0.1"
+ deep-eql "^0.1.3"
+ type-detect "^1.0.0"
+
+chalk@4.1.0:
+ version "4.1.0"
+ resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.0.tgz#4e14870a618d9e2edd97dd8345fd9d9dc315646a"
+ integrity sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==
+ dependencies:
+ ansi-styles "^4.1.0"
+ supports-color "^7.1.0"
+
+chalk@^4.0.0, chalk@^4.1.0:
+ version "4.1.2"
+ resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01"
+ integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==
+ dependencies:
+ ansi-styles "^4.1.0"
+ supports-color "^7.1.0"
+
+chokidar@^4.0.1:
+ version "4.0.3"
+ resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-4.0.3.tgz#7be37a4c03c9aee1ecfe862a4a23b2c70c205d30"
+ integrity sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==
+ dependencies:
+ readdirp "^4.0.1"
+
+cliui@^8.0.1:
+ version "8.0.1"
+ resolved "https://registry.yarnpkg.com/cliui/-/cliui-8.0.1.tgz#0c04b075db02cbfe60dc8e6cf2f5486b1a3608aa"
+ integrity sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==
+ dependencies:
+ string-width "^4.2.0"
+ strip-ansi "^6.0.1"
+ wrap-ansi "^7.0.0"
+
+color-convert@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz"
+ integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==
+ dependencies:
+ color-name "~1.1.4"
+
+color-name@~1.1.4:
+ version "1.1.4"
+ resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz"
+ integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==
+
+cross-spawn@^7.0.6:
+ version "7.0.6"
+ resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.6.tgz#8a58fe78f00dcd70c370451759dfbfaf03e8ee9f"
+ integrity sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==
+ dependencies:
+ path-key "^3.1.0"
+ shebang-command "^2.0.0"
+ which "^2.0.1"
+
+css-select@^5.1.0:
+ version "5.1.0"
+ resolved "https://registry.yarnpkg.com/css-select/-/css-select-5.1.0.tgz#b8ebd6554c3637ccc76688804ad3f6a6fdaea8a6"
+ integrity sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==
+ dependencies:
+ boolbase "^1.0.0"
+ css-what "^6.1.0"
+ domhandler "^5.0.2"
+ domutils "^3.0.1"
+ nth-check "^2.0.1"
+
+css-what@^6.1.0:
+ version "6.1.0"
+ resolved "https://registry.yarnpkg.com/css-what/-/css-what-6.1.0.tgz#fb5effcf76f1ddea2c81bdfaa4de44e79bac70f4"
+ integrity sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==
+
+debug@^4.3.1, debug@^4.3.5:
+ version "4.4.1"
+ resolved "https://registry.yarnpkg.com/debug/-/debug-4.4.1.tgz#e5a8bc6cbc4c6cd3e64308b0693a3d4fa550189b"
+ integrity sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==
+ dependencies:
+ ms "^2.1.3"
+
+decamelize@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-4.0.0.tgz#aa472d7bf660eb15f3494efd531cab7f2a709837"
+ integrity sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==
+
+deep-eql@^0.1.3:
+ version "0.1.3"
+ resolved "https://registry.yarnpkg.com/deep-eql/-/deep-eql-0.1.3.tgz#ef558acab8de25206cd713906d74e56930eb69f2"
+ integrity sha512-6sEotTRGBFiNcqVoeHwnfopbSpi5NbH1VWJmYCVkmxMmaVTT0bUTrNaGyBwhgP4MZL012W/mkzIn3Da+iDYweg==
+ dependencies:
+ type-detect "0.1.1"
+
+deep-is@~0.1.3:
+ version "0.1.4"
+ resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831"
+ integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==
+
+deepmerge@4.3.1, deepmerge@^4.3.1:
+ version "4.3.1"
+ resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.3.1.tgz#44b5f2147cd3b00d4b56137685966f26fd25dd4a"
+ integrity sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==
+
+diff@^7.0.0:
+ version "7.0.0"
+ resolved "https://registry.yarnpkg.com/diff/-/diff-7.0.0.tgz#3fb34d387cd76d803f6eebea67b921dab0182a9a"
+ integrity sha512-PJWHUb1RFevKCwaFA9RlG5tCd+FO5iRh9A8HEtkmBH2Li03iJriB6m6JIN4rGz3K3JLawI7/veA1xzRKP6ISBw==
+
+dom-serializer@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-2.0.0.tgz#e41b802e1eedf9f6cae183ce5e622d789d7d8e53"
+ integrity sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==
+ dependencies:
+ domelementtype "^2.3.0"
+ domhandler "^5.0.2"
+ entities "^4.2.0"
+
+domelementtype@^2.3.0:
+ version "2.3.0"
+ resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-2.3.0.tgz#5c45e8e869952626331d7aab326d01daf65d589d"
+ integrity sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==
+
+domhandler@^5.0.2, domhandler@^5.0.3:
+ version "5.0.3"
+ resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-5.0.3.tgz#cc385f7f751f1d1fc650c21374804254538c7d31"
+ integrity sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==
+ dependencies:
+ domelementtype "^2.3.0"
+
+domutils@^3.0.1:
+ version "3.2.2"
+ resolved "https://registry.yarnpkg.com/domutils/-/domutils-3.2.2.tgz#edbfe2b668b0c1d97c24baf0f1062b132221bc78"
+ integrity sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==
+ dependencies:
+ dom-serializer "^2.0.0"
+ domelementtype "^2.3.0"
+ domhandler "^5.0.3"
+
+eastasianwidth@^0.2.0:
+ version "0.2.0"
+ resolved "https://registry.yarnpkg.com/eastasianwidth/-/eastasianwidth-0.2.0.tgz#696ce2ec0aa0e6ea93a397ffcf24aa7840c827cb"
+ integrity sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==
+
+emoji-regex@^8.0.0:
+ version "8.0.0"
+ resolved "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz"
+ integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==
+
+emoji-regex@^9.2.2:
+ version "9.2.2"
+ resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-9.2.2.tgz#840c8803b0d8047f4ff0cf963176b32d4ef3ed72"
+ integrity sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==
+
+entities@^4.2.0, entities@^4.4.0:
+ version "4.5.0"
+ resolved "https://registry.yarnpkg.com/entities/-/entities-4.5.0.tgz#5d268ea5e7113ec74c4d033b79ea5a35a488fb48"
+ integrity sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==
+
+escalade@^3.1.1:
+ version "3.2.0"
+ resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.2.0.tgz#011a3f69856ba189dffa7dc8fcce99d2a87903e5"
+ integrity sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==
+
+escape-string-regexp@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz"
+ integrity sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==
+
+escape-string-regexp@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34"
+ integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==
+
+escodegen@^1.13.0:
+ version "1.14.3"
+ resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.14.3.tgz#4e7b81fba61581dc97582ed78cab7f0e8d63f503"
+ integrity sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw==
+ dependencies:
+ esprima "^4.0.1"
+ estraverse "^4.2.0"
+ esutils "^2.0.2"
+ optionator "^0.8.1"
+ optionalDependencies:
+ source-map "~0.6.1"
+
+eslint-visitor-keys@^3.4.1:
+ version "3.4.3"
+ resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz#0cd72fe8550e3c2eae156a96a4dddcd1c8ac5800"
+ integrity sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==
+
+espree@^9.0.0:
+ version "9.6.1"
+ resolved "https://registry.yarnpkg.com/espree/-/espree-9.6.1.tgz#a2a17b8e434690a5432f2f8018ce71d331a48c6f"
+ integrity sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==
+ dependencies:
+ acorn "^8.9.0"
+ acorn-jsx "^5.3.2"
+ eslint-visitor-keys "^3.4.1"
+
+esprima@^4.0.1, esprima@~4.0.0:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71"
+ integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==
+
+estraverse@^4.2.0:
+ version "4.3.0"
+ resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d"
+ integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==
+
+estraverse@^5.1.0:
+ version "5.3.0"
+ resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123"
+ integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==
+
+esutils@^2.0.2:
+ version "2.0.3"
+ resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64"
+ integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==
+
+fast-levenshtein@~2.0.6:
+ version "2.0.6"
+ resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917"
+ integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==
+
+find-up@^5.0.0:
+ version "5.0.0"
+ resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc"
+ integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==
+ dependencies:
+ locate-path "^6.0.0"
+ path-exists "^4.0.0"
+
+flat@^5.0.2:
+ version "5.0.2"
+ resolved "https://registry.yarnpkg.com/flat/-/flat-5.0.2.tgz#8ca6fe332069ffa9d324c327198c598259ceb241"
+ integrity sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==
+
+foreground-child@^3.1.0:
+ version "3.3.1"
+ resolved "https://registry.yarnpkg.com/foreground-child/-/foreground-child-3.3.1.tgz#32e8e9ed1b68a3497befb9ac2b6adf92a638576f"
+ integrity sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==
+ dependencies:
+ cross-spawn "^7.0.6"
+ signal-exit "^4.0.1"
+
+fs.realpath@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz"
+ integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==
+
+get-caller-file@^2.0.5:
+ version "2.0.5"
+ resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e"
+ integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==
+
+glob@8.0.3:
+ version "8.0.3"
+ resolved "https://registry.yarnpkg.com/glob/-/glob-8.0.3.tgz#415c6eb2deed9e502c68fa44a272e6da6eeca42e"
+ integrity sha512-ull455NHSHI/Y1FqGaaYFaLGkNMMJbavMrEGFXG/PGrg6y7sutWHUHrz6gy6WEBH6akM1M414dWKCNs+IhKdiQ==
+ dependencies:
+ fs.realpath "^1.0.0"
+ inflight "^1.0.4"
+ inherits "2"
+ minimatch "^5.0.1"
+ once "^1.3.0"
+
+glob@^10.0.0, glob@^10.4.5:
+ version "10.4.5"
+ resolved "https://registry.yarnpkg.com/glob/-/glob-10.4.5.tgz#f4d9f0b90ffdbab09c9d77f5f29b4262517b0956"
+ integrity sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==
+ dependencies:
+ foreground-child "^3.1.0"
+ jackspeak "^3.1.2"
+ minimatch "^9.0.4"
+ minipass "^7.1.2"
+ package-json-from-dist "^1.0.0"
+ path-scurry "^1.11.1"
+
+glob@^8.0.0:
+ version "8.1.0"
+ resolved "https://registry.yarnpkg.com/glob/-/glob-8.1.0.tgz#d388f656593ef708ee3e34640fdfb99a9fd1c33e"
+ integrity sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==
+ dependencies:
+ fs.realpath "^1.0.0"
+ inflight "^1.0.4"
+ inherits "2"
+ minimatch "^5.0.1"
+ once "^1.3.0"
+
+globals@^11.1.0:
+ version "11.12.0"
+ resolved "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz"
+ integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==
+
+graceful-fs@^4.1.9:
+ version "4.2.11"
+ resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3"
+ integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==
+
+has-flag@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz"
+ integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==
+
+he@1.2.0, he@^1.2.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f"
+ integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==
+
+inflight@^1.0.4:
+ version "1.0.6"
+ resolved "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz"
+ integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==
+ dependencies:
+ once "^1.3.0"
+ wrappy "1"
+
+inherits@2:
+ version "2.0.4"
+ resolved "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz"
+ integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==
+
+inquirerer@1.9.0:
+ version "1.9.0"
+ resolved "https://registry.yarnpkg.com/inquirerer/-/inquirerer-1.9.0.tgz#108071773a28ea5b950271572ac3051f34e0c92e"
+ integrity sha512-/LAn/F70YvRQZWz9r1q1seoO2oRMiSCSK8xKHGlkNebSibx5FppUKZLEjXgkCy1tgccas933q/Y7qNccFxrYkw==
+ dependencies:
+ chalk "^4.1.0"
+ deepmerge "^4.3.1"
+ js-yaml "^4.1.0"
+ minimist "^1.2.8"
+
+inquirerer@^1.9.0:
+ version "1.9.1"
+ resolved "https://registry.yarnpkg.com/inquirerer/-/inquirerer-1.9.1.tgz#61da5a9a67cb80fa49a85063577bf459ab25802c"
+ integrity sha512-c7N3Yd9warVEpWdyX04dJUtYSad1qZFnNQYsKdqk0Av4qRg83lmxSnhWLn8Ok+UNzj87xXxo/ww0ReIL3ZO92g==
+ dependencies:
+ chalk "^4.1.0"
+ deepmerge "^4.3.1"
+ js-yaml "^4.1.0"
+ minimist "^1.2.8"
+
+is-fullwidth-code-point@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz"
+ integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==
+
+is-plain-obj@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-2.1.0.tgz#45e42e37fccf1f40da8e5f76ee21515840c09287"
+ integrity sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==
+
+is-unicode-supported@^0.1.0:
+ version "0.1.0"
+ resolved "https://registry.yarnpkg.com/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz#3f26c76a809593b52bfa2ecb5710ed2779b522a7"
+ integrity sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==
+
+isexe@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz"
+ integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==
+
+jackspeak@^3.1.2:
+ version "3.4.3"
+ resolved "https://registry.yarnpkg.com/jackspeak/-/jackspeak-3.4.3.tgz#8833a9d89ab4acde6188942bd1c53b6390ed5a8a"
+ integrity sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==
+ dependencies:
+ "@isaacs/cliui" "^8.0.2"
+ optionalDependencies:
+ "@pkgjs/parseargs" "^0.11.0"
+
+js-tokens@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz"
+ integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==
+
+js-yaml@^4.1.0:
+ version "4.1.0"
+ resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602"
+ integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==
+ dependencies:
+ argparse "^2.0.1"
+
+js2xmlparser@^4.0.2:
+ version "4.0.2"
+ resolved "https://registry.yarnpkg.com/js2xmlparser/-/js2xmlparser-4.0.2.tgz#2a1fdf01e90585ef2ae872a01bc169c6a8d5e60a"
+ integrity sha512-6n4D8gLlLf1n5mNLQPRfViYzu9RATblzPEtm1SthMX1Pjao0r9YI9nw7ZIfRxQMERS87mcswrg+r/OYrPRX6jA==
+ dependencies:
+ xmlcreate "^2.0.4"
+
+jsdoc@^4.0.0:
+ version "4.0.4"
+ resolved "https://registry.yarnpkg.com/jsdoc/-/jsdoc-4.0.4.tgz#86565a9e39cc723a3640465b3fb189a22d1206ca"
+ integrity sha512-zeFezwyXeG4syyYHbvh1A967IAqq/67yXtXvuL5wnqCkFZe8I0vKfm+EO+YEvLguo6w9CDUbrAXVtJSHh2E8rw==
+ dependencies:
+ "@babel/parser" "^7.20.15"
+ "@jsdoc/salty" "^0.2.1"
+ "@types/markdown-it" "^14.1.1"
+ bluebird "^3.7.2"
+ catharsis "^0.9.0"
+ escape-string-regexp "^2.0.0"
+ js2xmlparser "^4.0.2"
+ klaw "^3.0.0"
+ markdown-it "^14.1.0"
+ markdown-it-anchor "^8.6.7"
+ marked "^4.0.10"
+ mkdirp "^1.0.4"
+ requizzle "^0.2.3"
+ strip-json-comments "^3.1.0"
+ underscore "~1.13.2"
+
+jsesc@^3.0.2:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-3.1.0.tgz#74d335a234f67ed19907fdadfac7ccf9d409825d"
+ integrity sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==
+
+klaw@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/klaw/-/klaw-3.0.0.tgz#b11bec9cf2492f06756d6e809ab73a2910259146"
+ integrity sha512-0Fo5oir+O9jnXu5EefYbVK+mHMBeEVEy2cmctR1O1NECcCkPRreJKrS6Qt/j3KC2C148Dfo9i3pCmCMsdqGr0g==
+ dependencies:
+ graceful-fs "^4.1.9"
+
+levn@~0.3.0:
+ version "0.3.0"
+ resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee"
+ integrity sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==
+ dependencies:
+ prelude-ls "~1.1.2"
+ type-check "~0.3.2"
+
+linkify-it@^5.0.0:
+ version "5.0.0"
+ resolved "https://registry.yarnpkg.com/linkify-it/-/linkify-it-5.0.0.tgz#9ef238bfa6dc70bd8e7f9572b52d369af569b421"
+ integrity sha512-5aHCbzQRADcdP+ATqnDuhhJ/MRIqDkZX5pyjFHRRysS8vZ5AbqGEoFIb6pYHPZ+L/OC2Lc+xT8uHVVR5CAK/wQ==
+ dependencies:
+ uc.micro "^2.0.0"
+
+locate-path@^6.0.0:
+ version "6.0.0"
+ resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286"
+ integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==
+ dependencies:
+ p-locate "^5.0.0"
+
+lodash@^4.17.15, lodash@^4.17.21:
+ version "4.17.21"
+ resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c"
+ integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==
+
+log-symbols@^4.1.0:
+ version "4.1.0"
+ resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-4.1.0.tgz#3fbdbb95b4683ac9fc785111e792e558d4abd503"
+ integrity sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==
+ dependencies:
+ chalk "^4.1.0"
+ is-unicode-supported "^0.1.0"
+
+long@^5.0.0:
+ version "5.2.3"
+ resolved "https://registry.npmjs.org/long/-/long-5.2.3.tgz"
+ integrity sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q==
+
+lru-cache@^10.2.0:
+ version "10.4.3"
+ resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-10.4.3.tgz#410fc8a17b70e598013df257c2446b7f3383f119"
+ integrity sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==
+
+markdown-it-anchor@^8.6.7:
+ version "8.6.7"
+ resolved "https://registry.yarnpkg.com/markdown-it-anchor/-/markdown-it-anchor-8.6.7.tgz#ee6926daf3ad1ed5e4e3968b1740eef1c6399634"
+ integrity sha512-FlCHFwNnutLgVTflOYHPW2pPcl2AACqVzExlkGQNsi4CJgqOHN7YTgDd4LuhgN1BFO3TS0vLAruV1Td6dwWPJA==
+
+markdown-it@^14.1.0:
+ version "14.1.0"
+ resolved "https://registry.yarnpkg.com/markdown-it/-/markdown-it-14.1.0.tgz#3c3c5992883c633db4714ccb4d7b5935d98b7d45"
+ integrity sha512-a54IwgWPaeBCAAsv13YgmALOF1elABB08FxO9i+r4VFk5Vl4pKokRPeX8u5TCgSsPi6ec1otfLjdOpVcgbpshg==
+ dependencies:
+ argparse "^2.0.1"
+ entities "^4.4.0"
+ linkify-it "^5.0.0"
+ mdurl "^2.0.0"
+ punycode.js "^2.3.1"
+ uc.micro "^2.1.0"
+
+marked@^4.0.10:
+ version "4.3.0"
+ resolved "https://registry.yarnpkg.com/marked/-/marked-4.3.0.tgz#796362821b019f734054582038b116481b456cf3"
+ integrity sha512-PRsaiG84bK+AMvxziE/lCFss8juXjNaWzVbN5tXAm4XjeaS9NAHhop+PjQxz2A9h8Q4M/xGmzP8vqNwy6JeK0A==
+
+mdurl@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/mdurl/-/mdurl-2.0.0.tgz#80676ec0433025dd3e17ee983d0fe8de5a2237e0"
+ integrity sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w==
+
+minimatch@^5.0.1:
+ version "5.1.6"
+ resolved "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz"
+ integrity sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==
+ dependencies:
+ brace-expansion "^2.0.1"
+
+minimatch@^9.0.4, minimatch@^9.0.5:
+ version "9.0.5"
+ resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.5.tgz#d74f9dd6b57d83d8e98cfb82133b03978bc929e5"
+ integrity sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==
+ dependencies:
+ brace-expansion "^2.0.1"
+
+minimist@1.2.8, minimist@^1.2.0, minimist@^1.2.8:
+ version "1.2.8"
+ resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c"
+ integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==
+
+"minipass@^5.0.0 || ^6.0.2 || ^7.0.0", minipass@^7.1.2:
+ version "7.1.2"
+ resolved "https://registry.yarnpkg.com/minipass/-/minipass-7.1.2.tgz#93a9626ce5e5e66bd4db86849e7515e92340a707"
+ integrity sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==
+
+mkdirp@3.0.1:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-3.0.1.tgz#e44e4c5607fb279c168241713cc6e0fea9adcb50"
+ integrity sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==
+
+mkdirp@^1.0.4:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e"
+ integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==
+
+mocha@^11.7.0:
+ version "11.7.0"
+ resolved "https://registry.yarnpkg.com/mocha/-/mocha-11.7.0.tgz#21af618f9f5b404393cc355d9206ba6fcaf8131d"
+ integrity sha512-bXfLy/mI8n4QICg+pWj1G8VduX5vC0SHRwFpiR5/Fxc8S2G906pSfkyMmHVsdJNQJQNh3LE67koad9GzEvkV6g==
+ dependencies:
+ browser-stdout "^1.3.1"
+ chokidar "^4.0.1"
+ debug "^4.3.5"
+ diff "^7.0.0"
+ escape-string-regexp "^4.0.0"
+ find-up "^5.0.0"
+ glob "^10.4.5"
+ he "^1.2.0"
+ js-yaml "^4.1.0"
+ log-symbols "^4.1.0"
+ minimatch "^9.0.5"
+ ms "^2.1.3"
+ picocolors "^1.1.1"
+ serialize-javascript "^6.0.2"
+ strip-json-comments "^3.1.1"
+ supports-color "^8.1.1"
+ workerpool "^9.2.0"
+ yargs "^17.7.2"
+ yargs-parser "^21.1.1"
+ yargs-unparser "^2.0.0"
+
+ms@^2.1.3:
+ version "2.1.3"
+ resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2"
+ integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==
+
+nested-obj@^0.0.1:
+ version "0.0.1"
+ resolved "https://registry.yarnpkg.com/nested-obj/-/nested-obj-0.0.1.tgz#efe1da127c3d00826fa10ec25673e0f9ec1224fd"
+ integrity sha512-kB1WKTng+IePQhZVs1UXtFaHBx4QEM5a0XKGAzYfCKvdx5DhNjCytNDWMUGpNNpHLotln+tiwcA52kWCIgGq1Q==
+
+node-html-parser@6.1.12:
+ version "6.1.12"
+ resolved "https://registry.yarnpkg.com/node-html-parser/-/node-html-parser-6.1.12.tgz#6138f805d0ad7a6b5ef415bcd91bca07374bf575"
+ integrity sha512-/bT/Ncmv+fbMGX96XG9g05vFt43m/+SYKIs9oAemQVYyVcZmDAI2Xq/SbNcpOA35eF0Zk2av3Ksf+Xk8Vt8abA==
+ dependencies:
+ css-select "^5.1.0"
+ he "1.2.0"
+
+nth-check@^2.0.1:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/nth-check/-/nth-check-2.1.1.tgz#c9eab428effce36cd6b92c924bdb000ef1f1ed1d"
+ integrity sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==
+ dependencies:
+ boolbase "^1.0.0"
+
+once@^1.3.0:
+ version "1.4.0"
+ resolved "https://registry.npmjs.org/once/-/once-1.4.0.tgz"
+ integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==
+ dependencies:
+ wrappy "1"
+
+optionator@^0.8.1:
+ version "0.8.3"
+ resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.3.tgz#84fa1d036fe9d3c7e21d99884b601167ec8fb495"
+ integrity sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==
+ dependencies:
+ deep-is "~0.1.3"
+ fast-levenshtein "~2.0.6"
+ levn "~0.3.0"
+ prelude-ls "~1.1.2"
+ type-check "~0.3.2"
+ word-wrap "~1.2.3"
+
+p-limit@^3.0.2:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b"
+ integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==
+ dependencies:
+ yocto-queue "^0.1.0"
+
+p-locate@^5.0.0:
+ version "5.0.0"
+ resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834"
+ integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==
+ dependencies:
+ p-limit "^3.0.2"
+
+package-json-from-dist@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz#4f1471a010827a86f94cfd9b0727e36d267de505"
+ integrity sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==
+
+path-exists@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3"
+ integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==
+
+path-key@^3.1.0:
+ version "3.1.1"
+ resolved "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz"
+ integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==
+
+path-scurry@^1.11.1:
+ version "1.11.1"
+ resolved "https://registry.yarnpkg.com/path-scurry/-/path-scurry-1.11.1.tgz#7960a668888594a0720b12a911d1a742ab9f11d2"
+ integrity sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==
+ dependencies:
+ lru-cache "^10.2.0"
+ minipass "^5.0.0 || ^6.0.2 || ^7.0.0"
+
+pg-proto-parser@^1.23.0:
+ version "1.24.0"
+ resolved "https://registry.yarnpkg.com/pg-proto-parser/-/pg-proto-parser-1.24.0.tgz#8cc52543131c7f63d0caefd06d592e1774147f7d"
+ integrity sha512-6Rr9l0KKvvQJRXGLxAhpEOki3rV7M1IIZWBJGlMZFV0+TunNQBLM+geiXSMALBrB1EvKKes7q3/rt6u7UTzT/g==
+ dependencies:
+ "@babel/generator" "^7.23.6"
+ "@babel/parser" "^7.23.6"
+ "@babel/traverse" "7.24.1"
+ "@babel/types" "7.24.0"
+ "@launchql/protobufjs" "7.2.6"
+ case "1.6.3"
+ deepmerge "4.3.1"
+ nested-obj "^0.0.1"
+ node-html-parser "6.1.12"
+ recast "0.23.6"
+
+picocolors@^1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.1.1.tgz#3d321af3eab939b083c8f929a1d12cda81c26b6b"
+ integrity sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==
+
+prelude-ls@~1.1.2:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54"
+ integrity sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==
+
+punycode.js@^2.3.1:
+ version "2.3.1"
+ resolved "https://registry.yarnpkg.com/punycode.js/-/punycode.js-2.3.1.tgz#6b53e56ad75588234e79f4affa90972c7dd8cdb7"
+ integrity sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA==
+
+randombytes@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a"
+ integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==
+ dependencies:
+ safe-buffer "^5.1.0"
+
+readdirp@^4.0.1:
+ version "4.1.2"
+ resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-4.1.2.tgz#eb85801435fbf2a7ee58f19e0921b068fc69948d"
+ integrity sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==
+
+recast@0.23.6:
+ version "0.23.6"
+ resolved "https://registry.yarnpkg.com/recast/-/recast-0.23.6.tgz#198fba74f66143a30acc81929302d214ce4e3bfa"
+ integrity sha512-9FHoNjX1yjuesMwuthAmPKabxYQdOgihFYmT5ebXfYGBcnqXZf3WOVz+5foEZ8Y83P4ZY6yQD5GMmtV+pgCCAQ==
+ dependencies:
+ ast-types "^0.16.1"
+ esprima "~4.0.0"
+ source-map "~0.6.1"
+ tiny-invariant "^1.3.3"
+ tslib "^2.0.1"
+
+require-directory@^2.1.1:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42"
+ integrity sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==
+
+requizzle@^0.2.3:
+ version "0.2.4"
+ resolved "https://registry.yarnpkg.com/requizzle/-/requizzle-0.2.4.tgz#319eb658b28c370f0c20f968fa8ceab98c13d27c"
+ integrity sha512-JRrFk1D4OQ4SqovXOgdav+K8EAhSB/LJZqCz8tbX0KObcdeM15Ss59ozWMBWmmINMagCwmqn4ZNryUGpBsl6Jw==
+ dependencies:
+ lodash "^4.17.21"
+
+rimraf@5.0.0:
+ version "5.0.0"
+ resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-5.0.0.tgz#5bda14e410d7e4dd522154891395802ce032c2cb"
+ integrity sha512-Jf9llaP+RvaEVS5nPShYFhtXIrb3LRKP281ib3So0KkeZKo2wIKyq0Re7TOSwanasA423PSr6CCIL4bP6T040g==
+ dependencies:
+ glob "^10.0.0"
+
+safe-buffer@^5.1.0:
+ version "5.2.1"
+ resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6"
+ integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==
+
+semver@^7.1.2:
+ version "7.7.2"
+ resolved "https://registry.yarnpkg.com/semver/-/semver-7.7.2.tgz#67d99fdcd35cec21e6f8b87a7fd515a33f982b58"
+ integrity sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==
+
+serialize-javascript@^6.0.2:
+ version "6.0.2"
+ resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-6.0.2.tgz#defa1e055c83bf6d59ea805d8da862254eb6a6c2"
+ integrity sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==
+ dependencies:
+ randombytes "^2.1.0"
+
+shebang-command@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz"
+ integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==
+ dependencies:
+ shebang-regex "^3.0.0"
+
+shebang-regex@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz"
+ integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==
+
+signal-exit@^4.0.1:
+ version "4.1.0"
+ resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-4.1.0.tgz#952188c1cbd546070e2dd20d0f41c0ae0530cb04"
+ integrity sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==
+
+source-map@~0.6.1:
+ version "0.6.1"
+ resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263"
+ integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==
+
+"string-width-cjs@npm:string-width@^4.2.0":
+ version "4.2.3"
+ resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010"
+ integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==
+ dependencies:
+ emoji-regex "^8.0.0"
+ is-fullwidth-code-point "^3.0.0"
+ strip-ansi "^6.0.1"
+
+string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3:
+ version "4.2.3"
+ resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010"
+ integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==
+ dependencies:
+ emoji-regex "^8.0.0"
+ is-fullwidth-code-point "^3.0.0"
+ strip-ansi "^6.0.1"
+
+string-width@^5.0.1, string-width@^5.1.2:
+ version "5.1.2"
+ resolved "https://registry.yarnpkg.com/string-width/-/string-width-5.1.2.tgz#14f8daec6d81e7221d2a357e668cab73bdbca794"
+ integrity sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==
+ dependencies:
+ eastasianwidth "^0.2.0"
+ emoji-regex "^9.2.2"
+ strip-ansi "^7.0.1"
+
+"strip-ansi-cjs@npm:strip-ansi@^6.0.1":
+ version "6.0.1"
+ resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9"
+ integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==
+ dependencies:
+ ansi-regex "^5.0.1"
+
+strip-ansi@^6.0.0, strip-ansi@^6.0.1:
+ version "6.0.1"
+ resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz"
+ integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==
+ dependencies:
+ ansi-regex "^5.0.1"
+
+strip-ansi@^7.0.1:
+ version "7.1.0"
+ resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-7.1.0.tgz#d5b6568ca689d8561370b0707685d22434faff45"
+ integrity sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==
+ dependencies:
+ ansi-regex "^6.0.1"
+
+strip-json-comments@^3.1.0, strip-json-comments@^3.1.1:
+ version "3.1.1"
+ resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006"
+ integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==
+
+supports-color@^7.1.0:
+ version "7.2.0"
+ resolved "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz"
+ integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==
+ dependencies:
+ has-flag "^4.0.0"
+
+supports-color@^8.1.1:
+ version "8.1.1"
+ resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c"
+ integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==
+ dependencies:
+ has-flag "^4.0.0"
+
+tiny-invariant@^1.3.3:
+ version "1.3.3"
+ resolved "https://registry.yarnpkg.com/tiny-invariant/-/tiny-invariant-1.3.3.tgz#46680b7a873a0d5d10005995eb90a70d74d60127"
+ integrity sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==
+
+tmp@^0.2.1:
+ version "0.2.3"
+ resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.2.3.tgz#eb783cc22bc1e8bebd0671476d46ea4eb32a79ae"
+ integrity sha512-nZD7m9iCPC5g0pYmcaxogYKggSfLsdxl8of3Q/oIbqCqLLIO9IAF0GWjX1z9NZRHPiXv8Wex4yDCaZsgEw0Y8w==
+
+to-fast-properties@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e"
+ integrity sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==
+
+tslib@^2.0.1:
+ version "2.8.1"
+ resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.8.1.tgz#612efe4ed235d567e8aba5f2a5fab70280ade83f"
+ integrity sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==
+
+type-check@~0.3.2:
+ version "0.3.2"
+ resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72"
+ integrity sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==
+ dependencies:
+ prelude-ls "~1.1.2"
+
+type-detect@0.1.1:
+ version "0.1.1"
+ resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-0.1.1.tgz#0ba5ec2a885640e470ea4e8505971900dac58822"
+ integrity sha512-5rqszGVwYgBoDkIm2oUtvkfZMQ0vk29iDMU0W2qCa3rG0vPDNczCMT4hV/bLBgLg8k8ri6+u3Zbt+S/14eMzlA==
+
+type-detect@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-1.0.0.tgz#762217cc06db258ec48908a1298e8b95121e8ea2"
+ integrity sha512-f9Uv6ezcpvCQjJU0Zqbg+65qdcszv3qUQsZfjdRbWiZ7AMenrX1u0lNk9EoWWX6e1F+NULyg27mtdeZ5WhpljA==
+
+typescript@^5.3.3:
+ version "5.8.3"
+ resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.8.3.tgz#92f8a3e5e3cf497356f4178c34cd65a7f5e8440e"
+ integrity sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==
+
+uc.micro@^2.0.0, uc.micro@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/uc.micro/-/uc.micro-2.1.0.tgz#f8d3f7d0ec4c3dea35a7e3c8efa4cb8b45c9e7ee"
+ integrity sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==
+
+uglify-js@^3.7.7:
+ version "3.19.3"
+ resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.19.3.tgz#82315e9bbc6f2b25888858acd1fff8441035b77f"
+ integrity sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ==
+
+underscore@~1.13.2:
+ version "1.13.7"
+ resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.13.7.tgz#970e33963af9a7dda228f17ebe8399e5fbe63a10"
+ integrity sha512-GMXzWtsc57XAtguZgaQViUOzs0KTkk8ojr3/xAxXLITqf/3EMwxC0inyETfDFjH/Krbhuep0HNbbjI9i/q3F3g==
+
+undici-types@~5.26.4:
+ version "5.26.5"
+ resolved "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz"
+ integrity sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==
+
+which@^2.0.1:
+ version "2.0.2"
+ resolved "https://registry.npmjs.org/which/-/which-2.0.2.tgz"
+ integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==
+ dependencies:
+ isexe "^2.0.0"
+
+word-wrap@~1.2.3:
+ version "1.2.5"
+ resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.5.tgz#d2c45c6dd4fbce621a66f136cbe328afd0410b34"
+ integrity sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==
+
+workerpool@^9.2.0:
+ version "9.3.2"
+ resolved "https://registry.yarnpkg.com/workerpool/-/workerpool-9.3.2.tgz#4c045a8b437ae1bc70c646af11929a8b4d238656"
+ integrity sha512-Xz4Nm9c+LiBHhDR5bDLnNzmj6+5F+cyEAWPMkbs2awq/dYazR/efelZzUAjB/y3kNHL+uzkHvxVVpaOfGCPV7A==
+
+"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0":
+ version "7.0.0"
+ resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43"
+ integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==
+ dependencies:
+ ansi-styles "^4.0.0"
+ string-width "^4.1.0"
+ strip-ansi "^6.0.0"
+
+wrap-ansi@^7.0.0:
+ version "7.0.0"
+ resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43"
+ integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==
+ dependencies:
+ ansi-styles "^4.0.0"
+ string-width "^4.1.0"
+ strip-ansi "^6.0.0"
+
+wrap-ansi@^8.1.0:
+ version "8.1.0"
+ resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-8.1.0.tgz#56dc22368ee570face1b49819975d9b9a5ead214"
+ integrity sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==
+ dependencies:
+ ansi-styles "^6.1.0"
+ string-width "^5.0.1"
+ strip-ansi "^7.0.1"
+
+wrappy@1:
+ version "1.0.2"
+ resolved "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz"
+ integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==
+
+xmlcreate@^2.0.4:
+ version "2.0.4"
+ resolved "https://registry.yarnpkg.com/xmlcreate/-/xmlcreate-2.0.4.tgz#0c5ab0f99cdd02a81065fa9cd8f8ae87624889be"
+ integrity sha512-nquOebG4sngPmGPICTS5EnxqhKbCmz5Ox5hsszI2T6U5qdrJizBc+0ilYSEjTSzU0yZcmvppztXe/5Al5fUwdg==
+
+y18n@^5.0.5:
+ version "5.0.8"
+ resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55"
+ integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==
+
+yamlize@^0.8.0:
+ version "0.8.0"
+ resolved "https://registry.yarnpkg.com/yamlize/-/yamlize-0.8.0.tgz#5d263fff74329b7435ff163eeee8e137298a7f5e"
+ integrity sha512-2sXxXTr4gZuIP1TmVmm9yJc/WirEKsqctk/gk4MzPGuochfSAY4+OxKXXqFj02HejQmEgAFRun7b0Ec6YjlE7A==
+ dependencies:
+ js-yaml "^4.1.0"
+ mkdirp "3.0.1"
+ nested-obj "^0.0.1"
+
+yargs-parser@^21.1.1:
+ version "21.1.1"
+ resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-21.1.1.tgz#9096bceebf990d21bb31fa9516e0ede294a77d35"
+ integrity sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==
+
+yargs-unparser@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/yargs-unparser/-/yargs-unparser-2.0.0.tgz#f131f9226911ae5d9ad38c432fe809366c2325eb"
+ integrity sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==
+ dependencies:
+ camelcase "^6.0.0"
+ decamelize "^4.0.0"
+ flat "^5.0.2"
+ is-plain-obj "^2.1.0"
+
+yargs@^17.7.2:
+ version "17.7.2"
+ resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.7.2.tgz#991df39aca675a192b816e1e0363f9d75d2aa269"
+ integrity sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==
+ dependencies:
+ cliui "^8.0.1"
+ escalade "^3.1.1"
+ get-caller-file "^2.0.5"
+ require-directory "^2.1.1"
+ string-width "^4.2.3"
+ y18n "^5.0.5"
+ yargs-parser "^21.1.1"
+
+yocto-queue@^0.1.0:
+ version "0.1.0"
+ resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b"
+ integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==