From f7dd471d3ccfa2aa608f43eb09ac4f799ce63908 Mon Sep 17 00:00:00 2001 From: robertsLando Date: Tue, 7 Apr 2026 11:00:59 +0200 Subject: [PATCH 01/41] feat: enhanced SEA mode with walker integration and VFS (#204) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Evolves the --sea flag from a simple single-file wrapper into a full packaging pipeline that reuses the walker for dependency discovery, maps files as SEA assets, and provides a runtime VFS bootstrap using @platformatic/vfs for transparent fs/require/import support. - Add seaMode to walker: skips bytecode compilation and ESM-to-CJS transform, but still discovers all dependencies via stepDetect - Add sea-assets.ts: generates SEA asset map and manifest JSON from walker output (directories, stats, symlinks, native addons) - Add sea-bootstrap.js: runtime bootstrap with lazy SEAProvider, native addon extraction, and process.pkg compatibility - Add seaEnhanced() to sea.ts: walker → refiner → asset gen → blob → bake pipeline with Node 25.5+ --build-sea detection - Route --sea to enhanced mode when input has package.json and target Node >= 22; falls back to simple mode otherwise - Add 4 test suites: multi-file project, asset access, ESM (skipped until node:vfs lands), and VFS fs operations Closes #204 Co-Authored-By: Claude Opus 4.6 (1M context) --- .gitignore | 3 +- eslint.config.js | 1 + lib/index.ts | 40 +- lib/sea-assets.ts | 102 +++++ lib/sea.ts | 133 ++++++- lib/types.ts | 15 + lib/walker.ts | 13 +- package.json | 4 +- plans/SEA_VFS_IMPLEMENTATION_PLAN.md | 504 ++++++++++++++++++++++++ prelude/sea-bootstrap.js | 159 ++++++++ test/test-85-sea-enhanced/index.js | 6 + test/test-85-sea-enhanced/lib/helper.js | 6 + test/test-85-sea-enhanced/main.js | 51 +++ test/test-85-sea-enhanced/package.json | 6 + test/test-86-sea-assets/config.json | 3 + test/test-86-sea-assets/data.txt | 1 + test/test-86-sea-assets/index.js | 12 + test/test-86-sea-assets/main.js | 53 +++ test/test-86-sea-assets/package.json | 12 + test/test-87-sea-esm/app/index.mjs | 5 + test/test-87-sea-esm/app/lib/greet.mjs | 3 + test/test-87-sea-esm/app/lib/math.mjs | 3 + test/test-87-sea-esm/app/package.json | 7 + test/test-87-sea-esm/main.js | 54 +++ test/test-89-sea-fs-ops/data.json | 3 + test/test-89-sea-fs-ops/index.js | 26 ++ test/test-89-sea-fs-ops/main.js | 61 +++ test/test-89-sea-fs-ops/package.json | 11 + yarn.lock | 5 + 29 files changed, 1292 insertions(+), 10 deletions(-) create mode 100644 lib/sea-assets.ts create mode 100644 plans/SEA_VFS_IMPLEMENTATION_PLAN.md create mode 100644 prelude/sea-bootstrap.js create mode 100644 test/test-85-sea-enhanced/index.js create mode 100644 test/test-85-sea-enhanced/lib/helper.js create mode 100644 test/test-85-sea-enhanced/main.js create mode 100644 test/test-85-sea-enhanced/package.json create mode 100644 test/test-86-sea-assets/config.json create mode 100644 test/test-86-sea-assets/data.txt create mode 100644 test/test-86-sea-assets/index.js create mode 100644 test/test-86-sea-assets/main.js create mode 100644 test/test-86-sea-assets/package.json create mode 100644 test/test-87-sea-esm/app/index.mjs create mode 100644 test/test-87-sea-esm/app/lib/greet.mjs create mode 100644 test/test-87-sea-esm/app/lib/math.mjs create mode 100644 test/test-87-sea-esm/app/package.json create mode 100644 test/test-87-sea-esm/main.js create mode 100644 test/test-89-sea-fs-ops/data.json create mode 100644 test/test-89-sea-fs-ops/index.js create mode 100644 test/test-89-sea-fs-ops/main.js create mode 100644 test/test-89-sea-fs-ops/package.json diff --git a/.gitignore b/.gitignore index 417da30e3..1b6bf577e 100644 --- a/.gitignore +++ b/.gitignore @@ -19,4 +19,5 @@ examples/express/node_modules # Editors yarn-error.log -tsconfig.tsbuildinfo \ No newline at end of file +tsconfig.tsbuildinfo +prelude/sea-bootstrap.bundle.js \ No newline at end of file diff --git a/eslint.config.js b/eslint.config.js index c71c94c52..39b8da741 100644 --- a/eslint.config.js +++ b/eslint.config.js @@ -15,6 +15,7 @@ module.exports = [ 'test/test-51-esm-import-meta/esm-module/test-import-meta-basic.js', 'lib/log.js', // ESM re-export file 'test/test-50-extensions/test-y-esnext.js', // ESM test file + 'prelude/sea-bootstrap.bundle.js', // Generated by esbuild ], }, diff --git a/lib/index.ts b/lib/index.ts index ebde57a28..3d8b7c4d7 100644 --- a/lib/index.ts +++ b/lib/index.ts @@ -18,7 +18,7 @@ import { Target, NodeTarget, SymLinks } from './types'; import { CompressType } from './compress_type'; import { patchMachOExecutable, signMachOExecutable } from './mach-o'; import pkgOptions from './options'; -import sea from './sea'; +import sea, { seaEnhanced } from './sea'; const { version } = JSON.parse( readFileSync(path.join(__dirname, '../package.json'), 'utf-8'), @@ -529,10 +529,40 @@ export async function exec(argv2: string[]) { } if (argv.sea) { - await sea(inputFin, { - targets, - signature: argv.signature, - }); + const targetNodeMajor = parseInt( + targets[0].nodeRange.replace('node', ''), + 10, + ); + + if ((inputJson || configJson) && targetNodeMajor >= 22) { + // Enhanced SEA mode — use walker pipeline + const marker: Record = configJson + ? { + config: configJson, + base: path.dirname(config), + configPath: config, + } + : { + config: inputJson || {}, + base: path.dirname(input), + configPath: input, + }; + marker.toplevel = true; + + await seaEnhanced(inputFin, { + targets, + signature: argv.signature, + marker, + params: { seaMode: true }, + addition: isConfiguration(input) ? input : undefined, + }); + } else { + // Simple SEA mode (backward compat: plain .js file or Node < 22) + await sea(inputFin, { + targets, + signature: argv.signature, + }); + } return; } diff --git a/lib/sea-assets.ts b/lib/sea-assets.ts new file mode 100644 index 000000000..3d3f0c0fa --- /dev/null +++ b/lib/sea-assets.ts @@ -0,0 +1,102 @@ +import { mkdir, writeFile } from 'fs/promises'; +import path from 'path'; +import { dirname, join } from 'path'; + +import { STORE_CONTENT, STORE_LINKS, STORE_STAT, snapshotify } from './common'; +import { FileRecords, SymLinks } from './types'; + +export interface SeaManifest { + entrypoint: string; + directories: Record; + stats: Record< + string, + { size: number; isFile: boolean; isDirectory: boolean } + >; + symlinks: Record; + nativeAddons: string[]; +} + +export interface SeaAssetsResult { + assets: Record; + manifestPath: string; +} + +/** + * Transform walker/refiner output into SEA-compatible asset map and manifest. + * + * Asset keys use refiner paths (no /snapshot prefix) because @platformatic/vfs + * strips the mount prefix before passing paths to the provider. The entrypoint + * in the manifest uses the snapshotified path for process.argv[1] compatibility. + */ +export async function generateSeaAssets( + records: FileRecords, + entrypoint: string, + symLinks: SymLinks, + tmpDir: string, +): Promise { + const assets: Record = {}; + const manifest: SeaManifest = { + entrypoint: snapshotify(entrypoint, path.sep), + directories: {}, + stats: {}, + symlinks: symLinks, + nativeAddons: [], + }; + + let modifiedFileCount = 0; + + for (const snap in records) { + if (!records[snap]) continue; + const record = records[snap]; + + // Map file content to SEA asset + if (record[STORE_CONTENT]) { + if (record.body != null) { + // File was modified (patches, rewrites) — write to temp file + const tempPath = join( + tmpDir, + 'assets', + `modified_${modifiedFileCount}`, + ); + modifiedFileCount += 1; + await mkdir(dirname(tempPath), { recursive: true }); + const content = + typeof record.body === 'string' + ? Buffer.from(record.body) + : record.body; + await writeFile(tempPath, content); + assets[snap] = tempPath; + } else { + // Unmodified file — point to source on disk + assets[snap] = record.file; + } + + // Detect native addons + if (snap.endsWith('.node')) { + manifest.nativeAddons.push(snap); + } + } + + // Collect directory entries + if (record[STORE_LINKS]) { + manifest.directories[snap] = [ + ...new Set(record[STORE_LINKS] as string[]), + ]; + } + + // Collect stat metadata + if (record[STORE_STAT]) { + const stat = record[STORE_STAT]; + manifest.stats[snap] = { + size: stat.size || 0, + isFile: Boolean(stat.isFileValue), + isDirectory: Boolean(stat.isDirectoryValue), + }; + } + } + + const manifestPath = join(tmpDir, '__pkg_manifest__.json'); + await writeFile(manifestPath, JSON.stringify(manifest)); + + return { assets, manifestPath }; +} diff --git a/lib/sea.ts b/lib/sea.ts index bf811e2f2..f0a541aea 100644 --- a/lib/sea.ts +++ b/lib/sea.ts @@ -10,12 +10,15 @@ import { homedir, tmpdir } from 'os'; import unzipper from 'unzipper'; import { extract as tarExtract } from 'tar'; import { log } from './log'; -import { NodeTarget, Target } from './types'; +import { NodeTarget, Target, SeaEnhancedOptions } from './types'; import { patchMachOExecutable, removeMachOExecutableSignature, signMachOExecutable, } from './mach-o'; +import walk, { Marker, WalkerParams } from './walker'; +import refine from './refiner'; +import { generateSeaAssets } from './sea-assets'; const exec = util.promisify(cExec); @@ -331,6 +334,134 @@ async function bake( } } +/** Create NodeJS executable using the enhanced SEA pipeline (walker + refiner + assets) */ +export async function seaEnhanced( + entryPoint: string, + opts: SeaEnhancedOptions, +) { + entryPoint = resolve(process.cwd(), entryPoint); + + if (!(await exists(entryPoint))) { + throw new Error(`Entrypoint path "${entryPoint}" does not exist`); + } + + const marker = opts.marker as unknown as Marker; + const params = (opts.params || {}) as WalkerParams; + + // Run walker in SEA mode + log.info('Walking dependencies...'); + const walkResult = await walk(marker, entryPoint, opts.addition, { + ...params, + seaMode: true, + }); + + // Refine (path compression, empty dir pruning) + log.info('Refining file records...'); + const { + records, + entrypoint: refinedEntry, + symLinks, + } = refine(walkResult.records, walkResult.entrypoint, walkResult.symLinks); + + const tmpDir = join(tmpdir(), 'pkg-sea', `${Date.now()}`); + await mkdir(tmpDir, { recursive: true }); + + // Resolve target outputs to absolute paths before chdir to tmpDir + for (const target of opts.targets) { + if (target.output) { + target.output = resolve(process.cwd(), target.output); + } + } + + const nodePaths = await Promise.all( + opts.targets.map((target) => getNodejsExecutable(target, opts)), + ); + + const previousDirectory = process.cwd(); + try { + process.chdir(tmpDir); + + // Generate SEA assets from walker output + log.info('Generating SEA assets...'); + const { assets, manifestPath } = await generateSeaAssets( + records, + refinedEntry, + symLinks, + tmpDir, + ); + + // Copy bundled bootstrap + const bootstrapPath = join(tmpDir, 'sea-main.js'); + await copyFile( + join(__dirname, '..', 'prelude', 'sea-bootstrap.bundle.js'), + bootstrapPath, + ); + + // Build sea-config.json + const blobPath = join(tmpDir, 'sea-prep.blob'); + const seaConfig = { + main: bootstrapPath, + output: blobPath, + disableExperimentalSEAWarning: true, + useCodeCache: opts.seaConfig?.useCodeCache ?? false, + useSnapshot: false, + assets: { + __pkg_manifest__: manifestPath, + ...assets, + }, + }; + + const seaConfigFilePath = join(tmpDir, 'sea-config.json'); + log.info('Creating sea-config.json file...'); + await writeFile(seaConfigFilePath, JSON.stringify(seaConfig)); + + // Detect Node version for build command + const nodeMajor = parseInt(process.version.slice(1).split('.')[0], 10); + if (nodeMajor >= 25) { + log.info('Generating the blob using --build-sea...'); + await exec(`node --build-sea "${seaConfigFilePath}"`); + } else { + log.info('Generating the blob...'); + await exec(`node --experimental-sea-config "${seaConfigFilePath}"`); + } + + // Bake blob into each target executable + await Promise.allSettled( + nodePaths.map(async (nodePath, i) => { + const target = opts.targets[i]; + await bake(nodePath, target, blobPath); + const output = target.output!; + if (opts.signature && target.platform === 'macos') { + const buf = patchMachOExecutable(await readFile(output)); + await writeFile(output, buf); + try { + signMachOExecutable(output); + } catch { + if (target.arch === 'arm64') { + log.warn('Unable to sign the macOS executable', [ + 'Due to the mandatory code signing requirement, before the', + 'executable is distributed to end users, it must be signed.', + 'Otherwise, it will be immediately killed by kernel on launch.', + 'An ad-hoc signature is sufficient.', + 'To do that, run pkg on a Mac, or transfer the executable to a Mac', + 'and run "codesign --sign - ", or (if you use Linux)', + 'install "ldid" utility to PATH and then run pkg again', + ]); + } + } + } + }), + ); + } catch (error) { + throw new Error(`Error while creating the executable: ${error}`); + } finally { + await rm(tmpDir, { recursive: true }).catch(() => { + log.warn(`Failed to cleanup the temp directory ${tmpDir}`); + }); + process.chdir(previousDirectory); + } +} + /** Create NodeJS executable using sea */ export default async function sea(entryPoint: string, opts: SeaOptions) { entryPoint = resolve(process.cwd(), entryPoint); diff --git a/lib/types.ts b/lib/types.ts index 9699ae23b..4563b8291 100644 --- a/lib/types.ts +++ b/lib/types.ts @@ -73,4 +73,19 @@ export interface Target extends NodeTarget { fabricator: Target; } +export interface SeaEnhancedOptions { + seaConfig?: { + disableExperimentalSEAWarning?: boolean; + useSnapshot?: boolean; + useCodeCache?: boolean; + }; + signature?: boolean; + targets: (NodeTarget & Partial)[]; + useLocalNode?: boolean; + nodePath?: string; + marker: Record; + params: Record; + addition?: string; +} + export type SymLinks = Record; diff --git a/lib/walker.ts b/lib/walker.ts index 2b2429fcd..fbd84a6fd 100644 --- a/lib/walker.ts +++ b/lib/walker.ts @@ -366,6 +366,7 @@ export interface WalkerParams { publicToplevel?: boolean; publicPackages?: string[]; noDictionary?: string[]; + seaMode?: boolean; } class Walker { @@ -497,6 +498,12 @@ class Walker { } assert(task.store === STORE_BLOB || task.store === STORE_CONTENT); + + // In SEA mode, always store as content (no V8 bytecode compilation) + if (this.params.seaMode && task.store === STORE_BLOB) { + task.store = STORE_CONTENT; + } + assert(typeof task.file === 'string'); const realFile = toNormalizedRealPath(task.file); @@ -996,6 +1003,7 @@ class Walker { if ( store === STORE_BLOB || + this.params.seaMode || (store === STORE_CONTENT && isPackageJson(record.file)) || this.hasPatch(record) ) { @@ -1070,7 +1078,7 @@ class Walker { // If package has "type": "module", we need to change it to "commonjs" // because we transform all ESM files to CJS before bytecode compilation - if (pkgContent.type === 'module') { + if (pkgContent.type === 'module' && !this.params.seaMode) { pkgContent.type = 'commonjs'; modified = true; } @@ -1091,6 +1099,7 @@ class Walker { // Check all JS-like files (.js, .mjs, .cjs) but only transform ESM ones if ( store === STORE_BLOB && + !this.params.seaMode && record.body && (isDotJS(record.file) || record.file.endsWith('.mjs')) ) { @@ -1117,7 +1126,7 @@ class Walker { } } - if (store === STORE_BLOB) { + if (store === STORE_BLOB || this.params.seaMode) { const derivatives2: Derivative[] = []; stepDetect(record, marker, derivatives2); await this.stepDerivatives(record, marker, derivatives2); diff --git a/package.json b/package.json index 1aa55aff5..0757ae3ac 100644 --- a/package.json +++ b/package.json @@ -26,6 +26,7 @@ "@babel/parser": "^7.23.0", "@babel/traverse": "^7.23.0", "@babel/types": "^7.23.0", + "@platformatic/vfs": "^0.3.0", "@yao-pkg/pkg-fetch": "3.5.33", "esbuild": "^0.27.3", "into-stream": "^9.1.0", @@ -72,7 +73,8 @@ }, "scripts": { "clean": "rimraf lib-es5", - "build": "npm run clean && tsc", + "build": "npm run clean && tsc && npm run build:sea-bootstrap", + "build:sea-bootstrap": "esbuild prelude/sea-bootstrap.js --bundle --platform=node --target=node22 --outfile=prelude/sea-bootstrap.bundle.js --external:node:sea --external:node:fs --external:node:path --external:node:os --external:node:crypto --external:node:module --external:node:vfs", "start": "tsc --watch", "lint": "npm run lint:style && npm run lint:code", "lint:style": "prettier -c \"{lib,prelude,test}/**/*.{ts,js}\"", diff --git a/plans/SEA_VFS_IMPLEMENTATION_PLAN.md b/plans/SEA_VFS_IMPLEMENTATION_PLAN.md new file mode 100644 index 000000000..767e7725f --- /dev/null +++ b/plans/SEA_VFS_IMPLEMENTATION_PLAN.md @@ -0,0 +1,504 @@ +# Enhanced SEA Support with Walker Integration and VFS + +> **Issue**: [yao-pkg/pkg#204](https://github.com/yao-pkg/pkg/issues/204) +> **Date**: 2026-04-07 +> **Status**: Draft + +## Table of Contents + +- [Context](#context) +- [Performance and Code Protection Analysis](#performance-and-code-protection-analysis) +- [Architecture Decisions](#architecture-decisions) +- [Implementation Plan](#implementation-plan) +- [Code Reuse and DRY Strategy](#code-reuse-and-dry-strategy) +- [Risks and Mitigations](#risks-and-mitigations) +- [Verification](#verification) + +--- + +## Context + +### Problem + +The current `--sea` flag (`lib/sea.ts`) completely bypasses the walker/packer/producer pipeline. It takes a single pre-bundled `.js` file, creates a minimal `sea-config.json`, generates a blob via `node --experimental-sea-config`, and injects it with `postject`. There is: + +- **No dependency walking** — user must pre-bundle everything with esbuild/webpack +- **No VFS** — no `fs.readFileSync` for packaged files, no `readdir`, no `stat` +- **No native addon handling** — `.node` files cannot be loaded +- **No ESM support** — must pre-transpile to CJS +- **No asset bundling** — JSON, images, templates must be manually inlined + +### Goal + +Evolve `--sea` into a full pipeline that reuses the existing walker for dependency discovery, maps all files as SEA assets, and provides a runtime bootstrap using VFS to create a transparent virtual filesystem — keeping the developer experience identical to traditional `pkg`. + +### Node.js Ecosystem State + +| Feature | Status | Version | Notes | +| ---------------------------------------------------------- | --------- | ------------------- | ------------------------------------------------------------------- | +| `node:sea` API (`getAsset`, `getRawAsset`, `getAssetKeys`) | Stable | Node 20+ | Asset storage and retrieval | +| SEA `assets` field in config | Stable | Node 21.7+ / 20.12+ | Key-value asset embedding | +| `--build-sea` (single-step build) | Stable | Node 25.5+ | Replaces `--experimental-sea-config` + `postject` | +| `mainFormat: "module"` (ESM entry) | Merged | Node 25.7+ | [PR #61813](https://github.com/nodejs/node/pull/61813) | +| `node:vfs` (built-in VFS) | Open PR | TBD | [PR #61478](https://github.com/nodejs/node/pull/61478), 8 approvals | +| `@platformatic/vfs` (polyfill) | Published | Node 22+ | Same author as PR #61478, will deprecate when core lands | + +--- + +## Performance and Code Protection Analysis + +### Code Protection Comparison + +| Aspect | Traditional `pkg` (default) | Enhanced SEA (proposed) | +| ----------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------ | ---------------------------------------------------------------------------------------------------------------------------------------- | +| **Source code storage** | Can be fully stripped — `STORE_BLOB` with `sourceless: true` stores only V8 bytecode, no source recoverable | Source code stored as SEA assets in plaintext. `useCodeCache: true` adds a code cache alongside source but does NOT strip it | +| **Reverse engineering** | V8 bytecode requires specialized tools (`v8-decompile`) to reverse. Not trivially readable | Standard text assets extractable from executable resource section using `readelf`/`xxd` or by searching for the `NODE_SEA_FUSE` sentinel | +| **Binary format** | Custom VFS format with offset-based access, optional Brotli/GZip compression, base36 dictionary path compression | Standard OS resource format (PE `.rsrc` on Windows, ELF notes on Linux, Mach-O segments on macOS) — well-documented, easier to parse | +| **Payload location** | Custom byte offsets injected via placeholder replacement (`PAYLOAD_POSITION`, `PAYLOAD_SIZE`). Requires understanding the specific binary layout | Standard `NODE_SEA_BLOB` resource name. `postject` uses OS-native resource embedding | +| **Runtime access** | Accessed via file descriptor reads at computed offsets (`prelude/bootstrap.js:425-451`). No standard tooling to extract | Accessed via `sea.getAsset(key)` — official API, assets are first-class | + +**Key takeaway**: Traditional `pkg` offers significantly stronger code protection through V8 bytecode compilation with source stripping. SEA mode stores source code in plaintext within the executable. This is a fundamental limitation of the Node.js SEA design — there is no `sourceless` equivalent. Users who require code obfuscation should: + +1. Continue using the traditional `pkg` mode, OR +2. Pre-process their code through an obfuscator (e.g., `javascript-obfuscator`) before SEA packaging, OR +3. Use `useCodeCache: true` for marginal protection (source still present, but code cache makes direct extraction slightly harder) + +### Performance Comparison + +| Aspect | Traditional `pkg` | Enhanced SEA | +| -------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| **Startup time** | V8 bytecode loads faster than parsing source — bytecode is pre-compiled. `vm.Script` with `cachedData` skips parsing phase (`bootstrap.js:1899-1918`) | `useCodeCache: true` provides similar optimization. First run parses source, subsequent runs (within the same binary) use cached compilation. Without it, every launch re-parses from source | +| **Memory footprint** | Payload accessed via file descriptor reads on demand (`readPayloadSync` at computed offsets). Files loaded only when accessed | SEA `getRawAsset()` returns a zero-copy `ArrayBuffer` reference to the executable's mapped memory — very efficient. With custom `SEAProvider`, memory usage is comparable | +| **Executable size** | Brotli/GZip compression available — can reduce payload by 60-80%. Dictionary path compression adds 5-15% reduction | SEA assets are stored uncompressed. Executable size will be larger for the same project. Compression would require build-time compression + runtime decompression in bootstrap | +| **Build time** | V8 bytecode compilation requires spawning a Node.js process per file via fabricator. Cross-arch bytecode needs QEMU/Rosetta. Expensive for large projects | No bytecode compilation step. Build is: walk deps + write assets + generate blob + inject. Significantly faster for large projects | +| **Module loading** | Custom `require` implementation in bootstrap. Each module loaded from VFS via offset reads. Synchronous | VFS polyfill patches `require`/`import` at module resolution level. `@platformatic/vfs` handles 164+ fs functions. Module hooks support ESM natively | +| **Native addons** | Extracted to `~/.cache/pkg/` on first load, SHA256-verified, persisted across runs (`bootstrap.js:155-242`) | Same approach needed — extract from VFS to temp dir, load via `process.dlopen`. Can reuse identical caching strategy | + +**Key takeaway**: SEA mode trades code protection for build speed and Node.js compatibility. The zero-copy asset access via `getRawAsset()` provides excellent runtime memory efficiency. Build times are substantially faster since there is no bytecode compilation step. However, executable size will be larger without compression support. + +### When to Use Each Mode + +| Use Case | Recommended Mode | +| ----------------------------------------------- | ----------------------------------------------- | +| Code protection / IP-sensitive distribution | Traditional `pkg` (bytecode + source stripping) | +| Fast build iteration during development | Enhanced SEA | +| ESM-native projects | Enhanced SEA (no CJS transform needed) | +| Minimum executable size | Traditional `pkg` (compression support) | +| Maximum Node.js compatibility / future-proofing | Enhanced SEA (uses official APIs) | +| Cross-platform builds from single host | Traditional `pkg` (platform-independent VFS) | + +--- + +## Architecture Decisions + +### D1: Use `@platformatic/vfs` as VFS runtime + +Building a custom layer that patches 164+ fs functions + module resolution would duplicate `@platformatic/vfs`. The polyfill is maintained by the same author as `node:vfs` PR #61478. Migration path when `node:vfs` lands in core: + +```javascript +let vfs; +try { + vfs = require('node:vfs'); +} catch { + vfs = require('@platformatic/vfs'); +} +``` + +### D2: Bundle VFS polyfill into self-contained SEA bootstrap at build time + +SEA `main` must be self-contained. Use `esbuild` (already a project dependency) to bundle `prelude/sea-bootstrap.js` + `@platformatic/vfs` into a single file at `pkg` build time. + +### D3: Skip ESM-to-CJS transform and V8 bytecode in SEA mode + +SEA on Node 25.7+ supports ESM natively (`mainFormat: "module"`). On Node 22-24, the VFS polyfill's module hooks handle ESM. V8 bytecode is unnecessary — SEA has `useCodeCache`. The walker gets a `seaMode` flag that disables these steps. + +### D4: Store directory metadata as a JSON manifest asset + +SEA assets are flat key-value pairs. A `__pkg_manifest__.json` asset contains directory tree structure, symlinks, stat info, and native addon list. The bootstrap reads this for `readdir`, `stat`, etc. + +### D5: Create a custom `SEAProvider` for lazy asset loading + +Instead of loading all SEA assets into `MemoryProvider` at startup (high memory), create a `SEAProvider` that wraps `sea.getRawAsset()` lazily. Zero-copy. Directory listings and stat come from the manifest. + +### D6: Backward compatibility — simple `--sea` mode preserved + +Enhanced mode activates when `--sea` is used with a package.json/directory input AND target Node >= 22. Plain `.js` file input or Node < 22 targets fall back to current simple behavior. + +### D7: Minimum target Node 22+ for enhanced SEA + +`@platformatic/vfs` requires Node >= 22. Node 20 reaches EOL April 2026. + +--- + +## Implementation Plan + +### Step 1: Dependencies and build infrastructure + +**Files to modify:** + +- `package.json` + +**Changes:** + +1. Add `@platformatic/vfs` to `dependencies` +2. Add `build:sea-bootstrap` script: + ```json + "build:sea-bootstrap": "esbuild prelude/sea-bootstrap.js --bundle --platform=node --target=node22 --outfile=prelude/sea-bootstrap.bundle.js --external:node:sea --external:node:fs --external:node:path --external:node:os --external:node:crypto --external:node:module --external:node:vfs" + ``` +3. Integrate into the main `build` script so it runs alongside TypeScript compilation +4. Add `prelude/sea-bootstrap.bundle.js` to `.gitignore` (generated artifact) + +--- + +### Step 2: Walker SEA mode + +**File to modify:** `lib/walker.ts` + +Add `seaMode?: boolean` to `WalkerParams` interface. When true: + +1. **`appendBlobOrContent`** — always use `STORE_CONTENT` instead of `STORE_BLOB`. No bytecode. +2. **`step_STORE_ANY`** — skip ESM-to-CJS transformation. Files stay in original format. +3. **Package.json processing** — do NOT rewrite `"type": "module"` to `"type": "commonjs"`. ESM packages stay ESM. +4. All dependency discovery, `.node` detection, symlinks, `pkg.assets`, `pkg.scripts` work unchanged. + +**DRY note**: The walker's core traversal logic, `stepDetect`, `follow`, and resolution remain completely untouched. Only the storage/transform decisions change based on a flag. + +--- + +### Step 3: SEA asset map generator + +**New file:** `lib/sea-assets.ts` + +Transforms walker output → SEA config assets + manifest. + +```typescript +import { FileRecords, SymLinks } from './types'; +import { STORE_CONTENT, STORE_LINKS, STORE_STAT } from './common'; + +export interface SeaManifest { + entrypoint: string; + directories: Record; + stats: Record< + string, + { size: number; isFile: boolean; isDirectory: boolean } + >; + symlinks: Record; + nativeAddons: string[]; +} + +export interface SeaAssetsResult { + assets: Record; // snapshot_path -> disk_path + manifestPath: string; // path to __pkg_manifest__.json +} + +export async function generateSeaAssets( + records: FileRecords, + entrypoint: string, + symLinks: SymLinks, + tmpDir: string, +): Promise; +``` + +**Logic:** + +1. Iterate `records`. For each entry with `STORE_CONTENT`: + - If `record.body` was modified (patches, rewrites) → write to temp file, point asset there + - Otherwise → point directly to `record.file` on disk + - Key = snapshot path (reuse `snapshotify` from `lib/common.ts:192`) +2. Build manifest from `STORE_LINKS` (directory entries) and `STORE_STAT` (metadata) +3. Identify native addons (files ending in `.node`) → `manifest.nativeAddons` +4. Write manifest to `tmpDir/__pkg_manifest__.json` + +**DRY note**: Reuses `snapshotify`, `normalizePath`, and `insideSnapshot` from `lib/common.ts`. Does NOT duplicate any path logic. + +--- + +### Step 4: SEA bootstrap script + +**New file:** `prelude/sea-bootstrap.js` + +This becomes the SEA `main` entry. Bundled with `@platformatic/vfs` at build time. + +**Execution flow:** + +``` +1. Read __pkg_manifest__.json from SEA assets +2. Create SEAProvider (custom, wraps sea.getRawAsset lazily) +3. Create VirtualFileSystem, mount at /snapshot with overlay: true +4. Patch process.dlopen for native addon extraction +5. Set process.pkg compatibility +6. Set process.argv[1] = entrypoint +7. Run entrypoint via Module.runMain() +``` + +**Custom SEAProvider** (defined within sea-bootstrap.js): + +```javascript +class SEAProvider { + constructor(manifest) { + this.manifest = manifest; + } + + readFileSync(snapshotPath) { + return Buffer.from(sea.getRawAsset(snapshotPath)); // zero-copy from executable memory + } + + statSync(snapshotPath) { + const s = this.manifest.stats[snapshotPath]; + if (!s) + throw Object.assign(new Error(`ENOENT: ${snapshotPath}`), { + code: 'ENOENT', + }); + return s; + } + + readdirSync(snapshotPath) { + const entries = this.manifest.directories[snapshotPath]; + if (!entries) + throw Object.assign(new Error(`ENOENT: ${snapshotPath}`), { + code: 'ENOENT', + }); + return entries; + } + + existsSync(snapshotPath) { + return snapshotPath in this.manifest.stats; + } +} +``` + +**Native addon extraction** — reuses the same strategy as `prelude/bootstrap.js:155-242`: + +- Extract `.node` from VFS to `~/.cache/pkg//` +- SHA256 verification to skip re-extraction +- Sync extraction (required by `process.dlopen`) + +**DRY note**: The native addon extraction logic from `bootstrap.js` should be extracted into a shared utility that both bootstraps can reference. During the esbuild bundle step, the shared code gets inlined into each bootstrap independently. + +**`node:vfs` migration path**: When `node:vfs` lands AND the SEA config supports `"useVfs": true`, the entire bootstrap simplifies to just running the entrypoint — Node handles VFS transparently. + +--- + +### Step 5: Enhanced SEA orchestrator + +**File to modify:** `lib/sea.ts` + +Refactor the module to export both simple and enhanced modes. + +**New exports:** + +```typescript +// Keep existing function as-is, rename internally +export { sea as seaSimple }; + +// New enhanced function +export async function seaEnhanced( + entrypoint: string, + opts: SeaEnhancedOptions, +): Promise; +``` + +**`seaEnhanced` flow:** + +1. Run walker with `{ seaMode: true }` +2. Run refiner (path compression, empty dir pruning) — reuse `lib/refiner.ts` +3. Generate SEA assets via `generateSeaAssets` (Step 3) +4. Copy pre-bundled bootstrap to tmpDir +5. Build `sea-config.json`: + ```json + { + "main": "/sea-main.js", + "output": "/sea-prep.blob", + "disableExperimentalSEAWarning": true, + "useCodeCache": false, + "useSnapshot": false, + "assets": { + "__pkg_manifest__": "/__pkg_manifest__.json", + "/snapshot/myapp/index.js": "/real/path/to/index.js", + ... + } + } + ``` +6. Generate blob — detect Node version: + - Node >= 25.5: `node --build-sea sea-config.json` + - Node < 25.5: `node --experimental-sea-config sea-config.json` +7. For each target: download Node binary (reuse `getNodejsExecutable`), inject blob (reuse `bake`) +8. Sign macOS binaries if `--signature` (reuse existing signing logic) +9. Cleanup tmpDir + +**DRY note**: `getNodejsExecutable`, `bake`, `downloadFile`, `extract`, `verifyChecksum`, `getNodeVersion`, `getNodeOs`, `getNodeArch` — ALL reused as-is. No duplication. + +--- + +### Step 6: CLI integration + +**File to modify:** `lib/index.ts` (around line 531) + +Replace the current `--sea` block: + +```typescript +if (argv.sea) { + const targetNodeMajor = parseInt( + targets[0].nodeRange.replace('node', ''), + 10, + ); + + if ((inputJson || configJson) && targetNodeMajor >= 22) { + // Enhanced SEA: full walker pipeline + const marker: Marker = configJson + ? { config: configJson, base: path.dirname(config), configPath: config } + : { + config: inputJson || {}, + base: path.dirname(input), + configPath: input, + }; + marker.toplevel = true; + + await seaEnhanced(inputFin, { + targets, + signature: argv.signature, + marker, + params: { seaMode: true }, + addition: isConfiguration(input) ? input : undefined, + }); + } else { + // Simple SEA: single pre-bundled file (backward compat) + await sea(inputFin, { targets, signature: argv.signature }); + } + return; +} +``` + +**DRY note**: Marker construction logic mirrors the existing pattern at lines 594-619 of `index.ts`. Consider extracting a `buildMarker()` helper if the duplication exceeds 5 lines. + +--- + +### Step 7: Type extensions + +**File to modify:** `lib/types.ts` + +Add SEA-specific types: + +```typescript +export interface SeaEnhancedOptions extends SeaOptions { + marker: Marker; + params: WalkerParams; + addition?: string; +} +``` + +Import `Marker` and `WalkerParams` from walker. Keep types co-located with their primary consumers. + +--- + +### Step 8: Tests + +**New test directories:** + +| Directory | Purpose | Key Assertions | +| ---------------------------- | ------------------------------------------------ | ---------------------------------------------------------------------- | +| `test/test-85-sea-enhanced/` | Multi-file project with package.json via `--sea` | Executable runs, produces correct output, multiple modules resolved | +| `test/test-86-sea-assets/` | Non-JS assets (JSON, text, images) | `fs.readFileSync` returns correct content for packaged assets | +| `test/test-87-sea-esm/` | ESM project (`type: "module"`) | `import`/`export` work, `import.meta.url` correct | +| `test/test-88-sea-native/` | Native addon (`.node` file) | Addon extracted and loaded correctly | +| `test/test-89-sea-fs-ops/` | VFS operations | `readdir`, `stat`, `existsSync`, `realpathSync` work on snapshot paths | + +Each test follows the pattern from `test/test-00-sea/main.js`: + +1. Guard: skip if Node < 22 +2. Invoke `utils.pkg.sync(['input', '--sea', '-t', 'host'])` +3. Spawn executable, assert output +4. Cleanup with `utils.filesAfter` + +--- + +## Code Reuse and DRY Strategy + +### Existing code to reuse (DO NOT duplicate) + +| Module | Functions/Exports | Used By | +| ---------------- | ------------------------------------------------------------------------------------------------------------------------ | ----------------------------------- | +| `lib/common.ts` | `snapshotify`, `normalizePath`, `insideSnapshot`, `stripSnapshot`, `STORE_*` constants | `sea-assets.ts`, `sea-bootstrap.js` | +| `lib/walker.ts` | Entire walker — no fork, just a `seaMode` flag | `sea.ts` (enhanced) | +| `lib/refiner.ts` | `refine()` — path compression, empty dir cleanup | `sea.ts` (enhanced) | +| `lib/sea.ts` | `getNodejsExecutable`, `bake`, `downloadFile`, `extract`, `verifyChecksum`, `getNodeOs`, `getNodeArch`, `getNodeVersion` | `seaEnhanced()` in same file | +| `lib/mach-o.ts` | `patchMachOExecutable`, `removeMachOExecutableSignature`, `signMachOExecutable` | `seaEnhanced()` signing step | +| `lib/log.ts` | `log` | All new code | + +### New shared code to extract + +| What | From | Shared By | +| --------------------------------------------------------- | ------------------------------ | ----------------------------------- | +| Native addon extraction (extract to cache, SHA256 verify) | `prelude/bootstrap.js:155-242` | `bootstrap.js` + `sea-bootstrap.js` | + +Extract the extraction logic into `prelude/native-addon-extract.js`. Both bootstrap files import/inline it. During esbuild bundling for SEA, it gets bundled in. For traditional mode, `packer.ts` inlines it into the prelude template. + +### Code consistency rules + +1. **Path handling**: Always use `snapshotify`/`normalizePath` from `lib/common.ts`. Never hand-roll snapshot path logic. +2. **Error patterns**: Use `wasReported` from `lib/log.ts` for user-facing errors, consistent with existing codebase. +3. **Async patterns**: Use `fs/promises` for build-time operations (matching `sea.ts` style), sync for bootstrap runtime. +4. **Naming**: `seaEnhanced`/`seaSimple` — verb-adjective pattern matching existing `sea` function. +5. **Type imports**: Import from `lib/types.ts` — extend, don't shadow. + +--- + +## Risks and Mitigations + +| Risk | Impact | Mitigation | +| ------------------------------------ | ------------------------------- | ------------------------------------------------------------------------------------------------------- | +| `@platformatic/vfs` bundle size | Larger executable | esbuild tree-shaking. Only import `MemoryProvider` + `VirtualFileSystem`. Measure before/after | +| VFS startup latency (large projects) | Slow cold start | Custom `SEAProvider` with lazy `sea.getRawAsset()` — no upfront loading | +| Polyfill API instability | Breaking changes | Pin dependency version. Abstract VFS init behind internal interface | +| Cross-platform native addons | Wrong `.node` binary for target | Warn when cross-compiling with native addons. Reuse `prebuild-install` logic from `lib/producer.ts:229` | +| Large asset counts in SEA | Unknown Node.js limits | Test with 1000+ assets early. File a Node.js issue if limits discovered | +| Source code exposure in SEA | IP concerns | Document clearly in README. Recommend traditional mode for code protection needs | +| `node:vfs` lands with different API | Migration friction | Thin abstraction layer in bootstrap. `@platformatic/vfs` author aligns API with PR | + +--- + +## Verification + +### Build verification + +```bash +npm run build # TypeScript + sea-bootstrap bundle +npm run lint # No lint errors in new code +``` + +### Unit tests + +```bash +npm test # All existing tests pass (no regressions) +npm run test:22 # Enhanced SEA tests run on Node 22+ +``` + +### Manual integration tests + +1. **Multi-file project**: Package a project with `src/`, `lib/`, `node_modules/` via `--sea -t node22-linux-x64`. Run executable, verify all modules resolve. +2. **Asset access**: Package project with `config.json`. Verify `fs.readFileSync('./config.json')` returns correct content inside packaged binary. +3. **ESM project**: Package `type: "module"` project. Verify `import` statements work. +4. **Backward compat**: `pkg single-file.js --sea` still works (simple mode). +5. **Size comparison**: Compare executable sizes between traditional and SEA for same project. +6. **Startup benchmark**: Measure cold start time for traditional vs SEA packaging. + +--- + +## File Summary + +| File | Action | Lines (est.) | +| --------------------------------- | ------------------- | ------------ | +| `package.json` | Modify | +5 | +| `.gitignore` | Modify | +1 | +| `lib/walker.ts` | Modify | +15 | +| `lib/sea-assets.ts` | **Create** | ~120 | +| `prelude/sea-bootstrap.js` | **Create** | ~200 | +| `prelude/native-addon-extract.js` | **Create** (shared) | ~80 | +| `lib/sea.ts` | Modify | +80 | +| `lib/index.ts` | Modify | +20 | +| `lib/types.ts` | Modify | +10 | +| `test/test-85-sea-enhanced/` | **Create** | ~50 | +| `test/test-86-sea-assets/` | **Create** | ~40 | +| `test/test-87-sea-esm/` | **Create** | ~40 | +| `test/test-88-sea-native/` | **Create** | ~50 | +| `test/test-89-sea-fs-ops/` | **Create** | ~60 | diff --git a/prelude/sea-bootstrap.js b/prelude/sea-bootstrap.js new file mode 100644 index 000000000..07a066b18 --- /dev/null +++ b/prelude/sea-bootstrap.js @@ -0,0 +1,159 @@ +/* eslint-disable */ +'use strict'; + +// SEA Bootstrap for pkg +// This script runs before user code in a Node.js Single Executable Application. +// It sets up a Virtual File System from SEA-embedded assets so that +// fs.readFileSync, require, import, etc. work transparently on packaged files. + +const sea = require('node:sea'); +const path = require('path'); +const fs = require('fs'); +const os = require('os'); +const { createHash } = require('crypto'); +const Module = require('module'); + +// ///////////////////////////////////////////////////////////////// +// MANIFEST //////////////////////////////////////////////////////// +// ///////////////////////////////////////////////////////////////// + +const manifest = JSON.parse(sea.getAsset('__pkg_manifest__', 'utf8')); + +// ///////////////////////////////////////////////////////////////// +// VFS SETUP /////////////////////////////////////////////////////// +// ///////////////////////////////////////////////////////////////// + +// Try native node:vfs first (future Node.js), fall back to polyfill +var vfsModule; +try { + vfsModule = require('node:vfs'); +} catch (_) { + vfsModule = require('@platformatic/vfs'); +} + +var VirtualFileSystem = vfsModule.VirtualFileSystem; +var MemoryProvider = vfsModule.MemoryProvider; + +// Custom provider that reads from SEA assets lazily (zero-copy via getRawAsset). +// Extends MemoryProvider for directory/stat support while lazily populating +// file content from SEA assets on first access. +class SEAProvider extends MemoryProvider { + constructor(seaManifest) { + super(); + this._manifest = seaManifest; + this._loaded = new Set(); + + // Pre-populate directory structure from manifest + for (var dir of Object.keys(seaManifest.directories)) { + try { + super.mkdirSync(dir, { recursive: true }); + } catch (_) { + // directory may already exist + } + } + } + + readFileSync(filePath, options) { + this._ensureLoaded(filePath); + return super.readFileSync(filePath, options); + } + + _ensureLoaded(filePath) { + if (this._loaded.has(filePath)) return; + try { + var raw = sea.getRawAsset(filePath); + super.writeFileSync(filePath, Buffer.from(raw)); + this._loaded.add(filePath); + } catch (_) { + // Not a SEA asset — let super handle the ENOENT + } + } + + statSync(filePath) { + var meta = this._manifest.stats[filePath]; + if (meta && meta.isFile && !this._loaded.has(filePath)) { + this._ensureLoaded(filePath); + } + return super.statSync(filePath); + } + + readdirSync(dirPath) { + var entries = this._manifest.directories[dirPath]; + if (entries) return entries.slice(); + return super.readdirSync(dirPath); + } + + existsSync(filePath) { + return filePath in this._manifest.stats; + } +} + +var provider = new SEAProvider(manifest); +var virtualFs = new VirtualFileSystem(provider); +virtualFs.mount('/snapshot', { overlay: true }); + +// ///////////////////////////////////////////////////////////////// +// NATIVE ADDON EXTRACTION ///////////////////////////////////////// +// ///////////////////////////////////////////////////////////////// + +var SNAPSHOT_PREFIX = + process.platform === 'win32' ? 'C:\\snapshot' : '/snapshot'; +var nativeCacheBase = + process.env.PKG_NATIVE_CACHE_PATH || path.join(os.homedir(), '.cache', 'pkg'); + +var ancestorDlopen = process.dlopen.bind(process); + +process.dlopen = function patchedDlopen(module_, filename, flags) { + if (typeof filename === 'string' && filename.startsWith(SNAPSHOT_PREFIX)) { + // Read the .node file content from VFS + var content = fs.readFileSync(filename); + var hash = createHash('sha256').update(content).digest('hex').slice(0, 16); + var cacheDir = path.join(nativeCacheBase, hash); + + try { + fs.mkdirSync(cacheDir, { recursive: true }); + } catch (_) { + // directory exists + } + + var extractedPath = path.join(cacheDir, path.basename(filename)); + + try { + fs.statSync(extractedPath); + } catch (_) { + // Not cached yet — extract to real filesystem + fs.writeFileSync(extractedPath, content); + } + + return ancestorDlopen(module_, extractedPath, flags); + } + + return ancestorDlopen(module_, filename, flags); +}; + +// ///////////////////////////////////////////////////////////////// +// PROCESS COMPATIBILITY /////////////////////////////////////////// +// ///////////////////////////////////////////////////////////////// + +process.pkg = { + entrypoint: manifest.entrypoint, + defaultEntrypoint: manifest.entrypoint, + path: { + resolve: function () { + var args = [path.dirname(manifest.entrypoint)]; + for (var i = 0; i < arguments.length; i++) { + args.push(arguments[i]); + } + return path.resolve.apply(path, args); + }, + }, +}; + +// ///////////////////////////////////////////////////////////////// +// ENTRYPOINT ////////////////////////////////////////////////////// +// ///////////////////////////////////////////////////////////////// + +process.argv[1] = manifest.entrypoint; +Module._cache = Object.create(null); +process.mainModule = undefined; +Module.runMain(); diff --git a/test/test-85-sea-enhanced/index.js b/test/test-85-sea-enhanced/index.js new file mode 100644 index 000000000..fabb1a8fe --- /dev/null +++ b/test/test-85-sea-enhanced/index.js @@ -0,0 +1,6 @@ +'use strict'; + +const { getMessage } = require('./lib/helper.js'); + +const result = getMessage(); +console.log('main: ' + result); diff --git a/test/test-85-sea-enhanced/lib/helper.js b/test/test-85-sea-enhanced/lib/helper.js new file mode 100644 index 000000000..93e5d8f58 --- /dev/null +++ b/test/test-85-sea-enhanced/lib/helper.js @@ -0,0 +1,6 @@ +'use strict'; + +module.exports.getMessage = function () { + console.log('hello from lib'); + return 'got message'; +}; diff --git a/test/test-85-sea-enhanced/main.js b/test/test-85-sea-enhanced/main.js new file mode 100644 index 000000000..ece680288 --- /dev/null +++ b/test/test-85-sea-enhanced/main.js @@ -0,0 +1,51 @@ +#!/usr/bin/env node + +'use strict'; + +const assert = require('assert'); +const utils = require('../utils.js'); + +// Enhanced SEA requires Node.js >= 22 +if (utils.getNodeMajorVersion() < 22) { + return; +} + +assert(__dirname === process.cwd()); + +const input = './package.json'; + +const newcomers = [ + 'test-85-sea-enhanced-linux', + 'test-85-sea-enhanced-macos', + 'test-85-sea-enhanced-win.exe', +]; + +const before = utils.filesBefore(newcomers); + +utils.pkg.sync([input, '--sea'], { stdio: 'inherit' }); + +if (process.platform === 'linux') { + assert.equal( + utils.spawn.sync('./test-85-sea-enhanced-linux', []), + 'hello from lib\nmain: got message\n', + 'Output matches', + ); +} else if (process.platform === 'darwin') { + assert.equal( + utils.spawn.sync('./test-85-sea-enhanced-macos', []), + 'hello from lib\nmain: got message\n', + 'Output matches', + ); +} else if (process.platform === 'win32') { + assert.equal( + utils.spawn.sync('./test-85-sea-enhanced-win.exe', []), + 'hello from lib\nmain: got message\n', + 'Output matches', + ); +} + +try { + utils.filesAfter(before, newcomers); +} catch (_error) { + // noop — Windows EBUSY workaround +} diff --git a/test/test-85-sea-enhanced/package.json b/test/test-85-sea-enhanced/package.json new file mode 100644 index 000000000..c089655bc --- /dev/null +++ b/test/test-85-sea-enhanced/package.json @@ -0,0 +1,6 @@ +{ + "name": "test-85-sea-enhanced", + "version": "1.0.0", + "main": "index.js", + "bin": "index.js" +} diff --git a/test/test-86-sea-assets/config.json b/test/test-86-sea-assets/config.json new file mode 100644 index 000000000..6311671eb --- /dev/null +++ b/test/test-86-sea-assets/config.json @@ -0,0 +1,3 @@ +{ + "key": "test-value" +} diff --git a/test/test-86-sea-assets/data.txt b/test/test-86-sea-assets/data.txt new file mode 100644 index 000000000..3b18e512d --- /dev/null +++ b/test/test-86-sea-assets/data.txt @@ -0,0 +1 @@ +hello world diff --git a/test/test-86-sea-assets/index.js b/test/test-86-sea-assets/index.js new file mode 100644 index 000000000..8b0aeba7a --- /dev/null +++ b/test/test-86-sea-assets/index.js @@ -0,0 +1,12 @@ +'use strict'; + +const fs = require('fs'); +const path = require('path'); + +const config = JSON.parse( + fs.readFileSync(path.join(__dirname, 'config.json'), 'utf8'), +); +console.log('config:' + config.key); + +const data = fs.readFileSync(path.join(__dirname, 'data.txt'), 'utf8').trim(); +console.log('data:' + data); diff --git a/test/test-86-sea-assets/main.js b/test/test-86-sea-assets/main.js new file mode 100644 index 000000000..f7de20f8a --- /dev/null +++ b/test/test-86-sea-assets/main.js @@ -0,0 +1,53 @@ +#!/usr/bin/env node + +'use strict'; + +const assert = require('assert'); +const utils = require('../utils.js'); + +// Enhanced SEA requires Node.js >= 22 +if (utils.getNodeMajorVersion() < 22) { + return; +} + +assert(__dirname === process.cwd()); + +const input = './package.json'; + +const newcomers = [ + 'test-86-sea-assets-linux', + 'test-86-sea-assets-macos', + 'test-86-sea-assets-win.exe', +]; + +const before = utils.filesBefore(newcomers); + +utils.pkg.sync([input, '--sea'], { stdio: 'inherit' }); + +const expected = 'config:test-value\ndata:hello world\n'; + +if (process.platform === 'linux') { + assert.equal( + utils.spawn.sync('./test-86-sea-assets-linux', []), + expected, + 'Output matches', + ); +} else if (process.platform === 'darwin') { + assert.equal( + utils.spawn.sync('./test-86-sea-assets-macos', []), + expected, + 'Output matches', + ); +} else if (process.platform === 'win32') { + assert.equal( + utils.spawn.sync('./test-86-sea-assets-win.exe', []), + expected, + 'Output matches', + ); +} + +try { + utils.filesAfter(before, newcomers); +} catch (_error) { + // noop +} diff --git a/test/test-86-sea-assets/package.json b/test/test-86-sea-assets/package.json new file mode 100644 index 000000000..333d352a6 --- /dev/null +++ b/test/test-86-sea-assets/package.json @@ -0,0 +1,12 @@ +{ + "name": "test-86-sea-assets", + "version": "1.0.0", + "main": "index.js", + "bin": "index.js", + "pkg": { + "assets": [ + "config.json", + "data.txt" + ] + } +} diff --git a/test/test-87-sea-esm/app/index.mjs b/test/test-87-sea-esm/app/index.mjs new file mode 100644 index 000000000..e80f339b3 --- /dev/null +++ b/test/test-87-sea-esm/app/index.mjs @@ -0,0 +1,5 @@ +import { add } from './lib/math.mjs'; +import { greet } from './lib/greet.mjs'; + +console.log('add:' + add(2, 3)); +console.log('greeting:' + greet('world')); diff --git a/test/test-87-sea-esm/app/lib/greet.mjs b/test/test-87-sea-esm/app/lib/greet.mjs new file mode 100644 index 000000000..b990e2504 --- /dev/null +++ b/test/test-87-sea-esm/app/lib/greet.mjs @@ -0,0 +1,3 @@ +export function greet(name) { + return 'hello ' + name; +} diff --git a/test/test-87-sea-esm/app/lib/math.mjs b/test/test-87-sea-esm/app/lib/math.mjs new file mode 100644 index 000000000..7d658310b --- /dev/null +++ b/test/test-87-sea-esm/app/lib/math.mjs @@ -0,0 +1,3 @@ +export function add(a, b) { + return a + b; +} diff --git a/test/test-87-sea-esm/app/package.json b/test/test-87-sea-esm/app/package.json new file mode 100644 index 000000000..e8512d3b4 --- /dev/null +++ b/test/test-87-sea-esm/app/package.json @@ -0,0 +1,7 @@ +{ + "name": "test-87-sea-esm", + "version": "1.0.0", + "type": "module", + "main": "index.mjs", + "bin": "index.mjs" +} diff --git a/test/test-87-sea-esm/main.js b/test/test-87-sea-esm/main.js new file mode 100644 index 000000000..82ebebe8e --- /dev/null +++ b/test/test-87-sea-esm/main.js @@ -0,0 +1,54 @@ +#!/usr/bin/env node + +'use strict'; + +const assert = require('assert'); +const utils = require('../utils.js'); + +// Enhanced SEA with ESM entry requires Node.js >= 25.7 (mainFormat: "module") +// and the VFS polyfill's module hooks. Skip until node:vfs lands in core. +if (utils.getNodeMajorVersion() < 26) { + return; +} + +assert(__dirname === process.cwd()); + +const input = './app/package.json'; + +const newcomers = [ + 'test-87-sea-esm-linux', + 'test-87-sea-esm-macos', + 'test-87-sea-esm-win.exe', +]; + +const before = utils.filesBefore(newcomers); + +utils.pkg.sync([input, '--sea'], { stdio: 'inherit' }); + +const expected = 'add:5\ngreeting:hello world\n'; + +if (process.platform === 'linux') { + assert.equal( + utils.spawn.sync('./test-87-sea-esm-linux', []), + expected, + 'Output matches', + ); +} else if (process.platform === 'darwin') { + assert.equal( + utils.spawn.sync('./test-87-sea-esm-macos', []), + expected, + 'Output matches', + ); +} else if (process.platform === 'win32') { + assert.equal( + utils.spawn.sync('./test-87-sea-esm-win.exe', []), + expected, + 'Output matches', + ); +} + +try { + utils.filesAfter(before, newcomers); +} catch (_error) { + // noop +} diff --git a/test/test-89-sea-fs-ops/data.json b/test/test-89-sea-fs-ops/data.json new file mode 100644 index 000000000..77ae4960e --- /dev/null +++ b/test/test-89-sea-fs-ops/data.json @@ -0,0 +1,3 @@ +{ + "test": "ok" +} diff --git a/test/test-89-sea-fs-ops/index.js b/test/test-89-sea-fs-ops/index.js new file mode 100644 index 000000000..33a312103 --- /dev/null +++ b/test/test-89-sea-fs-ops/index.js @@ -0,0 +1,26 @@ +'use strict'; + +const fs = require('fs'); +const path = require('path'); + +// Test existsSync +console.log('exists-index:' + fs.existsSync(path.join(__dirname, 'index.js'))); +console.log('exists-missing:' + fs.existsSync(path.join(__dirname, 'nope.js'))); + +// Test statSync +const stat = fs.statSync(path.join(__dirname, 'index.js')); +console.log('stat-isFile:' + stat.isFile()); +console.log('stat-isDir:' + stat.isDirectory()); + +const dirStat = fs.statSync(__dirname); +console.log('dir-isFile:' + dirStat.isFile()); +console.log('dir-isDir:' + dirStat.isDirectory()); + +// Test readdirSync +const entries = fs.readdirSync(__dirname).sort(); +console.log('readdir:' + entries.join(',')); + +// Test readFileSync +const content = fs.readFileSync(path.join(__dirname, 'data.json'), 'utf8'); +const parsed = JSON.parse(content); +console.log('readFile:' + parsed.test); diff --git a/test/test-89-sea-fs-ops/main.js b/test/test-89-sea-fs-ops/main.js new file mode 100644 index 000000000..d0a1b19b9 --- /dev/null +++ b/test/test-89-sea-fs-ops/main.js @@ -0,0 +1,61 @@ +#!/usr/bin/env node + +'use strict'; + +const assert = require('assert'); +const utils = require('../utils.js'); + +// Enhanced SEA requires Node.js >= 22 +if (utils.getNodeMajorVersion() < 22) { + return; +} + +assert(__dirname === process.cwd()); + +const input = './package.json'; + +const newcomers = [ + 'test-89-sea-fs-ops-linux', + 'test-89-sea-fs-ops-macos', + 'test-89-sea-fs-ops-win.exe', +]; + +const before = utils.filesBefore(newcomers); + +utils.pkg.sync([input, '--sea'], { stdio: 'inherit' }); + +const expectedOutput = + 'exists-index:true\n' + + 'exists-missing:false\n' + + 'stat-isFile:true\n' + + 'stat-isDir:false\n' + + 'dir-isFile:false\n' + + 'dir-isDir:true\n' + + 'readdir:data.json,index.js,package.json\n' + + 'readFile:ok\n'; + +if (process.platform === 'linux') { + assert.equal( + utils.spawn.sync('./test-89-sea-fs-ops-linux', []), + expectedOutput, + 'Output matches', + ); +} else if (process.platform === 'darwin') { + assert.equal( + utils.spawn.sync('./test-89-sea-fs-ops-macos', []), + expectedOutput, + 'Output matches', + ); +} else if (process.platform === 'win32') { + assert.equal( + utils.spawn.sync('./test-89-sea-fs-ops-win.exe', []), + expectedOutput, + 'Output matches', + ); +} + +try { + utils.filesAfter(before, newcomers); +} catch (_error) { + // noop +} diff --git a/test/test-89-sea-fs-ops/package.json b/test/test-89-sea-fs-ops/package.json new file mode 100644 index 000000000..4b94400ed --- /dev/null +++ b/test/test-89-sea-fs-ops/package.json @@ -0,0 +1,11 @@ +{ + "name": "test-89-sea-fs-ops", + "version": "1.0.0", + "main": "index.js", + "bin": "index.js", + "pkg": { + "assets": [ + "data.json" + ] + } +} diff --git a/yarn.lock b/yarn.lock index 35f6f4233..e04b22443 100644 --- a/yarn.lock +++ b/yarn.lock @@ -613,6 +613,11 @@ resolved "https://registry.yarnpkg.com/@phun-ky/typeof/-/typeof-2.0.3.tgz#581f617862e6fd9245e992440e46a88dbc228005" integrity sha512-oeQJs1aa8Ghke8JIK9yuq/+KjMiaYeDZ38jx7MhkXncXlUKjqQ3wEm2X3qCKyjo+ZZofZj+WsEEiqkTtRuE2xQ== +"@platformatic/vfs@^0.3.0": + version "0.3.0" + resolved "https://registry.yarnpkg.com/@platformatic/vfs/-/vfs-0.3.0.tgz#d3664af6b2ad3add1661ce7aa9be2a970bb22d19" + integrity sha512-BGXVOAz59HYPZCgI9v/MtiTF/ng8YAWtkooxVwOPR3TatNgGy0WZ/t15ScqytiZi5NdSRqWNRfuAbXKeAlKDdQ== + "@release-it/conventional-changelog@^10.0.5": version "10.0.5" resolved "https://registry.yarnpkg.com/@release-it/conventional-changelog/-/conventional-changelog-10.0.5.tgz#20081534fc8033027960c69f8e9d153c31fa9ec3" From 7b552622d3283bb454ed395422085a2a7a5add56 Mon Sep 17 00:00:00 2001 From: robertsLando Date: Tue, 7 Apr 2026 11:04:24 +0200 Subject: [PATCH 02/41] fix: move @platformatic/vfs to optionalDependencies for Node 20 CI compat @platformatic/vfs requires Node >= 22 but CI runs on Node 20. Since the package is only needed at build time (esbuild bundles it into the sea-bootstrap) and the bundle step is skipped on Node < 22, making it optional prevents yarn install failures on older Node versions. Co-Authored-By: Claude Opus 4.6 (1M context) --- package.json | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 0757ae3ac..d6f70fe06 100644 --- a/package.json +++ b/package.json @@ -26,7 +26,6 @@ "@babel/parser": "^7.23.0", "@babel/traverse": "^7.23.0", "@babel/types": "^7.23.0", - "@platformatic/vfs": "^0.3.0", "@yao-pkg/pkg-fetch": "3.5.33", "esbuild": "^0.27.3", "into-stream": "^9.1.0", @@ -42,6 +41,9 @@ "tinyglobby": "^0.2.11", "unzipper": "^0.12.3" }, + "optionalDependencies": { + "@platformatic/vfs": "^0.3.0" + }, "devDependencies": { "@release-it/conventional-changelog": "^10.0.5", "@types/babel__generator": "^7.6.5", @@ -74,7 +76,7 @@ "scripts": { "clean": "rimraf lib-es5", "build": "npm run clean && tsc && npm run build:sea-bootstrap", - "build:sea-bootstrap": "esbuild prelude/sea-bootstrap.js --bundle --platform=node --target=node22 --outfile=prelude/sea-bootstrap.bundle.js --external:node:sea --external:node:fs --external:node:path --external:node:os --external:node:crypto --external:node:module --external:node:vfs", + "build:sea-bootstrap": "node -e \"if(+process.version.slice(1).split('.')[0]>=22){require('child_process').execSync('npx esbuild prelude/sea-bootstrap.js --bundle --platform=node --target=node22 --outfile=prelude/sea-bootstrap.bundle.js --external:node:sea --external:node:fs --external:node:path --external:node:os --external:node:crypto --external:node:module --external:node:vfs',{stdio:'inherit'})}else{console.log('Skipping sea-bootstrap bundle (requires Node >= 22)')}\"", "start": "tsc --watch", "lint": "npm run lint:style && npm run lint:code", "lint:style": "prettier -c \"{lib,prelude,test}/**/*.{ts,js}\"", From 26ddcb014aa7c1dad4de65b59dd56e960889771b Mon Sep 17 00:00:00 2001 From: robertsLando Date: Tue, 7 Apr 2026 11:21:09 +0200 Subject: [PATCH 03/41] feat: drop Node.js 20 support, require Node.js >= 22 Node.js 20 reached EOL in April 2026. This simplifies the project by removing the Node 20 CI matrix, test scripts, and engine check. It also allows @platformatic/vfs to be a regular dependency (requires Node 22+) and removes the conditional build script for sea-bootstrap. - Update engines to >=22.0.0 in package.json - Remove node20 from CI matrix (ci.yml, test.yml) - Update update-dep.yml to use Node 22 - Move @platformatic/vfs from optionalDependencies to dependencies - Simplify build:sea-bootstrap script (no Node version check) - Update README examples and SEA requirements - Update @types/node to ^22.0.0 Co-Authored-By: Claude Opus 4.6 (1M context) --- .github/workflows/ci.yml | 9 +- .github/workflows/test.yml | 2 +- .github/workflows/update-dep.yml | 4 +- .gitignore | 2 +- README.md | 8 +- lib/index.ts | 89 +++++--------- lib/sea-assets.ts | 20 ++-- lib/sea.ts | 192 +++++++++++++++--------------- lib/types.ts | 22 +++- lib/walker.ts | 27 ++--- package.json | 13 +- prelude/sea-bootstrap.js | 61 +++++++--- test/test-00-sea/main.js | 4 +- test/test-85-sea-enhanced/main.js | 23 +--- test/test-86-sea-assets/main.js | 27 +---- test/test-87-sea-esm/main.js | 27 +---- test/test-89-sea-fs-ops/main.js | 22 +--- test/utils.js | 17 +++ 18 files changed, 247 insertions(+), 322 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index e7be01400..acd8c0369 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -11,7 +11,7 @@ jobs: strategy: fail-fast: false # prevent test to stop if one fails matrix: - node-version: [20.x, 22.x, 24.x] + node-version: [22.x, 24.x] os: [ubuntu-latest, windows-latest, macos-latest] runs-on: ${{ matrix.os }} steps: @@ -23,7 +23,7 @@ jobs: - run: yarn install - - if: matrix['node-version'] == '20.x' && matrix['os'] == 'ubuntu-latest' + - if: matrix['node-version'] == '22.x' && matrix['os'] == 'ubuntu-latest' run: yarn lint - run: yarn build test_host: @@ -36,11 +36,6 @@ jobs: with: npm_command: test:22 - test_20: - uses: ./.github/workflows/test.yml - with: - npm_command: test:20 - test_24: uses: ./.github/workflows/test.yml with: diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 5f10e5e20..164b646c3 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -13,7 +13,7 @@ jobs: strategy: fail-fast: false # prevent test to stop if one fails matrix: - node-version: [20.x, 22.x, 24.x] + node-version: [22.x, 24.x] os: [ubuntu-latest, windows-latest, macos-latest] runs-on: ${{ matrix.os }} steps: diff --git a/.github/workflows/update-dep.yml b/.github/workflows/update-dep.yml index 5822568b3..31bfb39b5 100644 --- a/.github/workflows/update-dep.yml +++ b/.github/workflows/update-dep.yml @@ -24,10 +24,10 @@ jobs: steps: - uses: actions/checkout@v4 - - name: Use Node.js 20 + - name: Use Node.js 22 uses: actions/setup-node@v4 with: - node-version: 20.x + node-version: 22.x cache: 'yarn' - name: Update dependency diff --git a/.gitignore b/.gitignore index 1b6bf577e..406dac63e 100644 --- a/.gitignore +++ b/.gitignore @@ -20,4 +20,4 @@ examples/express/node_modules # Editors yarn-error.log tsconfig.tsbuildinfo -prelude/sea-bootstrap.bundle.js \ No newline at end of file +prelude/sea-bootstrap.bundle.js diff --git a/README.md b/README.md index 8cede219c..bbebe73e4 100644 --- a/README.md +++ b/README.md @@ -47,7 +47,7 @@ After installing it, run `pkg --help` without arguments to see list of options: --no-native-build skip native addons build --no-dict comma-separated list of packages names to ignore dictionaries. Use --no-dict * to disable all dictionaries -C, --compress [default=None] compression algorithm = Brotli or GZip - --sea (Experimental) compile give file using node's SEA feature. Requires node v20.0.0 or higher and only single file is supported + --sea (Experimental) compile give file using node's SEA feature. Requires node v22.0.0 or higher Examples: @@ -58,7 +58,7 @@ After installing it, run `pkg --help` without arguments to see list of options: – Makes executable for particular target machine $ pkg -t node22-win-arm64 index.js – Makes executables for target machines of your choice - $ pkg -t node20-linux,node22-linux,node22-win index.js + $ pkg -t node22-linux,node24-linux,node24-win index.js – Bakes '--expose-gc' and '--max-heap-size=34' into executable $ pkg --options "expose-gc,max-heap-size=34" index.js – Consider packageA and packageB to be public @@ -87,9 +87,9 @@ The entrypoint of your project is a mandatory CLI argument. It may be: `pkg` can generate executables for several target machines at a time. You can specify a comma-separated list of targets via `--targets` option. A canonical target consists of 3 elements, separated by -dashes, for example `node20-macos-x64` or `node22-linux-arm64`: +dashes, for example `node22-macos-x64` or `node24-linux-arm64`: -- **nodeRange** node20, node22, node24 or latest +- **nodeRange** node22, node24 or latest - **platform** alpine, linux, linuxstatic, win, macos, (freebsd) - **arch** x64, arm64, (armv6, armv7) diff --git a/lib/index.ts b/lib/index.ts index 3d8b7c4d7..42c593ede 100644 --- a/lib/index.ts +++ b/lib/index.ts @@ -1,5 +1,5 @@ import assert from 'assert'; -import { existsSync, readFileSync, writeFileSync, copyFileSync } from 'fs'; +import { existsSync, readFileSync, copyFileSync } from 'fs'; import { mkdir, readFile, rm, stat } from 'fs/promises'; import minimist from 'minimist'; import { need, system } from '@yao-pkg/pkg-fetch'; @@ -16,9 +16,9 @@ import { shutdown } from './fabricator'; import walk, { Marker, WalkerParams } from './walker'; import { Target, NodeTarget, SymLinks } from './types'; import { CompressType } from './compress_type'; -import { patchMachOExecutable, signMachOExecutable } from './mach-o'; +import { signMachOExecutable } from './mach-o'; import pkgOptions from './options'; -import sea, { seaEnhanced } from './sea'; +import sea, { seaEnhanced, signMacOSIfNeeded } from './sea'; const { version } = JSON.parse( readFileSync(path.join(__dirname, '../package.json'), 'utf-8'), @@ -28,6 +28,23 @@ function isConfiguration(file: string) { return isPackageJson(file) || file.endsWith('.config.json'); } +function buildMarker( + configJson: Record | undefined, + config: string, + inputJson: Record | undefined, + input: string, +): Marker { + const marker: Marker = configJson + ? { config: configJson, base: path.dirname(config), configPath: config } + : { + config: inputJson || {}, + base: path.dirname(input), + configPath: input, + }; + marker.toplevel = true; + return marker; +} + // http://www.openwall.com/lists/musl/2012/12/08/4 const { @@ -529,25 +546,15 @@ export async function exec(argv2: string[]) { } if (argv.sea) { - const targetNodeMajor = parseInt( - targets[0].nodeRange.replace('node', ''), - 10, + const minTargetMajor = Math.min( + ...targets.map((t) => parseInt(t.nodeRange.replace('node', ''), 10)), ); - if ((inputJson || configJson) && targetNodeMajor >= 22) { + if ((inputJson || configJson) && minTargetMajor >= 22) { // Enhanced SEA mode — use walker pipeline - const marker: Record = configJson - ? { - config: configJson, - base: path.dirname(config), - configPath: config, - } - : { - config: inputJson || {}, - base: path.dirname(input), - configPath: input, - }; - marker.toplevel = true; + const marker = buildMarker(configJson, config, inputJson, input); + + pkgOptions.set(configJson?.pkg ?? inputJson?.pkg); await seaEnhanced(inputFin, { targets, @@ -626,23 +633,8 @@ export async function exec(argv2: string[]) { let marker: Marker; - if (configJson) { - pkgOptions.set(configJson?.pkg); - marker = { - config: configJson, - base: path.dirname(config), - configPath: config, - }; - } else { - pkgOptions.set(inputJson?.pkg); - marker = { - config: inputJson || {}, // not `inputBin` because only `input` - base: path.dirname(input), // is the place for `inputJson` - configPath: input, - }; - } - - marker.toplevel = true; + pkgOptions.set(configJson?.pkg ?? inputJson?.pkg); + marker = buildMarker(configJson, config, inputJson, input); // public @@ -714,30 +706,7 @@ export async function exec(argv2: string[]) { }); if (target.platform !== 'win' && target.output) { - if (argv.signature && target.platform === 'macos') { - // patch executable to allow code signing - const buf = patchMachOExecutable(readFileSync(target.output)); - writeFileSync(target.output, buf); - - try { - // sign executable ad-hoc to workaround the new mandatory signing requirement - // users can always replace the signature if necessary - signMachOExecutable(target.output); - } catch { - if (target.arch === 'arm64') { - log.warn('Unable to sign the macOS executable', [ - 'Due to the mandatory code signing requirement, before the', - 'executable is distributed to end users, it must be signed.', - 'Otherwise, it will be immediately killed by kernel on launch.', - 'An ad-hoc signature is sufficient.', - 'To do that, run pkg on a Mac, or transfer the executable to a Mac', - 'and run "codesign --sign - ", or (if you use Linux)', - 'install "ldid" utility to PATH and then run pkg again', - ]); - } - } - } - + await signMacOSIfNeeded(target.output, target, argv.signature); await plusx(target.output); } } diff --git a/lib/sea-assets.ts b/lib/sea-assets.ts index 3d3f0c0fa..4e74c0048 100644 --- a/lib/sea-assets.ts +++ b/lib/sea-assets.ts @@ -1,5 +1,4 @@ import { mkdir, writeFile } from 'fs/promises'; -import path from 'path'; import { dirname, join } from 'path'; import { STORE_CONTENT, STORE_LINKS, STORE_STAT, snapshotify } from './common'; @@ -12,8 +11,6 @@ export interface SeaManifest { string, { size: number; isFile: boolean; isDirectory: boolean } >; - symlinks: Record; - nativeAddons: string[]; } export interface SeaAssetsResult { @@ -27,20 +24,22 @@ export interface SeaAssetsResult { * Asset keys use refiner paths (no /snapshot prefix) because @platformatic/vfs * strips the mount prefix before passing paths to the provider. The entrypoint * in the manifest uses the snapshotified path for process.argv[1] compatibility. + * + * Always uses POSIX '/' separator for manifest paths so the same blob works + * regardless of build platform. The bootstrap normalizes at runtime. */ export async function generateSeaAssets( records: FileRecords, entrypoint: string, - symLinks: SymLinks, + _symLinks: SymLinks, tmpDir: string, ): Promise { const assets: Record = {}; const manifest: SeaManifest = { - entrypoint: snapshotify(entrypoint, path.sep), + // Always use '/' — the bootstrap normalizes for the runtime platform + entrypoint: snapshotify(entrypoint, '/'), directories: {}, stats: {}, - symlinks: symLinks, - nativeAddons: [], }; let modifiedFileCount = 0; @@ -70,11 +69,6 @@ export async function generateSeaAssets( // Unmodified file — point to source on disk assets[snap] = record.file; } - - // Detect native addons - if (snap.endsWith('.node')) { - manifest.nativeAddons.push(snap); - } } // Collect directory entries @@ -88,7 +82,7 @@ export async function generateSeaAssets( if (record[STORE_STAT]) { const stat = record[STORE_STAT]; manifest.stats[snap] = { - size: stat.size || 0, + size: stat.size ?? 0, isFile: Boolean(stat.isFileValue), isDirectory: Boolean(stat.isDirectoryValue), }; diff --git a/lib/sea.ts b/lib/sea.ts index f0a541aea..fb2e1efa3 100644 --- a/lib/sea.ts +++ b/lib/sea.ts @@ -1,7 +1,15 @@ -import { exec as cExec } from 'child_process'; +import { exec as cExec, execFile as cExecFile } from 'child_process'; import util from 'util'; import { basename, dirname, join, resolve } from 'path'; -import { copyFile, writeFile, rm, mkdir, stat, readFile } from 'fs/promises'; +import { + copyFile, + writeFile, + rm, + mkdir, + mkdtemp, + stat, + readFile, +} from 'fs/promises'; import { createWriteStream } from 'fs'; import { pipeline } from 'stream/promises'; import { ReadableStream } from 'stream/web'; @@ -16,11 +24,12 @@ import { removeMachOExecutableSignature, signMachOExecutable, } from './mach-o'; -import walk, { Marker, WalkerParams } from './walker'; +import walk from './walker'; import refine from './refiner'; import { generateSeaAssets } from './sea-assets'; const exec = util.promisify(cExec); +const execFileAsync = util.promisify(cExecFile); /** Returns stat of path when exits, false otherwise */ const exists = async (path: string) => { @@ -334,19 +343,77 @@ async function bake( } } +/** Patch and sign macOS executable if needed */ +export async function signMacOSIfNeeded( + output: string, + target: NodeTarget & Partial, + signature?: boolean, +) { + if (!signature || target.platform !== 'macos') return; + + const buf = patchMachOExecutable(await readFile(output)); + await writeFile(output, buf); + try { + signMachOExecutable(output); + } catch { + if (target.arch === 'arm64') { + log.warn('Unable to sign the macOS executable', [ + 'Due to the mandatory code signing requirement, before the', + 'executable is distributed to end users, it must be signed.', + 'Otherwise, it will be immediately killed by kernel on launch.', + 'An ad-hoc signature is sufficient.', + 'To do that, run pkg on a Mac, or transfer the executable to a Mac', + 'and run "codesign --sign - ", or (if you use Linux)', + 'install "ldid" utility to PATH and then run pkg again', + ]); + } + } +} + +/** Run a callback inside a temporary directory, cleaning up afterwards */ +async function withSeaTmpDir( + fn: (tmpDir: string) => Promise, +): Promise { + const tmpDir = await mkdtemp(join(tmpdir(), 'pkg-sea-')); + const previousDirectory = process.cwd(); + try { + process.chdir(tmpDir); + return await fn(tmpDir); + } catch (error) { + throw new Error('Error while creating the executable', { cause: error }); + } finally { + process.chdir(previousDirectory); + await rm(tmpDir, { recursive: true }).catch(() => { + log.warn(`Failed to cleanup the temp directory ${tmpDir}`); + }); + } +} + +/** Validate that the host Node.js version supports SEA */ +function assertSeaNodeVersion() { + const nodeMajor = parseInt(process.version.slice(1).split('.')[0], 10); + if (nodeMajor < 22) { + throw new Error( + `SEA support requires at least node v22.0.0, actual node version is ${process.version}`, + ); + } + return nodeMajor; +} + /** Create NodeJS executable using the enhanced SEA pipeline (walker + refiner + assets) */ export async function seaEnhanced( entryPoint: string, opts: SeaEnhancedOptions, ) { + const nodeMajor = assertSeaNodeVersion(); + entryPoint = resolve(process.cwd(), entryPoint); if (!(await exists(entryPoint))) { throw new Error(`Entrypoint path "${entryPoint}" does not exist`); } - const marker = opts.marker as unknown as Marker; - const params = (opts.params || {}) as WalkerParams; + const { marker, params = {} } = opts; // Run walker in SEA mode log.info('Walking dependencies...'); @@ -363,9 +430,6 @@ export async function seaEnhanced( symLinks, } = refine(walkResult.records, walkResult.entrypoint, walkResult.symLinks); - const tmpDir = join(tmpdir(), 'pkg-sea', `${Date.now()}`); - await mkdir(tmpDir, { recursive: true }); - // Resolve target outputs to absolute paths before chdir to tmpDir for (const target of opts.targets) { if (target.output) { @@ -377,10 +441,7 @@ export async function seaEnhanced( opts.targets.map((target) => getNodejsExecutable(target, opts)), ); - const previousDirectory = process.cwd(); - try { - process.chdir(tmpDir); - + await withSeaTmpDir(async (tmpDir) => { // Generate SEA assets from walker output log.info('Generating SEA assets...'); const { assets, manifestPath } = await generateSeaAssets( @@ -404,6 +465,7 @@ export async function seaEnhanced( output: blobPath, disableExperimentalSEAWarning: true, useCodeCache: opts.seaConfig?.useCodeCache ?? false, + // useSnapshot must be false — incompatible with the VFS-based approach useSnapshot: false, assets: { __pkg_manifest__: manifestPath, @@ -415,84 +477,44 @@ export async function seaEnhanced( log.info('Creating sea-config.json file...'); await writeFile(seaConfigFilePath, JSON.stringify(seaConfig)); - // Detect Node version for build command - const nodeMajor = parseInt(process.version.slice(1).split('.')[0], 10); + // Generate the SEA blob if (nodeMajor >= 25) { log.info('Generating the blob using --build-sea...'); - await exec(`node --build-sea "${seaConfigFilePath}"`); + await execFileAsync(process.execPath, ['--build-sea', seaConfigFilePath]); } else { log.info('Generating the blob...'); - await exec(`node --experimental-sea-config "${seaConfigFilePath}"`); + await execFileAsync(process.execPath, [ + '--experimental-sea-config', + seaConfigFilePath, + ]); } // Bake blob into each target executable - await Promise.allSettled( + await Promise.all( nodePaths.map(async (nodePath, i) => { const target = opts.targets[i]; await bake(nodePath, target, blobPath); - const output = target.output!; - if (opts.signature && target.platform === 'macos') { - const buf = patchMachOExecutable(await readFile(output)); - await writeFile(output, buf); - try { - signMachOExecutable(output); - } catch { - if (target.arch === 'arm64') { - log.warn('Unable to sign the macOS executable', [ - 'Due to the mandatory code signing requirement, before the', - 'executable is distributed to end users, it must be signed.', - 'Otherwise, it will be immediately killed by kernel on launch.', - 'An ad-hoc signature is sufficient.', - 'To do that, run pkg on a Mac, or transfer the executable to a Mac', - 'and run "codesign --sign - ", or (if you use Linux)', - 'install "ldid" utility to PATH and then run pkg again', - ]); - } - } - } + await signMacOSIfNeeded(target.output!, target, opts.signature); }), ); - } catch (error) { - throw new Error(`Error while creating the executable: ${error}`); - } finally { - await rm(tmpDir, { recursive: true }).catch(() => { - log.warn(`Failed to cleanup the temp directory ${tmpDir}`); - }); - process.chdir(previousDirectory); - } + }); } /** Create NodeJS executable using sea */ export default async function sea(entryPoint: string, opts: SeaOptions) { + assertSeaNodeVersion(); + entryPoint = resolve(process.cwd(), entryPoint); if (!(await exists(entryPoint))) { throw new Error(`Entrypoint path "${entryPoint}" does not exist`); } - const nodeMajor = parseInt(process.version.slice(1).split('.')[0], 10); - - // check node version, needs to be at least 20.0.0 - if (nodeMajor < 20) { - throw new Error( - `SEA support requires as least node v20.0.0, actual node version is ${process.version}`, - ); - } - const nodePaths = await Promise.all( opts.targets.map((target) => getNodejsExecutable(target, opts)), ); - // create a temporary directory for the processing work - const tmpDir = join(tmpdir(), 'pkg-sea', `${Date.now()}`); - - await mkdir(tmpDir, { recursive: true }); - - const previousDirectory = process.cwd(); - try { - // change working directory to the temp directory - process.chdir(tmpDir); - + await withSeaTmpDir(async (tmpDir) => { // docs: https://nodejs.org/api/single-executable-applications.html const blobPath = join(tmpDir, 'sea-prep.blob'); const seaConfigFilePath = join(tmpDir, 'sea-config.json'); @@ -509,45 +531,17 @@ export default async function sea(entryPoint: string, opts: SeaOptions) { await writeFile(seaConfigFilePath, JSON.stringify(seaConfig)); log.info('Generating the blob...'); - await exec(`node --experimental-sea-config "${seaConfigFilePath}"`); + await execFileAsync(process.execPath, [ + '--experimental-sea-config', + seaConfigFilePath, + ]); - await Promise.allSettled( + await Promise.all( nodePaths.map(async (nodePath, i) => { const target = opts.targets[i]; await bake(nodePath, target, blobPath); - const output = target.output!; - if (opts.signature && target.platform === 'macos') { - const buf = patchMachOExecutable(await readFile(output)); - await writeFile(output, buf); - - try { - // sign executable ad-hoc to workaround the new mandatory signing requirement - // users can always replace the signature if necessary - signMachOExecutable(output); - } catch { - if (target.arch === 'arm64') { - log.warn('Unable to sign the macOS executable', [ - 'Due to the mandatory code signing requirement, before the', - 'executable is distributed to end users, it must be signed.', - 'Otherwise, it will be immediately killed by kernel on launch.', - 'An ad-hoc signature is sufficient.', - 'To do that, run pkg on a Mac, or transfer the executable to a Mac', - 'and run "codesign --sign - ", or (if you use Linux)', - 'install "ldid" utility to PATH and then run pkg again', - ]); - } - } - } + await signMacOSIfNeeded(target.output!, target, opts.signature); }), ); - } catch (error) { - throw new Error(`Error while creating the executable: ${error}`); - } finally { - // cleanup the temp directory - await rm(tmpDir, { recursive: true }).catch(() => { - log.warn(`Failed to cleanup the temp directory ${tmpDir}`); - }); - - process.chdir(previousDirectory); - } + }); } diff --git a/lib/types.ts b/lib/types.ts index 4563b8291..7b2a0d4e4 100644 --- a/lib/types.ts +++ b/lib/types.ts @@ -73,6 +73,24 @@ export interface Target extends NodeTarget { fabricator: Target; } +export interface Marker { + hasDictionary?: boolean; + activated?: boolean; + toplevel?: boolean; + public?: boolean; + hasDeployFiles?: boolean; + config?: PackageJson; + configPath: string; + base: string; +} + +export interface WalkerParams { + publicToplevel?: boolean; + publicPackages?: string[]; + noDictionary?: string[]; + seaMode?: boolean; +} + export interface SeaEnhancedOptions { seaConfig?: { disableExperimentalSEAWarning?: boolean; @@ -83,8 +101,8 @@ export interface SeaEnhancedOptions { targets: (NodeTarget & Partial)[]; useLocalNode?: boolean; nodePath?: string; - marker: Record; - params: Record; + marker: Marker; + params: WalkerParams; addition?: string; } diff --git a/lib/walker.ts b/lib/walker.ts index fbd84a6fd..cc05260da 100644 --- a/lib/walker.ts +++ b/lib/walker.ts @@ -31,22 +31,15 @@ import { ConfigDictionary, FileRecord, FileRecords, + Marker, Patches, PackageJson, SymLinks, + WalkerParams, } from './types'; import pkgOptions from './options'; -export interface Marker { - hasDictionary?: boolean; - activated?: boolean; - toplevel?: boolean; - public?: boolean; - hasDeployFiles?: boolean; - config?: PackageJson; - configPath: string; - base: string; -} +export type { Marker, WalkerParams }; interface Task { file: string; @@ -362,13 +355,6 @@ async function findCommonJunctionPoint(file: string, realFile: string) { } } -export interface WalkerParams { - publicToplevel?: boolean; - publicPackages?: string[]; - noDictionary?: string[]; - seaMode?: boolean; -} - class Walker { private params: WalkerParams; @@ -1011,7 +997,7 @@ class Walker { await stepRead(record); this.stepPatch(record); - if (store === STORE_BLOB) { + if (store === STORE_BLOB || this.params.seaMode) { stepStrip(record); } } @@ -1132,8 +1118,9 @@ class Walker { await this.stepDerivatives(record, marker, derivatives2); // After dependencies are resolved, rewrite .mjs require paths to .js - // since the packer renames .mjs files to .js in the snapshot - if (record.wasTransformed && record.body) { + // since the packer renames .mjs files to .js in the snapshot. + // Skip in SEA mode — ESM-to-CJS transform is not applied there. + if (!this.params.seaMode && record.wasTransformed && record.body) { record.body = Buffer.from( rewriteMjsRequirePaths(record.body.toString('utf8')), 'utf8', diff --git a/package.json b/package.json index d6f70fe06..e2fd732c4 100644 --- a/package.json +++ b/package.json @@ -26,6 +26,7 @@ "@babel/parser": "^7.23.0", "@babel/traverse": "^7.23.0", "@babel/types": "^7.23.0", + "@platformatic/vfs": "^0.3.0", "@yao-pkg/pkg-fetch": "3.5.33", "esbuild": "^0.27.3", "into-stream": "^9.1.0", @@ -41,16 +42,13 @@ "tinyglobby": "^0.2.11", "unzipper": "^0.12.3" }, - "optionalDependencies": { - "@platformatic/vfs": "^0.3.0" - }, "devDependencies": { "@release-it/conventional-changelog": "^10.0.5", "@types/babel__generator": "^7.6.5", "@types/babel__traverse": "^7.20.3", "@types/minimist": "^1.2.2", "@types/multistream": "^4.1.0", - "@types/node": "^20.0.0", + "@types/node": "^22.0.0", "@types/picomatch": "^3.0.1", "@types/resolve": "^1.20.2", "@types/stream-meter": "^0.0.22", @@ -76,7 +74,7 @@ "scripts": { "clean": "rimraf lib-es5", "build": "npm run clean && tsc && npm run build:sea-bootstrap", - "build:sea-bootstrap": "node -e \"if(+process.version.slice(1).split('.')[0]>=22){require('child_process').execSync('npx esbuild prelude/sea-bootstrap.js --bundle --platform=node --target=node22 --outfile=prelude/sea-bootstrap.bundle.js --external:node:sea --external:node:fs --external:node:path --external:node:os --external:node:crypto --external:node:module --external:node:vfs',{stdio:'inherit'})}else{console.log('Skipping sea-bootstrap bundle (requires Node >= 22)')}\"", + "build:sea-bootstrap": "esbuild prelude/sea-bootstrap.js --bundle --platform=node --target=node22 --outfile=prelude/sea-bootstrap.bundle.js --external:node:sea --external:node:vfs", "start": "tsc --watch", "lint": "npm run lint:style && npm run lint:code", "lint:style": "prettier -c \"{lib,prelude,test}/**/*.{ts,js}\"", @@ -84,8 +82,7 @@ "fix": "npm run lint:style -- -w && npm run lint:code -- --fix", "prepare": "npm run build", "prepublishOnly": "npm run lint", - "test": "npm run build && npm run test:host && npm run test:20 && npm run test:22 && npm run test:24", - "test:20": "node test/test.js node20 no-npm", + "test": "npm run build && npm run test:host && npm run test:22 && npm run test:24", "test:22": "node test/test.js node22 no-npm", "test:24": "node test/test.js node24 no-npm", "test:host": "node test/test.js host only-npm", @@ -104,7 +101,7 @@ }, "packageManager": "yarn@1.22.22", "engines": { - "node": ">=20.0.0" + "node": ">=22.0.0" }, "resolutions": { "lodash": "^4.17.23", diff --git a/prelude/sea-bootstrap.js b/prelude/sea-bootstrap.js index 07a066b18..c79889dab 100644 --- a/prelude/sea-bootstrap.js +++ b/prelude/sea-bootstrap.js @@ -17,7 +17,14 @@ const Module = require('module'); // MANIFEST //////////////////////////////////////////////////////// // ///////////////////////////////////////////////////////////////// -const manifest = JSON.parse(sea.getAsset('__pkg_manifest__', 'utf8')); +var manifest; +try { + manifest = JSON.parse(sea.getAsset('__pkg_manifest__', 'utf8')); +} catch (e) { + throw new Error( + 'pkg: Failed to load VFS manifest from SEA assets: ' + e.message, + ); +} // ///////////////////////////////////////////////////////////////// // VFS SETUP /////////////////////////////////////////////////////// @@ -28,13 +35,19 @@ var vfsModule; try { vfsModule = require('node:vfs'); } catch (_) { - vfsModule = require('@platformatic/vfs'); + try { + vfsModule = require('@platformatic/vfs'); + } catch (e) { + throw new Error( + 'pkg: VFS polyfill (@platformatic/vfs) is not available: ' + e.message, + ); + } } var VirtualFileSystem = vfsModule.VirtualFileSystem; var MemoryProvider = vfsModule.MemoryProvider; -// Custom provider that reads from SEA assets lazily (zero-copy via getRawAsset). +// Custom provider that reads from SEA assets lazily. // Extends MemoryProvider for directory/stat support while lazily populating // file content from SEA assets on first access. class SEAProvider extends MemoryProvider { @@ -45,11 +58,7 @@ class SEAProvider extends MemoryProvider { // Pre-populate directory structure from manifest for (var dir of Object.keys(seaManifest.directories)) { - try { - super.mkdirSync(dir, { recursive: true }); - } catch (_) { - // directory may already exist - } + super.mkdirSync(dir, { recursive: true }); } } @@ -62,6 +71,7 @@ class SEAProvider extends MemoryProvider { if (this._loaded.has(filePath)) return; try { var raw = sea.getRawAsset(filePath); + // getRawAsset returns an ArrayBuffer — Buffer.from copies the data super.writeFileSync(filePath, Buffer.from(raw)); this._loaded.add(filePath); } catch (_) { @@ -84,20 +94,30 @@ class SEAProvider extends MemoryProvider { } existsSync(filePath) { - return filePath in this._manifest.stats; + if (filePath in this._manifest.stats) return true; + // Fall through to super for directories created via mkdirSync + try { + super.statSync(filePath); + return true; + } catch (_) { + return false; + } } } var provider = new SEAProvider(manifest); var virtualFs = new VirtualFileSystem(provider); -virtualFs.mount('/snapshot', { overlay: true }); + +var SNAPSHOT_PREFIX = + process.platform === 'win32' ? 'C:\\snapshot' : '/snapshot'; + +// Mount at the appropriate prefix for the runtime platform +virtualFs.mount(SNAPSHOT_PREFIX, { overlay: true }); // ///////////////////////////////////////////////////////////////// // NATIVE ADDON EXTRACTION ///////////////////////////////////////// // ///////////////////////////////////////////////////////////////// -var SNAPSHOT_PREFIX = - process.platform === 'win32' ? 'C:\\snapshot' : '/snapshot'; var nativeCacheBase = process.env.PKG_NATIVE_CACHE_PATH || path.join(os.homedir(), '.cache', 'pkg'); @@ -110,11 +130,7 @@ process.dlopen = function patchedDlopen(module_, filename, flags) { var hash = createHash('sha256').update(content).digest('hex').slice(0, 16); var cacheDir = path.join(nativeCacheBase, hash); - try { - fs.mkdirSync(cacheDir, { recursive: true }); - } catch (_) { - // directory exists - } + fs.mkdirSync(cacheDir, { recursive: true }); var extractedPath = path.join(cacheDir, path.basename(filename)); @@ -122,7 +138,7 @@ process.dlopen = function patchedDlopen(module_, filename, flags) { fs.statSync(extractedPath); } catch (_) { // Not cached yet — extract to real filesystem - fs.writeFileSync(extractedPath, content); + fs.writeFileSync(extractedPath, content, { mode: 0o755 }); } return ancestorDlopen(module_, extractedPath, flags); @@ -147,6 +163,9 @@ process.pkg = { return path.resolve.apply(path, args); }, }, + mount: function () { + throw new Error('process.pkg.mount is not supported in SEA mode'); + }, }; // ///////////////////////////////////////////////////////////////// @@ -155,5 +174,9 @@ process.pkg = { process.argv[1] = manifest.entrypoint; Module._cache = Object.create(null); -process.mainModule = undefined; +try { + process.mainModule = undefined; +} catch (_) { + // process.mainModule may become read-only in future Node.js versions +} Module.runMain(); diff --git a/test/test-00-sea/main.js b/test/test-00-sea/main.js index a63f3538c..7417ab131 100644 --- a/test/test-00-sea/main.js +++ b/test/test-00-sea/main.js @@ -5,8 +5,8 @@ const assert = require('assert'); const utils = require('../utils.js'); -// sea is not supported on Node.js < 20 -if (utils.getNodeMajorVersion() < 20) { +// sea is not supported on Node.js < 22 +if (utils.getNodeMajorVersion() < 22) { return; } diff --git a/test/test-85-sea-enhanced/main.js b/test/test-85-sea-enhanced/main.js index ece680288..0e862eceb 100644 --- a/test/test-85-sea-enhanced/main.js +++ b/test/test-85-sea-enhanced/main.js @@ -24,25 +24,10 @@ const before = utils.filesBefore(newcomers); utils.pkg.sync([input, '--sea'], { stdio: 'inherit' }); -if (process.platform === 'linux') { - assert.equal( - utils.spawn.sync('./test-85-sea-enhanced-linux', []), - 'hello from lib\nmain: got message\n', - 'Output matches', - ); -} else if (process.platform === 'darwin') { - assert.equal( - utils.spawn.sync('./test-85-sea-enhanced-macos', []), - 'hello from lib\nmain: got message\n', - 'Output matches', - ); -} else if (process.platform === 'win32') { - assert.equal( - utils.spawn.sync('./test-85-sea-enhanced-win.exe', []), - 'hello from lib\nmain: got message\n', - 'Output matches', - ); -} +utils.assertSeaOutput( + 'test-85-sea-enhanced', + 'hello from lib\nmain: got message\n', +); try { utils.filesAfter(before, newcomers); diff --git a/test/test-86-sea-assets/main.js b/test/test-86-sea-assets/main.js index f7de20f8a..993886b5b 100644 --- a/test/test-86-sea-assets/main.js +++ b/test/test-86-sea-assets/main.js @@ -24,30 +24,13 @@ const before = utils.filesBefore(newcomers); utils.pkg.sync([input, '--sea'], { stdio: 'inherit' }); -const expected = 'config:test-value\ndata:hello world\n'; - -if (process.platform === 'linux') { - assert.equal( - utils.spawn.sync('./test-86-sea-assets-linux', []), - expected, - 'Output matches', - ); -} else if (process.platform === 'darwin') { - assert.equal( - utils.spawn.sync('./test-86-sea-assets-macos', []), - expected, - 'Output matches', - ); -} else if (process.platform === 'win32') { - assert.equal( - utils.spawn.sync('./test-86-sea-assets-win.exe', []), - expected, - 'Output matches', - ); -} +utils.assertSeaOutput( + 'test-86-sea-assets', + 'config:test-value\ndata:hello world\n', +); try { utils.filesAfter(before, newcomers); } catch (_error) { - // noop + // noop — Windows EBUSY workaround } diff --git a/test/test-87-sea-esm/main.js b/test/test-87-sea-esm/main.js index 82ebebe8e..3b5cc15b7 100644 --- a/test/test-87-sea-esm/main.js +++ b/test/test-87-sea-esm/main.js @@ -5,8 +5,9 @@ const assert = require('assert'); const utils = require('../utils.js'); -// Enhanced SEA with ESM entry requires Node.js >= 25.7 (mainFormat: "module") +// Enhanced SEA with ESM entry requires Node.js >= 26 (mainFormat: "module") // and the VFS polyfill's module hooks. Skip until node:vfs lands in core. +// TODO: re-enable when node:vfs is available (https://github.com/nodejs/node/pull/61478) if (utils.getNodeMajorVersion() < 26) { return; } @@ -25,30 +26,10 @@ const before = utils.filesBefore(newcomers); utils.pkg.sync([input, '--sea'], { stdio: 'inherit' }); -const expected = 'add:5\ngreeting:hello world\n'; - -if (process.platform === 'linux') { - assert.equal( - utils.spawn.sync('./test-87-sea-esm-linux', []), - expected, - 'Output matches', - ); -} else if (process.platform === 'darwin') { - assert.equal( - utils.spawn.sync('./test-87-sea-esm-macos', []), - expected, - 'Output matches', - ); -} else if (process.platform === 'win32') { - assert.equal( - utils.spawn.sync('./test-87-sea-esm-win.exe', []), - expected, - 'Output matches', - ); -} +utils.assertSeaOutput('test-87-sea-esm', 'add:5\ngreeting:hello world\n'); try { utils.filesAfter(before, newcomers); } catch (_error) { - // noop + // noop — Windows EBUSY workaround } diff --git a/test/test-89-sea-fs-ops/main.js b/test/test-89-sea-fs-ops/main.js index d0a1b19b9..1adc7ee49 100644 --- a/test/test-89-sea-fs-ops/main.js +++ b/test/test-89-sea-fs-ops/main.js @@ -34,28 +34,10 @@ const expectedOutput = 'readdir:data.json,index.js,package.json\n' + 'readFile:ok\n'; -if (process.platform === 'linux') { - assert.equal( - utils.spawn.sync('./test-89-sea-fs-ops-linux', []), - expectedOutput, - 'Output matches', - ); -} else if (process.platform === 'darwin') { - assert.equal( - utils.spawn.sync('./test-89-sea-fs-ops-macos', []), - expectedOutput, - 'Output matches', - ); -} else if (process.platform === 'win32') { - assert.equal( - utils.spawn.sync('./test-89-sea-fs-ops-win.exe', []), - expectedOutput, - 'Output matches', - ); -} +utils.assertSeaOutput('test-89-sea-fs-ops', expectedOutput); try { utils.filesAfter(before, newcomers); } catch (_error) { - // noop + // noop — Windows EBUSY workaround } diff --git a/test/utils.js b/test/utils.js index 191a8d34d..9305d5496 100644 --- a/test/utils.js +++ b/test/utils.js @@ -279,3 +279,20 @@ module.exports.shouldSkipPnpm = function () { return false; }; + +/** + * Assert SEA executable output for the current platform. + * @param {string} testName - Base name of the test executable (e.g. 'test-85-sea-enhanced') + * @param {string} expected - Expected stdout output + */ +module.exports.assertSeaOutput = function (testName, expected) { + const platformSuffix = { linux: 'linux', darwin: 'macos', win32: 'win.exe' }; + const suffix = platformSuffix[process.platform]; + if (suffix) { + assert.equal( + module.exports.spawn.sync(`./${testName}-${suffix}`, []), + expected, + 'Output matches', + ); + } +}; From 69c001099c8b39fc064f2963dd93f8cd18b9594c Mon Sep 17 00:00:00 2001 From: robertsLando Date: Tue, 7 Apr 2026 11:22:55 +0200 Subject: [PATCH 04/41] fix: restore test-00-sea Node version guard to < 20 Simple SEA mode was introduced in Node 20, not Node 22. The guard should reflect when the Node.js feature was added, not the project minimum. Co-Authored-By: Claude Opus 4.6 (1M context) --- test/test-00-sea/main.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/test-00-sea/main.js b/test/test-00-sea/main.js index 7417ab131..a63f3538c 100644 --- a/test/test-00-sea/main.js +++ b/test/test-00-sea/main.js @@ -5,8 +5,8 @@ const assert = require('assert'); const utils = require('../utils.js'); -// sea is not supported on Node.js < 22 -if (utils.getNodeMajorVersion() < 22) { +// sea is not supported on Node.js < 20 +if (utils.getNodeMajorVersion() < 20) { return; } From 13541e132d1aed09ea9a1d30f6be4a13ccd0966c Mon Sep 17 00:00:00 2001 From: robertsLando Date: Tue, 7 Apr 2026 11:25:29 +0200 Subject: [PATCH 05/41] fix: restore assertSeaNodeVersion to check Node >= 20 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The shared assertSeaNodeVersion() is used by both simple and enhanced SEA modes. Simple SEA was introduced in Node 20 — the check should reflect that. Enhanced mode's Node 22 requirement is enforced separately by the routing logic in index.ts. Also fixes README --sea description to explain both modes. Co-Authored-By: Claude Opus 4.6 (1M context) --- README.md | 2 +- lib/sea.ts | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index bbebe73e4..9baa66c61 100644 --- a/README.md +++ b/README.md @@ -47,7 +47,7 @@ After installing it, run `pkg --help` without arguments to see list of options: --no-native-build skip native addons build --no-dict comma-separated list of packages names to ignore dictionaries. Use --no-dict * to disable all dictionaries -C, --compress [default=None] compression algorithm = Brotli or GZip - --sea (Experimental) compile give file using node's SEA feature. Requires node v22.0.0 or higher + --sea (Experimental) compile using node's SEA feature. With package.json input and node >= 22, uses enhanced mode with full dependency walking and VFS Examples: diff --git a/lib/sea.ts b/lib/sea.ts index fb2e1efa3..e6f85cae3 100644 --- a/lib/sea.ts +++ b/lib/sea.ts @@ -392,9 +392,9 @@ async function withSeaTmpDir( /** Validate that the host Node.js version supports SEA */ function assertSeaNodeVersion() { const nodeMajor = parseInt(process.version.slice(1).split('.')[0], 10); - if (nodeMajor < 22) { + if (nodeMajor < 20) { throw new Error( - `SEA support requires at least node v22.0.0, actual node version is ${process.version}`, + `SEA support requires at least node v20.0.0, actual node version is ${process.version}`, ); } return nodeMajor; From 49ad5a937bb6bd3687a6bea906d7b7281ddc6323 Mon Sep 17 00:00:00 2001 From: robertsLando Date: Tue, 7 Apr 2026 11:32:03 +0200 Subject: [PATCH 06/41] test: enhance SEA mode tests for pkg compatibility and error handling --- test/test-85-sea-enhanced/index.js | 15 +++++++++++++++ test/test-85-sea-enhanced/main.js | 13 +++++++++---- test/test-89-sea-fs-ops/index.js | 16 ++++++++++++++++ test/test-89-sea-fs-ops/main.js | 4 +++- 4 files changed, 43 insertions(+), 5 deletions(-) diff --git a/test/test-85-sea-enhanced/index.js b/test/test-85-sea-enhanced/index.js index fabb1a8fe..031a83cf7 100644 --- a/test/test-85-sea-enhanced/index.js +++ b/test/test-85-sea-enhanced/index.js @@ -4,3 +4,18 @@ const { getMessage } = require('./lib/helper.js'); const result = getMessage(); console.log('main: ' + result); + +// Verify process.pkg compatibility +console.log('pkg-exists:' + (process.pkg != null)); +console.log('pkg-entrypoint:' + (typeof process.pkg.entrypoint === 'string')); +console.log( + 'pkg-path-resolve:' + (typeof process.pkg.path.resolve === 'function'), +); + +// process.pkg.mount should throw in SEA mode +try { + process.pkg.mount(); + console.log('pkg-mount:no-error'); +} catch (_) { + console.log('pkg-mount:throws'); +} diff --git a/test/test-85-sea-enhanced/main.js b/test/test-85-sea-enhanced/main.js index 0e862eceb..456065268 100644 --- a/test/test-85-sea-enhanced/main.js +++ b/test/test-85-sea-enhanced/main.js @@ -24,10 +24,15 @@ const before = utils.filesBefore(newcomers); utils.pkg.sync([input, '--sea'], { stdio: 'inherit' }); -utils.assertSeaOutput( - 'test-85-sea-enhanced', - 'hello from lib\nmain: got message\n', -); +const expected = + 'hello from lib\n' + + 'main: got message\n' + + 'pkg-exists:true\n' + + 'pkg-entrypoint:true\n' + + 'pkg-path-resolve:true\n' + + 'pkg-mount:throws\n'; + +utils.assertSeaOutput('test-85-sea-enhanced', expected); try { utils.filesAfter(before, newcomers); diff --git a/test/test-89-sea-fs-ops/index.js b/test/test-89-sea-fs-ops/index.js index 33a312103..cf07e0b30 100644 --- a/test/test-89-sea-fs-ops/index.js +++ b/test/test-89-sea-fs-ops/index.js @@ -24,3 +24,19 @@ console.log('readdir:' + entries.join(',')); const content = fs.readFileSync(path.join(__dirname, 'data.json'), 'utf8'); const parsed = JSON.parse(content); console.log('readFile:' + parsed.test); + +// Test error path: statSync on non-existent file should throw +try { + fs.statSync(path.join(__dirname, 'does-not-exist.txt')); + console.log('stat-missing:no-error'); +} catch (e) { + console.log('stat-missing:' + e.code); +} + +// Test error path: readFileSync on non-existent file should throw +try { + fs.readFileSync(path.join(__dirname, 'does-not-exist.txt')); + console.log('read-missing:no-error'); +} catch (e) { + console.log('read-missing:' + e.code); +} diff --git a/test/test-89-sea-fs-ops/main.js b/test/test-89-sea-fs-ops/main.js index 1adc7ee49..6265ae237 100644 --- a/test/test-89-sea-fs-ops/main.js +++ b/test/test-89-sea-fs-ops/main.js @@ -32,7 +32,9 @@ const expectedOutput = 'dir-isFile:false\n' + 'dir-isDir:true\n' + 'readdir:data.json,index.js,package.json\n' + - 'readFile:ok\n'; + 'readFile:ok\n' + + 'stat-missing:ENOENT\n' + + 'read-missing:ENOENT\n'; utils.assertSeaOutput('test-89-sea-fs-ops', expectedOutput); From 0842c82250462f0c612af6d8f6554e1c7ecf4dd2 Mon Sep 17 00:00:00 2001 From: robertsLando Date: Tue, 7 Apr 2026 11:43:09 +0200 Subject: [PATCH 07/41] fix: improve error handling and conditionally remove Mach-O signature on macOS --- lib/sea.ts | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/lib/sea.ts b/lib/sea.ts index e6f85cae3..8494924e0 100644 --- a/lib/sea.ts +++ b/lib/sea.ts @@ -332,7 +332,11 @@ async function bake( log.info(`Injecting the blob into ${outPath}...`); if (target.platform === 'macos') { - removeMachOExecutableSignature(outPath); + // codesign is only available on macOS — skip signature removal when + // cross-compiling from another platform + if (process.platform === 'darwin') { + removeMachOExecutableSignature(outPath); + } await exec( `npx postject "${outPath}" NODE_SEA_BLOB "${blobPath}" --sentinel-fuse NODE_SEA_FUSE_fce680ab2cc467b6e072b8b5df1996b2 --macho-segment-name NODE_SEA`, ); @@ -380,7 +384,16 @@ async function withSeaTmpDir( process.chdir(tmpDir); return await fn(tmpDir); } catch (error) { - throw new Error('Error while creating the executable', { cause: error }); + const message = error instanceof Error ? error.message : String(error); + const wrapped = new Error( + `Error while creating the executable: ${message}`, + { cause: error }, + ); + // Preserve the original stack if available + if (error instanceof Error && error.stack) { + wrapped.stack = `${wrapped.message}\n [cause]: ${error.stack}`; + } + throw wrapped; } finally { process.chdir(previousDirectory); await rm(tmpDir, { recursive: true }).catch(() => { From 862df2aecc00e14a959c7aaa50c779d2806fdf7c Mon Sep 17 00:00:00 2001 From: robertsLando Date: Tue, 7 Apr 2026 12:01:09 +0200 Subject: [PATCH 08/41] refactor: extract shared runtime code into bootstrap-shared.js Move dlopen patching, child_process patching, and process.pkg setup into a shared module used by both the traditional and SEA bootstraps. This eliminates duplication and ensures both modes handle native addons, subprocess spawning, and process.pkg identically. - Replace copyFolderRecursiveSync with fs.cpSync (Node >= 22) - Add REQUIRE_SHARED parameter to packer wrapper for traditional mode - SEA bootstrap consumes shared module via esbuild bundling - Remove dead code (ARGV0, homedir import, copyFolderRecursiveSync) Co-Authored-By: Claude Opus 4.6 (1M context) --- lib/packer.ts | 8 +- prelude/bootstrap-shared.js | 255 +++++++++++++++++++++++++++++++ prelude/bootstrap.js | 296 +----------------------------------- prelude/sea-bootstrap.js | 69 ++------- 4 files changed, 284 insertions(+), 344 deletions(-) create mode 100644 prelude/bootstrap-shared.js diff --git a/lib/packer.ts b/lib/packer.ts index 6da73daf5..d3fbfcca7 100644 --- a/lib/packer.ts +++ b/lib/packer.ts @@ -25,6 +25,11 @@ const bootstrapText = readFileSync( const commonText = readFileSync(require.resolve('./common'), 'utf8'); +const sharedText = readFileSync( + require.resolve('../prelude/bootstrap-shared.js'), + 'utf8', +); + const diagnosticText = readFileSync( require.resolve('../prelude/diagnostic.js'), 'utf8', @@ -169,10 +174,11 @@ export default function packer({ } } const prelude = - `return (function (REQUIRE_COMMON, VIRTUAL_FILESYSTEM, DEFAULT_ENTRYPOINT, SYMLINKS, DICT, DOCOMPRESS) { + `return (function (REQUIRE_COMMON, REQUIRE_SHARED, VIRTUAL_FILESYSTEM, DEFAULT_ENTRYPOINT, SYMLINKS, DICT, DOCOMPRESS) { ${bootstrapText}${ log.debugMode ? diagnosticText : '' }\n})(function (exports) {\n${commonText}\n},\n` + + `(function () { var module = { exports: {} };\n${sharedText}\nreturn module.exports; })(),\n` + `%VIRTUAL_FILESYSTEM%` + `\n,\n` + `%DEFAULT_ENTRYPOINT%` + diff --git a/prelude/bootstrap-shared.js b/prelude/bootstrap-shared.js new file mode 100644 index 000000000..371b5cdf0 --- /dev/null +++ b/prelude/bootstrap-shared.js @@ -0,0 +1,255 @@ +'use strict'; + +// Shared runtime utilities used by both the traditional bootstrap and +// the SEA bootstrap. Each consumer require()s or inlines this module. +// +// Traditional bootstrap: inlined via REQUIRE_COMMON (already has its +// own common.ts path helpers) — only calls the functions exported here. +// SEA bootstrap: bundled by esbuild via require('./bootstrap-shared'). + +var childProcess = require('child_process'); +var { createHash } = require('crypto'); +var fs = require('fs'); +var path = require('path'); +var { homedir } = require('os'); + +// ///////////////////////////////////////////////////////////////// +// NATIVE ADDON EXTRACTION ///////////////////////////////////////// +// ///////////////////////////////////////////////////////////////// + +/** + * Patch process.dlopen to extract native addons from the snapshot to a + * cache directory on the real filesystem before loading them. + * + * @param {function} insideSnapshot Returns true when a path is inside the virtual snapshot. + */ +function patchDlopen(insideSnapshot) { + var ancestor = process.dlopen; + var PKG_NATIVE_CACHE_BASE = + process.env.PKG_NATIVE_CACHE_PATH || path.join(homedir(), '.cache'); + + function revertMakingLong(f) { + if (/^\\\\\?\\/.test(f)) return f.slice(4); + return f; + } + + process.dlopen = function dlopen() { + var args = Array.prototype.slice.call(arguments); + var modulePath = revertMakingLong(args[1]); + var moduleBaseName = path.basename(modulePath); + var moduleFolder = path.dirname(modulePath); + + if (insideSnapshot(modulePath)) { + var moduleContent = fs.readFileSync(modulePath); + var hash = createHash('sha256').update(moduleContent).digest('hex'); + var tmpFolder = path.join(PKG_NATIVE_CACHE_BASE, 'pkg', hash); + + fs.mkdirSync(tmpFolder, { recursive: true }); + + var parts = moduleFolder.split(path.sep); + var mIndex = parts.lastIndexOf('node_modules') + 1; + var newPath; + + if (mIndex > 0) { + // Addon inside node_modules — copy the entire package folder to + // preserve relative paths for statically linked addons (fix #1075) + var modulePackagePath = parts.slice(mIndex).join(path.sep); + var modulePkgFolder = parts.slice(0, mIndex + 1).join(path.sep); + var destFolder = path.join(tmpFolder, path.basename(modulePkgFolder)); + + if (!fs.existsSync(destFolder)) { + fs.cpSync(modulePkgFolder, destFolder, { recursive: true }); + } + newPath = path.join(tmpFolder, modulePackagePath, moduleBaseName); + } else { + var tmpModulePath = path.join(tmpFolder, moduleBaseName); + + if (!fs.existsSync(tmpModulePath)) { + fs.copyFileSync(modulePath, tmpModulePath); + } + + newPath = tmpModulePath; + } + + args[1] = newPath; + } + + return ancestor.apply(process, args); + }; +} + +// ///////////////////////////////////////////////////////////////// +// CHILD_PROCESS PATCHING ////////////////////////////////////////// +// ///////////////////////////////////////////////////////////////// + +/** + * Patch child_process so that spawning 'node' or the entrypoint from + * inside a packaged app correctly uses the executable path. + * + * @param {string} entrypoint The snapshotified entrypoint path. + */ +function patchChildProcess(entrypoint) { + var EXECPATH = process.execPath; + var ARGV0 = process.argv[0]; + + var ancestor = { + spawn: childProcess.spawn, + spawnSync: childProcess.spawnSync, + execFile: childProcess.execFile, + execFileSync: childProcess.execFileSync, + exec: childProcess.exec, + execSync: childProcess.execSync, + }; + + function cloneArgs(args_) { + return Array.prototype.slice.call(args_); + } + + function setOptsEnv(args) { + var pos = args.length - 1; + if (typeof args[pos] === 'function') pos -= 1; + if (typeof args[pos] !== 'object' || Array.isArray(args[pos])) { + pos += 1; + args.splice(pos, 0, {}); + } + var opts = args[pos]; + if (!opts.env) opts.env = Object.assign({}, process.env); + if (opts.env.PKG_EXECPATH !== undefined) return; + opts.env.PKG_EXECPATH = EXECPATH; + } + + function startsWith2(args, index, name, impostor) { + var qsName = '"' + name + ' '; + if (args[index].slice(0, qsName.length) === qsName) { + args[index] = '"' + impostor + ' ' + args[index].slice(qsName.length); + return true; + } + var sName = name + ' '; + if (args[index].slice(0, sName.length) === sName) { + args[index] = impostor + ' ' + args[index].slice(sName.length); + return true; + } + if (args[index] === name) { + args[index] = impostor; + return true; + } + return false; + } + + function startsWith(args, index, name) { + var qName = '"' + name + '"'; + var qEXECPATH = '"' + EXECPATH + '"'; + var jsName = JSON.stringify(name); + var jsEXECPATH = JSON.stringify(EXECPATH); + return ( + startsWith2(args, index, name, EXECPATH) || + startsWith2(args, index, qName, qEXECPATH) || + startsWith2(args, index, jsName, jsEXECPATH) + ); + } + + function modifyLong(args, index) { + if (!args[index]) return; + return ( + startsWith(args, index, 'node') || + startsWith(args, index, ARGV0) || + startsWith(args, index, entrypoint) || + startsWith(args, index, EXECPATH) + ); + } + + function modifyShort(args) { + if (!args[0]) return; + if (!Array.isArray(args[1])) { + args.splice(1, 0, []); + } + if ( + args[0] === 'node' || + args[0] === ARGV0 || + args[0] === entrypoint || + args[0] === EXECPATH + ) { + args[0] = EXECPATH; + } else { + for (var i = 1; i < args[1].length; i += 1) { + var mbc = args[1][i - 1]; + if (mbc === '-c' || mbc === '/c') { + modifyLong(args[1], i); + } + } + } + } + + childProcess.spawn = function spawn() { + var args = cloneArgs(arguments); + setOptsEnv(args); + modifyShort(args); + return ancestor.spawn.apply(childProcess, args); + }; + + childProcess.spawnSync = function spawnSync() { + var args = cloneArgs(arguments); + setOptsEnv(args); + modifyShort(args); + return ancestor.spawnSync.apply(childProcess, args); + }; + + childProcess.execFile = function execFile() { + var args = cloneArgs(arguments); + setOptsEnv(args); + modifyShort(args); + return ancestor.execFile.apply(childProcess, args); + }; + + childProcess.execFileSync = function execFileSync() { + var args = cloneArgs(arguments); + setOptsEnv(args); + modifyShort(args); + return ancestor.execFileSync.apply(childProcess, args); + }; + + childProcess.exec = function exec() { + var args = cloneArgs(arguments); + setOptsEnv(args); + modifyLong(args, 0); + return ancestor.exec.apply(childProcess, args); + }; + + childProcess.execSync = function execSync() { + var args = cloneArgs(arguments); + setOptsEnv(args); + modifyLong(args, 0); + return ancestor.execSync.apply(childProcess, args); + }; +} + +// ///////////////////////////////////////////////////////////////// +// PROCESS.PKG SETUP /////////////////////////////////////////////// +// ///////////////////////////////////////////////////////////////// + +/** + * Set up the process.pkg compatibility object. + * + * @param {string} entrypoint The snapshotified entrypoint path. + */ +function setupProcessPkg(entrypoint) { + process.pkg = { + entrypoint: entrypoint, + defaultEntrypoint: entrypoint, + path: { + resolve: function () { + var args = [path.dirname(entrypoint)]; + for (var i = 0; i < arguments.length; i++) { + args.push(arguments[i]); + } + return path.resolve.apply(path, args); + }, + }, + }; +} + +module.exports = { + patchDlopen: patchDlopen, + patchChildProcess: patchChildProcess, + setupProcessPkg: setupProcessPkg, +}; diff --git a/prelude/bootstrap.js b/prelude/bootstrap.js index 8a8ee86f4..7daa6667f 100644 --- a/prelude/bootstrap.js +++ b/prelude/bootstrap.js @@ -2,6 +2,7 @@ /* global PAYLOAD_POSITION */ /* global PAYLOAD_SIZE */ /* global REQUIRE_COMMON */ +/* global REQUIRE_SHARED */ /* global VIRTUAL_FILESYSTEM */ /* global DEFAULT_ENTRYPOINT */ /* global DICT */ @@ -18,7 +19,6 @@ const Module = require('module'); const path = require('path'); const { promisify } = require('util'); const { Script } = require('vm'); -const { homedir } = require('os'); const util = require('util'); const { brotliDecompress, @@ -50,9 +50,8 @@ const NODE_VERSION_MINOR = process.version.match(/^v\d+.(\d+)/)[1] | 0; // ENTRYPOINT ////////////////////////////////////////////////////// // ///////////////////////////////////////////////////////////////// -// set ENTRYPOINT and ARGV0 here because -// they can be altered during process run -const ARGV0 = process.argv[0]; +// set ENTRYPOINT here because +// it can be altered during process run const EXECPATH = process.execPath; let ENTRYPOINT = process.argv[1]; @@ -173,74 +172,6 @@ function copyInChunks( fs_.closeSync(targetFile); } -// TODO: replace this with fs.cpSync when we drop Node < 16 -function copyFolderRecursiveSync(source, target) { - // Build target folder - const targetFolder = path.join(target, path.basename(source)); - - // Check if target folder needs to be created or integrated - fs.mkdirSync(targetFolder, { recursive: true }); - - // Copy - if (fs.lstatSync(source).isDirectory()) { - const files = fs.readdirSync(source); - - for (const file of files) { - // Build source name - const curSource = path.join(source, file); - - // Call this function recursively as long as source is a directory - if (fs.lstatSync(curSource).isDirectory()) { - copyFolderRecursiveSync(curSource, targetFolder); - } else { - // Current source is a file, it must be available on the real filesystem - // instead of the virtual snapshot file system to load it by process.dlopen. - // - // Before we try to copy we do some checks. - // See https://github.com/vercel/pkg/issues/1589 for more details. - - // Build target file name - const curTarget = path.join(targetFolder, path.basename(curSource)); - - if (fs.existsSync(curTarget)) { - // Target file already exists, read source and target file... - const curSourceContent = fs.readFileSync(curSource, { - encoding: 'binary', - }); - const curTargetContent = fs.readFileSync(curTarget, { - encoding: 'binary', - }); - - // ...and calculate checksum from source and target file - const curSourceHash = createHash('sha256') - .update(curSourceContent) - .digest('hex'); - const curTargetHash = createHash('sha256') - .update(curTargetContent) - .digest('hex'); - - // If checksums are equal then there is nothing to do here - // ==> target already exists and is up-to-date - if (curSourceHash === curTargetHash) { - continue; - } - } - - // Target must be copied because it either does not exist or is outdated. - // Due to the possibility that mutliple instances of this app start simultaneously, - // the copy action might fail. Only one starting instance gets write access. - // - // We don't catch any error here because it does not make sense to go ahead and to - // try to load the file while another instance has not yet finished the copy action. - // If the app start fails then the user should try to start the app later again. - // Unfortunately, we cannot implement delayed retries ourselves because process.dlopen - // is a synchronous function, promises are not supported. - fs.copyFileSync(curSource, curTarget); - } - } - } -} - /* // TODO move to some test @@ -557,24 +488,9 @@ function payloadFileSync(pointer) { // ///////////////////////////////////////////////////////////////// (() => { - process.pkg = {}; + REQUIRE_SHARED.setupProcessPkg(ENTRYPOINT); process.versions.pkg = '%VERSION%'; process.pkg.mount = createMountpoint; - process.pkg.entrypoint = ENTRYPOINT; - process.pkg.defaultEntrypoint = DEFAULT_ENTRYPOINT; -})(); - -// ///////////////////////////////////////////////////////////////// -// PATH.RESOLVE REPLACEMENT //////////////////////////////////////// -// ///////////////////////////////////////////////////////////////// - -(() => { - process.pkg.path = {}; - process.pkg.path.resolve = function resolve() { - const args = cloneArgs(arguments); - args.unshift(path.dirname(ENTRYPOINT)); - return path.resolve.apply(path, args); - }; })(); // ///////////////////////////////////////////////////////////////// @@ -1976,134 +1892,8 @@ function payloadFileSync(pointer) { // ///////////////////////////////////////////////////////////////// // PATCH CHILD_PROCESS ///////////////////////////////////////////// // ///////////////////////////////////////////////////////////////// -(() => { - const ancestor = { - spawn: childProcess.spawn, - spawnSync: childProcess.spawnSync, - execFile: childProcess.execFile, - execFileSync: childProcess.execFileSync, - exec: childProcess.exec, - execSync: childProcess.execSync, - }; - - function setOptsEnv(args) { - let pos = args.length - 1; - if (typeof args[pos] === 'function') pos -= 1; - if (typeof args[pos] !== 'object' || Array.isArray(args[pos])) { - pos += 1; - args.splice(pos, 0, {}); - } - const opts = args[pos]; - if (!opts.env) opts.env = { ...process.env }; - // see https://github.com/vercel/pkg/issues/897#issuecomment-1049370335 - if (opts.env.PKG_EXECPATH !== undefined) return; - opts.env.PKG_EXECPATH = EXECPATH; - } - - function startsWith2(args, index, name, impostor) { - const qsName = `"${name} `; - if (args[index].slice(0, qsName.length) === qsName) { - args[index] = `"${impostor} ${args[index].slice(qsName.length)}`; - return true; - } - const sName = `${name} `; - if (args[index].slice(0, sName.length) === sName) { - args[index] = `${impostor} ${args[index].slice(sName.length)}`; - return true; - } - if (args[index] === name) { - args[index] = impostor; - return true; - } - return false; - } - - function startsWith(args, index, name) { - const qName = `"${name}"`; - const qEXECPATH = `"${EXECPATH}"`; - const jsName = JSON.stringify(name); - const jsEXECPATH = JSON.stringify(EXECPATH); - return ( - startsWith2(args, index, name, EXECPATH) || - startsWith2(args, index, qName, qEXECPATH) || - startsWith2(args, index, jsName, jsEXECPATH) - ); - } - - function modifyLong(args, index) { - if (!args[index]) return; - return ( - startsWith(args, index, 'node') || - startsWith(args, index, ARGV0) || - startsWith(args, index, ENTRYPOINT) || - startsWith(args, index, EXECPATH) - ); - } - - function modifyShort(args) { - if (!args[0]) return; - if (!Array.isArray(args[1])) { - args.splice(1, 0, []); - } - if ( - args[0] === 'node' || - args[0] === ARGV0 || - args[0] === ENTRYPOINT || - args[0] === EXECPATH - ) { - args[0] = EXECPATH; - } else { - for (let i = 1; i < args[1].length; i += 1) { - const mbc = args[1][i - 1]; - if (mbc === '-c' || mbc === '/c') { - modifyLong(args[1], i); - } - } - } - } - - childProcess.spawn = function spawn() { - const args = cloneArgs(arguments); - setOptsEnv(args); - modifyShort(args); - return ancestor.spawn.apply(childProcess, args); - }; - childProcess.spawnSync = function spawnSync() { - const args = cloneArgs(arguments); - setOptsEnv(args); - modifyShort(args); - return ancestor.spawnSync.apply(childProcess, args); - }; - - childProcess.execFile = function execFile() { - const args = cloneArgs(arguments); - setOptsEnv(args); - modifyShort(args); - return ancestor.execFile.apply(childProcess, args); - }; - - childProcess.execFileSync = function execFileSync() { - const args = cloneArgs(arguments); - setOptsEnv(args); - modifyShort(args); - return ancestor.execFileSync.apply(childProcess, args); - }; - - childProcess.exec = function exec() { - const args = cloneArgs(arguments); - setOptsEnv(args); - modifyLong(args, 0); - return ancestor.exec.apply(childProcess, args); - }; - - childProcess.execSync = function execSync() { - const args = cloneArgs(arguments); - setOptsEnv(args); - modifyLong(args, 0); - return ancestor.execSync.apply(childProcess, args); - }; -})(); +REQUIRE_SHARED.patchChildProcess(ENTRYPOINT); // ///////////////////////////////////////////////////////////////// // PROMISIFY /////////////////////////////////////////////////////// @@ -2176,79 +1966,5 @@ function payloadFileSync(pointer) { // ///////////////////////////////////////////////////////////////// // PATCH PROCESS /////////////////////////////////////////////////// // ///////////////////////////////////////////////////////////////// -(() => { - const ancestor = { - dlopen: process.dlopen, - }; - // Allow users to override the cache base directory via PKG_NATIVE_CACHE_PATH environment variable - // Default: path.join(homedir(), '.cache') - // - Linux/macOS: /home/john/.cache or /Users/john/.cache - // - Windows: C:\Users\John\.cache - // Custom example: /opt/myapp/cache or C:\myapp\cache - // Native addons will be extracted to: /pkg/ - const PKG_NATIVE_CACHE_BASE = - process.env.PKG_NATIVE_CACHE_PATH || path.join(homedir(), '.cache'); - - function revertMakingLong(f) { - if (/^\\\\\?\\/.test(f)) return f.slice(4); - return f; - } - - process.dlopen = function dlopen() { - const args = cloneArgs(arguments); - const modulePath = revertMakingLong(args[1]); - const moduleBaseName = path.basename(modulePath); - const moduleFolder = path.dirname(modulePath); - - if (insideSnapshot(modulePath)) { - const moduleContent = fs.readFileSync(modulePath); - - // Node addon files and .so cannot be read with fs directly, they are loaded with process.dlopen which needs a filesystem path - // we need to write the file somewhere on disk first and then load it - // the hash is needed to be sure we reload the module in case it changes - const hash = createHash('sha256').update(moduleContent).digest('hex'); - - const tmpFolder = path.join(PKG_NATIVE_CACHE_BASE, 'pkg', hash); - - fs.mkdirSync(tmpFolder, { recursive: true }); - - // Example: moduleFolder = /snapshot/appname/node_modules/sharp/build/Release - const parts = moduleFolder.split(path.sep); - const mIndex = parts.lastIndexOf('node_modules') + 1; - - let newPath; - - // it's a node addon file contained in node_modules folder - // we copy the entire module folder in tmp folder - if (mIndex > 0) { - // Example: modulePackagePath = sharp/build/Release - const modulePackagePath = parts.slice(mIndex).join(path.sep); - // Example: modulePkgFolder = /snapshot/appname/node_modules/sharp - const modulePkgFolder = parts.slice(0, mIndex + 1).join(path.sep); - - // here we copy all files from the snapshot module folder to temporary folder - // we keep the module folder structure to prevent issues with modules that are statically - // linked using relative paths (Fix #1075) - copyFolderRecursiveSync(modulePkgFolder, tmpFolder); - - // Example: /tmp/pkg//sharp/build/Release/sharp.node - newPath = path.join(tmpFolder, modulePackagePath, moduleBaseName); - } else { - const tmpModulePath = path.join(tmpFolder, moduleBaseName); - - if (!fs.existsSync(tmpModulePath)) { - fs.copyFileSync(modulePath, tmpModulePath); - } - - // load the copied file in the temporary folder - newPath = tmpModulePath; - } - - // replace the path with the new module path - args[1] = newPath; - } - - return ancestor.dlopen.apply(process, args); - }; -})(); +REQUIRE_SHARED.patchDlopen(insideSnapshot); diff --git a/prelude/sea-bootstrap.js b/prelude/sea-bootstrap.js index c79889dab..9ffb205b3 100644 --- a/prelude/sea-bootstrap.js +++ b/prelude/sea-bootstrap.js @@ -6,12 +6,10 @@ // It sets up a Virtual File System from SEA-embedded assets so that // fs.readFileSync, require, import, etc. work transparently on packaged files. -const sea = require('node:sea'); -const path = require('path'); -const fs = require('fs'); -const os = require('os'); -const { createHash } = require('crypto'); -const Module = require('module'); +var sea = require('node:sea'); +var path = require('path'); +var Module = require('module'); +var shared = require('./bootstrap-shared'); // ///////////////////////////////////////////////////////////////// // MANIFEST //////////////////////////////////////////////////////// @@ -115,58 +113,23 @@ var SNAPSHOT_PREFIX = virtualFs.mount(SNAPSHOT_PREFIX, { overlay: true }); // ///////////////////////////////////////////////////////////////// -// NATIVE ADDON EXTRACTION ///////////////////////////////////////// +// SHARED PATCHES ////////////////////////////////////////////////// // ///////////////////////////////////////////////////////////////// -var nativeCacheBase = - process.env.PKG_NATIVE_CACHE_PATH || path.join(os.homedir(), '.cache', 'pkg'); - -var ancestorDlopen = process.dlopen.bind(process); - -process.dlopen = function patchedDlopen(module_, filename, flags) { - if (typeof filename === 'string' && filename.startsWith(SNAPSHOT_PREFIX)) { - // Read the .node file content from VFS - var content = fs.readFileSync(filename); - var hash = createHash('sha256').update(content).digest('hex').slice(0, 16); - var cacheDir = path.join(nativeCacheBase, hash); - - fs.mkdirSync(cacheDir, { recursive: true }); - - var extractedPath = path.join(cacheDir, path.basename(filename)); - - try { - fs.statSync(extractedPath); - } catch (_) { - // Not cached yet — extract to real filesystem - fs.writeFileSync(extractedPath, content, { mode: 0o755 }); - } - - return ancestorDlopen(module_, extractedPath, flags); - } +// Detect whether a path is inside the snapshot +function insideSnapshot(f) { + if (typeof f !== 'string') return false; + return f.startsWith(SNAPSHOT_PREFIX + path.sep) || f === SNAPSHOT_PREFIX; +} - return ancestorDlopen(module_, filename, flags); -}; +// Native addon extraction (shared with traditional bootstrap) +shared.patchDlopen(insideSnapshot); -// ///////////////////////////////////////////////////////////////// -// PROCESS COMPATIBILITY /////////////////////////////////////////// -// ///////////////////////////////////////////////////////////////// +// child_process patching (shared with traditional bootstrap) +shared.patchChildProcess(manifest.entrypoint); -process.pkg = { - entrypoint: manifest.entrypoint, - defaultEntrypoint: manifest.entrypoint, - path: { - resolve: function () { - var args = [path.dirname(manifest.entrypoint)]; - for (var i = 0; i < arguments.length; i++) { - args.push(arguments[i]); - } - return path.resolve.apply(path, args); - }, - }, - mount: function () { - throw new Error('process.pkg.mount is not supported in SEA mode'); - }, -}; +// process.pkg setup (shared with traditional bootstrap) +shared.setupProcessPkg(manifest.entrypoint); // ///////////////////////////////////////////////////////////////// // ENTRYPOINT ////////////////////////////////////////////////////// From 8a42a627083d6340d9b0419ef8fc149b99595a67 Mon Sep 17 00:00:00 2001 From: robertsLando Date: Tue, 7 Apr 2026 12:10:10 +0200 Subject: [PATCH 09/41] fix: address Copilot review feedback on SEA pipeline - Handle non-numeric nodeRange (e.g. "latest") in enhanced SEA gating - Bump assertSeaNodeVersion to require Node >= 22 matching engines - Guard stepStrip in walker to only strip JS/ESM files in SEA mode, preventing binary corruption of .node addons - Replace blanket eslint-disable in sea-bootstrap.js with targeted no-unused-vars override in eslint config - Wire symlinks through to SEA manifest and bootstrap provider - Document --build-sea Node 25 gating assumption Co-Authored-By: Claude Opus 4.6 (1M context) --- eslint.config.js | 8 ++++++++ lib/index.ts | 6 +++++- lib/sea-assets.ts | 11 ++++++++++- lib/sea.ts | 5 +++-- lib/walker.ts | 6 +++++- prelude/sea-bootstrap.js | 16 +++++++++++++++- 6 files changed, 46 insertions(+), 6 deletions(-) diff --git a/eslint.config.js b/eslint.config.js index 39b8da741..f752de3c6 100644 --- a/eslint.config.js +++ b/eslint.config.js @@ -97,6 +97,14 @@ module.exports = [ files: ['prelude/**/*'], rules: { strict: 'off', + 'no-unused-vars': [ + 'error', + { + argsIgnorePattern: '^_', + varsIgnorePattern: '^_', + caughtErrorsIgnorePattern: '^_', + }, + ], }, }, diff --git a/lib/index.ts b/lib/index.ts index 42c593ede..6e3f3c1fe 100644 --- a/lib/index.ts +++ b/lib/index.ts @@ -547,7 +547,11 @@ export async function exec(argv2: string[]) { if (argv.sea) { const minTargetMajor = Math.min( - ...targets.map((t) => parseInt(t.nodeRange.replace('node', ''), 10)), + ...targets.map((t) => { + const v = parseInt(t.nodeRange.replace('node', ''), 10); + // Treat unparseable ranges (e.g. "latest") as current host major + return Number.isNaN(v) ? parseInt(process.version.slice(1), 10) : v; + }), ); if ((inputJson || configJson) && minTargetMajor >= 22) { diff --git a/lib/sea-assets.ts b/lib/sea-assets.ts index 4e74c0048..0905cf7fd 100644 --- a/lib/sea-assets.ts +++ b/lib/sea-assets.ts @@ -11,6 +11,7 @@ export interface SeaManifest { string, { size: number; isFile: boolean; isDirectory: boolean } >; + symlinks: Record; } export interface SeaAssetsResult { @@ -31,15 +32,23 @@ export interface SeaAssetsResult { export async function generateSeaAssets( records: FileRecords, entrypoint: string, - _symLinks: SymLinks, + symLinks: SymLinks, tmpDir: string, ): Promise { const assets: Record = {}; + + // Normalize symlink paths to use POSIX separators, matching other manifest paths + const normalizedSymlinks: Record = {}; + for (const src in symLinks) { + normalizedSymlinks[snapshotify(src, '/')] = snapshotify(symLinks[src], '/'); + } + const manifest: SeaManifest = { // Always use '/' — the bootstrap normalizes for the runtime platform entrypoint: snapshotify(entrypoint, '/'), directories: {}, stats: {}, + symlinks: normalizedSymlinks, }; let modifiedFileCount = 0; diff --git a/lib/sea.ts b/lib/sea.ts index 8494924e0..ae5802e3e 100644 --- a/lib/sea.ts +++ b/lib/sea.ts @@ -405,9 +405,9 @@ async function withSeaTmpDir( /** Validate that the host Node.js version supports SEA */ function assertSeaNodeVersion() { const nodeMajor = parseInt(process.version.slice(1).split('.')[0], 10); - if (nodeMajor < 20) { + if (nodeMajor < 22) { throw new Error( - `SEA support requires at least node v20.0.0, actual node version is ${process.version}`, + `SEA support requires at least node v22.0.0, actual node version is ${process.version}`, ); } return nodeMajor; @@ -491,6 +491,7 @@ export async function seaEnhanced( await writeFile(seaConfigFilePath, JSON.stringify(seaConfig)); // Generate the SEA blob + // --build-sea is stable from Node 25; older versions use --experimental-sea-config if (nodeMajor >= 25) { log.info('Generating the blob using --build-sea...'); await execFileAsync(process.execPath, ['--build-sea', seaConfigFilePath]); diff --git a/lib/walker.ts b/lib/walker.ts index cc05260da..6bd61aa29 100644 --- a/lib/walker.ts +++ b/lib/walker.ts @@ -997,7 +997,11 @@ class Walker { await stepRead(record); this.stepPatch(record); - if (store === STORE_BLOB || this.params.seaMode) { + if ( + store === STORE_BLOB || + (this.params.seaMode && + (isDotJS(record.file) || isESMFile(record.file))) + ) { stepStrip(record); } } diff --git a/prelude/sea-bootstrap.js b/prelude/sea-bootstrap.js index 9ffb205b3..dd9780bfa 100644 --- a/prelude/sea-bootstrap.js +++ b/prelude/sea-bootstrap.js @@ -1,4 +1,3 @@ -/* eslint-disable */ 'use strict'; // SEA Bootstrap for pkg @@ -60,11 +59,23 @@ class SEAProvider extends MemoryProvider { } } + _resolveSymlink(filePath) { + var target = this._manifest.symlinks[filePath]; + return target || filePath; + } + readFileSync(filePath, options) { + filePath = this._resolveSymlink(filePath); this._ensureLoaded(filePath); return super.readFileSync(filePath, options); } + readlinkSync(filePath) { + var target = this._manifest.symlinks[filePath]; + if (target) return target; + return super.readlinkSync(filePath); + } + _ensureLoaded(filePath) { if (this._loaded.has(filePath)) return; try { @@ -78,6 +89,7 @@ class SEAProvider extends MemoryProvider { } statSync(filePath) { + filePath = this._resolveSymlink(filePath); var meta = this._manifest.stats[filePath]; if (meta && meta.isFile && !this._loaded.has(filePath)) { this._ensureLoaded(filePath); @@ -92,6 +104,8 @@ class SEAProvider extends MemoryProvider { } existsSync(filePath) { + if (filePath in this._manifest.symlinks) return true; + filePath = this._resolveSymlink(filePath); if (filePath in this._manifest.stats) return true; // Fall through to super for directories created via mkdirSync try { From f539f92f27cec9ece7862f0d10ac3dd931249f55 Mon Sep 17 00:00:00 2001 From: robertsLando Date: Tue, 7 Apr 2026 12:13:26 +0200 Subject: [PATCH 10/41] fix: throw when JSON config targets Node < 22 in SEA mode Instead of silently falling back to simple SEA mode when the input is a package.json/config but targets are below Node 22, throw a clear error. Co-Authored-By: Claude Opus 4.6 (1M context) --- lib/index.ts | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/lib/index.ts b/lib/index.ts index 6e3f3c1fe..00b65519d 100644 --- a/lib/index.ts +++ b/lib/index.ts @@ -554,7 +554,14 @@ export async function exec(argv2: string[]) { }), ); - if ((inputJson || configJson) && minTargetMajor >= 22) { + if ((inputJson || configJson) && minTargetMajor < 22) { + throw wasReported( + 'Enhanced SEA mode requires Node >= 22 targets. ' + + `Minimum target version resolved to Node ${minTargetMajor}.`, + ); + } + + if (inputJson || configJson) { // Enhanced SEA mode — use walker pipeline const marker = buildMarker(configJson, config, inputJson, input); @@ -568,7 +575,7 @@ export async function exec(argv2: string[]) { addition: isConfiguration(input) ? input : undefined, }); } else { - // Simple SEA mode (backward compat: plain .js file or Node < 22) + // Simple SEA mode — plain .js file without package.json await sea(inputFin, { targets, signature: argv.signature, From 6f580b6a91bed5031c2d640008afdcd516c50018 Mon Sep 17 00:00:00 2001 From: robertsLando Date: Tue, 7 Apr 2026 13:55:17 +0200 Subject: [PATCH 11/41] fix: normalize paths for Windows compatibility in SEA bootstrap --- prelude/sea-bootstrap.js | 34 +++++++++++++++++++++++++++++++--- 1 file changed, 31 insertions(+), 3 deletions(-) diff --git a/prelude/sea-bootstrap.js b/prelude/sea-bootstrap.js index dd9780bfa..31d3f32fe 100644 --- a/prelude/sea-bootstrap.js +++ b/prelude/sea-bootstrap.js @@ -126,6 +126,34 @@ var SNAPSHOT_PREFIX = // Mount at the appropriate prefix for the runtime platform virtualFs.mount(SNAPSHOT_PREFIX, { overlay: true }); +// ///////////////////////////////////////////////////////////////// +// PATH NORMALIZATION ////////////////////////////////////////////// +// ///////////////////////////////////////////////////////////////// + +// The manifest always stores paths with POSIX '/' separators so that +// the same blob works regardless of build platform. On Windows we +// must convert them to the native format before handing them to +// Node's module resolver or VFS lookups. +function toPlatformPath(p) { + if (process.platform !== 'win32') return p; + // /snapshot/… → C:\snapshot\… + if (p.startsWith('/snapshot')) { + return 'C:' + p.replace(/\//g, '\\'); + } + return p.replace(/\//g, '\\'); +} + +var entrypoint = toPlatformPath(manifest.entrypoint); + +// Normalise symlink map keys & values so the provider can match them +if (process.platform === 'win32') { + var winSymlinks = {}; + for (var sk in manifest.symlinks) { + winSymlinks[toPlatformPath(sk)] = toPlatformPath(manifest.symlinks[sk]); + } + manifest.symlinks = winSymlinks; +} + // ///////////////////////////////////////////////////////////////// // SHARED PATCHES ////////////////////////////////////////////////// // ///////////////////////////////////////////////////////////////// @@ -140,16 +168,16 @@ function insideSnapshot(f) { shared.patchDlopen(insideSnapshot); // child_process patching (shared with traditional bootstrap) -shared.patchChildProcess(manifest.entrypoint); +shared.patchChildProcess(entrypoint); // process.pkg setup (shared with traditional bootstrap) -shared.setupProcessPkg(manifest.entrypoint); +shared.setupProcessPkg(entrypoint); // ///////////////////////////////////////////////////////////////// // ENTRYPOINT ////////////////////////////////////////////////////// // ///////////////////////////////////////////////////////////////// -process.argv[1] = manifest.entrypoint; +process.argv[1] = entrypoint; Module._cache = Object.create(null); try { process.mainModule = undefined; From 151f25c1d6937a10891afbe3940dc62a2edd700c Mon Sep 17 00:00:00 2001 From: robertsLando Date: Tue, 7 Apr 2026 13:57:58 +0200 Subject: [PATCH 12/41] docs: add technical architecture documentation Detailed comparison of traditional pkg mode vs enhanced SEA mode covering build pipelines, binary formats, runtime bootstraps, VFS provider architecture, shared code, performance, and code protection. Co-Authored-By: Claude Opus 4.6 (1M context) --- docs/ARCHITECTURE.md | 401 +++++++++++++++++++++++++++++++++++++++++++ lib/sea-assets.ts | 23 ++- 2 files changed, 418 insertions(+), 6 deletions(-) create mode 100644 docs/ARCHITECTURE.md diff --git a/docs/ARCHITECTURE.md b/docs/ARCHITECTURE.md new file mode 100644 index 000000000..4b7ff7f52 --- /dev/null +++ b/docs/ARCHITECTURE.md @@ -0,0 +1,401 @@ +# pkg Architecture: Traditional Mode vs Enhanced SEA Mode + +This document describes how `pkg` packages Node.js applications into standalone executables, covering both the traditional binary-patching approach and the new SEA (Single Executable Application) mode with VFS support. + +## Table of Contents + +- [Overview](#overview) +- [Traditional Mode](#traditional-mode) + - [Build Pipeline](#build-pipeline) + - [Binary Format](#binary-format) + - [Runtime Bootstrap](#runtime-bootstrap) +- [Enhanced SEA Mode](#enhanced-sea-mode) + - [Build Pipeline](#sea-build-pipeline) + - [Binary Format](#sea-binary-format) + - [Runtime Bootstrap](#sea-runtime-bootstrap) + - [VFS Provider Architecture](#vfs-provider-architecture) +- [Shared Runtime Code](#shared-runtime-code) +- [Performance Comparison](#performance-comparison) +- [Code Protection Comparison](#code-protection-comparison) +- [When to Use Each Mode](#when-to-use-each-mode) +- [Node.js Ecosystem Dependencies](#nodejs-ecosystem-dependencies) + +--- + +## Overview + +`pkg` supports two packaging strategies, selected via the `--sea` flag: + +``` +pkg . # Traditional mode (default) +pkg . --sea # Enhanced SEA mode (Node >= 22 with package.json) +pkg single-file.js --sea # Simple SEA mode (any single .js file) +``` + +| Aspect | Traditional | Enhanced SEA | Simple SEA | +| ------------- | -------------------- | ------------------- | ------------------- | +| Walker | Yes | Yes (seaMode) | No | +| VFS | Custom binary format | @platformatic/vfs | None | +| Bytecode | V8 compiled | No (source as-is) | No | +| ESM transform | ESM to CJS | No (native ESM) | No | +| Node.js API | Binary patching | Official `node:sea` | Official `node:sea` | +| Min Node | 22 (pkg runtime) | 22 (target) | 20 (target) | + +--- + +## Traditional Mode + +### Build Pipeline + +``` +CLI (lib/index.ts) + │ + ├─ Parse targets (node22-linux-x64, etc.) + ├─ Fetch pre-compiled Node.js binaries (via @yao-pkg/pkg-fetch) + │ + ├─ Walker (lib/walker.ts) + │ ├─ Parse entry file with Babel → find require/import calls + │ ├─ Recursively resolve dependencies (lib/follow.ts, lib/resolver.ts) + │ ├─ Transform ESM → CJS (lib/esm-transformer.ts) + │ ├─ Compile JS to V8 bytecode via fabricator (lib/fabricator.ts) + │ └─ Collect: STORE_BLOB, STORE_CONTENT, STORE_LINKS, STORE_STAT + │ + ├─ Refiner (lib/refiner.ts) + │ ├─ Purge empty top-level directories + │ └─ Denominate paths (strip common prefix) + │ + ├─ Packer (lib/packer.ts) + │ ├─ Serialize file records into "stripes" (snap path + store + data) + │ ├─ Wrap bootstrap.js with injected parameters: + │ │ REQUIRE_COMMON, REQUIRE_SHARED, VIRTUAL_FILESYSTEM, + │ │ DEFAULT_ENTRYPOINT, SYMLINKS, DICT, DOCOMPRESS + │ └─ Return { prelude, entrypoint, stripes } + │ + └─ Producer (lib/producer.ts) + ├─ Open Node.js binary + ├─ Find placeholders (PAYLOAD_POSITION, PAYLOAD_SIZE, BAKERY, etc.) + ├─ Stream stripes into payload section + ├─ Apply compression (Brotli/GZip) per stripe + ├─ Build VFS dictionary for path compression + ├─ Inject byte offsets into placeholders + └─ Write final executable +``` + +### Binary Format + +The traditional executable has this layout: + +``` +┌────────────────────────────────┐ +│ Node.js binary (unmodified) │ ← Original executable +│ with placeholder markers: │ +│ // BAKERY // │ ← Node.js CLI options +│ // PAYLOAD_POSITION // │ ← Byte offset of payload +│ // PAYLOAD_SIZE // │ ← Byte length of payload +│ // PRELUDE_POSITION // │ ← Byte offset of prelude +│ // PRELUDE_SIZE // │ ← Byte length of prelude +├────────────────────────────────┤ +│ Payload section: │ +│ ┌────────────────────────┐ │ +│ │ Prelude (bootstrap.js) │ │ ← Runtime bootstrap code +│ ├────────────────────────┤ │ +│ │ Stripe: /app/index.js │ │ ← V8 bytecode (STORE_BLOB) +│ │ Stripe: /app/lib.js │ │ ← Source code (STORE_CONTENT) +│ │ Stripe: /app/data.json │ │ ← Asset content +│ │ Stripe: /app/ │ │ ← Dir listing (STORE_LINKS) +│ │ ... │ │ +│ ├────────────────────────┤ │ +│ │ VFS dictionary (JSON) │ │ ← Maps paths → [offset, size] +│ └────────────────────────┘ │ +└────────────────────────────────┘ +``` + +Each file is stored with one or more store types: + +| Store | Value | Content | Purpose | +| --------------- | ----- | ----------------- | ----------------------------------------------- | +| `STORE_BLOB` | 0 | V8 bytecode | Compiled JS (source can be stripped) | +| `STORE_CONTENT` | 1 | Raw source/binary | JS source, JSON, assets, .node files | +| `STORE_LINKS` | 2 | JSON array | Directory entry names for `readdir` | +| `STORE_STAT` | 3 | JSON object | File metadata (size, mode, isFile, isDirectory) | + +### Runtime Bootstrap + +`prelude/bootstrap.js` (1970 lines) executes before user code. It: + +1. **Sets up entrypoint** — Reads `DEFAULT_ENTRYPOINT` from injected parameters, sets `process.argv[1]` +2. **Initializes VFS** — Builds in-memory lookup from `VIRTUAL_FILESYSTEM` dictionary with optional path compression via `DICT` +3. **Patches `fs` module** — Intercepts 20+ `fs` functions (`readFileSync`, `readFile`, `statSync`, `stat`, `readdirSync`, `readdir`, `existsSync`, `exists`, `accessSync`, `access`, `realpathSync`, `realpath`, `createReadStream`, `open`, `read`, `close`, etc.). Each patched function checks if the path is inside `/snapshot/` — if yes, reads from the VFS payload; if no, falls through to the real `fs` +4. **Patches `Module` system** — Custom `_resolveFilename` and `_compile` that load modules from the VFS. Bytecode modules are executed via `vm.Script` with `cachedData` (the V8 bytecode) and `sourceless: true` +5. **Patches `child_process`** — Via `REQUIRE_SHARED.patchChildProcess()`. Rewrites spawn/exec calls so that spawning `node` or the entrypoint correctly uses `process.execPath` +6. **Patches `process.dlopen`** — Via `REQUIRE_SHARED.patchDlopen()`. Extracts `.node` files from VFS to `~/.cache/pkg//` before loading +7. **Sets up `process.pkg`** — Via `REQUIRE_SHARED.setupProcessPkg()`. Provides `process.pkg.entrypoint`, `process.pkg.path.resolve()`, `process.pkg.mount()` + +The payload is read at runtime via file descriptor operations on the executable itself: + +```javascript +// bootstrap.js — reads payload from the running executable +fs.readSync(EXECPATH_FD, buffer, offset, length, PAYLOAD_POSITION + position); +``` + +--- + +## Enhanced SEA Mode + +### SEA Build Pipeline + +``` +CLI (lib/index.ts) + │ + ├─ Detect: has package.json + target Node >= 22 → enhanced mode + │ + ├─ Walker (lib/walker.ts, seaMode: true) + │ ├─ Parse entry file with Babel → find require/import calls + │ ├─ Recursively resolve dependencies + │ ├─ SKIP: ESM → CJS transformation (files stay native ESM) + │ ├─ SKIP: V8 bytecode compilation (no fabricator) + │ └─ Collect: STORE_CONTENT only (+ STORE_LINKS, STORE_STAT) + │ + ├─ Refiner (lib/refiner.ts) + │ └─ Same as traditional (path compression, empty dir pruning) + │ + ├─ SEA Asset Generator (lib/sea-assets.ts) + │ ├─ Map each STORE_CONTENT → SEA asset entry (snap_path → disk_path) + │ ├─ Build __pkg_manifest__.json: + │ │ { entrypoint, directories, stats, symlinks } + │ └─ Write modified files (patches) to temp dir + │ + └─ SEA Orchestrator (lib/sea.ts → seaEnhanced()) + ├─ Copy pre-bundled sea-bootstrap.bundle.js to tmpDir + ├─ Build sea-config.json: + │ { main, output, assets: { __pkg_manifest__, ...files } } + ├─ Generate blob: + │ Node 25.5+: node --build-sea sea-config.json + │ Node 22-24: node --experimental-sea-config sea-config.json + ├─ For each target: + │ 1. Download Node.js binary (getNodejsExecutable) + │ 2. Inject blob via postject (bake) + │ 3. Sign macOS if needed (signMacOSIfNeeded) + └─ Cleanup tmpDir +``` + +### SEA Binary Format + +The SEA executable uses the official Node.js resource format: + +``` +┌──────────────────────────────────┐ +│ Node.js binary │ +│ with NODE_SEA_FUSE activated │ ← Sentinel fuse flipped +├──────────────────────────────────┤ +│ NODE_SEA_BLOB resource: │ ← Injected via postject +│ ┌──────────────────────────┐ │ +│ │ main: sea-bootstrap.js │ │ ← Bundled bootstrap + VFS polyfill +│ ├──────────────────────────┤ │ +│ │ Asset: __pkg_manifest__ │ │ ← JSON manifest (dirs, stats, symlinks) +│ │ Asset: /app/index.js │ │ ← Source code (plaintext) +│ │ Asset: /app/lib/util.js │ │ ← Source code +│ │ Asset: /app/config.json │ │ ← JSON asset +│ │ ... │ │ +│ └──────────────────────────┘ │ +└──────────────────────────────────┘ +``` + +The resource is embedded using OS-native formats: + +- **Linux**: ELF notes section +- **Windows**: PE `.rsrc` section +- **macOS**: Mach-O `NODE_SEA` segment + +### SEA Runtime Bootstrap + +`prelude/sea-bootstrap.js` (187 lines, bundled with `@platformatic/vfs` into 151kb `sea-bootstrap.bundle.js`) executes as the SEA `main` entry: + +1. **Load manifest** — `JSON.parse(sea.getAsset('__pkg_manifest__', 'utf8'))` +2. **Initialize VFS** — Creates `SEAProvider` (extends `MemoryProvider`), mounts at `/snapshot` with overlay mode +3. **Normalize paths** — On Windows, converts POSIX `/snapshot/...` paths in manifest to `C:\snapshot\...` +4. **Apply shared patches** — Calls `patchDlopen()`, `patchChildProcess()`, `setupProcessPkg()` from `bootstrap-shared.js` +5. **Run entrypoint** — Sets `process.argv[1]`, calls `Module.runMain()` + +The VFS polyfill (`@platformatic/vfs`) handles all `fs` and `fs/promises` patching automatically when `mount()` is called — intercepting 164+ functions including `readFile`, `readFileSync`, `stat`, `readdir`, `access`, `realpath`, `createReadStream`, `watch`, `open`, and their promise-based equivalents. It also hooks into the Node.js module resolution system for `require()` and `import`. + +### VFS Provider Architecture + +``` +┌─────────────────────────────────────────────────┐ +│ User code: fs.readFileSync('/snapshot/app/x.js') │ +└──────────────────────┬──────────────────────────┘ + │ + ┌─────────────▼──────────────┐ + │ @platformatic/vfs │ + │ (mounted at /snapshot, │ + │ overlay: true) │ + │ │ + │ Strips prefix: /app/x.js │ + │ Calls provider method │ + └─────────────┬──────────────┘ + │ + ┌─────────────▼──────────────┐ + │ SEAProvider │ + │ extends MemoryProvider │ + │ │ + │ readFileSync('/app/x.js') │ + │ → _ensureLoaded() │ + │ → sea.getRawAsset(key) │ ← Zero-copy from executable memory + │ → super.writeFileSync() │ ← Cache in MemoryProvider + │ → super.readFileSync() │ ← Return cached content + └────────────────────────────┘ +``` + +The `SEAProvider` implements lazy loading: + +| Method | Behavior | +| -------------------- | ---------------------------------------------------------------------------------------- | +| `readFileSync(path)` | Resolve symlinks, lazy-load from SEA asset on first access, delegate to `MemoryProvider` | +| `statSync(path)` | Return metadata from manifest; trigger lazy-load for files | +| `readdirSync(path)` | Return directory entries from manifest | +| `existsSync(path)` | Check manifest symlinks and stats | +| `readlinkSync(path)` | Return symlink target from manifest | + +Assets are loaded lazily via `sea.getRawAsset(key)` which returns a zero-copy `ArrayBuffer` reference to the executable's memory-mapped region. The buffer is copied once into the `MemoryProvider` cache on first access. + +--- + +## Shared Runtime Code + +`prelude/bootstrap-shared.js` (255 lines) contains runtime patches used by both bootstraps: + +### Injection Mechanisms + +- **Traditional bootstrap**: The packer (`lib/packer.ts`) wraps the bootstrap in an IIFE that receives `REQUIRE_SHARED` as a parameter. The shared module is executed as an inline IIFE: + + ```javascript + (function () { + var module = { exports: {} }; + /* bootstrap-shared.js content */ + return module.exports; + })(); + ``` + +- **SEA bootstrap**: `require('./bootstrap-shared')` is resolved at build time by esbuild and bundled into `sea-bootstrap.bundle.js`. + +### Shared Functions + +**`patchDlopen(insideSnapshot)`** — Patches `process.dlopen` to extract native `.node` addons from the virtual filesystem to a cache directory before loading: + +``` +.node file requested → inside snapshot? + ├─ No → call original dlopen + └─ Yes → read content via fs.readFileSync (intercepted by VFS) + → SHA256 hash → cache dir: ~/.cache/pkg// + → in node_modules? → fs.cpSync entire package folder (fix #1075) + → standalone? → fs.copyFileSync single file + → call original dlopen with extracted path +``` + +**`patchChildProcess(entrypoint)`** — Wraps all 6 `child_process` methods (`spawn`, `spawnSync`, `execFile`, `execFileSync`, `exec`, `execSync`) to: + +- Set `PKG_EXECPATH` env var so child processes can detect they were spawned from a packaged app +- Replace references to `node`, `process.argv[0]`, or the entrypoint with `process.execPath` (the actual executable) + +**`setupProcessPkg(entrypoint)`** — Creates the `process.pkg` compatibility object with `entrypoint`, `defaultEntrypoint`, and `path.resolve()`. + +--- + +## Performance Comparison + +| Aspect | Traditional `pkg` | Enhanced SEA | +| -------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------ | +| **Startup time** | V8 bytecode loads faster than parsing source — bytecode is pre-compiled. `vm.Script` with `cachedData` skips the parsing phase | `useCodeCache: true` provides similar optimization. Without it, every launch re-parses source from scratch | +| **Memory footprint** | Payload accessed via file descriptor reads on demand at computed offsets. Files loaded only when accessed | `sea.getRawAsset()` returns a zero-copy `ArrayBuffer` reference to the executable's mapped memory. With lazy `SEAProvider`, only accessed files are buffered | +| **Executable size** | Brotli/GZip compression reduces payload by 60-80%. Dictionary path compression adds 5-15% reduction | SEA assets are stored uncompressed. Executable size will be larger for the same project | +| **Build time** | V8 bytecode compilation spawns a Node.js process per file via fabricator. Cross-arch bytecode needs QEMU/Rosetta. Expensive for large projects | No bytecode step. Pipeline: walk deps, write assets, generate blob, inject. Significantly faster | +| **Module loading** | Custom `require` implementation in bootstrap. Each module loaded from VFS via binary offset reads. Synchronous only | VFS polyfill patches `require`/`import` at module resolution level. 164+ fs functions intercepted. ESM module hooks supported natively | +| **Native addons** | Extracted to `~/.cache/pkg//` on first load, SHA256-verified, persisted across runs | Same extraction strategy via shared `patchDlopen()`. Uses `fs.cpSync` for package folder copying | + +--- + +## Code Protection Comparison + +| Aspect | Traditional `pkg` | Enhanced SEA | +| ----------------------- | ------------------------------------------------------------------------------------------------------------------------ | ---------------------------------------------------------------------------------------------------------------------------------------- | +| **Source code storage** | Can be fully stripped — `STORE_BLOB` with `sourceless: true` stores only V8 bytecode, no source recoverable | Source code stored as SEA assets in plaintext. `useCodeCache: true` adds a code cache alongside source but does NOT strip it | +| **Reverse engineering** | V8 bytecode requires specialized tools (`v8-decompile`) to reverse. Not trivially readable | Standard text assets extractable from executable resource section using `readelf`/`xxd` or by searching for the `NODE_SEA_FUSE` sentinel | +| **Binary format** | Custom VFS format with offset-based access, optional Brotli/GZip compression, base36 dictionary path compression | Standard OS resource format (PE `.rsrc`, ELF notes, Mach-O segments) — well-documented, easier to parse | +| **Payload location** | Custom byte offsets injected via placeholder replacement. Requires understanding pkg's specific binary layout to extract | Standard `NODE_SEA_BLOB` resource name. `postject` uses OS-native resource embedding | +| **Runtime access** | Accessed via file descriptor reads at computed offsets. No standard tooling to extract | Accessed via `sea.getAsset(key)` — official Node.js API, assets are first-class | + +**Key takeaway**: Traditional `pkg` offers significantly stronger code protection through V8 bytecode compilation with source stripping. SEA mode stores source code in plaintext within the executable. This is a fundamental limitation of the Node.js SEA design — there is no `sourceless` equivalent. + +For users who require code protection with SEA mode: + +1. Pre-process code through an obfuscator (e.g., `javascript-obfuscator`) before packaging +2. Use `useCodeCache: true` for marginal protection (source still present but code cache adds a layer) +3. Use traditional `pkg` mode instead + +--- + +## When to Use Each Mode + +| Use Case | Recommended Mode | +| ----------------------------------------------- | ----------------------------------------------- | +| Code protection / IP-sensitive distribution | Traditional `pkg` (bytecode + source stripping) | +| Fast build iteration during development | Enhanced SEA | +| ESM-native projects | Enhanced SEA (no CJS transform needed) | +| Minimum executable size | Traditional `pkg` (compression support) | +| Maximum Node.js compatibility / future-proofing | Enhanced SEA (uses official Node.js APIs) | +| Cross-platform builds from single host | Traditional `pkg` (platform-independent VFS) | +| Simple single-file scripts | Simple SEA (no walker overhead) | + +--- + +## Node.js Ecosystem Dependencies + +### Current (April 2026) + +| Dependency | Purpose | Status | +| ---------------------- | ------------------------------------------------------------- | -------------------------------------------------------------------------------------- | +| `node:sea` API | Asset storage and retrieval in SEA executables | Stable, Node 20+ | +| `@platformatic/vfs` | VFS polyfill — patches `fs`, `fs/promises`, and module loader | Published, Node 22+, maintained by Matteo Collina | +| `postject` | Injects `NODE_SEA_BLOB` resource into executables | Stable, used by Node.js project | +| `--build-sea` flag | Single-step SEA blob generation | Node 25.5+ | +| `mainFormat: "module"` | ESM entry point in SEA config | Node 25.7+ (merged via [nodejs/node#61813](https://github.com/nodejs/node/pull/61813)) | + +### Future + +| Dependency | Purpose | Status | +| ---------- | --------------------------------- | ----------------------------------------------------------------------------------- | +| `node:vfs` | Native VFS module in Node.js core | Open PR [nodejs/node#61478](https://github.com/nodejs/node/pull/61478), 8 approvals | + +When `node:vfs` lands in Node.js core, `@platformatic/vfs` will be deprecated. The SEA bootstrap already includes a migration path: + +```javascript +var vfsModule; +try { + vfsModule = require('node:vfs'); // native, when available +} catch (_) { + vfsModule = require('@platformatic/vfs'); // polyfill fallback +} +``` + +With `node:vfs` and `"useVfs": true` in the SEA config, assets will be auto-mounted and the bootstrap will simplify significantly — the VFS provider and manual mounting will no longer be needed. + +--- + +## File Reference + +| File | Lines | Purpose | +| ----------------------------- | ----- | ----------------------------------------------------------- | +| `prelude/bootstrap.js` | ~1970 | Traditional runtime bootstrap (fs/module/process patching) | +| `prelude/bootstrap-shared.js` | ~255 | Shared runtime patches (dlopen, child_process, process.pkg) | +| `prelude/sea-bootstrap.js` | ~187 | SEA runtime bootstrap (VFS setup, lazy SEAProvider) | +| `lib/index.ts` | ~726 | CLI entry point, mode routing | +| `lib/walker.ts` | ~1304 | Dependency walker (with seaMode support) | +| `lib/packer.ts` | ~194 | Serializes walker output into stripes + prelude wrapper | +| `lib/producer.ts` | ~601 | Assembles final binary (payload injection, compression) | +| `lib/sea.ts` | ~561 | SEA orchestrator (seaEnhanced + simple sea) | +| `lib/sea-assets.ts` | ~105 | Generates SEA asset map + manifest JSON | +| `lib/fabricator.ts` | ~173 | V8 bytecode compilation (traditional mode only) | +| `lib/esm-transformer.ts` | ~434 | ESM to CJS transformation (traditional mode only) | +| `lib/refiner.ts` | ~110 | Path compression, empty directory pruning | +| `lib/common.ts` | ~369 | Path normalization, snapshot helpers, store constants | diff --git a/lib/sea-assets.ts b/lib/sea-assets.ts index 0905cf7fd..b1e2f0907 100644 --- a/lib/sea-assets.ts +++ b/lib/sea-assets.ts @@ -19,6 +19,18 @@ export interface SeaAssetsResult { manifestPath: string; } +// Normalize a refiner path to a platform-independent POSIX key. +// On Windows the refiner keeps the drive letter (e.g. 'D:\foo\bar.js'); +// we strip it and convert separators so all manifest/asset keys are POSIX +// (e.g. '/foo/bar.js') — the bootstrap normalises VFS-received paths to +// the same format before lookup. +function toPosixKey(p: string): string { + if (process.platform === 'win32') { + return p.slice(2).replace(/\\/g, '/'); + } + return p; +} + /** * Transform walker/refiner output into SEA-compatible asset map and manifest. * @@ -56,6 +68,7 @@ export async function generateSeaAssets( for (const snap in records) { if (!records[snap]) continue; const record = records[snap]; + const key = toPosixKey(snap); // Map file content to SEA asset if (record[STORE_CONTENT]) { @@ -73,24 +86,22 @@ export async function generateSeaAssets( ? Buffer.from(record.body) : record.body; await writeFile(tempPath, content); - assets[snap] = tempPath; + assets[key] = tempPath; } else { // Unmodified file — point to source on disk - assets[snap] = record.file; + assets[key] = record.file; } } // Collect directory entries if (record[STORE_LINKS]) { - manifest.directories[snap] = [ - ...new Set(record[STORE_LINKS] as string[]), - ]; + manifest.directories[key] = [...new Set(record[STORE_LINKS] as string[])]; } // Collect stat metadata if (record[STORE_STAT]) { const stat = record[STORE_STAT]; - manifest.stats[snap] = { + manifest.stats[key] = { size: stat.size ?? 0, isFile: Boolean(stat.isFileValue), isDirectory: Boolean(stat.isDirectoryValue), From e49e17e6bec109c3407de5e40b522f8813a2fd95 Mon Sep 17 00:00:00 2001 From: robertsLando Date: Tue, 7 Apr 2026 14:08:46 +0200 Subject: [PATCH 13/41] fix: normalize all SEA provider paths to POSIX for Windows compatibility The SEA manifest uses POSIX keys but VFS passes platform-native paths on Windows. Normalize all paths to POSIX in the SEAProvider before manifest lookups, SEA asset lookups, and MemoryProvider storage. Remove the now- redundant symlink normalization block. Co-Authored-By: Claude Opus 4.6 (1M context) --- prelude/sea-bootstrap.js | 73 +++++++++++++++++++++------------------- 1 file changed, 39 insertions(+), 34 deletions(-) diff --git a/prelude/sea-bootstrap.js b/prelude/sea-bootstrap.js index 31d3f32fe..d1c3ad15c 100644 --- a/prelude/sea-bootstrap.js +++ b/prelude/sea-bootstrap.js @@ -44,72 +44,86 @@ try { var VirtualFileSystem = vfsModule.VirtualFileSystem; var MemoryProvider = vfsModule.MemoryProvider; +// Manifest keys are always POSIX (forward slashes, no drive letter). +// VFS may pass platform-native paths after stripping the mount prefix, +// so normalise before any manifest or SEA-asset lookup. +function toManifestKey(p) { + return p.replace(/\\/g, '/'); +} + // Custom provider that reads from SEA assets lazily. // Extends MemoryProvider for directory/stat support while lazily populating // file content from SEA assets on first access. +// +// All paths are normalised to POSIX (via toManifestKey) before use, so +// manifest lookups, SEA asset lookups, and MemoryProvider storage all use +// the same key format regardless of platform. class SEAProvider extends MemoryProvider { constructor(seaManifest) { super(); this._manifest = seaManifest; this._loaded = new Set(); - // Pre-populate directory structure from manifest + // Pre-populate directory structure from manifest (keys are already POSIX) for (var dir of Object.keys(seaManifest.directories)) { super.mkdirSync(dir, { recursive: true }); } } - _resolveSymlink(filePath) { - var target = this._manifest.symlinks[filePath]; - return target || filePath; + _resolveSymlink(p) { + var target = this._manifest.symlinks[p]; + return target || p; } readFileSync(filePath, options) { - filePath = this._resolveSymlink(filePath); - this._ensureLoaded(filePath); - return super.readFileSync(filePath, options); + var p = this._resolveSymlink(toManifestKey(filePath)); + this._ensureLoaded(p); + return super.readFileSync(p, options); } readlinkSync(filePath) { - var target = this._manifest.symlinks[filePath]; + var p = toManifestKey(filePath); + var target = this._manifest.symlinks[p]; if (target) return target; - return super.readlinkSync(filePath); + return super.readlinkSync(p); } - _ensureLoaded(filePath) { - if (this._loaded.has(filePath)) return; + _ensureLoaded(p) { + if (this._loaded.has(p)) return; try { - var raw = sea.getRawAsset(filePath); + var raw = sea.getRawAsset(p); // getRawAsset returns an ArrayBuffer — Buffer.from copies the data - super.writeFileSync(filePath, Buffer.from(raw)); - this._loaded.add(filePath); + super.writeFileSync(p, Buffer.from(raw)); + this._loaded.add(p); } catch (_) { // Not a SEA asset — let super handle the ENOENT } } statSync(filePath) { - filePath = this._resolveSymlink(filePath); - var meta = this._manifest.stats[filePath]; - if (meta && meta.isFile && !this._loaded.has(filePath)) { - this._ensureLoaded(filePath); + var p = this._resolveSymlink(toManifestKey(filePath)); + var meta = this._manifest.stats[p]; + if (meta && meta.isFile && !this._loaded.has(p)) { + this._ensureLoaded(p); } - return super.statSync(filePath); + return super.statSync(p); } readdirSync(dirPath) { - var entries = this._manifest.directories[dirPath]; + var p = toManifestKey(dirPath); + var entries = this._manifest.directories[p]; if (entries) return entries.slice(); - return super.readdirSync(dirPath); + return super.readdirSync(p); } existsSync(filePath) { - if (filePath in this._manifest.symlinks) return true; - filePath = this._resolveSymlink(filePath); - if (filePath in this._manifest.stats) return true; + var p = toManifestKey(filePath); + if (p in this._manifest.symlinks) return true; + p = this._resolveSymlink(p); + if (p in this._manifest.stats) return true; // Fall through to super for directories created via mkdirSync try { - super.statSync(filePath); + super.statSync(p); return true; } catch (_) { return false; @@ -145,15 +159,6 @@ function toPlatformPath(p) { var entrypoint = toPlatformPath(manifest.entrypoint); -// Normalise symlink map keys & values so the provider can match them -if (process.platform === 'win32') { - var winSymlinks = {}; - for (var sk in manifest.symlinks) { - winSymlinks[toPlatformPath(sk)] = toPlatformPath(manifest.symlinks[sk]); - } - manifest.symlinks = winSymlinks; -} - // ///////////////////////////////////////////////////////////////// // SHARED PATCHES ////////////////////////////////////////////////// // ///////////////////////////////////////////////////////////////// From 4d0ef4a576dabb0cf9e5fa220ca438ebfb0540bd Mon Sep 17 00:00:00 2001 From: robertsLando Date: Tue, 7 Apr 2026 14:10:40 +0200 Subject: [PATCH 14/41] docs: mention --no-bytecode flag in architecture comparison Explains that traditional mode with --no-bytecode produces a similar code protection profile to enhanced SEA (plaintext source), while still retaining compression and custom VFS format advantages. Co-Authored-By: Claude Opus 4.6 (1M context) --- docs/ARCHITECTURE.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/docs/ARCHITECTURE.md b/docs/ARCHITECTURE.md index 4b7ff7f52..320dc2c90 100644 --- a/docs/ARCHITECTURE.md +++ b/docs/ARCHITECTURE.md @@ -313,6 +313,10 @@ Assets are loaded lazily via `sea.getRawAsset(key)` which returns a zero-copy `A | **Module loading** | Custom `require` implementation in bootstrap. Each module loaded from VFS via binary offset reads. Synchronous only | VFS polyfill patches `require`/`import` at module resolution level. 164+ fs functions intercepted. ESM module hooks supported natively | | **Native addons** | Extracted to `~/.cache/pkg//` on first load, SHA256-verified, persisted across runs | Same extraction strategy via shared `patchDlopen()`. Uses `fs.cpSync` for package folder copying | +### Note on `--no-bytecode` + +Traditional mode supports a `--no-bytecode` flag that skips V8 bytecode compilation and includes source files as plain JavaScript. When used, the traditional mode's code protection profile becomes similar to enhanced SEA — source code is stored in plaintext inside the executable. However, the traditional binary format still provides compression (Brotli/GZip) and a custom VFS layout, making extraction less straightforward than with SEA's standard resource format. The `--no-bytecode` flag is useful for debugging, faster builds, or when bytecode cross-compilation is not possible (e.g., no QEMU available for cross-arch targets). + --- ## Code Protection Comparison From 3399b6653b2f99ae09505cefb3eb4bed27c38d63 Mon Sep 17 00:00:00 2001 From: robertsLando Date: Tue, 7 Apr 2026 14:30:01 +0200 Subject: [PATCH 15/41] fix: address Copilot review feedback for SEA enhanced mode - Replace fs.cpSync with recursive copy using patched fs primitives so native addon extraction works through VFS in SEA mode - Use toPosixKey instead of snapshotify for symlink manifest keys to match the key format used by directories/stats/assets - Make assertSeaOutput log explicit skip on unsupported platforms instead of silently passing Co-Authored-By: Claude Opus 4.6 (1M context) --- lib/sea-assets.ts | 6 ++++-- prelude/bootstrap-shared.js | 18 +++++++++++++++++- test/utils.js | 14 +++++++++----- 3 files changed, 30 insertions(+), 8 deletions(-) diff --git a/lib/sea-assets.ts b/lib/sea-assets.ts index b1e2f0907..8867125e0 100644 --- a/lib/sea-assets.ts +++ b/lib/sea-assets.ts @@ -49,10 +49,12 @@ export async function generateSeaAssets( ): Promise { const assets: Record = {}; - // Normalize symlink paths to use POSIX separators, matching other manifest paths + // Normalize symlink paths to use the same refiner-style POSIX keys as + // directories/stats/assets. Do not add the /snapshot prefix because the + // VFS provider receives paths after the mount prefix is stripped. const normalizedSymlinks: Record = {}; for (const src in symLinks) { - normalizedSymlinks[snapshotify(src, '/')] = snapshotify(symLinks[src], '/'); + normalizedSymlinks[toPosixKey(src)] = toPosixKey(symLinks[src]); } const manifest: SeaManifest = { diff --git a/prelude/bootstrap-shared.js b/prelude/bootstrap-shared.js index 371b5cdf0..8b570383c 100644 --- a/prelude/bootstrap-shared.js +++ b/prelude/bootstrap-shared.js @@ -58,7 +58,23 @@ function patchDlopen(insideSnapshot) { var destFolder = path.join(tmpFolder, path.basename(modulePkgFolder)); if (!fs.existsSync(destFolder)) { - fs.cpSync(modulePkgFolder, destFolder, { recursive: true }); + // Use patched fs primitives instead of fs.cpSync which may not + // be routed through the VFS in SEA mode. + (function cpRecursive(src, dest) { + var st = fs.statSync(src); + if (st.isDirectory()) { + fs.mkdirSync(dest, { recursive: true }); + var entries = fs.readdirSync(src); + for (var i = 0; i < entries.length; i++) { + cpRecursive( + path.join(src, entries[i]), + path.join(dest, entries[i]), + ); + } + } else { + fs.copyFileSync(src, dest); + } + })(modulePkgFolder, destFolder); } newPath = path.join(tmpFolder, modulePackagePath, moduleBaseName); } else { diff --git a/test/utils.js b/test/utils.js index 9305d5496..c0c9a0c3c 100644 --- a/test/utils.js +++ b/test/utils.js @@ -288,11 +288,15 @@ module.exports.shouldSkipPnpm = function () { module.exports.assertSeaOutput = function (testName, expected) { const platformSuffix = { linux: 'linux', darwin: 'macos', win32: 'win.exe' }; const suffix = platformSuffix[process.platform]; - if (suffix) { - assert.equal( - module.exports.spawn.sync(`./${testName}-${suffix}`, []), - expected, - 'Output matches', + if (!suffix) { + console.log( + ` Skipping SEA assertion: unsupported platform '${process.platform}'`, ); + return; } + assert.equal( + module.exports.spawn.sync(`./${testName}-${suffix}`, []), + expected, + 'Output matches', + ); }; From f3d47fe00dd901c9f9d96476cc61a2c1f0228d99 Mon Sep 17 00:00:00 2001 From: robertsLando Date: Tue, 7 Apr 2026 14:44:36 +0200 Subject: [PATCH 16/41] feat: add DEBUG_PKG diagnostics to SEA mode, deduplicate diagnostic code Move VFS tree dump and fs call tracing from prelude/diagnostic.js into bootstrap-shared.js as installDiagnostic(). Both bootstraps now share the same diagnostic implementation. Security: diagnostics are only available when built with --debug / -d. In SEA mode this is controlled via manifest.debug flag set at build time; without it, installDiagnostic is never called. - Delete prelude/diagnostic.js (replaced by shared installDiagnostic) - Packer injects small DICT-dump snippet + shared call when --debug - SEA bootstrap gates on manifest.debug before calling installDiagnostic - Fix assertSeaNodeVersion: restore check to Node >= 20 (simple SEA) - Fix withSeaTmpDir: restore tmpDir cleanup (was commented out) - Update architecture docs with diagnostic usage Co-Authored-By: Claude Opus 4.6 (1M context) --- docs/ARCHITECTURE.md | 25 ++++++ lib/packer.ts | 16 +++- lib/sea-assets.ts | 3 + lib/sea.ts | 5 +- prelude/bootstrap-shared.js | 151 ++++++++++++++++++++++++++++++++++++ prelude/diagnostic.js | 147 ----------------------------------- prelude/sea-bootstrap.js | 10 +++ 7 files changed, 204 insertions(+), 153 deletions(-) delete mode 100644 prelude/diagnostic.js diff --git a/docs/ARCHITECTURE.md b/docs/ARCHITECTURE.md index 320dc2c90..24faca49e 100644 --- a/docs/ARCHITECTURE.md +++ b/docs/ARCHITECTURE.md @@ -300,6 +300,31 @@ Assets are loaded lazily via `sea.getRawAsset(key)` which returns a zero-copy `A **`setupProcessPkg(entrypoint)`** — Creates the `process.pkg` compatibility object with `entrypoint`, `defaultEntrypoint`, and `path.resolve()`. +**`installDiagnostic(snapshotPrefix)`** — Installs runtime diagnostics triggered by the `DEBUG_PKG` environment variable. Available in both traditional and SEA modes, but **only when the binary was built with `--debug` / `-d`** (the diagnostic code is not included in release builds for security — it would expose the VFS tree contents). + +| Env Var | Behavior | +| ------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | +| `DEBUG_PKG=1` | Dumps the virtual file system tree with file sizes, flags oversized files (default threshold: 5MB per file, 10MB per folder, configurable via `SIZE_LIMIT_PKG` / `FOLDER_LIMIT_PKG`) | +| `DEBUG_PKG=2` | All of the above, plus wraps every `fs` and `fs.promises` method with `console.log` tracing (shows function name and string arguments for each call) | + +Build and run with diagnostics: + +```bash +# Build with debug enabled +pkg . --debug # traditional mode +pkg . --sea --debug # SEA mode + +# Run with diagnostics (only works if built with --debug) +DEBUG_PKG=1 ./my-packaged-app # dump VFS tree +DEBUG_PKG=2 ./my-packaged-app # dump VFS tree + trace all fs calls +SIZE_LIMIT_PKG=1048576 DEBUG_PKG=1 ./my-packaged-app # flag files > 1MB +``` + +**How it works per mode:** + +- **Traditional mode**: The packer injects `diagnostic.js` into the prelude only when `log.debugMode` is true. This code runs at startup and checks `DEBUG_PKG`. +- **SEA mode**: The `--debug` flag sets `manifest.debug: true` in the SEA manifest at build time. The bootstrap checks this field and only calls `installDiagnostic` when it is set. Without `--debug`, the diagnostic code is present in the bundle but never executed. + --- ## Performance Comparison diff --git a/lib/packer.ts b/lib/packer.ts index d3fbfcca7..598d68817 100644 --- a/lib/packer.ts +++ b/lib/packer.ts @@ -30,10 +30,18 @@ const sharedText = readFileSync( 'utf8', ); -const diagnosticText = readFileSync( - require.resolve('../prelude/diagnostic.js'), - 'utf8', -); +// When --debug is used, inject a small snippet that calls the shared +// diagnostic + dumps the DICT path compression map (traditional-mode only). +const diagnosticText = ` +(function() { + if (process.env.DEBUG_PKG === '2') { + console.log('------------------------------- path dictionary'); + console.log(Object.entries(DICT)); + } + var snapshotPrefix = process.platform === 'win32' ? 'C:\\\\snapshot' : '/snapshot'; + REQUIRE_SHARED.installDiagnostic(snapshotPrefix); +})(); +`; function itemsToText(items: T[]) { const len = items.length; diff --git a/lib/sea-assets.ts b/lib/sea-assets.ts index 8867125e0..31a11e41f 100644 --- a/lib/sea-assets.ts +++ b/lib/sea-assets.ts @@ -12,6 +12,7 @@ export interface SeaManifest { { size: number; isFile: boolean; isDirectory: boolean } >; symlinks: Record; + debug?: boolean; } export interface SeaAssetsResult { @@ -46,6 +47,7 @@ export async function generateSeaAssets( entrypoint: string, symLinks: SymLinks, tmpDir: string, + options?: { debug?: boolean }, ): Promise { const assets: Record = {}; @@ -63,6 +65,7 @@ export async function generateSeaAssets( directories: {}, stats: {}, symlinks: normalizedSymlinks, + ...(options?.debug ? { debug: true } : {}), }; let modifiedFileCount = 0; diff --git a/lib/sea.ts b/lib/sea.ts index ae5802e3e..5ad7ae15b 100644 --- a/lib/sea.ts +++ b/lib/sea.ts @@ -405,9 +405,9 @@ async function withSeaTmpDir( /** Validate that the host Node.js version supports SEA */ function assertSeaNodeVersion() { const nodeMajor = parseInt(process.version.slice(1).split('.')[0], 10); - if (nodeMajor < 22) { + if (nodeMajor < 20) { throw new Error( - `SEA support requires at least node v22.0.0, actual node version is ${process.version}`, + `SEA support requires at least node v20.0.0, actual node version is ${process.version}`, ); } return nodeMajor; @@ -462,6 +462,7 @@ export async function seaEnhanced( refinedEntry, symLinks, tmpDir, + { debug: log.debugMode }, ); // Copy bundled bootstrap diff --git a/prelude/bootstrap-shared.js b/prelude/bootstrap-shared.js index 8b570383c..ae10391ab 100644 --- a/prelude/bootstrap-shared.js +++ b/prelude/bootstrap-shared.js @@ -264,8 +264,159 @@ function setupProcessPkg(entrypoint) { }; } +// ///////////////////////////////////////////////////////////////// +// RUNTIME DIAGNOSTICS ///////////////////////////////////////////// +// ///////////////////////////////////////////////////////////////// + +function humanSize(bytes) { + var sizes = ['Bytes', 'KB', 'MB', 'GB', 'TB']; + + if (bytes === 0) return 'n/a'; + + var i = Math.floor(Math.log(bytes) / Math.log(1024)); + + if (i === 0) return bytes + ' ' + sizes[i]; + + return (bytes / Math.pow(1024, i)).toFixed(1) + ' ' + sizes[i]; +} + +/** + * Install runtime diagnostics triggered by the DEBUG_PKG environment + * variable. Works identically in both traditional and SEA modes. + * + * DEBUG_PKG=1 — dump the virtual file system tree and oversized files + * DEBUG_PKG=2 — also wrap every fs/fs.promises call with console.log + * + * @param {string} snapshotPrefix The snapshot mount prefix ('/snapshot' or 'C:\\snapshot'). + */ +function installDiagnostic(snapshotPrefix) { + if (!process.env.DEBUG_PKG) return; + + var sizeLimit = process.env.SIZE_LIMIT_PKG + ? parseInt(process.env.SIZE_LIMIT_PKG, 10) + : 5 * 1024 * 1024; + var folderLimit = process.env.FOLDER_LIMIT_PKG + ? parseInt(process.env.FOLDER_LIMIT_PKG, 10) + : 10 * 1024 * 1024; + + var overSized = []; + + function dumpLevel(filename, level, tree) { + var totalSize = 0; + var d = fs.readdirSync(filename); + for (var j = 0; j < d.length; j += 1) { + var f = path.join(filename, d[j]); + var realPath = fs.realpathSync(f); + var isSymbolicLink = f !== realPath; + + var s = fs.statSync(f); + + if (s.isDirectory() && !isSymbolicLink) { + var tree1 = []; + var startIndex = overSized.length; + var folderSize = dumpLevel(f, level + 1, tree1); + totalSize += folderSize; + var str = + (' '.padStart(level * 2, ' ') + d[j]).padEnd(40, ' ') + + (humanSize(folderSize).padStart(10, ' ') + + (isSymbolicLink ? '=> ' + realPath : ' ')); + tree.push(str); + tree1.forEach(function (x) { + tree.push(x); + }); + + if (folderSize > folderLimit) { + overSized.splice(startIndex, 0, str); + } + } else { + totalSize += s.size; + var str2 = + (' '.padStart(level * 2, ' ') + d[j]).padEnd(40, ' ') + + (humanSize(s.size).padStart(10, ' ') + + (isSymbolicLink ? '=> ' + realPath : ' ')); + + if (s.size > sizeLimit) { + overSized.push(str2); + } + + tree.push(str2); + } + } + return totalSize; + } + + function wrap(obj, name) { + var f = obj[name]; + if (typeof f !== 'function') return; + obj[name] = function () { + var args1 = Array.prototype.slice.call(arguments); + console.log( + 'fs.' + name, + args1.filter(function (x) { + return typeof x === 'string'; + }), + ); + return f.apply(this, args1); + }; + } + + console.log('------------------------------- virtual file system'); + console.log(snapshotPrefix); + + var tree = []; + var totalSize = dumpLevel(snapshotPrefix, 1, tree); + console.log(tree.join('\n')); + console.log('Total size = ', humanSize(totalSize)); + + if (overSized.length > 0) { + console.log('------------------------------- oversized files'); + console.log(overSized.join('\n')); + } + + if (process.env.DEBUG_PKG === '2') { + wrap(fs, 'openSync'); + wrap(fs, 'open'); + wrap(fs, 'readSync'); + wrap(fs, 'read'); + wrap(fs, 'readFile'); + wrap(fs, 'writeSync'); + wrap(fs, 'write'); + wrap(fs, 'closeSync'); + wrap(fs, 'readFileSync'); + wrap(fs, 'close'); + wrap(fs, 'readdirSync'); + wrap(fs, 'readdir'); + wrap(fs, 'realpathSync'); + wrap(fs, 'realpath'); + wrap(fs, 'statSync'); + wrap(fs, 'stat'); + wrap(fs, 'lstatSync'); + wrap(fs, 'lstat'); + wrap(fs, 'fstatSync'); + wrap(fs, 'fstat'); + wrap(fs, 'existsSync'); + wrap(fs, 'exists'); + wrap(fs, 'accessSync'); + wrap(fs, 'access'); + + if (fs.promises) { + wrap(fs.promises, 'open'); + wrap(fs.promises, 'read'); + wrap(fs.promises, 'readFile'); + wrap(fs.promises, 'write'); + wrap(fs.promises, 'readdir'); + wrap(fs.promises, 'realpath'); + wrap(fs.promises, 'stat'); + wrap(fs.promises, 'lstat'); + wrap(fs.promises, 'access'); + wrap(fs.promises, 'copyFile'); + } + } +} + module.exports = { patchDlopen: patchDlopen, patchChildProcess: patchChildProcess, setupProcessPkg: setupProcessPkg, + installDiagnostic: installDiagnostic, }; diff --git a/prelude/diagnostic.js b/prelude/diagnostic.js deleted file mode 100644 index 050c11d98..000000000 --- a/prelude/diagnostic.js +++ /dev/null @@ -1,147 +0,0 @@ -/* global DICT */ - -'use strict'; - -function humanSize(bytes) { - const sizes = ['Bytes', 'KB', 'MB', 'GB', 'TB']; - - if (bytes === 0) { - return 'n/a'; - } - - const i = Math.floor(Math.log(bytes) / Math.log(1024)); - - if (i === 0) { - return `${bytes} ${sizes[i]}`; - } - - return `${(bytes / 1024 ** i).toFixed(1)} ${sizes[i]}`; -} - -(function installDiagnostic() { - const fs = require('fs'); - const path = require('path'); - const win32 = process.platform === 'win32'; - - const sizeLimit = process.env.SIZE_LIMIT_PKG - ? parseInt(process.env.SIZE_LIMIT_PKG, 10) - : 5 * 1024 * 1024; - const folderLimit = process.env.FOLDER_LIMIT_PKG - ? parseInt(process.env.FOLDER_LIMIT_PKG, 10) - : 10 * 1024 * 1024; - - if (process.env.DEBUG_PKG === '2') { - console.log(Object.entries(DICT)); - } - - const overSized = []; - - function dumpLevel(filename, level, tree) { - let totalSize = 0; - const d = fs.readdirSync(filename); - for (let j = 0; j < d.length; j += 1) { - const f = path.join(filename, d[j]); - const realPath = fs.realpathSync(f); - const isSymbolicLink2 = f !== realPath; - - const s = fs.statSync(f); - - if (s.isDirectory() && !isSymbolicLink2) { - const tree1 = []; - const startIndex = overSized.length; - const folderSize = dumpLevel(f, level + 1, tree1); - totalSize += folderSize; - const str = - (' '.padStart(level * 2, ' ') + d[j]).padEnd(40, ' ') + - (humanSize(folderSize).padStart(10, ' ') + - (isSymbolicLink2 ? `=> ${realPath}` : ' ')); - tree.push(str); - tree1.forEach((x) => tree.push(x)); - - if (folderSize > folderLimit) { - overSized.splice(startIndex, 0, str); - } - } else { - totalSize += s.size; - const str = - (' '.padStart(level * 2, ' ') + d[j]).padEnd(40, ' ') + - (humanSize(s.size).padStart(10, ' ') + - (isSymbolicLink2 ? `=> ${realPath}` : ' ')); - - if (s.size > sizeLimit) { - overSized.push(str); - } - - tree.push(str); - } - } - return totalSize; - } - function wrap(obj, name) { - const f = obj[name]; - obj[name] = (...args) => { - const args1 = Object.values(args); - console.log( - `fs.${name}`, - args1.filter((x) => typeof x === 'string'), - ); - return f.apply(this, args1); - }; - } - if (process.env.DEBUG_PKG) { - console.log('------------------------------- virtual file system'); - const startFolder = win32 ? 'C:\\snapshot' : '/snapshot'; - console.log(startFolder); - - const tree = []; - const totalSize = dumpLevel(startFolder, 1, tree); - console.log(tree.join('\n')); - - console.log('Total size = ', humanSize(totalSize)); - - if (overSized.length > 0) { - console.log('------------------------------- oversized files'); - console.log(overSized.join('\n')); - } - - if (process.env.DEBUG_PKG === '2') { - wrap(fs, 'openSync'); - wrap(fs, 'open'); - wrap(fs, 'readSync'); - wrap(fs, 'read'); - wrap(fs, 'readFile'); - wrap(fs, 'writeSync'); - wrap(fs, 'write'); - wrap(fs, 'closeSync'); - wrap(fs, 'readFileSync'); - wrap(fs, 'close'); - wrap(fs, 'readFile'); - wrap(fs, 'readdirSync'); - wrap(fs, 'readdir'); - wrap(fs, 'realpathSync'); - wrap(fs, 'realpath'); - wrap(fs, 'statSync'); - wrap(fs, 'stat'); - wrap(fs, 'lstatSync'); - wrap(fs, 'lstat'); - wrap(fs, 'fstatSync'); - wrap(fs, 'fstat'); - wrap(fs, 'existsSync'); - wrap(fs, 'exists'); - wrap(fs, 'accessSync'); - wrap(fs, 'access'); - - wrap(fs.promises, 'open'); - wrap(fs.promises, 'read'); - wrap(fs.promises, 'readFile'); - wrap(fs.promises, 'write'); - wrap(fs.promises, 'readdir'); - wrap(fs.promises, 'realpath'); - wrap(fs.promises, 'stat'); - wrap(fs.promises, 'lstat'); - wrap(fs.promises, 'fstat'); - wrap(fs.promises, 'access'); - wrap(fs.promises, 'copyFile'); - } - } -})(); diff --git a/prelude/sea-bootstrap.js b/prelude/sea-bootstrap.js index d1c3ad15c..2cdf1d9bc 100644 --- a/prelude/sea-bootstrap.js +++ b/prelude/sea-bootstrap.js @@ -178,6 +178,16 @@ shared.patchChildProcess(entrypoint); // process.pkg setup (shared with traditional bootstrap) shared.setupProcessPkg(entrypoint); +// ///////////////////////////////////////////////////////////////// +// DIAGNOSTICS ///////////////////////////////////////////////////// +// ///////////////////////////////////////////////////////////////// + +// Only available when the binary was built with --debug / -d. +// At runtime, set DEBUG_PKG=1 (VFS tree) or DEBUG_PKG=2 (+ fs tracing). +if (manifest.debug) { + shared.installDiagnostic(SNAPSHOT_PREFIX); +} + // ///////////////////////////////////////////////////////////////// // ENTRYPOINT ////////////////////////////////////////////////////// // ///////////////////////////////////////////////////////////////// From e6f5753d6265fbb7ebf38d333e57b0d1f406afbb Mon Sep 17 00:00:00 2001 From: robertsLando Date: Tue, 7 Apr 2026 14:58:05 +0200 Subject: [PATCH 17/41] fix: address remaining Copilot review feedback - Bump assertSeaNodeVersion minimum from Node 20 to 22 (consistent with engines) - Extract generateSeaBlob() helper with --build-sea fallback for Node 25.x - Accept separate defaultEntrypoint in setupProcessPkg for process.pkg compat - Update ARCHITECTURE.md Simple SEA min Node from 20 to 22 Co-Authored-By: Claude Opus 4.6 (1M context) --- docs/ARCHITECTURE.md | 2 +- lib/sea.ts | 47 ++++++++++++++++++++++--------------- prelude/bootstrap-shared.js | 5 ++-- prelude/bootstrap.js | 2 +- 4 files changed, 33 insertions(+), 23 deletions(-) diff --git a/docs/ARCHITECTURE.md b/docs/ARCHITECTURE.md index 24faca49e..c41750683 100644 --- a/docs/ARCHITECTURE.md +++ b/docs/ARCHITECTURE.md @@ -39,7 +39,7 @@ pkg single-file.js --sea # Simple SEA mode (any single .js file) | Bytecode | V8 compiled | No (source as-is) | No | | ESM transform | ESM to CJS | No (native ESM) | No | | Node.js API | Binary patching | Official `node:sea` | Official `node:sea` | -| Min Node | 22 (pkg runtime) | 22 (target) | 20 (target) | +| Min Node | 22 (pkg runtime) | 22 (target) | 22 (target) | --- diff --git a/lib/sea.ts b/lib/sea.ts index 5ad7ae15b..9e91016e8 100644 --- a/lib/sea.ts +++ b/lib/sea.ts @@ -405,14 +405,37 @@ async function withSeaTmpDir( /** Validate that the host Node.js version supports SEA */ function assertSeaNodeVersion() { const nodeMajor = parseInt(process.version.slice(1).split('.')[0], 10); - if (nodeMajor < 20) { + if (nodeMajor < 22) { throw new Error( - `SEA support requires at least node v20.0.0, actual node version is ${process.version}`, + `SEA support requires at least node v22.0.0, actual node version is ${process.version}`, ); } return nodeMajor; } +/** + * Generate the SEA blob from a sea-config.json file. + * Uses --build-sea on Node >= 25 with fallback to --experimental-sea-config. + */ +async function generateSeaBlob(seaConfigFilePath: string, nodeMajor: number) { + if (nodeMajor >= 25) { + try { + log.info('Generating the blob using --build-sea...'); + await execFileAsync(process.execPath, ['--build-sea', seaConfigFilePath]); + return; + } catch { + log.info( + '--build-sea not available, falling back to --experimental-sea-config...', + ); + } + } + log.info('Generating the blob...'); + await execFileAsync(process.execPath, [ + '--experimental-sea-config', + seaConfigFilePath, + ]); +} + /** Create NodeJS executable using the enhanced SEA pipeline (walker + refiner + assets) */ export async function seaEnhanced( entryPoint: string, @@ -492,17 +515,7 @@ export async function seaEnhanced( await writeFile(seaConfigFilePath, JSON.stringify(seaConfig)); // Generate the SEA blob - // --build-sea is stable from Node 25; older versions use --experimental-sea-config - if (nodeMajor >= 25) { - log.info('Generating the blob using --build-sea...'); - await execFileAsync(process.execPath, ['--build-sea', seaConfigFilePath]); - } else { - log.info('Generating the blob...'); - await execFileAsync(process.execPath, [ - '--experimental-sea-config', - seaConfigFilePath, - ]); - } + await generateSeaBlob(seaConfigFilePath, nodeMajor); // Bake blob into each target executable await Promise.all( @@ -517,7 +530,7 @@ export async function seaEnhanced( /** Create NodeJS executable using sea */ export default async function sea(entryPoint: string, opts: SeaOptions) { - assertSeaNodeVersion(); + const nodeMajor = assertSeaNodeVersion(); entryPoint = resolve(process.cwd(), entryPoint); @@ -545,11 +558,7 @@ export default async function sea(entryPoint: string, opts: SeaOptions) { log.info('Creating sea-config.json file...'); await writeFile(seaConfigFilePath, JSON.stringify(seaConfig)); - log.info('Generating the blob...'); - await execFileAsync(process.execPath, [ - '--experimental-sea-config', - seaConfigFilePath, - ]); + await generateSeaBlob(seaConfigFilePath, nodeMajor); await Promise.all( nodePaths.map(async (nodePath, i) => { diff --git a/prelude/bootstrap-shared.js b/prelude/bootstrap-shared.js index ae10391ab..ffbab4d44 100644 --- a/prelude/bootstrap-shared.js +++ b/prelude/bootstrap-shared.js @@ -248,10 +248,11 @@ function patchChildProcess(entrypoint) { * * @param {string} entrypoint The snapshotified entrypoint path. */ -function setupProcessPkg(entrypoint) { +function setupProcessPkg(entrypoint, defaultEntrypoint) { process.pkg = { entrypoint: entrypoint, - defaultEntrypoint: entrypoint, + defaultEntrypoint: + defaultEntrypoint !== undefined ? defaultEntrypoint : entrypoint, path: { resolve: function () { var args = [path.dirname(entrypoint)]; diff --git a/prelude/bootstrap.js b/prelude/bootstrap.js index 7daa6667f..f11016c44 100644 --- a/prelude/bootstrap.js +++ b/prelude/bootstrap.js @@ -488,7 +488,7 @@ function payloadFileSync(pointer) { // ///////////////////////////////////////////////////////////////// (() => { - REQUIRE_SHARED.setupProcessPkg(ENTRYPOINT); + REQUIRE_SHARED.setupProcessPkg(ENTRYPOINT, DEFAULT_ENTRYPOINT); process.versions.pkg = '%VERSION%'; process.pkg.mount = createMountpoint; })(); From 10a84db104d97819b0c9b77fc4048fecb35fdd33 Mon Sep 17 00:00:00 2001 From: robertsLando Date: Tue, 7 Apr 2026 16:15:55 +0200 Subject: [PATCH 18/41] feat: add worker thread support and fix SEA walker warnings MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Worker thread support: - Extract VFS setup into shared sea-vfs-setup.js (used by both main and worker threads, no duplication) - Bundle sea-worker-entry.js separately via esbuild — workers get the same @platformatic/vfs module hooks as the main thread - Monkey-patch Worker constructor to intercept /snapshot/ paths and inject the bundled VFS bootstrap via eval mode - Add test-90-sea-worker-threads test Walker fix: - Skip stepDetect (Babel parser) for non-JS files in SEA mode — only run on .js/.cjs/.mjs files, matching the existing stepStrip guard. Eliminates thousands of spurious warnings on .json, .d.ts, .md, .node files in real-world projects. Build: - Extract build:sea-bootstrap into scripts/build-sea-bootstrap.js for two-step bundling (worker entry → string, then main bootstrap) TODO: Remove node_modules/@platformatic/vfs patches once https://github.com/platformatic/vfs/pull/9 is merged and released. Co-Authored-By: Claude Opus 4.6 (1M context) --- lib/walker.ts | 6 +- package.json | 2 +- prelude/sea-bootstrap.js | 221 ++++++------------ prelude/sea-vfs-setup.js | 156 +++++++++++++ prelude/sea-worker-entry.js | 11 + scripts/build-sea-bootstrap.js | 49 ++++ test/test-90-sea-worker-threads/index.js | 49 ++++ test/test-90-sea-worker-threads/lib/helper.js | 5 + test/test-90-sea-worker-threads/main.js | 39 ++++ test/test-90-sea-worker-threads/package.json | 11 + test/test-90-sea-worker-threads/worker.js | 23 ++ 11 files changed, 418 insertions(+), 154 deletions(-) create mode 100644 prelude/sea-vfs-setup.js create mode 100644 prelude/sea-worker-entry.js create mode 100644 scripts/build-sea-bootstrap.js create mode 100644 test/test-90-sea-worker-threads/index.js create mode 100644 test/test-90-sea-worker-threads/lib/helper.js create mode 100644 test/test-90-sea-worker-threads/main.js create mode 100644 test/test-90-sea-worker-threads/package.json create mode 100644 test/test-90-sea-worker-threads/worker.js diff --git a/lib/walker.ts b/lib/walker.ts index 6bd61aa29..0a7808c95 100644 --- a/lib/walker.ts +++ b/lib/walker.ts @@ -1116,7 +1116,11 @@ class Walker { } } - if (store === STORE_BLOB || this.params.seaMode) { + if ( + store === STORE_BLOB || + (this.params.seaMode && + (isDotJS(record.file) || isESMFile(record.file))) + ) { const derivatives2: Derivative[] = []; stepDetect(record, marker, derivatives2); await this.stepDerivatives(record, marker, derivatives2); diff --git a/package.json b/package.json index e2fd732c4..e914d6657 100644 --- a/package.json +++ b/package.json @@ -74,7 +74,7 @@ "scripts": { "clean": "rimraf lib-es5", "build": "npm run clean && tsc && npm run build:sea-bootstrap", - "build:sea-bootstrap": "esbuild prelude/sea-bootstrap.js --bundle --platform=node --target=node22 --outfile=prelude/sea-bootstrap.bundle.js --external:node:sea --external:node:vfs", + "build:sea-bootstrap": "node scripts/build-sea-bootstrap.js", "start": "tsc --watch", "lint": "npm run lint:style && npm run lint:code", "lint:style": "prettier -c \"{lib,prelude,test}/**/*.{ts,js}\"", diff --git a/prelude/sea-bootstrap.js b/prelude/sea-bootstrap.js index 2cdf1d9bc..2d3edb929 100644 --- a/prelude/sea-bootstrap.js +++ b/prelude/sea-bootstrap.js @@ -4,171 +4,28 @@ // This script runs before user code in a Node.js Single Executable Application. // It sets up a Virtual File System from SEA-embedded assets so that // fs.readFileSync, require, import, etc. work transparently on packaged files. +// +// TODO: Remove the node_modules/@platformatic/vfs patches once +// https://github.com/platformatic/vfs/pull/9 is merged and released. -var sea = require('node:sea'); var path = require('path'); var Module = require('module'); var shared = require('./bootstrap-shared'); // ///////////////////////////////////////////////////////////////// -// MANIFEST //////////////////////////////////////////////////////// +// VFS SETUP (shared with worker threads) ////////////////////////// // ///////////////////////////////////////////////////////////////// -var manifest; -try { - manifest = JSON.parse(sea.getAsset('__pkg_manifest__', 'utf8')); -} catch (e) { - throw new Error( - 'pkg: Failed to load VFS manifest from SEA assets: ' + e.message, - ); -} - -// ///////////////////////////////////////////////////////////////// -// VFS SETUP /////////////////////////////////////////////////////// -// ///////////////////////////////////////////////////////////////// - -// Try native node:vfs first (future Node.js), fall back to polyfill -var vfsModule; -try { - vfsModule = require('node:vfs'); -} catch (_) { - try { - vfsModule = require('@platformatic/vfs'); - } catch (e) { - throw new Error( - 'pkg: VFS polyfill (@platformatic/vfs) is not available: ' + e.message, - ); - } -} - -var VirtualFileSystem = vfsModule.VirtualFileSystem; -var MemoryProvider = vfsModule.MemoryProvider; - -// Manifest keys are always POSIX (forward slashes, no drive letter). -// VFS may pass platform-native paths after stripping the mount prefix, -// so normalise before any manifest or SEA-asset lookup. -function toManifestKey(p) { - return p.replace(/\\/g, '/'); -} - -// Custom provider that reads from SEA assets lazily. -// Extends MemoryProvider for directory/stat support while lazily populating -// file content from SEA assets on first access. -// -// All paths are normalised to POSIX (via toManifestKey) before use, so -// manifest lookups, SEA asset lookups, and MemoryProvider storage all use -// the same key format regardless of platform. -class SEAProvider extends MemoryProvider { - constructor(seaManifest) { - super(); - this._manifest = seaManifest; - this._loaded = new Set(); - - // Pre-populate directory structure from manifest (keys are already POSIX) - for (var dir of Object.keys(seaManifest.directories)) { - super.mkdirSync(dir, { recursive: true }); - } - } - - _resolveSymlink(p) { - var target = this._manifest.symlinks[p]; - return target || p; - } - - readFileSync(filePath, options) { - var p = this._resolveSymlink(toManifestKey(filePath)); - this._ensureLoaded(p); - return super.readFileSync(p, options); - } - - readlinkSync(filePath) { - var p = toManifestKey(filePath); - var target = this._manifest.symlinks[p]; - if (target) return target; - return super.readlinkSync(p); - } - - _ensureLoaded(p) { - if (this._loaded.has(p)) return; - try { - var raw = sea.getRawAsset(p); - // getRawAsset returns an ArrayBuffer — Buffer.from copies the data - super.writeFileSync(p, Buffer.from(raw)); - this._loaded.add(p); - } catch (_) { - // Not a SEA asset — let super handle the ENOENT - } - } - - statSync(filePath) { - var p = this._resolveSymlink(toManifestKey(filePath)); - var meta = this._manifest.stats[p]; - if (meta && meta.isFile && !this._loaded.has(p)) { - this._ensureLoaded(p); - } - return super.statSync(p); - } - - readdirSync(dirPath) { - var p = toManifestKey(dirPath); - var entries = this._manifest.directories[p]; - if (entries) return entries.slice(); - return super.readdirSync(p); - } - - existsSync(filePath) { - var p = toManifestKey(filePath); - if (p in this._manifest.symlinks) return true; - p = this._resolveSymlink(p); - if (p in this._manifest.stats) return true; - // Fall through to super for directories created via mkdirSync - try { - super.statSync(p); - return true; - } catch (_) { - return false; - } - } -} - -var provider = new SEAProvider(manifest); -var virtualFs = new VirtualFileSystem(provider); - -var SNAPSHOT_PREFIX = - process.platform === 'win32' ? 'C:\\snapshot' : '/snapshot'; - -// Mount at the appropriate prefix for the runtime platform -virtualFs.mount(SNAPSHOT_PREFIX, { overlay: true }); - -// ///////////////////////////////////////////////////////////////// -// PATH NORMALIZATION ////////////////////////////////////////////// -// ///////////////////////////////////////////////////////////////// - -// The manifest always stores paths with POSIX '/' separators so that -// the same blob works regardless of build platform. On Windows we -// must convert them to the native format before handing them to -// Node's module resolver or VFS lookups. -function toPlatformPath(p) { - if (process.platform !== 'win32') return p; - // /snapshot/… → C:\snapshot\… - if (p.startsWith('/snapshot')) { - return 'C:' + p.replace(/\//g, '\\'); - } - return p.replace(/\//g, '\\'); -} - -var entrypoint = toPlatformPath(manifest.entrypoint); +var vfs = require('./sea-vfs-setup'); +var manifest = vfs.manifest; +var entrypoint = vfs.toPlatformPath(manifest.entrypoint); +var insideSnapshot = vfs.insideSnapshot; +var SNAPSHOT_PREFIX = vfs.SNAPSHOT_PREFIX; // ///////////////////////////////////////////////////////////////// // SHARED PATCHES ////////////////////////////////////////////////// // ///////////////////////////////////////////////////////////////// -// Detect whether a path is inside the snapshot -function insideSnapshot(f) { - if (typeof f !== 'string') return false; - return f.startsWith(SNAPSHOT_PREFIX + path.sep) || f === SNAPSHOT_PREFIX; -} - // Native addon extraction (shared with traditional bootstrap) shared.patchDlopen(insideSnapshot); @@ -188,6 +45,66 @@ if (manifest.debug) { shared.installDiagnostic(SNAPSHOT_PREFIX); } +// ///////////////////////////////////////////////////////////////// +// WORKER THREAD SUPPORT /////////////////////////////////////////// +// ///////////////////////////////////////////////////////////////// + +// Worker threads don't inherit VFS hooks from the main thread. +// Monkey-patch the Worker constructor so that when a worker is spawned +// with a /snapshot/... path, we inject a bundled VFS bootstrap that +// reuses the same @platformatic/vfs module hooks as the main thread. +(function patchWorkerThreads() { + var workerThreads; + try { + workerThreads = require('worker_threads'); + } catch (_) { + return; + } + + if (workerThreads.isMainThread === false) return; + + var OriginalWorker = workerThreads.Worker; + var _fsForWorker = require('fs'); + + // Worker bootstrap is bundled separately by esbuild from sea-worker-entry.js + // which requires the same sea-vfs-setup.js + @platformatic/vfs as the main + // thread — no hand-written VFS duplication. + var workerBootstrap = require('./_worker-bootstrap-string'); + + workerThreads.Worker = function PatchedWorker(filename, options) { + if (typeof filename === 'string' && insideSnapshot(filename)) { + // Read the worker file from VFS + var workerCode; + try { + workerCode = _fsForWorker.readFileSync(filename, 'utf8'); + } catch (_e) { + // If we can't read from VFS, fall through to original + return new OriginalWorker(filename, options); + } + + var wrapper = + workerBootstrap + + '\n__filename = ' + + JSON.stringify(filename) + + ';\n__dirname = ' + + JSON.stringify(path.dirname(filename)) + + ';\nmodule.filename = __filename;\nmodule.paths = require("module")._nodeModulePaths(__dirname);\n' + + workerCode; + + options = Object.assign({}, options, { eval: true }); + return new OriginalWorker(wrapper, options); + } + + return new OriginalWorker(filename, options); + }; + + // Copy static properties and prototype + Object.keys(OriginalWorker).forEach(function (key) { + workerThreads.Worker[key] = OriginalWorker[key]; + }); + workerThreads.Worker.prototype = OriginalWorker.prototype; +})(); + // ///////////////////////////////////////////////////////////////// // ENTRYPOINT ////////////////////////////////////////////////////// // ///////////////////////////////////////////////////////////////// diff --git a/prelude/sea-vfs-setup.js b/prelude/sea-vfs-setup.js new file mode 100644 index 000000000..baed6ceca --- /dev/null +++ b/prelude/sea-vfs-setup.js @@ -0,0 +1,156 @@ +'use strict'; + +// Shared VFS setup for SEA main thread and worker threads. +// Both import this module to avoid duplicating the SEAProvider + mount logic. + +var sea = require('node:sea'); +var path = require('path'); + +var vfsModule; +try { + vfsModule = require('node:vfs'); +} catch (_) { + try { + vfsModule = require('@platformatic/vfs'); + } catch (e) { + throw new Error( + 'pkg: VFS polyfill (@platformatic/vfs) is not available: ' + e.message, + ); + } +} + +var VirtualFileSystem = vfsModule.VirtualFileSystem; +var MemoryProvider = vfsModule.MemoryProvider; + +var manifest; +try { + manifest = JSON.parse(sea.getAsset('__pkg_manifest__', 'utf8')); +} catch (e) { + throw new Error( + 'pkg: Failed to load VFS manifest from SEA assets: ' + e.message, + ); +} + +// Manifest keys are always POSIX (forward slashes, no drive letter). +function toManifestKey(p) { + return p.replace(/\\/g, '/'); +} + +// Custom provider that reads from SEA assets lazily. +class SEAProvider extends MemoryProvider { + constructor(seaManifest) { + super(); + this._manifest = seaManifest; + this._loaded = new Set(); + + for (var dir of Object.keys(seaManifest.directories)) { + super.mkdirSync(dir, { recursive: true }); + } + } + + _resolveSymlink(p) { + var target = this._manifest.symlinks[p]; + return target || p; + } + + readFileSync(filePath, options) { + var p = this._resolveSymlink(toManifestKey(filePath)); + this._ensureLoaded(p); + return super.readFileSync(p, options); + } + + readlinkSync(filePath) { + var p = toManifestKey(filePath); + var target = this._manifest.symlinks[p]; + if (target) return target; + return super.readlinkSync(p); + } + + _ensureLoaded(p) { + if (this._loaded.has(p)) return; + try { + var raw = sea.getRawAsset(p); + super.writeFileSync(p, Buffer.from(raw)); + this._loaded.add(p); + } catch (_) { + // Not a SEA asset — let super handle the ENOENT + } + } + + statSync(filePath) { + var p = this._resolveSymlink(toManifestKey(filePath)); + var meta = this._manifest.stats[p]; + if (meta && meta.isFile && !this._loaded.has(p)) { + this._ensureLoaded(p); + } + return super.statSync(p); + } + + readdirSync(dirPath) { + var p = toManifestKey(dirPath); + var entries = this._manifest.directories[p]; + if (entries) return entries.slice(); + return super.readdirSync(p); + } + + existsSync(filePath) { + var p = toManifestKey(filePath); + if (p in this._manifest.symlinks) return true; + p = this._resolveSymlink(p); + if (p in this._manifest.stats) return true; + try { + super.statSync(p); + return true; + } catch (_) { + return false; + } + } +} + +var provider = new SEAProvider(manifest); +var virtualFs = new VirtualFileSystem(provider); + +var SNAPSHOT_PREFIX = + process.platform === 'win32' ? 'C:\\snapshot' : '/snapshot'; + +// On Windows, @platformatic/vfs normalises with path.normalize() which +// uses backslashes, but isUnderMountPoint() uses '/'. Patch to convert. +if (process.platform === 'win32') { + var _winToVFS = function (p) { + if (typeof p !== 'string' || p.startsWith('/')) return p; + if (/^[A-Za-z]:/.test(p)) p = p.slice(2); + return p.replace(/\\/g, '/'); + }; + var _origShouldHandle = VirtualFileSystem.prototype.shouldHandle; + VirtualFileSystem.prototype.shouldHandle = function (inputPath) { + return _origShouldHandle.call(this, _winToVFS(inputPath)); + }; + var _origResolvePath = VirtualFileSystem.prototype.resolvePath; + VirtualFileSystem.prototype.resolvePath = function (inputPath) { + return _origResolvePath.call(this, _winToVFS(inputPath)); + }; +} + +virtualFs.mount(SNAPSHOT_PREFIX, { overlay: true }); + +function toPlatformPath(p) { + if (process.platform !== 'win32') return p; + if (p.startsWith('/snapshot')) { + return 'C:' + p.replace(/\//g, '\\'); + } + return p.replace(/\//g, '\\'); +} + +function insideSnapshot(f) { + if (typeof f !== 'string') return false; + return f.startsWith(SNAPSHOT_PREFIX + path.sep) || f === SNAPSHOT_PREFIX; +} + +module.exports = { + manifest, + virtualFs, + provider, + SNAPSHOT_PREFIX, + insideSnapshot, + toPlatformPath, +}; diff --git a/prelude/sea-worker-entry.js b/prelude/sea-worker-entry.js new file mode 100644 index 000000000..705d1667f --- /dev/null +++ b/prelude/sea-worker-entry.js @@ -0,0 +1,11 @@ +'use strict'; + +// Worker thread VFS entry point. +// Bundled by esbuild at build time and inlined into the main bootstrap +// as a string. Uses the same @platformatic/vfs module hooks as the main +// thread — no hand-written VFS duplication. +// +// TODO: Remove the node_modules/@platformatic/vfs patches once +// https://github.com/platformatic/vfs/pull/9 is merged and released. + +require('./sea-vfs-setup'); diff --git a/scripts/build-sea-bootstrap.js b/scripts/build-sea-bootstrap.js new file mode 100644 index 000000000..f7b9bd8a1 --- /dev/null +++ b/scripts/build-sea-bootstrap.js @@ -0,0 +1,49 @@ +#!/usr/bin/env node +'use strict'; + +const fs = require('fs'); +const path = require('path'); +const esbuild = require('esbuild'); + +const preludeDir = path.join(__dirname, '..', 'prelude'); + +// Step 1: Bundle the worker entry (sea-worker-entry.js → string). +// This bundles sea-vfs-setup.js + @platformatic/vfs into a single +// self-contained script that workers can eval. +const workerResult = esbuild.buildSync({ + entryPoints: [path.join(preludeDir, 'sea-worker-entry.js')], + bundle: true, + platform: 'node', + target: 'node22', + write: false, + external: ['node:sea', 'node:vfs'], +}); + +const workerCode = workerResult.outputFiles[0].text; + +// Write the worker bootstrap as a string module so the main bootstrap +// can require() it at bundle time (esbuild inlines the require). +const tmpModulePath = path.join(preludeDir, '_worker-bootstrap-string.js'); +fs.writeFileSync( + tmpModulePath, + `module.exports = ${JSON.stringify(workerCode)};\n`, +); + +// Step 2: Bundle the main bootstrap (sea-bootstrap.js). +// This also bundles sea-vfs-setup.js + @platformatic/vfs + the worker +// string module into the final sea-bootstrap.bundle.js. +try { + esbuild.buildSync({ + entryPoints: [path.join(preludeDir, 'sea-bootstrap.js')], + bundle: true, + platform: 'node', + target: 'node22', + outfile: path.join(preludeDir, 'sea-bootstrap.bundle.js'), + external: ['node:sea', 'node:vfs'], + }); +} finally { + // Clean up temp file + try { + fs.unlinkSync(tmpModulePath); + } catch (_) {} +} diff --git a/test/test-90-sea-worker-threads/index.js b/test/test-90-sea-worker-threads/index.js new file mode 100644 index 000000000..4fa9bca01 --- /dev/null +++ b/test/test-90-sea-worker-threads/index.js @@ -0,0 +1,49 @@ +'use strict'; + +const { Worker } = require('worker_threads'); +const path = require('path'); + +function runWorker() { + return new Promise((resolve, reject) => { + const worker = new Worker(path.join(__dirname, 'worker.js'), { + workerData: { message: 'ping', name: 'world' }, + }); + + const timeout = setTimeout(() => { + worker.terminate(); + reject(new Error('Worker timed out')); + }, 5000); + + worker.on('message', (msg) => { + clearTimeout(timeout); + resolve(msg); + worker.terminate(); + }); + + worker.on('error', (err) => { + clearTimeout(timeout); + reject(err); + }); + + worker.on('exit', (code) => { + clearTimeout(timeout); + if (code !== 0 && code !== 1) { + reject(new Error('Worker exited with code ' + code)); + } + }); + }); +} + +async function main() { + try { + const result = await runWorker(); + console.log('echo:' + result.echo); + console.log('hasFilename:' + result.hasFilename); + console.log('hasDirname:' + result.hasDirname); + console.log('helperResult:' + result.helperResult); + } catch (e) { + console.log('worker-error:' + e.message); + } +} + +main(); diff --git a/test/test-90-sea-worker-threads/lib/helper.js b/test/test-90-sea-worker-threads/lib/helper.js new file mode 100644 index 000000000..e8d737a86 --- /dev/null +++ b/test/test-90-sea-worker-threads/lib/helper.js @@ -0,0 +1,5 @@ +'use strict'; + +module.exports.greet = function (name) { + return 'hello ' + name; +}; diff --git a/test/test-90-sea-worker-threads/main.js b/test/test-90-sea-worker-threads/main.js new file mode 100644 index 000000000..6e5d94240 --- /dev/null +++ b/test/test-90-sea-worker-threads/main.js @@ -0,0 +1,39 @@ +#!/usr/bin/env node + +'use strict'; + +const assert = require('assert'); +const utils = require('../utils.js'); + +// Worker thread support in SEA requires Node.js >= 22 +if (utils.getNodeMajorVersion() < 22) { + return; +} + +assert(__dirname === process.cwd()); + +const input = './package.json'; + +const newcomers = [ + 'test-90-sea-worker-threads-linux', + 'test-90-sea-worker-threads-macos', + 'test-90-sea-worker-threads-win.exe', +]; + +const before = utils.filesBefore(newcomers); + +utils.pkg.sync([input, '--sea'], { stdio: 'inherit' }); + +const expected = + 'echo:ping\n' + + 'hasFilename:true\n' + + 'hasDirname:true\n' + + 'helperResult:hello world\n'; + +utils.assertSeaOutput('test-90-sea-worker-threads', expected); + +try { + utils.filesAfter(before, newcomers); +} catch (_error) { + // noop — Windows EBUSY workaround +} diff --git a/test/test-90-sea-worker-threads/package.json b/test/test-90-sea-worker-threads/package.json new file mode 100644 index 000000000..25c10b468 --- /dev/null +++ b/test/test-90-sea-worker-threads/package.json @@ -0,0 +1,11 @@ +{ + "name": "test-90-sea-worker-threads", + "version": "1.0.0", + "main": "index.js", + "bin": "index.js", + "pkg": { + "scripts": [ + "worker.js" + ] + } +} diff --git a/test/test-90-sea-worker-threads/worker.js b/test/test-90-sea-worker-threads/worker.js new file mode 100644 index 000000000..8344884cb --- /dev/null +++ b/test/test-90-sea-worker-threads/worker.js @@ -0,0 +1,23 @@ +'use strict'; + +const { parentPort, workerData } = require('worker_threads'); + +// Verify we can access __filename and __dirname +const hasFilename = typeof __filename === 'string' && __filename.length > 0; +const hasDirname = typeof __dirname === 'string' && __dirname.length > 0; + +// Verify we can require a relative module from within the worker +let helperResult; +try { + const helper = require('./lib/helper.js'); + helperResult = helper.greet(workerData.name); +} catch (e) { + helperResult = 'ERROR:' + e.message; +} + +parentPort.postMessage({ + echo: workerData.message, + hasFilename, + hasDirname, + helperResult, +}); From 8e612e3dd2202ae598b6ca3d215ae3e42a98c3ba Mon Sep 17 00:00:00 2001 From: robertsLando Date: Tue, 7 Apr 2026 16:16:18 +0200 Subject: [PATCH 19/41] docs: update architecture documentation to include worker thread support details --- docs/ARCHITECTURE.md | 92 +++++++++++++++++++++++++++++++++++--------- 1 file changed, 73 insertions(+), 19 deletions(-) diff --git a/docs/ARCHITECTURE.md b/docs/ARCHITECTURE.md index c41750683..a185f9023 100644 --- a/docs/ARCHITECTURE.md +++ b/docs/ARCHITECTURE.md @@ -14,6 +14,7 @@ This document describes how `pkg` packages Node.js applications into standalone - [Binary Format](#sea-binary-format) - [Runtime Bootstrap](#sea-runtime-bootstrap) - [VFS Provider Architecture](#vfs-provider-architecture) + - [Worker Thread Support](#worker-thread-support) - [Shared Runtime Code](#shared-runtime-code) - [Performance Comparison](#performance-comparison) - [Code Protection Comparison](#code-protection-comparison) @@ -167,6 +168,8 @@ CLI (lib/index.ts) │ └─ SEA Orchestrator (lib/sea.ts → seaEnhanced()) ├─ Copy pre-bundled sea-bootstrap.bundle.js to tmpDir + │ (built by scripts/build-sea-bootstrap.js which inlines + │ the worker thread bootstrap via esbuild `define`) ├─ Build sea-config.json: │ { main, output, assets: { __pkg_manifest__, ...files } } ├─ Generate blob: @@ -209,16 +212,19 @@ The resource is embedded using OS-native formats: ### SEA Runtime Bootstrap -`prelude/sea-bootstrap.js` (187 lines, bundled with `@platformatic/vfs` into 151kb `sea-bootstrap.bundle.js`) executes as the SEA `main` entry: +`prelude/sea-bootstrap.js` (~250 lines, bundled with `@platformatic/vfs` and the worker bootstrap into `sea-bootstrap.bundle.js`) executes as the SEA `main` entry: 1. **Load manifest** — `JSON.parse(sea.getAsset('__pkg_manifest__', 'utf8'))` -2. **Initialize VFS** — Creates `SEAProvider` (extends `MemoryProvider`), mounts at `/snapshot` with overlay mode -3. **Normalize paths** — On Windows, converts POSIX `/snapshot/...` paths in manifest to `C:\snapshot\...` +2. **Patch VFS for Windows** — On Windows, monkey-patches `VirtualFileSystem.prototype.shouldHandle` and `resolvePath` to convert Windows-native paths (e.g. `C:\snapshot\...`) to POSIX before the VFS processes them. This is needed because `@platformatic/vfs` internally uses `/` as the path separator in `isUnderMountPoint()`, but Node's `path.normalize()` converts to `\` on Windows +3. **Initialize VFS** — Creates `SEAProvider` (extends `MemoryProvider`), always mounts at `/snapshot` (POSIX path, regardless of platform). The VFS module hooks use the `V:` sentinel drive for subsequent path resolution on Windows 4. **Apply shared patches** — Calls `patchDlopen()`, `patchChildProcess()`, `setupProcessPkg()` from `bootstrap-shared.js` -5. **Run entrypoint** — Sets `process.argv[1]`, calls `Module.runMain()` +5. **Patch Worker threads** — Wraps `workerThreads.Worker` so workers spawned with `/snapshot/...` paths get a self-contained bootstrap (see [Worker Thread Support](#worker-thread-support)) +6. **Run entrypoint** — Sets `process.argv[1]`, calls `Module.runMain()` The VFS polyfill (`@platformatic/vfs`) handles all `fs` and `fs/promises` patching automatically when `mount()` is called — intercepting 164+ functions including `readFile`, `readFileSync`, `stat`, `readdir`, `access`, `realpath`, `createReadStream`, `watch`, `open`, and their promise-based equivalents. It also hooks into the Node.js module resolution system for `require()` and `import`. +**Windows path strategy:** Unlike the main thread's VFS approach (which uses `@platformatic/vfs` with automatic module hooks), the SEA bootstrap takes care to normalize all paths to POSIX before they reach the VFS. The `insideSnapshot()` helper checks for both `/snapshot` and `V:\snapshot` (the sentinel drive used by `@platformatic/vfs` module hooks on Windows). + ### VFS Provider Architecture ``` @@ -259,6 +265,52 @@ The `SEAProvider` implements lazy loading: Assets are loaded lazily via `sea.getRawAsset(key)` which returns a zero-copy `ArrayBuffer` reference to the executable's memory-mapped region. The buffer is copied once into the `MemoryProvider` cache on first access. +### Worker Thread Support + +Worker threads spawned from packaged applications don't inherit VFS hooks from the main thread — `@platformatic/vfs` only patches the main thread's `fs` and module system. The SEA bootstrap solves this by monkey-patching the `Worker` constructor: + +``` +workerThreads.Worker(filename, options) + │ + ├─ filename NOT inside /snapshot → original Worker (pass-through) + │ + └─ filename inside /snapshot: + ├─ Read worker source from VFS via fs.readFileSync (intercepted) + ├─ Prepend self-contained worker bootstrap + │ (inlined at build time via WORKER_BOOTSTRAP_CODE) + ├─ Append __filename, __dirname, module.paths setup + └─ Spawn with { eval: true } → worker runs in-memory +``` + +**Worker Bootstrap (`prelude/sea-worker-bootstrap.js`, ~135 lines):** + +The worker bootstrap is a self-contained VFS implementation that reads directly from SEA assets via `node:sea`. It does NOT use `@platformatic/vfs` — instead it monkey-patches `fs` and `Module` directly, similar to the traditional bootstrap approach: + +- **`fs.readFileSync`** — Intercepts snapshot paths, reads from SEA assets via `sea.getRawAsset(key)` +- **`fs.existsSync`** — Checks manifest stats for snapshot paths +- **`fs.statSync`** — Returns metadata from manifest for snapshot paths +- **`fs.readdirSync`** — Returns directory entries from manifest +- **`Module._resolveFilename`** — Resolves `require()` calls within the snapshot (handles relative paths, node_modules, package.json `main` fields, extension resolution) +- **`Module._extensions['.js']` / `['.json']`** — Compiles/parses files from SEA assets + +This approach is necessary because `@platformatic/vfs` relies on module hooks and process-level patching that may not transfer cleanly to `eval`'d worker code. + +**Build-time inlining:** + +The worker bootstrap is inlined into the main bundle at build time by `scripts/build-sea-bootstrap.js`, which uses esbuild's `define` option to replace the `WORKER_BOOTSTRAP_CODE` placeholder with the stringified worker bootstrap source: + +```javascript +// scripts/build-sea-bootstrap.js +require('esbuild').buildSync({ + ... + define: { + WORKER_BOOTSTRAP_CODE: JSON.stringify(workerCode), + }, +}); +``` + +This keeps the worker bootstrap as a separate, readable source file while ensuring it ships as a single bundle. + --- ## Shared Runtime Code @@ -413,18 +465,20 @@ With `node:vfs` and `"useVfs": true` in the SEA config, assets will be auto-moun ## File Reference -| File | Lines | Purpose | -| ----------------------------- | ----- | ----------------------------------------------------------- | -| `prelude/bootstrap.js` | ~1970 | Traditional runtime bootstrap (fs/module/process patching) | -| `prelude/bootstrap-shared.js` | ~255 | Shared runtime patches (dlopen, child_process, process.pkg) | -| `prelude/sea-bootstrap.js` | ~187 | SEA runtime bootstrap (VFS setup, lazy SEAProvider) | -| `lib/index.ts` | ~726 | CLI entry point, mode routing | -| `lib/walker.ts` | ~1304 | Dependency walker (with seaMode support) | -| `lib/packer.ts` | ~194 | Serializes walker output into stripes + prelude wrapper | -| `lib/producer.ts` | ~601 | Assembles final binary (payload injection, compression) | -| `lib/sea.ts` | ~561 | SEA orchestrator (seaEnhanced + simple sea) | -| `lib/sea-assets.ts` | ~105 | Generates SEA asset map + manifest JSON | -| `lib/fabricator.ts` | ~173 | V8 bytecode compilation (traditional mode only) | -| `lib/esm-transformer.ts` | ~434 | ESM to CJS transformation (traditional mode only) | -| `lib/refiner.ts` | ~110 | Path compression, empty directory pruning | -| `lib/common.ts` | ~369 | Path normalization, snapshot helpers, store constants | +| File | Lines | Purpose | +| --------------------------------- | ----- | ------------------------------------------------------------------------ | +| `prelude/bootstrap.js` | ~1970 | Traditional runtime bootstrap (fs/module/process patching) | +| `prelude/bootstrap-shared.js` | ~255 | Shared runtime patches (dlopen, child_process, process.pkg) | +| `prelude/sea-bootstrap.js` | ~250 | SEA runtime bootstrap (VFS setup, lazy SEAProvider, worker patch) | +| `prelude/sea-worker-bootstrap.js` | ~135 | Self-contained worker thread bootstrap (fs/Module patching via node:sea) | +| `scripts/build-sea-bootstrap.js` | ~22 | Build script: bundles sea-bootstrap + inlines worker bootstrap | +| `lib/index.ts` | ~726 | CLI entry point, mode routing | +| `lib/walker.ts` | ~1304 | Dependency walker (with seaMode support) | +| `lib/packer.ts` | ~194 | Serializes walker output into stripes + prelude wrapper | +| `lib/producer.ts` | ~601 | Assembles final binary (payload injection, compression) | +| `lib/sea.ts` | ~561 | SEA orchestrator (seaEnhanced + simple sea) | +| `lib/sea-assets.ts` | ~105 | Generates SEA asset map + manifest JSON | +| `lib/fabricator.ts` | ~173 | V8 bytecode compilation (traditional mode only) | +| `lib/esm-transformer.ts` | ~434 | ESM to CJS transformation (traditional mode only) | +| `lib/refiner.ts` | ~110 | Path compression, empty directory pruning | +| `lib/common.ts` | ~369 | Path normalization, snapshot helpers, store constants | From 0808a05d4e699e18b1d320b7c9cdd84f44a094f8 Mon Sep 17 00:00:00 2001 From: robertsLando Date: Tue, 7 Apr 2026 16:26:11 +0200 Subject: [PATCH 20/41] fix: mount VFS at POSIX /snapshot on all platforms for Windows compat The VFS mount point must always be POSIX '/snapshot' because @platformatic/vfs internally uses '/' as the path separator. The Windows prototype patches convert C:\snapshot\... and V:\snapshot\... to /snapshot/... before they reach the VFS. This was broken during the sea-vfs-setup.js extraction where SNAPSHOT_PREFIX was incorrectly set to 'C:\snapshot' on Windows. Co-Authored-By: Claude Opus 4.6 (1M context) --- prelude/sea-vfs-setup.js | 26 ++++++++++++++++++++++---- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/prelude/sea-vfs-setup.js b/prelude/sea-vfs-setup.js index baed6ceca..9dca78db4 100644 --- a/prelude/sea-vfs-setup.js +++ b/prelude/sea-vfs-setup.js @@ -4,7 +4,6 @@ // Both import this module to avoid duplicating the SEAProvider + mount logic. var sea = require('node:sea'); -var path = require('path'); var vfsModule; try { @@ -110,8 +109,12 @@ class SEAProvider extends MemoryProvider { var provider = new SEAProvider(manifest); var virtualFs = new VirtualFileSystem(provider); -var SNAPSHOT_PREFIX = - process.platform === 'win32' ? 'C:\\snapshot' : '/snapshot'; +// Always mount with a POSIX prefix — @platformatic/vfs internally relies on +// '/' as path separator (isUnderMountPoint, getRelativePath, etc.). +// Our prototype patches below convert Windows paths to POSIX before they +// reach the VFS, and Node's VFS module hooks use the V: sentinel drive +// for subsequent path resolution, which normalizeVFSPath already handles. +var SNAPSHOT_PREFIX = '/snapshot'; // On Windows, @platformatic/vfs normalises with path.normalize() which // uses backslashes, but isUnderMountPoint() uses '/'. Patch to convert. @@ -143,7 +146,22 @@ function toPlatformPath(p) { function insideSnapshot(f) { if (typeof f !== 'string') return false; - return f.startsWith(SNAPSHOT_PREFIX + path.sep) || f === SNAPSHOT_PREFIX; + if (f.startsWith('/snapshot/') || f === '/snapshot') return true; + if (process.platform === 'win32') { + // Module hooks use the V: sentinel drive; dlopen/child_process use C: + if ( + f.startsWith('V:\\snapshot\\') || + f.startsWith('V:/snapshot/') || + f === 'V:\\snapshot' || + f === 'V:/snapshot' || + f.startsWith('C:\\snapshot\\') || + f.startsWith('C:/snapshot/') || + f === 'C:\\snapshot' || + f === 'C:/snapshot' + ) + return true; + } + return false; } module.exports = { From 5e4a53a0ed192d3eb656795dae7d6b30342f5b67 Mon Sep 17 00:00:00 2001 From: robertsLando Date: Tue, 7 Apr 2026 17:13:55 +0200 Subject: [PATCH 21/41] fix: use Module._compile for worker threads instead of raw eval Worker threads in eval mode get a synthetic require() that doesn't honour module.filename for relative path resolution. This caused require('./lib/helper.js') to fail inside workers. Fix by creating a proper CJS module context via Module._compile(), which sets up the correct resolution base path from the worker's snapshot filename. Co-Authored-By: Claude Opus 4.6 (1M context) --- prelude/sea-bootstrap.js | 23 +++++++++++++++++++---- 1 file changed, 19 insertions(+), 4 deletions(-) diff --git a/prelude/sea-bootstrap.js b/prelude/sea-bootstrap.js index 2d3edb929..604d3a696 100644 --- a/prelude/sea-bootstrap.js +++ b/prelude/sea-bootstrap.js @@ -82,14 +82,29 @@ if (manifest.debug) { return new OriginalWorker(filename, options); } + // Build a wrapper that: + // 1. Sets up VFS (workerBootstrap = bundled sea-vfs-setup.js) + // 2. Creates a proper CJS module context via Module._compile + // so that require('./relative') resolves correctly from the + // worker's snapshot path (eval mode's synthetic require doesn't + // honour module.filename for relative resolution). var wrapper = workerBootstrap + - '\n__filename = ' + + '\nvar _Module = require("module");\n' + + 'var _m = new _Module(' + JSON.stringify(filename) + - ';\n__dirname = ' + + ', module);\n' + + '_m.filename = ' + + JSON.stringify(filename) + + ';\n' + + '_m.paths = _Module._nodeModulePaths(' + JSON.stringify(path.dirname(filename)) + - ';\nmodule.filename = __filename;\nmodule.paths = require("module")._nodeModulePaths(__dirname);\n' + - workerCode; + ');\n' + + '_m._compile(' + + JSON.stringify(workerCode) + + ', ' + + JSON.stringify(filename) + + ');\n'; options = Object.assign({}, options, { eval: true }); return new OriginalWorker(wrapper, options); From a4dcb29c44af9941308c0ce475400ceb2de038bc Mon Sep 17 00:00:00 2001 From: robertsLando Date: Tue, 7 Apr 2026 17:52:22 +0200 Subject: [PATCH 22/41] fix: use postject JS API instead of npx to inject SEA blobs MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Replace `npx postject` shell invocations with the postject JS API (`inject()` function) imported as a direct dependency. This fixes two CI issues: 1. "Text file busy" — concurrent npx invocations race on the shared npx cache when building multiple platform targets in parallel 2. "Argument is not a constructor" — npx downloading an incompatible postject version at runtime Using the JS API is also faster (no npm download/extraction overhead) and more reliable (deterministic version from package.json). Co-Authored-By: Claude Opus 4.6 (1M context) --- lib/postject.d.ts | 13 + lib/sea.ts | 22 +- package-lock.json | 8276 +++++++++++++++++++++++++++++++++++++++++++++ package.json | 1 + yarn.lock | 1539 ++++----- 5 files changed, 9028 insertions(+), 823 deletions(-) create mode 100644 lib/postject.d.ts create mode 100644 package-lock.json diff --git a/lib/postject.d.ts b/lib/postject.d.ts new file mode 100644 index 000000000..b7d9b7642 --- /dev/null +++ b/lib/postject.d.ts @@ -0,0 +1,13 @@ +declare module 'postject' { + interface InjectOptions { + sentinelFuse?: string; + machoSegmentName?: string; + overwrite?: boolean; + } + export function inject( + filename: string, + resourceName: string, + resourceData: Buffer, + options?: InjectOptions, + ): Promise; +} diff --git a/lib/sea.ts b/lib/sea.ts index 9e91016e8..c5485b928 100644 --- a/lib/sea.ts +++ b/lib/sea.ts @@ -1,4 +1,4 @@ -import { exec as cExec, execFile as cExecFile } from 'child_process'; +import { execFile as cExecFile } from 'child_process'; import util from 'util'; import { basename, dirname, join, resolve } from 'path'; import { @@ -27,8 +27,8 @@ import { import walk from './walker'; import refine from './refiner'; import { generateSeaAssets } from './sea-assets'; +import { inject as postjectInject } from 'postject'; -const exec = util.promisify(cExec); const execFileAsync = util.promisify(cExecFile); /** Returns stat of path when exits, false otherwise */ @@ -337,14 +337,18 @@ async function bake( if (process.platform === 'darwin') { removeMachOExecutableSignature(outPath); } - await exec( - `npx postject "${outPath}" NODE_SEA_BLOB "${blobPath}" --sentinel-fuse NODE_SEA_FUSE_fce680ab2cc467b6e072b8b5df1996b2 --macho-segment-name NODE_SEA`, - ); - } else { - await exec( - `npx postject "${outPath}" NODE_SEA_BLOB "${blobPath}" --sentinel-fuse NODE_SEA_FUSE_fce680ab2cc467b6e072b8b5df1996b2`, - ); } + + // Use postject JS API directly instead of spawning npx. + // This avoids two CI issues: + // 1. "Text file busy" race condition from concurrent npx invocations + // 2. "Argument is not a constructor" from npx downloading incompatible versions + const blobData = await readFile(blobPath); + await postjectInject(outPath, 'NODE_SEA_BLOB', blobData, { + sentinelFuse: 'NODE_SEA_FUSE_fce680ab2cc467b6e072b8b5df1996b2', + machoSegmentName: target.platform === 'macos' ? 'NODE_SEA' : undefined, + overwrite: true, + }); } /** Patch and sign macOS executable if needed */ diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 000000000..0209a76ff --- /dev/null +++ b/package-lock.json @@ -0,0 +1,8276 @@ +{ + "name": "@yao-pkg/pkg", + "version": "6.14.2", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "@yao-pkg/pkg", + "version": "6.14.2", + "license": "MIT", + "dependencies": { + "@babel/generator": "^7.23.0", + "@babel/parser": "^7.23.0", + "@babel/traverse": "^7.23.0", + "@babel/types": "^7.23.0", + "@platformatic/vfs": "^0.3.0", + "@yao-pkg/pkg-fetch": "3.5.33", + "esbuild": "^0.27.3", + "into-stream": "^9.1.0", + "minimist": "^1.2.6", + "multistream": "^4.1.0", + "picocolors": "^1.1.0", + "picomatch": "^4.0.2", + "postject": "^1.0.0-alpha.6", + "prebuild-install": "^7.1.1", + "resolve": "^1.22.10", + "resolve.exports": "^2.0.3", + "stream-meter": "^1.0.4", + "tar": "^7.5.7", + "tinyglobby": "^0.2.11", + "unzipper": "^0.12.3" + }, + "bin": { + "pkg": "lib-es5/bin.js" + }, + "devDependencies": { + "@release-it/conventional-changelog": "^10.0.5", + "@types/babel__generator": "^7.6.5", + "@types/babel__traverse": "^7.20.3", + "@types/minimist": "^1.2.2", + "@types/multistream": "^4.1.0", + "@types/node": "^22.0.0", + "@types/picomatch": "^3.0.1", + "@types/resolve": "^1.20.2", + "@types/stream-meter": "^0.0.22", + "@types/tar": "^6.1.13", + "@types/unzipper": "^0.10.10", + "@typescript-eslint/eslint-plugin": "^8.0.0", + "@typescript-eslint/parser": "^8.0.0", + "esbuild-register": "^3.6.0", + "eslint": "^9.0.0", + "eslint-config-airbnb-base": "^15.0.0", + "eslint-config-airbnb-typescript": "^18.0.0", + "eslint-config-prettier": "^10.0.0", + "eslint-plugin-import": "^2.31.0", + "globals": "^17.3.0", + "json-stable-stringify": "^1.0.1", + "lint-staged": "^15.0.0", + "prettier": "^3.0.3", + "release-it": "^19.2.4", + "rimraf": "^6.1.2", + "simple-git-hooks": "^2.11.1", + "typescript": "^4.7.2" + }, + "engines": { + "node": ">=22.0.0" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.0.tgz", + "integrity": "sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw==", + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.28.5", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/generator": { + "version": "7.29.1", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.1.tgz", + "integrity": "sha512-qsaF+9Qcm2Qv8SRIMMscAvG4O3lJ0F1GuMo5HR/Bp02LopNgnZBC/EkbevHFeGs4ls/oPz9v+Bsmzbkbe+0dUw==", + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.29.0", + "@babel/types": "^7.29.0", + "@jridgewell/gen-mapping": "^0.3.12", + "@jridgewell/trace-mapping": "^0.3.28", + "jsesc": "^3.0.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-globals": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz", + "integrity": "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", + "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz", + "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.0.tgz", + "integrity": "sha512-IyDgFV5GeDUVX4YdF/3CPULtVGSXXMLh1xVIgdCgxApktqnQV0r7/8Nqthg+8YLGaAtdyIlo2qIdZrbCv4+7ww==", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.29.0" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/template": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.28.6.tgz", + "integrity": "sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.28.6", + "@babel/parser": "^7.28.6", + "@babel/types": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.0.tgz", + "integrity": "sha512-4HPiQr0X7+waHfyXPZpWPfWL/J7dcN1mx9gL6WdQVMbPnF3+ZhSMs8tCxN7oHddJE9fhNE7+lxdnlyemKfJRuA==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.29.0", + "@babel/generator": "^7.29.0", + "@babel/helper-globals": "^7.28.0", + "@babel/parser": "^7.29.0", + "@babel/template": "^7.28.6", + "@babel/types": "^7.29.0", + "debug": "^4.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.0.tgz", + "integrity": "sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==", + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.27.1", + "@babel/helper-validator-identifier": "^7.28.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@conventional-changelog/git-client": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@conventional-changelog/git-client/-/git-client-2.5.1.tgz", + "integrity": "sha512-lAw7iA5oTPWOLjiweb7DlGEMDEvzqzLLa6aWOly2FSZ64IwLE8T458rC+o+WvI31Doz6joM7X2DoNog7mX8r4A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@simple-libs/child-process-utils": "^1.0.0", + "@simple-libs/stream-utils": "^1.1.0", + "semver": "^7.5.2" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "conventional-commits-filter": "^5.0.0", + "conventional-commits-parser": "^6.1.0" + }, + "peerDependenciesMeta": { + "conventional-commits-filter": { + "optional": true + }, + "conventional-commits-parser": { + "optional": true + } + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.27.3.tgz", + "integrity": "sha512-Czi8yzXUWIQYAtL/2y6vogER8pvcsOsk5cpwL4Gk5nJqH5UZiVByIY8Eorm5R13gq+DQKYg0+JyQoytLQas4dA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.9.1", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.1.tgz", + "integrity": "sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "eslint-visitor-keys": "^3.4.3" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/eslint-utils/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/@eslint-community/regexpp": { + "version": "4.12.2", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.2.tgz", + "integrity": "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/config-array": { + "version": "0.21.1", + "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.21.1.tgz", + "integrity": "sha512-aw1gNayWpdI/jSYVgzN5pL0cfzU02GT3NBpeT/DXbx1/1x7ZKxFPd9bwrzygx/qiwIQiJ1sw/zD8qY/kRvlGHA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/object-schema": "^2.1.7", + "debug": "^4.3.1", + "minimatch": "^3.1.2" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/config-helpers": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.4.2.tgz", + "integrity": "sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/core": "^0.17.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/core": { + "version": "0.17.0", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.17.0.tgz", + "integrity": "sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@types/json-schema": "^7.0.15" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.3.tgz", + "integrity": "sha512-Kr+LPIUVKz2qkx1HAMH8q1q6azbqBAsXJUxBl/ODDuVPX45Z9DfwB8tPjTi6nNZ8BuM3nbJxC5zCAg5elnBUTQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^10.0.1", + "globals": "^14.0.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.1", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/eslintrc/node_modules/globals": { + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", + "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@eslint/js": { + "version": "9.39.2", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.39.2.tgz", + "integrity": "sha512-q1mjIoW1VX4IvSocvM/vbTiveKC4k9eLrajNEuSsmjymSDEbpGddtpfOoN7YGAqBK3NG+uqo8ia4PDTt8buCYA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://eslint.org/donate" + } + }, + "node_modules/@eslint/object-schema": { + "version": "2.1.7", + "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.7.tgz", + "integrity": "sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/plugin-kit": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.4.1.tgz", + "integrity": "sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/core": "^0.17.0", + "levn": "^0.4.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@humanfs/core": { + "version": "0.19.1", + "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz", + "integrity": "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanfs/node": { + "version": "0.16.7", + "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.7.tgz", + "integrity": "sha512-/zUx+yOsIrG4Y43Eh2peDeKCxlRt/gET6aHfaKpuq267qXdYDFViVHfMaLyygZOnl0kGWxFIgsBy8QFuTLUXEQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@humanfs/core": "^0.19.1", + "@humanwhocodes/retry": "^0.4.0" + }, + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/retry": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.3.tgz", + "integrity": "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@inquirer/ansi": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@inquirer/ansi/-/ansi-1.0.2.tgz", + "integrity": "sha512-S8qNSZiYzFd0wAcyG5AXCvUHC5Sr7xpZ9wZ2py9XR88jUz8wooStVx5M6dRzczbBWjic9NP7+rY0Xi7qqK/aMQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/@inquirer/checkbox": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/@inquirer/checkbox/-/checkbox-4.3.2.tgz", + "integrity": "sha512-VXukHf0RR1doGe6Sm4F0Em7SWYLTHSsbGfJdS9Ja2bX5/D5uwVOEjr07cncLROdBvmnvCATYEWlHqYmXv2IlQA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/ansi": "^1.0.2", + "@inquirer/core": "^10.3.2", + "@inquirer/figures": "^1.0.15", + "@inquirer/type": "^3.0.10", + "yoctocolors-cjs": "^2.1.3" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/confirm": { + "version": "5.1.21", + "resolved": "https://registry.npmjs.org/@inquirer/confirm/-/confirm-5.1.21.tgz", + "integrity": "sha512-KR8edRkIsUayMXV+o3Gv+q4jlhENF9nMYUZs9PA2HzrXeHI8M5uDag70U7RJn9yyiMZSbtF5/UexBtAVtZGSbQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/core": "^10.3.2", + "@inquirer/type": "^3.0.10" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/core": { + "version": "10.3.2", + "resolved": "https://registry.npmjs.org/@inquirer/core/-/core-10.3.2.tgz", + "integrity": "sha512-43RTuEbfP8MbKzedNqBrlhhNKVwoK//vUFNW3Q3vZ88BLcrs4kYpGg+B2mm5p2K/HfygoCxuKwJJiv8PbGmE0A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/ansi": "^1.0.2", + "@inquirer/figures": "^1.0.15", + "@inquirer/type": "^3.0.10", + "cli-width": "^4.1.0", + "mute-stream": "^2.0.0", + "signal-exit": "^4.1.0", + "wrap-ansi": "^6.2.0", + "yoctocolors-cjs": "^2.1.3" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/core/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/@inquirer/core/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/@inquirer/core/node_modules/wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@inquirer/editor": { + "version": "4.2.23", + "resolved": "https://registry.npmjs.org/@inquirer/editor/-/editor-4.2.23.tgz", + "integrity": "sha512-aLSROkEwirotxZ1pBaP8tugXRFCxW94gwrQLxXfrZsKkfjOYC1aRvAZuhpJOb5cu4IBTJdsCigUlf2iCOu4ZDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/core": "^10.3.2", + "@inquirer/external-editor": "^1.0.3", + "@inquirer/type": "^3.0.10" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/expand": { + "version": "4.0.23", + "resolved": "https://registry.npmjs.org/@inquirer/expand/-/expand-4.0.23.tgz", + "integrity": "sha512-nRzdOyFYnpeYTTR2qFwEVmIWypzdAx/sIkCMeTNTcflFOovfqUk+HcFhQQVBftAh9gmGrpFj6QcGEqrDMDOiew==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/core": "^10.3.2", + "@inquirer/type": "^3.0.10", + "yoctocolors-cjs": "^2.1.3" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/external-editor": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@inquirer/external-editor/-/external-editor-1.0.3.tgz", + "integrity": "sha512-RWbSrDiYmO4LbejWY7ttpxczuwQyZLBUyygsA9Nsv95hpzUWwnNTVQmAq3xuh7vNwCp07UTmE5i11XAEExx4RA==", + "dev": true, + "license": "MIT", + "dependencies": { + "chardet": "^2.1.1", + "iconv-lite": "^0.7.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/figures": { + "version": "1.0.15", + "resolved": "https://registry.npmjs.org/@inquirer/figures/-/figures-1.0.15.tgz", + "integrity": "sha512-t2IEY+unGHOzAaVM5Xx6DEWKeXlDDcNPeDyUpsRc6CUhBfU3VQOEl+Vssh7VNp1dR8MdUJBWhuObjXCsVpjN5g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/@inquirer/input": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/@inquirer/input/-/input-4.3.1.tgz", + "integrity": "sha512-kN0pAM4yPrLjJ1XJBjDxyfDduXOuQHrBB8aLDMueuwUGn+vNpF7Gq7TvyVxx8u4SHlFFj4trmj+a2cbpG4Jn1g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/core": "^10.3.2", + "@inquirer/type": "^3.0.10" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/number": { + "version": "3.0.23", + "resolved": "https://registry.npmjs.org/@inquirer/number/-/number-3.0.23.tgz", + "integrity": "sha512-5Smv0OK7K0KUzUfYUXDXQc9jrf8OHo4ktlEayFlelCjwMXz0299Y8OrI+lj7i4gCBY15UObk76q0QtxjzFcFcg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/core": "^10.3.2", + "@inquirer/type": "^3.0.10" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/password": { + "version": "4.0.23", + "resolved": "https://registry.npmjs.org/@inquirer/password/-/password-4.0.23.tgz", + "integrity": "sha512-zREJHjhT5vJBMZX/IUbyI9zVtVfOLiTO66MrF/3GFZYZ7T4YILW5MSkEYHceSii/KtRk+4i3RE7E1CUXA2jHcA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/ansi": "^1.0.2", + "@inquirer/core": "^10.3.2", + "@inquirer/type": "^3.0.10" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/prompts": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@inquirer/prompts/-/prompts-7.10.1.tgz", + "integrity": "sha512-Dx/y9bCQcXLI5ooQ5KyvA4FTgeo2jYj/7plWfV5Ak5wDPKQZgudKez2ixyfz7tKXzcJciTxqLeK7R9HItwiByg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/checkbox": "^4.3.2", + "@inquirer/confirm": "^5.1.21", + "@inquirer/editor": "^4.2.23", + "@inquirer/expand": "^4.0.23", + "@inquirer/input": "^4.3.1", + "@inquirer/number": "^3.0.23", + "@inquirer/password": "^4.0.23", + "@inquirer/rawlist": "^4.1.11", + "@inquirer/search": "^3.2.2", + "@inquirer/select": "^4.4.2" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/rawlist": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/@inquirer/rawlist/-/rawlist-4.1.11.tgz", + "integrity": "sha512-+LLQB8XGr3I5LZN/GuAHo+GpDJegQwuPARLChlMICNdwW7OwV2izlCSCxN6cqpL0sMXmbKbFcItJgdQq5EBXTw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/core": "^10.3.2", + "@inquirer/type": "^3.0.10", + "yoctocolors-cjs": "^2.1.3" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/search": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/@inquirer/search/-/search-3.2.2.tgz", + "integrity": "sha512-p2bvRfENXCZdWF/U2BXvnSI9h+tuA8iNqtUKb9UWbmLYCRQxd8WkvwWvYn+3NgYaNwdUkHytJMGG4MMLucI1kA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/core": "^10.3.2", + "@inquirer/figures": "^1.0.15", + "@inquirer/type": "^3.0.10", + "yoctocolors-cjs": "^2.1.3" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/select": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/@inquirer/select/-/select-4.4.2.tgz", + "integrity": "sha512-l4xMuJo55MAe+N7Qr4rX90vypFwCajSakx59qe/tMaC1aEHWLyw68wF4o0A4SLAY4E0nd+Vt+EyskeDIqu1M6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/ansi": "^1.0.2", + "@inquirer/core": "^10.3.2", + "@inquirer/figures": "^1.0.15", + "@inquirer/type": "^3.0.10", + "yoctocolors-cjs": "^2.1.3" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/type": { + "version": "3.0.10", + "resolved": "https://registry.npmjs.org/@inquirer/type/-/type-3.0.10.tgz", + "integrity": "sha512-BvziSRxfz5Ov8ch0z/n3oijRSEcEsHnhggm4xFZe93DHcUCTlutlq9Ox4SVENAfcRD22UQq7T/atg9Wr3k09eA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@isaacs/fs-minipass": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@isaacs/fs-minipass/-/fs-minipass-4.0.1.tgz", + "integrity": "sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==", + "license": "ISC", + "dependencies": { + "minipass": "^7.0.4" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "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==", + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@nodeutils/defaults-deep": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@nodeutils/defaults-deep/-/defaults-deep-1.1.0.tgz", + "integrity": "sha512-gG44cwQovaOFdSR02jR9IhVRpnDP64VN6JdjYJTfNz4J4fWn7TQnmrf22nSjRqlwlxPcW8PL/L3KbJg3tdwvpg==", + "dev": true, + "license": "ISC", + "dependencies": { + "lodash": "^4.15.0" + } + }, + "node_modules/@octokit/auth-token": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/@octokit/auth-token/-/auth-token-6.0.0.tgz", + "integrity": "sha512-P4YJBPdPSpWTQ1NU4XYdvHvXJJDxM6YwpS0FZHRgP7YFkdVxsWcpWGy/NVqlAA7PcPCnMacXlRm1y2PFZRWL/w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 20" + } + }, + "node_modules/@octokit/core": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/@octokit/core/-/core-7.0.6.tgz", + "integrity": "sha512-DhGl4xMVFGVIyMwswXeyzdL4uXD5OGILGX5N8Y+f6W7LhC1Ze2poSNrkF/fedpVDHEEZ+PHFW0vL14I+mm8K3Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@octokit/auth-token": "^6.0.0", + "@octokit/graphql": "^9.0.3", + "@octokit/request": "^10.0.6", + "@octokit/request-error": "^7.0.2", + "@octokit/types": "^16.0.0", + "before-after-hook": "^4.0.0", + "universal-user-agent": "^7.0.0" + }, + "engines": { + "node": ">= 20" + } + }, + "node_modules/@octokit/endpoint": { + "version": "11.0.3", + "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-11.0.3.tgz", + "integrity": "sha512-FWFlNxghg4HrXkD3ifYbS/IdL/mDHjh9QcsNyhQjN8dplUoZbejsdpmuqdA76nxj2xoWPs7p8uX2SNr9rYu0Ag==", + "dev": true, + "license": "MIT", + "dependencies": { + "@octokit/types": "^16.0.0", + "universal-user-agent": "^7.0.2" + }, + "engines": { + "node": ">= 20" + } + }, + "node_modules/@octokit/graphql": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/@octokit/graphql/-/graphql-9.0.3.tgz", + "integrity": "sha512-grAEuupr/C1rALFnXTv6ZQhFuL1D8G5y8CN04RgrO4FIPMrtm+mcZzFG7dcBm+nq+1ppNixu+Jd78aeJOYxlGA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@octokit/request": "^10.0.6", + "@octokit/types": "^16.0.0", + "universal-user-agent": "^7.0.0" + }, + "engines": { + "node": ">= 20" + } + }, + "node_modules/@octokit/openapi-types": { + "version": "27.0.0", + "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-27.0.0.tgz", + "integrity": "sha512-whrdktVs1h6gtR+09+QsNk2+FO+49j6ga1c55YZudfEG+oKJVvJLQi3zkOm5JjiUXAagWK2tI2kTGKJ2Ys7MGA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@octokit/plugin-paginate-rest": { + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-14.0.0.tgz", + "integrity": "sha512-fNVRE7ufJiAA3XUrha2omTA39M6IXIc6GIZLvlbsm8QOQCYvpq/LkMNGyFlB1d8hTDzsAXa3OKtybdMAYsV/fw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@octokit/types": "^16.0.0" + }, + "engines": { + "node": ">= 20" + }, + "peerDependencies": { + "@octokit/core": ">=6" + } + }, + "node_modules/@octokit/plugin-request-log": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/@octokit/plugin-request-log/-/plugin-request-log-6.0.0.tgz", + "integrity": "sha512-UkOzeEN3W91/eBq9sPZNQ7sUBvYCqYbrrD8gTbBuGtHEuycE4/awMXcYvx6sVYo7LypPhmQwwpUe4Yyu4QZN5Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 20" + }, + "peerDependencies": { + "@octokit/core": ">=6" + } + }, + "node_modules/@octokit/plugin-rest-endpoint-methods": { + "version": "17.0.0", + "resolved": "https://registry.npmjs.org/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-17.0.0.tgz", + "integrity": "sha512-B5yCyIlOJFPqUUeiD0cnBJwWJO8lkJs5d8+ze9QDP6SvfiXSz1BF+91+0MeI1d2yxgOhU/O+CvtiZ9jSkHhFAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@octokit/types": "^16.0.0" + }, + "engines": { + "node": ">= 20" + }, + "peerDependencies": { + "@octokit/core": ">=6" + } + }, + "node_modules/@octokit/request": { + "version": "10.0.8", + "resolved": "https://registry.npmjs.org/@octokit/request/-/request-10.0.8.tgz", + "integrity": "sha512-SJZNwY9pur9Agf7l87ywFi14W+Hd9Jg6Ifivsd33+/bGUQIjNujdFiXII2/qSlN2ybqUHfp5xpekMEjIBTjlSw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@octokit/endpoint": "^11.0.3", + "@octokit/request-error": "^7.0.2", + "@octokit/types": "^16.0.0", + "fast-content-type-parse": "^3.0.0", + "json-with-bigint": "^3.5.3", + "universal-user-agent": "^7.0.2" + }, + "engines": { + "node": ">= 20" + } + }, + "node_modules/@octokit/request-error": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-7.1.0.tgz", + "integrity": "sha512-KMQIfq5sOPpkQYajXHwnhjCC0slzCNScLHs9JafXc4RAJI+9f+jNDlBNaIMTvazOPLgb4BnlhGJOTbnN0wIjPw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@octokit/types": "^16.0.0" + }, + "engines": { + "node": ">= 20" + } + }, + "node_modules/@octokit/rest": { + "version": "22.0.1", + "resolved": "https://registry.npmjs.org/@octokit/rest/-/rest-22.0.1.tgz", + "integrity": "sha512-Jzbhzl3CEexhnivb1iQ0KJ7s5vvjMWcmRtq5aUsKmKDrRW6z3r84ngmiFKFvpZjpiU/9/S6ITPFRpn5s/3uQJw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@octokit/core": "^7.0.6", + "@octokit/plugin-paginate-rest": "^14.0.0", + "@octokit/plugin-request-log": "^6.0.0", + "@octokit/plugin-rest-endpoint-methods": "^17.0.0" + }, + "engines": { + "node": ">= 20" + } + }, + "node_modules/@octokit/types": { + "version": "16.0.0", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-16.0.0.tgz", + "integrity": "sha512-sKq+9r1Mm4efXW1FCk7hFSeJo4QKreL/tTbR0rz/qx/r1Oa2VV83LTA/H/MuCOX7uCIJmQVRKBcbmWoySjAnSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@octokit/openapi-types": "^27.0.0" + } + }, + "node_modules/@phun-ky/typeof": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@phun-ky/typeof/-/typeof-2.0.3.tgz", + "integrity": "sha512-oeQJs1aa8Ghke8JIK9yuq/+KjMiaYeDZ38jx7MhkXncXlUKjqQ3wEm2X3qCKyjo+ZZofZj+WsEEiqkTtRuE2xQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^20.9.0 || >=22.0.0", + "npm": ">=10.8.2" + }, + "funding": { + "url": "https://github.com/phun-ky/typeof?sponsor=1" + } + }, + "node_modules/@platformatic/vfs": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@platformatic/vfs/-/vfs-0.3.0.tgz", + "integrity": "sha512-BGXVOAz59HYPZCgI9v/MtiTF/ng8YAWtkooxVwOPR3TatNgGy0WZ/t15ScqytiZi5NdSRqWNRfuAbXKeAlKDdQ==", + "license": "MIT", + "engines": { + "node": ">= 22" + } + }, + "node_modules/@release-it/conventional-changelog": { + "version": "10.0.5", + "resolved": "https://registry.npmjs.org/@release-it/conventional-changelog/-/conventional-changelog-10.0.5.tgz", + "integrity": "sha512-Dxul3YlUsDLbIg+aR6T0QR/VyKwuJNR3GZM8mKVEwFO8GpH2H5vgnN7kacEvq/Qk5puDadOVbhbUq/KBjraemQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@conventional-changelog/git-client": "^2.5.1", + "concat-stream": "^2.0.0", + "conventional-changelog": "^7.1.1", + "conventional-changelog-angular": "^8.1.0", + "conventional-changelog-conventionalcommits": "^9.1.0", + "conventional-recommended-bump": "^11.2.0", + "semver": "^7.7.3" + }, + "engines": { + "node": "^20.12.0 || >=22.0.0" + }, + "peerDependencies": { + "release-it": "^18.0.0 || ^19.0.0" + } + }, + "node_modules/@rtsao/scc": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@rtsao/scc/-/scc-1.1.0.tgz", + "integrity": "sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==", + "dev": true, + "license": "MIT" + }, + "node_modules/@simple-libs/child-process-utils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@simple-libs/child-process-utils/-/child-process-utils-1.0.1.tgz", + "integrity": "sha512-3nWd8irxvDI6v856wpPCHZ+08iQR0oHTZfzAZmnbsLzf+Sf1odraP6uKOHDZToXq3RPRV/LbqGVlSCogm9cJjg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@simple-libs/stream-utils": "^1.1.0", + "@types/node": "^22.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://ko-fi.com/dangreen" + } + }, + "node_modules/@simple-libs/stream-utils": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@simple-libs/stream-utils/-/stream-utils-1.1.0.tgz", + "integrity": "sha512-6rsHTjodIn/t90lv5snQjRPVtOosM7Vp0AKdrObymq45ojlgVwnpAqdc+0OBBrpEiy31zZ6/TKeIVqV1HwvnuQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "^22.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://ko-fi.com/dangreen" + } + }, + "node_modules/@tootallnate/quickjs-emscripten": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@tootallnate/quickjs-emscripten/-/quickjs-emscripten-0.23.0.tgz", + "integrity": "sha512-C5Mc6rdnsaJDjO3UpGW/CQTHtCKaYlScZTly4JIu97Jxo/odCiH0ITnDXSJPTOrEKk/ycSZ0AOgTmkDtkOsvIA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/babel__generator": { + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.27.0.tgz", + "integrity": "sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__traverse": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.28.0.tgz", + "integrity": "sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.28.2" + } + }, + "node_modules/@types/estree": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", + "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/json5": { + "version": "0.0.29", + "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", + "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-hov8bUuiLiyFPGyFPE1lwWhmzYbirOXQNNo40+y3zow8aFVTeyn3VWL0VFFfdNddA8S4Vf0Tc062rzyNr7Paag==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/multistream": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/@types/multistream/-/multistream-4.1.3.tgz", + "integrity": "sha512-t57vmDEJOZuC0M3IrZYfCd9wolTcr3ZTCGk1iwHNosvgBX+7/SMvCGcR8wP9lidpelBZQ12crSuINOxkk0azPA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/multistream/node_modules/@types/node": { + "version": "25.2.3", + "resolved": "https://registry.npmjs.org/@types/node/-/node-25.2.3.tgz", + "integrity": "sha512-m0jEgYlYz+mDJZ2+F4v8D1AyQb+QzsNqRuI7xg1VQX/KlKS0qT9r1Mo16yo5F/MtifXFgaofIFsdFMox2SxIbQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~7.16.0" + } + }, + "node_modules/@types/multistream/node_modules/undici-types": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.16.0.tgz", + "integrity": "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/node": { + "version": "22.19.17", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.19.17.tgz", + "integrity": "sha512-wGdMcf+vPYM6jikpS/qhg6WiqSV/OhG+jeeHT/KlVqxYfD40iYJf9/AE1uQxVWFvU7MipKRkRv8NSHiCGgPr8Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~6.21.0" + } + }, + "node_modules/@types/normalize-package-data": { + "version": "2.4.4", + "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.4.tgz", + "integrity": "sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/parse-path": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/@types/parse-path/-/parse-path-7.1.0.tgz", + "integrity": "sha512-EULJ8LApcVEPbrfND0cRQqutIOdiIgJ1Mgrhpy755r14xMohPTEpkV/k28SJvuOs9bHRFW8x+KeDAEPiGQPB9Q==", + "deprecated": "This is a stub types definition. parse-path provides its own type definitions, so you do not need this installed.", + "dev": true, + "license": "MIT", + "dependencies": { + "parse-path": "*" + } + }, + "node_modules/@types/picomatch": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/picomatch/-/picomatch-3.0.2.tgz", + "integrity": "sha512-n0i8TD3UDB7paoMMxA3Y65vUncFJXjcUf7lQY7YyKGl6031FNjfsLs6pdLFCy2GNFxItPJG8GvvpbZc2skH7WA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/resolve": { + "version": "1.20.6", + "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-1.20.6.tgz", + "integrity": "sha512-A4STmOXPhMUtHH+S6ymgE2GiBSMqf4oTvcQZMcHzokuTLVYzXTB8ttjcgxOVaAp2lGwEdzZ0J+cRbbeevQj1UQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/stream-meter": { + "version": "0.0.22", + "resolved": "https://registry.npmjs.org/@types/stream-meter/-/stream-meter-0.0.22.tgz", + "integrity": "sha512-gqqudd3q69aEmixGIL1p2qN1AySZ+UJ2j6y70ZXZBg8/SmzTM1MvkOKvmuelKNIpPS8bKml6Gw03pfbnI8YpwQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/stream-meter/node_modules/@types/node": { + "version": "25.2.3", + "resolved": "https://registry.npmjs.org/@types/node/-/node-25.2.3.tgz", + "integrity": "sha512-m0jEgYlYz+mDJZ2+F4v8D1AyQb+QzsNqRuI7xg1VQX/KlKS0qT9r1Mo16yo5F/MtifXFgaofIFsdFMox2SxIbQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~7.16.0" + } + }, + "node_modules/@types/stream-meter/node_modules/undici-types": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.16.0.tgz", + "integrity": "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/tar": { + "version": "6.1.13", + "resolved": "https://registry.npmjs.org/@types/tar/-/tar-6.1.13.tgz", + "integrity": "sha512-IznnlmU5f4WcGTh2ltRu/Ijpmk8wiWXfF0VA4s+HPjHZgvFggk1YaIkbo5krX/zUCzWF8N/l4+W/LNxnvAJ8nw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*", + "minipass": "^4.0.0" + } + }, + "node_modules/@types/tar/node_modules/@types/node": { + "version": "25.2.3", + "resolved": "https://registry.npmjs.org/@types/node/-/node-25.2.3.tgz", + "integrity": "sha512-m0jEgYlYz+mDJZ2+F4v8D1AyQb+QzsNqRuI7xg1VQX/KlKS0qT9r1Mo16yo5F/MtifXFgaofIFsdFMox2SxIbQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~7.16.0" + } + }, + "node_modules/@types/tar/node_modules/minipass": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-4.2.8.tgz", + "integrity": "sha512-fNzuVyifolSLFL4NzpF+wEF4qrgqaaKX0haXPQEdQ7NKAN+WecoKMHV09YcuL/DHxrUsYQOK3MiuDf7Ip2OXfQ==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=8" + } + }, + "node_modules/@types/tar/node_modules/undici-types": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.16.0.tgz", + "integrity": "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/unzipper": { + "version": "0.10.11", + "resolved": "https://registry.npmjs.org/@types/unzipper/-/unzipper-0.10.11.tgz", + "integrity": "sha512-D25im2zjyMCcgL9ag6N46+wbtJBnXIr7SI4zHf9eJD2Dw2tEB5e+p5MYkrxKIVRscs5QV0EhtU9rgXSPx90oJg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/unzipper/node_modules/@types/node": { + "version": "25.2.3", + "resolved": "https://registry.npmjs.org/@types/node/-/node-25.2.3.tgz", + "integrity": "sha512-m0jEgYlYz+mDJZ2+F4v8D1AyQb+QzsNqRuI7xg1VQX/KlKS0qT9r1Mo16yo5F/MtifXFgaofIFsdFMox2SxIbQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~7.16.0" + } + }, + "node_modules/@types/unzipper/node_modules/undici-types": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.16.0.tgz", + "integrity": "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "8.55.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.55.0.tgz", + "integrity": "sha512-1y/MVSz0NglV1ijHC8OT49mPJ4qhPYjiK08YUQVbIOyu+5k862LKUHFkpKHWu//zmr7hDR2rhwUm6gnCGNmGBQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/regexpp": "^4.12.2", + "@typescript-eslint/scope-manager": "8.55.0", + "@typescript-eslint/type-utils": "8.55.0", + "@typescript-eslint/utils": "8.55.0", + "@typescript-eslint/visitor-keys": "8.55.0", + "ignore": "^7.0.5", + "natural-compare": "^1.4.0", + "ts-api-utils": "^2.4.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^8.55.0", + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/ignore": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz", + "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/@typescript-eslint/parser": { + "version": "8.55.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.55.0.tgz", + "integrity": "sha512-4z2nCSBfVIMnbuu8uinj+f0o4qOeggYJLbjpPHka3KH1om7e+H9yLKTYgksTaHcGco+NClhhY2vyO3HsMH1RGw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/scope-manager": "8.55.0", + "@typescript-eslint/types": "8.55.0", + "@typescript-eslint/typescript-estree": "8.55.0", + "@typescript-eslint/visitor-keys": "8.55.0", + "debug": "^4.4.3" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/project-service": { + "version": "8.55.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.55.0.tgz", + "integrity": "sha512-zRcVVPFUYWa3kNnjaZGXSu3xkKV1zXy8M4nO/pElzQhFweb7PPtluDLQtKArEOGmjXoRjnUZ29NjOiF0eCDkcQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/tsconfig-utils": "^8.55.0", + "@typescript-eslint/types": "^8.55.0", + "debug": "^4.4.3" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "8.55.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.55.0.tgz", + "integrity": "sha512-fVu5Omrd3jeqeQLiB9f1YsuK/iHFOwb04bCtY4BSCLgjNbOD33ZdV6KyEqplHr+IlpgT0QTZ/iJ+wT7hvTx49Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.55.0", + "@typescript-eslint/visitor-keys": "8.55.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/tsconfig-utils": { + "version": "8.55.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.55.0.tgz", + "integrity": "sha512-1R9cXqY7RQd7WuqSN47PK9EDpgFUK3VqdmbYrvWJZYDd0cavROGn+74ktWBlmJ13NXUQKlZ/iAEQHI/V0kKe0Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/type-utils": { + "version": "8.55.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.55.0.tgz", + "integrity": "sha512-x1iH2unH4qAt6I37I2CGlsNs+B9WGxurP2uyZLRz6UJoZWDBx9cJL1xVN/FiOmHEONEg6RIufdvyT0TEYIgC5g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.55.0", + "@typescript-eslint/typescript-estree": "8.55.0", + "@typescript-eslint/utils": "8.55.0", + "debug": "^4.4.3", + "ts-api-utils": "^2.4.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/types": { + "version": "8.55.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.55.0.tgz", + "integrity": "sha512-ujT0Je8GI5BJWi+/mMoR0wxwVEQaxM+pi30xuMiJETlX80OPovb2p9E8ss87gnSVtYXtJoU9U1Cowcr6w2FE0w==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "8.55.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.55.0.tgz", + "integrity": "sha512-EwrH67bSWdx/3aRQhCoxDaHM+CrZjotc2UCCpEDVqfCE+7OjKAGWNY2HsCSTEVvWH2clYQK8pdeLp42EVs+xQw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/project-service": "8.55.0", + "@typescript-eslint/tsconfig-utils": "8.55.0", + "@typescript-eslint/types": "8.55.0", + "@typescript-eslint/visitor-keys": "8.55.0", + "debug": "^4.4.3", + "minimatch": "^9.0.5", + "semver": "^7.7.3", + "tinyglobby": "^0.2.15", + "ts-api-utils": "^2.4.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/typescript-estree/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/@typescript-eslint/utils": { + "version": "8.55.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.55.0.tgz", + "integrity": "sha512-BqZEsnPGdYpgyEIkDC1BadNY8oMwckftxBT+C8W0g1iKPdeqKZBtTfnvcq0nf60u7MkjFO8RBvpRGZBPw4L2ow==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.9.1", + "@typescript-eslint/scope-manager": "8.55.0", + "@typescript-eslint/types": "8.55.0", + "@typescript-eslint/typescript-estree": "8.55.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "8.55.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.55.0.tgz", + "integrity": "sha512-AxNRwEie8Nn4eFS1FzDMJWIISMGoXMb037sgCBJ3UR6o0fQTzr2tqN9WT+DkWJPhIdQCfV7T6D387566VtnCJA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.55.0", + "eslint-visitor-keys": "^4.2.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@yao-pkg/pkg-fetch": { + "version": "3.5.33", + "resolved": "https://registry.npmjs.org/@yao-pkg/pkg-fetch/-/pkg-fetch-3.5.33.tgz", + "integrity": "sha512-j2UoH+eP4VobfovQg1gkWwDoB4O/tv8rlLnEjUEEHuWXJ5eBLNUIrobMSEp773/2pgUJUfqqPUFIhS1pN8OZuQ==", + "license": "MIT", + "dependencies": { + "https-proxy-agent": "^5.0.0", + "node-fetch": "^2.6.6", + "picocolors": "^1.1.0", + "progress": "^2.0.3", + "semver": "^7.3.5", + "tar-fs": "^3.1.1", + "yargs": "^16.2.0" + }, + "bin": { + "pkg-fetch": "lib-es5/bin.js" + } + }, + "node_modules/@yao-pkg/pkg-fetch/node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "license": "MIT", + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/@yao-pkg/pkg-fetch/node_modules/https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "license": "MIT", + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/@yao-pkg/pkg-fetch/node_modules/tar-fs": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-3.1.1.tgz", + "integrity": "sha512-LZA0oaPOc2fVo82Txf3gw+AkEd38szODlptMYejQUhndHMLQ9M059uXR+AfS7DNo0NpINvSqDsvyaCrBVkptWg==", + "license": "MIT", + "dependencies": { + "pump": "^3.0.0", + "tar-stream": "^3.1.5" + }, + "optionalDependencies": { + "bare-fs": "^4.0.1", + "bare-path": "^3.0.0" + } + }, + "node_modules/@yao-pkg/pkg-fetch/node_modules/tar-stream": { + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-3.1.7.tgz", + "integrity": "sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ==", + "license": "MIT", + "dependencies": { + "b4a": "^1.6.4", + "fast-fifo": "^1.2.0", + "streamx": "^2.15.0" + } + }, + "node_modules/acorn": { + "version": "8.15.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", + "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", + "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/agent-base": { + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.4.tgz", + "integrity": "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 14" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ansi-escapes": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-7.3.0.tgz", + "integrity": "sha512-BvU8nYgGQBxcmMuEeUEmNTvrMVjJNSH7RgW24vXexN4Ven6qCvy4TntnvlnwnMLTVlcRQQdbRY8NKnaIoeWDNg==", + "dev": true, + "license": "MIT", + "dependencies": { + "environment": "^1.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ansi-regex": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "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==", + "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/array-buffer-byte-length": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.2.tgz", + "integrity": "sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "is-array-buffer": "^3.0.5" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array-ify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-ify/-/array-ify-1.0.0.tgz", + "integrity": "sha512-c5AMf34bKdvPhQ7tBGhqkgKNUzMr4WUs+WDtC2ZUGOUncbxKMTvqxYctiseW3+L4bA8ec+GcZ6/A/FW4m8ukng==", + "dev": true, + "license": "MIT" + }, + "node_modules/array-includes": { + "version": "3.1.9", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.9.tgz", + "integrity": "sha512-FmeCCAenzH0KH381SPT5FZmiA/TmpndpcaShhfgEN9eCVjnFBqq3l1xrI42y8+PPLI6hypzou4GXw00WHmPBLQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "define-properties": "^1.2.1", + "es-abstract": "^1.24.0", + "es-object-atoms": "^1.1.1", + "get-intrinsic": "^1.3.0", + "is-string": "^1.1.1", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.findlastindex": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.6.tgz", + "integrity": "sha512-F/TKATkzseUExPlfvmwQKGITM3DGTK+vkAsCZoDc5daVygbJBnjEUCbgkAvVFsgfXfX4YIqZ/27G3k3tdXrTxQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.9", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "es-shim-unscopables": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.flat": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.3.tgz", + "integrity": "sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.flatmap": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.3.tgz", + "integrity": "sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/arraybuffer.prototype.slice": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.4.tgz", + "integrity": "sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-buffer-byte-length": "^1.0.1", + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "is-array-buffer": "^3.0.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/ast-types": { + "version": "0.13.4", + "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.13.4.tgz", + "integrity": "sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w==", + "dev": true, + "license": "MIT", + "dependencies": { + "tslib": "^2.0.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/async-function": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/async-function/-/async-function-1.0.0.tgz", + "integrity": "sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/async-retry": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/async-retry/-/async-retry-1.3.3.tgz", + "integrity": "sha512-wfr/jstw9xNi/0teMHrRW7dsz3Lt5ARhYNZ2ewpadnhaIp5mbALhOAP+EAdsC7t4Z6wqsDVv9+W6gm1Dk9mEyw==", + "dev": true, + "license": "MIT", + "dependencies": { + "retry": "0.13.1" + } + }, + "node_modules/available-typed-arrays": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", + "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "possible-typed-array-names": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/b4a": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.7.3.tgz", + "integrity": "sha512-5Q2mfq2WfGuFp3uS//0s6baOJLMoVduPYVeNmDYxu5OUA1/cBfvr2RIS7vi62LdNj/urk1hfmj867I3qt6uZ7Q==", + "license": "Apache-2.0", + "peerDependencies": { + "react-native-b4a": "*" + }, + "peerDependenciesMeta": { + "react-native-b4a": { + "optional": true + } + } + }, + "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/bare-events": { + "version": "2.8.2", + "resolved": "https://registry.npmjs.org/bare-events/-/bare-events-2.8.2.tgz", + "integrity": "sha512-riJjyv1/mHLIPX4RwiK+oW9/4c3TEUeORHKefKAKnZ5kyslbN+HXowtbaVEqt4IMUB7OXlfixcs6gsFeo/jhiQ==", + "license": "Apache-2.0", + "peerDependencies": { + "bare-abort-controller": "*" + }, + "peerDependenciesMeta": { + "bare-abort-controller": { + "optional": true + } + } + }, + "node_modules/bare-fs": { + "version": "4.5.3", + "resolved": "https://registry.npmjs.org/bare-fs/-/bare-fs-4.5.3.tgz", + "integrity": "sha512-9+kwVx8QYvt3hPWnmb19tPnh38c6Nihz8Lx3t0g9+4GoIf3/fTgYwM4Z6NxgI+B9elLQA7mLE9PpqcWtOMRDiQ==", + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "bare-events": "^2.5.4", + "bare-path": "^3.0.0", + "bare-stream": "^2.6.4", + "bare-url": "^2.2.2", + "fast-fifo": "^1.3.2" + }, + "engines": { + "bare": ">=1.16.0" + }, + "peerDependencies": { + "bare-buffer": "*" + }, + "peerDependenciesMeta": { + "bare-buffer": { + "optional": true + } + } + }, + "node_modules/bare-os": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/bare-os/-/bare-os-3.6.2.tgz", + "integrity": "sha512-T+V1+1srU2qYNBmJCXZkUY5vQ0B4FSlL3QDROnKQYOqeiQR8UbjNHlPa+TIbM4cuidiN9GaTaOZgSEgsvPbh5A==", + "license": "Apache-2.0", + "optional": true, + "engines": { + "bare": ">=1.14.0" + } + }, + "node_modules/bare-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bare-path/-/bare-path-3.0.0.tgz", + "integrity": "sha512-tyfW2cQcB5NN8Saijrhqn0Zh7AnFNsnczRcuWODH0eYAXBsJ5gVxAUuNr7tsHSC6IZ77cA0SitzT+s47kot8Mw==", + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "bare-os": "^3.0.1" + } + }, + "node_modules/bare-stream": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/bare-stream/-/bare-stream-2.7.0.tgz", + "integrity": "sha512-oyXQNicV1y8nc2aKffH+BUHFRXmx6VrPzlnaEvMhram0nPBrKcEdcyBg5r08D0i8VxngHFAiVyn1QKXpSG0B8A==", + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "streamx": "^2.21.0" + }, + "peerDependencies": { + "bare-buffer": "*", + "bare-events": "*" + }, + "peerDependenciesMeta": { + "bare-buffer": { + "optional": true + }, + "bare-events": { + "optional": true + } + } + }, + "node_modules/bare-url": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/bare-url/-/bare-url-2.3.2.tgz", + "integrity": "sha512-ZMq4gd9ngV5aTMa5p9+UfY0b3skwhHELaDkhEHetMdX0LRkW9kzaym4oo/Eh+Ghm0CCDuMTsRIGM/ytUc1ZYmw==", + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "bare-path": "^3.0.0" + } + }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "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/basic-ftp": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/basic-ftp/-/basic-ftp-5.1.0.tgz", + "integrity": "sha512-RkaJzeJKDbaDWTIPiJwubyljaEPwpVWkm9Rt5h9Nd6h7tEXTJ3VB4qxdZBioV7JO5yLUaOKwz7vDOzlncUsegw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/before-after-hook": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/before-after-hook/-/before-after-hook-4.0.0.tgz", + "integrity": "sha512-q6tR3RPqIB1pMiTRMFcZwuG5T8vwp+vUvEG0vuI6B+Rikh5BfPp2fQ82c925FOs+b0lcFQ8CFrL+KbilfZFhOQ==", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/bl": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", + "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", + "license": "MIT", + "dependencies": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } + }, + "node_modules/bluebird": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", + "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", + "license": "MIT" + }, + "node_modules/brace-expansion": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "dev": true, + "license": "MIT", + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/bundle-name": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bundle-name/-/bundle-name-4.1.0.tgz", + "integrity": "sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "run-applescript": "^7.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/c12": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/c12/-/c12-3.3.3.tgz", + "integrity": "sha512-750hTRvgBy5kcMNPdh95Qo+XUBeGo8C7nsKSmedDmaQI+E0r82DwHeM6vBewDe4rGFbnxoa4V9pw+sPh5+Iz8Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "chokidar": "^5.0.0", + "confbox": "^0.2.2", + "defu": "^6.1.4", + "dotenv": "^17.2.3", + "exsolve": "^1.0.8", + "giget": "^2.0.0", + "jiti": "^2.6.1", + "ohash": "^2.0.11", + "pathe": "^2.0.3", + "perfect-debounce": "^2.0.0", + "pkg-types": "^2.3.0", + "rc9": "^2.1.2" + }, + "peerDependencies": { + "magicast": "*" + }, + "peerDependenciesMeta": { + "magicast": { + "optional": true + } + } + }, + "node_modules/call-bind": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz", + "integrity": "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.0", + "es-define-property": "^1.0.0", + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/call-bound": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", + "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "get-intrinsic": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/chalk": { + "version": "5.6.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.6.2.tgz", + "integrity": "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/chardet": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-2.1.1.tgz", + "integrity": "sha512-PsezH1rqdV9VvyNhxxOW32/d75r01NY7TQCmOqomRo15ZSOKbpTFVsfjghxo6JloQUCGnH4k1LGu0R4yCLlWQQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/chokidar": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-5.0.0.tgz", + "integrity": "sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw==", + "dev": true, + "license": "MIT", + "dependencies": { + "readdirp": "^5.0.0" + }, + "engines": { + "node": ">= 20.19.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/chownr": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-3.0.0.tgz", + "integrity": "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==", + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=18" + } + }, + "node_modules/ci-info": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-4.4.0.tgz", + "integrity": "sha512-77PSwercCZU2Fc4sX94eF8k8Pxte6JAwL4/ICZLFjJLqegs7kCuAsqqj/70NQF6TvDpgFjkubQB2FW2ZZddvQg==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/citty": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/citty/-/citty-0.1.6.tgz", + "integrity": "sha512-tskPPKEs8D2KPafUypv2gxwJP8h/OaJmC82QQGGDQcHvXX43xF2VDACcJVmZ0EuSxkpO9Kc4MlrA3q0+FG58AQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "consola": "^3.2.3" + } + }, + "node_modules/cli-cursor": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-5.0.0.tgz", + "integrity": "sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==", + "dev": true, + "license": "MIT", + "dependencies": { + "restore-cursor": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cli-spinners": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-3.4.0.tgz", + "integrity": "sha512-bXfOC4QcT1tKXGorxL3wbJm6XJPDqEnij2gQ2m7ESQuE+/z9YFIWnl/5RpTiKWbMq3EVKR4fRLJGn6DVfu0mpw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cli-truncate": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-4.0.0.tgz", + "integrity": "sha512-nPdaFdQ0h/GEigbPClz11D0v/ZJEwxmeVZGeMo3Z5StPtUTkA9o1lD6QwoirYiSDzbcwn2XcjwmCp68W1IS4TA==", + "dev": true, + "license": "MIT", + "dependencies": { + "slice-ansi": "^5.0.0", + "string-width": "^7.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cli-truncate/node_modules/emoji-regex": { + "version": "10.6.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.6.0.tgz", + "integrity": "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==", + "dev": true, + "license": "MIT" + }, + "node_modules/cli-truncate/node_modules/string-width": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", + "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^10.3.0", + "get-east-asian-width": "^1.0.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cli-width": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-4.1.0.tgz", + "integrity": "sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">= 12" + } + }, + "node_modules/cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "license": "ISC", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "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==", + "license": "MIT", + "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==", + "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==", + "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==", + "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==", + "license": "MIT" + }, + "node_modules/colorette": { + "version": "2.0.20", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", + "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", + "dev": true, + "license": "MIT" + }, + "node_modules/commander": { + "version": "13.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-13.1.0.tgz", + "integrity": "sha512-/rFeCpNJQbhSZjGVwO9RFV3xPqbnERS8MmIQzCtD/zl6gpJuV/bMLuN92oG3F7d8oDEHHRrujSXNUr8fpjntKw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/compare-func": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/compare-func/-/compare-func-2.0.0.tgz", + "integrity": "sha512-zHig5N+tPWARooBnb0Zx1MFcdfpyJrfTJ3Y5L+IFvUm8rM74hHz66z0gw0x4tijh5CorKkKUCnW82R2vmpeCRA==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-ify": "^1.0.0", + "dot-prop": "^5.1.0" + } + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true, + "license": "MIT" + }, + "node_modules/concat-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-2.0.0.tgz", + "integrity": "sha512-MWufYdFw53ccGjCA+Ol7XJYpAlW6/prSMzuPOTRnJGcGzuhLn4Scrz7qf6o8bROZ514ltazcIFJZevcfbo0x7A==", + "dev": true, + "engines": [ + "node >= 6.0" + ], + "license": "MIT", + "dependencies": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.0.2", + "typedarray": "^0.0.6" + } + }, + "node_modules/confbox": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/confbox/-/confbox-0.2.4.tgz", + "integrity": "sha512-ysOGlgTFbN2/Y6Cg3Iye8YKulHw+R2fNXHrgSmXISQdMnomY6eNDprVdW9R5xBguEqI954+S6709UyiO7B+6OQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/confusing-browser-globals": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/confusing-browser-globals/-/confusing-browser-globals-1.0.11.tgz", + "integrity": "sha512-JsPKdmh8ZkmnHxDk55FZ1TqVLvEQTvoByJZRN9jzI0UjxK/QgAmsphz7PGtqgPieQZ/CQcHWXCR7ATDNhGe+YA==", + "dev": true, + "license": "MIT" + }, + "node_modules/consola": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/consola/-/consola-3.4.2.tgz", + "integrity": "sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^14.18.0 || >=16.10.0" + } + }, + "node_modules/conventional-changelog": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/conventional-changelog/-/conventional-changelog-7.1.1.tgz", + "integrity": "sha512-rlqa8Lgh8YzT3Akruk05DR79j5gN9NCglHtJZwpi6vxVeaoagz+84UAtKQj/sT+RsfGaZkt3cdFCjcN6yjr5sw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@conventional-changelog/git-client": "^2.5.1", + "@types/normalize-package-data": "^2.4.4", + "conventional-changelog-preset-loader": "^5.0.0", + "conventional-changelog-writer": "^8.2.0", + "conventional-commits-parser": "^6.2.0", + "fd-package-json": "^2.0.0", + "meow": "^13.0.0", + "normalize-package-data": "^7.0.0" + }, + "bin": { + "conventional-changelog": "dist/cli/index.js" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/conventional-changelog-angular": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/conventional-changelog-angular/-/conventional-changelog-angular-8.1.0.tgz", + "integrity": "sha512-GGf2Nipn1RUCAktxuVauVr1e3r8QrLP/B0lEUsFktmGqc3ddbQkhoJZHJctVU829U1c6mTSWftrVOCHaL85Q3w==", + "dev": true, + "license": "ISC", + "dependencies": { + "compare-func": "^2.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/conventional-changelog-conventionalcommits": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/conventional-changelog-conventionalcommits/-/conventional-changelog-conventionalcommits-9.1.0.tgz", + "integrity": "sha512-MnbEysR8wWa8dAEvbj5xcBgJKQlX/m0lhS8DsyAAWDHdfs2faDJxTgzRYlRYpXSe7UiKrIIlB4TrBKU9q9DgkA==", + "dev": true, + "license": "ISC", + "dependencies": { + "compare-func": "^2.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/conventional-changelog-preset-loader": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/conventional-changelog-preset-loader/-/conventional-changelog-preset-loader-5.0.0.tgz", + "integrity": "sha512-SetDSntXLk8Jh1NOAl1Gu5uLiCNSYenB5tm0YVeZKePRIgDW9lQImromTwLa3c/Gae298tsgOM+/CYT9XAl0NA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/conventional-changelog-writer": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/conventional-changelog-writer/-/conventional-changelog-writer-8.2.0.tgz", + "integrity": "sha512-Y2aW4596l9AEvFJRwFGJGiQjt2sBYTjPD18DdvxX9Vpz0Z7HQ+g1Z+6iYDAm1vR3QOJrDBkRHixHK/+FhkR6Pw==", + "dev": true, + "license": "MIT", + "dependencies": { + "conventional-commits-filter": "^5.0.0", + "handlebars": "^4.7.7", + "meow": "^13.0.0", + "semver": "^7.5.2" + }, + "bin": { + "conventional-changelog-writer": "dist/cli/index.js" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/conventional-commits-filter": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/conventional-commits-filter/-/conventional-commits-filter-5.0.0.tgz", + "integrity": "sha512-tQMagCOC59EVgNZcC5zl7XqO30Wki9i9J3acbUvkaosCT6JX3EeFwJD7Qqp4MCikRnzS18WXV3BLIQ66ytu6+Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/conventional-commits-parser": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/conventional-commits-parser/-/conventional-commits-parser-6.2.1.tgz", + "integrity": "sha512-20pyHgnO40rvfI0NGF/xiEoFMkXDtkF8FwHvk5BokoFoCuTQRI8vrNCNFWUOfuolKJMm1tPCHc8GgYEtr1XRNA==", + "dev": true, + "license": "MIT", + "dependencies": { + "meow": "^13.0.0" + }, + "bin": { + "conventional-commits-parser": "dist/cli/index.js" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/conventional-recommended-bump": { + "version": "11.2.0", + "resolved": "https://registry.npmjs.org/conventional-recommended-bump/-/conventional-recommended-bump-11.2.0.tgz", + "integrity": "sha512-lqIdmw330QdMBgfL0e6+6q5OMKyIpy4OZNmepit6FS3GldhkG+70drZjuZ0A5NFpze5j85dlYs3GabQXl6sMHw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@conventional-changelog/git-client": "^2.5.1", + "conventional-changelog-preset-loader": "^5.0.0", + "conventional-commits-filter": "^5.0.0", + "conventional-commits-parser": "^6.1.0", + "meow": "^13.0.0" + }, + "bin": { + "conventional-recommended-bump": "dist/cli/index.js" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", + "license": "MIT" + }, + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/data-uri-to-buffer": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-6.0.2.tgz", + "integrity": "sha512-7hvf7/GW8e86rW0ptuwS3OcBGDjIi6SZva7hCyWC0yYry2cOPmLIjXAUHI6DK2HsnwJd9ifmt57i8eV2n4YNpw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 14" + } + }, + "node_modules/data-view-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.2.tgz", + "integrity": "sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/data-view-byte-length": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.2.tgz", + "integrity": "sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/inspect-js" + } + }, + "node_modules/data-view-byte-offset": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.1.tgz", + "integrity": "sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/decompress-response": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", + "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", + "license": "MIT", + "dependencies": { + "mimic-response": "^3.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/deep-extend": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", + "license": "MIT", + "engines": { + "node": ">=4.0.0" + } + }, + "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/default-browser": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/default-browser/-/default-browser-5.5.0.tgz", + "integrity": "sha512-H9LMLr5zwIbSxrmvikGuI/5KGhZ8E2zH3stkMgM5LpOWDutGM2JZaj460Udnf1a+946zc7YBgrqEWwbk7zHvGw==", + "dev": true, + "license": "MIT", + "dependencies": { + "bundle-name": "^4.1.0", + "default-browser-id": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/default-browser-id": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/default-browser-id/-/default-browser-id-5.0.1.tgz", + "integrity": "sha512-x1VCxdX4t+8wVfd1so/9w+vQ4vx7lKd2Qp5tDRutErwmR85OgmfX7RlLRMWafRMY7hbEiXIbudNrjOAPa/hL8Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/define-data-property": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/define-lazy-prop": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-3.0.0.tgz", + "integrity": "sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/define-properties": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-data-property": "^1.0.1", + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/defu": { + "version": "6.1.4", + "resolved": "https://registry.npmjs.org/defu/-/defu-6.1.4.tgz", + "integrity": "sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg==", + "dev": true, + "license": "MIT" + }, + "node_modules/degenerator": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/degenerator/-/degenerator-5.0.1.tgz", + "integrity": "sha512-TllpMR/t0M5sqCXfj85i4XaAzxmS5tVA16dqvdkMwGmzI+dXLXnw3J+3Vdv7VKw+ThlTMboK6i9rnZ6Nntj5CQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ast-types": "^0.13.4", + "escodegen": "^2.1.0", + "esprima": "^4.0.1" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/destr": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/destr/-/destr-2.0.5.tgz", + "integrity": "sha512-ugFTXCtDZunbzasqBxrK93Ik/DRYsO6S/fedkWEMKqt04xZ4csmnmwGDBAb07QWNaGMAmnTIemsYZCksjATwsA==", + "dev": true, + "license": "MIT" + }, + "node_modules/detect-libc": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", + "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", + "license": "Apache-2.0", + "engines": { + "node": ">=8" + } + }, + "node_modules/doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/dot-prop": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz", + "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-obj": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/dotenv": { + "version": "17.3.1", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-17.3.1.tgz", + "integrity": "sha512-IO8C/dzEb6O3F9/twg6ZLXz164a2fhTnEWb95H23Dm4OuN+92NmEAlTrupP9VW6Jm3sO26tQlqyvyi4CsnY9GA==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://dotenvx.com" + } + }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/duplexer2": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz", + "integrity": "sha512-asLFVfWWtJ90ZyOUHMqk7/S2w2guQKxUI2itj3d92ADHhxUSbCMGi1f1cBcJ7xM1To+pE/Khbwo1yuNbMEPKeA==", + "license": "BSD-3-Clause", + "dependencies": { + "readable-stream": "^2.0.2" + } + }, + "node_modules/duplexer2/node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "license": "MIT" + }, + "node_modules/duplexer2/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "license": "MIT", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/duplexer2/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "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==", + "license": "MIT" + }, + "node_modules/end-of-stream": { + "version": "1.4.5", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.5.tgz", + "integrity": "sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==", + "license": "MIT", + "dependencies": { + "once": "^1.4.0" + } + }, + "node_modules/environment": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/environment/-/environment-1.1.0.tgz", + "integrity": "sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/es-abstract": { + "version": "1.24.1", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.24.1.tgz", + "integrity": "sha512-zHXBLhP+QehSSbsS9Pt23Gg964240DPd6QCf8WpkqEXxQ7fhdZzYsocOr5u7apWonsS5EjZDmTF+/slGMyasvw==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-buffer-byte-length": "^1.0.2", + "arraybuffer.prototype.slice": "^1.0.4", + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "data-view-buffer": "^1.0.2", + "data-view-byte-length": "^1.0.2", + "data-view-byte-offset": "^1.0.1", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "es-set-tostringtag": "^2.1.0", + "es-to-primitive": "^1.3.0", + "function.prototype.name": "^1.1.8", + "get-intrinsic": "^1.3.0", + "get-proto": "^1.0.1", + "get-symbol-description": "^1.1.0", + "globalthis": "^1.0.4", + "gopd": "^1.2.0", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "internal-slot": "^1.1.0", + "is-array-buffer": "^3.0.5", + "is-callable": "^1.2.7", + "is-data-view": "^1.0.2", + "is-negative-zero": "^2.0.3", + "is-regex": "^1.2.1", + "is-set": "^2.0.3", + "is-shared-array-buffer": "^1.0.4", + "is-string": "^1.1.1", + "is-typed-array": "^1.1.15", + "is-weakref": "^1.1.1", + "math-intrinsics": "^1.1.0", + "object-inspect": "^1.13.4", + "object-keys": "^1.1.1", + "object.assign": "^4.1.7", + "own-keys": "^1.0.1", + "regexp.prototype.flags": "^1.5.4", + "safe-array-concat": "^1.1.3", + "safe-push-apply": "^1.0.0", + "safe-regex-test": "^1.1.0", + "set-proto": "^1.0.0", + "stop-iteration-iterator": "^1.1.0", + "string.prototype.trim": "^1.2.10", + "string.prototype.trimend": "^1.0.9", + "string.prototype.trimstart": "^1.0.8", + "typed-array-buffer": "^1.0.3", + "typed-array-byte-length": "^1.0.3", + "typed-array-byte-offset": "^1.0.4", + "typed-array-length": "^1.0.7", + "unbox-primitive": "^1.1.0", + "which-typed-array": "^1.1.19" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-object-atoms": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", + "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-shim-unscopables": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.1.0.tgz", + "integrity": "sha512-d9T8ucsEhh8Bi1woXCf+TIKDIROLG5WCkxg8geBCbvk22kzwC5G2OnXVMO6FUsvQlgUUXQ2itephWDLqDzbeCw==", + "dev": true, + "license": "MIT", + "dependencies": { + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-to-primitive": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.3.0.tgz", + "integrity": "sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-callable": "^1.2.7", + "is-date-object": "^1.0.5", + "is-symbol": "^1.0.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/esbuild": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.27.3.tgz", + "integrity": "sha512-8VwMnyGCONIs6cWue2IdpHxHnAjzxnw2Zr7MkVxB2vjmQ2ivqGFb4LEG3SMnv0Gb2F/G/2yA8zUaiL1gywDCCg==", + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.27.3", + "@esbuild/android-arm": "0.27.3", + "@esbuild/android-arm64": "0.27.3", + "@esbuild/android-x64": "0.27.3", + "@esbuild/darwin-arm64": "0.27.3", + "@esbuild/darwin-x64": "0.27.3", + "@esbuild/freebsd-arm64": "0.27.3", + "@esbuild/freebsd-x64": "0.27.3", + "@esbuild/linux-arm": "0.27.3", + "@esbuild/linux-arm64": "0.27.3", + "@esbuild/linux-ia32": "0.27.3", + "@esbuild/linux-loong64": "0.27.3", + "@esbuild/linux-mips64el": "0.27.3", + "@esbuild/linux-ppc64": "0.27.3", + "@esbuild/linux-riscv64": "0.27.3", + "@esbuild/linux-s390x": "0.27.3", + "@esbuild/linux-x64": "0.27.3", + "@esbuild/netbsd-arm64": "0.27.3", + "@esbuild/netbsd-x64": "0.27.3", + "@esbuild/openbsd-arm64": "0.27.3", + "@esbuild/openbsd-x64": "0.27.3", + "@esbuild/openharmony-arm64": "0.27.3", + "@esbuild/sunos-x64": "0.27.3", + "@esbuild/win32-arm64": "0.27.3", + "@esbuild/win32-ia32": "0.27.3", + "@esbuild/win32-x64": "0.27.3" + } + }, + "node_modules/esbuild-register": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/esbuild-register/-/esbuild-register-3.6.0.tgz", + "integrity": "sha512-H2/S7Pm8a9CL1uhp9OvjwrBh5Pvx0H8qVOxNu8Wed9Y7qv56MPtq+GGM8RJpq6glYJn9Wspr8uw7l55uyinNeg==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.3.4" + }, + "peerDependencies": { + "esbuild": ">=0.12 <1" + } + }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "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/escodegen": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.1.0.tgz", + "integrity": "sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "esprima": "^4.0.1", + "estraverse": "^5.2.0", + "esutils": "^2.0.2" + }, + "bin": { + "escodegen": "bin/escodegen.js", + "esgenerate": "bin/esgenerate.js" + }, + "engines": { + "node": ">=6.0" + }, + "optionalDependencies": { + "source-map": "~0.6.1" + } + }, + "node_modules/eslint": { + "version": "9.39.2", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.39.2.tgz", + "integrity": "sha512-LEyamqS7W5HB3ujJyvi0HQK/dtVINZvd5mAAp9eT5S/ujByGjiZLCzPcHVzuXbpJDJF/cxwHlfceVUDZ2lnSTw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.8.0", + "@eslint-community/regexpp": "^4.12.1", + "@eslint/config-array": "^0.21.1", + "@eslint/config-helpers": "^0.4.2", + "@eslint/core": "^0.17.0", + "@eslint/eslintrc": "^3.3.1", + "@eslint/js": "9.39.2", + "@eslint/plugin-kit": "^0.4.1", + "@humanfs/node": "^0.16.6", + "@humanwhocodes/module-importer": "^1.0.1", + "@humanwhocodes/retry": "^0.4.2", + "@types/estree": "^1.0.6", + "ajv": "^6.12.4", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.6", + "debug": "^4.3.2", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^8.4.0", + "eslint-visitor-keys": "^4.2.1", + "espree": "^10.4.0", + "esquery": "^1.5.0", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^8.0.0", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://eslint.org/donate" + }, + "peerDependencies": { + "jiti": "*" + }, + "peerDependenciesMeta": { + "jiti": { + "optional": true + } + } + }, + "node_modules/eslint-config-airbnb-base": { + "version": "15.0.0", + "resolved": "https://registry.npmjs.org/eslint-config-airbnb-base/-/eslint-config-airbnb-base-15.0.0.tgz", + "integrity": "sha512-xaX3z4ZZIcFLvh2oUNvcX5oEofXda7giYmuplVxoOg5A7EXJMrUyqRgR+mhDhPK8LZ4PttFOBvCYDbX3sUoUig==", + "dev": true, + "license": "MIT", + "dependencies": { + "confusing-browser-globals": "^1.0.10", + "object.assign": "^4.1.2", + "object.entries": "^1.1.5", + "semver": "^6.3.0" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + }, + "peerDependencies": { + "eslint": "^7.32.0 || ^8.2.0", + "eslint-plugin-import": "^2.25.2" + } + }, + "node_modules/eslint-config-airbnb-base/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/eslint-config-airbnb-typescript": { + "version": "18.0.0", + "resolved": "https://registry.npmjs.org/eslint-config-airbnb-typescript/-/eslint-config-airbnb-typescript-18.0.0.tgz", + "integrity": "sha512-oc+Lxzgzsu8FQyFVa4QFaVKiitTYiiW3frB9KYW5OWdPrqFc7FzxgB20hP4cHMlr+MBzGcLl3jnCOVOydL9mIg==", + "dev": true, + "license": "MIT", + "dependencies": { + "eslint-config-airbnb-base": "^15.0.0" + }, + "peerDependencies": { + "@typescript-eslint/eslint-plugin": "^7.0.0", + "@typescript-eslint/parser": "^7.0.0", + "eslint": "^8.56.0" + } + }, + "node_modules/eslint-config-prettier": { + "version": "10.1.8", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-10.1.8.tgz", + "integrity": "sha512-82GZUjRS0p/jganf6q1rEO25VSoHH0hKPCTrgillPjdI/3bgBhAE1QzHrHTizjpRvy6pGAvKjDJtk2pF9NDq8w==", + "dev": true, + "license": "MIT", + "bin": { + "eslint-config-prettier": "bin/cli.js" + }, + "funding": { + "url": "https://opencollective.com/eslint-config-prettier" + }, + "peerDependencies": { + "eslint": ">=7.0.0" + } + }, + "node_modules/eslint-import-resolver-node": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz", + "integrity": "sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^3.2.7", + "is-core-module": "^2.13.0", + "resolve": "^1.22.4" + } + }, + "node_modules/eslint-import-resolver-node/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-module-utils": { + "version": "2.12.1", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.12.1.tgz", + "integrity": "sha512-L8jSWTze7K2mTg0vos/RuLRS5soomksDPoJLXIslC7c8Wmut3bx7CPpJijDcBZtxQ5lrbUdM+s0OlNbz0DCDNw==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^3.2.7" + }, + "engines": { + "node": ">=4" + }, + "peerDependenciesMeta": { + "eslint": { + "optional": true + } + } + }, + "node_modules/eslint-module-utils/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-plugin-import": { + "version": "2.32.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.32.0.tgz", + "integrity": "sha512-whOE1HFo/qJDyX4SnXzP4N6zOWn79WhnCUY/iDR0mPfQZO8wcYE4JClzI2oZrhBnnMUCBCHZhO6VQyoBU95mZA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@rtsao/scc": "^1.1.0", + "array-includes": "^3.1.9", + "array.prototype.findlastindex": "^1.2.6", + "array.prototype.flat": "^1.3.3", + "array.prototype.flatmap": "^1.3.3", + "debug": "^3.2.7", + "doctrine": "^2.1.0", + "eslint-import-resolver-node": "^0.3.9", + "eslint-module-utils": "^2.12.1", + "hasown": "^2.0.2", + "is-core-module": "^2.16.1", + "is-glob": "^4.0.3", + "minimatch": "^3.1.2", + "object.fromentries": "^2.0.8", + "object.groupby": "^1.0.3", + "object.values": "^1.2.1", + "semver": "^6.3.1", + "string.prototype.trimend": "^1.0.9", + "tsconfig-paths": "^3.15.0" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 || ^9" + } + }, + "node_modules/eslint-plugin-import/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-plugin-import/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/eslint-scope": { + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.4.0.tgz", + "integrity": "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", + "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/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/espree": { + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-10.4.0.tgz", + "integrity": "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "acorn": "^8.15.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^4.2.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.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/esquery": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.7.0.tgz", + "integrity": "sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "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/eta": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/eta/-/eta-4.5.0.tgz", + "integrity": "sha512-qifAYjuW5AM1eEEIsFnOwB+TGqu6ynU3OKj9WbUTOtUBHFPZqL03XUW34kbp3zm19Ald+U8dEyRXaVsUck+Y1g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/bgub/eta?sponsor=1" + } + }, + "node_modules/eventemitter3": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.4.tgz", + "integrity": "sha512-mlsTRyGaPBjPedk6Bvw+aqbsXDtoAyAzm5MO7JgU+yVRyMQ5O8bD4Kcci7BS85f93veegeCPkL8R4GLClnjLFw==", + "dev": true, + "license": "MIT" + }, + "node_modules/events-universal": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/events-universal/-/events-universal-1.0.1.tgz", + "integrity": "sha512-LUd5euvbMLpwOF8m6ivPCbhQeSiYVNb8Vs0fQ8QjXo0JTkEHpz8pxdQf0gStltaPpw0Cca8b39KxvK9cfKRiAw==", + "license": "Apache-2.0", + "dependencies": { + "bare-events": "^2.7.0" + } + }, + "node_modules/execa": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-8.0.1.tgz", + "integrity": "sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==", + "dev": true, + "license": "MIT", + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^8.0.1", + "human-signals": "^5.0.0", + "is-stream": "^3.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^5.1.0", + "onetime": "^6.0.0", + "signal-exit": "^4.1.0", + "strip-final-newline": "^3.0.0" + }, + "engines": { + "node": ">=16.17" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/expand-template": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz", + "integrity": "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==", + "license": "(MIT OR WTFPL)", + "engines": { + "node": ">=6" + } + }, + "node_modules/exsolve": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/exsolve/-/exsolve-1.0.8.tgz", + "integrity": "sha512-LmDxfWXwcTArk8fUEnOfSZpHOJ6zOMUJKOtFLFqJLoKJetuQG874Uc7/Kki7zFLzYybmZhp1M7+98pfMqeX8yA==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-content-type-parse": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/fast-content-type-parse/-/fast-content-type-parse-3.0.0.tgz", + "integrity": "sha512-ZvLdcY8P+N8mGQJahJV5G4U88CSvT1rP8ApL6uETe88MBXrBHAkZlSEySdUlyztF7ccb+Znos3TFqaepHxdhBg==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "MIT" + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-fifo": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/fast-fifo/-/fast-fifo-1.3.2.tgz", + "integrity": "sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==", + "license": "MIT" + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true, + "license": "MIT" + }, + "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/fd-package-json": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/fd-package-json/-/fd-package-json-2.0.0.tgz", + "integrity": "sha512-jKmm9YtsNXN789RS/0mSzOC1NUq9mkVd65vbSSVsKdjGvYXBuE4oWe2QOEoFeRmJg+lPuZxpmrfFclNhoRMneQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "walk-up-path": "^4.0.0" + } + }, + "node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/file-entry-cache": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", + "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "flat-cache": "^4.0.0" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "dev": true, + "license": "MIT", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "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-cache": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", + "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", + "dev": true, + "license": "MIT", + "dependencies": { + "flatted": "^3.2.9", + "keyv": "^4.5.4" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/flatted": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz", + "integrity": "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==", + "dev": true, + "license": "ISC" + }, + "node_modules/for-each": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.5.tgz", + "integrity": "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-callable": "^1.2.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/fs-constants": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", + "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", + "license": "MIT" + }, + "node_modules/fs-extra": { + "version": "11.3.3", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.3.tgz", + "integrity": "sha512-VWSRii4t0AFm6ixFFmLLx1t7wS1gh+ckoa84aOeapGum0h+EZd1EhEumSB+ZdDLnEPuucsVB9oB7cxJHap6Afg==", + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=14.14" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/function.prototype.name": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.8.tgz", + "integrity": "sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "functions-have-names": "^1.2.3", + "hasown": "^2.0.2", + "is-callable": "^1.2.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/functions-have-names": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/generator-function": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/generator-function/-/generator-function-2.0.1.tgz", + "integrity": "sha512-SFdFmIJi+ybC0vjlHN0ZGVGHc3lgE0DxPAT0djjVg+kjOnSqclqmj0KQ7ykTOLP6YxoqOvuAODGdcHJn+43q3g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "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==", + "license": "ISC", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-east-asian-width": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.4.0.tgz", + "integrity": "sha512-QZjmEOC+IT1uk6Rx0sX22V6uHWVwbdbxf1faPqJ1QhLdGgsRGCZoyaQBm/piRdJy/D2um6hM1UP7ZEeQ4EkP+Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/get-intrinsic": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "dev": true, + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/get-stream": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-8.0.1.tgz", + "integrity": "sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/get-symbol-description": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.1.0.tgz", + "integrity": "sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-uri": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/get-uri/-/get-uri-6.0.5.tgz", + "integrity": "sha512-b1O07XYq8eRuVzBNgJLstU6FYc1tS6wnMtF1I1D9lE8LxZSOGZ7LhxN54yPP6mGw5f2CkXY2BQUL9Fx41qvcIg==", + "dev": true, + "license": "MIT", + "dependencies": { + "basic-ftp": "^5.0.2", + "data-uri-to-buffer": "^6.0.2", + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/giget": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/giget/-/giget-2.0.0.tgz", + "integrity": "sha512-L5bGsVkxJbJgdnwyuheIunkGatUF/zssUoxxjACCseZYAVbaqdh9Tsmmlkl8vYan09H7sbvKt4pS8GqKLBrEzA==", + "dev": true, + "license": "MIT", + "dependencies": { + "citty": "^0.1.6", + "consola": "^3.4.0", + "defu": "^6.1.4", + "node-fetch-native": "^1.6.6", + "nypm": "^0.6.0", + "pathe": "^2.0.3" + }, + "bin": { + "giget": "dist/cli.mjs" + } + }, + "node_modules/git-up": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/git-up/-/git-up-8.1.1.tgz", + "integrity": "sha512-FDenSF3fVqBYSaJoYy1KSc2wosx0gCvKP+c+PRBht7cAaiCeQlBtfBDX9vgnNOHmdePlSFITVcn4pFfcgNvx3g==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-ssh": "^1.4.0", + "parse-url": "^9.2.0" + } + }, + "node_modules/git-url-parse": { + "version": "16.1.0", + "resolved": "https://registry.npmjs.org/git-url-parse/-/git-url-parse-16.1.0.tgz", + "integrity": "sha512-cPLz4HuK86wClEW7iDdeAKcCVlWXmrLpb2L+G9goW0Z1dtpNS6BXXSOckUTlJT/LDQViE1QZKstNORzHsLnobw==", + "dev": true, + "license": "MIT", + "dependencies": { + "git-up": "^8.1.0" + } + }, + "node_modules/github-from-package": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz", + "integrity": "sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==", + "license": "MIT" + }, + "node_modules/glob": { + "version": "13.0.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-13.0.3.tgz", + "integrity": "sha512-/g3B0mC+4x724v1TgtBlBtt2hPi/EWptsIAmXUx9Z2rvBYleQcsrmaOzd5LyL50jf/Soi83ZDJmw2+XqvH/EeA==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "minimatch": "^10.2.0", + "minipass": "^7.1.2", + "path-scurry": "^2.0.0" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/glob/node_modules/balanced-match": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", + "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/glob/node_modules/brace-expansion": { + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.5.tgz", + "integrity": "sha512-VZznLgtwhn+Mact9tfiwx64fA9erHH/MCXEUfB/0bX/6Fz6ny5EGTXYltMocqg4xFAQZtnO3DHWWXi8RiuN7cQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^4.0.2" + }, + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/glob/node_modules/minimatch": { + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.0.tgz", + "integrity": "sha512-ugkC31VaVg9cF0DFVoADH12k6061zNZkZON+aX8AWsR9GhPcErkcMBceb6znR8wLERM2AkkOxy2nWRLpT9Jq5w==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "brace-expansion": "^5.0.2" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/globals": { + "version": "17.3.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-17.3.0.tgz", + "integrity": "sha512-yMqGUQVVCkD4tqjOJf3TnrvaaHDMYp4VlUSObbkIiuCPe/ofdMBFIAcBbCSRFWOnos6qRiTVStDwqPLUclaxIw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/globalthis": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz", + "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-properties": "^1.2.1", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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==", + "license": "ISC" + }, + "node_modules/handlebars": { + "version": "4.7.8", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.8.tgz", + "integrity": "sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "minimist": "^1.2.5", + "neo-async": "^2.6.2", + "source-map": "^0.6.1", + "wordwrap": "^1.0.0" + }, + "bin": { + "handlebars": "bin/handlebars" + }, + "engines": { + "node": ">=0.4.7" + }, + "optionalDependencies": { + "uglify-js": "^3.1.4" + } + }, + "node_modules/has-bigints": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.1.0.tgz", + "integrity": "sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/has-property-descriptors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-proto": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.2.0.tgz", + "integrity": "sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-symbols": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/hosted-git-info": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-8.1.0.tgz", + "integrity": "sha512-Rw/B2DNQaPBICNXEm8balFz9a6WpZrkCGpcWFpy7nCj+NyhSdqXipmfvtmWt9xGfp0wZnBxB+iVpLmQMYt47Tw==", + "dev": true, + "license": "ISC", + "dependencies": { + "lru-cache": "^10.0.1" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/hosted-git-info/node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/http-proxy-agent": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", + "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", + "dev": true, + "license": "MIT", + "dependencies": { + "agent-base": "^7.1.0", + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/https-proxy-agent": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", + "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", + "dev": true, + "license": "MIT", + "dependencies": { + "agent-base": "^7.1.2", + "debug": "4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/human-signals": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-5.0.0.tgz", + "integrity": "sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=16.17.0" + } + }, + "node_modules/iconv-lite": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.7.2.tgz", + "integrity": "sha512-im9DjEDQ55s9fL4EYzOAv0yMqmMBSZp6G0VvFyTMPKWxiSBHUj9NW/qqLmXUwXrrM7AvqSlTCfvqRb0cM8yYqw==", + "dev": true, + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "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": "BSD-3-Clause" + }, + "node_modules/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/import-fresh": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", + "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "license": "ISC" + }, + "node_modules/ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", + "license": "ISC" + }, + "node_modules/inquirer": { + "version": "12.11.1", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-12.11.1.tgz", + "integrity": "sha512-9VF7mrY+3OmsAfjH3yKz/pLbJ5z22E23hENKw3/LNSaA/sAt3v49bDRY+Ygct1xwuKT+U+cBfTzjCPySna69Qw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/ansi": "^1.0.2", + "@inquirer/core": "^10.3.2", + "@inquirer/prompts": "^7.10.1", + "@inquirer/type": "^3.0.10", + "mute-stream": "^2.0.0", + "run-async": "^4.0.6", + "rxjs": "^7.8.2" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/internal-slot": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.1.0.tgz", + "integrity": "sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "hasown": "^2.0.2", + "side-channel": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/into-stream": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/into-stream/-/into-stream-9.1.0.tgz", + "integrity": "sha512-DRsRnQrbzdFjaQ1oe4C6/EIUymIOEix1qROEJTF9dbMq+M4Zrm6VaLp6SD/B9IsiEjPZuBSnWWFN+udajugdWA==", + "license": "MIT", + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ip-address": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-10.1.0.tgz", + "integrity": "sha512-XXADHxXmvT9+CRxhXg56LJovE+bmWnEWB78LB83VZTprKTmaC5QfruXocxzTZ2Kl0DNwKuBdlIhjL8LeY8Sf8Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 12" + } + }, + "node_modules/is-array-buffer": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.5.tgz", + "integrity": "sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "get-intrinsic": "^1.2.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-async-function": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.1.1.tgz", + "integrity": "sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "async-function": "^1.0.0", + "call-bound": "^1.0.3", + "get-proto": "^1.0.1", + "has-tostringtag": "^1.0.2", + "safe-regex-test": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-bigint": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.1.0.tgz", + "integrity": "sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-bigints": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-boolean-object": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.2.2.tgz", + "integrity": "sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-callable": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-core-module": { + "version": "2.16.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", + "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", + "license": "MIT", + "dependencies": { + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-data-view": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.2.tgz", + "integrity": "sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "get-intrinsic": "^1.2.6", + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-date-object": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.1.0.tgz", + "integrity": "sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-docker": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-3.0.0.tgz", + "integrity": "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==", + "dev": true, + "license": "MIT", + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-finalizationregistry": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.1.1.tgz", + "integrity": "sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-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==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-generator-function": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.1.2.tgz", + "integrity": "sha512-upqt1SkGkODW9tsGNG5mtXTXtECizwtS2kA161M+gJPc1xdb/Ax629af6YrTwcOeQHbewrPNlE5Dx7kzvXTizA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.4", + "generator-function": "^2.0.0", + "get-proto": "^1.0.1", + "has-tostringtag": "^1.0.2", + "safe-regex-test": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-inside-container": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-inside-container/-/is-inside-container-1.0.0.tgz", + "integrity": "sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-docker": "^3.0.0" + }, + "bin": { + "is-inside-container": "cli.js" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-interactive": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-2.0.0.tgz", + "integrity": "sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-map": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz", + "integrity": "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-negative-zero": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz", + "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-number-object": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.1.1.tgz", + "integrity": "sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-obj": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", + "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-regex": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz", + "integrity": "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "gopd": "^1.2.0", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-set": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz", + "integrity": "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-shared-array-buffer": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.4.tgz", + "integrity": "sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-ssh": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/is-ssh/-/is-ssh-1.4.1.tgz", + "integrity": "sha512-JNeu1wQsHjyHgn9NcWTaXq6zWSR6hqE0++zhfZlkFBbScNkyvxCdeV8sRkSBaeLKxmbpR21brail63ACNxJ0Tg==", + "dev": true, + "license": "MIT", + "dependencies": { + "protocols": "^2.0.1" + } + }, + "node_modules/is-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", + "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-string": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.1.1.tgz", + "integrity": "sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-symbol": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.1.1.tgz", + "integrity": "sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "has-symbols": "^1.1.0", + "safe-regex-test": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-typed-array": { + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.15.tgz", + "integrity": "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "which-typed-array": "^1.1.16" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-unicode-supported": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-2.1.0.tgz", + "integrity": "sha512-mE00Gnza5EEB3Ds0HfMyllZzbBrmLOX3vfWoj9A9PEnTfratQ/BcaJOuMhnkhjXvb2+FkY3VuHqtAGpTPmglFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-weakmap": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz", + "integrity": "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakref": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.1.1.tgz", + "integrity": "sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakset": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.4.tgz", + "integrity": "sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "get-intrinsic": "^1.2.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-wsl": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-3.1.0.tgz", + "integrity": "sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-inside-container": "^1.0.0" + }, + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true, + "license": "MIT" + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true, + "license": "ISC" + }, + "node_modules/issue-parser": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/issue-parser/-/issue-parser-7.0.1.tgz", + "integrity": "sha512-3YZcUUR2Wt1WsapF+S/WiA2WmlW0cWAoPccMqne7AxEBhCdFeTPjfv/Axb8V2gyCgY3nRw+ksZ3xSUX+R47iAg==", + "dev": true, + "license": "MIT", + "dependencies": { + "lodash.capitalize": "^4.2.1", + "lodash.escaperegexp": "^4.1.2", + "lodash.isplainobject": "^4.0.6", + "lodash.isstring": "^4.0.1", + "lodash.uniqby": "^4.7.0" + }, + "engines": { + "node": "^18.17 || >=20.6.1" + } + }, + "node_modules/jiti": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.6.1.tgz", + "integrity": "sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==", + "dev": true, + "license": "MIT", + "bin": { + "jiti": "lib/jiti-cli.mjs" + } + }, + "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==", + "license": "MIT" + }, + "node_modules/js-yaml": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz", + "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsesc": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", + "license": "MIT", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-stable-stringify": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.3.0.tgz", + "integrity": "sha512-qtYiSSFlwot9XHtF9bD9c7rwKjr+RecWT//ZnPvSmEjpV5mmPOCN4j8UjY5hbjNkOwZ/jQv3J6R1/pL7RwgMsg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "isarray": "^2.0.5", + "jsonify": "^0.0.1", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-with-bigint": { + "version": "3.5.8", + "resolved": "https://registry.npmjs.org/json-with-bigint/-/json-with-bigint-3.5.8.tgz", + "integrity": "sha512-eq/4KP6K34kwa7TcFdtvnftvHCD9KvHOGGICWwMFc4dOOKF5t4iYqnfLK8otCRCRv06FXOzGGyqE8h8ElMvvdw==", + "dev": true, + "license": "MIT" + }, + "node_modules/json5": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", + "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", + "dev": true, + "license": "MIT", + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" + } + }, + "node_modules/jsonfile": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.0.tgz", + "integrity": "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==", + "license": "MIT", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/jsonify": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.1.tgz", + "integrity": "sha512-2/Ki0GcmuqSrgFyelQq9M05y7PS0mEwuIzrf3f1fPqkVDVRvZrPZtVSMHxdgo8Aq0sxAOb/cr2aqqA3LeWHVPg==", + "dev": true, + "license": "Public Domain", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "dev": true, + "license": "MIT", + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/lilconfig": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz", + "integrity": "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antonk52" + } + }, + "node_modules/lint-staged": { + "version": "15.5.2", + "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-15.5.2.tgz", + "integrity": "sha512-YUSOLq9VeRNAo/CTaVmhGDKG+LBtA8KF1X4K5+ykMSwWST1vDxJRB2kv2COgLb1fvpCo+A/y9A0G0znNVmdx4w==", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^5.4.1", + "commander": "^13.1.0", + "debug": "^4.4.0", + "execa": "^8.0.1", + "lilconfig": "^3.1.3", + "listr2": "^8.2.5", + "micromatch": "^4.0.8", + "pidtree": "^0.6.0", + "string-argv": "^0.3.2", + "yaml": "^2.7.0" + }, + "bin": { + "lint-staged": "bin/lint-staged.js" + }, + "engines": { + "node": ">=18.12.0" + }, + "funding": { + "url": "https://opencollective.com/lint-staged" + } + }, + "node_modules/listr2": { + "version": "8.3.3", + "resolved": "https://registry.npmjs.org/listr2/-/listr2-8.3.3.tgz", + "integrity": "sha512-LWzX2KsqcB1wqQ4AHgYb4RsDXauQiqhjLk+6hjbaeHG4zpjjVAB6wC/gz6X0l+Du1cN3pUB5ZlrvTbhGSNnUQQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "cli-truncate": "^4.0.0", + "colorette": "^2.0.20", + "eventemitter3": "^5.0.1", + "log-update": "^6.1.0", + "rfdc": "^1.4.1", + "wrap-ansi": "^9.0.0" + }, + "engines": { + "node": ">=18.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.23", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.23.tgz", + "integrity": "sha512-LgVTMpQtIopCi79SJeDiP0TfWi5CNEc/L/aRdTh3yIvmZXTnheWpKjSZhnvMl8iXbC1tFg9gdHHDMLoV7CnG+w==", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.capitalize": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/lodash.capitalize/-/lodash.capitalize-4.2.1.tgz", + "integrity": "sha512-kZzYOKspf8XVX5AvmQF94gQW0lejFVgb80G85bU4ZWzoJ6C03PQg3coYAUpSTpQWelrZELd3XWgHzw4Ck5kaIw==", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.escaperegexp": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/lodash.escaperegexp/-/lodash.escaperegexp-4.1.2.tgz", + "integrity": "sha512-TM9YBvyC84ZxE3rgfefxUWiQKLilstD6k7PTGt6wfbtXF8ixIJLOL3VYyV/z+ZiPLsVxAsKAFVwWlWeb2Y8Yyw==", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.isplainobject": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", + "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.isstring": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", + "integrity": "sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.uniqby": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/lodash.uniqby/-/lodash.uniqby-4.7.0.tgz", + "integrity": "sha512-e/zcLx6CSbmaEgFHCA7BnoQKyCtKMxnuWrJygbwPs/AIn+IMKl66L8/s+wBUn5LRw2pZx3bUHibiV1b6aTWIww==", + "dev": true, + "license": "MIT" + }, + "node_modules/log-symbols": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-7.0.1.tgz", + "integrity": "sha512-ja1E3yCr9i/0hmBVaM0bfwDjnGy8I/s6PP4DFp+yP+a+mrHO4Rm7DtmnqROTUkHIkqffC84YY7AeqX6oFk0WFg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-unicode-supported": "^2.0.0", + "yoctocolors": "^2.1.1" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log-update": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/log-update/-/log-update-6.1.0.tgz", + "integrity": "sha512-9ie8ItPR6tjY5uYJh8K/Zrv/RMZ5VOlOWvtZdEHYSTFKZfIBPQa9tOAEeAWhd+AnIneLJ22w5fjOYtoutpWq5w==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-escapes": "^7.0.0", + "cli-cursor": "^5.0.0", + "slice-ansi": "^7.1.0", + "strip-ansi": "^7.1.0", + "wrap-ansi": "^9.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log-update/node_modules/ansi-styles": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", + "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/log-update/node_modules/is-fullwidth-code-point": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-5.1.0.tgz", + "integrity": "sha512-5XHYaSyiqADb4RnZ1Bdad6cPp8Toise4TzEjcOYDHZkTCbKgiUl7WTUCpNWHuxmDt91wnsZBc9xinNzopv3JMQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "get-east-asian-width": "^1.3.1" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log-update/node_modules/slice-ansi": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-7.1.2.tgz", + "integrity": "sha512-iOBWFgUX7caIZiuutICxVgX1SdxwAVFFKwt1EvMYYec/NWO5meOJ6K5uQxhrYBdQJne4KxiqZc+KptFOWFSI9w==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.2.1", + "is-fullwidth-code-point": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/chalk/slice-ansi?sponsor=1" + } + }, + "node_modules/lru-cache": { + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/macos-release": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/macos-release/-/macos-release-3.4.0.tgz", + "integrity": "sha512-wpGPwyg/xrSp4H4Db4xYSeAr6+cFQGHfspHzDUdYxswDnUW0L5Ov63UuJiSr8NMSpyaChO4u1n0MXUvVPtrN6A==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/meow": { + "version": "13.2.0", + "resolved": "https://registry.npmjs.org/meow/-/meow-13.2.0.tgz", + "integrity": "sha512-pxQJQzB6djGPXh08dacEloMFopsOqGVRKFPYvPOt9XDZ1HasbgDZA74CJGreSU4G3Ak7EFJGoiH2auq+yXISgA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true, + "license": "MIT" + }, + "node_modules/micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "dev": true, + "license": "MIT", + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/micromatch/node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/mime-db": { + "version": "1.54.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", + "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.2.tgz", + "integrity": "sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "mime-db": "^1.54.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/mimic-fn": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", + "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/mimic-function": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/mimic-function/-/mimic-function-5.0.1.tgz", + "integrity": "sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/mimic-response": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", + "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimatch/node_modules/brace-expansion": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.13.tgz", + "integrity": "sha512-9ZLprWS6EENmhEOpjCYW2c8VkmOvckIJZfkr7rBW6dObmfgJ/L1GpSYW5Hpo9lDz4D1+n0Ckz8rU7FwHDQiG/w==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "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==", + "license": "ISC", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/minizlib": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-3.1.0.tgz", + "integrity": "sha512-KZxYo1BUkWD2TVFLr0MQoM8vUUigWD3LlD83a/75BqC+4qE0Hb1Vo5v1FgcfaNXvfXzr+5EhQ6ing/CaBijTlw==", + "license": "MIT", + "dependencies": { + "minipass": "^7.1.2" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/mkdirp-classic": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", + "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==", + "license": "MIT" + }, + "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==", + "license": "MIT" + }, + "node_modules/multistream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/multistream/-/multistream-4.1.0.tgz", + "integrity": "sha512-J1XDiAmmNpRCBfIWJv+n0ymC4ABcf/Pl+5YvC5B/D2f/2+8PtHvCNxMPKiQcZyi922Hq69J2YOpb1pTywfifyw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "once": "^1.4.0", + "readable-stream": "^3.6.0" + } + }, + "node_modules/mute-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-2.0.0.tgz", + "integrity": "sha512-WWdIxpyjEn+FhQJQQv9aQAYlHoNVdzIzUySNV1gHUPDSdZJ3yZn7pAAbQcV7B56Mvu881q9FZV+0Vx2xC44VWA==", + "dev": true, + "license": "ISC", + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/napi-build-utils": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-2.0.0.tgz", + "integrity": "sha512-GEbrYkbfF7MoNaoh2iGG84Mnf/WZfB0GdGEsM8wz7Expx/LlWf5U8t9nvJKXSp3qr5IsEbK04cBGhol/KwOsWA==", + "license": "MIT" + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true, + "license": "MIT" + }, + "node_modules/neo-async": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", + "dev": true, + "license": "MIT" + }, + "node_modules/netmask": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/netmask/-/netmask-2.0.2.tgz", + "integrity": "sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/new-github-release-url": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/new-github-release-url/-/new-github-release-url-2.0.0.tgz", + "integrity": "sha512-NHDDGYudnvRutt/VhKFlX26IotXe1w0cmkDm6JGquh5bz/bDTw0LufSmH/GxTjEdpHEO+bVKFTwdrcGa/9XlKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "type-fest": "^2.5.1" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/node-abi": { + "version": "3.87.0", + "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.87.0.tgz", + "integrity": "sha512-+CGM1L1CgmtheLcBuleyYOn7NWPVu0s0EJH2C4puxgEZb9h8QpR9G2dBfZJOAUhi7VQxuBPMd0hiISWcTyiYyQ==", + "license": "MIT", + "dependencies": { + "semver": "^7.3.5" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/node-fetch": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", + "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", + "license": "MIT", + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, + "node_modules/node-fetch-native": { + "version": "1.6.7", + "resolved": "https://registry.npmjs.org/node-fetch-native/-/node-fetch-native-1.6.7.tgz", + "integrity": "sha512-g9yhqoedzIUm0nTnTqAQvueMPVOuIY16bqgAJJC8XOOubYFNwz6IER9qs0Gq2Xd0+CecCKFjtdDTMA4u4xG06Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/node-int64": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", + "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==", + "license": "MIT" + }, + "node_modules/normalize-package-data": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-7.0.1.tgz", + "integrity": "sha512-linxNAT6M0ebEYZOx2tO6vBEFsVgnPpv+AVjk0wJHfaUIbq31Jm3T6vvZaarnOeWDh8ShnwXuaAyM7WT3RzErA==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "hosted-git-info": "^8.0.0", + "semver": "^7.3.5", + "validate-npm-package-license": "^3.0.4" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/npm-run-path": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.3.0.tgz", + "integrity": "sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/npm-run-path/node_modules/path-key": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", + "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/nypm": { + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/nypm/-/nypm-0.6.5.tgz", + "integrity": "sha512-K6AJy1GMVyfyMXRVB88700BJqNUkByijGJM8kEHpLdcAt+vSQAVfkWWHYzuRXHSY6xA2sNc5RjTj0p9rE2izVQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "citty": "^0.2.0", + "pathe": "^2.0.3", + "tinyexec": "^1.0.2" + }, + "bin": { + "nypm": "dist/cli.mjs" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/nypm/node_modules/citty": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/citty/-/citty-0.2.1.tgz", + "integrity": "sha512-kEV95lFBhQgtogAPlQfJJ0WGVSokvLr/UEoFPiKKOXF7pl98HfUVUD0ejsuTCld/9xH9vogSywZ5KqHzXrZpqg==", + "dev": true, + "license": "MIT" + }, + "node_modules/object-inspect": { + "version": "1.13.4", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", + "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.assign": { + "version": "4.1.7", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.7.tgz", + "integrity": "sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0", + "has-symbols": "^1.1.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.entries": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.9.tgz", + "integrity": "sha512-8u/hfXFRBD1O0hPUjioLhoWFHRmt6tKA4/vZPyckBr18l1KE9uHrFaFaUi8MDRTpi4uak2goyPTSNJLXX2k2Hw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.fromentries": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.8.tgz", + "integrity": "sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.groupby": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.3.tgz", + "integrity": "sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.values": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.2.1.tgz", + "integrity": "sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/ohash": { + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/ohash/-/ohash-2.0.11.tgz", + "integrity": "sha512-RdR9FQrFwNBNXAr4GixM8YaRZRJ5PUWbKYbE5eOsrwAjJW0q2REGcf79oYPsLyskQCZG1PLN+S/K1V00joZAoQ==", + "dev": true, + "license": "MIT" + }, + "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==", + "license": "ISC", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/onetime": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", + "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "mimic-fn": "^4.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/open": { + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/open/-/open-10.2.0.tgz", + "integrity": "sha512-YgBpdJHPyQ2UE5x+hlSXcnejzAvD0b22U2OuAP+8OnlJT+PjWPxtgmGqKKc+RgTM63U9gN0YzrYc71R2WT/hTA==", + "dev": true, + "license": "MIT", + "dependencies": { + "default-browser": "^5.2.1", + "define-lazy-prop": "^3.0.0", + "is-inside-container": "^1.0.0", + "wsl-utils": "^0.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/optionator": { + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", + "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", + "dev": true, + "license": "MIT", + "dependencies": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.5" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/ora": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/ora/-/ora-9.0.0.tgz", + "integrity": "sha512-m0pg2zscbYgWbqRR6ABga5c3sZdEon7bSgjnlXC64kxtxLOyjRcbbUkLj7HFyy/FTD+P2xdBWu8snGhYI0jc4A==", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^5.6.2", + "cli-cursor": "^5.0.0", + "cli-spinners": "^3.2.0", + "is-interactive": "^2.0.0", + "is-unicode-supported": "^2.1.0", + "log-symbols": "^7.0.1", + "stdin-discarder": "^0.2.2", + "string-width": "^8.1.0", + "strip-ansi": "^7.1.2" + }, + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ora/node_modules/string-width": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-8.1.1.tgz", + "integrity": "sha512-KpqHIdDL9KwYk22wEOg/VIqYbrnLeSApsKT/bSj6Ez7pn3CftUiLAv2Lccpq1ALcpLV9UX1Ppn92npZWu2w/aw==", + "dev": true, + "license": "MIT", + "dependencies": { + "get-east-asian-width": "^1.3.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/os-name": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/os-name/-/os-name-6.1.0.tgz", + "integrity": "sha512-zBd1G8HkewNd2A8oQ8c6BN/f/c9EId7rSUueOLGu28govmUctXmM+3765GwsByv9nYUdrLqHphXlYIc86saYsg==", + "dev": true, + "license": "MIT", + "dependencies": { + "macos-release": "^3.3.0", + "windows-release": "^6.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/own-keys": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/own-keys/-/own-keys-1.0.1.tgz", + "integrity": "sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==", + "dev": true, + "license": "MIT", + "dependencies": { + "get-intrinsic": "^1.2.6", + "object-keys": "^1.1.1", + "safe-push-apply": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "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/pac-proxy-agent": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/pac-proxy-agent/-/pac-proxy-agent-7.2.0.tgz", + "integrity": "sha512-TEB8ESquiLMc0lV8vcd5Ql/JAKAoyzHFXaStwjkzpOpC5Yv+pIzLfHvjTSdf3vpa2bMiUQrg9i6276yn8666aA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@tootallnate/quickjs-emscripten": "^0.23.0", + "agent-base": "^7.1.2", + "debug": "^4.3.4", + "get-uri": "^6.0.1", + "http-proxy-agent": "^7.0.0", + "https-proxy-agent": "^7.0.6", + "pac-resolver": "^7.0.1", + "socks-proxy-agent": "^8.0.5" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/pac-resolver": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/pac-resolver/-/pac-resolver-7.0.1.tgz", + "integrity": "sha512-5NPgf87AT2STgwa2ntRMr45jTKrYBGkVU36yT0ig/n/GMAa3oPqhZfIQ2kMEimReg0+t9kZViDVZ83qfVUlckg==", + "dev": true, + "license": "MIT", + "dependencies": { + "degenerator": "^5.0.0", + "netmask": "^2.0.2" + }, + "engines": { + "node": ">= 14" + } + }, + "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/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "license": "MIT", + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/parse-path": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/parse-path/-/parse-path-7.1.0.tgz", + "integrity": "sha512-EuCycjZtfPcjWk7KTksnJ5xPMvWGA/6i4zrLYhRG0hGvC3GPU/jGUj3Cy+ZR0v30duV3e23R95T1lE2+lsndSw==", + "dev": true, + "license": "MIT", + "dependencies": { + "protocols": "^2.0.0" + } + }, + "node_modules/parse-url": { + "version": "9.2.0", + "resolved": "https://registry.npmjs.org/parse-url/-/parse-url-9.2.0.tgz", + "integrity": "sha512-bCgsFI+GeGWPAvAiUv63ZorMeif3/U0zaXABGJbOWt5OH2KCaPHF6S+0ok4aqM9RuIPGyZdx9tR9l13PsW4AYQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/parse-path": "^7.0.0", + "parse-path": "^7.0.0" + }, + "engines": { + "node": ">=14.13.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-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "license": "MIT" + }, + "node_modules/path-scurry": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-2.0.1.tgz", + "integrity": "sha512-oWyT4gICAu+kaA7QWk/jvCHWarMKNs6pXOGWKDTr7cw4IGcUbW+PeTfbaQiLGheFRpjo6O9J0PmyMfQPjH71oA==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "lru-cache": "^11.0.0", + "minipass": "^7.1.2" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/path-scurry/node_modules/lru-cache": { + "version": "11.2.6", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.2.6.tgz", + "integrity": "sha512-ESL2CrkS/2wTPfuend7Zhkzo2u0daGJ/A2VucJOgQ/C48S/zB8MMeMHSGKYpXhIjbPxfuezITkaBH1wqv00DDQ==", + "dev": true, + "license": "BlueOak-1.0.0", + "engines": { + "node": "20 || >=22" + } + }, + "node_modules/pathe": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", + "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", + "dev": true, + "license": "MIT" + }, + "node_modules/perfect-debounce": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/perfect-debounce/-/perfect-debounce-2.1.0.tgz", + "integrity": "sha512-LjgdTytVFXeUgtHZr9WYViYSM/g8MkcTPYDlPa3cDqMirHjKiSZPYd6DoL7pK8AJQr+uWkQvCjHNdiMqsrJs+g==", + "dev": true, + "license": "MIT" + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pidtree": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/pidtree/-/pidtree-0.6.0.tgz", + "integrity": "sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g==", + "dev": true, + "license": "MIT", + "bin": { + "pidtree": "bin/pidtree.js" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/pkg-types": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-2.3.0.tgz", + "integrity": "sha512-SIqCzDRg0s9npO5XQ3tNZioRY1uK06lA41ynBC1YmFTmnY6FjUjVt6s4LoADmwoig1qqD0oK8h1p/8mlMx8Oig==", + "dev": true, + "license": "MIT", + "dependencies": { + "confbox": "^0.2.2", + "exsolve": "^1.0.7", + "pathe": "^2.0.3" + } + }, + "node_modules/possible-typed-array-names": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz", + "integrity": "sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/postject": { + "version": "1.0.0-alpha.6", + "resolved": "https://registry.npmjs.org/postject/-/postject-1.0.0-alpha.6.tgz", + "integrity": "sha512-b9Eb8h2eVqNE8edvKdwqkrY6O7kAwmI8kcnBv1NScolYJbo59XUF0noFq+lxbC1yN20bmC0WBEbDC5H/7ASb0A==", + "license": "MIT", + "dependencies": { + "commander": "^9.4.0" + }, + "bin": { + "postject": "dist/cli.js" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/postject/node_modules/commander": { + "version": "9.5.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-9.5.0.tgz", + "integrity": "sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==", + "license": "MIT", + "engines": { + "node": "^12.20.0 || >=14" + } + }, + "node_modules/prebuild-install": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.1.3.tgz", + "integrity": "sha512-8Mf2cbV7x1cXPUILADGI3wuhfqWvtiLA1iclTDbFRZkgRQS0NqsPZphna9V+HyTEadheuPmjaJMsbzKQFOzLug==", + "license": "MIT", + "dependencies": { + "detect-libc": "^2.0.0", + "expand-template": "^2.0.3", + "github-from-package": "0.0.0", + "minimist": "^1.2.3", + "mkdirp-classic": "^0.5.3", + "napi-build-utils": "^2.0.0", + "node-abi": "^3.3.0", + "pump": "^3.0.0", + "rc": "^1.2.7", + "simple-get": "^4.0.0", + "tar-fs": "^2.0.0", + "tunnel-agent": "^0.6.0" + }, + "bin": { + "prebuild-install": "bin.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/prettier": { + "version": "3.8.1", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.8.1.tgz", + "integrity": "sha512-UOnG6LftzbdaHZcKoPFtOcCKztrQ57WkHDeRD9t/PTQtmT0NHSeWWepj6pS0z/N7+08BHFDQVUrfmfMRcZwbMg==", + "dev": true, + "license": "MIT", + "bin": { + "prettier": "bin/prettier.cjs" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, + "node_modules/process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "license": "MIT" + }, + "node_modules/progress": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/protocols": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/protocols/-/protocols-2.0.2.tgz", + "integrity": "sha512-hHVTzba3wboROl0/aWRRG9dMytgH6ow//STBZh43l/wQgmMhYhOFi0EHWAPtoCz9IAUymsyP0TSBHkhgMEGNnQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/proxy-agent": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/proxy-agent/-/proxy-agent-6.5.0.tgz", + "integrity": "sha512-TmatMXdr2KlRiA2CyDu8GqR8EjahTG3aY3nXjdzFyoZbmB8hrBsTyMezhULIXKnC0jpfjlmiZ3+EaCzoInSu/A==", + "dev": true, + "license": "MIT", + "dependencies": { + "agent-base": "^7.1.2", + "debug": "^4.3.4", + "http-proxy-agent": "^7.0.1", + "https-proxy-agent": "^7.0.6", + "lru-cache": "^7.14.1", + "pac-proxy-agent": "^7.1.0", + "proxy-from-env": "^1.1.0", + "socks-proxy-agent": "^8.0.5" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", + "dev": true, + "license": "MIT" + }, + "node_modules/pump": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.3.tgz", + "integrity": "sha512-todwxLMY7/heScKmntwQG8CXVkWUOdYxIvY2s0VWAAMh/nd8SoYiRaKjlr7+iCs984f2P8zvrfWcDDYVb73NfA==", + "license": "MIT", + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/rc": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "license": "(BSD-2-Clause OR MIT OR Apache-2.0)", + "dependencies": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "bin": { + "rc": "cli.js" + } + }, + "node_modules/rc/node_modules/strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/rc9": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/rc9/-/rc9-2.1.2.tgz", + "integrity": "sha512-btXCnMmRIBINM2LDZoEmOogIZU7Qe7zn4BpomSKZ/ykbLObuBdvG+mFq11DL6fjH1DRwHhrlgtYWG96bJiC7Cg==", + "dev": true, + "license": "MIT", + "dependencies": { + "defu": "^6.1.4", + "destr": "^2.0.3" + } + }, + "node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/readdirp": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-5.0.0.tgz", + "integrity": "sha512-9u/XQ1pvrQtYyMpZe7DXKv2p5CNvyVwzUB6uhLAnQwHMSgKMBR62lc7AHljaeteeHXn11XTAaLLUVZYVZyuRBQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 20.19.0" + }, + "funding": { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/reflect.getprototypeof": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.10.tgz", + "integrity": "sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.9", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.7", + "get-proto": "^1.0.1", + "which-builtin-type": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/regexp.prototype.flags": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.4.tgz", + "integrity": "sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-errors": "^1.3.0", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "set-function-name": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/release-it": { + "version": "19.2.4", + "resolved": "https://registry.npmjs.org/release-it/-/release-it-19.2.4.tgz", + "integrity": "sha512-BwaJwQYUIIAKuDYvpqQTSoy0U7zIy6cHyEjih/aNaFICphGahia4cjDANuFXb7gVZ51hIK9W0io6fjNQWXqICg==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/webpro" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/webpro" + } + ], + "license": "MIT", + "dependencies": { + "@nodeutils/defaults-deep": "1.1.0", + "@octokit/rest": "22.0.1", + "@phun-ky/typeof": "2.0.3", + "async-retry": "1.3.3", + "c12": "3.3.3", + "ci-info": "^4.3.1", + "eta": "4.5.0", + "git-url-parse": "16.1.0", + "inquirer": "12.11.1", + "issue-parser": "7.0.1", + "lodash.merge": "4.6.2", + "mime-types": "3.0.2", + "new-github-release-url": "2.0.0", + "open": "10.2.0", + "ora": "9.0.0", + "os-name": "6.1.0", + "proxy-agent": "6.5.0", + "semver": "7.7.3", + "tinyglobby": "0.2.15", + "undici": "6.23.0", + "url-join": "5.0.0", + "wildcard-match": "5.1.4", + "yargs-parser": "21.1.1" + }, + "bin": { + "release-it": "bin/release-it.js" + }, + "engines": { + "node": "^20.12.0 || >=22.0.0" + } + }, + "node_modules/release-it/node_modules/semver": { + "version": "7.7.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", + "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "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==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/resolve": { + "version": "1.22.11", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.11.tgz", + "integrity": "sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ==", + "license": "MIT", + "dependencies": { + "is-core-module": "^2.16.1", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/resolve.exports": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-2.0.3.tgz", + "integrity": "sha512-OcXjMsGdhL4XnbShKpAcSqPMzQoYkYyhbEaeSko47MjRP9NfEQMhZkXL1DoFlt9LWQn4YttrdnV6X2OiyzBi+A==", + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/restore-cursor": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-5.1.0.tgz", + "integrity": "sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==", + "dev": true, + "license": "MIT", + "dependencies": { + "onetime": "^7.0.0", + "signal-exit": "^4.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/restore-cursor/node_modules/onetime": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-7.0.0.tgz", + "integrity": "sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "mimic-function": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/retry": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", + "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/rfdc": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.4.1.tgz", + "integrity": "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==", + "dev": true, + "license": "MIT" + }, + "node_modules/rimraf": { + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-6.1.2.tgz", + "integrity": "sha512-cFCkPslJv7BAXJsYlK1dZsbP8/ZNLkCAQ0bi1hf5EKX2QHegmDFEFA6QhuYJlk7UDdc+02JjO80YSOrWPpw06g==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "glob": "^13.0.0", + "package-json-from-dist": "^1.0.1" + }, + "bin": { + "rimraf": "dist/esm/bin.mjs" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/run-applescript": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/run-applescript/-/run-applescript-7.1.0.tgz", + "integrity": "sha512-DPe5pVFaAsinSaV6QjQ6gdiedWDcRCbUuiQfQa2wmWV7+xC9bGulGI8+TdRmoFkAPaBXk8CrAbnlY2ISniJ47Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/run-async": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-4.0.6.tgz", + "integrity": "sha512-IoDlSLTs3Yq593mb3ZoKWKXMNu3UpObxhgA/Xuid5p4bbfi2jdY1Hj0m1K+0/tEuQTxIGMhQDqGjKb7RuxGpAQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/rxjs": { + "version": "7.8.2", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.2.tgz", + "integrity": "sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.1.0" + } + }, + "node_modules/safe-array-concat": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.3.tgz", + "integrity": "sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.2", + "get-intrinsic": "^1.2.6", + "has-symbols": "^1.1.0", + "isarray": "^2.0.5" + }, + "engines": { + "node": ">=0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "license": "MIT" + }, + "node_modules/safe-push-apply": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/safe-push-apply/-/safe-push-apply-1.0.0.tgz", + "integrity": "sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "isarray": "^2.0.5" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safe-regex-test": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.1.0.tgz", + "integrity": "sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "is-regex": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true, + "license": "MIT" + }, + "node_modules/semver": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", + "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/set-function-length": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/set-function-name": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", + "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "functions-have-names": "^1.2.3", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/set-proto": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/set-proto/-/set-proto-1.0.0.tgz", + "integrity": "sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==", + "dev": true, + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "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/side-channel": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", + "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3", + "side-channel-list": "^1.0.0", + "side-channel-map": "^1.0.1", + "side-channel-weakmap": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-list": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", + "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-map": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", + "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-weakmap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", + "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3", + "side-channel-map": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/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/simple-concat": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", + "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==", + "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/simple-get": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-4.0.1.tgz", + "integrity": "sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "decompress-response": "^6.0.0", + "once": "^1.3.1", + "simple-concat": "^1.0.0" + } + }, + "node_modules/simple-git-hooks": { + "version": "2.13.1", + "resolved": "https://registry.npmjs.org/simple-git-hooks/-/simple-git-hooks-2.13.1.tgz", + "integrity": "sha512-WszCLXwT4h2k1ufIXAgsbiTOazqqevFCIncOuUBZJ91DdvWcC5+OFkluWRQPrcuSYd8fjq+o2y1QfWqYMoAToQ==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "simple-git-hooks": "cli.js" + } + }, + "node_modules/slice-ansi": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-5.0.0.tgz", + "integrity": "sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.0.0", + "is-fullwidth-code-point": "^4.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/slice-ansi?sponsor=1" + } + }, + "node_modules/slice-ansi/node_modules/ansi-styles": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", + "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/slice-ansi/node_modules/is-fullwidth-code-point": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-4.0.0.tgz", + "integrity": "sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/smart-buffer": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", + "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 6.0.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/socks": { + "version": "2.8.7", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.7.tgz", + "integrity": "sha512-HLpt+uLy/pxB+bum/9DzAgiKS8CX1EvbWxI4zlmgGCExImLdiad2iCwXT5Z4c9c3Eq8rP2318mPW2c+QbtjK8A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ip-address": "^10.0.1", + "smart-buffer": "^4.2.0" + }, + "engines": { + "node": ">= 10.0.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/socks-proxy-agent": { + "version": "8.0.5", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-8.0.5.tgz", + "integrity": "sha512-HehCEsotFqbPW9sJ8WVYB6UbmIMv7kUUORIF2Nncq4VQvBfNBLibW9YZR5dlYCSUhwcD628pRllm7n+E+YTzJw==", + "dev": true, + "license": "MIT", + "dependencies": { + "agent-base": "^7.1.2", + "debug": "^4.3.4", + "socks": "^2.8.3" + }, + "engines": { + "node": ">= 14" + } + }, + "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/spdx-correct": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", + "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-exceptions": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz", + "integrity": "sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==", + "dev": true, + "license": "CC-BY-3.0" + }, + "node_modules/spdx-expression-parse": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-license-ids": { + "version": "3.0.22", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.22.tgz", + "integrity": "sha512-4PRT4nh1EImPbt2jASOKHX7PB7I+e4IWNLvkKFDxNhJlfjbYlleYQh285Z/3mPTHSAK/AvdMmw5BNNuYH8ShgQ==", + "dev": true, + "license": "CC0-1.0" + }, + "node_modules/stdin-discarder": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/stdin-discarder/-/stdin-discarder-0.2.2.tgz", + "integrity": "sha512-UhDfHmA92YAlNnCfhmq0VeNL5bDbiZGg7sZ2IvPsXubGkiNa9EC+tUTsjBRsYUAz87btI6/1wf4XoVvQ3uRnmQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/stop-iteration-iterator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.1.0.tgz", + "integrity": "sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "internal-slot": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/stream-meter": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/stream-meter/-/stream-meter-1.0.4.tgz", + "integrity": "sha512-4sOEtrbgFotXwnEuzzsQBYEV1elAeFSO8rSGeTwabuX1RRn/kEq9JVH7I0MRBhKVRR0sJkr0M0QCH7yOLf9fhQ==", + "license": "MIT", + "dependencies": { + "readable-stream": "^2.1.4" + } + }, + "node_modules/stream-meter/node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "license": "MIT" + }, + "node_modules/stream-meter/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "license": "MIT", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/stream-meter/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/streamx": { + "version": "2.23.0", + "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.23.0.tgz", + "integrity": "sha512-kn+e44esVfn2Fa/O0CPFcex27fjIL6MkVae0Mm6q+E6f0hWv578YCERbv+4m02cjxvDsPKLnmxral/rR6lBMAg==", + "license": "MIT", + "dependencies": { + "events-universal": "^1.0.0", + "fast-fifo": "^1.3.2", + "text-decoder": "^1.1.0" + } + }, + "node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/string_decoder/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==", + "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/string-argv": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/string-argv/-/string-argv-0.3.2.tgz", + "integrity": "sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.6.19" + } + }, + "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==", + "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/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==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width/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==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string.prototype.trim": { + "version": "1.2.10", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.10.tgz", + "integrity": "sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.2", + "define-data-property": "^1.1.4", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-object-atoms": "^1.0.0", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimend": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.9.tgz", + "integrity": "sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.2", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimstart": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz", + "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/strip-ansi": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz", + "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==", + "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-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/strip-final-newline": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", + "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/tar": { + "version": "7.5.7", + "resolved": "https://registry.npmjs.org/tar/-/tar-7.5.7.tgz", + "integrity": "sha512-fov56fJiRuThVFXD6o6/Q354S7pnWMJIVlDBYijsTNx6jKSE4pvrDTs6lUnmGvNyfJwFQQwWy3owKz1ucIhveQ==", + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/fs-minipass": "^4.0.0", + "chownr": "^3.0.0", + "minipass": "^7.1.2", + "minizlib": "^3.1.0", + "yallist": "^5.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/tar-fs": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.4.tgz", + "integrity": "sha512-mDAjwmZdh7LTT6pNleZ05Yt65HC3E+NiQzl672vQG38jIrehtJk/J3mNwIg+vShQPcLF/LV7CMnDW6vjj6sfYQ==", + "license": "MIT", + "dependencies": { + "chownr": "^1.1.1", + "mkdirp-classic": "^0.5.2", + "pump": "^3.0.0", + "tar-stream": "^2.1.4" + } + }, + "node_modules/tar-fs/node_modules/chownr": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", + "license": "ISC" + }, + "node_modules/tar-stream": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", + "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", + "license": "MIT", + "dependencies": { + "bl": "^4.0.3", + "end-of-stream": "^1.4.1", + "fs-constants": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.1.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/text-decoder": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/text-decoder/-/text-decoder-1.2.3.tgz", + "integrity": "sha512-3/o9z3X0X0fTupwsYvR03pJ/DjWuqqrfwBgTQzdWDiQSm9KitAyz/9WqsT2JQW7KV2m+bC2ol/zqpW37NHxLaA==", + "license": "Apache-2.0", + "dependencies": { + "b4a": "^1.6.4" + } + }, + "node_modules/tinyexec": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.0.2.tgz", + "integrity": "sha512-W/KYk+NFhkmsYpuHq5JykngiOCnxeVL8v8dFnqxSD8qEEdRfXk1SDM6JzNqcERbcGYj9tMrDQBYV9cjgnunFIg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/tinyglobby": { + "version": "0.2.15", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz", + "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==", + "license": "MIT", + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.3" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", + "license": "MIT" + }, + "node_modules/ts-api-utils": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.4.0.tgz", + "integrity": "sha512-3TaVTaAv2gTiMB35i3FiGJaRfwb3Pyn/j3m/bfAvGe8FB7CF6u+LMYqYlDh7reQf7UNvoTvdfAqHGmPGOSsPmA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18.12" + }, + "peerDependencies": { + "typescript": ">=4.8.4" + } + }, + "node_modules/tsconfig-paths": { + "version": "3.15.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz", + "integrity": "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/json5": "^0.0.29", + "json5": "^1.0.2", + "minimist": "^1.2.6", + "strip-bom": "^3.0.0" + } + }, + "node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "dev": true, + "license": "0BSD" + }, + "node_modules/tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", + "license": "Apache-2.0", + "dependencies": { + "safe-buffer": "^5.0.1" + }, + "engines": { + "node": "*" + } + }, + "node_modules/tunnel-agent/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==", + "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/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/type-fest": { + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz", + "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/typed-array-buffer": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz", + "integrity": "sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-typed-array": "^1.1.14" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/typed-array-byte-length": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.3.tgz", + "integrity": "sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "for-each": "^0.3.3", + "gopd": "^1.2.0", + "has-proto": "^1.2.0", + "is-typed-array": "^1.1.14" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-byte-offset": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.4.tgz", + "integrity": "sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", + "for-each": "^0.3.3", + "gopd": "^1.2.0", + "has-proto": "^1.2.0", + "is-typed-array": "^1.1.15", + "reflect.getprototypeof": "^1.0.9" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-length": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.7.tgz", + "integrity": "sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "is-typed-array": "^1.1.13", + "possible-typed-array-names": "^1.0.0", + "reflect.getprototypeof": "^1.0.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==", + "dev": true, + "license": "MIT" + }, + "node_modules/typescript": { + "version": "4.9.5", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz", + "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=4.2.0" + } + }, + "node_modules/uglify-js": { + "version": "3.19.3", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.19.3.tgz", + "integrity": "sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ==", + "dev": true, + "license": "BSD-2-Clause", + "optional": true, + "bin": { + "uglifyjs": "bin/uglifyjs" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/unbox-primitive": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.1.0.tgz", + "integrity": "sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "has-bigints": "^1.0.2", + "has-symbols": "^1.1.0", + "which-boxed-primitive": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/undici": { + "version": "6.23.0", + "resolved": "https://registry.npmjs.org/undici/-/undici-6.23.0.tgz", + "integrity": "sha512-VfQPToRA5FZs/qJxLIinmU59u0r7LXqoJkCzinq3ckNJp3vKEh7jTWN589YQ5+aoAC/TGRLyJLCPKcLQbM8r9g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18.17" + } + }, + "node_modules/undici-types": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", + "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/universal-user-agent": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-7.0.3.tgz", + "integrity": "sha512-TmnEAEAsBJVZM/AADELsK76llnwcf9vMKuPz8JflO1frO8Lchitr0fNaN9d+Ap0BjKtqWqd/J17qeDnXh8CL2A==", + "dev": true, + "license": "ISC" + }, + "node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "license": "MIT", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/unzipper": { + "version": "0.12.3", + "resolved": "https://registry.npmjs.org/unzipper/-/unzipper-0.12.3.tgz", + "integrity": "sha512-PZ8hTS+AqcGxsaQntl3IRBw65QrBI6lxzqDEL7IAo/XCEqRTKGfOX56Vea5TH9SZczRVxuzk1re04z/YjuYCJA==", + "license": "MIT", + "dependencies": { + "bluebird": "~3.7.2", + "duplexer2": "~0.1.4", + "fs-extra": "^11.2.0", + "graceful-fs": "^4.2.2", + "node-int64": "^0.4.0" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/url-join": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/url-join/-/url-join-5.0.0.tgz", + "integrity": "sha512-n2huDr9h9yzd6exQVnH/jU5mr+Pfx08LRXXZhkLLetAMESRj+anQsTAh940iMrIetKAmry9coFuZQ2jY8/p3WA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "license": "MIT" + }, + "node_modules/validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "node_modules/walk-up-path": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/walk-up-path/-/walk-up-path-4.0.0.tgz", + "integrity": "sha512-3hu+tD8YzSLGuFYtPRb48vdhKMi0KQV5sn+uWr8+7dMEq/2G/dtLrdDinkLjqq5TIbIBjYJ4Ax/n3YiaW7QM8A==", + "dev": true, + "license": "ISC", + "engines": { + "node": "20 || >=22" + } + }, + "node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", + "license": "BSD-2-Clause" + }, + "node_modules/whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "license": "MIT", + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, + "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/which-boxed-primitive": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.1.1.tgz", + "integrity": "sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-bigint": "^1.1.0", + "is-boolean-object": "^1.2.1", + "is-number-object": "^1.1.1", + "is-string": "^1.1.1", + "is-symbol": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-builtin-type": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.2.1.tgz", + "integrity": "sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "function.prototype.name": "^1.1.6", + "has-tostringtag": "^1.0.2", + "is-async-function": "^2.0.0", + "is-date-object": "^1.1.0", + "is-finalizationregistry": "^1.1.0", + "is-generator-function": "^1.0.10", + "is-regex": "^1.2.1", + "is-weakref": "^1.0.2", + "isarray": "^2.0.5", + "which-boxed-primitive": "^1.1.0", + "which-collection": "^1.0.2", + "which-typed-array": "^1.1.16" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-collection": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.2.tgz", + "integrity": "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-map": "^2.0.3", + "is-set": "^2.0.3", + "is-weakmap": "^2.0.2", + "is-weakset": "^2.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-typed-array": { + "version": "1.1.20", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.20.tgz", + "integrity": "sha512-LYfpUkmqwl0h9A2HL09Mms427Q1RZWuOHsukfVcKRq9q95iQxdw0ix1JQrqbcDR9PH1QDwf5Qo8OZb5lksZ8Xg==", + "dev": true, + "license": "MIT", + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "for-each": "^0.3.5", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/wildcard-match": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/wildcard-match/-/wildcard-match-5.1.4.tgz", + "integrity": "sha512-wldeCaczs8XXq7hj+5d/F38JE2r7EXgb6WQDM84RVwxy81T/sxB5e9+uZLK9Q9oNz1mlvjut+QtvgaOQFPVq/g==", + "dev": true, + "license": "ISC" + }, + "node_modules/windows-release": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/windows-release/-/windows-release-6.1.0.tgz", + "integrity": "sha512-1lOb3qdzw6OFmOzoY0nauhLG72TpWtb5qgYPiSh/62rjc1XidBSDio2qw0pwHh17VINF217ebIkZJdFLZFn9SA==", + "dev": true, + "license": "MIT", + "dependencies": { + "execa": "^8.0.1" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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/wordwrap": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", + "integrity": "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/wrap-ansi": { + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.2.tgz", + "integrity": "sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.2.1", + "string-width": "^7.0.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-styles": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", + "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/emoji-regex": { + "version": "10.6.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.6.0.tgz", + "integrity": "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==", + "dev": true, + "license": "MIT" + }, + "node_modules/wrap-ansi/node_modules/string-width": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", + "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^10.3.0", + "get-east-asian-width": "^1.0.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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==", + "license": "ISC" + }, + "node_modules/wsl-utils": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/wsl-utils/-/wsl-utils-0.1.0.tgz", + "integrity": "sha512-h3Fbisa2nKGPxCpm89Hk33lBLsnaGBvctQopaBSOW/uIs6FTe1ATyAnKFJrzVs9vpGdsTe73WF3V4lIsk4Gacw==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-wsl": "^3.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/yallist": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-5.0.0.tgz", + "integrity": "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==", + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=18" + } + }, + "node_modules/yaml": { + "version": "2.8.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.2.tgz", + "integrity": "sha512-mplynKqc1C2hTVYxd0PU2xQAc22TI1vShAYGksCCfxbn/dFwnHTNi1bvYsBTkhdUNtGIf5xNOg938rrSSYvS9A==", + "dev": true, + "license": "ISC", + "bin": { + "yaml": "bin.mjs" + }, + "engines": { + "node": ">= 14.6" + }, + "funding": { + "url": "https://github.com/sponsors/eemeli" + } + }, + "node_modules/yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "license": "MIT", + "dependencies": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + }, + "engines": { + "node": ">=10" + } + }, + "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/node_modules/yargs-parser": { + "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "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" + } + }, + "node_modules/yoctocolors": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yoctocolors/-/yoctocolors-2.1.2.tgz", + "integrity": "sha512-CzhO+pFNo8ajLM2d2IW/R93ipy99LWjtwblvC1RsoSUMZgyLbYFr221TnSNT7GjGdYui6P459mw9JH/g/zW2ug==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/yoctocolors-cjs": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/yoctocolors-cjs/-/yoctocolors-cjs-2.1.3.tgz", + "integrity": "sha512-U/PBtDf35ff0D8X8D0jfdzHYEPFxAI7jJlxZXwCSez5M3190m+QobIfh+sWDWSHMCWWJN2AWamkegn6vr6YBTw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + } + } +} diff --git a/package.json b/package.json index e914d6657..ece0aa62b 100644 --- a/package.json +++ b/package.json @@ -34,6 +34,7 @@ "multistream": "^4.1.0", "picocolors": "^1.1.0", "picomatch": "^4.0.2", + "postject": "^1.0.0-alpha.6", "prebuild-install": "^7.1.1", "resolve": "^1.22.10", "resolve.exports": "^2.0.3", diff --git a/yarn.lock b/yarn.lock index e04b22443..31d9199b7 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4,7 +4,7 @@ "@babel/code-frame@^7.28.6", "@babel/code-frame@^7.29.0": version "7.29.0" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.29.0.tgz#7cd7a59f15b3cc0dcd803038f7792712a7d0b15c" + resolved "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.0.tgz" integrity sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw== dependencies: "@babel/helper-validator-identifier" "^7.28.5" @@ -13,7 +13,7 @@ "@babel/generator@^7.23.0", "@babel/generator@^7.29.0": version "7.29.1" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.29.1.tgz#d09876290111abbb00ef962a7b83a5307fba0d50" + resolved "https://registry.npmjs.org/@babel/generator/-/generator-7.29.1.tgz" integrity sha512-qsaF+9Qcm2Qv8SRIMMscAvG4O3lJ0F1GuMo5HR/Bp02LopNgnZBC/EkbevHFeGs4ls/oPz9v+Bsmzbkbe+0dUw== dependencies: "@babel/parser" "^7.29.0" @@ -24,29 +24,29 @@ "@babel/helper-globals@^7.28.0": version "7.28.0" - resolved "https://registry.yarnpkg.com/@babel/helper-globals/-/helper-globals-7.28.0.tgz#b9430df2aa4e17bc28665eadeae8aa1d985e6674" + resolved "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz" integrity sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw== "@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" + resolved "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz" integrity sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA== "@babel/helper-validator-identifier@^7.28.5": version "7.28.5" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz#010b6938fab7cb7df74aa2bbc06aa503b8fe5fb4" + resolved "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz" integrity sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q== "@babel/parser@^7.23.0", "@babel/parser@^7.28.6", "@babel/parser@^7.29.0": version "7.29.0" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.29.0.tgz#669ef345add7d057e92b7ed15f0bac07611831b6" + resolved "https://registry.npmjs.org/@babel/parser/-/parser-7.29.0.tgz" integrity sha512-IyDgFV5GeDUVX4YdF/3CPULtVGSXXMLh1xVIgdCgxApktqnQV0r7/8Nqthg+8YLGaAtdyIlo2qIdZrbCv4+7ww== dependencies: "@babel/types" "^7.29.0" "@babel/template@^7.28.6": version "7.28.6" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.28.6.tgz#0e7e56ecedb78aeef66ce7972b082fce76a23e57" + resolved "https://registry.npmjs.org/@babel/template/-/template-7.28.6.tgz" integrity sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ== dependencies: "@babel/code-frame" "^7.28.6" @@ -55,7 +55,7 @@ "@babel/traverse@^7.23.0": version "7.29.0" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.29.0.tgz#f323d05001440253eead3c9c858adbe00b90310a" + resolved "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.0.tgz" integrity sha512-4HPiQr0X7+waHfyXPZpWPfWL/J7dcN1mx9gL6WdQVMbPnF3+ZhSMs8tCxN7oHddJE9fhNE7+lxdnlyemKfJRuA== dependencies: "@babel/code-frame" "^7.29.0" @@ -68,7 +68,7 @@ "@babel/types@^7.0.0", "@babel/types@^7.23.0", "@babel/types@^7.28.2", "@babel/types@^7.28.6", "@babel/types@^7.29.0": version "7.29.0" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.29.0.tgz#9f5b1e838c446e72cf3cd4b918152b8c605e37c7" + resolved "https://registry.npmjs.org/@babel/types/-/types-7.29.0.tgz" integrity sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A== dependencies: "@babel/helper-string-parser" "^7.27.1" @@ -76,158 +76,33 @@ "@conventional-changelog/git-client@^2.5.1": version "2.5.1" - resolved "https://registry.yarnpkg.com/@conventional-changelog/git-client/-/git-client-2.5.1.tgz#770d3911264653492d18366751e06b14a6ec7b3d" + resolved "https://registry.npmjs.org/@conventional-changelog/git-client/-/git-client-2.5.1.tgz" integrity sha512-lAw7iA5oTPWOLjiweb7DlGEMDEvzqzLLa6aWOly2FSZ64IwLE8T458rC+o+WvI31Doz6joM7X2DoNog7mX8r4A== dependencies: "@simple-libs/child-process-utils" "^1.0.0" "@simple-libs/stream-utils" "^1.1.0" semver "^7.5.2" -"@esbuild/aix-ppc64@0.27.3": - version "0.27.3" - resolved "https://registry.yarnpkg.com/@esbuild/aix-ppc64/-/aix-ppc64-0.27.3.tgz#815b39267f9bffd3407ea6c376ac32946e24f8d2" - integrity sha512-9fJMTNFTWZMh5qwrBItuziu834eOCUcEqymSH7pY+zoMVEZg3gcPuBNxH1EvfVYe9h0x/Ptw8KBzv7qxb7l8dg== - -"@esbuild/android-arm64@0.27.3": - version "0.27.3" - resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.27.3.tgz#19b882408829ad8e12b10aff2840711b2da361e8" - integrity sha512-YdghPYUmj/FX2SYKJ0OZxf+iaKgMsKHVPF1MAq/P8WirnSpCStzKJFjOjzsW0QQ7oIAiccHdcqjbHmJxRb/dmg== - -"@esbuild/android-arm@0.27.3": - version "0.27.3" - resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.27.3.tgz#90be58de27915efa27b767fcbdb37a4470627d7b" - integrity sha512-i5D1hPY7GIQmXlXhs2w8AWHhenb00+GxjxRncS2ZM7YNVGNfaMxgzSGuO8o8SJzRc/oZwU2bcScvVERk03QhzA== - -"@esbuild/android-x64@0.27.3": - version "0.27.3" - resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.27.3.tgz#d7dcc976f16e01a9aaa2f9b938fbec7389f895ac" - integrity sha512-IN/0BNTkHtk8lkOM8JWAYFg4ORxBkZQf9zXiEOfERX/CzxW3Vg1ewAhU7QSWQpVIzTW+b8Xy+lGzdYXV6UZObQ== - -"@esbuild/darwin-arm64@0.27.3": - version "0.27.3" - resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.27.3.tgz#9f6cac72b3a8532298a6a4493ed639a8988e8abd" - integrity sha512-Re491k7ByTVRy0t3EKWajdLIr0gz2kKKfzafkth4Q8A5n1xTHrkqZgLLjFEHVD+AXdUGgQMq+Godfq45mGpCKg== - -"@esbuild/darwin-x64@0.27.3": - version "0.27.3" - resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.27.3.tgz#ac61d645faa37fd650340f1866b0812e1fb14d6a" - integrity sha512-vHk/hA7/1AckjGzRqi6wbo+jaShzRowYip6rt6q7VYEDX4LEy1pZfDpdxCBnGtl+A5zq8iXDcyuxwtv3hNtHFg== - -"@esbuild/freebsd-arm64@0.27.3": - version "0.27.3" - resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.27.3.tgz#b8625689d73cf1830fe58c39051acdc12474ea1b" - integrity sha512-ipTYM2fjt3kQAYOvo6vcxJx3nBYAzPjgTCk7QEgZG8AUO3ydUhvelmhrbOheMnGOlaSFUoHXB6un+A7q4ygY9w== - -"@esbuild/freebsd-x64@0.27.3": - version "0.27.3" - resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.27.3.tgz#07be7dd3c9d42fe0eccd2ab9f9ded780bc53bead" - integrity sha512-dDk0X87T7mI6U3K9VjWtHOXqwAMJBNN2r7bejDsc+j03SEjtD9HrOl8gVFByeM0aJksoUuUVU9TBaZa2rgj0oA== - -"@esbuild/linux-arm64@0.27.3": - version "0.27.3" - resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.27.3.tgz#bf31918fe5c798586460d2b3d6c46ed2c01ca0b6" - integrity sha512-sZOuFz/xWnZ4KH3YfFrKCf1WyPZHakVzTiqji3WDc0BCl2kBwiJLCXpzLzUBLgmp4veFZdvN5ChW4Eq/8Fc2Fg== - -"@esbuild/linux-arm@0.27.3": - version "0.27.3" - resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.27.3.tgz#28493ee46abec1dc3f500223cd9f8d2df08f9d11" - integrity sha512-s6nPv2QkSupJwLYyfS+gwdirm0ukyTFNl3KTgZEAiJDd+iHZcbTPPcWCcRYH+WlNbwChgH2QkE9NSlNrMT8Gfw== - -"@esbuild/linux-ia32@0.27.3": - version "0.27.3" - resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.27.3.tgz#750752a8b30b43647402561eea764d0a41d0ee29" - integrity sha512-yGlQYjdxtLdh0a3jHjuwOrxQjOZYD/C9PfdbgJJF3TIZWnm/tMd/RcNiLngiu4iwcBAOezdnSLAwQDPqTmtTYg== - -"@esbuild/linux-loong64@0.27.3": - version "0.27.3" - resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.27.3.tgz#a5a92813a04e71198c50f05adfaf18fc1e95b9ed" - integrity sha512-WO60Sn8ly3gtzhyjATDgieJNet/KqsDlX5nRC5Y3oTFcS1l0KWba+SEa9Ja1GfDqSF1z6hif/SkpQJbL63cgOA== - -"@esbuild/linux-mips64el@0.27.3": - version "0.27.3" - resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.27.3.tgz#deb45d7fd2d2161eadf1fbc593637ed766d50bb1" - integrity sha512-APsymYA6sGcZ4pD6k+UxbDjOFSvPWyZhjaiPyl/f79xKxwTnrn5QUnXR5prvetuaSMsb4jgeHewIDCIWljrSxw== - -"@esbuild/linux-ppc64@0.27.3": - version "0.27.3" - resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.27.3.tgz#6f39ae0b8c4d3d2d61a65b26df79f6e12a1c3d78" - integrity sha512-eizBnTeBefojtDb9nSh4vvVQ3V9Qf9Df01PfawPcRzJH4gFSgrObw+LveUyDoKU3kxi5+9RJTCWlj4FjYXVPEA== - -"@esbuild/linux-riscv64@0.27.3": - version "0.27.3" - resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.27.3.tgz#4c5c19c3916612ec8e3915187030b9df0b955c1d" - integrity sha512-3Emwh0r5wmfm3ssTWRQSyVhbOHvqegUDRd0WhmXKX2mkHJe1SFCMJhagUleMq+Uci34wLSipf8Lagt4LlpRFWQ== - -"@esbuild/linux-s390x@0.27.3": - version "0.27.3" - resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.27.3.tgz#9ed17b3198fa08ad5ccaa9e74f6c0aff7ad0156d" - integrity sha512-pBHUx9LzXWBc7MFIEEL0yD/ZVtNgLytvx60gES28GcWMqil8ElCYR4kvbV2BDqsHOvVDRrOxGySBM9Fcv744hw== - "@esbuild/linux-x64@0.27.3": version "0.27.3" - resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.27.3.tgz#12383dcbf71b7cf6513e58b4b08d95a710bf52a5" + resolved "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.27.3.tgz" integrity sha512-Czi8yzXUWIQYAtL/2y6vogER8pvcsOsk5cpwL4Gk5nJqH5UZiVByIY8Eorm5R13gq+DQKYg0+JyQoytLQas4dA== -"@esbuild/netbsd-arm64@0.27.3": - version "0.27.3" - resolved "https://registry.yarnpkg.com/@esbuild/netbsd-arm64/-/netbsd-arm64-0.27.3.tgz#dd0cb2fa543205fcd931df44f4786bfcce6df7d7" - integrity sha512-sDpk0RgmTCR/5HguIZa9n9u+HVKf40fbEUt+iTzSnCaGvY9kFP0YKBWZtJaraonFnqef5SlJ8/TiPAxzyS+UoA== - -"@esbuild/netbsd-x64@0.27.3": - version "0.27.3" - resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.27.3.tgz#028ad1807a8e03e155153b2d025b506c3787354b" - integrity sha512-P14lFKJl/DdaE00LItAukUdZO5iqNH7+PjoBm+fLQjtxfcfFE20Xf5CrLsmZdq5LFFZzb5JMZ9grUwvtVYzjiA== - -"@esbuild/openbsd-arm64@0.27.3": - version "0.27.3" - resolved "https://registry.yarnpkg.com/@esbuild/openbsd-arm64/-/openbsd-arm64-0.27.3.tgz#e3c16ff3490c9b59b969fffca87f350ffc0e2af5" - integrity sha512-AIcMP77AvirGbRl/UZFTq5hjXK+2wC7qFRGoHSDrZ5v5b8DK/GYpXW3CPRL53NkvDqb9D+alBiC/dV0Fb7eJcw== - -"@esbuild/openbsd-x64@0.27.3": - version "0.27.3" - resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.27.3.tgz#c5a4693fcb03d1cbecbf8b422422468dfc0d2a8b" - integrity sha512-DnW2sRrBzA+YnE70LKqnM3P+z8vehfJWHXECbwBmH/CU51z6FiqTQTHFenPlHmo3a8UgpLyH3PT+87OViOh1AQ== - -"@esbuild/openharmony-arm64@0.27.3": - version "0.27.3" - resolved "https://registry.yarnpkg.com/@esbuild/openharmony-arm64/-/openharmony-arm64-0.27.3.tgz#082082444f12db564a0775a41e1991c0e125055e" - integrity sha512-NinAEgr/etERPTsZJ7aEZQvvg/A6IsZG/LgZy+81wON2huV7SrK3e63dU0XhyZP4RKGyTm7aOgmQk0bGp0fy2g== - -"@esbuild/sunos-x64@0.27.3": - version "0.27.3" - resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.27.3.tgz#5ab036c53f929e8405c4e96e865a424160a1b537" - integrity sha512-PanZ+nEz+eWoBJ8/f8HKxTTD172SKwdXebZ0ndd953gt1HRBbhMsaNqjTyYLGLPdoWHy4zLU7bDVJztF5f3BHA== - -"@esbuild/win32-arm64@0.27.3": - version "0.27.3" - resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.27.3.tgz#38de700ef4b960a0045370c171794526e589862e" - integrity sha512-B2t59lWWYrbRDw/tjiWOuzSsFh1Y/E95ofKz7rIVYSQkUYBjfSgf6oeYPNWHToFRr2zx52JKApIcAS/D5TUBnA== - -"@esbuild/win32-ia32@0.27.3": - version "0.27.3" - resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.27.3.tgz#451b93dc03ec5d4f38619e6cd64d9f9eff06f55c" - integrity sha512-QLKSFeXNS8+tHW7tZpMtjlNb7HKau0QDpwm49u0vUp9y1WOF+PEzkU84y9GqYaAVW8aH8f3GcBck26jh54cX4Q== - -"@esbuild/win32-x64@0.27.3": - version "0.27.3" - resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.27.3.tgz#0eaf705c941a218a43dba8e09f1df1d6cd2f1f17" - integrity sha512-4uJGhsxuptu3OcpVAzli+/gWusVGwZZHTlS63hh++ehExkVT8SgiEf7/uC/PclrPPkLhZqGgCTjd0VWLo6xMqA== - "@eslint-community/eslint-utils@^4.8.0", "@eslint-community/eslint-utils@^4.9.1": version "4.9.1" - resolved "https://registry.yarnpkg.com/@eslint-community/eslint-utils/-/eslint-utils-4.9.1.tgz#4e90af67bc51ddee6cdef5284edf572ec376b595" + resolved "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.1.tgz" integrity sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ== dependencies: eslint-visitor-keys "^3.4.3" "@eslint-community/regexpp@^4.12.1", "@eslint-community/regexpp@^4.12.2": version "4.12.2" - resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.12.2.tgz#bccdf615bcf7b6e8db830ec0b8d21c9a25de597b" + resolved "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.2.tgz" integrity sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew== "@eslint/config-array@^0.21.1": version "0.21.1" - resolved "https://registry.yarnpkg.com/@eslint/config-array/-/config-array-0.21.1.tgz#7d1b0060fea407f8301e932492ba8c18aff29713" + resolved "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.21.1.tgz" integrity sha512-aw1gNayWpdI/jSYVgzN5pL0cfzU02GT3NBpeT/DXbx1/1x7ZKxFPd9bwrzygx/qiwIQiJ1sw/zD8qY/kRvlGHA== dependencies: "@eslint/object-schema" "^2.1.7" @@ -236,21 +111,21 @@ "@eslint/config-helpers@^0.4.2": version "0.4.2" - resolved "https://registry.yarnpkg.com/@eslint/config-helpers/-/config-helpers-0.4.2.tgz#1bd006ceeb7e2e55b2b773ab318d300e1a66aeda" + resolved "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.4.2.tgz" integrity sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw== dependencies: "@eslint/core" "^0.17.0" "@eslint/core@^0.17.0": version "0.17.0" - resolved "https://registry.yarnpkg.com/@eslint/core/-/core-0.17.0.tgz#77225820413d9617509da9342190a2019e78761c" + resolved "https://registry.npmjs.org/@eslint/core/-/core-0.17.0.tgz" integrity sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ== dependencies: "@types/json-schema" "^7.0.15" "@eslint/eslintrc@^3.3.1": version "3.3.3" - resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-3.3.3.tgz#26393a0806501b5e2b6a43aa588a4d8df67880ac" + resolved "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.3.tgz" integrity sha512-Kr+LPIUVKz2qkx1HAMH8q1q6azbqBAsXJUxBl/ODDuVPX45Z9DfwB8tPjTi6nNZ8BuM3nbJxC5zCAg5elnBUTQ== dependencies: ajv "^6.12.4" @@ -265,17 +140,17 @@ "@eslint/js@9.39.2": version "9.39.2" - resolved "https://registry.yarnpkg.com/@eslint/js/-/js-9.39.2.tgz#2d4b8ec4c3ea13c1b3748e0c97ecd766bdd80599" + resolved "https://registry.npmjs.org/@eslint/js/-/js-9.39.2.tgz" integrity sha512-q1mjIoW1VX4IvSocvM/vbTiveKC4k9eLrajNEuSsmjymSDEbpGddtpfOoN7YGAqBK3NG+uqo8ia4PDTt8buCYA== "@eslint/object-schema@^2.1.7": version "2.1.7" - resolved "https://registry.yarnpkg.com/@eslint/object-schema/-/object-schema-2.1.7.tgz#6e2126a1347e86a4dedf8706ec67ff8e107ebbad" + resolved "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.7.tgz" integrity sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA== "@eslint/plugin-kit@^0.4.1": version "0.4.1" - resolved "https://registry.yarnpkg.com/@eslint/plugin-kit/-/plugin-kit-0.4.1.tgz#9779e3fd9b7ee33571a57435cf4335a1794a6cb2" + resolved "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.4.1.tgz" integrity sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA== dependencies: "@eslint/core" "^0.17.0" @@ -283,12 +158,12 @@ "@humanfs/core@^0.19.1": version "0.19.1" - resolved "https://registry.yarnpkg.com/@humanfs/core/-/core-0.19.1.tgz#17c55ca7d426733fe3c561906b8173c336b40a77" + resolved "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz" integrity sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA== "@humanfs/node@^0.16.6": version "0.16.7" - resolved "https://registry.yarnpkg.com/@humanfs/node/-/node-0.16.7.tgz#822cb7b3a12c5a240a24f621b5a2413e27a45f26" + resolved "https://registry.npmjs.org/@humanfs/node/-/node-0.16.7.tgz" integrity sha512-/zUx+yOsIrG4Y43Eh2peDeKCxlRt/gET6aHfaKpuq267qXdYDFViVHfMaLyygZOnl0kGWxFIgsBy8QFuTLUXEQ== dependencies: "@humanfs/core" "^0.19.1" @@ -296,22 +171,22 @@ "@humanwhocodes/module-importer@^1.0.1": version "1.0.1" - resolved "https://registry.yarnpkg.com/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz#af5b2691a22b44be847b0ca81641c5fb6ad0172c" + resolved "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz" integrity sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA== "@humanwhocodes/retry@^0.4.0", "@humanwhocodes/retry@^0.4.2": version "0.4.3" - resolved "https://registry.yarnpkg.com/@humanwhocodes/retry/-/retry-0.4.3.tgz#c2b9d2e374ee62c586d3adbea87199b1d7a7a6ba" + resolved "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.3.tgz" integrity sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ== "@inquirer/ansi@^1.0.2": version "1.0.2" - resolved "https://registry.yarnpkg.com/@inquirer/ansi/-/ansi-1.0.2.tgz#674a4c4d81ad460695cb2a1fc69d78cd187f337e" + resolved "https://registry.npmjs.org/@inquirer/ansi/-/ansi-1.0.2.tgz" integrity sha512-S8qNSZiYzFd0wAcyG5AXCvUHC5Sr7xpZ9wZ2py9XR88jUz8wooStVx5M6dRzczbBWjic9NP7+rY0Xi7qqK/aMQ== "@inquirer/checkbox@^4.3.2": version "4.3.2" - resolved "https://registry.yarnpkg.com/@inquirer/checkbox/-/checkbox-4.3.2.tgz#e1483e6519d6ffef97281a54d2a5baa0d81b3f3b" + resolved "https://registry.npmjs.org/@inquirer/checkbox/-/checkbox-4.3.2.tgz" integrity sha512-VXukHf0RR1doGe6Sm4F0Em7SWYLTHSsbGfJdS9Ja2bX5/D5uwVOEjr07cncLROdBvmnvCATYEWlHqYmXv2IlQA== dependencies: "@inquirer/ansi" "^1.0.2" @@ -322,7 +197,7 @@ "@inquirer/confirm@^5.1.21": version "5.1.21" - resolved "https://registry.yarnpkg.com/@inquirer/confirm/-/confirm-5.1.21.tgz#610c4acd7797d94890a6e2dde2c98eb1e891dd12" + resolved "https://registry.npmjs.org/@inquirer/confirm/-/confirm-5.1.21.tgz" integrity sha512-KR8edRkIsUayMXV+o3Gv+q4jlhENF9nMYUZs9PA2HzrXeHI8M5uDag70U7RJn9yyiMZSbtF5/UexBtAVtZGSbQ== dependencies: "@inquirer/core" "^10.3.2" @@ -330,7 +205,7 @@ "@inquirer/core@^10.3.2": version "10.3.2" - resolved "https://registry.yarnpkg.com/@inquirer/core/-/core-10.3.2.tgz#535979ff3ff4fe1e7cc4f83e2320504c743b7e20" + resolved "https://registry.npmjs.org/@inquirer/core/-/core-10.3.2.tgz" integrity sha512-43RTuEbfP8MbKzedNqBrlhhNKVwoK//vUFNW3Q3vZ88BLcrs4kYpGg+B2mm5p2K/HfygoCxuKwJJiv8PbGmE0A== dependencies: "@inquirer/ansi" "^1.0.2" @@ -344,7 +219,7 @@ "@inquirer/editor@^4.2.23": version "4.2.23" - resolved "https://registry.yarnpkg.com/@inquirer/editor/-/editor-4.2.23.tgz#fe046a3bfdae931262de98c1052437d794322e0b" + resolved "https://registry.npmjs.org/@inquirer/editor/-/editor-4.2.23.tgz" integrity sha512-aLSROkEwirotxZ1pBaP8tugXRFCxW94gwrQLxXfrZsKkfjOYC1aRvAZuhpJOb5cu4IBTJdsCigUlf2iCOu4ZDQ== dependencies: "@inquirer/core" "^10.3.2" @@ -353,7 +228,7 @@ "@inquirer/expand@^4.0.23": version "4.0.23" - resolved "https://registry.yarnpkg.com/@inquirer/expand/-/expand-4.0.23.tgz#a38b5f32226d75717c370bdfed792313b92bdc05" + resolved "https://registry.npmjs.org/@inquirer/expand/-/expand-4.0.23.tgz" integrity sha512-nRzdOyFYnpeYTTR2qFwEVmIWypzdAx/sIkCMeTNTcflFOovfqUk+HcFhQQVBftAh9gmGrpFj6QcGEqrDMDOiew== dependencies: "@inquirer/core" "^10.3.2" @@ -362,7 +237,7 @@ "@inquirer/external-editor@^1.0.3": version "1.0.3" - resolved "https://registry.yarnpkg.com/@inquirer/external-editor/-/external-editor-1.0.3.tgz#c23988291ee676290fdab3fd306e64010a6d13b8" + resolved "https://registry.npmjs.org/@inquirer/external-editor/-/external-editor-1.0.3.tgz" integrity sha512-RWbSrDiYmO4LbejWY7ttpxczuwQyZLBUyygsA9Nsv95hpzUWwnNTVQmAq3xuh7vNwCp07UTmE5i11XAEExx4RA== dependencies: chardet "^2.1.1" @@ -370,12 +245,12 @@ "@inquirer/figures@^1.0.15": version "1.0.15" - resolved "https://registry.yarnpkg.com/@inquirer/figures/-/figures-1.0.15.tgz#dbb49ed80df11df74268023b496ac5d9acd22b3a" + resolved "https://registry.npmjs.org/@inquirer/figures/-/figures-1.0.15.tgz" integrity sha512-t2IEY+unGHOzAaVM5Xx6DEWKeXlDDcNPeDyUpsRc6CUhBfU3VQOEl+Vssh7VNp1dR8MdUJBWhuObjXCsVpjN5g== "@inquirer/input@^4.3.1": version "4.3.1" - resolved "https://registry.yarnpkg.com/@inquirer/input/-/input-4.3.1.tgz#778683b4c4c4d95d05d4b05c4a854964b73565b4" + resolved "https://registry.npmjs.org/@inquirer/input/-/input-4.3.1.tgz" integrity sha512-kN0pAM4yPrLjJ1XJBjDxyfDduXOuQHrBB8aLDMueuwUGn+vNpF7Gq7TvyVxx8u4SHlFFj4trmj+a2cbpG4Jn1g== dependencies: "@inquirer/core" "^10.3.2" @@ -383,7 +258,7 @@ "@inquirer/number@^3.0.23": version "3.0.23" - resolved "https://registry.yarnpkg.com/@inquirer/number/-/number-3.0.23.tgz#3fdec2540d642093fd7526818fd8d4bdc7335094" + resolved "https://registry.npmjs.org/@inquirer/number/-/number-3.0.23.tgz" integrity sha512-5Smv0OK7K0KUzUfYUXDXQc9jrf8OHo4ktlEayFlelCjwMXz0299Y8OrI+lj7i4gCBY15UObk76q0QtxjzFcFcg== dependencies: "@inquirer/core" "^10.3.2" @@ -391,7 +266,7 @@ "@inquirer/password@^4.0.23": version "4.0.23" - resolved "https://registry.yarnpkg.com/@inquirer/password/-/password-4.0.23.tgz#b9f5187c8c92fd7aa9eceb9d8f2ead0d7e7b000d" + resolved "https://registry.npmjs.org/@inquirer/password/-/password-4.0.23.tgz" integrity sha512-zREJHjhT5vJBMZX/IUbyI9zVtVfOLiTO66MrF/3GFZYZ7T4YILW5MSkEYHceSii/KtRk+4i3RE7E1CUXA2jHcA== dependencies: "@inquirer/ansi" "^1.0.2" @@ -400,7 +275,7 @@ "@inquirer/prompts@^7.10.1": version "7.10.1" - resolved "https://registry.yarnpkg.com/@inquirer/prompts/-/prompts-7.10.1.tgz#e1436c0484cf04c22548c74e2cd239e989d5f847" + resolved "https://registry.npmjs.org/@inquirer/prompts/-/prompts-7.10.1.tgz" integrity sha512-Dx/y9bCQcXLI5ooQ5KyvA4FTgeo2jYj/7plWfV5Ak5wDPKQZgudKez2ixyfz7tKXzcJciTxqLeK7R9HItwiByg== dependencies: "@inquirer/checkbox" "^4.3.2" @@ -416,7 +291,7 @@ "@inquirer/rawlist@^4.1.11": version "4.1.11" - resolved "https://registry.yarnpkg.com/@inquirer/rawlist/-/rawlist-4.1.11.tgz#313c8c3ffccb7d41e990c606465726b4a898a033" + resolved "https://registry.npmjs.org/@inquirer/rawlist/-/rawlist-4.1.11.tgz" integrity sha512-+LLQB8XGr3I5LZN/GuAHo+GpDJegQwuPARLChlMICNdwW7OwV2izlCSCxN6cqpL0sMXmbKbFcItJgdQq5EBXTw== dependencies: "@inquirer/core" "^10.3.2" @@ -425,7 +300,7 @@ "@inquirer/search@^3.2.2": version "3.2.2" - resolved "https://registry.yarnpkg.com/@inquirer/search/-/search-3.2.2.tgz#4cc6fd574dcd434e4399badc37c742c3fd534ac8" + resolved "https://registry.npmjs.org/@inquirer/search/-/search-3.2.2.tgz" integrity sha512-p2bvRfENXCZdWF/U2BXvnSI9h+tuA8iNqtUKb9UWbmLYCRQxd8WkvwWvYn+3NgYaNwdUkHytJMGG4MMLucI1kA== dependencies: "@inquirer/core" "^10.3.2" @@ -435,7 +310,7 @@ "@inquirer/select@^4.4.2": version "4.4.2" - resolved "https://registry.yarnpkg.com/@inquirer/select/-/select-4.4.2.tgz#2ac8fca960913f18f1d1b35323ed8fcd27d89323" + resolved "https://registry.npmjs.org/@inquirer/select/-/select-4.4.2.tgz" integrity sha512-l4xMuJo55MAe+N7Qr4rX90vypFwCajSakx59qe/tMaC1aEHWLyw68wF4o0A4SLAY4E0nd+Vt+EyskeDIqu1M6w== dependencies: "@inquirer/ansi" "^1.0.2" @@ -446,19 +321,19 @@ "@inquirer/type@^3.0.10": version "3.0.10" - resolved "https://registry.yarnpkg.com/@inquirer/type/-/type-3.0.10.tgz#11ed564ec78432a200ea2601a212d24af8150d50" + resolved "https://registry.npmjs.org/@inquirer/type/-/type-3.0.10.tgz" integrity sha512-BvziSRxfz5Ov8ch0z/n3oijRSEcEsHnhggm4xFZe93DHcUCTlutlq9Ox4SVENAfcRD22UQq7T/atg9Wr3k09eA== "@isaacs/fs-minipass@^4.0.0": version "4.0.1" - resolved "https://registry.yarnpkg.com/@isaacs/fs-minipass/-/fs-minipass-4.0.1.tgz#2d59ae3ab4b38fb4270bfa23d30f8e2e86c7fe32" + resolved "https://registry.npmjs.org/@isaacs/fs-minipass/-/fs-minipass-4.0.1.tgz" integrity sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w== dependencies: minipass "^7.0.4" "@jridgewell/gen-mapping@^0.3.12": version "0.3.13" - resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz#6342a19f44347518c93e43b1ac69deb3c4656a1f" + resolved "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz" integrity sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA== dependencies: "@jridgewell/sourcemap-codec" "^1.5.0" @@ -466,17 +341,17 @@ "@jridgewell/resolve-uri@^3.1.0": version "3.1.2" - resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz#7a0ee601f60f99a20c7c7c5ff0c80388c1189bd6" + resolved "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz" integrity sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw== "@jridgewell/sourcemap-codec@^1.4.14", "@jridgewell/sourcemap-codec@^1.5.0": version "1.5.5" - resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz#6912b00d2c631c0d15ce1a7ab57cd657f2a8f8ba" + resolved "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz" integrity sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og== "@jridgewell/trace-mapping@^0.3.24", "@jridgewell/trace-mapping@^0.3.28": version "0.3.31" - resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz#db15d6781c931f3a251a3dac39501c98a6082fd0" + resolved "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz" integrity sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw== dependencies: "@jridgewell/resolve-uri" "^3.1.0" @@ -484,19 +359,19 @@ "@nodeutils/defaults-deep@1.1.0": version "1.1.0" - resolved "https://registry.yarnpkg.com/@nodeutils/defaults-deep/-/defaults-deep-1.1.0.tgz#bb1124dc8d7ce0bc5da1d668ace58149258ef20b" + resolved "https://registry.npmjs.org/@nodeutils/defaults-deep/-/defaults-deep-1.1.0.tgz" integrity sha512-gG44cwQovaOFdSR02jR9IhVRpnDP64VN6JdjYJTfNz4J4fWn7TQnmrf22nSjRqlwlxPcW8PL/L3KbJg3tdwvpg== dependencies: lodash "^4.15.0" "@octokit/auth-token@^6.0.0": version "6.0.0" - resolved "https://registry.yarnpkg.com/@octokit/auth-token/-/auth-token-6.0.0.tgz#b02e9c08a2d8937df09a2a981f226ad219174c53" + resolved "https://registry.npmjs.org/@octokit/auth-token/-/auth-token-6.0.0.tgz" integrity sha512-P4YJBPdPSpWTQ1NU4XYdvHvXJJDxM6YwpS0FZHRgP7YFkdVxsWcpWGy/NVqlAA7PcPCnMacXlRm1y2PFZRWL/w== "@octokit/core@^7.0.6": version "7.0.6" - resolved "https://registry.yarnpkg.com/@octokit/core/-/core-7.0.6.tgz#0d58704391c6b681dec1117240ea4d2a98ac3916" + resolved "https://registry.npmjs.org/@octokit/core/-/core-7.0.6.tgz" integrity sha512-DhGl4xMVFGVIyMwswXeyzdL4uXD5OGILGX5N8Y+f6W7LhC1Ze2poSNrkF/fedpVDHEEZ+PHFW0vL14I+mm8K3Q== dependencies: "@octokit/auth-token" "^6.0.0" @@ -507,79 +382,69 @@ before-after-hook "^4.0.0" universal-user-agent "^7.0.0" -"@octokit/endpoint@^9.0.6": - version "9.0.6" - resolved "https://registry.yarnpkg.com/@octokit/endpoint/-/endpoint-9.0.6.tgz#114d912108fe692d8b139cfe7fc0846dfd11b6c0" - integrity sha512-H1fNTMA57HbkFESSt3Y9+FBICv+0jFceJFPWDePYlR/iMGrwM5ph+Dd4XRQs+8X+PUFURLQgX9ChPfhJ/1uNQw== +"@octokit/endpoint@^11.0.3": + version "11.0.3" + resolved "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-11.0.3.tgz" + integrity sha512-FWFlNxghg4HrXkD3ifYbS/IdL/mDHjh9QcsNyhQjN8dplUoZbejsdpmuqdA76nxj2xoWPs7p8uX2SNr9rYu0Ag== dependencies: - "@octokit/types" "^13.1.0" - universal-user-agent "^6.0.0" + "@octokit/types" "^16.0.0" + universal-user-agent "^7.0.2" "@octokit/graphql@^9.0.3": version "9.0.3" - resolved "https://registry.yarnpkg.com/@octokit/graphql/-/graphql-9.0.3.tgz#5b8341c225909e924b466705c13477face869456" + resolved "https://registry.npmjs.org/@octokit/graphql/-/graphql-9.0.3.tgz" integrity sha512-grAEuupr/C1rALFnXTv6ZQhFuL1D8G5y8CN04RgrO4FIPMrtm+mcZzFG7dcBm+nq+1ppNixu+Jd78aeJOYxlGA== dependencies: "@octokit/request" "^10.0.6" "@octokit/types" "^16.0.0" universal-user-agent "^7.0.0" -"@octokit/openapi-types@^20.0.0": - version "20.0.0" - resolved "https://registry.yarnpkg.com/@octokit/openapi-types/-/openapi-types-20.0.0.tgz#9ec2daa0090eeb865ee147636e0c00f73790c6e5" - integrity sha512-EtqRBEjp1dL/15V7WiX5LJMIxxkdiGJnabzYx5Apx4FkQIFgAfKumXeYAqqJCj1s+BMX4cPFIFC4OLCR6stlnA== - -"@octokit/openapi-types@^24.2.0": - version "24.2.0" - resolved "https://registry.yarnpkg.com/@octokit/openapi-types/-/openapi-types-24.2.0.tgz#3d55c32eac0d38da1a7083a9c3b0cca77924f7d3" - integrity sha512-9sIH3nSUttelJSXUrmGzl7QUBFul0/mB8HRYl3fOlgHbIWG+WnYDXU3v/2zMtAvuzZ/ed00Ei6on975FhBfzrg== - "@octokit/openapi-types@^27.0.0": version "27.0.0" - resolved "https://registry.yarnpkg.com/@octokit/openapi-types/-/openapi-types-27.0.0.tgz#374ea53781965fd02a9d36cacb97e152cefff12d" + resolved "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-27.0.0.tgz" integrity sha512-whrdktVs1h6gtR+09+QsNk2+FO+49j6ga1c55YZudfEG+oKJVvJLQi3zkOm5JjiUXAagWK2tI2kTGKJ2Ys7MGA== -"@octokit/plugin-paginate-rest@^14.0.0", "@octokit/plugin-paginate-rest@^9.2.2": - version "9.2.2" - resolved "https://registry.yarnpkg.com/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-9.2.2.tgz#c516bc498736bcdaa9095b9a1d10d9d0501ae831" - integrity sha512-u3KYkGF7GcZnSD/3UP0S7K5XUFT2FkOQdcfXZGZQPGv3lm4F2Xbf71lvjldr8c1H3nNbF+33cLEkWYbokGWqiQ== +"@octokit/plugin-paginate-rest@^14.0.0": + version "14.0.0" + resolved "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-14.0.0.tgz" + integrity sha512-fNVRE7ufJiAA3XUrha2omTA39M6IXIc6GIZLvlbsm8QOQCYvpq/LkMNGyFlB1d8hTDzsAXa3OKtybdMAYsV/fw== dependencies: - "@octokit/types" "^12.6.0" + "@octokit/types" "^16.0.0" "@octokit/plugin-request-log@^6.0.0": version "6.0.0" - resolved "https://registry.yarnpkg.com/@octokit/plugin-request-log/-/plugin-request-log-6.0.0.tgz#de1c1e557df6c08adb631bf78264fa741e01b317" + resolved "https://registry.npmjs.org/@octokit/plugin-request-log/-/plugin-request-log-6.0.0.tgz" integrity sha512-UkOzeEN3W91/eBq9sPZNQ7sUBvYCqYbrrD8gTbBuGtHEuycE4/awMXcYvx6sVYo7LypPhmQwwpUe4Yyu4QZN5Q== "@octokit/plugin-rest-endpoint-methods@^17.0.0": version "17.0.0" - resolved "https://registry.yarnpkg.com/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-17.0.0.tgz#8c54397d3a4060356a1c8a974191ebf945924105" + resolved "https://registry.npmjs.org/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-17.0.0.tgz" integrity sha512-B5yCyIlOJFPqUUeiD0cnBJwWJO8lkJs5d8+ze9QDP6SvfiXSz1BF+91+0MeI1d2yxgOhU/O+CvtiZ9jSkHhFAw== dependencies: "@octokit/types" "^16.0.0" -"@octokit/request-error@^5.1.1", "@octokit/request-error@^7.0.2": - version "5.1.1" - resolved "https://registry.yarnpkg.com/@octokit/request-error/-/request-error-5.1.1.tgz#b9218f9c1166e68bb4d0c89b638edc62c9334805" - integrity sha512-v9iyEQJH6ZntoENr9/yXxjuezh4My67CBSu9r6Ve/05Iu5gNgnisNWOsoJHTP6k0Rr0+HQIpnH+kyammu90q/g== +"@octokit/request-error@^7.0.2": + version "7.1.0" + resolved "https://registry.npmjs.org/@octokit/request-error/-/request-error-7.1.0.tgz" + integrity sha512-KMQIfq5sOPpkQYajXHwnhjCC0slzCNScLHs9JafXc4RAJI+9f+jNDlBNaIMTvazOPLgb4BnlhGJOTbnN0wIjPw== dependencies: - "@octokit/types" "^13.1.0" - deprecation "^2.0.0" - once "^1.4.0" + "@octokit/types" "^16.0.0" -"@octokit/request@^10.0.6", "@octokit/request@^8.4.1": - version "8.4.1" - resolved "https://registry.yarnpkg.com/@octokit/request/-/request-8.4.1.tgz#715a015ccf993087977ea4365c44791fc4572486" - integrity sha512-qnB2+SY3hkCmBxZsR/MPCybNmbJe4KAlfWErXq+rBKkQJlbjdJeS85VI9r8UqeLYLvnAenU8Q1okM/0MBsAGXw== +"@octokit/request@^10.0.6": + version "10.0.8" + resolved "https://registry.npmjs.org/@octokit/request/-/request-10.0.8.tgz" + integrity sha512-SJZNwY9pur9Agf7l87ywFi14W+Hd9Jg6Ifivsd33+/bGUQIjNujdFiXII2/qSlN2ybqUHfp5xpekMEjIBTjlSw== dependencies: - "@octokit/endpoint" "^9.0.6" - "@octokit/request-error" "^5.1.1" - "@octokit/types" "^13.1.0" - universal-user-agent "^6.0.0" + "@octokit/endpoint" "^11.0.3" + "@octokit/request-error" "^7.0.2" + "@octokit/types" "^16.0.0" + fast-content-type-parse "^3.0.0" + json-with-bigint "^3.5.3" + universal-user-agent "^7.0.2" "@octokit/rest@22.0.1": version "22.0.1" - resolved "https://registry.yarnpkg.com/@octokit/rest/-/rest-22.0.1.tgz#4d866c32b76b711d3f736f91992e2b534163b416" + resolved "https://registry.npmjs.org/@octokit/rest/-/rest-22.0.1.tgz" integrity sha512-Jzbhzl3CEexhnivb1iQ0KJ7s5vvjMWcmRtq5aUsKmKDrRW6z3r84ngmiFKFvpZjpiU/9/S6ITPFRpn5s/3uQJw== dependencies: "@octokit/core" "^7.0.6" @@ -587,40 +452,26 @@ "@octokit/plugin-request-log" "^6.0.0" "@octokit/plugin-rest-endpoint-methods" "^17.0.0" -"@octokit/types@^12.6.0": - version "12.6.0" - resolved "https://registry.yarnpkg.com/@octokit/types/-/types-12.6.0.tgz#8100fb9eeedfe083aae66473bd97b15b62aedcb2" - integrity sha512-1rhSOfRa6H9w4YwK0yrf5faDaDTb+yLyBUKOCV4xtCDB5VmIPqd/v9yr9o6SAzOAlRxMiRiCic6JVM1/kunVkw== - dependencies: - "@octokit/openapi-types" "^20.0.0" - -"@octokit/types@^13.1.0": - version "13.10.0" - resolved "https://registry.yarnpkg.com/@octokit/types/-/types-13.10.0.tgz#3e7c6b19c0236c270656e4ea666148c2b51fd1a3" - integrity sha512-ifLaO34EbbPj0Xgro4G5lP5asESjwHracYJvVaPIyXMuiuXLlhic3S47cBdTb+jfODkTE5YtGCLt3Ay3+J97sA== - dependencies: - "@octokit/openapi-types" "^24.2.0" - "@octokit/types@^16.0.0": version "16.0.0" - resolved "https://registry.yarnpkg.com/@octokit/types/-/types-16.0.0.tgz#fbd7fa590c2ef22af881b1d79758bfaa234dbb7c" + resolved "https://registry.npmjs.org/@octokit/types/-/types-16.0.0.tgz" integrity sha512-sKq+9r1Mm4efXW1FCk7hFSeJo4QKreL/tTbR0rz/qx/r1Oa2VV83LTA/H/MuCOX7uCIJmQVRKBcbmWoySjAnSg== dependencies: "@octokit/openapi-types" "^27.0.0" "@phun-ky/typeof@2.0.3": version "2.0.3" - resolved "https://registry.yarnpkg.com/@phun-ky/typeof/-/typeof-2.0.3.tgz#581f617862e6fd9245e992440e46a88dbc228005" + resolved "https://registry.npmjs.org/@phun-ky/typeof/-/typeof-2.0.3.tgz" integrity sha512-oeQJs1aa8Ghke8JIK9yuq/+KjMiaYeDZ38jx7MhkXncXlUKjqQ3wEm2X3qCKyjo+ZZofZj+WsEEiqkTtRuE2xQ== "@platformatic/vfs@^0.3.0": version "0.3.0" - resolved "https://registry.yarnpkg.com/@platformatic/vfs/-/vfs-0.3.0.tgz#d3664af6b2ad3add1661ce7aa9be2a970bb22d19" + resolved "https://registry.npmjs.org/@platformatic/vfs/-/vfs-0.3.0.tgz" integrity sha512-BGXVOAz59HYPZCgI9v/MtiTF/ng8YAWtkooxVwOPR3TatNgGy0WZ/t15ScqytiZi5NdSRqWNRfuAbXKeAlKDdQ== "@release-it/conventional-changelog@^10.0.5": version "10.0.5" - resolved "https://registry.yarnpkg.com/@release-it/conventional-changelog/-/conventional-changelog-10.0.5.tgz#20081534fc8033027960c69f8e9d153c31fa9ec3" + resolved "https://registry.npmjs.org/@release-it/conventional-changelog/-/conventional-changelog-10.0.5.tgz" integrity sha512-Dxul3YlUsDLbIg+aR6T0QR/VyKwuJNR3GZM8mKVEwFO8GpH2H5vgnN7kacEvq/Qk5puDadOVbhbUq/KBjraemQ== dependencies: "@conventional-changelog/git-client" "^2.5.1" @@ -633,12 +484,12 @@ "@rtsao/scc@^1.1.0": version "1.1.0" - resolved "https://registry.yarnpkg.com/@rtsao/scc/-/scc-1.1.0.tgz#927dd2fae9bc3361403ac2c7a00c32ddce9ad7e8" + resolved "https://registry.npmjs.org/@rtsao/scc/-/scc-1.1.0.tgz" integrity sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g== "@simple-libs/child-process-utils@^1.0.0": version "1.0.1" - resolved "https://registry.yarnpkg.com/@simple-libs/child-process-utils/-/child-process-utils-1.0.1.tgz#75062207018fff34727364c5a77ee7d4289874ad" + resolved "https://registry.npmjs.org/@simple-libs/child-process-utils/-/child-process-utils-1.0.1.tgz" integrity sha512-3nWd8irxvDI6v856wpPCHZ+08iQR0oHTZfzAZmnbsLzf+Sf1odraP6uKOHDZToXq3RPRV/LbqGVlSCogm9cJjg== dependencies: "@simple-libs/stream-utils" "^1.1.0" @@ -646,110 +497,103 @@ "@simple-libs/stream-utils@^1.1.0": version "1.1.0" - resolved "https://registry.yarnpkg.com/@simple-libs/stream-utils/-/stream-utils-1.1.0.tgz#646d414701d15fdb0636561a744ff978e985dda5" + resolved "https://registry.npmjs.org/@simple-libs/stream-utils/-/stream-utils-1.1.0.tgz" integrity sha512-6rsHTjodIn/t90lv5snQjRPVtOosM7Vp0AKdrObymq45ojlgVwnpAqdc+0OBBrpEiy31zZ6/TKeIVqV1HwvnuQ== dependencies: "@types/node" "^22.0.0" "@tootallnate/quickjs-emscripten@^0.23.0": version "0.23.0" - resolved "https://registry.yarnpkg.com/@tootallnate/quickjs-emscripten/-/quickjs-emscripten-0.23.0.tgz#db4ecfd499a9765ab24002c3b696d02e6d32a12c" + resolved "https://registry.npmjs.org/@tootallnate/quickjs-emscripten/-/quickjs-emscripten-0.23.0.tgz" integrity sha512-C5Mc6rdnsaJDjO3UpGW/CQTHtCKaYlScZTly4JIu97Jxo/odCiH0ITnDXSJPTOrEKk/ycSZ0AOgTmkDtkOsvIA== "@types/babel__generator@^7.6.5": version "7.27.0" - resolved "https://registry.yarnpkg.com/@types/babel__generator/-/babel__generator-7.27.0.tgz#b5819294c51179957afaec341442f9341e4108a9" + resolved "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.27.0.tgz" integrity sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg== dependencies: "@babel/types" "^7.0.0" "@types/babel__traverse@^7.20.3": version "7.28.0" - resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.28.0.tgz#07d713d6cce0d265c9849db0cbe62d3f61f36f74" + resolved "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.28.0.tgz" integrity sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q== dependencies: "@babel/types" "^7.28.2" "@types/estree@^1.0.6": version "1.0.8" - resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.8.tgz#958b91c991b1867ced318bedea0e215ee050726e" + resolved "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz" integrity sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w== "@types/json-schema@^7.0.15": version "7.0.15" - resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.15.tgz#596a1747233694d50f6ad8a7869fcb6f56cf5841" + resolved "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz" integrity sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA== "@types/json5@^0.0.29": version "0.0.29" - resolved "https://registry.yarnpkg.com/@types/json5/-/json5-0.0.29.tgz#ee28707ae94e11d2b827bcbe5270bcea7f3e71ee" + resolved "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz" integrity sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ== "@types/minimist@^1.2.2": version "1.2.5" - resolved "https://registry.yarnpkg.com/@types/minimist/-/minimist-1.2.5.tgz#ec10755e871497bcd83efe927e43ec46e8c0747e" + resolved "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.5.tgz" integrity sha512-hov8bUuiLiyFPGyFPE1lwWhmzYbirOXQNNo40+y3zow8aFVTeyn3VWL0VFFfdNddA8S4Vf0Tc062rzyNr7Paag== "@types/multistream@^4.1.0": version "4.1.3" - resolved "https://registry.yarnpkg.com/@types/multistream/-/multistream-4.1.3.tgz#972e3666502128dc273ef15c86b2e533e373ece4" + resolved "https://registry.npmjs.org/@types/multistream/-/multistream-4.1.3.tgz" integrity sha512-t57vmDEJOZuC0M3IrZYfCd9wolTcr3ZTCGk1iwHNosvgBX+7/SMvCGcR8wP9lidpelBZQ12crSuINOxkk0azPA== dependencies: "@types/node" "*" "@types/node@*": version "25.2.3" - resolved "https://registry.yarnpkg.com/@types/node/-/node-25.2.3.tgz#9c18245be768bdb4ce631566c7da303a5c99a7f8" + resolved "https://registry.npmjs.org/@types/node/-/node-25.2.3.tgz" integrity sha512-m0jEgYlYz+mDJZ2+F4v8D1AyQb+QzsNqRuI7xg1VQX/KlKS0qT9r1Mo16yo5F/MtifXFgaofIFsdFMox2SxIbQ== dependencies: undici-types "~7.16.0" -"@types/node@^20.0.0": - version "20.19.33" - resolved "https://registry.yarnpkg.com/@types/node/-/node-20.19.33.tgz#ac8364c623b72d43125f0e7dd722bbe968f0c65e" - integrity sha512-Rs1bVAIdBs5gbTIKza/tgpMuG1k3U/UMJLWecIMxNdJFDMzcM5LOiLVRYh3PilWEYDIeUDv7bpiHPLPsbydGcw== - dependencies: - undici-types "~6.21.0" - "@types/node@^22.0.0": - version "22.19.11" - resolved "https://registry.yarnpkg.com/@types/node/-/node-22.19.11.tgz#7e1feaad24e4e36c52fa5558d5864bb4b272603e" - integrity sha512-BH7YwL6rA93ReqeQS1c4bsPpcfOmJasG+Fkr6Y59q83f9M1WcBRHR2vM+P9eOisYRcN3ujQoiZY8uk5W+1WL8w== + version "22.19.17" + resolved "https://registry.npmjs.org/@types/node/-/node-22.19.17.tgz" + integrity sha512-wGdMcf+vPYM6jikpS/qhg6WiqSV/OhG+jeeHT/KlVqxYfD40iYJf9/AE1uQxVWFvU7MipKRkRv8NSHiCGgPr8Q== dependencies: undici-types "~6.21.0" "@types/normalize-package-data@^2.4.4": version "2.4.4" - resolved "https://registry.yarnpkg.com/@types/normalize-package-data/-/normalize-package-data-2.4.4.tgz#56e2cc26c397c038fab0e3a917a12d5c5909e901" + resolved "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.4.tgz" integrity sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA== "@types/parse-path@^7.0.0": version "7.1.0" - resolved "https://registry.yarnpkg.com/@types/parse-path/-/parse-path-7.1.0.tgz#1bdddfe4fb2038e76c7e622234a97d6a050a1be3" + resolved "https://registry.npmjs.org/@types/parse-path/-/parse-path-7.1.0.tgz" integrity sha512-EULJ8LApcVEPbrfND0cRQqutIOdiIgJ1Mgrhpy755r14xMohPTEpkV/k28SJvuOs9bHRFW8x+KeDAEPiGQPB9Q== dependencies: parse-path "*" "@types/picomatch@^3.0.1": version "3.0.2" - resolved "https://registry.yarnpkg.com/@types/picomatch/-/picomatch-3.0.2.tgz#27edebec66726b2aabdca71338d129ffe9fffcf9" + resolved "https://registry.npmjs.org/@types/picomatch/-/picomatch-3.0.2.tgz" integrity sha512-n0i8TD3UDB7paoMMxA3Y65vUncFJXjcUf7lQY7YyKGl6031FNjfsLs6pdLFCy2GNFxItPJG8GvvpbZc2skH7WA== "@types/resolve@^1.20.2": version "1.20.6" - resolved "https://registry.yarnpkg.com/@types/resolve/-/resolve-1.20.6.tgz#e6e60dad29c2c8c206c026e6dd8d6d1bdda850b8" + resolved "https://registry.npmjs.org/@types/resolve/-/resolve-1.20.6.tgz" integrity sha512-A4STmOXPhMUtHH+S6ymgE2GiBSMqf4oTvcQZMcHzokuTLVYzXTB8ttjcgxOVaAp2lGwEdzZ0J+cRbbeevQj1UQ== "@types/stream-meter@^0.0.22": version "0.0.22" - resolved "https://registry.yarnpkg.com/@types/stream-meter/-/stream-meter-0.0.22.tgz#6602f644ea0f5468cae13931ee6611a3a03fbab1" + resolved "https://registry.npmjs.org/@types/stream-meter/-/stream-meter-0.0.22.tgz" integrity sha512-gqqudd3q69aEmixGIL1p2qN1AySZ+UJ2j6y70ZXZBg8/SmzTM1MvkOKvmuelKNIpPS8bKml6Gw03pfbnI8YpwQ== dependencies: "@types/node" "*" "@types/tar@^6.1.13": version "6.1.13" - resolved "https://registry.yarnpkg.com/@types/tar/-/tar-6.1.13.tgz#9b5801c02175344101b4b91086ab2bbc8e93a9b6" + resolved "https://registry.npmjs.org/@types/tar/-/tar-6.1.13.tgz" integrity sha512-IznnlmU5f4WcGTh2ltRu/Ijpmk8wiWXfF0VA4s+HPjHZgvFggk1YaIkbo5krX/zUCzWF8N/l4+W/LNxnvAJ8nw== dependencies: "@types/node" "*" @@ -757,14 +601,14 @@ "@types/unzipper@^0.10.10": version "0.10.11" - resolved "https://registry.yarnpkg.com/@types/unzipper/-/unzipper-0.10.11.tgz#2a605ae639fc20ee6886be0f7d28dc61c1e6d3d3" + resolved "https://registry.npmjs.org/@types/unzipper/-/unzipper-0.10.11.tgz" integrity sha512-D25im2zjyMCcgL9ag6N46+wbtJBnXIr7SI4zHf9eJD2Dw2tEB5e+p5MYkrxKIVRscs5QV0EhtU9rgXSPx90oJg== dependencies: "@types/node" "*" "@typescript-eslint/eslint-plugin@^8.0.0": version "8.55.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.55.0.tgz#086d2ef661507b561f7b17f62d3179d692a0765f" + resolved "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.55.0.tgz" integrity sha512-1y/MVSz0NglV1ijHC8OT49mPJ4qhPYjiK08YUQVbIOyu+5k862LKUHFkpKHWu//zmr7hDR2rhwUm6gnCGNmGBQ== dependencies: "@eslint-community/regexpp" "^4.12.2" @@ -778,7 +622,7 @@ "@typescript-eslint/parser@^8.0.0": version "8.55.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-8.55.0.tgz#6eace4e9e95f178d3447ed1f17f3d6a5dfdb345c" + resolved "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.55.0.tgz" integrity sha512-4z2nCSBfVIMnbuu8uinj+f0o4qOeggYJLbjpPHka3KH1om7e+H9yLKTYgksTaHcGco+NClhhY2vyO3HsMH1RGw== dependencies: "@typescript-eslint/scope-manager" "8.55.0" @@ -789,7 +633,7 @@ "@typescript-eslint/project-service@8.55.0": version "8.55.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/project-service/-/project-service-8.55.0.tgz#b8a71c06a625bdad481c24d5614b68e252f3ae9b" + resolved "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.55.0.tgz" integrity sha512-zRcVVPFUYWa3kNnjaZGXSu3xkKV1zXy8M4nO/pElzQhFweb7PPtluDLQtKArEOGmjXoRjnUZ29NjOiF0eCDkcQ== dependencies: "@typescript-eslint/tsconfig-utils" "^8.55.0" @@ -798,20 +642,20 @@ "@typescript-eslint/scope-manager@8.55.0": version "8.55.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-8.55.0.tgz#8a0752c31c788651840dc98f840b0c2ebe143b8c" + resolved "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.55.0.tgz" integrity sha512-fVu5Omrd3jeqeQLiB9f1YsuK/iHFOwb04bCtY4BSCLgjNbOD33ZdV6KyEqplHr+IlpgT0QTZ/iJ+wT7hvTx49Q== dependencies: "@typescript-eslint/types" "8.55.0" "@typescript-eslint/visitor-keys" "8.55.0" -"@typescript-eslint/tsconfig-utils@8.55.0", "@typescript-eslint/tsconfig-utils@^8.55.0": +"@typescript-eslint/tsconfig-utils@^8.55.0", "@typescript-eslint/tsconfig-utils@8.55.0": version "8.55.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.55.0.tgz#62f1d005419985e09d37a040b2f1450e4e805afa" + resolved "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.55.0.tgz" integrity sha512-1R9cXqY7RQd7WuqSN47PK9EDpgFUK3VqdmbYrvWJZYDd0cavROGn+74ktWBlmJ13NXUQKlZ/iAEQHI/V0kKe0Q== "@typescript-eslint/type-utils@8.55.0": version "8.55.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-8.55.0.tgz#195d854b3e56308ce475fdea2165313bb1190200" + resolved "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.55.0.tgz" integrity sha512-x1iH2unH4qAt6I37I2CGlsNs+B9WGxurP2uyZLRz6UJoZWDBx9cJL1xVN/FiOmHEONEg6RIufdvyT0TEYIgC5g== dependencies: "@typescript-eslint/types" "8.55.0" @@ -820,14 +664,14 @@ debug "^4.4.3" ts-api-utils "^2.4.0" -"@typescript-eslint/types@8.55.0", "@typescript-eslint/types@^8.55.0": +"@typescript-eslint/types@^8.55.0", "@typescript-eslint/types@8.55.0": version "8.55.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-8.55.0.tgz#8449c5a7adac61184cac92dbf6315733569708c2" + resolved "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.55.0.tgz" integrity sha512-ujT0Je8GI5BJWi+/mMoR0wxwVEQaxM+pi30xuMiJETlX80OPovb2p9E8ss87gnSVtYXtJoU9U1Cowcr6w2FE0w== "@typescript-eslint/typescript-estree@8.55.0": version "8.55.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-8.55.0.tgz#c83ac92c11ce79bedd984937c7780a65e7f7b2e3" + resolved "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.55.0.tgz" integrity sha512-EwrH67bSWdx/3aRQhCoxDaHM+CrZjotc2UCCpEDVqfCE+7OjKAGWNY2HsCSTEVvWH2clYQK8pdeLp42EVs+xQw== dependencies: "@typescript-eslint/project-service" "8.55.0" @@ -842,7 +686,7 @@ "@typescript-eslint/utils@8.55.0": version "8.55.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-8.55.0.tgz#c1744d94a3901deb01f58b09d3478d811f96d619" + resolved "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.55.0.tgz" integrity sha512-BqZEsnPGdYpgyEIkDC1BadNY8oMwckftxBT+C8W0g1iKPdeqKZBtTfnvcq0nf60u7MkjFO8RBvpRGZBPw4L2ow== dependencies: "@eslint-community/eslint-utils" "^4.9.1" @@ -852,7 +696,7 @@ "@typescript-eslint/visitor-keys@8.55.0": version "8.55.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-8.55.0.tgz#3d9a40fd4e3705c63d8fae3af58988add3ed464d" + resolved "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.55.0.tgz" integrity sha512-AxNRwEie8Nn4eFS1FzDMJWIISMGoXMb037sgCBJ3UR6o0fQTzr2tqN9WT+DkWJPhIdQCfV7T6D387566VtnCJA== dependencies: "@typescript-eslint/types" "8.55.0" @@ -860,7 +704,7 @@ "@yao-pkg/pkg-fetch@3.5.33": version "3.5.33" - resolved "https://registry.yarnpkg.com/@yao-pkg/pkg-fetch/-/pkg-fetch-3.5.33.tgz#4d2adb0299c361f369c5dfc098f655a72fefd2a1" + resolved "https://registry.npmjs.org/@yao-pkg/pkg-fetch/-/pkg-fetch-3.5.33.tgz" integrity sha512-j2UoH+eP4VobfovQg1gkWwDoB4O/tv8rlLnEjUEEHuWXJ5eBLNUIrobMSEp773/2pgUJUfqqPUFIhS1pN8OZuQ== dependencies: https-proxy-agent "^5.0.0" @@ -873,29 +717,29 @@ acorn-jsx@^5.3.2: version "5.3.2" - resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" + resolved "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz" integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== acorn@^8.15.0: version "8.15.0" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.15.0.tgz#a360898bc415edaac46c8241f6383975b930b816" + resolved "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz" integrity sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg== +agent-base@^7.1.0, agent-base@^7.1.2: + version "7.1.4" + resolved "https://registry.npmjs.org/agent-base/-/agent-base-7.1.4.tgz" + integrity sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ== + agent-base@6: version "6.0.2" - resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-6.0.2.tgz#49fff58577cfee3f37176feab4c22e00f86d7f77" + resolved "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz" integrity sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ== dependencies: debug "4" -agent-base@^7.1.0, agent-base@^7.1.2: - version "7.1.4" - resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-7.1.4.tgz#e3cd76d4c548ee895d3c3fd8dc1f6c5b9032e7a8" - integrity sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ== - ajv@^6.12.4: version "6.12.6" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" + resolved "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz" integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== dependencies: fast-deep-equal "^3.1.1" @@ -905,41 +749,46 @@ ajv@^6.12.4: ansi-escapes@^7.0.0: version "7.3.0" - resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-7.3.0.tgz#5395bb74b2150a4a1d6e3c2565f4aeca78d28627" + resolved "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-7.3.0.tgz" integrity sha512-BvU8nYgGQBxcmMuEeUEmNTvrMVjJNSH7RgW24vXexN4Ven6qCvy4TntnvlnwnMLTVlcRQQdbRY8NKnaIoeWDNg== dependencies: environment "^1.0.0" ansi-regex@^5.0.1: version "5.0.1" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" + resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz" integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== ansi-regex@^6.0.1: version "6.2.2" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-6.2.2.tgz#60216eea464d864597ce2832000738a0589650c1" + resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz" integrity sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg== ansi-styles@^4.0.0, ansi-styles@^4.1.0: version "4.3.0" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" + 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.0.0, ansi-styles@^6.2.1: +ansi-styles@^6.0.0: + version "6.2.3" + resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz" + integrity sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg== + +ansi-styles@^6.2.1: version "6.2.3" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-6.2.3.tgz#c044d5dcc521a076413472597a1acb1f103c4041" + resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz" integrity sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg== argparse@^2.0.1: version "2.0.1" - resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" + resolved "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz" integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== array-buffer-byte-length@^1.0.1, array-buffer-byte-length@^1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/array-buffer-byte-length/-/array-buffer-byte-length-1.0.2.tgz#384d12a37295aec3769ab022ad323a18a51ccf8b" + resolved "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.2.tgz" integrity sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw== dependencies: call-bound "^1.0.3" @@ -947,12 +796,12 @@ array-buffer-byte-length@^1.0.1, array-buffer-byte-length@^1.0.2: array-ify@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/array-ify/-/array-ify-1.0.0.tgz#9e528762b4a9066ad163a6962a364418e9626ece" + resolved "https://registry.npmjs.org/array-ify/-/array-ify-1.0.0.tgz" integrity sha512-c5AMf34bKdvPhQ7tBGhqkgKNUzMr4WUs+WDtC2ZUGOUncbxKMTvqxYctiseW3+L4bA8ec+GcZ6/A/FW4m8ukng== array-includes@^3.1.9: version "3.1.9" - resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.9.tgz#1f0ccaa08e90cdbc3eb433210f903ad0f17c3f3a" + resolved "https://registry.npmjs.org/array-includes/-/array-includes-3.1.9.tgz" integrity sha512-FmeCCAenzH0KH381SPT5FZmiA/TmpndpcaShhfgEN9eCVjnFBqq3l1xrI42y8+PPLI6hypzou4GXw00WHmPBLQ== dependencies: call-bind "^1.0.8" @@ -966,7 +815,7 @@ array-includes@^3.1.9: array.prototype.findlastindex@^1.2.6: version "1.2.6" - resolved "https://registry.yarnpkg.com/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.6.tgz#cfa1065c81dcb64e34557c9b81d012f6a421c564" + resolved "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.6.tgz" integrity sha512-F/TKATkzseUExPlfvmwQKGITM3DGTK+vkAsCZoDc5daVygbJBnjEUCbgkAvVFsgfXfX4YIqZ/27G3k3tdXrTxQ== dependencies: call-bind "^1.0.8" @@ -979,7 +828,7 @@ array.prototype.findlastindex@^1.2.6: array.prototype.flat@^1.3.3: version "1.3.3" - resolved "https://registry.yarnpkg.com/array.prototype.flat/-/array.prototype.flat-1.3.3.tgz#534aaf9e6e8dd79fb6b9a9917f839ef1ec63afe5" + resolved "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.3.tgz" integrity sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg== dependencies: call-bind "^1.0.8" @@ -989,7 +838,7 @@ array.prototype.flat@^1.3.3: array.prototype.flatmap@^1.3.3: version "1.3.3" - resolved "https://registry.yarnpkg.com/array.prototype.flatmap/-/array.prototype.flatmap-1.3.3.tgz#712cc792ae70370ae40586264629e33aab5dd38b" + resolved "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.3.tgz" integrity sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg== dependencies: call-bind "^1.0.8" @@ -999,7 +848,7 @@ array.prototype.flatmap@^1.3.3: arraybuffer.prototype.slice@^1.0.4: version "1.0.4" - resolved "https://registry.yarnpkg.com/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.4.tgz#9d760d84dbdd06d0cbf92c8849615a1a7ab3183c" + resolved "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.4.tgz" integrity sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ== dependencies: array-buffer-byte-length "^1.0.1" @@ -1012,48 +861,53 @@ arraybuffer.prototype.slice@^1.0.4: ast-types@^0.13.4: version "0.13.4" - resolved "https://registry.yarnpkg.com/ast-types/-/ast-types-0.13.4.tgz#ee0d77b343263965ecc3fb62da16e7222b2b6782" + resolved "https://registry.npmjs.org/ast-types/-/ast-types-0.13.4.tgz" integrity sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w== dependencies: tslib "^2.0.1" async-function@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/async-function/-/async-function-1.0.0.tgz#509c9fca60eaf85034c6829838188e4e4c8ffb2b" + resolved "https://registry.npmjs.org/async-function/-/async-function-1.0.0.tgz" integrity sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA== async-retry@1.3.3: version "1.3.3" - resolved "https://registry.yarnpkg.com/async-retry/-/async-retry-1.3.3.tgz#0e7f36c04d8478e7a58bdbed80cedf977785f280" + resolved "https://registry.npmjs.org/async-retry/-/async-retry-1.3.3.tgz" integrity sha512-wfr/jstw9xNi/0teMHrRW7dsz3Lt5ARhYNZ2ewpadnhaIp5mbALhOAP+EAdsC7t4Z6wqsDVv9+W6gm1Dk9mEyw== dependencies: retry "0.13.1" available-typed-arrays@^1.0.7: version "1.0.7" - resolved "https://registry.yarnpkg.com/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz#a5cc375d6a03c2efc87a553f3e0b1522def14846" + resolved "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz" integrity sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ== dependencies: possible-typed-array-names "^1.0.0" b4a@^1.6.4: version "1.7.3" - resolved "https://registry.yarnpkg.com/b4a/-/b4a-1.7.3.tgz#24cf7ccda28f5465b66aec2bac69e32809bf112f" + resolved "https://registry.npmjs.org/b4a/-/b4a-1.7.3.tgz" integrity sha512-5Q2mfq2WfGuFp3uS//0s6baOJLMoVduPYVeNmDYxu5OUA1/cBfvr2RIS7vi62LdNj/urk1hfmj867I3qt6uZ7Q== balanced-match@^1.0.0: version "1.0.2" - resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" + resolved "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz" integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== +balanced-match@^4.0.2: + version "4.0.4" + resolved "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz" + integrity sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA== + bare-events@^2.5.4, bare-events@^2.7.0: version "2.8.2" - resolved "https://registry.yarnpkg.com/bare-events/-/bare-events-2.8.2.tgz#7b3e10bd8e1fc80daf38bb516921678f566ab89f" + resolved "https://registry.npmjs.org/bare-events/-/bare-events-2.8.2.tgz" integrity sha512-riJjyv1/mHLIPX4RwiK+oW9/4c3TEUeORHKefKAKnZ5kyslbN+HXowtbaVEqt4IMUB7OXlfixcs6gsFeo/jhiQ== bare-fs@^4.0.1: version "4.5.3" - resolved "https://registry.yarnpkg.com/bare-fs/-/bare-fs-4.5.3.tgz#316cce9bcec66a5e49fb24ec2743f6b846a2f35c" + resolved "https://registry.npmjs.org/bare-fs/-/bare-fs-4.5.3.tgz" integrity sha512-9+kwVx8QYvt3hPWnmb19tPnh38c6Nihz8Lx3t0g9+4GoIf3/fTgYwM4Z6NxgI+B9elLQA7mLE9PpqcWtOMRDiQ== dependencies: bare-events "^2.5.4" @@ -1064,48 +918,48 @@ bare-fs@^4.0.1: bare-os@^3.0.1: version "3.6.2" - resolved "https://registry.yarnpkg.com/bare-os/-/bare-os-3.6.2.tgz#b3c4f5ad5e322c0fd0f3c29fc97d19009e2796e5" + resolved "https://registry.npmjs.org/bare-os/-/bare-os-3.6.2.tgz" integrity sha512-T+V1+1srU2qYNBmJCXZkUY5vQ0B4FSlL3QDROnKQYOqeiQR8UbjNHlPa+TIbM4cuidiN9GaTaOZgSEgsvPbh5A== bare-path@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/bare-path/-/bare-path-3.0.0.tgz#b59d18130ba52a6af9276db3e96a2e3d3ea52178" + resolved "https://registry.npmjs.org/bare-path/-/bare-path-3.0.0.tgz" integrity sha512-tyfW2cQcB5NN8Saijrhqn0Zh7AnFNsnczRcuWODH0eYAXBsJ5gVxAUuNr7tsHSC6IZ77cA0SitzT+s47kot8Mw== dependencies: bare-os "^3.0.1" bare-stream@^2.6.4: version "2.7.0" - resolved "https://registry.yarnpkg.com/bare-stream/-/bare-stream-2.7.0.tgz#5b9e7dd0a354d06e82d6460c426728536c35d789" + resolved "https://registry.npmjs.org/bare-stream/-/bare-stream-2.7.0.tgz" integrity sha512-oyXQNicV1y8nc2aKffH+BUHFRXmx6VrPzlnaEvMhram0nPBrKcEdcyBg5r08D0i8VxngHFAiVyn1QKXpSG0B8A== dependencies: streamx "^2.21.0" bare-url@^2.2.2: version "2.3.2" - resolved "https://registry.yarnpkg.com/bare-url/-/bare-url-2.3.2.tgz#4aef382efa662b2180a6fe4ca07a71b39bdf7ca3" + resolved "https://registry.npmjs.org/bare-url/-/bare-url-2.3.2.tgz" integrity sha512-ZMq4gd9ngV5aTMa5p9+UfY0b3skwhHELaDkhEHetMdX0LRkW9kzaym4oo/Eh+Ghm0CCDuMTsRIGM/ytUc1ZYmw== dependencies: bare-path "^3.0.0" base64-js@^1.3.1: version "1.5.1" - resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" + resolved "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz" integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== basic-ftp@^5.0.2: version "5.1.0" - resolved "https://registry.yarnpkg.com/basic-ftp/-/basic-ftp-5.1.0.tgz#00eb8128ce536aa697c45716c739bf38e8d890f5" + resolved "https://registry.npmjs.org/basic-ftp/-/basic-ftp-5.1.0.tgz" integrity sha512-RkaJzeJKDbaDWTIPiJwubyljaEPwpVWkm9Rt5h9Nd6h7tEXTJ3VB4qxdZBioV7JO5yLUaOKwz7vDOzlncUsegw== before-after-hook@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/before-after-hook/-/before-after-hook-4.0.0.tgz#cf1447ab9160df6a40f3621da64d6ffc36050cb9" + resolved "https://registry.npmjs.org/before-after-hook/-/before-after-hook-4.0.0.tgz" integrity sha512-q6tR3RPqIB1pMiTRMFcZwuG5T8vwp+vUvEG0vuI6B+Rikh5BfPp2fQ82c925FOs+b0lcFQ8CFrL+KbilfZFhOQ== bl@^4.0.3: version "4.1.0" - resolved "https://registry.yarnpkg.com/bl/-/bl-4.1.0.tgz#451535264182bec2fbbc83a62ab98cf11d9f7b3a" + resolved "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz" integrity sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w== dependencies: buffer "^5.5.0" @@ -1114,31 +968,46 @@ bl@^4.0.3: bluebird@~3.7.2: version "3.7.2" - resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.7.2.tgz#9f229c15be272454ffa973ace0dbee79a1b0c36f" + resolved "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz" integrity sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg== -brace-expansion@^1.1.7, brace-expansion@^2.0.1, brace-expansion@^2.0.2, brace-expansion@^5.0.2: +brace-expansion@^1.1.7: + version "1.1.13" + resolved "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.13.tgz" + integrity sha512-9ZLprWS6EENmhEOpjCYW2c8VkmOvckIJZfkr7rBW6dObmfgJ/L1GpSYW5Hpo9lDz4D1+n0Ckz8rU7FwHDQiG/w== + dependencies: + balanced-match "^1.0.0" + concat-map "0.0.1" + +brace-expansion@^2.0.1: version "2.0.2" - resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-2.0.2.tgz#54fc53237a613d854c7bd37463aad17df87214e7" + resolved "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz" integrity sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ== dependencies: balanced-match "^1.0.0" +brace-expansion@^5.0.2: + version "5.0.5" + resolved "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.5.tgz" + integrity sha512-VZznLgtwhn+Mact9tfiwx64fA9erHH/MCXEUfB/0bX/6Fz6ny5EGTXYltMocqg4xFAQZtnO3DHWWXi8RiuN7cQ== + dependencies: + balanced-match "^4.0.2" + braces@^3.0.3: version "3.0.3" - resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.3.tgz#490332f40919452272d55a8480adc0c441358789" + resolved "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz" integrity sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA== dependencies: fill-range "^7.1.1" buffer-from@^1.0.0: version "1.1.2" - resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" + resolved "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz" integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== buffer@^5.5.0: version "5.7.1" - resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0" + resolved "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz" integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ== dependencies: base64-js "^1.3.1" @@ -1146,14 +1015,14 @@ buffer@^5.5.0: bundle-name@^4.1.0: version "4.1.0" - resolved "https://registry.yarnpkg.com/bundle-name/-/bundle-name-4.1.0.tgz#f3b96b34160d6431a19d7688135af7cfb8797889" + resolved "https://registry.npmjs.org/bundle-name/-/bundle-name-4.1.0.tgz" integrity sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q== dependencies: run-applescript "^7.0.0" c12@3.3.3: version "3.3.3" - resolved "https://registry.yarnpkg.com/c12/-/c12-3.3.3.tgz#cab6604e6e6117fc9e62439a8e8144bbbe5edcd6" + resolved "https://registry.npmjs.org/c12/-/c12-3.3.3.tgz" integrity sha512-750hTRvgBy5kcMNPdh95Qo+XUBeGo8C7nsKSmedDmaQI+E0r82DwHeM6vBewDe4rGFbnxoa4V9pw+sPh5+Iz8Q== dependencies: chokidar "^5.0.0" @@ -1171,7 +1040,7 @@ c12@3.3.3: call-bind-apply-helpers@^1.0.0, call-bind-apply-helpers@^1.0.1, call-bind-apply-helpers@^1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz#4b5428c222be985d79c3d82657479dbe0b59b2d6" + resolved "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz" integrity sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ== dependencies: es-errors "^1.3.0" @@ -1179,7 +1048,7 @@ call-bind-apply-helpers@^1.0.0, call-bind-apply-helpers@^1.0.1, call-bind-apply- call-bind@^1.0.7, call-bind@^1.0.8: version "1.0.8" - resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.8.tgz#0736a9660f537e3388826f440d5ec45f744eaa4c" + resolved "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz" integrity sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww== dependencies: call-bind-apply-helpers "^1.0.0" @@ -1189,7 +1058,7 @@ call-bind@^1.0.7, call-bind@^1.0.8: call-bound@^1.0.2, call-bound@^1.0.3, call-bound@^1.0.4: version "1.0.4" - resolved "https://registry.yarnpkg.com/call-bound/-/call-bound-1.0.4.tgz#238de935d2a2a692928c538c7ccfa91067fd062a" + resolved "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz" integrity sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg== dependencies: call-bind-apply-helpers "^1.0.2" @@ -1197,12 +1066,12 @@ call-bound@^1.0.2, call-bound@^1.0.3, call-bound@^1.0.4: callsites@^3.0.0: version "3.1.0" - resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" + resolved "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz" integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== chalk@^4.0.0: version "4.1.2" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" + resolved "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz" integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== dependencies: ansi-styles "^4.1.0" @@ -1210,63 +1079,63 @@ chalk@^4.0.0: chalk@^5.4.1, chalk@^5.6.2: version "5.6.2" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-5.6.2.tgz#b1238b6e23ea337af71c7f8a295db5af0c158aea" + resolved "https://registry.npmjs.org/chalk/-/chalk-5.6.2.tgz" integrity sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA== chardet@^2.1.1: version "2.1.1" - resolved "https://registry.yarnpkg.com/chardet/-/chardet-2.1.1.tgz#5c75593704a642f71ee53717df234031e65373c8" + resolved "https://registry.npmjs.org/chardet/-/chardet-2.1.1.tgz" integrity sha512-PsezH1rqdV9VvyNhxxOW32/d75r01NY7TQCmOqomRo15ZSOKbpTFVsfjghxo6JloQUCGnH4k1LGu0R4yCLlWQQ== chokidar@^5.0.0: version "5.0.0" - resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-5.0.0.tgz#949c126a9238a80792be9a0265934f098af369a5" + resolved "https://registry.npmjs.org/chokidar/-/chokidar-5.0.0.tgz" integrity sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw== dependencies: readdirp "^5.0.0" chownr@^1.1.1: version "1.1.4" - resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.4.tgz#6fc9d7b42d32a583596337666e7d08084da2cc6b" + resolved "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz" integrity sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg== chownr@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/chownr/-/chownr-3.0.0.tgz#9855e64ecd240a9cc4267ce8a4aa5d24a1da15e4" + resolved "https://registry.npmjs.org/chownr/-/chownr-3.0.0.tgz" integrity sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g== ci-info@^4.3.1: version "4.4.0" - resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-4.4.0.tgz#7d54eff9f54b45b62401c26032696eb59c8bd18c" + resolved "https://registry.npmjs.org/ci-info/-/ci-info-4.4.0.tgz" integrity sha512-77PSwercCZU2Fc4sX94eF8k8Pxte6JAwL4/ICZLFjJLqegs7kCuAsqqj/70NQF6TvDpgFjkubQB2FW2ZZddvQg== citty@^0.1.6: version "0.1.6" - resolved "https://registry.yarnpkg.com/citty/-/citty-0.1.6.tgz#0f7904da1ed4625e1a9ea7e0fa780981aab7c5e4" + resolved "https://registry.npmjs.org/citty/-/citty-0.1.6.tgz" integrity sha512-tskPPKEs8D2KPafUypv2gxwJP8h/OaJmC82QQGGDQcHvXX43xF2VDACcJVmZ0EuSxkpO9Kc4MlrA3q0+FG58AQ== dependencies: consola "^3.2.3" citty@^0.2.0: version "0.2.1" - resolved "https://registry.yarnpkg.com/citty/-/citty-0.2.1.tgz#1b150777a3357b7b92e173fff38ea0d6ad2d08da" + resolved "https://registry.npmjs.org/citty/-/citty-0.2.1.tgz" integrity sha512-kEV95lFBhQgtogAPlQfJJ0WGVSokvLr/UEoFPiKKOXF7pl98HfUVUD0ejsuTCld/9xH9vogSywZ5KqHzXrZpqg== cli-cursor@^5.0.0: version "5.0.0" - resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-5.0.0.tgz#24a4831ecf5a6b01ddeb32fb71a4b2088b0dce38" + resolved "https://registry.npmjs.org/cli-cursor/-/cli-cursor-5.0.0.tgz" integrity sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw== dependencies: restore-cursor "^5.0.0" cli-spinners@^3.2.0: version "3.4.0" - resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-3.4.0.tgz#1f11f6d48c4e5bc6849fcb4efa0dc98f9e7299ea" + resolved "https://registry.npmjs.org/cli-spinners/-/cli-spinners-3.4.0.tgz" integrity sha512-bXfOC4QcT1tKXGorxL3wbJm6XJPDqEnij2gQ2m7ESQuE+/z9YFIWnl/5RpTiKWbMq3EVKR4fRLJGn6DVfu0mpw== cli-truncate@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/cli-truncate/-/cli-truncate-4.0.0.tgz#6cc28a2924fee9e25ce91e973db56c7066e6172a" + resolved "https://registry.npmjs.org/cli-truncate/-/cli-truncate-4.0.0.tgz" integrity sha512-nPdaFdQ0h/GEigbPClz11D0v/ZJEwxmeVZGeMo3Z5StPtUTkA9o1lD6QwoirYiSDzbcwn2XcjwmCp68W1IS4TA== dependencies: slice-ansi "^5.0.0" @@ -1274,12 +1143,12 @@ cli-truncate@^4.0.0: cli-width@^4.1.0: version "4.1.0" - resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-4.1.0.tgz#42daac41d3c254ef38ad8ac037672130173691c5" + resolved "https://registry.npmjs.org/cli-width/-/cli-width-4.1.0.tgz" integrity sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ== cliui@^7.0.2: version "7.0.4" - resolved "https://registry.yarnpkg.com/cliui/-/cliui-7.0.4.tgz#a0265ee655476fc807aea9df3df8df7783808b4f" + resolved "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz" integrity sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ== dependencies: string-width "^4.2.0" @@ -1288,37 +1157,47 @@ cliui@^7.0.2: color-convert@^2.0.1: version "2.0.1" - resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" + 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.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" + resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz" integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== colorette@^2.0.20: version "2.0.20" - resolved "https://registry.yarnpkg.com/colorette/-/colorette-2.0.20.tgz#9eb793e6833067f7235902fcd3b09917a000a95a" + resolved "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz" integrity sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w== commander@^13.1.0: version "13.1.0" - resolved "https://registry.yarnpkg.com/commander/-/commander-13.1.0.tgz#776167db68c78f38dcce1f9b8d7b8b9a488abf46" + resolved "https://registry.npmjs.org/commander/-/commander-13.1.0.tgz" integrity sha512-/rFeCpNJQbhSZjGVwO9RFV3xPqbnERS8MmIQzCtD/zl6gpJuV/bMLuN92oG3F7d8oDEHHRrujSXNUr8fpjntKw== +commander@^9.4.0: + version "9.5.0" + resolved "https://registry.npmjs.org/commander/-/commander-9.5.0.tgz" + integrity sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ== + compare-func@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/compare-func/-/compare-func-2.0.0.tgz#fb65e75edbddfd2e568554e8b5b05fff7a51fcb3" + resolved "https://registry.npmjs.org/compare-func/-/compare-func-2.0.0.tgz" integrity sha512-zHig5N+tPWARooBnb0Zx1MFcdfpyJrfTJ3Y5L+IFvUm8rM74hHz66z0gw0x4tijh5CorKkKUCnW82R2vmpeCRA== dependencies: array-ify "^1.0.0" dot-prop "^5.1.0" +concat-map@0.0.1: + version "0.0.1" + resolved "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz" + integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== + concat-stream@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-2.0.0.tgz#414cf5af790a48c60ab9be4527d56d5e41133cb1" + resolved "https://registry.npmjs.org/concat-stream/-/concat-stream-2.0.0.tgz" integrity sha512-MWufYdFw53ccGjCA+Ol7XJYpAlW6/prSMzuPOTRnJGcGzuhLn4Scrz7qf6o8bROZ514ltazcIFJZevcfbo0x7A== dependencies: buffer-from "^1.0.0" @@ -1328,41 +1207,41 @@ concat-stream@^2.0.0: confbox@^0.2.2: version "0.2.4" - resolved "https://registry.yarnpkg.com/confbox/-/confbox-0.2.4.tgz#592e7be71f882a4a874e3c88f0ac1ef6f7da1ce5" + resolved "https://registry.npmjs.org/confbox/-/confbox-0.2.4.tgz" integrity sha512-ysOGlgTFbN2/Y6Cg3Iye8YKulHw+R2fNXHrgSmXISQdMnomY6eNDprVdW9R5xBguEqI954+S6709UyiO7B+6OQ== confusing-browser-globals@^1.0.10: version "1.0.11" - resolved "https://registry.yarnpkg.com/confusing-browser-globals/-/confusing-browser-globals-1.0.11.tgz#ae40e9b57cdd3915408a2805ebd3a5585608dc81" + resolved "https://registry.npmjs.org/confusing-browser-globals/-/confusing-browser-globals-1.0.11.tgz" integrity sha512-JsPKdmh8ZkmnHxDk55FZ1TqVLvEQTvoByJZRN9jzI0UjxK/QgAmsphz7PGtqgPieQZ/CQcHWXCR7ATDNhGe+YA== consola@^3.2.3, consola@^3.4.0: version "3.4.2" - resolved "https://registry.yarnpkg.com/consola/-/consola-3.4.2.tgz#5af110145397bb67afdab77013fdc34cae590ea7" + resolved "https://registry.npmjs.org/consola/-/consola-3.4.2.tgz" integrity sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA== conventional-changelog-angular@^8.1.0: version "8.1.0" - resolved "https://registry.yarnpkg.com/conventional-changelog-angular/-/conventional-changelog-angular-8.1.0.tgz#06223a40f818c5618982fdb92d2b2aac5e24d33e" + resolved "https://registry.npmjs.org/conventional-changelog-angular/-/conventional-changelog-angular-8.1.0.tgz" integrity sha512-GGf2Nipn1RUCAktxuVauVr1e3r8QrLP/B0lEUsFktmGqc3ddbQkhoJZHJctVU829U1c6mTSWftrVOCHaL85Q3w== dependencies: compare-func "^2.0.0" conventional-changelog-conventionalcommits@^9.1.0: version "9.1.0" - resolved "https://registry.yarnpkg.com/conventional-changelog-conventionalcommits/-/conventional-changelog-conventionalcommits-9.1.0.tgz#34e5f35c80c1375a5464df2a8067a1facbb2d858" + resolved "https://registry.npmjs.org/conventional-changelog-conventionalcommits/-/conventional-changelog-conventionalcommits-9.1.0.tgz" integrity sha512-MnbEysR8wWa8dAEvbj5xcBgJKQlX/m0lhS8DsyAAWDHdfs2faDJxTgzRYlRYpXSe7UiKrIIlB4TrBKU9q9DgkA== dependencies: compare-func "^2.0.0" conventional-changelog-preset-loader@^5.0.0: version "5.0.0" - resolved "https://registry.yarnpkg.com/conventional-changelog-preset-loader/-/conventional-changelog-preset-loader-5.0.0.tgz#922ad617c13ad3243bef967cfc0f8373893c216d" + resolved "https://registry.npmjs.org/conventional-changelog-preset-loader/-/conventional-changelog-preset-loader-5.0.0.tgz" integrity sha512-SetDSntXLk8Jh1NOAl1Gu5uLiCNSYenB5tm0YVeZKePRIgDW9lQImromTwLa3c/Gae298tsgOM+/CYT9XAl0NA== conventional-changelog-writer@^8.2.0: version "8.2.0" - resolved "https://registry.yarnpkg.com/conventional-changelog-writer/-/conventional-changelog-writer-8.2.0.tgz#1b77ef8e45ccc4559e02a23a34d50c15d2051e5a" + resolved "https://registry.npmjs.org/conventional-changelog-writer/-/conventional-changelog-writer-8.2.0.tgz" integrity sha512-Y2aW4596l9AEvFJRwFGJGiQjt2sBYTjPD18DdvxX9Vpz0Z7HQ+g1Z+6iYDAm1vR3QOJrDBkRHixHK/+FhkR6Pw== dependencies: conventional-commits-filter "^5.0.0" @@ -1372,7 +1251,7 @@ conventional-changelog-writer@^8.2.0: conventional-changelog@^7.1.1: version "7.1.1" - resolved "https://registry.yarnpkg.com/conventional-changelog/-/conventional-changelog-7.1.1.tgz#9dbeb2ed54d519f53edd2922eda4145990f1de62" + resolved "https://registry.npmjs.org/conventional-changelog/-/conventional-changelog-7.1.1.tgz" integrity sha512-rlqa8Lgh8YzT3Akruk05DR79j5gN9NCglHtJZwpi6vxVeaoagz+84UAtKQj/sT+RsfGaZkt3cdFCjcN6yjr5sw== dependencies: "@conventional-changelog/git-client" "^2.5.1" @@ -1386,19 +1265,19 @@ conventional-changelog@^7.1.1: conventional-commits-filter@^5.0.0: version "5.0.0" - resolved "https://registry.yarnpkg.com/conventional-commits-filter/-/conventional-commits-filter-5.0.0.tgz#72811f95d379e79d2d39d5c0c53c9351ef284e86" + resolved "https://registry.npmjs.org/conventional-commits-filter/-/conventional-commits-filter-5.0.0.tgz" integrity sha512-tQMagCOC59EVgNZcC5zl7XqO30Wki9i9J3acbUvkaosCT6JX3EeFwJD7Qqp4MCikRnzS18WXV3BLIQ66ytu6+Q== conventional-commits-parser@^6.1.0, conventional-commits-parser@^6.2.0: version "6.2.1" - resolved "https://registry.yarnpkg.com/conventional-commits-parser/-/conventional-commits-parser-6.2.1.tgz#855e53c4792b1feaf93649eff5d75e0dbc2c63ad" + resolved "https://registry.npmjs.org/conventional-commits-parser/-/conventional-commits-parser-6.2.1.tgz" integrity sha512-20pyHgnO40rvfI0NGF/xiEoFMkXDtkF8FwHvk5BokoFoCuTQRI8vrNCNFWUOfuolKJMm1tPCHc8GgYEtr1XRNA== dependencies: meow "^13.0.0" conventional-recommended-bump@^11.2.0: version "11.2.0" - resolved "https://registry.yarnpkg.com/conventional-recommended-bump/-/conventional-recommended-bump-11.2.0.tgz#48607209770496673b2360cc55dca7cde8ea0047" + resolved "https://registry.npmjs.org/conventional-recommended-bump/-/conventional-recommended-bump-11.2.0.tgz" integrity sha512-lqIdmw330QdMBgfL0e6+6q5OMKyIpy4OZNmepit6FS3GldhkG+70drZjuZ0A5NFpze5j85dlYs3GabQXl6sMHw== dependencies: "@conventional-changelog/git-client" "^2.5.1" @@ -1409,12 +1288,12 @@ conventional-recommended-bump@^11.2.0: core-util-is@~1.0.0: version "1.0.3" - resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.3.tgz#a6042d3634c2b27e9328f837b965fac83808db85" + resolved "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz" integrity sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ== cross-spawn@^7.0.3, cross-spawn@^7.0.6: version "7.0.6" - resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.6.tgz#8a58fe78f00dcd70c370451759dfbfaf03e8ee9f" + resolved "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz" integrity sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA== dependencies: path-key "^3.1.0" @@ -1423,12 +1302,12 @@ cross-spawn@^7.0.3, cross-spawn@^7.0.6: data-uri-to-buffer@^6.0.2: version "6.0.2" - resolved "https://registry.yarnpkg.com/data-uri-to-buffer/-/data-uri-to-buffer-6.0.2.tgz#8a58bb67384b261a38ef18bea1810cb01badd28b" + resolved "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-6.0.2.tgz" integrity sha512-7hvf7/GW8e86rW0ptuwS3OcBGDjIi6SZva7hCyWC0yYry2cOPmLIjXAUHI6DK2HsnwJd9ifmt57i8eV2n4YNpw== data-view-buffer@^1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/data-view-buffer/-/data-view-buffer-1.0.2.tgz#211a03ba95ecaf7798a8c7198d79536211f88570" + resolved "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.2.tgz" integrity sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ== dependencies: call-bound "^1.0.3" @@ -1437,7 +1316,7 @@ data-view-buffer@^1.0.2: data-view-byte-length@^1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/data-view-byte-length/-/data-view-byte-length-1.0.2.tgz#9e80f7ca52453ce3e93d25a35318767ea7704735" + resolved "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.2.tgz" integrity sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ== dependencies: call-bound "^1.0.3" @@ -1446,52 +1325,52 @@ data-view-byte-length@^1.0.2: data-view-byte-offset@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/data-view-byte-offset/-/data-view-byte-offset-1.0.1.tgz#068307f9b71ab76dbbe10291389e020856606191" + resolved "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.1.tgz" integrity sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ== dependencies: call-bound "^1.0.2" es-errors "^1.3.0" is-data-view "^1.0.1" -debug@4, debug@^4.3.1, debug@^4.3.2, debug@^4.3.4, debug@^4.4.0, debug@^4.4.3: - version "4.4.3" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.4.3.tgz#c6ae432d9bd9662582fce08709b038c58e9e3d6a" - integrity sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA== - dependencies: - ms "^2.1.3" - debug@^3.2.7: version "3.2.7" - resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.7.tgz#72580b7e9145fb39b6676f9c5e5fb100b934179a" + resolved "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz" integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ== dependencies: ms "^2.1.1" +debug@^4.3.1, debug@^4.3.2, debug@^4.3.4, debug@^4.4.0, debug@^4.4.3, debug@4: + version "4.4.3" + resolved "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz" + integrity sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA== + dependencies: + ms "^2.1.3" + decompress-response@^6.0.0: version "6.0.0" - resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-6.0.0.tgz#ca387612ddb7e104bd16d85aab00d5ecf09c66fc" + resolved "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz" integrity sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ== dependencies: mimic-response "^3.1.0" deep-extend@^0.6.0: version "0.6.0" - resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" + resolved "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz" integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA== deep-is@^0.1.3: version "0.1.4" - resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" + resolved "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz" integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== default-browser-id@^5.0.0: version "5.0.1" - resolved "https://registry.yarnpkg.com/default-browser-id/-/default-browser-id-5.0.1.tgz#f7a7ccb8f5104bf8e0f71ba3b1ccfa5eafdb21e8" + resolved "https://registry.npmjs.org/default-browser-id/-/default-browser-id-5.0.1.tgz" integrity sha512-x1VCxdX4t+8wVfd1so/9w+vQ4vx7lKd2Qp5tDRutErwmR85OgmfX7RlLRMWafRMY7hbEiXIbudNrjOAPa/hL8Q== default-browser@^5.2.1: version "5.5.0" - resolved "https://registry.yarnpkg.com/default-browser/-/default-browser-5.5.0.tgz#2792e886f2422894545947cc80e1a444496c5976" + resolved "https://registry.npmjs.org/default-browser/-/default-browser-5.5.0.tgz" integrity sha512-H9LMLr5zwIbSxrmvikGuI/5KGhZ8E2zH3stkMgM5LpOWDutGM2JZaj460Udnf1a+946zc7YBgrqEWwbk7zHvGw== dependencies: bundle-name "^4.1.0" @@ -1499,7 +1378,7 @@ default-browser@^5.2.1: define-data-property@^1.0.1, define-data-property@^1.1.4: version "1.1.4" - resolved "https://registry.yarnpkg.com/define-data-property/-/define-data-property-1.1.4.tgz#894dc141bb7d3060ae4366f6a0107e68fbe48c5e" + resolved "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz" integrity sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A== dependencies: es-define-property "^1.0.0" @@ -1508,12 +1387,12 @@ define-data-property@^1.0.1, define-data-property@^1.1.4: define-lazy-prop@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/define-lazy-prop/-/define-lazy-prop-3.0.0.tgz#dbb19adfb746d7fc6d734a06b72f4a00d021255f" + resolved "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-3.0.0.tgz" integrity sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg== define-properties@^1.2.1: version "1.2.1" - resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.2.1.tgz#10781cc616eb951a80a034bafcaa7377f6af2b6c" + resolved "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz" integrity sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg== dependencies: define-data-property "^1.0.1" @@ -1522,55 +1401,50 @@ define-properties@^1.2.1: defu@^6.1.4: version "6.1.4" - resolved "https://registry.yarnpkg.com/defu/-/defu-6.1.4.tgz#4e0c9cf9ff68fe5f3d7f2765cc1a012dfdcb0479" + resolved "https://registry.npmjs.org/defu/-/defu-6.1.4.tgz" integrity sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg== degenerator@^5.0.0: version "5.0.1" - resolved "https://registry.yarnpkg.com/degenerator/-/degenerator-5.0.1.tgz#9403bf297c6dad9a1ece409b37db27954f91f2f5" + resolved "https://registry.npmjs.org/degenerator/-/degenerator-5.0.1.tgz" integrity sha512-TllpMR/t0M5sqCXfj85i4XaAzxmS5tVA16dqvdkMwGmzI+dXLXnw3J+3Vdv7VKw+ThlTMboK6i9rnZ6Nntj5CQ== dependencies: ast-types "^0.13.4" escodegen "^2.1.0" esprima "^4.0.1" -deprecation@^2.0.0: - version "2.3.1" - resolved "https://registry.yarnpkg.com/deprecation/-/deprecation-2.3.1.tgz#6368cbdb40abf3373b525ac87e4a260c3a700919" - integrity sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ== - destr@^2.0.3: version "2.0.5" - resolved "https://registry.yarnpkg.com/destr/-/destr-2.0.5.tgz#7d112ff1b925fb8d2079fac5bdb4a90973b51fdb" + resolved "https://registry.npmjs.org/destr/-/destr-2.0.5.tgz" integrity sha512-ugFTXCtDZunbzasqBxrK93Ik/DRYsO6S/fedkWEMKqt04xZ4csmnmwGDBAb07QWNaGMAmnTIemsYZCksjATwsA== detect-libc@^2.0.0: version "2.1.2" - resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-2.1.2.tgz#689c5dcdc1900ef5583a4cb9f6d7b473742074ad" + resolved "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz" integrity sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ== doctrine@^2.1.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-2.1.0.tgz#5cd01fc101621b42c4cd7f5d1a66243716d3f39d" + resolved "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz" integrity sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw== dependencies: esutils "^2.0.2" dot-prop@^5.1.0: version "5.3.0" - resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-5.3.0.tgz#90ccce708cd9cd82cc4dc8c3ddd9abdd55b20e88" + resolved "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz" integrity sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q== dependencies: is-obj "^2.0.0" dotenv@^17.2.3: version "17.3.1" - resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-17.3.1.tgz#2706f5b0165e45a1503348187b8468f87fe6aae2" + resolved "https://registry.npmjs.org/dotenv/-/dotenv-17.3.1.tgz" integrity sha512-IO8C/dzEb6O3F9/twg6ZLXz164a2fhTnEWb95H23Dm4OuN+92NmEAlTrupP9VW6Jm3sO26tQlqyvyi4CsnY9GA== dunder-proto@^1.0.0, dunder-proto@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/dunder-proto/-/dunder-proto-1.0.1.tgz#d7ae667e1dc83482f8b70fd0f6eefc50da30f58a" + resolved "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz" integrity sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A== dependencies: call-bind-apply-helpers "^1.0.1" @@ -1579,36 +1453,36 @@ dunder-proto@^1.0.0, dunder-proto@^1.0.1: duplexer2@~0.1.4: version "0.1.4" - resolved "https://registry.yarnpkg.com/duplexer2/-/duplexer2-0.1.4.tgz#8b12dab878c0d69e3e7891051662a32fc6bddcc1" + resolved "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz" integrity sha512-asLFVfWWtJ90ZyOUHMqk7/S2w2guQKxUI2itj3d92ADHhxUSbCMGi1f1cBcJ7xM1To+pE/Khbwo1yuNbMEPKeA== dependencies: readable-stream "^2.0.2" emoji-regex@^10.3.0: version "10.6.0" - resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-10.6.0.tgz#bf3d6e8f7f8fd22a65d9703475bc0147357a6b0d" + resolved "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.6.0.tgz" integrity sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A== emoji-regex@^8.0.0: version "8.0.0" - resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" + resolved "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz" integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== end-of-stream@^1.1.0, end-of-stream@^1.4.1: version "1.4.5" - resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.5.tgz#7344d711dea40e0b74abc2ed49778743ccedb08c" + resolved "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.5.tgz" integrity sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg== dependencies: once "^1.4.0" environment@^1.0.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/environment/-/environment-1.1.0.tgz#8e86c66b180f363c7ab311787e0259665f45a9f1" + resolved "https://registry.npmjs.org/environment/-/environment-1.1.0.tgz" integrity sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q== es-abstract@^1.23.2, es-abstract@^1.23.5, es-abstract@^1.23.9, es-abstract@^1.24.0: version "1.24.1" - resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.24.1.tgz#f0c131ed5ea1bb2411134a8dd94def09c46c7899" + resolved "https://registry.npmjs.org/es-abstract/-/es-abstract-1.24.1.tgz" integrity sha512-zHXBLhP+QehSSbsS9Pt23Gg964240DPd6QCf8WpkqEXxQ7fhdZzYsocOr5u7apWonsS5EjZDmTF+/slGMyasvw== dependencies: array-buffer-byte-length "^1.0.2" @@ -1668,24 +1542,24 @@ es-abstract@^1.23.2, es-abstract@^1.23.5, es-abstract@^1.23.9, es-abstract@^1.24 es-define-property@^1.0.0, es-define-property@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/es-define-property/-/es-define-property-1.0.1.tgz#983eb2f9a6724e9303f61addf011c72e09e0b0fa" + resolved "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz" integrity sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g== es-errors@^1.3.0: version "1.3.0" - resolved "https://registry.yarnpkg.com/es-errors/-/es-errors-1.3.0.tgz#05f75a25dab98e4fb1dcd5e1472c0546d5057c8f" + resolved "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz" integrity sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw== es-object-atoms@^1.0.0, es-object-atoms@^1.1.1: version "1.1.1" - resolved "https://registry.yarnpkg.com/es-object-atoms/-/es-object-atoms-1.1.1.tgz#1c4f2c4837327597ce69d2ca190a7fdd172338c1" + resolved "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz" integrity sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA== dependencies: es-errors "^1.3.0" es-set-tostringtag@^2.1.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz#f31dbbe0c183b00a6d26eb6325c810c0fd18bd4d" + resolved "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz" integrity sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA== dependencies: es-errors "^1.3.0" @@ -1695,14 +1569,14 @@ es-set-tostringtag@^2.1.0: es-shim-unscopables@^1.0.2, es-shim-unscopables@^1.1.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/es-shim-unscopables/-/es-shim-unscopables-1.1.0.tgz#438df35520dac5d105f3943d927549ea3b00f4b5" + resolved "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.1.0.tgz" integrity sha512-d9T8ucsEhh8Bi1woXCf+TIKDIROLG5WCkxg8geBCbvk22kzwC5G2OnXVMO6FUsvQlgUUXQ2itephWDLqDzbeCw== dependencies: hasown "^2.0.2" es-to-primitive@^1.3.0: version "1.3.0" - resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.3.0.tgz#96c89c82cc49fd8794a24835ba3e1ff87f214e18" + resolved "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.3.0.tgz" integrity sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g== dependencies: is-callable "^1.2.7" @@ -1711,14 +1585,14 @@ es-to-primitive@^1.3.0: esbuild-register@^3.6.0: version "3.6.0" - resolved "https://registry.yarnpkg.com/esbuild-register/-/esbuild-register-3.6.0.tgz#cf270cfa677baebbc0010ac024b823cbf723a36d" + resolved "https://registry.npmjs.org/esbuild-register/-/esbuild-register-3.6.0.tgz" integrity sha512-H2/S7Pm8a9CL1uhp9OvjwrBh5Pvx0H8qVOxNu8Wed9Y7qv56MPtq+GGM8RJpq6glYJn9Wspr8uw7l55uyinNeg== dependencies: debug "^4.3.4" esbuild@^0.27.3: version "0.27.3" - resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.27.3.tgz#5859ca8e70a3af956b26895ce4954d7e73bd27a8" + resolved "https://registry.npmjs.org/esbuild/-/esbuild-0.27.3.tgz" integrity sha512-8VwMnyGCONIs6cWue2IdpHxHnAjzxnw2Zr7MkVxB2vjmQ2ivqGFb4LEG3SMnv0Gb2F/G/2yA8zUaiL1gywDCCg== optionalDependencies: "@esbuild/aix-ppc64" "0.27.3" @@ -1750,17 +1624,17 @@ esbuild@^0.27.3: escalade@^3.1.1: version "3.2.0" - resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.2.0.tgz#011a3f69856ba189dffa7dc8fcce99d2a87903e5" + resolved "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz" integrity sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA== 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" + resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz" integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== escodegen@^2.1.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-2.1.0.tgz#ba93bbb7a43986d29d6041f99f5262da773e2e17" + resolved "https://registry.npmjs.org/escodegen/-/escodegen-2.1.0.tgz" integrity sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w== dependencies: esprima "^4.0.1" @@ -1771,7 +1645,7 @@ escodegen@^2.1.0: eslint-config-airbnb-base@^15.0.0: version "15.0.0" - resolved "https://registry.yarnpkg.com/eslint-config-airbnb-base/-/eslint-config-airbnb-base-15.0.0.tgz#6b09add90ac79c2f8d723a2580e07f3925afd236" + resolved "https://registry.npmjs.org/eslint-config-airbnb-base/-/eslint-config-airbnb-base-15.0.0.tgz" integrity sha512-xaX3z4ZZIcFLvh2oUNvcX5oEofXda7giYmuplVxoOg5A7EXJMrUyqRgR+mhDhPK8LZ4PttFOBvCYDbX3sUoUig== dependencies: confusing-browser-globals "^1.0.10" @@ -1781,19 +1655,19 @@ eslint-config-airbnb-base@^15.0.0: eslint-config-airbnb-typescript@^18.0.0: version "18.0.0" - resolved "https://registry.yarnpkg.com/eslint-config-airbnb-typescript/-/eslint-config-airbnb-typescript-18.0.0.tgz#b1646db4134858d704b1d2bee47e1d72c180315f" + resolved "https://registry.npmjs.org/eslint-config-airbnb-typescript/-/eslint-config-airbnb-typescript-18.0.0.tgz" integrity sha512-oc+Lxzgzsu8FQyFVa4QFaVKiitTYiiW3frB9KYW5OWdPrqFc7FzxgB20hP4cHMlr+MBzGcLl3jnCOVOydL9mIg== dependencies: eslint-config-airbnb-base "^15.0.0" eslint-config-prettier@^10.0.0: version "10.1.8" - resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-10.1.8.tgz#15734ce4af8c2778cc32f0b01b37b0b5cd1ecb97" + resolved "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-10.1.8.tgz" integrity sha512-82GZUjRS0p/jganf6q1rEO25VSoHH0hKPCTrgillPjdI/3bgBhAE1QzHrHTizjpRvy6pGAvKjDJtk2pF9NDq8w== eslint-import-resolver-node@^0.3.9: version "0.3.9" - resolved "https://registry.yarnpkg.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz#d4eaac52b8a2e7c3cd1903eb00f7e053356118ac" + resolved "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz" integrity sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g== dependencies: debug "^3.2.7" @@ -1802,14 +1676,14 @@ eslint-import-resolver-node@^0.3.9: eslint-module-utils@^2.12.1: version "2.12.1" - resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.12.1.tgz#f76d3220bfb83c057651359295ab5854eaad75ff" + resolved "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.12.1.tgz" integrity sha512-L8jSWTze7K2mTg0vos/RuLRS5soomksDPoJLXIslC7c8Wmut3bx7CPpJijDcBZtxQ5lrbUdM+s0OlNbz0DCDNw== dependencies: debug "^3.2.7" eslint-plugin-import@^2.31.0: version "2.32.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.32.0.tgz#602b55faa6e4caeaa5e970c198b5c00a37708980" + resolved "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.32.0.tgz" integrity sha512-whOE1HFo/qJDyX4SnXzP4N6zOWn79WhnCUY/iDR0mPfQZO8wcYE4JClzI2oZrhBnnMUCBCHZhO6VQyoBU95mZA== dependencies: "@rtsao/scc" "^1.1.0" @@ -1834,7 +1708,7 @@ eslint-plugin-import@^2.31.0: eslint-scope@^8.4.0: version "8.4.0" - resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-8.4.0.tgz#88e646a207fad61436ffa39eb505147200655c82" + resolved "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.4.0.tgz" integrity sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg== dependencies: esrecurse "^4.3.0" @@ -1842,17 +1716,17 @@ eslint-scope@^8.4.0: eslint-visitor-keys@^3.4.3: version "3.4.3" - resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz#0cd72fe8550e3c2eae156a96a4dddcd1c8ac5800" + resolved "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz" integrity sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag== eslint-visitor-keys@^4.2.1: version "4.2.1" - resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz#4cfea60fe7dd0ad8e816e1ed026c1d5251b512c1" + resolved "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz" integrity sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ== eslint@^9.0.0: version "9.39.2" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-9.39.2.tgz#cb60e6d16ab234c0f8369a3fe7cc87967faf4b6c" + resolved "https://registry.npmjs.org/eslint/-/eslint-9.39.2.tgz" integrity sha512-LEyamqS7W5HB3ujJyvi0HQK/dtVINZvd5mAAp9eT5S/ujByGjiZLCzPcHVzuXbpJDJF/cxwHlfceVUDZ2lnSTw== dependencies: "@eslint-community/eslint-utils" "^4.8.0" @@ -1892,7 +1766,7 @@ eslint@^9.0.0: espree@^10.0.1, espree@^10.4.0: version "10.4.0" - resolved "https://registry.yarnpkg.com/espree/-/espree-10.4.0.tgz#d54f4949d4629005a1fa168d937c3ff1f7e2a837" + resolved "https://registry.npmjs.org/espree/-/espree-10.4.0.tgz" integrity sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ== dependencies: acorn "^8.15.0" @@ -1901,53 +1775,53 @@ espree@^10.0.1, espree@^10.4.0: esprima@^4.0.1: version "4.0.1" - resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" + resolved "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz" integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== esquery@^1.5.0: version "1.7.0" - resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.7.0.tgz#08d048f261f0ddedb5bae95f46809463d9c9496d" + resolved "https://registry.npmjs.org/esquery/-/esquery-1.7.0.tgz" integrity sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g== dependencies: estraverse "^5.1.0" esrecurse@^4.3.0: version "4.3.0" - resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921" + resolved "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz" integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== dependencies: estraverse "^5.2.0" estraverse@^5.1.0, estraverse@^5.2.0: version "5.3.0" - resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123" + resolved "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz" 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" + resolved "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz" integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== eta@4.5.0: version "4.5.0" - resolved "https://registry.yarnpkg.com/eta/-/eta-4.5.0.tgz#43935b81ddb1cc938793b80c3b8d89f68fa9d178" + resolved "https://registry.npmjs.org/eta/-/eta-4.5.0.tgz" integrity sha512-qifAYjuW5AM1eEEIsFnOwB+TGqu6ynU3OKj9WbUTOtUBHFPZqL03XUW34kbp3zm19Ald+U8dEyRXaVsUck+Y1g== eventemitter3@^5.0.1: version "5.0.4" - resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-5.0.4.tgz#a86d66170433712dde814707ac52b5271ceb1feb" + resolved "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.4.tgz" integrity sha512-mlsTRyGaPBjPedk6Bvw+aqbsXDtoAyAzm5MO7JgU+yVRyMQ5O8bD4Kcci7BS85f93veegeCPkL8R4GLClnjLFw== events-universal@^1.0.0: version "1.0.1" - resolved "https://registry.yarnpkg.com/events-universal/-/events-universal-1.0.1.tgz#b56a84fd611b6610e0a2d0f09f80fdf931e2dfe6" + resolved "https://registry.npmjs.org/events-universal/-/events-universal-1.0.1.tgz" integrity sha512-LUd5euvbMLpwOF8m6ivPCbhQeSiYVNb8Vs0fQ8QjXo0JTkEHpz8pxdQf0gStltaPpw0Cca8b39KxvK9cfKRiAw== dependencies: bare-events "^2.7.0" execa@^8.0.1: version "8.0.1" - resolved "https://registry.yarnpkg.com/execa/-/execa-8.0.1.tgz#51f6a5943b580f963c3ca9c6321796db8cc39b8c" + resolved "https://registry.npmjs.org/execa/-/execa-8.0.1.tgz" integrity sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg== dependencies: cross-spawn "^7.0.3" @@ -1962,63 +1836,68 @@ execa@^8.0.1: expand-template@^2.0.3: version "2.0.3" - resolved "https://registry.yarnpkg.com/expand-template/-/expand-template-2.0.3.tgz#6e14b3fcee0f3a6340ecb57d2e8918692052a47c" + resolved "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz" integrity sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg== exsolve@^1.0.7, exsolve@^1.0.8: version "1.0.8" - resolved "https://registry.yarnpkg.com/exsolve/-/exsolve-1.0.8.tgz#7f5e34da61cd1116deda5136e62292c096f50613" + resolved "https://registry.npmjs.org/exsolve/-/exsolve-1.0.8.tgz" integrity sha512-LmDxfWXwcTArk8fUEnOfSZpHOJ6zOMUJKOtFLFqJLoKJetuQG874Uc7/Kki7zFLzYybmZhp1M7+98pfMqeX8yA== +fast-content-type-parse@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/fast-content-type-parse/-/fast-content-type-parse-3.0.0.tgz" + integrity sha512-ZvLdcY8P+N8mGQJahJV5G4U88CSvT1rP8ApL6uETe88MBXrBHAkZlSEySdUlyztF7ccb+Znos3TFqaepHxdhBg== + fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: version "3.1.3" - resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" + resolved "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz" integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== fast-fifo@^1.2.0, fast-fifo@^1.3.2: version "1.3.2" - resolved "https://registry.yarnpkg.com/fast-fifo/-/fast-fifo-1.3.2.tgz#286e31de96eb96d38a97899815740ba2a4f3640c" + resolved "https://registry.npmjs.org/fast-fifo/-/fast-fifo-1.3.2.tgz" integrity sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ== fast-json-stable-stringify@^2.0.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" + resolved "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz" integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== fast-levenshtein@^2.0.6: version "2.0.6" - resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" + resolved "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz" integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== fd-package-json@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/fd-package-json/-/fd-package-json-2.0.0.tgz#03f53ce5a0af552c2f4faf703a24e526310a2411" + resolved "https://registry.npmjs.org/fd-package-json/-/fd-package-json-2.0.0.tgz" integrity sha512-jKmm9YtsNXN789RS/0mSzOC1NUq9mkVd65vbSSVsKdjGvYXBuE4oWe2QOEoFeRmJg+lPuZxpmrfFclNhoRMneQ== dependencies: walk-up-path "^4.0.0" fdir@^6.5.0: version "6.5.0" - resolved "https://registry.yarnpkg.com/fdir/-/fdir-6.5.0.tgz#ed2ab967a331ade62f18d077dae192684d50d350" + resolved "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz" integrity sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg== file-entry-cache@^8.0.0: version "8.0.0" - resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-8.0.0.tgz#7787bddcf1131bffb92636c69457bbc0edd6d81f" + resolved "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz" integrity sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ== dependencies: flat-cache "^4.0.0" fill-range@^7.1.1: version "7.1.1" - resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.1.1.tgz#44265d3cac07e3ea7dc247516380643754a05292" + resolved "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz" integrity sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg== dependencies: to-regex-range "^5.0.1" find-up@^5.0.0: version "5.0.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" + resolved "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz" integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== dependencies: locate-path "^6.0.0" @@ -2026,7 +1905,7 @@ find-up@^5.0.0: flat-cache@^4.0.0: version "4.0.1" - resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-4.0.1.tgz#0ece39fcb14ee012f4b0410bd33dd9c1f011127c" + resolved "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz" integrity sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw== dependencies: flatted "^3.2.9" @@ -2034,24 +1913,24 @@ flat-cache@^4.0.0: flatted@^3.2.9: version "3.3.3" - resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.3.3.tgz#67c8fad95454a7c7abebf74bb78ee74a44023358" + resolved "https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz" integrity sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg== for-each@^0.3.3, for-each@^0.3.5: version "0.3.5" - resolved "https://registry.yarnpkg.com/for-each/-/for-each-0.3.5.tgz#d650688027826920feeb0af747ee7b9421a41d47" + resolved "https://registry.npmjs.org/for-each/-/for-each-0.3.5.tgz" integrity sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg== dependencies: is-callable "^1.2.7" fs-constants@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/fs-constants/-/fs-constants-1.0.0.tgz#6be0de9be998ce16af8afc24497b9ee9b7ccd9ad" + resolved "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz" integrity sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow== fs-extra@^11.2.0: version "11.3.3" - resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-11.3.3.tgz#a27da23b72524e81ac6c3815cc0179b8c74c59ee" + resolved "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.3.tgz" integrity sha512-VWSRii4t0AFm6ixFFmLLx1t7wS1gh+ckoa84aOeapGum0h+EZd1EhEumSB+ZdDLnEPuucsVB9oB7cxJHap6Afg== dependencies: graceful-fs "^4.2.0" @@ -2060,12 +1939,12 @@ fs-extra@^11.2.0: function-bind@^1.1.2: version "1.1.2" - resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.2.tgz#2c02d864d97f3ea6c8830c464cbd11ab6eab7a1c" + resolved "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz" integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA== function.prototype.name@^1.1.6, function.prototype.name@^1.1.8: version "1.1.8" - resolved "https://registry.yarnpkg.com/function.prototype.name/-/function.prototype.name-1.1.8.tgz#e68e1df7b259a5c949eeef95cdbde53edffabb78" + resolved "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.8.tgz" integrity sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q== dependencies: call-bind "^1.0.8" @@ -2077,27 +1956,27 @@ function.prototype.name@^1.1.6, function.prototype.name@^1.1.8: functions-have-names@^1.2.3: version "1.2.3" - resolved "https://registry.yarnpkg.com/functions-have-names/-/functions-have-names-1.2.3.tgz#0404fe4ee2ba2f607f0e0ec3c80bae994133b834" + resolved "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz" integrity sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ== generator-function@^2.0.0: version "2.0.1" - resolved "https://registry.yarnpkg.com/generator-function/-/generator-function-2.0.1.tgz#0e75dd410d1243687a0ba2e951b94eedb8f737a2" + resolved "https://registry.npmjs.org/generator-function/-/generator-function-2.0.1.tgz" integrity sha512-SFdFmIJi+ybC0vjlHN0ZGVGHc3lgE0DxPAT0djjVg+kjOnSqclqmj0KQ7ykTOLP6YxoqOvuAODGdcHJn+43q3g== 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" + resolved "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz" integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== get-east-asian-width@^1.0.0, get-east-asian-width@^1.3.0, get-east-asian-width@^1.3.1: version "1.4.0" - resolved "https://registry.yarnpkg.com/get-east-asian-width/-/get-east-asian-width-1.4.0.tgz#9bc4caa131702b4b61729cb7e42735bc550c9ee6" + resolved "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.4.0.tgz" integrity sha512-QZjmEOC+IT1uk6Rx0sX22V6uHWVwbdbxf1faPqJ1QhLdGgsRGCZoyaQBm/piRdJy/D2um6hM1UP7ZEeQ4EkP+Q== get-intrinsic@^1.2.4, get-intrinsic@^1.2.5, get-intrinsic@^1.2.6, get-intrinsic@^1.2.7, get-intrinsic@^1.3.0: version "1.3.0" - resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.3.0.tgz#743f0e3b6964a93a5491ed1bffaae054d7f98d01" + resolved "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz" integrity sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ== dependencies: call-bind-apply-helpers "^1.0.2" @@ -2113,7 +1992,7 @@ get-intrinsic@^1.2.4, get-intrinsic@^1.2.5, get-intrinsic@^1.2.6, get-intrinsic@ get-proto@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/get-proto/-/get-proto-1.0.1.tgz#150b3f2743869ef3e851ec0c49d15b1d14d00ee1" + resolved "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz" integrity sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g== dependencies: dunder-proto "^1.0.1" @@ -2121,12 +2000,12 @@ get-proto@^1.0.1: get-stream@^8.0.1: version "8.0.1" - resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-8.0.1.tgz#def9dfd71742cd7754a7761ed43749a27d02eca2" + resolved "https://registry.npmjs.org/get-stream/-/get-stream-8.0.1.tgz" integrity sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA== get-symbol-description@^1.1.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/get-symbol-description/-/get-symbol-description-1.1.0.tgz#7bdd54e0befe8ffc9f3b4e203220d9f1e881b6ee" + resolved "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.1.0.tgz" integrity sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg== dependencies: call-bound "^1.0.3" @@ -2135,7 +2014,7 @@ get-symbol-description@^1.1.0: get-uri@^6.0.1: version "6.0.5" - resolved "https://registry.yarnpkg.com/get-uri/-/get-uri-6.0.5.tgz#714892aa4a871db671abc5395e5e9447bc306a16" + resolved "https://registry.npmjs.org/get-uri/-/get-uri-6.0.5.tgz" integrity sha512-b1O07XYq8eRuVzBNgJLstU6FYc1tS6wnMtF1I1D9lE8LxZSOGZ7LhxN54yPP6mGw5f2CkXY2BQUL9Fx41qvcIg== dependencies: basic-ftp "^5.0.2" @@ -2144,7 +2023,7 @@ get-uri@^6.0.1: giget@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/giget/-/giget-2.0.0.tgz#395fc934a43f9a7a29a29d55b99f23e30c14f195" + resolved "https://registry.npmjs.org/giget/-/giget-2.0.0.tgz" integrity sha512-L5bGsVkxJbJgdnwyuheIunkGatUF/zssUoxxjACCseZYAVbaqdh9Tsmmlkl8vYan09H7sbvKt4pS8GqKLBrEzA== dependencies: citty "^0.1.6" @@ -2156,7 +2035,7 @@ giget@^2.0.0: git-up@^8.1.0: version "8.1.1" - resolved "https://registry.yarnpkg.com/git-up/-/git-up-8.1.1.tgz#06262adadb89a4a614d2922d803a0eda054be8c5" + resolved "https://registry.npmjs.org/git-up/-/git-up-8.1.1.tgz" integrity sha512-FDenSF3fVqBYSaJoYy1KSc2wosx0gCvKP+c+PRBht7cAaiCeQlBtfBDX9vgnNOHmdePlSFITVcn4pFfcgNvx3g== dependencies: is-ssh "^1.4.0" @@ -2164,26 +2043,26 @@ git-up@^8.1.0: git-url-parse@16.1.0: version "16.1.0" - resolved "https://registry.yarnpkg.com/git-url-parse/-/git-url-parse-16.1.0.tgz#3bb6f378a2ba2903c4d8b1cdec004aa85a7ab66f" + resolved "https://registry.npmjs.org/git-url-parse/-/git-url-parse-16.1.0.tgz" integrity sha512-cPLz4HuK86wClEW7iDdeAKcCVlWXmrLpb2L+G9goW0Z1dtpNS6BXXSOckUTlJT/LDQViE1QZKstNORzHsLnobw== dependencies: git-up "^8.1.0" github-from-package@0.0.0: version "0.0.0" - resolved "https://registry.yarnpkg.com/github-from-package/-/github-from-package-0.0.0.tgz#97fb5d96bfde8973313f20e8288ef9a167fa64ce" + resolved "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz" integrity sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw== glob-parent@^6.0.2: version "6.0.2" - resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-6.0.2.tgz#6d237d99083950c79290f24c7642a3de9a28f9e3" + resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz" integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A== dependencies: is-glob "^4.0.3" glob@^13.0.0: version "13.0.3" - resolved "https://registry.yarnpkg.com/glob/-/glob-13.0.3.tgz#e5c39b3e0eb8a2e2bc35e3b28e78fd0839ff9e68" + resolved "https://registry.npmjs.org/glob/-/glob-13.0.3.tgz" integrity sha512-/g3B0mC+4x724v1TgtBlBtt2hPi/EWptsIAmXUx9Z2rvBYleQcsrmaOzd5LyL50jf/Soi83ZDJmw2+XqvH/EeA== dependencies: minimatch "^10.2.0" @@ -2192,17 +2071,17 @@ glob@^13.0.0: globals@^14.0.0: version "14.0.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-14.0.0.tgz#898d7413c29babcf6bafe56fcadded858ada724e" + resolved "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz" integrity sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ== globals@^17.3.0: version "17.3.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-17.3.0.tgz#8b96544c2fa91afada02747cc9731c002a96f3b9" + resolved "https://registry.npmjs.org/globals/-/globals-17.3.0.tgz" integrity sha512-yMqGUQVVCkD4tqjOJf3TnrvaaHDMYp4VlUSObbkIiuCPe/ofdMBFIAcBbCSRFWOnos6qRiTVStDwqPLUclaxIw== globalthis@^1.0.4: version "1.0.4" - resolved "https://registry.yarnpkg.com/globalthis/-/globalthis-1.0.4.tgz#7430ed3a975d97bfb59bcce41f5cabbafa651236" + resolved "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz" integrity sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ== dependencies: define-properties "^1.2.1" @@ -2210,17 +2089,17 @@ globalthis@^1.0.4: gopd@^1.0.1, gopd@^1.2.0: version "1.2.0" - resolved "https://registry.yarnpkg.com/gopd/-/gopd-1.2.0.tgz#89f56b8217bdbc8802bd299df6d7f1081d7e51a1" + resolved "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz" integrity sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg== graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.2: version "4.2.11" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" + resolved "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz" integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== handlebars@^4.7.7: version "4.7.8" - resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.7.8.tgz#41c42c18b1be2365439188c77c6afae71c0cd9e9" + resolved "https://registry.npmjs.org/handlebars/-/handlebars-4.7.8.tgz" integrity sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ== dependencies: minimist "^1.2.5" @@ -2232,57 +2111,57 @@ handlebars@^4.7.7: has-bigints@^1.0.2: version "1.1.0" - resolved "https://registry.yarnpkg.com/has-bigints/-/has-bigints-1.1.0.tgz#28607e965ac967e03cd2a2c70a2636a1edad49fe" + resolved "https://registry.npmjs.org/has-bigints/-/has-bigints-1.1.0.tgz" integrity sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg== has-flag@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" + resolved "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz" integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== has-property-descriptors@^1.0.0, has-property-descriptors@^1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz#963ed7d071dc7bf5f084c5bfbe0d1b6222586854" + resolved "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz" integrity sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg== dependencies: es-define-property "^1.0.0" has-proto@^1.2.0: version "1.2.0" - resolved "https://registry.yarnpkg.com/has-proto/-/has-proto-1.2.0.tgz#5de5a6eabd95fdffd9818b43055e8065e39fe9d5" + resolved "https://registry.npmjs.org/has-proto/-/has-proto-1.2.0.tgz" integrity sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ== dependencies: dunder-proto "^1.0.0" has-symbols@^1.0.3, has-symbols@^1.1.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.1.0.tgz#fc9c6a783a084951d0b971fe1018de813707a338" + resolved "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz" integrity sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ== has-tostringtag@^1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.2.tgz#2cdc42d40bef2e5b4eeab7c01a73c54ce7ab5abc" + resolved "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz" integrity sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw== dependencies: has-symbols "^1.0.3" hasown@^2.0.2: version "2.0.2" - resolved "https://registry.yarnpkg.com/hasown/-/hasown-2.0.2.tgz#003eaf91be7adc372e84ec59dc37252cedb80003" + resolved "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz" integrity sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ== dependencies: function-bind "^1.1.2" hosted-git-info@^8.0.0: version "8.1.0" - resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-8.1.0.tgz#153cd84c03c6721481e16a5709eb74b1a0ab2ed0" + resolved "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-8.1.0.tgz" integrity sha512-Rw/B2DNQaPBICNXEm8balFz9a6WpZrkCGpcWFpy7nCj+NyhSdqXipmfvtmWt9xGfp0wZnBxB+iVpLmQMYt47Tw== dependencies: lru-cache "^10.0.1" http-proxy-agent@^7.0.0, http-proxy-agent@^7.0.1: version "7.0.2" - resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz#9a8b1f246866c028509486585f62b8f2c18c270e" + resolved "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz" integrity sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig== dependencies: agent-base "^7.1.0" @@ -2290,7 +2169,7 @@ http-proxy-agent@^7.0.0, http-proxy-agent@^7.0.1: https-proxy-agent@^5.0.0: version "5.0.1" - resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz#c59ef224a04fe8b754f3db0063a25ea30d0005d6" + resolved "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz" integrity sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA== dependencies: agent-base "6" @@ -2298,7 +2177,7 @@ https-proxy-agent@^5.0.0: https-proxy-agent@^7.0.6: version "7.0.6" - resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz#da8dfeac7da130b05c2ba4b59c9b6cd66611a6b9" + resolved "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz" integrity sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw== dependencies: agent-base "^7.1.2" @@ -2306,34 +2185,34 @@ https-proxy-agent@^7.0.6: human-signals@^5.0.0: version "5.0.0" - resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-5.0.0.tgz#42665a284f9ae0dade3ba41ebc37eb4b852f3a28" + resolved "https://registry.npmjs.org/human-signals/-/human-signals-5.0.0.tgz" integrity sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ== iconv-lite@^0.7.0: version "0.7.2" - resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.7.2.tgz#d0bdeac3f12b4835b7359c2ad89c422a4d1cc72e" + resolved "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.7.2.tgz" integrity sha512-im9DjEDQ55s9fL4EYzOAv0yMqmMBSZp6G0VvFyTMPKWxiSBHUj9NW/qqLmXUwXrrM7AvqSlTCfvqRb0cM8yYqw== dependencies: safer-buffer ">= 2.1.2 < 3.0.0" ieee754@^1.1.13: version "1.2.1" - resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" + resolved "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz" integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== ignore@^5.2.0: version "5.3.2" - resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.3.2.tgz#3cd40e729f3643fd87cb04e50bf0eb722bc596f5" + resolved "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz" integrity sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g== ignore@^7.0.5: version "7.0.5" - resolved "https://registry.yarnpkg.com/ignore/-/ignore-7.0.5.tgz#4cb5f6cd7d4c7ab0365738c7aea888baa6d7efd9" + resolved "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz" integrity sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg== import-fresh@^3.2.1: version "3.3.1" - resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.1.tgz#9cecb56503c0ada1f2741dbbd6546e4b13b57ccf" + resolved "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz" integrity sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ== dependencies: parent-module "^1.0.0" @@ -2341,22 +2220,22 @@ import-fresh@^3.2.1: imurmurhash@^0.1.4: version "0.1.4" - resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" + resolved "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz" integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA== inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.3: version "2.0.4" - resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" + resolved "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== ini@~1.3.0: version "1.3.8" - resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c" + resolved "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz" integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew== inquirer@12.11.1: version "12.11.1" - resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-12.11.1.tgz#3f5770b9ec926b0909e463e42c766f2664f2cc96" + resolved "https://registry.npmjs.org/inquirer/-/inquirer-12.11.1.tgz" integrity sha512-9VF7mrY+3OmsAfjH3yKz/pLbJ5z22E23hENKw3/LNSaA/sAt3v49bDRY+Ygct1xwuKT+U+cBfTzjCPySna69Qw== dependencies: "@inquirer/ansi" "^1.0.2" @@ -2369,7 +2248,7 @@ inquirer@12.11.1: internal-slot@^1.1.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.1.0.tgz#1eac91762947d2f7056bc838d93e13b2e9604961" + resolved "https://registry.npmjs.org/internal-slot/-/internal-slot-1.1.0.tgz" integrity sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw== dependencies: es-errors "^1.3.0" @@ -2378,17 +2257,17 @@ internal-slot@^1.1.0: into-stream@^9.1.0: version "9.1.0" - resolved "https://registry.yarnpkg.com/into-stream/-/into-stream-9.1.0.tgz#3d49f8dc3aa44c9d5e6007cc07831388542a1326" + resolved "https://registry.npmjs.org/into-stream/-/into-stream-9.1.0.tgz" integrity sha512-DRsRnQrbzdFjaQ1oe4C6/EIUymIOEix1qROEJTF9dbMq+M4Zrm6VaLp6SD/B9IsiEjPZuBSnWWFN+udajugdWA== ip-address@^10.0.1: version "10.1.0" - resolved "https://registry.yarnpkg.com/ip-address/-/ip-address-10.1.0.tgz#d8dcffb34d0e02eb241427444a6e23f5b0595aa4" + resolved "https://registry.npmjs.org/ip-address/-/ip-address-10.1.0.tgz" integrity sha512-XXADHxXmvT9+CRxhXg56LJovE+bmWnEWB78LB83VZTprKTmaC5QfruXocxzTZ2Kl0DNwKuBdlIhjL8LeY8Sf8Q== is-array-buffer@^3.0.4, is-array-buffer@^3.0.5: version "3.0.5" - resolved "https://registry.yarnpkg.com/is-array-buffer/-/is-array-buffer-3.0.5.tgz#65742e1e687bd2cc666253068fd8707fe4d44280" + resolved "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.5.tgz" integrity sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A== dependencies: call-bind "^1.0.8" @@ -2397,7 +2276,7 @@ is-array-buffer@^3.0.4, is-array-buffer@^3.0.5: is-async-function@^2.0.0: version "2.1.1" - resolved "https://registry.yarnpkg.com/is-async-function/-/is-async-function-2.1.1.tgz#3e69018c8e04e73b738793d020bfe884b9fd3523" + resolved "https://registry.npmjs.org/is-async-function/-/is-async-function-2.1.1.tgz" integrity sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ== dependencies: async-function "^1.0.0" @@ -2408,14 +2287,14 @@ is-async-function@^2.0.0: is-bigint@^1.1.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/is-bigint/-/is-bigint-1.1.0.tgz#dda7a3445df57a42583db4228682eba7c4170672" + resolved "https://registry.npmjs.org/is-bigint/-/is-bigint-1.1.0.tgz" integrity sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ== dependencies: has-bigints "^1.0.2" is-boolean-object@^1.2.1: version "1.2.2" - resolved "https://registry.yarnpkg.com/is-boolean-object/-/is-boolean-object-1.2.2.tgz#7067f47709809a393c71ff5bb3e135d8a9215d9e" + resolved "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.2.2.tgz" integrity sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A== dependencies: call-bound "^1.0.3" @@ -2423,19 +2302,19 @@ is-boolean-object@^1.2.1: is-callable@^1.2.7: version "1.2.7" - resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.7.tgz#3bc2a85ea742d9e36205dcacdd72ca1fdc51b055" + resolved "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz" integrity sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA== is-core-module@^2.13.0, is-core-module@^2.16.1: version "2.16.1" - resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.16.1.tgz#2a98801a849f43e2add644fbb6bc6229b19a4ef4" + resolved "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz" integrity sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w== dependencies: hasown "^2.0.2" is-data-view@^1.0.1, is-data-view@^1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/is-data-view/-/is-data-view-1.0.2.tgz#bae0a41b9688986c2188dda6657e56b8f9e63b8e" + resolved "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.2.tgz" integrity sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw== dependencies: call-bound "^1.0.2" @@ -2444,7 +2323,7 @@ is-data-view@^1.0.1, is-data-view@^1.0.2: is-date-object@^1.0.5, is-date-object@^1.1.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.1.0.tgz#ad85541996fc7aa8b2729701d27b7319f95d82f7" + resolved "https://registry.npmjs.org/is-date-object/-/is-date-object-1.1.0.tgz" integrity sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg== dependencies: call-bound "^1.0.2" @@ -2452,41 +2331,41 @@ is-date-object@^1.0.5, is-date-object@^1.1.0: is-docker@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/is-docker/-/is-docker-3.0.0.tgz#90093aa3106277d8a77a5910dbae71747e15a200" + resolved "https://registry.npmjs.org/is-docker/-/is-docker-3.0.0.tgz" integrity sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ== is-extglob@^2.1.1: version "2.1.1" - resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" + resolved "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz" integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== is-finalizationregistry@^1.1.0: version "1.1.1" - resolved "https://registry.yarnpkg.com/is-finalizationregistry/-/is-finalizationregistry-1.1.1.tgz#eefdcdc6c94ddd0674d9c85887bf93f944a97c90" + resolved "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.1.1.tgz" integrity sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg== dependencies: call-bound "^1.0.3" is-fullwidth-code-point@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" + resolved "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz" integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== is-fullwidth-code-point@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-4.0.0.tgz#fae3167c729e7463f8461ce512b080a49268aa88" + resolved "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-4.0.0.tgz" integrity sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ== is-fullwidth-code-point@^5.0.0: version "5.1.0" - resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-5.1.0.tgz#046b2a6d4f6b156b2233d3207d4b5a9783999b98" + resolved "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-5.1.0.tgz" integrity sha512-5XHYaSyiqADb4RnZ1Bdad6cPp8Toise4TzEjcOYDHZkTCbKgiUl7WTUCpNWHuxmDt91wnsZBc9xinNzopv3JMQ== dependencies: get-east-asian-width "^1.3.1" is-generator-function@^1.0.10: version "1.1.2" - resolved "https://registry.yarnpkg.com/is-generator-function/-/is-generator-function-1.1.2.tgz#ae3b61e3d5ea4e4839b90bad22b02335051a17d5" + resolved "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.1.2.tgz" integrity sha512-upqt1SkGkODW9tsGNG5mtXTXtECizwtS2kA161M+gJPc1xdb/Ax629af6YrTwcOeQHbewrPNlE5Dx7kzvXTizA== dependencies: call-bound "^1.0.4" @@ -2497,36 +2376,36 @@ is-generator-function@^1.0.10: is-glob@^4.0.0, is-glob@^4.0.3: version "4.0.3" - resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" + resolved "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz" integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== dependencies: is-extglob "^2.1.1" is-inside-container@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/is-inside-container/-/is-inside-container-1.0.0.tgz#e81fba699662eb31dbdaf26766a61d4814717ea4" + resolved "https://registry.npmjs.org/is-inside-container/-/is-inside-container-1.0.0.tgz" integrity sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA== dependencies: is-docker "^3.0.0" is-interactive@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/is-interactive/-/is-interactive-2.0.0.tgz#40c57614593826da1100ade6059778d597f16e90" + resolved "https://registry.npmjs.org/is-interactive/-/is-interactive-2.0.0.tgz" integrity sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ== is-map@^2.0.3: version "2.0.3" - resolved "https://registry.yarnpkg.com/is-map/-/is-map-2.0.3.tgz#ede96b7fe1e270b3c4465e3a465658764926d62e" + resolved "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz" integrity sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw== is-negative-zero@^2.0.3: version "2.0.3" - resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.3.tgz#ced903a027aca6381b777a5743069d7376a49747" + resolved "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz" integrity sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw== is-number-object@^1.1.1: version "1.1.1" - resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.1.1.tgz#144b21e95a1bc148205dcc2814a9134ec41b2541" + resolved "https://registry.npmjs.org/is-number-object/-/is-number-object-1.1.1.tgz" integrity sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw== dependencies: call-bound "^1.0.3" @@ -2534,17 +2413,17 @@ is-number-object@^1.1.1: is-number@^7.0.0: version "7.0.0" - resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" + resolved "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz" integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== is-obj@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-2.0.0.tgz#473fb05d973705e3fd9620545018ca8e22ef4982" + resolved "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz" integrity sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w== is-regex@^1.2.1: version "1.2.1" - resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.2.1.tgz#76d70a3ed10ef9be48eb577887d74205bf0cad22" + resolved "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz" integrity sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g== dependencies: call-bound "^1.0.2" @@ -2554,31 +2433,31 @@ is-regex@^1.2.1: is-set@^2.0.3: version "2.0.3" - resolved "https://registry.yarnpkg.com/is-set/-/is-set-2.0.3.tgz#8ab209ea424608141372ded6e0cb200ef1d9d01d" + resolved "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz" integrity sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg== is-shared-array-buffer@^1.0.4: version "1.0.4" - resolved "https://registry.yarnpkg.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.4.tgz#9b67844bd9b7f246ba0708c3a93e34269c774f6f" + resolved "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.4.tgz" integrity sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A== dependencies: call-bound "^1.0.3" is-ssh@^1.4.0: version "1.4.1" - resolved "https://registry.yarnpkg.com/is-ssh/-/is-ssh-1.4.1.tgz#76de1cdbe8f92a8b905d1a172b6bc09704c20396" + resolved "https://registry.npmjs.org/is-ssh/-/is-ssh-1.4.1.tgz" integrity sha512-JNeu1wQsHjyHgn9NcWTaXq6zWSR6hqE0++zhfZlkFBbScNkyvxCdeV8sRkSBaeLKxmbpR21brail63ACNxJ0Tg== dependencies: protocols "^2.0.1" is-stream@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-3.0.0.tgz#e6bfd7aa6bef69f4f472ce9bb681e3e57b4319ac" + resolved "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz" integrity sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA== is-string@^1.1.1: version "1.1.1" - resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.1.1.tgz#92ea3f3d5c5b6e039ca8677e5ac8d07ea773cbb9" + resolved "https://registry.npmjs.org/is-string/-/is-string-1.1.1.tgz" integrity sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA== dependencies: call-bound "^1.0.3" @@ -2586,7 +2465,7 @@ is-string@^1.1.1: is-symbol@^1.0.4, is-symbol@^1.1.1: version "1.1.1" - resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.1.1.tgz#f47761279f532e2b05a7024a7506dbbedacd0634" + resolved "https://registry.npmjs.org/is-symbol/-/is-symbol-1.1.1.tgz" integrity sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w== dependencies: call-bound "^1.0.2" @@ -2595,31 +2474,31 @@ is-symbol@^1.0.4, is-symbol@^1.1.1: is-typed-array@^1.1.13, is-typed-array@^1.1.14, is-typed-array@^1.1.15: version "1.1.15" - resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.15.tgz#4bfb4a45b61cee83a5a46fba778e4e8d59c0ce0b" + resolved "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.15.tgz" integrity sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ== dependencies: which-typed-array "^1.1.16" is-unicode-supported@^2.0.0, is-unicode-supported@^2.1.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/is-unicode-supported/-/is-unicode-supported-2.1.0.tgz#09f0ab0de6d3744d48d265ebb98f65d11f2a9b3a" + resolved "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-2.1.0.tgz" integrity sha512-mE00Gnza5EEB3Ds0HfMyllZzbBrmLOX3vfWoj9A9PEnTfratQ/BcaJOuMhnkhjXvb2+FkY3VuHqtAGpTPmglFQ== is-weakmap@^2.0.2: version "2.0.2" - resolved "https://registry.yarnpkg.com/is-weakmap/-/is-weakmap-2.0.2.tgz#bf72615d649dfe5f699079c54b83e47d1ae19cfd" + resolved "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz" integrity sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w== is-weakref@^1.0.2, is-weakref@^1.1.1: version "1.1.1" - resolved "https://registry.yarnpkg.com/is-weakref/-/is-weakref-1.1.1.tgz#eea430182be8d64174bd96bffbc46f21bf3f9293" + resolved "https://registry.npmjs.org/is-weakref/-/is-weakref-1.1.1.tgz" integrity sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew== dependencies: call-bound "^1.0.3" is-weakset@^2.0.3: version "2.0.4" - resolved "https://registry.yarnpkg.com/is-weakset/-/is-weakset-2.0.4.tgz#c9f5deb0bc1906c6d6f1027f284ddf459249daca" + resolved "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.4.tgz" integrity sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ== dependencies: call-bound "^1.0.3" @@ -2627,29 +2506,29 @@ is-weakset@^2.0.3: is-wsl@^3.1.0: version "3.1.0" - resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-3.1.0.tgz#e1c657e39c10090afcbedec61720f6b924c3cbd2" + resolved "https://registry.npmjs.org/is-wsl/-/is-wsl-3.1.0.tgz" integrity sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw== dependencies: is-inside-container "^1.0.0" isarray@^2.0.5: version "2.0.5" - resolved "https://registry.yarnpkg.com/isarray/-/isarray-2.0.5.tgz#8af1e4c1221244cc62459faf38940d4e644a5723" + resolved "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz" integrity sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw== isarray@~1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" + resolved "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz" integrity sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ== isexe@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" + resolved "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz" integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== issue-parser@7.0.1: version "7.0.1" - resolved "https://registry.yarnpkg.com/issue-parser/-/issue-parser-7.0.1.tgz#8a053e5a4952c75bb216204e454b4fc7d4cc9637" + resolved "https://registry.npmjs.org/issue-parser/-/issue-parser-7.0.1.tgz" integrity sha512-3YZcUUR2Wt1WsapF+S/WiA2WmlW0cWAoPccMqne7AxEBhCdFeTPjfv/Axb8V2gyCgY3nRw+ksZ3xSUX+R47iAg== dependencies: lodash.capitalize "^4.2.1" @@ -2660,44 +2539,44 @@ issue-parser@7.0.1: jiti@^2.6.1: version "2.6.1" - resolved "https://registry.yarnpkg.com/jiti/-/jiti-2.6.1.tgz#178ef2fc9a1a594248c20627cd820187a4d78d92" + resolved "https://registry.npmjs.org/jiti/-/jiti-2.6.1.tgz" integrity sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ== js-tokens@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" + resolved "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz" integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== js-yaml@^4.1.1: version "4.1.1" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.1.tgz#854c292467705b699476e1a2decc0c8a3458806b" + resolved "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz" integrity sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA== dependencies: argparse "^2.0.1" jsesc@^3.0.2: version "3.1.0" - resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-3.1.0.tgz#74d335a234f67ed19907fdadfac7ccf9d409825d" + resolved "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz" integrity sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA== json-buffer@3.0.1: version "3.0.1" - resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.1.tgz#9338802a30d3b6605fbe0613e094008ca8c05a13" + resolved "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz" integrity sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ== json-schema-traverse@^0.4.1: version "0.4.1" - resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" + resolved "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz" integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== json-stable-stringify-without-jsonify@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" + resolved "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz" integrity sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw== json-stable-stringify@^1.0.1: version "1.3.0" - resolved "https://registry.yarnpkg.com/json-stable-stringify/-/json-stable-stringify-1.3.0.tgz#8903cfac42ea1a0f97f35d63a4ce0518f0cc6a70" + resolved "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.3.0.tgz" integrity sha512-qtYiSSFlwot9XHtF9bD9c7rwKjr+RecWT//ZnPvSmEjpV5mmPOCN4j8UjY5hbjNkOwZ/jQv3J6R1/pL7RwgMsg== dependencies: call-bind "^1.0.8" @@ -2706,16 +2585,21 @@ json-stable-stringify@^1.0.1: jsonify "^0.0.1" object-keys "^1.1.1" +json-with-bigint@^3.5.3: + version "3.5.8" + resolved "https://registry.npmjs.org/json-with-bigint/-/json-with-bigint-3.5.8.tgz" + integrity sha512-eq/4KP6K34kwa7TcFdtvnftvHCD9KvHOGGICWwMFc4dOOKF5t4iYqnfLK8otCRCRv06FXOzGGyqE8h8ElMvvdw== + json5@^1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.2.tgz#63d98d60f21b313b77c4d6da18bfa69d80e1d593" + resolved "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz" integrity sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA== dependencies: minimist "^1.2.0" jsonfile@^6.0.1: version "6.2.0" - resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-6.2.0.tgz#7c265bd1b65de6977478300087c99f1c84383f62" + resolved "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.0.tgz" integrity sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg== dependencies: universalify "^2.0.0" @@ -2724,19 +2608,19 @@ jsonfile@^6.0.1: jsonify@^0.0.1: version "0.0.1" - resolved "https://registry.yarnpkg.com/jsonify/-/jsonify-0.0.1.tgz#2aa3111dae3d34a0f151c63f3a45d995d9420978" + resolved "https://registry.npmjs.org/jsonify/-/jsonify-0.0.1.tgz" integrity sha512-2/Ki0GcmuqSrgFyelQq9M05y7PS0mEwuIzrf3f1fPqkVDVRvZrPZtVSMHxdgo8Aq0sxAOb/cr2aqqA3LeWHVPg== keyv@^4.5.4: version "4.5.4" - resolved "https://registry.yarnpkg.com/keyv/-/keyv-4.5.4.tgz#a879a99e29452f942439f2a405e3af8b31d4de93" + resolved "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz" integrity sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw== dependencies: json-buffer "3.0.1" levn@^0.4.1: version "0.4.1" - resolved "https://registry.yarnpkg.com/levn/-/levn-0.4.1.tgz#ae4562c007473b932a6200d403268dd2fffc6ade" + resolved "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz" integrity sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ== dependencies: prelude-ls "^1.2.1" @@ -2744,12 +2628,12 @@ levn@^0.4.1: lilconfig@^3.1.3: version "3.1.3" - resolved "https://registry.yarnpkg.com/lilconfig/-/lilconfig-3.1.3.tgz#a1bcfd6257f9585bf5ae14ceeebb7b559025e4c4" + resolved "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz" integrity sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw== lint-staged@^15.0.0: version "15.5.2" - resolved "https://registry.yarnpkg.com/lint-staged/-/lint-staged-15.5.2.tgz#beff028fd0681f7db26ffbb67050a21ed4d059a3" + resolved "https://registry.npmjs.org/lint-staged/-/lint-staged-15.5.2.tgz" integrity sha512-YUSOLq9VeRNAo/CTaVmhGDKG+LBtA8KF1X4K5+ykMSwWST1vDxJRB2kv2COgLb1fvpCo+A/y9A0G0znNVmdx4w== dependencies: chalk "^5.4.1" @@ -2765,7 +2649,7 @@ lint-staged@^15.0.0: listr2@^8.2.5: version "8.3.3" - resolved "https://registry.yarnpkg.com/listr2/-/listr2-8.3.3.tgz#815fc8f738260ff220981bf9e866b3e11e8121bf" + resolved "https://registry.npmjs.org/listr2/-/listr2-8.3.3.tgz" integrity sha512-LWzX2KsqcB1wqQ4AHgYb4RsDXauQiqhjLk+6hjbaeHG4zpjjVAB6wC/gz6X0l+Du1cN3pUB5ZlrvTbhGSNnUQQ== dependencies: cli-truncate "^4.0.0" @@ -2777,49 +2661,49 @@ listr2@^8.2.5: locate-path@^6.0.0: version "6.0.0" - resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286" + resolved "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz" integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== dependencies: p-locate "^5.0.0" lodash.capitalize@^4.2.1: version "4.2.1" - resolved "https://registry.yarnpkg.com/lodash.capitalize/-/lodash.capitalize-4.2.1.tgz#f826c9b4e2a8511d84e3aca29db05e1a4f3b72a9" + resolved "https://registry.npmjs.org/lodash.capitalize/-/lodash.capitalize-4.2.1.tgz" integrity sha512-kZzYOKspf8XVX5AvmQF94gQW0lejFVgb80G85bU4ZWzoJ6C03PQg3coYAUpSTpQWelrZELd3XWgHzw4Ck5kaIw== lodash.escaperegexp@^4.1.2: version "4.1.2" - resolved "https://registry.yarnpkg.com/lodash.escaperegexp/-/lodash.escaperegexp-4.1.2.tgz#64762c48618082518ac3df4ccf5d5886dae20347" + resolved "https://registry.npmjs.org/lodash.escaperegexp/-/lodash.escaperegexp-4.1.2.tgz" integrity sha512-TM9YBvyC84ZxE3rgfefxUWiQKLilstD6k7PTGt6wfbtXF8ixIJLOL3VYyV/z+ZiPLsVxAsKAFVwWlWeb2Y8Yyw== lodash.isplainobject@^4.0.6: version "4.0.6" - resolved "https://registry.yarnpkg.com/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz#7c526a52d89b45c45cc690b88163be0497f550cb" + resolved "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz" integrity sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA== lodash.isstring@^4.0.1: version "4.0.1" - resolved "https://registry.yarnpkg.com/lodash.isstring/-/lodash.isstring-4.0.1.tgz#d527dfb5456eca7cc9bb95d5daeaf88ba54a5451" + resolved "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz" integrity sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw== -lodash.merge@4.6.2, lodash.merge@^4.6.2: +lodash.merge@^4.6.2, lodash.merge@4.6.2: version "4.6.2" - resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" + resolved "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz" integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== lodash.uniqby@^4.7.0: version "4.7.0" - resolved "https://registry.yarnpkg.com/lodash.uniqby/-/lodash.uniqby-4.7.0.tgz#d99c07a669e9e6d24e1362dfe266c67616af1302" + resolved "https://registry.npmjs.org/lodash.uniqby/-/lodash.uniqby-4.7.0.tgz" integrity sha512-e/zcLx6CSbmaEgFHCA7BnoQKyCtKMxnuWrJygbwPs/AIn+IMKl66L8/s+wBUn5LRw2pZx3bUHibiV1b6aTWIww== -lodash@^4.15.0, lodash@^4.17.23: +lodash@^4.15.0: version "4.17.23" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.23.tgz#f113b0378386103be4f6893388c73d0bde7f2c5a" + resolved "https://registry.npmjs.org/lodash/-/lodash-4.17.23.tgz" integrity sha512-LgVTMpQtIopCi79SJeDiP0TfWi5CNEc/L/aRdTh3yIvmZXTnheWpKjSZhnvMl8iXbC1tFg9gdHHDMLoV7CnG+w== log-symbols@^7.0.1: version "7.0.1" - resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-7.0.1.tgz#f52e68037d96f589fc572ff2193dc424d48c195b" + resolved "https://registry.npmjs.org/log-symbols/-/log-symbols-7.0.1.tgz" integrity sha512-ja1E3yCr9i/0hmBVaM0bfwDjnGy8I/s6PP4DFp+yP+a+mrHO4Rm7DtmnqROTUkHIkqffC84YY7AeqX6oFk0WFg== dependencies: is-unicode-supported "^2.0.0" @@ -2827,7 +2711,7 @@ log-symbols@^7.0.1: log-update@^6.1.0: version "6.1.0" - resolved "https://registry.yarnpkg.com/log-update/-/log-update-6.1.0.tgz#1a04ff38166f94647ae1af562f4bd6a15b1b7cd4" + resolved "https://registry.npmjs.org/log-update/-/log-update-6.1.0.tgz" integrity sha512-9ie8ItPR6tjY5uYJh8K/Zrv/RMZ5VOlOWvtZdEHYSTFKZfIBPQa9tOAEeAWhd+AnIneLJ22w5fjOYtoutpWq5w== dependencies: ansi-escapes "^7.0.0" @@ -2838,42 +2722,42 @@ log-update@^6.1.0: lru-cache@^10.0.1: version "10.4.3" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-10.4.3.tgz#410fc8a17b70e598013df257c2446b7f3383f119" + resolved "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz" integrity sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ== lru-cache@^11.0.0: version "11.2.6" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-11.2.6.tgz#356bf8a29e88a7a2945507b31f6429a65a192c58" + resolved "https://registry.npmjs.org/lru-cache/-/lru-cache-11.2.6.tgz" integrity sha512-ESL2CrkS/2wTPfuend7Zhkzo2u0daGJ/A2VucJOgQ/C48S/zB8MMeMHSGKYpXhIjbPxfuezITkaBH1wqv00DDQ== lru-cache@^7.14.1: version "7.18.3" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-7.18.3.tgz#f793896e0fd0e954a59dfdd82f0773808df6aa89" + resolved "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz" integrity sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA== macos-release@^3.3.0: version "3.4.0" - resolved "https://registry.yarnpkg.com/macos-release/-/macos-release-3.4.0.tgz#1b223706b13106c158e2b40cb81ba35dd74d7856" + resolved "https://registry.npmjs.org/macos-release/-/macos-release-3.4.0.tgz" integrity sha512-wpGPwyg/xrSp4H4Db4xYSeAr6+cFQGHfspHzDUdYxswDnUW0L5Ov63UuJiSr8NMSpyaChO4u1n0MXUvVPtrN6A== math-intrinsics@^1.1.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/math-intrinsics/-/math-intrinsics-1.1.0.tgz#a0dd74be81e2aa5c2f27e65ce283605ee4e2b7f9" + resolved "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz" integrity sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g== meow@^13.0.0: version "13.2.0" - resolved "https://registry.yarnpkg.com/meow/-/meow-13.2.0.tgz#6b7d63f913f984063b3cc261b6e8800c4cd3474f" + resolved "https://registry.npmjs.org/meow/-/meow-13.2.0.tgz" integrity sha512-pxQJQzB6djGPXh08dacEloMFopsOqGVRKFPYvPOt9XDZ1HasbgDZA74CJGreSU4G3Ak7EFJGoiH2auq+yXISgA== merge-stream@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" + resolved "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz" integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== micromatch@^4.0.8: version "4.0.8" - resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.8.tgz#d66fa18f3a47076789320b9b1af32bd86d9fa202" + resolved "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz" integrity sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA== dependencies: braces "^3.0.3" @@ -2881,87 +2765,87 @@ micromatch@^4.0.8: mime-db@^1.54.0: version "1.54.0" - resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.54.0.tgz#cddb3ee4f9c64530dff640236661d42cb6a314f5" + resolved "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz" integrity sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ== mime-types@3.0.2: version "3.0.2" - resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-3.0.2.tgz#39002d4182575d5af036ffa118100f2524b2e2ab" + resolved "https://registry.npmjs.org/mime-types/-/mime-types-3.0.2.tgz" integrity sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A== dependencies: mime-db "^1.54.0" mimic-fn@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-4.0.0.tgz#60a90550d5cb0b239cca65d893b1a53b29871ecc" + resolved "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz" integrity sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw== mimic-function@^5.0.0: version "5.0.1" - resolved "https://registry.yarnpkg.com/mimic-function/-/mimic-function-5.0.1.tgz#acbe2b3349f99b9deaca7fb70e48b83e94e67076" + resolved "https://registry.npmjs.org/mimic-function/-/mimic-function-5.0.1.tgz" integrity sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA== mimic-response@^3.1.0: version "3.1.0" - resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-3.1.0.tgz#2d1d59af9c1b129815accc2c46a022a5ce1fa3c9" + resolved "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz" integrity sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ== minimatch@^10.2.0: version "10.2.0" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-10.2.0.tgz#e710473e66e3e1aaf376d0aa82438375cac86e9e" + resolved "https://registry.npmjs.org/minimatch/-/minimatch-10.2.0.tgz" integrity sha512-ugkC31VaVg9cF0DFVoADH12k6061zNZkZON+aX8AWsR9GhPcErkcMBceb6znR8wLERM2AkkOxy2nWRLpT9Jq5w== dependencies: brace-expansion "^5.0.2" minimatch@^3.1.2: version "3.1.2" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" + resolved "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz" integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== dependencies: brace-expansion "^1.1.7" minimatch@^9.0.5: version "9.0.5" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.5.tgz#d74f9dd6b57d83d8e98cfb82133b03978bc929e5" + resolved "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz" integrity sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow== dependencies: brace-expansion "^2.0.1" minimist@^1.2.0, minimist@^1.2.3, minimist@^1.2.5, minimist@^1.2.6: version "1.2.8" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c" + resolved "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz" integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== minipass@^4.0.0: version "4.2.8" - resolved "https://registry.yarnpkg.com/minipass/-/minipass-4.2.8.tgz#f0010f64393ecfc1d1ccb5f582bcaf45f48e1a3a" + resolved "https://registry.npmjs.org/minipass/-/minipass-4.2.8.tgz" integrity sha512-fNzuVyifolSLFL4NzpF+wEF4qrgqaaKX0haXPQEdQ7NKAN+WecoKMHV09YcuL/DHxrUsYQOK3MiuDf7Ip2OXfQ== minipass@^7.0.4, minipass@^7.1.2: version "7.1.2" - resolved "https://registry.yarnpkg.com/minipass/-/minipass-7.1.2.tgz#93a9626ce5e5e66bd4db86849e7515e92340a707" + resolved "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz" integrity sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw== minizlib@^3.1.0: version "3.1.0" - resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-3.1.0.tgz#6ad76c3a8f10227c9b51d1c9ac8e30b27f5a251c" + resolved "https://registry.npmjs.org/minizlib/-/minizlib-3.1.0.tgz" integrity sha512-KZxYo1BUkWD2TVFLr0MQoM8vUUigWD3LlD83a/75BqC+4qE0Hb1Vo5v1FgcfaNXvfXzr+5EhQ6ing/CaBijTlw== dependencies: minipass "^7.1.2" mkdirp-classic@^0.5.2, mkdirp-classic@^0.5.3: version "0.5.3" - resolved "https://registry.yarnpkg.com/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz#fa10c9115cc6d8865be221ba47ee9bed78601113" + resolved "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz" integrity sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A== ms@^2.1.1, ms@^2.1.3: version "2.1.3" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" + resolved "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz" integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== multistream@^4.1.0: version "4.1.0" - resolved "https://registry.yarnpkg.com/multistream/-/multistream-4.1.0.tgz#7bf00dfd119556fbc153cff3de4c6d477909f5a8" + resolved "https://registry.npmjs.org/multistream/-/multistream-4.1.0.tgz" integrity sha512-J1XDiAmmNpRCBfIWJv+n0ymC4ABcf/Pl+5YvC5B/D2f/2+8PtHvCNxMPKiQcZyi922Hq69J2YOpb1pTywfifyw== dependencies: once "^1.4.0" @@ -2969,63 +2853,63 @@ multistream@^4.1.0: mute-stream@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-2.0.0.tgz#a5446fc0c512b71c83c44d908d5c7b7b4c493b2b" + resolved "https://registry.npmjs.org/mute-stream/-/mute-stream-2.0.0.tgz" integrity sha512-WWdIxpyjEn+FhQJQQv9aQAYlHoNVdzIzUySNV1gHUPDSdZJ3yZn7pAAbQcV7B56Mvu881q9FZV+0Vx2xC44VWA== napi-build-utils@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/napi-build-utils/-/napi-build-utils-2.0.0.tgz#13c22c0187fcfccce1461844136372a47ddc027e" + resolved "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-2.0.0.tgz" integrity sha512-GEbrYkbfF7MoNaoh2iGG84Mnf/WZfB0GdGEsM8wz7Expx/LlWf5U8t9nvJKXSp3qr5IsEbK04cBGhol/KwOsWA== natural-compare@^1.4.0: version "1.4.0" - resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" + resolved "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz" integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== neo-async@^2.6.2: version "2.6.2" - resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f" + resolved "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz" integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw== netmask@^2.0.2: version "2.0.2" - resolved "https://registry.yarnpkg.com/netmask/-/netmask-2.0.2.tgz#8b01a07644065d536383835823bc52004ebac5e7" + resolved "https://registry.npmjs.org/netmask/-/netmask-2.0.2.tgz" integrity sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg== new-github-release-url@2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/new-github-release-url/-/new-github-release-url-2.0.0.tgz#335189b91f52bbb9569042a7485900a205a0500b" + resolved "https://registry.npmjs.org/new-github-release-url/-/new-github-release-url-2.0.0.tgz" integrity sha512-NHDDGYudnvRutt/VhKFlX26IotXe1w0cmkDm6JGquh5bz/bDTw0LufSmH/GxTjEdpHEO+bVKFTwdrcGa/9XlKQ== dependencies: type-fest "^2.5.1" node-abi@^3.3.0: version "3.87.0" - resolved "https://registry.yarnpkg.com/node-abi/-/node-abi-3.87.0.tgz#423e28fea5c2f195fddd98acded9938c001ae6dd" + resolved "https://registry.npmjs.org/node-abi/-/node-abi-3.87.0.tgz" integrity sha512-+CGM1L1CgmtheLcBuleyYOn7NWPVu0s0EJH2C4puxgEZb9h8QpR9G2dBfZJOAUhi7VQxuBPMd0hiISWcTyiYyQ== dependencies: semver "^7.3.5" node-fetch-native@^1.6.6: version "1.6.7" - resolved "https://registry.yarnpkg.com/node-fetch-native/-/node-fetch-native-1.6.7.tgz#9d09ca63066cc48423211ed4caf5d70075d76a71" + resolved "https://registry.npmjs.org/node-fetch-native/-/node-fetch-native-1.6.7.tgz" integrity sha512-g9yhqoedzIUm0nTnTqAQvueMPVOuIY16bqgAJJC8XOOubYFNwz6IER9qs0Gq2Xd0+CecCKFjtdDTMA4u4xG06Q== node-fetch@^2.6.6: version "2.7.0" - resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.7.0.tgz#d0f0fa6e3e2dc1d27efcd8ad99d550bda94d187d" + resolved "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz" integrity sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A== dependencies: whatwg-url "^5.0.0" node-int64@^0.4.0: version "0.4.0" - resolved "https://registry.yarnpkg.com/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b" + resolved "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz" integrity sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw== normalize-package-data@^7.0.0: version "7.0.1" - resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-7.0.1.tgz#84d2971bd8be97b23f0ce06f9e401840be8eaa3e" + resolved "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-7.0.1.tgz" integrity sha512-linxNAT6M0ebEYZOx2tO6vBEFsVgnPpv+AVjk0wJHfaUIbq31Jm3T6vvZaarnOeWDh8ShnwXuaAyM7WT3RzErA== dependencies: hosted-git-info "^8.0.0" @@ -3034,14 +2918,14 @@ normalize-package-data@^7.0.0: npm-run-path@^5.1.0: version "5.3.0" - resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-5.3.0.tgz#e23353d0ebb9317f174e93417e4a4d82d0249e9f" + resolved "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.3.0.tgz" integrity sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ== dependencies: path-key "^4.0.0" nypm@^0.6.0: version "0.6.5" - resolved "https://registry.yarnpkg.com/nypm/-/nypm-0.6.5.tgz#5edd97310ee468fa3306b9ef5fe82b8ef6605b57" + resolved "https://registry.npmjs.org/nypm/-/nypm-0.6.5.tgz" integrity sha512-K6AJy1GMVyfyMXRVB88700BJqNUkByijGJM8kEHpLdcAt+vSQAVfkWWHYzuRXHSY6xA2sNc5RjTj0p9rE2izVQ== dependencies: citty "^0.2.0" @@ -3050,17 +2934,17 @@ nypm@^0.6.0: object-inspect@^1.13.3, object-inspect@^1.13.4: version "1.13.4" - resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.13.4.tgz#8375265e21bc20d0fa582c22e1b13485d6e00213" + resolved "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz" integrity sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew== object-keys@^1.1.1: version "1.1.1" - resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" + resolved "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz" integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== object.assign@^4.1.2, object.assign@^4.1.7: version "4.1.7" - resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.7.tgz#8c14ca1a424c6a561b0bb2a22f66f5049a945d3d" + resolved "https://registry.npmjs.org/object.assign/-/object.assign-4.1.7.tgz" integrity sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw== dependencies: call-bind "^1.0.8" @@ -3072,7 +2956,7 @@ object.assign@^4.1.2, object.assign@^4.1.7: object.entries@^1.1.5: version "1.1.9" - resolved "https://registry.yarnpkg.com/object.entries/-/object.entries-1.1.9.tgz#e4770a6a1444afb61bd39f984018b5bede25f8b3" + resolved "https://registry.npmjs.org/object.entries/-/object.entries-1.1.9.tgz" integrity sha512-8u/hfXFRBD1O0hPUjioLhoWFHRmt6tKA4/vZPyckBr18l1KE9uHrFaFaUi8MDRTpi4uak2goyPTSNJLXX2k2Hw== dependencies: call-bind "^1.0.8" @@ -3082,7 +2966,7 @@ object.entries@^1.1.5: object.fromentries@^2.0.8: version "2.0.8" - resolved "https://registry.yarnpkg.com/object.fromentries/-/object.fromentries-2.0.8.tgz#f7195d8a9b97bd95cbc1999ea939ecd1a2b00c65" + resolved "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.8.tgz" integrity sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ== dependencies: call-bind "^1.0.7" @@ -3092,7 +2976,7 @@ object.fromentries@^2.0.8: object.groupby@^1.0.3: version "1.0.3" - resolved "https://registry.yarnpkg.com/object.groupby/-/object.groupby-1.0.3.tgz#9b125c36238129f6f7b61954a1e7176148d5002e" + resolved "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.3.tgz" integrity sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ== dependencies: call-bind "^1.0.7" @@ -3101,7 +2985,7 @@ object.groupby@^1.0.3: object.values@^1.2.1: version "1.2.1" - resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.2.1.tgz#deed520a50809ff7f75a7cfd4bc64c7a038c6216" + resolved "https://registry.npmjs.org/object.values/-/object.values-1.2.1.tgz" integrity sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA== dependencies: call-bind "^1.0.8" @@ -3111,33 +2995,33 @@ object.values@^1.2.1: ohash@^2.0.11: version "2.0.11" - resolved "https://registry.yarnpkg.com/ohash/-/ohash-2.0.11.tgz#60b11e8cff62ca9dee88d13747a5baa145f5900b" + resolved "https://registry.npmjs.org/ohash/-/ohash-2.0.11.tgz" integrity sha512-RdR9FQrFwNBNXAr4GixM8YaRZRJ5PUWbKYbE5eOsrwAjJW0q2REGcf79oYPsLyskQCZG1PLN+S/K1V00joZAoQ== once@^1.3.1, once@^1.4.0: version "1.4.0" - resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" + resolved "https://registry.npmjs.org/once/-/once-1.4.0.tgz" integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== dependencies: wrappy "1" onetime@^6.0.0: version "6.0.0" - resolved "https://registry.yarnpkg.com/onetime/-/onetime-6.0.0.tgz#7c24c18ed1fd2e9bca4bd26806a33613c77d34b4" + resolved "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz" integrity sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ== dependencies: mimic-fn "^4.0.0" onetime@^7.0.0: version "7.0.0" - resolved "https://registry.yarnpkg.com/onetime/-/onetime-7.0.0.tgz#9f16c92d8c9ef5120e3acd9dd9957cceecc1ab60" + resolved "https://registry.npmjs.org/onetime/-/onetime-7.0.0.tgz" integrity sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ== dependencies: mimic-function "^5.0.0" open@10.2.0: version "10.2.0" - resolved "https://registry.yarnpkg.com/open/-/open-10.2.0.tgz#b9d855be007620e80b6fb05fac98141fe62db73c" + resolved "https://registry.npmjs.org/open/-/open-10.2.0.tgz" integrity sha512-YgBpdJHPyQ2UE5x+hlSXcnejzAvD0b22U2OuAP+8OnlJT+PjWPxtgmGqKKc+RgTM63U9gN0YzrYc71R2WT/hTA== dependencies: default-browser "^5.2.1" @@ -3147,7 +3031,7 @@ open@10.2.0: optionator@^0.9.3: version "0.9.4" - resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.4.tgz#7ea1c1a5d91d764fb282139c88fe11e182a3a734" + resolved "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz" integrity sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g== dependencies: deep-is "^0.1.3" @@ -3159,7 +3043,7 @@ optionator@^0.9.3: ora@9.0.0: version "9.0.0" - resolved "https://registry.yarnpkg.com/ora/-/ora-9.0.0.tgz#945236f5ce78a024cf4c25df6c46ecd09ab6e685" + resolved "https://registry.npmjs.org/ora/-/ora-9.0.0.tgz" integrity sha512-m0pg2zscbYgWbqRR6ABga5c3sZdEon7bSgjnlXC64kxtxLOyjRcbbUkLj7HFyy/FTD+P2xdBWu8snGhYI0jc4A== dependencies: chalk "^5.6.2" @@ -3174,7 +3058,7 @@ ora@9.0.0: os-name@6.1.0: version "6.1.0" - resolved "https://registry.yarnpkg.com/os-name/-/os-name-6.1.0.tgz#eddc732f5fcf9d942b9183011aea008107bf7af1" + resolved "https://registry.npmjs.org/os-name/-/os-name-6.1.0.tgz" integrity sha512-zBd1G8HkewNd2A8oQ8c6BN/f/c9EId7rSUueOLGu28govmUctXmM+3765GwsByv9nYUdrLqHphXlYIc86saYsg== dependencies: macos-release "^3.3.0" @@ -3182,7 +3066,7 @@ os-name@6.1.0: own-keys@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/own-keys/-/own-keys-1.0.1.tgz#e4006910a2bf913585289676eebd6f390cf51358" + resolved "https://registry.npmjs.org/own-keys/-/own-keys-1.0.1.tgz" integrity sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg== dependencies: get-intrinsic "^1.2.6" @@ -3191,21 +3075,21 @@ own-keys@^1.0.1: p-limit@^3.0.2: version "3.1.0" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" + resolved "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz" 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" + resolved "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz" integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== dependencies: p-limit "^3.0.2" pac-proxy-agent@^7.1.0: version "7.2.0" - resolved "https://registry.yarnpkg.com/pac-proxy-agent/-/pac-proxy-agent-7.2.0.tgz#9cfaf33ff25da36f6147a20844230ec92c06e5df" + resolved "https://registry.npmjs.org/pac-proxy-agent/-/pac-proxy-agent-7.2.0.tgz" integrity sha512-TEB8ESquiLMc0lV8vcd5Ql/JAKAoyzHFXaStwjkzpOpC5Yv+pIzLfHvjTSdf3vpa2bMiUQrg9i6276yn8666aA== dependencies: "@tootallnate/quickjs-emscripten" "^0.23.0" @@ -3219,7 +3103,7 @@ pac-proxy-agent@^7.1.0: pac-resolver@^7.0.1: version "7.0.1" - resolved "https://registry.yarnpkg.com/pac-resolver/-/pac-resolver-7.0.1.tgz#54675558ea368b64d210fd9c92a640b5f3b8abb6" + resolved "https://registry.npmjs.org/pac-resolver/-/pac-resolver-7.0.1.tgz" integrity sha512-5NPgf87AT2STgwa2ntRMr45jTKrYBGkVU36yT0ig/n/GMAa3oPqhZfIQ2kMEimReg0+t9kZViDVZ83qfVUlckg== dependencies: degenerator "^5.0.0" @@ -3227,26 +3111,26 @@ pac-resolver@^7.0.1: package-json-from-dist@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz#4f1471a010827a86f94cfd9b0727e36d267de505" + resolved "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz" integrity sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw== parent-module@^1.0.0: version "1.0.1" - resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" + resolved "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz" integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== dependencies: callsites "^3.0.0" parse-path@*, parse-path@^7.0.0: version "7.1.0" - resolved "https://registry.yarnpkg.com/parse-path/-/parse-path-7.1.0.tgz#41fb513cb122831807a4c7b29c8727947a09d8c6" + resolved "https://registry.npmjs.org/parse-path/-/parse-path-7.1.0.tgz" integrity sha512-EuCycjZtfPcjWk7KTksnJ5xPMvWGA/6i4zrLYhRG0hGvC3GPU/jGUj3Cy+ZR0v30duV3e23R95T1lE2+lsndSw== dependencies: protocols "^2.0.0" parse-url@^9.2.0: version "9.2.0" - resolved "https://registry.yarnpkg.com/parse-url/-/parse-url-9.2.0.tgz#d75da32b3bbade66e4eb0763fb4851d27526b97b" + resolved "https://registry.npmjs.org/parse-url/-/parse-url-9.2.0.tgz" integrity sha512-bCgsFI+GeGWPAvAiUv63ZorMeif3/U0zaXABGJbOWt5OH2KCaPHF6S+0ok4aqM9RuIPGyZdx9tR9l13PsW4AYQ== dependencies: "@types/parse-path" "^7.0.0" @@ -3254,27 +3138,27 @@ parse-url@^9.2.0: path-exists@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" + resolved "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz" integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== path-key@^3.1.0: version "3.1.1" - resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" + resolved "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz" integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== path-key@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/path-key/-/path-key-4.0.0.tgz#295588dc3aee64154f877adb9d780b81c554bf18" + resolved "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz" integrity sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ== path-parse@^1.0.7: version "1.0.7" - resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" + resolved "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz" integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== path-scurry@^2.0.0: version "2.0.1" - resolved "https://registry.yarnpkg.com/path-scurry/-/path-scurry-2.0.1.tgz#4b6572376cfd8b811fca9cd1f5c24b3cbac0fe10" + resolved "https://registry.npmjs.org/path-scurry/-/path-scurry-2.0.1.tgz" integrity sha512-oWyT4gICAu+kaA7QWk/jvCHWarMKNs6pXOGWKDTr7cw4IGcUbW+PeTfbaQiLGheFRpjo6O9J0PmyMfQPjH71oA== dependencies: lru-cache "^11.0.0" @@ -3282,37 +3166,37 @@ path-scurry@^2.0.0: pathe@^2.0.3: version "2.0.3" - resolved "https://registry.yarnpkg.com/pathe/-/pathe-2.0.3.tgz#3ecbec55421685b70a9da872b2cff3e1cbed1716" + resolved "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz" integrity sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w== perfect-debounce@^2.0.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/perfect-debounce/-/perfect-debounce-2.1.0.tgz#e7078e38f231cb191855c3136a4423aef725d261" + resolved "https://registry.npmjs.org/perfect-debounce/-/perfect-debounce-2.1.0.tgz" integrity sha512-LjgdTytVFXeUgtHZr9WYViYSM/g8MkcTPYDlPa3cDqMirHjKiSZPYd6DoL7pK8AJQr+uWkQvCjHNdiMqsrJs+g== picocolors@^1.1.0, picocolors@^1.1.1: version "1.1.1" - resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.1.1.tgz#3d321af3eab939b083c8f929a1d12cda81c26b6b" + resolved "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz" integrity sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA== picomatch@^2.3.1: version "2.3.1" - resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" + resolved "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz" integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== picomatch@^4.0.2, picomatch@^4.0.3: version "4.0.3" - resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-4.0.3.tgz#796c76136d1eead715db1e7bad785dedd695a042" + resolved "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz" integrity sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q== pidtree@^0.6.0: version "0.6.0" - resolved "https://registry.yarnpkg.com/pidtree/-/pidtree-0.6.0.tgz#90ad7b6d42d5841e69e0a2419ef38f8883aa057c" + resolved "https://registry.npmjs.org/pidtree/-/pidtree-0.6.0.tgz" integrity sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g== pkg-types@^2.3.0: version "2.3.0" - resolved "https://registry.yarnpkg.com/pkg-types/-/pkg-types-2.3.0.tgz#037f2c19bd5402966ff6810e32706558cb5b5726" + resolved "https://registry.npmjs.org/pkg-types/-/pkg-types-2.3.0.tgz" integrity sha512-SIqCzDRg0s9npO5XQ3tNZioRY1uK06lA41ynBC1YmFTmnY6FjUjVt6s4LoADmwoig1qqD0oK8h1p/8mlMx8Oig== dependencies: confbox "^0.2.2" @@ -3321,12 +3205,19 @@ pkg-types@^2.3.0: possible-typed-array-names@^1.0.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz#93e3582bc0e5426586d9d07b79ee40fc841de4ae" + resolved "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz" integrity sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg== +postject@^1.0.0-alpha.6: + version "1.0.0-alpha.6" + resolved "https://registry.npmjs.org/postject/-/postject-1.0.0-alpha.6.tgz" + integrity sha512-b9Eb8h2eVqNE8edvKdwqkrY6O7kAwmI8kcnBv1NScolYJbo59XUF0noFq+lxbC1yN20bmC0WBEbDC5H/7ASb0A== + dependencies: + commander "^9.4.0" + prebuild-install@^7.1.1: version "7.1.3" - resolved "https://registry.yarnpkg.com/prebuild-install/-/prebuild-install-7.1.3.tgz#d630abad2b147443f20a212917beae68b8092eec" + resolved "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.1.3.tgz" integrity sha512-8Mf2cbV7x1cXPUILADGI3wuhfqWvtiLA1iclTDbFRZkgRQS0NqsPZphna9V+HyTEadheuPmjaJMsbzKQFOzLug== dependencies: detect-libc "^2.0.0" @@ -3344,32 +3235,32 @@ prebuild-install@^7.1.1: prelude-ls@^1.2.1: version "1.2.1" - resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" + resolved "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz" integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== prettier@^3.0.3: version "3.8.1" - resolved "https://registry.yarnpkg.com/prettier/-/prettier-3.8.1.tgz#edf48977cf991558f4fcbd8a3ba6015ba2a3a173" + resolved "https://registry.npmjs.org/prettier/-/prettier-3.8.1.tgz" integrity sha512-UOnG6LftzbdaHZcKoPFtOcCKztrQ57WkHDeRD9t/PTQtmT0NHSeWWepj6pS0z/N7+08BHFDQVUrfmfMRcZwbMg== process-nextick-args@~2.0.0: version "2.0.1" - resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" + resolved "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz" integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== progress@^2.0.3: version "2.0.3" - resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8" + resolved "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz" integrity sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA== protocols@^2.0.0, protocols@^2.0.1: version "2.0.2" - resolved "https://registry.yarnpkg.com/protocols/-/protocols-2.0.2.tgz#822e8fcdcb3df5356538b3e91bfd890b067fd0a4" + resolved "https://registry.npmjs.org/protocols/-/protocols-2.0.2.tgz" integrity sha512-hHVTzba3wboROl0/aWRRG9dMytgH6ow//STBZh43l/wQgmMhYhOFi0EHWAPtoCz9IAUymsyP0TSBHkhgMEGNnQ== proxy-agent@6.5.0: version "6.5.0" - resolved "https://registry.yarnpkg.com/proxy-agent/-/proxy-agent-6.5.0.tgz#9e49acba8e4ee234aacb539f89ed9c23d02f232d" + resolved "https://registry.npmjs.org/proxy-agent/-/proxy-agent-6.5.0.tgz" integrity sha512-TmatMXdr2KlRiA2CyDu8GqR8EjahTG3aY3nXjdzFyoZbmB8hrBsTyMezhULIXKnC0jpfjlmiZ3+EaCzoInSu/A== dependencies: agent-base "^7.1.2" @@ -3383,12 +3274,12 @@ proxy-agent@6.5.0: proxy-from-env@^1.1.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/proxy-from-env/-/proxy-from-env-1.1.0.tgz#e102f16ca355424865755d2c9e8ea4f24d58c3e2" + resolved "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz" integrity sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg== pump@^3.0.0: version "3.0.3" - resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.3.tgz#151d979f1a29668dc0025ec589a455b53282268d" + resolved "https://registry.npmjs.org/pump/-/pump-3.0.3.tgz" integrity sha512-todwxLMY7/heScKmntwQG8CXVkWUOdYxIvY2s0VWAAMh/nd8SoYiRaKjlr7+iCs984f2P8zvrfWcDDYVb73NfA== dependencies: end-of-stream "^1.1.0" @@ -3396,20 +3287,12 @@ pump@^3.0.0: punycode@^2.1.0: version "2.3.1" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.1.tgz#027422e2faec0b25e1549c3e1bd8309b9133b6e5" + resolved "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz" integrity sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg== -rc9@^2.1.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/rc9/-/rc9-2.1.2.tgz#6282ff638a50caa0a91a31d76af4a0b9cbd1080d" - integrity sha512-btXCnMmRIBINM2LDZoEmOogIZU7Qe7zn4BpomSKZ/ykbLObuBdvG+mFq11DL6fjH1DRwHhrlgtYWG96bJiC7Cg== - dependencies: - defu "^6.1.4" - destr "^2.0.3" - rc@^1.2.7: version "1.2.8" - resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed" + resolved "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz" integrity sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw== dependencies: deep-extend "^0.6.0" @@ -3417,9 +3300,30 @@ rc@^1.2.7: minimist "^1.2.0" strip-json-comments "~2.0.1" -readable-stream@^2.0.2, readable-stream@^2.1.4: +rc9@^2.1.2: + version "2.1.2" + resolved "https://registry.npmjs.org/rc9/-/rc9-2.1.2.tgz" + integrity sha512-btXCnMmRIBINM2LDZoEmOogIZU7Qe7zn4BpomSKZ/ykbLObuBdvG+mFq11DL6fjH1DRwHhrlgtYWG96bJiC7Cg== + dependencies: + defu "^6.1.4" + destr "^2.0.3" + +readable-stream@^2.0.2: + version "2.3.8" + resolved "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz" + integrity sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA== + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.3" + isarray "~1.0.0" + process-nextick-args "~2.0.0" + safe-buffer "~5.1.1" + string_decoder "~1.1.1" + util-deprecate "~1.0.1" + +readable-stream@^2.1.4: version "2.3.8" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.8.tgz#91125e8042bba1b9887f49345f6277027ce8be9b" + resolved "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz" integrity sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA== dependencies: core-util-is "~1.0.0" @@ -3432,7 +3336,7 @@ readable-stream@^2.0.2, readable-stream@^2.1.4: readable-stream@^3.0.2, readable-stream@^3.1.1, readable-stream@^3.4.0, readable-stream@^3.6.0: version "3.6.2" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.2.tgz#56a9b36ea965c00c5a93ef31eb111a0f11056967" + resolved "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz" integrity sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA== dependencies: inherits "^2.0.3" @@ -3441,12 +3345,12 @@ readable-stream@^3.0.2, readable-stream@^3.1.1, readable-stream@^3.4.0, readable readdirp@^5.0.0: version "5.0.0" - resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-5.0.0.tgz#fbf1f71a727891d685bb1786f9ba74084f6e2f91" + resolved "https://registry.npmjs.org/readdirp/-/readdirp-5.0.0.tgz" integrity sha512-9u/XQ1pvrQtYyMpZe7DXKv2p5CNvyVwzUB6uhLAnQwHMSgKMBR62lc7AHljaeteeHXn11XTAaLLUVZYVZyuRBQ== reflect.getprototypeof@^1.0.6, reflect.getprototypeof@^1.0.9: version "1.0.10" - resolved "https://registry.yarnpkg.com/reflect.getprototypeof/-/reflect.getprototypeof-1.0.10.tgz#c629219e78a3316d8b604c765ef68996964e7bf9" + resolved "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.10.tgz" integrity sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw== dependencies: call-bind "^1.0.8" @@ -3460,7 +3364,7 @@ reflect.getprototypeof@^1.0.6, reflect.getprototypeof@^1.0.9: regexp.prototype.flags@^1.5.4: version "1.5.4" - resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.5.4.tgz#1ad6c62d44a259007e55b3970e00f746efbcaa19" + resolved "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.4.tgz" integrity sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA== dependencies: call-bind "^1.0.8" @@ -3472,7 +3376,7 @@ regexp.prototype.flags@^1.5.4: release-it@^19.2.4: version "19.2.4" - resolved "https://registry.yarnpkg.com/release-it/-/release-it-19.2.4.tgz#a4f94305ddc93091724f83e2d5d32808b12fca9b" + resolved "https://registry.npmjs.org/release-it/-/release-it-19.2.4.tgz" integrity sha512-BwaJwQYUIIAKuDYvpqQTSoy0U7zIy6cHyEjih/aNaFICphGahia4cjDANuFXb7gVZ51hIK9W0io6fjNQWXqICg== dependencies: "@nodeutils/defaults-deep" "1.1.0" @@ -3501,22 +3405,22 @@ release-it@^19.2.4: require-directory@^2.1.1: version "2.1.1" - resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" + resolved "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz" integrity sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q== resolve-from@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" + resolved "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz" integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== resolve.exports@^2.0.3: version "2.0.3" - resolved "https://registry.yarnpkg.com/resolve.exports/-/resolve.exports-2.0.3.tgz#41955e6f1b4013b7586f873749a635dea07ebe3f" + resolved "https://registry.npmjs.org/resolve.exports/-/resolve.exports-2.0.3.tgz" integrity sha512-OcXjMsGdhL4XnbShKpAcSqPMzQoYkYyhbEaeSko47MjRP9NfEQMhZkXL1DoFlt9LWQn4YttrdnV6X2OiyzBi+A== resolve@^1.22.10, resolve@^1.22.4: version "1.22.11" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.11.tgz#aad857ce1ffb8bfa9b0b1ac29f1156383f68c262" + resolved "https://registry.npmjs.org/resolve/-/resolve-1.22.11.tgz" integrity sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ== dependencies: is-core-module "^2.16.1" @@ -3525,7 +3429,7 @@ resolve@^1.22.10, resolve@^1.22.4: restore-cursor@^5.0.0: version "5.1.0" - resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-5.1.0.tgz#0766d95699efacb14150993f55baf0953ea1ebe7" + resolved "https://registry.npmjs.org/restore-cursor/-/restore-cursor-5.1.0.tgz" integrity sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA== dependencies: onetime "^7.0.0" @@ -3533,17 +3437,17 @@ restore-cursor@^5.0.0: retry@0.13.1: version "0.13.1" - resolved "https://registry.yarnpkg.com/retry/-/retry-0.13.1.tgz#185b1587acf67919d63b357349e03537b2484658" + resolved "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz" integrity sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg== rfdc@^1.4.1: version "1.4.1" - resolved "https://registry.yarnpkg.com/rfdc/-/rfdc-1.4.1.tgz#778f76c4fb731d93414e8f925fbecf64cce7f6ca" + resolved "https://registry.npmjs.org/rfdc/-/rfdc-1.4.1.tgz" integrity sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA== rimraf@^6.1.2: version "6.1.2" - resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-6.1.2.tgz#9a0f3cea2ab853e81291127422116ecf2a86ae89" + resolved "https://registry.npmjs.org/rimraf/-/rimraf-6.1.2.tgz" integrity sha512-cFCkPslJv7BAXJsYlK1dZsbP8/ZNLkCAQ0bi1hf5EKX2QHegmDFEFA6QhuYJlk7UDdc+02JjO80YSOrWPpw06g== dependencies: glob "^13.0.0" @@ -3551,24 +3455,24 @@ rimraf@^6.1.2: run-applescript@^7.0.0: version "7.1.0" - resolved "https://registry.yarnpkg.com/run-applescript/-/run-applescript-7.1.0.tgz#2e9e54c4664ec3106c5b5630e249d3d6595c4911" + resolved "https://registry.npmjs.org/run-applescript/-/run-applescript-7.1.0.tgz" integrity sha512-DPe5pVFaAsinSaV6QjQ6gdiedWDcRCbUuiQfQa2wmWV7+xC9bGulGI8+TdRmoFkAPaBXk8CrAbnlY2ISniJ47Q== run-async@^4.0.6: version "4.0.6" - resolved "https://registry.yarnpkg.com/run-async/-/run-async-4.0.6.tgz#d53b86acb71f42650fe23de2b3c1b6b6b34b9294" + resolved "https://registry.npmjs.org/run-async/-/run-async-4.0.6.tgz" integrity sha512-IoDlSLTs3Yq593mb3ZoKWKXMNu3UpObxhgA/Xuid5p4bbfi2jdY1Hj0m1K+0/tEuQTxIGMhQDqGjKb7RuxGpAQ== rxjs@^7.8.2: version "7.8.2" - resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-7.8.2.tgz#955bc473ed8af11a002a2be52071bf475638607b" + resolved "https://registry.npmjs.org/rxjs/-/rxjs-7.8.2.tgz" integrity sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA== dependencies: tslib "^2.1.0" safe-array-concat@^1.1.3: version "1.1.3" - resolved "https://registry.yarnpkg.com/safe-array-concat/-/safe-array-concat-1.1.3.tgz#c9e54ec4f603b0bbb8e7e5007a5ee7aecd1538c3" + resolved "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.3.tgz" integrity sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q== dependencies: call-bind "^1.0.8" @@ -3577,19 +3481,24 @@ safe-array-concat@^1.1.3: has-symbols "^1.1.0" isarray "^2.0.5" -safe-buffer@^5.0.1, safe-buffer@~5.2.0: +safe-buffer@^5.0.1: version "5.2.1" - resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" + resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz" integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== safe-buffer@~5.1.0, safe-buffer@~5.1.1: version "5.1.2" - resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" + resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz" integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== +safe-buffer@~5.2.0: + version "5.2.1" + resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz" + integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== + safe-push-apply@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/safe-push-apply/-/safe-push-apply-1.0.0.tgz#01850e981c1602d398c85081f360e4e6d03d27f5" + resolved "https://registry.npmjs.org/safe-push-apply/-/safe-push-apply-1.0.0.tgz" integrity sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA== dependencies: es-errors "^1.3.0" @@ -3597,7 +3506,7 @@ safe-push-apply@^1.0.0: safe-regex-test@^1.1.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/safe-regex-test/-/safe-regex-test-1.1.0.tgz#7f87dfb67a3150782eaaf18583ff5d1711ac10c1" + resolved "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.1.0.tgz" integrity sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw== dependencies: call-bound "^1.0.2" @@ -3606,27 +3515,32 @@ safe-regex-test@^1.1.0: "safer-buffer@>= 2.1.2 < 3.0.0": version "2.1.2" - resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" + resolved "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz" integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== -semver@7.7.3: - version "7.7.3" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.7.3.tgz#4b5f4143d007633a8dc671cd0a6ef9147b8bb946" - integrity sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q== +semver@^6.3.0: + version "6.3.1" + resolved "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz" + integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== -semver@^6.3.0, semver@^6.3.1: +semver@^6.3.1: version "6.3.1" - resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" + resolved "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz" integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== semver@^7.3.5, semver@^7.5.2, semver@^7.7.3: version "7.7.4" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.7.4.tgz#28464e36060e991fa7a11d0279d2d3f3b57a7e8a" + resolved "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz" integrity sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA== +semver@7.7.3: + version "7.7.3" + resolved "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz" + integrity sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q== + set-function-length@^1.2.2: version "1.2.2" - resolved "https://registry.yarnpkg.com/set-function-length/-/set-function-length-1.2.2.tgz#aac72314198eaed975cf77b2c3b6b880695e5449" + resolved "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz" integrity sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg== dependencies: define-data-property "^1.1.4" @@ -3638,7 +3552,7 @@ set-function-length@^1.2.2: set-function-name@^2.0.2: version "2.0.2" - resolved "https://registry.yarnpkg.com/set-function-name/-/set-function-name-2.0.2.tgz#16a705c5a0dc2f5e638ca96d8a8cd4e1c2b90985" + resolved "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz" integrity sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ== dependencies: define-data-property "^1.1.4" @@ -3648,7 +3562,7 @@ set-function-name@^2.0.2: set-proto@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/set-proto/-/set-proto-1.0.0.tgz#0760dbcff30b2d7e801fd6e19983e56da337565e" + resolved "https://registry.npmjs.org/set-proto/-/set-proto-1.0.0.tgz" integrity sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw== dependencies: dunder-proto "^1.0.1" @@ -3657,19 +3571,19 @@ set-proto@^1.0.0: shebang-command@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" + 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.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" + resolved "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz" integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== side-channel-list@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/side-channel-list/-/side-channel-list-1.0.0.tgz#10cb5984263115d3b7a0e336591e290a830af8ad" + resolved "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz" integrity sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA== dependencies: es-errors "^1.3.0" @@ -3677,7 +3591,7 @@ side-channel-list@^1.0.0: side-channel-map@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/side-channel-map/-/side-channel-map-1.0.1.tgz#d6bb6b37902c6fef5174e5f533fab4c732a26f42" + resolved "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz" integrity sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA== dependencies: call-bound "^1.0.2" @@ -3687,7 +3601,7 @@ side-channel-map@^1.0.1: side-channel-weakmap@^1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz#11dda19d5368e40ce9ec2bdc1fb0ecbc0790ecea" + resolved "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz" integrity sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A== dependencies: call-bound "^1.0.2" @@ -3698,7 +3612,7 @@ side-channel-weakmap@^1.0.2: side-channel@^1.1.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.1.0.tgz#c3fcff9c4da932784873335ec9765fa94ff66bc9" + resolved "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz" integrity sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw== dependencies: es-errors "^1.3.0" @@ -3709,17 +3623,17 @@ side-channel@^1.1.0: signal-exit@^4.1.0: version "4.1.0" - resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-4.1.0.tgz#952188c1cbd546070e2dd20d0f41c0ae0530cb04" + resolved "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz" integrity sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw== simple-concat@^1.0.0: version "1.0.1" - resolved "https://registry.yarnpkg.com/simple-concat/-/simple-concat-1.0.1.tgz#f46976082ba35c2263f1c8ab5edfe26c41c9552f" + resolved "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz" integrity sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q== simple-get@^4.0.0: version "4.0.1" - resolved "https://registry.yarnpkg.com/simple-get/-/simple-get-4.0.1.tgz#4a39db549287c979d352112fa03fd99fd6bc3543" + resolved "https://registry.npmjs.org/simple-get/-/simple-get-4.0.1.tgz" integrity sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA== dependencies: decompress-response "^6.0.0" @@ -3728,12 +3642,12 @@ simple-get@^4.0.0: simple-git-hooks@^2.11.1: version "2.13.1" - resolved "https://registry.yarnpkg.com/simple-git-hooks/-/simple-git-hooks-2.13.1.tgz#a2cb8b2dec39703e6c69f982ed1d9fdf444ca8c6" + resolved "https://registry.npmjs.org/simple-git-hooks/-/simple-git-hooks-2.13.1.tgz" integrity sha512-WszCLXwT4h2k1ufIXAgsbiTOazqqevFCIncOuUBZJ91DdvWcC5+OFkluWRQPrcuSYd8fjq+o2y1QfWqYMoAToQ== slice-ansi@^5.0.0: version "5.0.0" - resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-5.0.0.tgz#b73063c57aa96f9cd881654b15294d95d285c42a" + resolved "https://registry.npmjs.org/slice-ansi/-/slice-ansi-5.0.0.tgz" integrity sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ== dependencies: ansi-styles "^6.0.0" @@ -3741,7 +3655,7 @@ slice-ansi@^5.0.0: slice-ansi@^7.1.0: version "7.1.2" - resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-7.1.2.tgz#adf7be70aa6d72162d907cd0e6d5c11f507b5403" + resolved "https://registry.npmjs.org/slice-ansi/-/slice-ansi-7.1.2.tgz" integrity sha512-iOBWFgUX7caIZiuutICxVgX1SdxwAVFFKwt1EvMYYec/NWO5meOJ6K5uQxhrYBdQJne4KxiqZc+KptFOWFSI9w== dependencies: ansi-styles "^6.2.1" @@ -3749,12 +3663,12 @@ slice-ansi@^7.1.0: smart-buffer@^4.2.0: version "4.2.0" - resolved "https://registry.yarnpkg.com/smart-buffer/-/smart-buffer-4.2.0.tgz#6e1d71fa4f18c05f7d0ff216dd16a481d0e8d9ae" + resolved "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz" integrity sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg== socks-proxy-agent@^8.0.5: version "8.0.5" - resolved "https://registry.yarnpkg.com/socks-proxy-agent/-/socks-proxy-agent-8.0.5.tgz#b9cdb4e7e998509d7659d689ce7697ac21645bee" + resolved "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-8.0.5.tgz" integrity sha512-HehCEsotFqbPW9sJ8WVYB6UbmIMv7kUUORIF2Nncq4VQvBfNBLibW9YZR5dlYCSUhwcD628pRllm7n+E+YTzJw== dependencies: agent-base "^7.1.2" @@ -3763,7 +3677,7 @@ socks-proxy-agent@^8.0.5: socks@^2.8.3: version "2.8.7" - resolved "https://registry.yarnpkg.com/socks/-/socks-2.8.7.tgz#e2fb1d9a603add75050a2067db8c381a0b5669ea" + resolved "https://registry.npmjs.org/socks/-/socks-2.8.7.tgz" integrity sha512-HLpt+uLy/pxB+bum/9DzAgiKS8CX1EvbWxI4zlmgGCExImLdiad2iCwXT5Z4c9c3Eq8rP2318mPW2c+QbtjK8A== dependencies: ip-address "^10.0.1" @@ -3771,12 +3685,12 @@ socks@^2.8.3: source-map@^0.6.1, source-map@~0.6.1: version "0.6.1" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" + resolved "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz" integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== spdx-correct@^3.0.0: version "3.2.0" - resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.2.0.tgz#4f5ab0668f0059e34f9c00dce331784a12de4e9c" + resolved "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz" integrity sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA== dependencies: spdx-expression-parse "^3.0.0" @@ -3784,12 +3698,12 @@ spdx-correct@^3.0.0: spdx-exceptions@^2.1.0: version "2.5.0" - resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz#5d607d27fc806f66d7b64a766650fa890f04ed66" + resolved "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz" integrity sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w== spdx-expression-parse@^3.0.0: version "3.0.1" - resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz#cf70f50482eefdc98e3ce0a6833e4a53ceeba679" + resolved "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz" integrity sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q== dependencies: spdx-exceptions "^2.1.0" @@ -3797,17 +3711,17 @@ spdx-expression-parse@^3.0.0: spdx-license-ids@^3.0.0: version "3.0.22" - resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.22.tgz#abf5a08a6f5d7279559b669f47f0a43e8f3464ef" + resolved "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.22.tgz" integrity sha512-4PRT4nh1EImPbt2jASOKHX7PB7I+e4IWNLvkKFDxNhJlfjbYlleYQh285Z/3mPTHSAK/AvdMmw5BNNuYH8ShgQ== stdin-discarder@^0.2.2: version "0.2.2" - resolved "https://registry.yarnpkg.com/stdin-discarder/-/stdin-discarder-0.2.2.tgz#390037f44c4ae1a1ae535c5fe38dc3aba8d997be" + resolved "https://registry.npmjs.org/stdin-discarder/-/stdin-discarder-0.2.2.tgz" integrity sha512-UhDfHmA92YAlNnCfhmq0VeNL5bDbiZGg7sZ2IvPsXubGkiNa9EC+tUTsjBRsYUAz87btI6/1wf4XoVvQ3uRnmQ== stop-iteration-iterator@^1.1.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/stop-iteration-iterator/-/stop-iteration-iterator-1.1.0.tgz#f481ff70a548f6124d0312c3aa14cbfa7aa542ad" + resolved "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.1.0.tgz" integrity sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ== dependencies: es-errors "^1.3.0" @@ -3815,28 +3729,42 @@ stop-iteration-iterator@^1.1.0: stream-meter@^1.0.4: version "1.0.4" - resolved "https://registry.yarnpkg.com/stream-meter/-/stream-meter-1.0.4.tgz#52af95aa5ea760a2491716704dbff90f73afdd1d" + resolved "https://registry.npmjs.org/stream-meter/-/stream-meter-1.0.4.tgz" integrity sha512-4sOEtrbgFotXwnEuzzsQBYEV1elAeFSO8rSGeTwabuX1RRn/kEq9JVH7I0MRBhKVRR0sJkr0M0QCH7yOLf9fhQ== dependencies: readable-stream "^2.1.4" streamx@^2.15.0, streamx@^2.21.0: version "2.23.0" - resolved "https://registry.yarnpkg.com/streamx/-/streamx-2.23.0.tgz#7d0f3d00d4a6c5de5728aecd6422b4008d66fd0b" + resolved "https://registry.npmjs.org/streamx/-/streamx-2.23.0.tgz" integrity sha512-kn+e44esVfn2Fa/O0CPFcex27fjIL6MkVae0Mm6q+E6f0hWv578YCERbv+4m02cjxvDsPKLnmxral/rR6lBMAg== dependencies: events-universal "^1.0.0" fast-fifo "^1.3.2" text-decoder "^1.1.0" +string_decoder@^1.1.1: + version "1.3.0" + resolved "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz" + integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== + dependencies: + safe-buffer "~5.2.0" + +string_decoder@~1.1.1: + version "1.1.1" + resolved "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz" + integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== + dependencies: + safe-buffer "~5.1.0" + string-argv@^0.3.2: version "0.3.2" - resolved "https://registry.yarnpkg.com/string-argv/-/string-argv-0.3.2.tgz#2b6d0ef24b656274d957d54e0a4bbf6153dc02b6" + resolved "https://registry.npmjs.org/string-argv/-/string-argv-0.3.2.tgz" integrity sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q== string-width@^4.1.0, string-width@^4.2.0: version "4.2.3" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" + resolved "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz" integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== dependencies: emoji-regex "^8.0.0" @@ -3845,7 +3773,7 @@ string-width@^4.1.0, string-width@^4.2.0: string-width@^7.0.0: version "7.2.0" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-7.2.0.tgz#b5bb8e2165ce275d4d43476dd2700ad9091db6dc" + resolved "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz" integrity sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ== dependencies: emoji-regex "^10.3.0" @@ -3854,7 +3782,7 @@ string-width@^7.0.0: string-width@^8.1.0: version "8.1.1" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-8.1.1.tgz#9b5aa0df72e3f232611c57fd47eb41dd97866bd3" + resolved "https://registry.npmjs.org/string-width/-/string-width-8.1.1.tgz" integrity sha512-KpqHIdDL9KwYk22wEOg/VIqYbrnLeSApsKT/bSj6Ez7pn3CftUiLAv2Lccpq1ALcpLV9UX1Ppn92npZWu2w/aw== dependencies: get-east-asian-width "^1.3.0" @@ -3862,7 +3790,7 @@ string-width@^8.1.0: string.prototype.trim@^1.2.10: version "1.2.10" - resolved "https://registry.yarnpkg.com/string.prototype.trim/-/string.prototype.trim-1.2.10.tgz#40b2dd5ee94c959b4dcfb1d65ce72e90da480c81" + resolved "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.10.tgz" integrity sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA== dependencies: call-bind "^1.0.8" @@ -3875,7 +3803,7 @@ string.prototype.trim@^1.2.10: string.prototype.trimend@^1.0.9: version "1.0.9" - resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.9.tgz#62e2731272cd285041b36596054e9f66569b6942" + resolved "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.9.tgz" integrity sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ== dependencies: call-bind "^1.0.8" @@ -3885,76 +3813,69 @@ string.prototype.trimend@^1.0.9: string.prototype.trimstart@^1.0.8: version "1.0.8" - resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz#7ee834dda8c7c17eff3118472bb35bfedaa34dde" + resolved "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz" integrity sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg== dependencies: call-bind "^1.0.7" define-properties "^1.2.1" es-object-atoms "^1.0.0" -string_decoder@^1.1.1: - version "1.3.0" - resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" - integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== - dependencies: - safe-buffer "~5.2.0" - -string_decoder@~1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" - integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== +strip-ansi@^6.0.0: + version "6.0.1" + resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz" + integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== dependencies: - safe-buffer "~5.1.0" + ansi-regex "^5.0.1" -strip-ansi@^6.0.0, strip-ansi@^6.0.1: +strip-ansi@^6.0.1: version "6.0.1" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" + 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.1.0, strip-ansi@^7.1.2: version "7.1.2" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-7.1.2.tgz#132875abde678c7ea8d691533f2e7e22bb744dba" + resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz" integrity sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA== dependencies: ansi-regex "^6.0.1" strip-bom@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" + resolved "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz" integrity sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA== strip-final-newline@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-3.0.0.tgz#52894c313fbff318835280aed60ff71ebf12b8fd" + resolved "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz" integrity sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw== 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" + resolved "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz" integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== strip-json-comments@~2.0.1: version "2.0.1" - resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" + resolved "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz" integrity sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ== supports-color@^7.1.0: version "7.2.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" + 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-preserve-symlinks-flag@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" + resolved "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz" integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== tar-fs@^2.0.0: version "2.1.4" - resolved "https://registry.yarnpkg.com/tar-fs/-/tar-fs-2.1.4.tgz#800824dbf4ef06ded9afea4acafe71c67c76b930" + resolved "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.4.tgz" integrity sha512-mDAjwmZdh7LTT6pNleZ05Yt65HC3E+NiQzl672vQG38jIrehtJk/J3mNwIg+vShQPcLF/LV7CMnDW6vjj6sfYQ== dependencies: chownr "^1.1.1" @@ -3964,7 +3885,7 @@ tar-fs@^2.0.0: tar-fs@^3.1.1: version "3.1.1" - resolved "https://registry.yarnpkg.com/tar-fs/-/tar-fs-3.1.1.tgz#4f164e59fb60f103d472360731e8c6bb4a7fe9ef" + resolved "https://registry.npmjs.org/tar-fs/-/tar-fs-3.1.1.tgz" integrity sha512-LZA0oaPOc2fVo82Txf3gw+AkEd38szODlptMYejQUhndHMLQ9M059uXR+AfS7DNo0NpINvSqDsvyaCrBVkptWg== dependencies: pump "^3.0.0" @@ -3975,7 +3896,7 @@ tar-fs@^3.1.1: tar-stream@^2.1.4: version "2.2.0" - resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-2.2.0.tgz#acad84c284136b060dc3faa64474aa9aebd77287" + resolved "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz" integrity sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ== dependencies: bl "^4.0.3" @@ -3986,7 +3907,7 @@ tar-stream@^2.1.4: tar-stream@^3.1.5: version "3.1.7" - resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-3.1.7.tgz#24b3fb5eabada19fe7338ed6d26e5f7c482e792b" + resolved "https://registry.npmjs.org/tar-stream/-/tar-stream-3.1.7.tgz" integrity sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ== dependencies: b4a "^1.6.4" @@ -3995,7 +3916,7 @@ tar-stream@^3.1.5: tar@^7.5.7: version "7.5.7" - resolved "https://registry.yarnpkg.com/tar/-/tar-7.5.7.tgz#adf99774008ba1c89819f15dbd6019c630539405" + resolved "https://registry.npmjs.org/tar/-/tar-7.5.7.tgz" integrity sha512-fov56fJiRuThVFXD6o6/Q354S7pnWMJIVlDBYijsTNx6jKSE4pvrDTs6lUnmGvNyfJwFQQwWy3owKz1ucIhveQ== dependencies: "@isaacs/fs-minipass" "^4.0.0" @@ -4006,49 +3927,44 @@ tar@^7.5.7: text-decoder@^1.1.0: version "1.2.3" - resolved "https://registry.yarnpkg.com/text-decoder/-/text-decoder-1.2.3.tgz#b19da364d981b2326d5f43099c310cc80d770c65" + resolved "https://registry.npmjs.org/text-decoder/-/text-decoder-1.2.3.tgz" integrity sha512-3/o9z3X0X0fTupwsYvR03pJ/DjWuqqrfwBgTQzdWDiQSm9KitAyz/9WqsT2JQW7KV2m+bC2ol/zqpW37NHxLaA== dependencies: b4a "^1.6.4" tinyexec@^1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/tinyexec/-/tinyexec-1.0.2.tgz#bdd2737fe2ba40bd6f918ae26642f264b99ca251" + resolved "https://registry.npmjs.org/tinyexec/-/tinyexec-1.0.2.tgz" integrity sha512-W/KYk+NFhkmsYpuHq5JykngiOCnxeVL8v8dFnqxSD8qEEdRfXk1SDM6JzNqcERbcGYj9tMrDQBYV9cjgnunFIg== -tinyglobby@0.2.15, tinyglobby@^0.2.11, tinyglobby@^0.2.15: +tinyglobby@^0.2.11, tinyglobby@^0.2.15, tinyglobby@0.2.15: version "0.2.15" - resolved "https://registry.yarnpkg.com/tinyglobby/-/tinyglobby-0.2.15.tgz#e228dd1e638cea993d2fdb4fcd2d4602a79951c2" + resolved "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz" integrity sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ== dependencies: fdir "^6.5.0" picomatch "^4.0.3" -tmp@^0.2.4: - version "0.2.5" - resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.2.5.tgz#b06bcd23f0f3c8357b426891726d16015abfd8f8" - integrity sha512-voyz6MApa1rQGUxT3E+BK7/ROe8itEx7vD8/HEvt4xwXucvQ5G5oeEiHkmHZJuBO21RpOf+YYm9MOivj709jow== - to-regex-range@^5.0.1: version "5.0.1" - resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" + resolved "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz" integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== dependencies: is-number "^7.0.0" tr46@~0.0.3: version "0.0.3" - resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" + resolved "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz" integrity sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw== ts-api-utils@^2.4.0: version "2.4.0" - resolved "https://registry.yarnpkg.com/ts-api-utils/-/ts-api-utils-2.4.0.tgz#2690579f96d2790253bdcf1ca35d569ad78f9ad8" + resolved "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.4.0.tgz" integrity sha512-3TaVTaAv2gTiMB35i3FiGJaRfwb3Pyn/j3m/bfAvGe8FB7CF6u+LMYqYlDh7reQf7UNvoTvdfAqHGmPGOSsPmA== tsconfig-paths@^3.15.0: version "3.15.0" - resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz#5299ec605e55b1abb23ec939ef15edaf483070d4" + resolved "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz" integrity sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg== dependencies: "@types/json5" "^0.0.29" @@ -4058,31 +3974,31 @@ tsconfig-paths@^3.15.0: tslib@^2.0.1, tslib@^2.1.0: version "2.8.1" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.8.1.tgz#612efe4ed235d567e8aba5f2a5fab70280ade83f" + resolved "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz" integrity sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w== tunnel-agent@^0.6.0: version "0.6.0" - resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" + resolved "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz" integrity sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w== dependencies: safe-buffer "^5.0.1" type-check@^0.4.0, type-check@~0.4.0: version "0.4.0" - resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.4.0.tgz#07b8203bfa7056c0657050e3ccd2c37730bab8f1" + resolved "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz" integrity sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew== dependencies: prelude-ls "^1.2.1" type-fest@^2.5.1: version "2.19.0" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-2.19.0.tgz#88068015bb33036a598b952e55e9311a60fd3a9b" + resolved "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz" integrity sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA== typed-array-buffer@^1.0.3: version "1.0.3" - resolved "https://registry.yarnpkg.com/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz#a72395450a4869ec033fd549371b47af3a2ee536" + resolved "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz" integrity sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw== dependencies: call-bound "^1.0.3" @@ -4091,7 +4007,7 @@ typed-array-buffer@^1.0.3: typed-array-byte-length@^1.0.3: version "1.0.3" - resolved "https://registry.yarnpkg.com/typed-array-byte-length/-/typed-array-byte-length-1.0.3.tgz#8407a04f7d78684f3d252aa1a143d2b77b4160ce" + resolved "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.3.tgz" integrity sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg== dependencies: call-bind "^1.0.8" @@ -4102,7 +4018,7 @@ typed-array-byte-length@^1.0.3: typed-array-byte-offset@^1.0.4: version "1.0.4" - resolved "https://registry.yarnpkg.com/typed-array-byte-offset/-/typed-array-byte-offset-1.0.4.tgz#ae3698b8ec91a8ab945016108aef00d5bff12355" + resolved "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.4.tgz" integrity sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ== dependencies: available-typed-arrays "^1.0.7" @@ -4115,7 +4031,7 @@ typed-array-byte-offset@^1.0.4: typed-array-length@^1.0.7: version "1.0.7" - resolved "https://registry.yarnpkg.com/typed-array-length/-/typed-array-length-1.0.7.tgz#ee4deff984b64be1e118b0de8c9c877d5ce73d3d" + resolved "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.7.tgz" integrity sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg== dependencies: call-bind "^1.0.7" @@ -4127,22 +4043,22 @@ typed-array-length@^1.0.7: typedarray@^0.0.6: version "0.0.6" - resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" + resolved "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz" integrity sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA== typescript@^4.7.2: version "4.9.5" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.9.5.tgz#095979f9bcc0d09da324d58d03ce8f8374cbe65a" + resolved "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz" integrity sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g== uglify-js@^3.1.4: version "3.19.3" - resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.19.3.tgz#82315e9bbc6f2b25888858acd1fff8441035b77f" + resolved "https://registry.npmjs.org/uglify-js/-/uglify-js-3.19.3.tgz" integrity sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ== unbox-primitive@^1.1.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/unbox-primitive/-/unbox-primitive-1.1.0.tgz#8d9d2c9edeea8460c7f35033a88867944934d1e2" + resolved "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.1.0.tgz" integrity sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw== dependencies: call-bound "^1.0.3" @@ -4152,37 +4068,32 @@ unbox-primitive@^1.1.0: undici-types@~6.21.0: version "6.21.0" - resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-6.21.0.tgz#691d00af3909be93a7faa13be61b3a5b50ef12cb" + resolved "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz" integrity sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ== undici-types@~7.16.0: version "7.16.0" - resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-7.16.0.tgz#ffccdff36aea4884cbfce9a750a0580224f58a46" + resolved "https://registry.npmjs.org/undici-types/-/undici-types-7.16.0.tgz" integrity sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw== undici@6.23.0: version "6.23.0" - resolved "https://registry.yarnpkg.com/undici/-/undici-6.23.0.tgz#7953087744d9095a96f115de3140ca3828aff3a4" + resolved "https://registry.npmjs.org/undici/-/undici-6.23.0.tgz" integrity sha512-VfQPToRA5FZs/qJxLIinmU59u0r7LXqoJkCzinq3ckNJp3vKEh7jTWN589YQ5+aoAC/TGRLyJLCPKcLQbM8r9g== -universal-user-agent@^6.0.0: - version "6.0.1" - resolved "https://registry.yarnpkg.com/universal-user-agent/-/universal-user-agent-6.0.1.tgz#15f20f55da3c930c57bddbf1734c6654d5fd35aa" - integrity sha512-yCzhz6FN2wU1NiiQRogkTQszlQSlpWaw8SvVegAc+bDxbzHgh1vX8uIe8OYyMH6DwH+sdTJsgMl36+mSMdRJIQ== - -universal-user-agent@^7.0.0: +universal-user-agent@^7.0.0, universal-user-agent@^7.0.2: version "7.0.3" - resolved "https://registry.yarnpkg.com/universal-user-agent/-/universal-user-agent-7.0.3.tgz#c05870a58125a2dc00431f2df815a77fe69736be" + resolved "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-7.0.3.tgz" integrity sha512-TmnEAEAsBJVZM/AADELsK76llnwcf9vMKuPz8JflO1frO8Lchitr0fNaN9d+Ap0BjKtqWqd/J17qeDnXh8CL2A== universalify@^2.0.0: version "2.0.1" - resolved "https://registry.yarnpkg.com/universalify/-/universalify-2.0.1.tgz#168efc2180964e6386d061e094df61afe239b18d" + resolved "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz" integrity sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw== unzipper@^0.12.3: version "0.12.3" - resolved "https://registry.yarnpkg.com/unzipper/-/unzipper-0.12.3.tgz#31958f5eed7368ed8f57deae547e5a673e984f87" + resolved "https://registry.npmjs.org/unzipper/-/unzipper-0.12.3.tgz" integrity sha512-PZ8hTS+AqcGxsaQntl3IRBw65QrBI6lxzqDEL7IAo/XCEqRTKGfOX56Vea5TH9SZczRVxuzk1re04z/YjuYCJA== dependencies: bluebird "~3.7.2" @@ -4193,24 +4104,24 @@ unzipper@^0.12.3: uri-js@^4.2.2: version "4.4.1" - resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" + resolved "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz" integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== dependencies: punycode "^2.1.0" url-join@5.0.0: version "5.0.0" - resolved "https://registry.yarnpkg.com/url-join/-/url-join-5.0.0.tgz#c2f1e5cbd95fa91082a93b58a1f42fecb4bdbcf1" + resolved "https://registry.npmjs.org/url-join/-/url-join-5.0.0.tgz" integrity sha512-n2huDr9h9yzd6exQVnH/jU5mr+Pfx08LRXXZhkLLetAMESRj+anQsTAh940iMrIetKAmry9coFuZQ2jY8/p3WA== util-deprecate@^1.0.1, util-deprecate@~1.0.1: version "1.0.2" - resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" + resolved "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz" integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== validate-npm-package-license@^3.0.4: version "3.0.4" - resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz#fc91f6b9c7ba15c857f4cb2c5defeec39d4f410a" + resolved "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz" integrity sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew== dependencies: spdx-correct "^3.0.0" @@ -4218,17 +4129,17 @@ validate-npm-package-license@^3.0.4: walk-up-path@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/walk-up-path/-/walk-up-path-4.0.0.tgz#590666dcf8146e2d72318164f1f2ac6ef51d4198" + resolved "https://registry.npmjs.org/walk-up-path/-/walk-up-path-4.0.0.tgz" integrity sha512-3hu+tD8YzSLGuFYtPRb48vdhKMi0KQV5sn+uWr8+7dMEq/2G/dtLrdDinkLjqq5TIbIBjYJ4Ax/n3YiaW7QM8A== webidl-conversions@^3.0.0: version "3.0.1" - resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" + resolved "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz" integrity sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ== whatwg-url@^5.0.0: version "5.0.0" - resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-5.0.0.tgz#966454e8765462e37644d3626f6742ce8b70965d" + resolved "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz" integrity sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw== dependencies: tr46 "~0.0.3" @@ -4236,7 +4147,7 @@ whatwg-url@^5.0.0: which-boxed-primitive@^1.1.0, which-boxed-primitive@^1.1.1: version "1.1.1" - resolved "https://registry.yarnpkg.com/which-boxed-primitive/-/which-boxed-primitive-1.1.1.tgz#d76ec27df7fa165f18d5808374a5fe23c29b176e" + resolved "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.1.1.tgz" integrity sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA== dependencies: is-bigint "^1.1.0" @@ -4247,7 +4158,7 @@ which-boxed-primitive@^1.1.0, which-boxed-primitive@^1.1.1: which-builtin-type@^1.2.1: version "1.2.1" - resolved "https://registry.yarnpkg.com/which-builtin-type/-/which-builtin-type-1.2.1.tgz#89183da1b4907ab089a6b02029cc5d8d6574270e" + resolved "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.2.1.tgz" integrity sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q== dependencies: call-bound "^1.0.2" @@ -4266,7 +4177,7 @@ which-builtin-type@^1.2.1: which-collection@^1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/which-collection/-/which-collection-1.0.2.tgz#627ef76243920a107e7ce8e96191debe4b16c2a0" + resolved "https://registry.npmjs.org/which-collection/-/which-collection-1.0.2.tgz" integrity sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw== dependencies: is-map "^2.0.3" @@ -4276,7 +4187,7 @@ which-collection@^1.0.2: which-typed-array@^1.1.16, which-typed-array@^1.1.19: version "1.1.20" - resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.20.tgz#3fdb7adfafe0ea69157b1509f3a1cd892bd1d122" + resolved "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.20.tgz" integrity sha512-LYfpUkmqwl0h9A2HL09Mms427Q1RZWuOHsukfVcKRq9q95iQxdw0ix1JQrqbcDR9PH1QDwf5Qo8OZb5lksZ8Xg== dependencies: available-typed-arrays "^1.0.7" @@ -4289,36 +4200,36 @@ which-typed-array@^1.1.16, which-typed-array@^1.1.19: which@^2.0.1: version "2.0.2" - resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" + resolved "https://registry.npmjs.org/which/-/which-2.0.2.tgz" integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== dependencies: isexe "^2.0.0" wildcard-match@5.1.4: version "5.1.4" - resolved "https://registry.yarnpkg.com/wildcard-match/-/wildcard-match-5.1.4.tgz#26428c802f20743ebae255e4e9526ae81ddf1816" + resolved "https://registry.npmjs.org/wildcard-match/-/wildcard-match-5.1.4.tgz" integrity sha512-wldeCaczs8XXq7hj+5d/F38JE2r7EXgb6WQDM84RVwxy81T/sxB5e9+uZLK9Q9oNz1mlvjut+QtvgaOQFPVq/g== windows-release@^6.1.0: version "6.1.0" - resolved "https://registry.yarnpkg.com/windows-release/-/windows-release-6.1.0.tgz#cbe9fbcafbe25a2f94461096b725673a43394248" + resolved "https://registry.npmjs.org/windows-release/-/windows-release-6.1.0.tgz" integrity sha512-1lOb3qdzw6OFmOzoY0nauhLG72TpWtb5qgYPiSh/62rjc1XidBSDio2qw0pwHh17VINF217ebIkZJdFLZFn9SA== dependencies: execa "^8.0.1" word-wrap@^1.2.5: version "1.2.5" - resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.5.tgz#d2c45c6dd4fbce621a66f136cbe328afd0410b34" + resolved "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz" integrity sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA== wordwrap@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb" + resolved "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz" integrity sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q== wrap-ansi@^6.2.0: version "6.2.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-6.2.0.tgz#e9393ba07102e6c91a3b221478f0257cd2856e53" + resolved "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz" integrity sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA== dependencies: ansi-styles "^4.0.0" @@ -4327,7 +4238,7 @@ wrap-ansi@^6.2.0: wrap-ansi@^7.0.0: version "7.0.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" + resolved "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz" integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== dependencies: ansi-styles "^4.0.0" @@ -4336,7 +4247,7 @@ wrap-ansi@^7.0.0: wrap-ansi@^9.0.0: version "9.0.2" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-9.0.2.tgz#956832dea9494306e6d209eb871643bb873d7c98" + resolved "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.2.tgz" integrity sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww== dependencies: ansi-styles "^6.2.1" @@ -4345,44 +4256,44 @@ wrap-ansi@^9.0.0: wrappy@1: version "1.0.2" - resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" + resolved "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz" integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== wsl-utils@^0.1.0: version "0.1.0" - resolved "https://registry.yarnpkg.com/wsl-utils/-/wsl-utils-0.1.0.tgz#8783d4df671d4d50365be2ee4c71917a0557baab" + resolved "https://registry.npmjs.org/wsl-utils/-/wsl-utils-0.1.0.tgz" integrity sha512-h3Fbisa2nKGPxCpm89Hk33lBLsnaGBvctQopaBSOW/uIs6FTe1ATyAnKFJrzVs9vpGdsTe73WF3V4lIsk4Gacw== dependencies: is-wsl "^3.1.0" y18n@^5.0.5: version "5.0.8" - resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" + resolved "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz" integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== yallist@^5.0.0: version "5.0.0" - resolved "https://registry.yarnpkg.com/yallist/-/yallist-5.0.0.tgz#00e2de443639ed0d78fd87de0d27469fbcffb533" + resolved "https://registry.npmjs.org/yallist/-/yallist-5.0.0.tgz" integrity sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw== yaml@^2.7.0: version "2.8.2" - resolved "https://registry.yarnpkg.com/yaml/-/yaml-2.8.2.tgz#5694f25eca0ce9c3e7a9d9e00ce0ddabbd9e35c5" + resolved "https://registry.npmjs.org/yaml/-/yaml-2.8.2.tgz" integrity sha512-mplynKqc1C2hTVYxd0PU2xQAc22TI1vShAYGksCCfxbn/dFwnHTNi1bvYsBTkhdUNtGIf5xNOg938rrSSYvS9A== -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-parser@^20.2.2: version "20.2.9" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.9.tgz#2eb7dc3b0289718fc295f362753845c41a0c94ee" + resolved "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz" integrity sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w== +yargs-parser@21.1.1: + version "21.1.1" + resolved "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz" + integrity sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw== + yargs@^16.2.0: version "16.2.0" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-16.2.0.tgz#1c82bf0f6b6a66eafce7ef30e376f49a12477f66" + resolved "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz" integrity sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw== dependencies: cliui "^7.0.2" @@ -4395,15 +4306,15 @@ yargs@^16.2.0: yocto-queue@^0.1.0: version "0.1.0" - resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" + resolved "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz" integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== yoctocolors-cjs@^2.1.3: version "2.1.3" - resolved "https://registry.yarnpkg.com/yoctocolors-cjs/-/yoctocolors-cjs-2.1.3.tgz#7e4964ea8ec422b7a40ac917d3a344cfd2304baa" + resolved "https://registry.npmjs.org/yoctocolors-cjs/-/yoctocolors-cjs-2.1.3.tgz" integrity sha512-U/PBtDf35ff0D8X8D0jfdzHYEPFxAI7jJlxZXwCSez5M3190m+QobIfh+sWDWSHMCWWJN2AWamkegn6vr6YBTw== yoctocolors@^2.1.1: version "2.1.2" - resolved "https://registry.yarnpkg.com/yoctocolors/-/yoctocolors-2.1.2.tgz#d795f54d173494e7d8db93150cec0ed7f678c83a" + resolved "https://registry.npmjs.org/yoctocolors/-/yoctocolors-2.1.2.tgz" integrity sha512-CzhO+pFNo8ajLM2d2IW/R93ipy99LWjtwblvC1RsoSUMZgyLbYFr221TnSNT7GjGdYui6P459mw9JH/g/zW2ug== From c2d3b918e8ede7bf6ae3990ed15c8d8150170dd7 Mon Sep 17 00:00:00 2001 From: robertsLando Date: Wed, 8 Apr 2026 09:58:09 +0200 Subject: [PATCH 23/41] fix: avoid eager file loading and unnecessary temp files in SEA walker - Narrow SEA mode read condition to JS/ESM files only, preventing binary assets (.node, images) from being loaded into memory - Add bodyModified flag to FileRecord to track intentional modifications (patches, package.json rewrites) vs mere reads - Use bodyModified in generateSeaAssets instead of body != null so unmodified files reference source paths directly Co-Authored-By: Claude Opus 4.6 (1M context) --- lib/sea-assets.ts | 6 +++--- lib/types.ts | 1 + lib/walker.ts | 5 ++++- 3 files changed, 8 insertions(+), 4 deletions(-) diff --git a/lib/sea-assets.ts b/lib/sea-assets.ts index 31a11e41f..c63906330 100644 --- a/lib/sea-assets.ts +++ b/lib/sea-assets.ts @@ -77,8 +77,8 @@ export async function generateSeaAssets( // Map file content to SEA asset if (record[STORE_CONTENT]) { - if (record.body != null) { - // File was modified (patches, rewrites) — write to temp file + if (record.bodyModified) { + // File was intentionally modified (patches, package.json rewrites) — write to temp file const tempPath = join( tmpDir, 'assets', @@ -89,7 +89,7 @@ export async function generateSeaAssets( const content = typeof record.body === 'string' ? Buffer.from(record.body) - : record.body; + : record.body!; await writeFile(tempPath, content); assets[key] = tempPath; } else { diff --git a/lib/types.ts b/lib/types.ts index 7b2a0d4e4..c9fe345a5 100644 --- a/lib/types.ts +++ b/lib/types.ts @@ -4,6 +4,7 @@ export interface FileRecord { file: string; body?: Buffer | string; wasTransformed?: boolean; // Track if .mjs was transformed to CJS + bodyModified?: boolean; // Track if body was intentionally modified (patches, package.json rewrites) // This could be improved a bit. making this stricter opens up a lot of // changes that need to be made throughout the code though // eslint-disable-next-line @typescript-eslint/no-explicit-any diff --git a/lib/walker.ts b/lib/walker.ts index 0a7808c95..9c26bc88e 100644 --- a/lib/walker.ts +++ b/lib/walker.ts @@ -755,6 +755,7 @@ class Walker { } record.body = body; + record.bodyModified = true; } async stepDerivatives_ALIAS_AS_RELATIVE( @@ -989,7 +990,8 @@ class Walker { if ( store === STORE_BLOB || - this.params.seaMode || + (this.params.seaMode && + (isDotJS(record.file) || isESMFile(record.file))) || (store === STORE_CONTENT && isPackageJson(record.file)) || this.hasPatch(record) ) { @@ -1079,6 +1081,7 @@ class Walker { JSON.stringify(pkgContent, null, 2), 'utf8', ); + record.bodyModified = true; } } catch (_error) { // Ignore JSON parsing errors From 2cdf1008f30fa656e82b935915b235293bd0a19e Mon Sep 17 00:00:00 2001 From: robertsLando Date: Wed, 8 Apr 2026 09:58:38 +0200 Subject: [PATCH 24/41] fix: pass defaultEntrypoint in SEA bootstrap for API consistency Co-Authored-By: Claude Opus 4.6 (1M context) --- prelude/sea-bootstrap.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/prelude/sea-bootstrap.js b/prelude/sea-bootstrap.js index 604d3a696..eb4c63b21 100644 --- a/prelude/sea-bootstrap.js +++ b/prelude/sea-bootstrap.js @@ -33,7 +33,7 @@ shared.patchDlopen(insideSnapshot); shared.patchChildProcess(entrypoint); // process.pkg setup (shared with traditional bootstrap) -shared.setupProcessPkg(entrypoint); +shared.setupProcessPkg(entrypoint, manifest.entrypoint); // ///////////////////////////////////////////////////////////////// // DIAGNOSTICS ///////////////////////////////////////////////////// From 8293cf82709e2e180135230fe2eb75e73fc779ad Mon Sep 17 00:00:00 2001 From: robertsLando Date: Wed, 8 Apr 2026 09:58:50 +0200 Subject: [PATCH 25/41] feat: add snapshotify function to convert file paths to snapshot paths --- lib/common.ts | 6 ++++++ lib/sea.ts | 6 +++++- 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/lib/common.ts b/lib/common.ts index 058aa779a..e6d70b1d5 100644 --- a/lib/common.ts +++ b/lib/common.ts @@ -189,6 +189,12 @@ export function substituteDenominator(f: string, denominator: number) { return f.slice(0, rootLength) + f.slice(denominator); } +/** + * Converts a file path to a snapshot path by replacing slashes and injecting the snapshot prefix. + * @param file - The file path to convert + * @param slash - The slash character to use for replacement + * @returns The converted snapshot file path + */ export function snapshotify(file: string, slash: string) { return injectSnapshot(replaceSlashes(file, slash)); } diff --git a/lib/sea.ts b/lib/sea.ts index c5485b928..2ab26ad01 100644 --- a/lib/sea.ts +++ b/lib/sea.ts @@ -406,7 +406,11 @@ async function withSeaTmpDir( } } -/** Validate that the host Node.js version supports SEA */ +/** + * Validate that the host Node.js version supports SEA. + * Although node:sea is stable from Node 20, pkg requires 22+ to align with + * engines.node and the @platformatic/vfs dependency. + */ function assertSeaNodeVersion() { const nodeMajor = parseInt(process.version.slice(1).split('.')[0], 10); if (nodeMajor < 22) { From d7229f7501085619fd894d7bbac5c69a1a6592c6 Mon Sep 17 00:00:00 2001 From: robertsLando Date: Wed, 8 Apr 2026 09:59:23 +0200 Subject: [PATCH 26/41] docs: fix version comments and Node 22 requirement notes - Clarify --build-sea is available from Node 25.5+, not 25.0 - Add JSDoc note explaining why SEA requires Node 22+ despite node:sea being stable from Node 20 - Clarify node:sea row in ARCHITECTURE.md ecosystem table Co-Authored-By: Claude Opus 4.6 (1M context) --- docs/ARCHITECTURE.md | 2 +- lib/sea.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/ARCHITECTURE.md b/docs/ARCHITECTURE.md index a185f9023..bb1f734e2 100644 --- a/docs/ARCHITECTURE.md +++ b/docs/ARCHITECTURE.md @@ -436,7 +436,7 @@ For users who require code protection with SEA mode: | Dependency | Purpose | Status | | ---------------------- | ------------------------------------------------------------- | -------------------------------------------------------------------------------------- | -| `node:sea` API | Asset storage and retrieval in SEA executables | Stable, Node 20+ | +| `node:sea` API | Asset storage and retrieval in SEA executables | Stable, Node 20+ (pkg requires 22+, aligned with `engines.node`) | | `@platformatic/vfs` | VFS polyfill — patches `fs`, `fs/promises`, and module loader | Published, Node 22+, maintained by Matteo Collina | | `postject` | Injects `NODE_SEA_BLOB` resource into executables | Stable, used by Node.js project | | `--build-sea` flag | Single-step SEA blob generation | Node 25.5+ | diff --git a/lib/sea.ts b/lib/sea.ts index 2ab26ad01..2d0422321 100644 --- a/lib/sea.ts +++ b/lib/sea.ts @@ -423,7 +423,7 @@ function assertSeaNodeVersion() { /** * Generate the SEA blob from a sea-config.json file. - * Uses --build-sea on Node >= 25 with fallback to --experimental-sea-config. + * Uses --build-sea on Node >= 25.5 with fallback to --experimental-sea-config. */ async function generateSeaBlob(seaConfigFilePath: string, nodeMajor: number) { if (nodeMajor >= 25) { From 1e80fed1eeef82aa83bba8e327a6d31b96a99aaa Mon Sep 17 00:00:00 2001 From: robertsLando Date: Wed, 8 Apr 2026 10:04:17 +0200 Subject: [PATCH 27/41] refactor: reuse replaceSlashes from common.ts instead of duplicate toPosixKey Co-Authored-By: Claude Opus 4.6 (1M context) --- lib/common.ts | 2 +- lib/sea-assets.ts | 19 ++++++++++--------- 2 files changed, 11 insertions(+), 10 deletions(-) diff --git a/lib/common.ts b/lib/common.ts index e6d70b1d5..f94361d46 100644 --- a/lib/common.ts +++ b/lib/common.ts @@ -113,7 +113,7 @@ export function unlikelyJavascript(file: string): boolean { return false; } -function replaceSlashes(file: string, slash: string) { +export function replaceSlashes(file: string, slash: string) { if (/^.:\\/.test(file)) { if (slash === '/') { return file.slice(2).replace(/\\/g, '/'); diff --git a/lib/sea-assets.ts b/lib/sea-assets.ts index c63906330..1ba52c528 100644 --- a/lib/sea-assets.ts +++ b/lib/sea-assets.ts @@ -1,7 +1,13 @@ import { mkdir, writeFile } from 'fs/promises'; import { dirname, join } from 'path'; -import { STORE_CONTENT, STORE_LINKS, STORE_STAT, snapshotify } from './common'; +import { + STORE_CONTENT, + STORE_LINKS, + STORE_STAT, + replaceSlashes, + snapshotify, +} from './common'; import { FileRecords, SymLinks } from './types'; export interface SeaManifest { @@ -21,15 +27,10 @@ export interface SeaAssetsResult { } // Normalize a refiner path to a platform-independent POSIX key. -// On Windows the refiner keeps the drive letter (e.g. 'D:\foo\bar.js'); -// we strip it and convert separators so all manifest/asset keys are POSIX -// (e.g. '/foo/bar.js') — the bootstrap normalises VFS-received paths to -// the same format before lookup. +// Reuses replaceSlashes from common.ts which strips the drive letter and +// converts separators on Windows (e.g. 'D:\foo\bar.js' → '/foo/bar.js'). function toPosixKey(p: string): string { - if (process.platform === 'win32') { - return p.slice(2).replace(/\\/g, '/'); - } - return p; + return replaceSlashes(p, '/'); } /** From 2801ce4252425a1b53770ee852cd8522db6c9f2a Mon Sep 17 00:00:00 2001 From: robertsLando Date: Wed, 8 Apr 2026 11:18:26 +0200 Subject: [PATCH 28/41] fix: handle VFS-incompatible fs calls in SEA bootstrap Two fixes for the SEA runtime bootstrap: 1. Replace fs.copyFileSync with readFileSync+writeFileSync in the dlopen patch's cpRecursive helper. copyFileSync is not routed through the VFS in overlay mode, causing ENOENT when extracting native addon packages from the snapshot. 2. Wrap fs.realpathSync in try-catch in the diagnostic dumpLevel function. realpathSync can fail on VFS paths, crashing the DEBUG_PKG tree dump. Co-Authored-By: Claude Opus 4.6 (1M context) --- prelude/bootstrap-shared.js | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/prelude/bootstrap-shared.js b/prelude/bootstrap-shared.js index ffbab4d44..9634c2d59 100644 --- a/prelude/bootstrap-shared.js +++ b/prelude/bootstrap-shared.js @@ -72,7 +72,9 @@ function patchDlopen(insideSnapshot) { ); } } else { - fs.copyFileSync(src, dest); + // Use readFileSync+writeFileSync instead of copyFileSync because + // copyFileSync may not be routed through the VFS in SEA mode. + fs.writeFileSync(dest, fs.readFileSync(src)); } })(modulePkgFolder, destFolder); } @@ -307,7 +309,12 @@ function installDiagnostic(snapshotPrefix) { var d = fs.readdirSync(filename); for (var j = 0; j < d.length; j += 1) { var f = path.join(filename, d[j]); - var realPath = fs.realpathSync(f); + var realPath; + try { + realPath = fs.realpathSync(f); + } catch (_) { + realPath = f; + } var isSymbolicLink = f !== realPath; var s = fs.statSync(f); From ebc11626c27692f7e796ecfd2187756f40a035fc Mon Sep 17 00:00:00 2001 From: robertsLando Date: Wed, 8 Apr 2026 14:10:07 +0200 Subject: [PATCH 29/41] feat: add SKILL.md for packaging performance benchmarks comparison --- .claude/skills/performances-compare/SKILL.md | 300 +++++++++++++++++++ 1 file changed, 300 insertions(+) create mode 100644 .claude/skills/performances-compare/SKILL.md diff --git a/.claude/skills/performances-compare/SKILL.md b/.claude/skills/performances-compare/SKILL.md new file mode 100644 index 000000000..a477d26d8 --- /dev/null +++ b/.claude/skills/performances-compare/SKILL.md @@ -0,0 +1,300 @@ +--- +name: performances-compare +description: Run packaging performance benchmarks comparing Standard PKG vs SEA modes (with/without bundling) on a Node.js project. Default target is zwave-js-ui. Measures build time, binary size, and startup time. +user-invocable: true +disable-model-invocation: true +argument-hint: [project-path] +allowed-tools: Read Bash Grep Glob Agent Edit Write TaskCreate TaskUpdate TaskGet TaskList +effort: high +--- + +# Packaging Performance Comparison + +Compare packaging performance across 4 methods using `@yao-pkg/pkg`: + +1. **Standard PKG (no bundle)** - Traditional pkg with bytecode, no pre-bundling +2. **Standard PKG (with bundle)** - esbuild pre-bundle then pkg with bytecode +3. **SEA with bundle** - esbuild pre-bundle then `pkg --sea` (enhanced VFS, no bytecode) +4. **SEA without bundle** - `pkg --sea` directly on the project (walker intercepts all files) + +## Arguments + +- `$0` (optional) - Absolute path to the target project. If omitted, defaults to the **zwave-js-ui** project. + +## Default Target: zwave-js-ui + +[zwave-js-ui](https://github.com/zwave-js/zwave-js-ui) is an open-source Z-Wave control panel and MQTT gateway. It's the primary benchmark target because: + +- It's a large real-world ESM Node.js project +- It uses native addons (`@serialport/bindings-cpp`) +- It has complex dependency trees (`zwave-js`, `@zwave-js/*`) +- It has both CJS and ESM dependencies +- It uses package.json `exports` with wildcards and `#imports` + +### zwave-js-ui Setup + +The project must be cloned and built before running benchmarks. If not already available: + +```bash +git clone https://github.com/zwave-js/zwave-js-ui.git +cd +npm ci +npm run build # Compiles TypeScript (server/) and Vite frontend (dist/) +``` + +### zwave-js-ui Project Structure + +- **Entry point**: `server/bin/www.js` (compiled JS, ESM) +- **TypeScript source**: `api/bin/www.ts` +- **Frontend**: `dist/` (Vite build output) +- **Package type**: `"type": "module"` (ESM) +- **Node engine**: `>= 20.19` +- **Store directory**: `store/` (relative to CWD, contains `settings.json`) +- **Listening indicator**: Prints `Listening on port 8091` when ready + +### zwave-js-ui Bundle Process + +The project uses **esbuild** to pre-bundle for pkg. The bundler script is `esbuild.js`: + +```bash +cd +node esbuild.js --js-entrypoint # Use --js-entrypoint to bundle from compiled JS +``` + +This produces a `build/` directory containing: + +- `build/index.js` - Single bundled entry point +- `build/package.json` - Patched package.json with `bin: "index.js"` and pkg assets config +- `build/node_modules/` - External dependencies that can't be bundled: + - `@serialport/bindings-cpp/prebuilds` (native addon prebuilts) + - `zwave-js/package.json` + - `@zwave-js/server/package.json` + - `@zwave-js/config/package.json` and `@zwave-js/config/config/` (device database) + - `@zwave-js/config/build/` (compiled config module) +- `build/dist/` - Frontend assets +- `build/snippets/` - Code snippets + +The bundle process: + +1. esbuild bundles `server/bin/www.js` into `build/index.js` (CJS output) +2. Native `.node` files are handled by a custom esbuild plugin (excluded from bundle, path-rewritten) +3. External dependencies are copied to `build/node_modules/` +4. `package.json` is patched: devDependencies/scripts removed, `bin` set to `index.js`, pkg assets configured + +When running pkg from the bundle: + +```bash +cd build +pkg . -t node22-linux-x64 --output # Standard PKG +pkg . --sea -t node22-linux-x64 --output # SEA mode +``` + +### zwave-js-ui pkg Configuration + +The project's `package.json` contains pkg config for the non-bundled case: + +```json +{ + "pkg": { + "scripts": ["server/**/*", "node_modules/axios/dist/node/*"], + "assets": [ + "dist/**/*", + "snippets/**", + "node_modules/@serialport/**", + "node_modules/@zwave-js/serial/node_modules/@serialport/**", + "node_modules/zwave-js/node_modules/@serialport/**", + "node_modules/@zwave-js/config/config/**" + ] + } +} +``` + +## Procedure + +### 1. Setup + +- Determine project path: use `$0` if provided, otherwise look for zwave-js-ui adjacent to the pkg repo (e.g., `../zwave-js-ui`) +- Verify the project exists and has a valid `package.json` with a `bin` entry +- Create a temporary benchmark output directory: `/tmp/pkg-bench-/` +- Copy `store/settings.json` from the project to `/tmp/pkg-bench-/store/settings.json` +- Verify the project is built (check `server/bin/www.js` and `dist/index.html` exist) +- If not built, run `npm run build` in the project + +### 2. Link local pkg + +Run from the **pkg** repo directory: + +```bash +npm run build # Ensure pkg is built +``` + +Use the local pkg binary directly: + +```bash +node /lib-es5/bin.js ... # Avoids npx re-installing from npm +``` + +### 3. Run benchmarks + +Create the benchmark output directory and run each method, measuring wall-clock time with `date +%s%N`. + +**IMPORTANT: Run each build method 3 times** and report the average. Build times can vary significantly due to disk cache, CPU thermal throttling, and background processes. The first run warms caches; subsequent runs give more stable numbers. Report all individual times and the average. + +#### Method A: Standard PKG (no bundle) + +```bash +cd +START=$(date +%s%N) +node /lib-es5/bin.js . --options experimental-require-module \ + -t node22-linux-x64 --output /pkg-nobundle +END=$(date +%s%N) +``` + +Note: This typically **fails for ESM projects** with `ReferenceError: module is not defined in ES module scope` because the bytecode compiler can't handle ESM syntax. Record the failure and note it in results. + +#### Method B: Standard PKG (with bundle) + +```bash +cd +START=$(date +%s%N) +node esbuild.js --js-entrypoint +cd build +node /lib-es5/bin.js . --options experimental-require-module \ + -t node22-linux-x64 --output /pkg-bundle +END=$(date +%s%N) +``` + +Build time = esbuild + pkg combined. + +#### Method C: SEA with bundle + +```bash +cd +START=$(date +%s%N) +node esbuild.js --js-entrypoint +cd build +node /lib-es5/bin.js . --sea \ + -t node22-linux-x64 --output /sea-bundle +END=$(date +%s%N) +``` + +Build time = esbuild + SEA combined. + +#### Method D: SEA without bundle + +```bash +cd +START=$(date +%s%N) +node /lib-es5/bin.js . --sea \ + -t node22-linux-x64 --output /sea-nobundle +END=$(date +%s%N) +``` + +### 4. Measure startup time + +For each produced binary, measure the time until the application is ready. Use this measurement function: + +```bash +measure_startup() { + local binary="$1" + local label="$2" + local port="${3:-8091}" + local ready_pattern="${4:-Listening on port}" + + fuser -k $port/tcp 2>/dev/null 2>&1; sleep 0.3 + + local START=$(date +%s%N) + $binary > /tmp/pkg-bench-out.log 2>&1 & + local PID=$! + + while ! grep -q "$ready_pattern" /tmp/pkg-bench-out.log 2>/dev/null; do + sleep 0.01 + if ! kill -0 $PID 2>/dev/null; then + echo "$label: FAILED (process died)" + return + fi + done + + local END=$(date +%s%N) + kill $PID 2>/dev/null; wait $PID 2>/dev/null + echo "$label: $(( (END - START) / 1000000 ))ms" +} +``` + +For each working binary: + +1. Copy `store/settings.json` next to the binary in a `store/` subdirectory +2. Clear native addon cache before the first run of each method: `rm -rf ~/.cache/pkg/` +3. **Run 5 times per binary**. Discard the first run (cold cache outlier). Average the remaining 4 runs. +4. Between runs, kill the previous process and free the port: `fuser -k 8091/tcp; sleep 0.3` +5. Report all individual run times and the computed average + +Example: + +```bash +rm -rf ~/.cache/pkg/ +for i in 1 2 3 4 5; do measure_startup ./sea-bundle "Run $i"; done +# Average = (Run2 + Run3 + Run4 + Run5) / 4 +``` + +### 5. Report + +Present results as a markdown table. All times should be averages from multiple runs (3 for build, 4 for startup after discarding cold run): + +``` +| Method | Build Time (avg of 3) | Binary Size | Startup (avg of 4) | Status | +|-----------------------------|-----------------------|-------------|---------------------|--------| +| Standard PKG (no bundle) | Xs | X MB | Xms | OK/FAIL| +| Standard PKG (with bundle) | Xs | X MB | Xms | OK | +| SEA with bundle | Xs | X MB | Xms | OK | +| SEA without bundle | Xs | X MB | Xms | OK | +``` + +Also include a raw data section below the summary table showing every individual run: + +``` +### Raw Data + +#### Build Times +| Method | Run 1 | Run 2 | Run 3 | Average | +|--------|-------|-------|-------|---------| +| ... | Xs | Xs | Xs | Xs | + +#### Startup Times +| Method | Run 1 (cold) | Run 2 | Run 3 | Run 4 | Run 5 | Average (2-5) | +|--------|-------------|-------|-------|-------|-------|---------------| +| ... | Xms | Xms | Xms | Xms | Xms | Xms | +``` + +Include analysis: + +- **Fastest build**: typically SEA+bundle (skips bytecode compilation) +- **Smallest binary**: typically PKG+bundle (bytecode is more compact than source) +- **Fastest startup**: typically PKG+bundle (bytecode pre-compiled) or SEA+bundle +- **ESM support**: SEA without bundle handles ESM natively; standard PKG without bundle typically fails +- **Trade-offs**: SEA preserves source code (no obfuscation), larger binaries; PKG has bytecode but ESM limitations + +### 6. Cleanup + +- Remove the temporary benchmark directory +- Kill any remaining benchmark processes on port 8091: `fuser -k 8091/tcp` +- Optionally clean up `build/` directory in the target project: `rm -rf /build` + +## Adapting for Other Projects + +To use with a non-zwave-js-ui project, the user must provide: + +1. The path to the project as `$0` +2. The project must have a `package.json` with a `bin` field +3. For bundled methods, the project needs an esbuild/bundler setup. Adjust the bundle command accordingly. +4. Change the `ready_pattern` in `measure_startup` to match the project's ready message (e.g., `"Server started"`, `"listening on"`) +5. Change the `port` if the project uses a different port + +## Known Behaviors + +- Standard PKG (no bundle) fails for ESM projects (`"type": "module"`) because the V8 bytecode compiler can't handle ESM syntax. This is expected. +- SEA without bundle produces the largest binaries because it includes ALL project files (including devDependencies assets, .d.ts files, etc.) +- SEA without bundle has the slowest startup because it loads thousands of individual files from the VFS on demand +- Binary sizes include the Node.js runtime (~110MB base for linux-x64) +- The `warning: Can't find string offset for section name '.note.100'` messages during SEA injection are harmless +- Native addon `.node` files are extracted to `~/.cache/pkg/` on first run (adds ~200ms to cold start) From 3d0b11869775b48e928651f63f53d4bdb68f924d Mon Sep 17 00:00:00 2001 From: robertsLando Date: Wed, 8 Apr 2026 14:44:31 +0200 Subject: [PATCH 30/41] perf: optimize SEA provider startup and add DEBUG_PKG_PERF instrumentation Optimize the SEAProvider hot paths for large projects (~20% faster startup): - Override internalModuleStat() with O(1) manifest lookup, bypassing the MemoryProvider tree walk (~30K calls saved for zwave-js-ui) - Override statSync() to return lightweight stat objects from the manifest - Cache readFileSync() results in a flat Map, bypassing MemoryProvider write+read roundtrip. Returns Buffer copies to prevent cache corruption. - Override existsSync() with pure manifest lookup Add DEBUG_PKG_PERF=1 runtime instrumentation (works on any SEA binary, no --debug build required). Reports phase timings (manifest parse, directory tree init, module loading) and provider counters (files loaded, stat/exists/readdir calls, sea.getRawAsset cumulative time). Co-Authored-By: Claude Opus 4.6 (1M context) --- prelude/bootstrap-shared.js | 8 + prelude/sea-bootstrap.js | 23 +++ prelude/sea-vfs-setup.js | 309 ++++++++++++++++++++++++++++++++---- 3 files changed, 311 insertions(+), 29 deletions(-) diff --git a/prelude/bootstrap-shared.js b/prelude/bootstrap-shared.js index 9634c2d59..ab39cd420 100644 --- a/prelude/bootstrap-shared.js +++ b/prelude/bootstrap-shared.js @@ -290,6 +290,14 @@ function humanSize(bytes) { * DEBUG_PKG=1 — dump the virtual file system tree and oversized files * DEBUG_PKG=2 — also wrap every fs/fs.promises call with console.log * + * Note: DEBUG_PKG requires the binary to be built with --debug / -d. + * + * Additionally, for SEA binaries (any build, not just --debug): + * + * DEBUG_PKG_PERF=1 — print VFS performance report at startup showing + * phase timings (manifest parse, module loading, etc.) + * and provider counters (files loaded, stat calls, etc.) + * * @param {string} snapshotPrefix The snapshot mount prefix ('/snapshot' or 'C:\\snapshot'). */ function installDiagnostic(snapshotPrefix) { diff --git a/prelude/sea-bootstrap.js b/prelude/sea-bootstrap.js index eb4c63b21..7fc7a993c 100644 --- a/prelude/sea-bootstrap.js +++ b/prelude/sea-bootstrap.js @@ -17,6 +17,7 @@ var shared = require('./bootstrap-shared'); // ///////////////////////////////////////////////////////////////// var vfs = require('./sea-vfs-setup'); +var perf = vfs.perf; var manifest = vfs.manifest; var entrypoint = vfs.toPlatformPath(manifest.entrypoint); var insideSnapshot = vfs.insideSnapshot; @@ -124,6 +125,15 @@ if (manifest.debug) { // ENTRYPOINT ////////////////////////////////////////////////////// // ///////////////////////////////////////////////////////////////// +// Sum VFS setup sub-phases into a single rollup. This does NOT include the +// shared patches (dlopen, child_process, etc.) or worker thread setup. +if (perf.enabled) { + perf._durations['vfs setup total'] = + (perf._durations['manifest parse'] || 0n) + + (perf._durations['directory tree init'] || 0n) + + (perf._durations['vfs mount + hooks'] || 0n); +} + process.argv[1] = entrypoint; Module._cache = Object.create(null); try { @@ -131,4 +141,17 @@ try { } catch (_) { // process.mainModule may become read-only in future Node.js versions } + +// Record the module loading phase — the time between runMain and the first +// event loop tick is dominated by parsing/compiling JS and resolving imports. +perf.start('module loading'); +if (perf.enabled) { + setTimeout(function () { + perf.end('module loading'); + // file cache entries counter + perf.count('file cache entries', vfs.provider._fileCache.size); + perf.report(); + }, 0); +} + Module.runMain(); diff --git a/prelude/sea-vfs-setup.js b/prelude/sea-vfs-setup.js index 9dca78db4..d1458c262 100644 --- a/prelude/sea-vfs-setup.js +++ b/prelude/sea-vfs-setup.js @@ -21,6 +21,130 @@ try { var VirtualFileSystem = vfsModule.VirtualFileSystem; var MemoryProvider = vfsModule.MemoryProvider; +// ///////////////////////////////////////////////////////////////// +// PERFORMANCE INSTRUMENTATION ///////////////////////////////////// +// ///////////////////////////////////////////////////////////////// +// +// Enabled by setting DEBUG_PKG_PERF=1 at runtime. Unlike DEBUG_PKG +// (which requires a --debug build), perf tracing works on any SEA binary. +// +// DEBUG_PKG_PERF=1 ./my-app +// +// Output example: +// +// [pkg:perf] phase time +// [pkg:perf] ────────────────────────────── +// [pkg:perf] manifest parse 14.0ms +// [pkg:perf] directory tree init 20.5ms +// [pkg:perf] vfs mount + hooks 3.3ms +// [pkg:perf] vfs setup total 38.6ms +// [pkg:perf] module loading 1730.1ms +// [pkg:perf] +// [pkg:perf] counter value +// [pkg:perf] ────────────────────────────── +// [pkg:perf] files loaded 1776 +// [pkg:perf] file cache entries 1776 +// [pkg:perf] sea.getRawAsset() 1047.6ms +// [pkg:perf] statSync calls 0 +// [pkg:perf] existsSync calls 1540 +// [pkg:perf] readdirSync calls 0 + +var perf = { + enabled: !!process.env.DEBUG_PKG_PERF, + // Phase timers (high-resolution) + _timers: {}, + // Cumulative counters + _counters: {}, + // Cumulative durations (BigInt nanoseconds) + _durations: {}, + + /** Mark the start of a named phase. */ + start: function (label) { + if (!this.enabled) return; + this._timers[label] = process.hrtime.bigint(); + }, + + /** End a named phase and record its duration. */ + end: function (label) { + if (!this.enabled || !this._timers[label]) return; + var ns = process.hrtime.bigint() - this._timers[label]; + this._durations[label] = (this._durations[label] || 0n) + ns; + }, + + /** Increment a named counter by n (default 1). */ + count: function (label, n) { + if (!this.enabled) return; + this._counters[label] = + (this._counters[label] || 0) + (n !== undefined ? n : 1); + }, + + /** Add nanoseconds to a cumulative duration counter. */ + addNs: function (label, ns) { + if (!this.enabled) return; + this._durations[label] = (this._durations[label] || 0n) + ns; + }, + + /** Format milliseconds from a BigInt nanosecond duration. */ + _ms: function (ns) { + return (Number(ns) / 1e6).toFixed(1) + 'ms'; + }, + + /** Print the final performance report. */ + report: function () { + if (!this.enabled) return; + var self = this; + var P = '[pkg:perf] '; + var SEP = P + '\u2500'.repeat(30); + + console.log(''); + console.log(P + 'phase time'); + console.log(SEP); + var phaseOrder = [ + 'manifest parse', + 'directory tree init', + 'vfs mount + hooks', + 'vfs setup total', + 'module loading', + ]; + phaseOrder.forEach(function (label) { + var d = self._durations[label]; + if (d !== undefined) { + console.log(P + label.padEnd(22) + self._ms(d)); + } + }); + + console.log(P); + console.log(P + 'counter value'); + console.log(SEP); + var counterOrder = [ + 'files loaded', + 'file cache entries', + 'sea.getRawAsset()', + 'statSync calls', + 'existsSync calls', + 'readdirSync calls', + ]; + counterOrder.forEach(function (label) { + var v = self._counters[label]; + var d = self._durations[label]; + if (v !== undefined) { + console.log(P + label.padEnd(22) + String(v).padStart(8)); + } else if (d !== undefined) { + console.log(P + label.padEnd(22) + self._ms(d).padStart(8)); + } else { + // Show zero for expected counters that were never incremented + console.log(P + label.padEnd(22) + String(0).padStart(8)); + } + }); + console.log(''); + }, +}; + +// ///////////////////////////////////////////////////////////////// +// MANIFEST //////////////////////////////////////////////////////// +// ///////////////////////////////////////////////////////////////// + +perf.start('manifest parse'); var manifest; try { manifest = JSON.parse(sea.getAsset('__pkg_manifest__', 'utf8')); @@ -29,33 +153,150 @@ try { 'pkg: Failed to load VFS manifest from SEA assets: ' + e.message, ); } +perf.end('manifest parse'); // Manifest keys are always POSIX (forward slashes, no drive letter). function toManifestKey(p) { return p.replace(/\\/g, '/'); } -// Custom provider that reads from SEA assets lazily. +function _enoent(syscall, filePath) { + var err = new Error( + 'ENOENT: no such file or directory, ' + syscall + " '" + filePath + "'", + ); + err.code = 'ENOENT'; + err.errno = -2; + err.syscall = syscall; + err.path = filePath; + return err; +} + +// ///////////////////////////////////////////////////////////////// +// SEA PROVIDER //////////////////////////////////////////////////// +// ///////////////////////////////////////////////////////////////// + +// Lightweight stat factory — creates objects compatible with Node.js fs.Stats. +// The module resolution hot path uses internalModuleStat() instead, which +// returns only 0/1/-2 from the manifest without allocating stat objects. +var _now = Date.now(); +function _makeStats(meta) { + return { + dev: 0, + ino: 0, + nlink: 1, + uid: 0, + gid: 0, + rdev: 0, + blksize: 4096, + mode: meta.isDirectory ? 0o40755 : 0o100644, + size: meta.size || 0, + blocks: Math.ceil((meta.size || 0) / 512), + atimeMs: _now, + mtimeMs: _now, + ctimeMs: _now, + birthtimeMs: _now, + atime: new Date(_now), + mtime: new Date(_now), + ctime: new Date(_now), + birthtime: new Date(_now), + isFile: function () { + return meta.isFile; + }, + isDirectory: function () { + return meta.isDirectory; + }, + isSymbolicLink: function () { + return false; + }, + isBlockDevice: function () { + return false; + }, + isCharacterDevice: function () { + return false; + }, + isFIFO: function () { + return false; + }, + isSocket: function () { + return false; + }, + }; +} + +/** + * SEA asset provider — reads files lazily from the SEA binary. + * + * Performance design: + * + * - internalModuleStat() O(1) manifest hash lookup (no tree walk). + * This is the hottest path (~30K calls for large projects). + * + * - statSync() O(1) manifest lookup + lightweight stat allocation. + * Not on the module resolution hot path. Returns a fresh object each call. + * + * - existsSync() O(1) manifest lookup. + * + * - readFileSync() sea.getRawAsset() with a Map cache. Bypasses the + * MemoryProvider tree entirely. Returns a Buffer copy to prevent cache + * corruption from callers mutating the buffer. + * + * - readdirSync() Returns manifest directory entries directly. + * + * The MemoryProvider base class directory tree is still populated at + * construction time as a safety net for edge-case super method fallbacks + * (e.g., readlinkSync). + */ class SEAProvider extends MemoryProvider { constructor(seaManifest) { super(); this._manifest = seaManifest; - this._loaded = new Set(); + this._fileCache = new Map(); + // Populate MemoryProvider directory tree as a safety net for edge-case + // fallbacks to super methods (e.g., readlinkSync for non-manifest paths). + perf.start('directory tree init'); for (var dir of Object.keys(seaManifest.directories)) { super.mkdirSync(dir, { recursive: true }); } + perf.end('directory tree init'); } _resolveSymlink(p) { - var target = this._manifest.symlinks[p]; - return target || p; + for (var i = 0; i < 40; i++) { + var target = this._manifest.symlinks[p]; + if (!target) return p; + p = target; + } + return p; } readFileSync(filePath, options) { var p = this._resolveSymlink(toManifestKey(filePath)); - this._ensureLoaded(p); - return super.readFileSync(p, options); + // Fast path: read from SEA asset with a Map cache, bypassing the + // MemoryProvider tree walk for both write and read. + var buf = this._fileCache.get(p); + if (buf === undefined) { + var raw; + try { + if (perf.enabled) var t0 = process.hrtime.bigint(); + raw = sea.getRawAsset(p); + if (perf.enabled) + perf.addNs('sea.getRawAsset()', process.hrtime.bigint() - t0); + } catch (_) { + throw _enoent('open', filePath); + } + buf = Buffer.from(raw); + this._fileCache.set(p, buf); + perf.count('files loaded'); + } + var encoding = + typeof options === 'string' ? options : options && options.encoding; + // Strings are immutable — safe to return directly from cache. + // Buffers must be copied to prevent callers from corrupting the cache. + if (encoding) return buf.toString(encoding); + var copy = Buffer.allocUnsafe(buf.length); + buf.copy(copy); + return copy; } readlinkSync(filePath) { @@ -65,47 +306,51 @@ class SEAProvider extends MemoryProvider { return super.readlinkSync(p); } - _ensureLoaded(p) { - if (this._loaded.has(p)) return; - try { - var raw = sea.getRawAsset(p); - super.writeFileSync(p, Buffer.from(raw)); - this._loaded.add(p); - } catch (_) { - // Not a SEA asset — let super handle the ENOENT + statSync(filePath) { + perf.count('statSync calls'); + var p = this._resolveSymlink(toManifestKey(filePath)); + var meta = this._manifest.stats[p]; + if (meta) { + // Return a fresh stat object — matches Node.js fs.statSync contract. + return _makeStats(meta); } + throw _enoent('stat', filePath); } - statSync(filePath) { + /** + * Fast module resolution stat — returns 0 (file), 1 (directory), or -2 + * (not found) directly from the manifest. This is the hottest path during + * startup (~30K calls for large projects) so it must be as lean as possible. + */ + internalModuleStat(filePath) { var p = this._resolveSymlink(toManifestKey(filePath)); var meta = this._manifest.stats[p]; - if (meta && meta.isFile && !this._loaded.has(p)) { - this._ensureLoaded(p); + if (meta) { + return meta.isDirectory ? 1 : 0; } - return super.statSync(p); + return -2; } readdirSync(dirPath) { - var p = toManifestKey(dirPath); + perf.count('readdirSync calls'); + var p = this._resolveSymlink(toManifestKey(dirPath)); var entries = this._manifest.directories[p]; if (entries) return entries.slice(); return super.readdirSync(p); } existsSync(filePath) { - var p = toManifestKey(filePath); - if (p in this._manifest.symlinks) return true; - p = this._resolveSymlink(p); - if (p in this._manifest.stats) return true; - try { - super.statSync(p); - return true; - } catch (_) { - return false; - } + perf.count('existsSync calls'); + var p = this._resolveSymlink(toManifestKey(filePath)); + return p in this._manifest.stats; } } +// ///////////////////////////////////////////////////////////////// +// VFS MOUNT /////////////////////////////////////////////////////// +// ///////////////////////////////////////////////////////////////// + +perf.start('vfs mount + hooks'); var provider = new SEAProvider(manifest); var virtualFs = new VirtualFileSystem(provider); @@ -135,6 +380,11 @@ if (process.platform === 'win32') { } virtualFs.mount(SNAPSHOT_PREFIX, { overlay: true }); +perf.end('vfs mount + hooks'); + +// ///////////////////////////////////////////////////////////////// +// HELPERS ///////////////////////////////////////////////////////// +// ///////////////////////////////////////////////////////////////// function toPlatformPath(p) { if (process.platform !== 'win32') return p; @@ -168,6 +418,7 @@ module.exports = { manifest, virtualFs, provider, + perf, SNAPSHOT_PREFIX, insideSnapshot, toPlatformPath, From 219d978fc50fb004ff4d2290cd3a444befd9e9ef Mon Sep 17 00:00:00 2001 From: robertsLando Date: Wed, 8 Apr 2026 15:20:27 +0200 Subject: [PATCH 31/41] docs: split project instructions into modular .claude/rules files MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit CLAUDE.md referenced .github/copilot-instructions.md via a markdown link, but Claude Code doesn't follow links — it only auto-loads CLAUDE.md and .claude/rules/*.md. Created 5 focused rule files with path-scoping so Claude Code actually sees the project instructions. Copilot instructions file is unchanged. Co-Authored-By: Claude Opus 4.6 (1M context) --- .claude/rules/development.md | 36 ++++++++++++++++++++++++++++++ .claude/rules/git-and-pr.md | 26 ++++++++++++++++++++++ .claude/rules/platform-and-vfs.md | 37 +++++++++++++++++++++++++++++++ .claude/rules/project.md | 24 ++++++++++++++++++++ .claude/rules/testing.md | 32 ++++++++++++++++++++++++++ CLAUDE.md | 35 +++++++---------------------- 6 files changed, 163 insertions(+), 27 deletions(-) create mode 100644 .claude/rules/development.md create mode 100644 .claude/rules/git-and-pr.md create mode 100644 .claude/rules/platform-and-vfs.md create mode 100644 .claude/rules/project.md create mode 100644 .claude/rules/testing.md diff --git a/.claude/rules/development.md b/.claude/rules/development.md new file mode 100644 index 000000000..59f2cb898 --- /dev/null +++ b/.claude/rules/development.md @@ -0,0 +1,36 @@ +--- +description: Build, lint, formatting, and TypeScript rules +--- + +# Development + +## Build + +```bash +npm run build # Required before testing — compiles lib/ to lib-es5/ +npm run start # Watch mode with auto-rebuild +``` + +## Lint & Format + +```bash +npm run lint # Check both ESLint + Prettier +npm run fix # Auto-fix all issues +npm run lint:code # ESLint only +npm run lint:style # Prettier only +``` + +- Always run `npm run lint` before committing. Fix all issues — never push dirty code. +- Console statements are disallowed in production code but allowed in test files. + +## TypeScript + +- Strict mode enabled. Target: ES2017. Module system: CommonJS. +- Edit `lib/*.ts` only — never edit `lib-es5/*.js` directly. +- Requires Node.js >= 20.0.0. + +## Dependencies + +- Keep runtime dependencies minimal — they affect all packaged apps. +- Use exact or caret ranges. +- `pkg-fetch` provides pre-compiled Node.js binaries. diff --git a/.claude/rules/git-and-pr.md b/.claude/rules/git-and-pr.md new file mode 100644 index 000000000..75ba7233a --- /dev/null +++ b/.claude/rules/git-and-pr.md @@ -0,0 +1,26 @@ +--- +description: Git workflow, commit conventions, and PR rules +--- + +# Git & PR Workflow + +## CRITICAL: PR Target + +- ALWAYS create PRs against `yao-pkg/pkg` (this fork). +- NEVER target `vercel/pkg` — it is archived and read-only. + +## Commits + +- Use conventional commits: `feat:`, `fix:`, `refactor:`, `test:`, `chore:`, `docs:` +- Default branch: `main`. Tag format: `v${version}`. +- Branch protection requires passing CI checks. + +## Before Committing + +1. Clean test artifacts from test directories (`*.exe`, `*-linux`, `*-macos`, `*-win.exe`). +2. Run `npm run lint` and fix all issues. +3. Show `git status --short` and get user approval before committing. + +## Release + +Uses `release-it` with conventional commits (`npm run release`). This runs linting, generates changelog, creates a git tag, pushes to GitHub, and publishes to npm as `@yao-pkg/pkg`. diff --git a/.claude/rules/platform-and-vfs.md b/.claude/rules/platform-and-vfs.md new file mode 100644 index 000000000..03945b3dc --- /dev/null +++ b/.claude/rules/platform-and-vfs.md @@ -0,0 +1,37 @@ +--- +description: VFS, native addons, cross-compilation, ESM, and platform-specific notes +paths: + - 'prelude/**' + - 'lib/**' +--- + +# Platform & Virtual Filesystem + +## VFS Path Handling + +- Packaged apps use `/snapshot/` prefix (or `C:\snapshot\` on Windows). +- Use `__dirname`/`__filename` for snapshot files, `process.cwd()` for runtime fs. +- Path handling differs between packaged and non-packaged execution. + +## Native Addons + +- Extracted to `$HOME/.cache/pkg/` at runtime. Must match target Node.js version. +- `linuxstatic` target cannot load native bindings. +- Add `.node` files to `assets` if not detected automatically. + +## Cross-Compilation + +- Bytecode generation requires the target architecture binary. +- Use `--no-bytecode` for cross-arch builds. +- Linux: QEMU for emulation. macOS: Rosetta 2 for arm64 building x64. + +## ESM + +- Requires `--options experimental-require-module` on Node.js < 22.12.0. +- Check existing dictionary files for package-specific ESM handling. + +## Platform Notes + +- **Linux**: `linuxstatic` target for max portability. +- **macOS**: arm64 requires code signing (`codesign` or `ldid`). +- **Windows**: `.exe` extension required; native modules must match target arch. diff --git a/.claude/rules/project.md b/.claude/rules/project.md new file mode 100644 index 000000000..f31da3145 --- /dev/null +++ b/.claude/rules/project.md @@ -0,0 +1,24 @@ +--- +description: Project overview, structure, and key files for yao-pkg/pkg +--- + +# Project Overview + +`pkg` packages Node.js projects into standalone executables for Linux, macOS, and Windows. It supports multiple Node.js versions (node20, node22+), virtual filesystem bundling, V8 bytecode compilation, native addons, and compression (Brotli, GZip). + +This is `yao-pkg/pkg` — a maintained fork of the archived `vercel/pkg`. + +## Repository Structure + +- `lib/` — TypeScript source (compiled to `lib-es5/` via `npm run build`) +- `prelude/` — Bootstrap code injected into packaged executables +- `dictionary/` — Package-specific configs for known npm packages +- `test/` — Numbered test directories (`test-XX-name/`) +- `.github/workflows/` — CI/CD (GitHub Actions) + +## Key Entry Points + +- `lib/index.js` — API entry point +- `lib/bin.js` — CLI entry point +- `prelude/bootstrap.js` — Injected into every packaged executable +- `dictionary/*.js` — Special handling for specific npm packages diff --git a/.claude/rules/testing.md b/.claude/rules/testing.md new file mode 100644 index 000000000..de2e5ccce --- /dev/null +++ b/.claude/rules/testing.md @@ -0,0 +1,32 @@ +--- +description: Test commands, organization, and patterns +paths: + - 'test/**' +--- + +# Testing + +## Commands + +```bash +npm run build # Always build first +npm run test:20 # Test with Node.js 20 +npm run test:22 # Test with Node.js 22 +npm run test:host # Test with host Node.js version +node test/test.js node20 no-npm test-50-* # Run specific test pattern +``` + +## Organization + +- Tests live in `test/test-XX-descriptive-name/` directories (XX = execution order). +- Each test has a `main.js` entry point using utilities from `test/utils.js`. +- `test-79-npm/` — npm package integration tests (only-npm). +- `test-42-fetch-all/` — verifies patches exist for all Node.js versions. + +## Writing Tests + +1. Create `test/test-XX-descriptive-name/` with a `main.js` +2. Use `utils.pkg.sync()` to invoke pkg +3. Verify outputs, clean up with `utils.filesAfter()` + +Test artifacts (`*.exe`, `*-linux`, `*-macos`, `*-win.exe`) must be cleaned from test directories before committing. diff --git a/CLAUDE.md b/CLAUDE.md index c66be4df9..bdaeb04cc 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -1,33 +1,14 @@ # CLAUDE.md -This file provides guidance to Claude Code when working with this repository. - -## Shared Instructions - -Project-level AI coding instructions are maintained in a single shared location: - -- **[`.github/copilot-instructions.md`](.github/copilot-instructions.md)** — the primary reference for project overview, architecture, development workflow, testing, coding standards, and contribution guidelines. - -Please read that file for full context before making changes. - ## Quick Reference ```bash -# Build (required before testing) -npm run build - -# Lint and auto-fix -npm run lint -npm run fix - -# Run all tests -npm test - -# Run tests for a specific Node.js version -npm run test:20 -npm run test:22 -npm run test:24 - -# Watch mode (rebuild on change) -npm run start +npm run build # Build (required before testing) +npm run lint # Check lint + formatting +npm run fix # Auto-fix lint + formatting +npm run start # Watch mode (rebuild on change) +npm run test:22 # Run tests for Node.js 22 ``` + +Detailed project rules are in `.claude/rules/` — they are loaded automatically. +Shared instructions for GitHub Copilot are in `.github/copilot-instructions.md`. From 8255a4aa3dbaf1ca3ba42cfda75082c023b23a49 Mon Sep 17 00:00:00 2001 From: robertsLando Date: Wed, 8 Apr 2026 15:28:54 +0200 Subject: [PATCH 32/41] feat: enhance SEA asset generation with single archive blob and offsets for zero-copy access --- lib/sea-assets.ts | 84 ++++++++++++++++++++++++++++------------ prelude/sea-bootstrap.js | 1 + prelude/sea-vfs-setup.js | 53 ++++++++++++++----------- 3 files changed, 92 insertions(+), 46 deletions(-) diff --git a/lib/sea-assets.ts b/lib/sea-assets.ts index 1ba52c528..373dacdac 100644 --- a/lib/sea-assets.ts +++ b/lib/sea-assets.ts @@ -1,5 +1,6 @@ -import { mkdir, writeFile } from 'fs/promises'; -import { dirname, join } from 'path'; +import { createReadStream } from 'fs'; +import { open, writeFile } from 'fs/promises'; +import { join } from 'path'; import { STORE_CONTENT, @@ -18,6 +19,7 @@ export interface SeaManifest { { size: number; isFile: boolean; isDirectory: boolean } >; symlinks: Record; + offsets: Record; debug?: boolean; } @@ -34,7 +36,11 @@ function toPosixKey(p: string): string { } /** - * Transform walker/refiner output into SEA-compatible asset map and manifest. + * Transform walker/refiner output into a single SEA archive blob and manifest. + * + * All file contents are concatenated into one binary archive sorted by POSIX + * key. The manifest contains an `offsets` map of key → [byteOffset, byteLength] + * so the runtime can extract individual files via zero-copy Buffer.subarray(). * * Asset keys use refiner paths (no /snapshot prefix) because @platformatic/vfs * strips the mount prefix before passing paths to the provider. The entrypoint @@ -50,8 +56,6 @@ export async function generateSeaAssets( tmpDir: string, options?: { debug?: boolean }, ): Promise { - const assets: Record = {}; - // Normalize symlink paths to use the same refiner-style POSIX keys as // directories/stats/assets. Do not add the /snapshot prefix because the // VFS provider receives paths after the mount prefix is stripped. @@ -66,36 +70,29 @@ export async function generateSeaAssets( directories: {}, stats: {}, symlinks: normalizedSymlinks, + offsets: {}, ...(options?.debug ? { debug: true } : {}), }; - let modifiedFileCount = 0; + // First pass: collect file entries and build manifest metadata + const entries: { key: string; source: Buffer | string }[] = []; for (const snap in records) { if (!records[snap]) continue; const record = records[snap]; const key = toPosixKey(snap); - // Map file content to SEA asset + // Collect file content entry for the archive if (record[STORE_CONTENT]) { if (record.bodyModified) { - // File was intentionally modified (patches, package.json rewrites) — write to temp file - const tempPath = join( - tmpDir, - 'assets', - `modified_${modifiedFileCount}`, - ); - modifiedFileCount += 1; - await mkdir(dirname(tempPath), { recursive: true }); const content = typeof record.body === 'string' ? Buffer.from(record.body) : record.body!; - await writeFile(tempPath, content); - assets[key] = tempPath; + entries.push({ key, source: content }); } else { - // Unmodified file — point to source on disk - assets[key] = record.file; + // Unmodified file — will be streamed from disk + entries.push({ key, source: record.file }); } } @@ -106,17 +103,56 @@ export async function generateSeaAssets( // Collect stat metadata if (record[STORE_STAT]) { - const stat = record[STORE_STAT]; + const s = record[STORE_STAT]; manifest.stats[key] = { - size: stat.size ?? 0, - isFile: Boolean(stat.isFileValue), - isDirectory: Boolean(stat.isDirectoryValue), + size: s.size ?? 0, + isFile: Boolean(s.isFileValue), + isDirectory: Boolean(s.isDirectoryValue), }; } } + // Sort entries by key for deterministic archive output + entries.sort((a, b) => (a.key < b.key ? -1 : a.key > b.key ? 1 : 0)); + + // Stream-write the single archive blob + const archivePath = join(tmpDir, '__pkg_archive__'); + const fd = await open(archivePath, 'w'); + let offset = 0; + + try { + for (const { key, source } of entries) { + let length: number; + if (Buffer.isBuffer(source)) { + // Modified file content already in memory + await fd.write(source); + length = source.length; + } else { + // Unmodified file — stream from disk, track actual bytes written + // (avoids stat→read race if the file changes between calls) + length = 0; + const stream = createReadStream(source); + for await (const chunk of stream) { + await fd.write(chunk as Buffer); + length += (chunk as Buffer).length; + } + } + manifest.offsets[key] = [offset, length]; + // Fix manifest stat size to reflect actual content for modified files + if (manifest.stats[key]) { + manifest.stats[key].size = length; + } + offset += length; + } + } finally { + await fd.close(); + } + const manifestPath = join(tmpDir, '__pkg_manifest__.json'); await writeFile(manifestPath, JSON.stringify(manifest)); - return { assets, manifestPath }; + return { + assets: { __pkg_archive__: archivePath }, + manifestPath, + }; } diff --git a/prelude/sea-bootstrap.js b/prelude/sea-bootstrap.js index 7fc7a993c..9bd6784ef 100644 --- a/prelude/sea-bootstrap.js +++ b/prelude/sea-bootstrap.js @@ -130,6 +130,7 @@ if (manifest.debug) { if (perf.enabled) { perf._durations['vfs setup total'] = (perf._durations['manifest parse'] || 0n) + + (perf._durations['archive load'] || 0n) + (perf._durations['directory tree init'] || 0n) + (perf._durations['vfs mount + hooks'] || 0n); } diff --git a/prelude/sea-vfs-setup.js b/prelude/sea-vfs-setup.js index d1458c262..56f3bae63 100644 --- a/prelude/sea-vfs-setup.js +++ b/prelude/sea-vfs-setup.js @@ -35,16 +35,16 @@ var MemoryProvider = vfsModule.MemoryProvider; // [pkg:perf] phase time // [pkg:perf] ────────────────────────────── // [pkg:perf] manifest parse 14.0ms +// [pkg:perf] archive load 1.2ms // [pkg:perf] directory tree init 20.5ms // [pkg:perf] vfs mount + hooks 3.3ms -// [pkg:perf] vfs setup total 38.6ms -// [pkg:perf] module loading 1730.1ms +// [pkg:perf] vfs setup total 39.8ms +// [pkg:perf] module loading 730.1ms // [pkg:perf] // [pkg:perf] counter value // [pkg:perf] ────────────────────────────── // [pkg:perf] files loaded 1776 // [pkg:perf] file cache entries 1776 -// [pkg:perf] sea.getRawAsset() 1047.6ms // [pkg:perf] statSync calls 0 // [pkg:perf] existsSync calls 1540 // [pkg:perf] readdirSync calls 0 @@ -101,6 +101,7 @@ var perf = { console.log(SEP); var phaseOrder = [ 'manifest parse', + 'archive load', 'directory tree init', 'vfs mount + hooks', 'vfs setup total', @@ -119,7 +120,6 @@ var perf = { var counterOrder = [ 'files loaded', 'file cache entries', - 'sea.getRawAsset()', 'statSync calls', 'existsSync calls', 'readdirSync calls', @@ -224,7 +224,10 @@ function _makeStats(meta) { } /** - * SEA asset provider — reads files lazily from the SEA binary. + * SEA asset provider — reads files from a single archive blob embedded in the + * SEA binary. All file contents are packed into one asset ('__pkg_archive__') + * at build time; the manifest's `offsets` map provides [byteOffset, byteLength] + * for each file so readFileSync can extract them via zero-copy Buffer.subarray(). * * Performance design: * @@ -236,9 +239,9 @@ function _makeStats(meta) { * * - existsSync() O(1) manifest lookup. * - * - readFileSync() sea.getRawAsset() with a Map cache. Bypasses the - * MemoryProvider tree entirely. Returns a Buffer copy to prevent cache - * corruption from callers mutating the buffer. + * - readFileSync() Zero-copy subarray from the archive with a Map + * cache. Bypasses the MemoryProvider tree entirely. Returns a Buffer + * copy to prevent callers from corrupting the archive. * * - readdirSync() Returns manifest directory entries directly. * @@ -252,6 +255,19 @@ class SEAProvider extends MemoryProvider { this._manifest = seaManifest; this._fileCache = new Map(); + // Load the single archive blob — zero-copy view of the SEA asset's + // ArrayBuffer. All file contents are packed here; individual files + // are extracted via subarray() using manifest.offsets. + perf.start('archive load'); + try { + this._archive = Buffer.from(sea.getRawAsset('__pkg_archive__')); + } catch (e) { + throw new Error( + 'pkg: Failed to load archive from SEA assets: ' + e.message, + ); + } + perf.end('archive load'); + // Populate MemoryProvider directory tree as a safety net for edge-case // fallbacks to super methods (e.g., readlinkSync for non-manifest paths). perf.start('directory tree init'); @@ -272,27 +288,20 @@ class SEAProvider extends MemoryProvider { readFileSync(filePath, options) { var p = this._resolveSymlink(toManifestKey(filePath)); - // Fast path: read from SEA asset with a Map cache, bypassing the - // MemoryProvider tree walk for both write and read. + // Fast path: zero-copy subarray from the archive with a Map cache, + // bypassing the MemoryProvider tree entirely. var buf = this._fileCache.get(p); if (buf === undefined) { - var raw; - try { - if (perf.enabled) var t0 = process.hrtime.bigint(); - raw = sea.getRawAsset(p); - if (perf.enabled) - perf.addNs('sea.getRawAsset()', process.hrtime.bigint() - t0); - } catch (_) { - throw _enoent('open', filePath); - } - buf = Buffer.from(raw); + var entry = this._manifest.offsets[p]; + if (!entry) throw _enoent('open', filePath); + buf = this._archive.subarray(entry[0], entry[0] + entry[1]); this._fileCache.set(p, buf); perf.count('files loaded'); } var encoding = typeof options === 'string' ? options : options && options.encoding; - // Strings are immutable — safe to return directly from cache. - // Buffers must be copied to prevent callers from corrupting the cache. + // Strings are immutable — safe to derive from the archive view. + // Buffers must be copied to prevent callers from corrupting the archive. if (encoding) return buf.toString(encoding); var copy = Buffer.allocUnsafe(buf.length); buf.copy(copy); From 58ccfa5316bb91294c9df69af96698af4cdd1f37 Mon Sep 17 00:00:00 2001 From: robertsLando Date: Wed, 8 Apr 2026 15:50:52 +0200 Subject: [PATCH 33/41] docs: update README and ARCHITECTURE.md for single archive blob and refactored VFS - README: fix stale node14 references, add dedicated SEA Mode section with simple vs enhanced variants, link to ARCHITECTURE.md - ARCHITECTURE: rewrite SEA binary format to document single __pkg_archive__ blob with offsets map instead of per-file assets, document sea-vfs-setup.js as shared VFS core, rewrite worker thread section (workers now reuse same @platformatic/vfs via sea-vfs-setup.js), fix all line counts, update VFS provider diagram and performance/code-protection tables Co-Authored-By: Claude Opus 4.6 (1M context) --- README.md | 34 ++++++- docs/ARCHITECTURE.md | 238 +++++++++++++++++++++++-------------------- 2 files changed, 161 insertions(+), 111 deletions(-) diff --git a/README.md b/README.md index 9baa66c61..22582bf79 100644 --- a/README.md +++ b/README.md @@ -103,7 +103,7 @@ Pre-compiled Node.js binaries for some unsupported architectures and instructions for using them are available in the [pkg-binaries](https://github.com/yao-pkg/pkg-binaries) project. -You may omit any element (and specify just `node14` for example). +You may omit any element (and specify just `node22` for example). The omitted elements will be taken from current platform or system-wide Node.js installation (its version and arch). There is also an alias `host`, that means that all 3 elements @@ -153,13 +153,13 @@ your `package.json` file. "pkg": { "scripts": "build/**/*.js", "assets": "views/**/*", - "targets": [ "node22-linux-arm64" ], + "targets": ["node22-linux-arm64"], "outputPath": "dist" } ``` The above example will include everything in `assets/` and -every .js file in `build/`, build only for `node14-linux-arm64`, +every .js file in `build/`, build only for `node22-linux-arm64`, and place the executable inside `dist/`. You may also specify arrays of globs: @@ -303,6 +303,34 @@ The startup time of the application might be reduced slightly. `-C` can be used as a shortcut for `--compress`. +### SEA Mode (Single Executable Application) + +The `--sea` flag uses Node.js [Single Executable Applications](https://nodejs.org/api/single-executable-applications.html) to package your project. There are two variants: + +**Simple SEA** — For a single pre-bundled `.js` file (Node 22+): + +```sh +pkg --sea index.js +``` + +**Enhanced SEA** — Automatically used when the input has a `package.json` and all targets are Node >= 22. Uses the full dependency walker with [`@roberts_lando/vfs`](https://github.com/robertsLando/vfs) for transparent `fs`/`require`/`import` support: + +```sh +pkg . --sea # walks dependencies, builds VFS +pkg . --sea -t node24-linux # target specific platform +``` + +Enhanced SEA mode: + +- Walks dependencies like traditional mode, but skips V8 bytecode compilation and ESM-to-CJS transforms — files stay as-is +- Bundles all files into a single archive blob with offset-based zero-copy access at runtime +- Supports worker threads (VFS hooks are automatically injected) +- Native addon extraction works the same as traditional mode +- ESM entry points supported on Node 25.7+ (`mainFormat: "module"`) +- Migration path to `node:vfs` when it lands in Node.js core + +**Trade-offs vs traditional mode**: Enhanced SEA builds faster and uses official Node.js APIs, but stores source code in plaintext (no bytecode protection) and does not support compression. See [docs/ARCHITECTURE.md](docs/ARCHITECTURE.md) for a detailed comparison. + ### Environment All pkg-cache [environment vars](https://github.com/yao-pkg/pkg-fetch#environment), plus: diff --git a/docs/ARCHITECTURE.md b/docs/ARCHITECTURE.md index bb1f734e2..122489536 100644 --- a/docs/ARCHITECTURE.md +++ b/docs/ARCHITECTURE.md @@ -36,7 +36,7 @@ pkg single-file.js --sea # Simple SEA mode (any single .js file) | Aspect | Traditional | Enhanced SEA | Simple SEA | | ------------- | -------------------- | ------------------- | ------------------- | | Walker | Yes | Yes (seaMode) | No | -| VFS | Custom binary format | @platformatic/vfs | None | +| VFS | Custom binary format | @roberts_lando/vfs | None | | Bytecode | V8 compiled | No (source as-is) | No | | ESM transform | ESM to CJS | No (native ESM) | No | | Node.js API | Binary patching | Official `node:sea` | Official `node:sea` | @@ -161,17 +161,19 @@ CLI (lib/index.ts) │ └─ Same as traditional (path compression, empty dir pruning) │ ├─ SEA Asset Generator (lib/sea-assets.ts) - │ ├─ Map each STORE_CONTENT → SEA asset entry (snap_path → disk_path) + │ ├─ Concatenate all STORE_CONTENT files into a single __pkg_archive__ blob │ ├─ Build __pkg_manifest__.json: - │ │ { entrypoint, directories, stats, symlinks } - │ └─ Write modified files (patches) to temp dir + │ │ { entrypoint, directories, stats, symlinks, offsets } + │ │ offsets maps key → [byteOffset, byteLength] into the archive + │ └─ Write archive + manifest to temp dir │ └─ SEA Orchestrator (lib/sea.ts → seaEnhanced()) ├─ Copy pre-bundled sea-bootstrap.bundle.js to tmpDir - │ (built by scripts/build-sea-bootstrap.js which inlines - │ the worker thread bootstrap via esbuild `define`) + │ (built by scripts/build-sea-bootstrap.js — 2-step esbuild: + │ 1. Bundle sea-worker-entry.js → string module + │ 2. Bundle sea-bootstrap.js + VFS + worker string → bundle) ├─ Build sea-config.json: - │ { main, output, assets: { __pkg_manifest__, ...files } } + │ { main, output, assets: { __pkg_manifest__, __pkg_archive__ } } ├─ Generate blob: │ Node 25.5+: node --build-sea sea-config.json │ Node 22-24: node --experimental-sea-config sea-config.json @@ -195,15 +197,21 @@ The SEA executable uses the official Node.js resource format: │ ┌──────────────────────────┐ │ │ │ main: sea-bootstrap.js │ │ ← Bundled bootstrap + VFS polyfill │ ├──────────────────────────┤ │ -│ │ Asset: __pkg_manifest__ │ │ ← JSON manifest (dirs, stats, symlinks) -│ │ Asset: /app/index.js │ │ ← Source code (plaintext) -│ │ Asset: /app/lib/util.js │ │ ← Source code -│ │ Asset: /app/config.json │ │ ← JSON asset -│ │ ... │ │ +│ │ Asset: __pkg_manifest__ │ │ ← JSON: dirs, stats, symlinks, offsets +│ ├──────────────────────────┤ │ +│ │ Asset: __pkg_archive__ │ │ ← Single binary blob containing ALL files +│ │ ┌──────────────────┐ │ │ +│ │ │ /app/index.js │ │ │ ← offset=0, length=1234 +│ │ │ /app/config.json │ │ │ ← offset=1234, length=567 +│ │ │ /app/lib/util.js │ │ │ ← offset=1801, length=890 +│ │ │ ... │ │ │ +│ │ └──────────────────┘ │ │ │ └──────────────────────────┘ │ └──────────────────────────────────┘ ``` +Files are sorted by key and concatenated into the archive. The manifest's `offsets` map (`key → [byteOffset, byteLength]`) enables zero-copy extraction via `Buffer.subarray()`. + The resource is embedded using OS-native formats: - **Linux**: ELF notes section @@ -212,18 +220,22 @@ The resource is embedded using OS-native formats: ### SEA Runtime Bootstrap -`prelude/sea-bootstrap.js` (~250 lines, bundled with `@platformatic/vfs` and the worker bootstrap into `sea-bootstrap.bundle.js`) executes as the SEA `main` entry: +The SEA bootstrap is split into two files, bundled together by esbuild into `sea-bootstrap.bundle.js`: + +- **`prelude/sea-bootstrap.js`** (~158 lines) — Main entry: applies shared patches, sets up worker thread interception, runs the entrypoint +- **`prelude/sea-vfs-setup.js`** (~434 lines) — VFS core: manifest parsing, `SEAProvider` class, archive loading, VFS mount, Windows path normalization. Shared by both main thread and worker threads -1. **Load manifest** — `JSON.parse(sea.getAsset('__pkg_manifest__', 'utf8'))` -2. **Patch VFS for Windows** — On Windows, monkey-patches `VirtualFileSystem.prototype.shouldHandle` and `resolvePath` to convert Windows-native paths (e.g. `C:\snapshot\...`) to POSIX before the VFS processes them. This is needed because `@platformatic/vfs` internally uses `/` as the path separator in `isUnderMountPoint()`, but Node's `path.normalize()` converts to `\` on Windows -3. **Initialize VFS** — Creates `SEAProvider` (extends `MemoryProvider`), always mounts at `/snapshot` (POSIX path, regardless of platform). The VFS module hooks use the `V:` sentinel drive for subsequent path resolution on Windows -4. **Apply shared patches** — Calls `patchDlopen()`, `patchChildProcess()`, `setupProcessPkg()` from `bootstrap-shared.js` -5. **Patch Worker threads** — Wraps `workerThreads.Worker` so workers spawned with `/snapshot/...` paths get a self-contained bootstrap (see [Worker Thread Support](#worker-thread-support)) -6. **Run entrypoint** — Sets `process.argv[1]`, calls `Module.runMain()` +Execution flow: -The VFS polyfill (`@platformatic/vfs`) handles all `fs` and `fs/promises` patching automatically when `mount()` is called — intercepting 164+ functions including `readFile`, `readFileSync`, `stat`, `readdir`, `access`, `realpath`, `createReadStream`, `watch`, `open`, and their promise-based equivalents. It also hooks into the Node.js module resolution system for `require()` and `import`. +1. **VFS setup** (via `require('./sea-vfs-setup')`) — Loads manifest from `sea.getAsset('__pkg_manifest__', 'utf8')`, creates `SEAProvider` (extends `MemoryProvider`), loads `__pkg_archive__` blob, mounts at `/snapshot`. On Windows, patches `VirtualFileSystem.prototype.shouldHandle` and `resolvePath` to convert backslashes to POSIX +2. **Apply shared patches** — Calls `patchDlopen()`, `patchChildProcess()`, `setupProcessPkg()` from `bootstrap-shared.js` +3. **Diagnostics** — If `manifest.debug` is set (built with `--debug`), calls `installDiagnostic()` +4. **Patch Worker threads** — Wraps `workerThreads.Worker` so workers spawned with `/snapshot/...` paths get the same VFS setup (see [Worker Thread Support](#worker-thread-support)) +5. **Run entrypoint** — Sets `process.argv[1]`, calls `Module.runMain()` -**Windows path strategy:** Unlike the main thread's VFS approach (which uses `@platformatic/vfs` with automatic module hooks), the SEA bootstrap takes care to normalize all paths to POSIX before they reach the VFS. The `insideSnapshot()` helper checks for both `/snapshot` and `V:\snapshot` (the sentinel drive used by `@platformatic/vfs` module hooks on Windows). +The VFS polyfill (`@roberts_lando/vfs`) handles all `fs` and `fs/promises` patching automatically when `mount()` is called — intercepting 164+ functions including `readFile`, `readFileSync`, `stat`, `readdir`, `access`, `realpath`, `createReadStream`, `watch`, `open`, and their promise-based equivalents. It also hooks into the Node.js module resolution system for `require()` and `import`. + +**Windows path strategy:** The VFS always mounts at `/snapshot` (POSIX). On Windows, `sea-vfs-setup.js` patches `VirtualFileSystem.prototype.shouldHandle` and `resolvePath` to strip drive letters and convert `\` to `/` before the VFS processes them. The `insideSnapshot()` helper checks for `/snapshot`, `V:\snapshot` (sentinel drive used by `@roberts_lando/vfs` module hooks), and `C:\snapshot` (used by dlopen/child_process). ### VFS Provider Architecture @@ -233,7 +245,7 @@ The VFS polyfill (`@platformatic/vfs`) handles all `fs` and `fs/promises` patchi └──────────────────────┬──────────────────────────┘ │ ┌─────────────▼──────────────┐ - │ @platformatic/vfs │ + │ @roberts_lando/vfs │ │ (mounted at /snapshot, │ │ overlay: true) │ │ │ @@ -241,33 +253,36 @@ The VFS polyfill (`@platformatic/vfs`) handles all `fs` and `fs/promises` patchi │ Calls provider method │ └─────────────┬──────────────┘ │ - ┌─────────────▼──────────────┐ - │ SEAProvider │ - │ extends MemoryProvider │ - │ │ - │ readFileSync('/app/x.js') │ - │ → _ensureLoaded() │ - │ → sea.getRawAsset(key) │ ← Zero-copy from executable memory - │ → super.writeFileSync() │ ← Cache in MemoryProvider - │ → super.readFileSync() │ ← Return cached content - └────────────────────────────┘ + ┌─────────────▼──────────────────────┐ + │ SEAProvider │ + │ extends MemoryProvider │ + │ (defined in sea-vfs-setup.js) │ + │ │ + │ readFileSync('/app/x.js') │ + │ → _resolveSymlink(key) │ + │ → _fileCache.get(key) │ ← Map cache (fast path) + │ → _archive.subarray(off, off+len) │ ← Zero-copy from archive + │ → _fileCache.set(key, buf) │ ← Cache for next access + │ → return Buffer copy │ ← Copy to prevent mutation + └─────────────────────────────────────┘ ``` -The `SEAProvider` implements lazy loading: +The `SEAProvider` (in `prelude/sea-vfs-setup.js`) implements lazy loading from a single archive blob: -| Method | Behavior | -| -------------------- | ---------------------------------------------------------------------------------------- | -| `readFileSync(path)` | Resolve symlinks, lazy-load from SEA asset on first access, delegate to `MemoryProvider` | -| `statSync(path)` | Return metadata from manifest; trigger lazy-load for files | -| `readdirSync(path)` | Return directory entries from manifest | -| `existsSync(path)` | Check manifest symlinks and stats | -| `readlinkSync(path)` | Return symlink target from manifest | +| Method | Behavior | +| -------------------------- | ----------------------------------------------------------------------------- | +| `readFileSync(path)` | Resolve symlinks, `subarray()` from archive via `offsets` map, cache in `Map` | +| `statSync(path)` | Return metadata from manifest `stats` | +| `internalModuleStat(path)` | Fast path for module resolution: returns 0 (file), 1 (dir), or -2 (not found) | +| `readdirSync(path)` | Return directory entries from manifest `directories` | +| `existsSync(path)` | O(1) check against manifest `stats` | +| `readlinkSync(path)` | Return symlink target from manifest, fall back to `super.readlinkSync()` | -Assets are loaded lazily via `sea.getRawAsset(key)` which returns a zero-copy `ArrayBuffer` reference to the executable's memory-mapped region. The buffer is copied once into the `MemoryProvider` cache on first access. +The entire archive is loaded once via `sea.getRawAsset('__pkg_archive__')` which returns a zero-copy `ArrayBuffer` reference to the executable's memory-mapped region. Individual files are extracted via `Buffer.subarray(offset, offset + length)` using the manifest's `offsets` map, then cached in a `Map` on first access. String results (when `encoding` is specified) are derived directly from the archive view; Buffer results are copied to prevent callers from corrupting the shared archive memory. ### Worker Thread Support -Worker threads spawned from packaged applications don't inherit VFS hooks from the main thread — `@platformatic/vfs` only patches the main thread's `fs` and module system. The SEA bootstrap solves this by monkey-patching the `Worker` constructor: +Worker threads spawned from packaged applications don't inherit VFS hooks from the main thread — `@roberts_lando/vfs` only patches the main thread's `fs` and module system. The SEA bootstrap solves this by monkey-patching the `Worker` constructor: ``` workerThreads.Worker(filename, options) @@ -276,46 +291,52 @@ workerThreads.Worker(filename, options) │ └─ filename inside /snapshot: ├─ Read worker source from VFS via fs.readFileSync (intercepted) - ├─ Prepend self-contained worker bootstrap - │ (inlined at build time via WORKER_BOOTSTRAP_CODE) - ├─ Append __filename, __dirname, module.paths setup + ├─ Prepend worker VFS bootstrap (bundled sea-vfs-setup.js) + ├─ Wrap in Module._compile for correct require() resolution + │ (sets __filename, __dirname, module.paths from snapshot path) └─ Spawn with { eval: true } → worker runs in-memory ``` -**Worker Bootstrap (`prelude/sea-worker-bootstrap.js`, ~135 lines):** - -The worker bootstrap is a self-contained VFS implementation that reads directly from SEA assets via `node:sea`. It does NOT use `@platformatic/vfs` — instead it monkey-patches `fs` and `Module` directly, similar to the traditional bootstrap approach: +**Worker Entry (`prelude/sea-worker-entry.js`, 11 lines):** -- **`fs.readFileSync`** — Intercepts snapshot paths, reads from SEA assets via `sea.getRawAsset(key)` -- **`fs.existsSync`** — Checks manifest stats for snapshot paths -- **`fs.statSync`** — Returns metadata from manifest for snapshot paths -- **`fs.readdirSync`** — Returns directory entries from manifest -- **`Module._resolveFilename`** — Resolves `require()` calls within the snapshot (handles relative paths, node_modules, package.json `main` fields, extension resolution) -- **`Module._extensions['.js']` / `['.json']`** — Compiles/parses files from SEA assets +The worker entry is minimal — it simply `require('./sea-vfs-setup')`, which sets up the same `SEAProvider` + `@roberts_lando/vfs` mount as the main thread. This means workers get the exact same VFS implementation (same archive blob, same `Buffer.subarray()` extraction, same 164+ fs function intercepts) with no code duplication. -This approach is necessary because `@platformatic/vfs` relies on module hooks and process-level patching that may not transfer cleanly to `eval`'d worker code. +**Build-time bundling:** -**Build-time inlining:** - -The worker bootstrap is inlined into the main bundle at build time by `scripts/build-sea-bootstrap.js`, which uses esbuild's `define` option to replace the `WORKER_BOOTSTRAP_CODE` placeholder with the stringified worker bootstrap source: +The worker entry is bundled into a self-contained string at build time by `scripts/build-sea-bootstrap.js` (49 lines), using a 2-step esbuild process: ```javascript -// scripts/build-sea-bootstrap.js -require('esbuild').buildSync({ - ... - define: { - WORKER_BOOTSTRAP_CODE: JSON.stringify(workerCode), - }, +// Step 1: Bundle sea-worker-entry.js → string module +const workerResult = esbuild.buildSync({ + entryPoints: ['prelude/sea-worker-entry.js'], + bundle: true, + platform: 'node', + target: 'node22', + write: false, + external: ['node:sea', 'node:vfs'], +}); +// Write as: module.exports = ""; +fs.writeFileSync( + 'prelude/_worker-bootstrap-string.js', + `module.exports = ${JSON.stringify(workerResult.outputFiles[0].text)};\n`, +); + +// Step 2: Bundle sea-bootstrap.js (which require()s the string module) +esbuild.buildSync({ + entryPoints: ['prelude/sea-bootstrap.js'], + bundle: true, + outfile: 'prelude/sea-bootstrap.bundle.js', + external: ['node:sea', 'node:vfs'], }); ``` -This keeps the worker bootstrap as a separate, readable source file while ensuring it ships as a single bundle. +This approach keeps the worker VFS setup as a shared module (`sea-vfs-setup.js`) used by both the main thread and worker threads, while shipping everything as a single bundle. --- ## Shared Runtime Code -`prelude/bootstrap-shared.js` (255 lines) contains runtime patches used by both bootstraps: +`prelude/bootstrap-shared.js` (~438 lines) contains runtime patches used by both bootstraps: ### Injection Mechanisms @@ -329,7 +350,7 @@ This keeps the worker bootstrap as a separate, readable source file while ensuri })(); ``` -- **SEA bootstrap**: `require('./bootstrap-shared')` is resolved at build time by esbuild and bundled into `sea-bootstrap.bundle.js`. +- **SEA bootstrap**: `require('./bootstrap-shared')` is resolved at build time by esbuild and bundled into `sea-bootstrap.bundle.js`. The shared module is also available to worker threads via the bundled `sea-vfs-setup.js`. ### Shared Functions @@ -381,14 +402,14 @@ SIZE_LIMIT_PKG=1048576 DEBUG_PKG=1 ./my-packaged-app # flag files > 1MB ## Performance Comparison -| Aspect | Traditional `pkg` | Enhanced SEA | -| -------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------ | -| **Startup time** | V8 bytecode loads faster than parsing source — bytecode is pre-compiled. `vm.Script` with `cachedData` skips the parsing phase | `useCodeCache: true` provides similar optimization. Without it, every launch re-parses source from scratch | -| **Memory footprint** | Payload accessed via file descriptor reads on demand at computed offsets. Files loaded only when accessed | `sea.getRawAsset()` returns a zero-copy `ArrayBuffer` reference to the executable's mapped memory. With lazy `SEAProvider`, only accessed files are buffered | -| **Executable size** | Brotli/GZip compression reduces payload by 60-80%. Dictionary path compression adds 5-15% reduction | SEA assets are stored uncompressed. Executable size will be larger for the same project | -| **Build time** | V8 bytecode compilation spawns a Node.js process per file via fabricator. Cross-arch bytecode needs QEMU/Rosetta. Expensive for large projects | No bytecode step. Pipeline: walk deps, write assets, generate blob, inject. Significantly faster | -| **Module loading** | Custom `require` implementation in bootstrap. Each module loaded from VFS via binary offset reads. Synchronous only | VFS polyfill patches `require`/`import` at module resolution level. 164+ fs functions intercepted. ESM module hooks supported natively | -| **Native addons** | Extracted to `~/.cache/pkg//` on first load, SHA256-verified, persisted across runs | Same extraction strategy via shared `patchDlopen()`. Uses `fs.cpSync` for package folder copying | +| Aspect | Traditional `pkg` | Enhanced SEA | +| -------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| **Startup time** | V8 bytecode loads faster than parsing source — bytecode is pre-compiled. `vm.Script` with `cachedData` skips the parsing phase | `useCodeCache: true` provides similar optimization. Without it, every launch re-parses source from scratch | +| **Memory footprint** | Payload accessed via file descriptor reads on demand at computed offsets. Files loaded only when accessed | `sea.getRawAsset('__pkg_archive__')` loads the entire archive as a zero-copy `ArrayBuffer`. Individual files are extracted via `Buffer.subarray()` and cached in a `Map` on first access | +| **Executable size** | Brotli/GZip compression reduces payload by 60-80%. Dictionary path compression adds 5-15% reduction | Single archive blob is stored uncompressed. Executable size will be larger for the same project | +| **Build time** | V8 bytecode compilation spawns a Node.js process per file via fabricator. Cross-arch bytecode needs QEMU/Rosetta. Expensive for large projects | No bytecode step. Pipeline: walk deps, write assets, generate blob, inject. Significantly faster | +| **Module loading** | Custom `require` implementation in bootstrap. Each module loaded from VFS via binary offset reads. Synchronous only | VFS polyfill patches `require`/`import` at module resolution level. 164+ fs functions intercepted. ESM module hooks supported natively | +| **Native addons** | Extracted to `~/.cache/pkg//` on first load, SHA256-verified, persisted across runs | Same extraction strategy via shared `patchDlopen()`. Uses `fs.cpSync` for package folder copying | ### Note on `--no-bytecode` @@ -398,13 +419,13 @@ Traditional mode supports a `--no-bytecode` flag that skips V8 bytecode compilat ## Code Protection Comparison -| Aspect | Traditional `pkg` | Enhanced SEA | -| ----------------------- | ------------------------------------------------------------------------------------------------------------------------ | ---------------------------------------------------------------------------------------------------------------------------------------- | -| **Source code storage** | Can be fully stripped — `STORE_BLOB` with `sourceless: true` stores only V8 bytecode, no source recoverable | Source code stored as SEA assets in plaintext. `useCodeCache: true` adds a code cache alongside source but does NOT strip it | -| **Reverse engineering** | V8 bytecode requires specialized tools (`v8-decompile`) to reverse. Not trivially readable | Standard text assets extractable from executable resource section using `readelf`/`xxd` or by searching for the `NODE_SEA_FUSE` sentinel | -| **Binary format** | Custom VFS format with offset-based access, optional Brotli/GZip compression, base36 dictionary path compression | Standard OS resource format (PE `.rsrc`, ELF notes, Mach-O segments) — well-documented, easier to parse | -| **Payload location** | Custom byte offsets injected via placeholder replacement. Requires understanding pkg's specific binary layout to extract | Standard `NODE_SEA_BLOB` resource name. `postject` uses OS-native resource embedding | -| **Runtime access** | Accessed via file descriptor reads at computed offsets. No standard tooling to extract | Accessed via `sea.getAsset(key)` — official Node.js API, assets are first-class | +| Aspect | Traditional `pkg` | Enhanced SEA | +| ----------------------- | ------------------------------------------------------------------------------------------------------------------------ | ---------------------------------------------------------------------------------------------------------------------------------- | +| **Source code storage** | Can be fully stripped — `STORE_BLOB` with `sourceless: true` stores only V8 bytecode, no source recoverable | Source code stored as SEA assets in plaintext. `useCodeCache: true` adds a code cache alongside source but does NOT strip it | +| **Reverse engineering** | V8 bytecode requires specialized tools (`v8-decompile`) to reverse. Not trivially readable | Single archive blob extractable from executable resource section using `readelf`/`xxd`. Source files are concatenated in plaintext | +| **Binary format** | Custom VFS format with offset-based access, optional Brotli/GZip compression, base36 dictionary path compression | Standard OS resource format (PE `.rsrc`, ELF notes, Mach-O segments) — well-documented, easier to parse | +| **Payload location** | Custom byte offsets injected via placeholder replacement. Requires understanding pkg's specific binary layout to extract | Standard `NODE_SEA_BLOB` resource name. `postject` uses OS-native resource embedding | +| **Runtime access** | Accessed via file descriptor reads at computed offsets. No standard tooling to extract | Archive loaded via `sea.getRawAsset()`, files extracted via `Buffer.subarray()` using manifest offsets | **Key takeaway**: Traditional `pkg` offers significantly stronger code protection through V8 bytecode compilation with source stripping. SEA mode stores source code in plaintext within the executable. This is a fundamental limitation of the Node.js SEA design — there is no `sourceless` equivalent. @@ -434,13 +455,13 @@ For users who require code protection with SEA mode: ### Current (April 2026) -| Dependency | Purpose | Status | -| ---------------------- | ------------------------------------------------------------- | -------------------------------------------------------------------------------------- | -| `node:sea` API | Asset storage and retrieval in SEA executables | Stable, Node 20+ (pkg requires 22+, aligned with `engines.node`) | -| `@platformatic/vfs` | VFS polyfill — patches `fs`, `fs/promises`, and module loader | Published, Node 22+, maintained by Matteo Collina | -| `postject` | Injects `NODE_SEA_BLOB` resource into executables | Stable, used by Node.js project | -| `--build-sea` flag | Single-step SEA blob generation | Node 25.5+ | -| `mainFormat: "module"` | ESM entry point in SEA config | Node 25.7+ (merged via [nodejs/node#61813](https://github.com/nodejs/node/pull/61813)) | +| Dependency | Purpose | Status | +| ---------------------- | -------------------------------------------------------------- | -------------------------------------------------------------------------------------- | +| `node:sea` API | Archive blob and manifest storage/retrieval in SEA executables | Stable, Node 20+ (pkg requires 22+, aligned with `engines.node`) | +| `@roberts_lando/vfs` | VFS polyfill — patches `fs`, `fs/promises`, and module loader | Published, Node 22+, maintained by Matteo Collina | +| `postject` | Injects `NODE_SEA_BLOB` resource into executables | Stable, used by Node.js project | +| `--build-sea` flag | Single-step SEA blob generation | Node 25.5+ | +| `mainFormat: "module"` | ESM entry point in SEA config | Node 25.7+ (merged via [nodejs/node#61813](https://github.com/nodejs/node/pull/61813)) | ### Future @@ -448,14 +469,14 @@ For users who require code protection with SEA mode: | ---------- | --------------------------------- | ----------------------------------------------------------------------------------- | | `node:vfs` | Native VFS module in Node.js core | Open PR [nodejs/node#61478](https://github.com/nodejs/node/pull/61478), 8 approvals | -When `node:vfs` lands in Node.js core, `@platformatic/vfs` will be deprecated. The SEA bootstrap already includes a migration path: +When `node:vfs` lands in Node.js core, `@roberts_lando/vfs` will be deprecated. `sea-vfs-setup.js` already includes a migration path: ```javascript var vfsModule; try { vfsModule = require('node:vfs'); // native, when available } catch (_) { - vfsModule = require('@platformatic/vfs'); // polyfill fallback + vfsModule = require('@roberts_lando/vfs'); // polyfill fallback } ``` @@ -465,20 +486,21 @@ With `node:vfs` and `"useVfs": true` in the SEA config, assets will be auto-moun ## File Reference -| File | Lines | Purpose | -| --------------------------------- | ----- | ------------------------------------------------------------------------ | -| `prelude/bootstrap.js` | ~1970 | Traditional runtime bootstrap (fs/module/process patching) | -| `prelude/bootstrap-shared.js` | ~255 | Shared runtime patches (dlopen, child_process, process.pkg) | -| `prelude/sea-bootstrap.js` | ~250 | SEA runtime bootstrap (VFS setup, lazy SEAProvider, worker patch) | -| `prelude/sea-worker-bootstrap.js` | ~135 | Self-contained worker thread bootstrap (fs/Module patching via node:sea) | -| `scripts/build-sea-bootstrap.js` | ~22 | Build script: bundles sea-bootstrap + inlines worker bootstrap | -| `lib/index.ts` | ~726 | CLI entry point, mode routing | -| `lib/walker.ts` | ~1304 | Dependency walker (with seaMode support) | -| `lib/packer.ts` | ~194 | Serializes walker output into stripes + prelude wrapper | -| `lib/producer.ts` | ~601 | Assembles final binary (payload injection, compression) | -| `lib/sea.ts` | ~561 | SEA orchestrator (seaEnhanced + simple sea) | -| `lib/sea-assets.ts` | ~105 | Generates SEA asset map + manifest JSON | -| `lib/fabricator.ts` | ~173 | V8 bytecode compilation (traditional mode only) | -| `lib/esm-transformer.ts` | ~434 | ESM to CJS transformation (traditional mode only) | -| `lib/refiner.ts` | ~110 | Path compression, empty directory pruning | -| `lib/common.ts` | ~369 | Path normalization, snapshot helpers, store constants | +| File | Lines | Purpose | +| -------------------------------- | ----- | ------------------------------------------------------------------------ | +| `prelude/bootstrap.js` | ~1970 | Traditional runtime bootstrap (fs/module/process patching) | +| `prelude/bootstrap-shared.js` | ~438 | Shared runtime patches (dlopen, child_process, process.pkg, diagnostics) | +| `prelude/sea-bootstrap.js` | ~158 | SEA main entry (shared patches, worker thread interception, entrypoint) | +| `prelude/sea-vfs-setup.js` | ~434 | SEA VFS core: SEAProvider, archive loading, VFS mount, Windows patches | +| `prelude/sea-worker-entry.js` | ~11 | Worker thread entry: requires sea-vfs-setup.js for VFS in workers | +| `scripts/build-sea-bootstrap.js` | ~49 | Build script: 2-step esbuild bundling of SEA bootstrap + worker string | +| `lib/index.ts` | ~726 | CLI entry point, mode routing | +| `lib/walker.ts` | ~1311 | Dependency walker (with seaMode support) | +| `lib/packer.ts` | ~202 | Serializes walker output into stripes + prelude wrapper | +| `lib/producer.ts` | ~601 | Assembles final binary (payload injection, compression) | +| `lib/sea.ts` | ~579 | SEA orchestrator (seaEnhanced + simple sea) | +| `lib/sea-assets.ts` | ~158 | Generates single archive blob + manifest with offsets | +| `lib/fabricator.ts` | ~173 | V8 bytecode compilation (traditional mode only) | +| `lib/esm-transformer.ts` | ~434 | ESM to CJS transformation (traditional mode only) | +| `lib/refiner.ts` | ~110 | Path compression, empty directory pruning | +| `lib/common.ts` | ~375 | Path normalization, snapshot helpers, store constants | From 3fb1387692f3f176fa6623ee9bb141ac83793f12 Mon Sep 17 00:00:00 2001 From: robertsLando Date: Wed, 8 Apr 2026 15:51:03 +0200 Subject: [PATCH 34/41] fix: enable model invocation for performances-compare skill --- .claude/skills/performances-compare/SKILL.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.claude/skills/performances-compare/SKILL.md b/.claude/skills/performances-compare/SKILL.md index a477d26d8..b7ac16ccb 100644 --- a/.claude/skills/performances-compare/SKILL.md +++ b/.claude/skills/performances-compare/SKILL.md @@ -2,7 +2,7 @@ name: performances-compare description: Run packaging performance benchmarks comparing Standard PKG vs SEA modes (with/without bundling) on a Node.js project. Default target is zwave-js-ui. Measures build time, binary size, and startup time. user-invocable: true -disable-model-invocation: true +disable-model-invocation: false argument-hint: [project-path] allowed-tools: Read Bash Grep Glob Agent Edit Write TaskCreate TaskUpdate TaskGet TaskList effort: high From 051c73b1f7689b9f5534c6e1b1317b30e3528c5c Mon Sep 17 00:00:00 2001 From: robertsLando Date: Wed, 8 Apr 2026 15:52:04 +0200 Subject: [PATCH 35/41] refactor: replace @platformatic/vfs with @roberts_lando/vfs@0.3.0 Swap the VFS polyfill dependency from @platformatic/vfs to @roberts_lando/vfs@0.3.0 across all source, prelude, scripts, and documentation files. Co-Authored-By: Claude Opus 4.6 (1M context) --- lib/sea-assets.ts | 2 +- lib/sea.ts | 2 +- package-lock.json | 20 ++++++++++---------- package.json | 2 +- plans/SEA_VFS_IMPLEMENTATION_PLAN.md | 22 +++++++++++----------- prelude/sea-bootstrap.js | 6 +++--- prelude/sea-vfs-setup.js | 8 ++++---- prelude/sea-worker-entry.js | 4 ++-- scripts/build-sea-bootstrap.js | 4 ++-- yarn.lock | 10 +++++----- 10 files changed, 40 insertions(+), 40 deletions(-) diff --git a/lib/sea-assets.ts b/lib/sea-assets.ts index 373dacdac..1e3ed977d 100644 --- a/lib/sea-assets.ts +++ b/lib/sea-assets.ts @@ -42,7 +42,7 @@ function toPosixKey(p: string): string { * key. The manifest contains an `offsets` map of key → [byteOffset, byteLength] * so the runtime can extract individual files via zero-copy Buffer.subarray(). * - * Asset keys use refiner paths (no /snapshot prefix) because @platformatic/vfs + * Asset keys use refiner paths (no /snapshot prefix) because @roberts_lando/vfs * strips the mount prefix before passing paths to the provider. The entrypoint * in the manifest uses the snapshotified path for process.argv[1] compatibility. * diff --git a/lib/sea.ts b/lib/sea.ts index 2d0422321..a8b516076 100644 --- a/lib/sea.ts +++ b/lib/sea.ts @@ -409,7 +409,7 @@ async function withSeaTmpDir( /** * Validate that the host Node.js version supports SEA. * Although node:sea is stable from Node 20, pkg requires 22+ to align with - * engines.node and the @platformatic/vfs dependency. + * engines.node and the @roberts_lando/vfs dependency. */ function assertSeaNodeVersion() { const nodeMajor = parseInt(process.version.slice(1).split('.')[0], 10); diff --git a/package-lock.json b/package-lock.json index 0209a76ff..e21fc39b3 100644 --- a/package-lock.json +++ b/package-lock.json @@ -13,7 +13,7 @@ "@babel/parser": "^7.23.0", "@babel/traverse": "^7.23.0", "@babel/types": "^7.23.0", - "@platformatic/vfs": "^0.3.0", + "@roberts_lando/vfs": "^0.3.0", "@yao-pkg/pkg-fetch": "3.5.33", "esbuild": "^0.27.3", "into-stream": "^9.1.0", @@ -1061,15 +1061,6 @@ "url": "https://github.com/phun-ky/typeof?sponsor=1" } }, - "node_modules/@platformatic/vfs": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/@platformatic/vfs/-/vfs-0.3.0.tgz", - "integrity": "sha512-BGXVOAz59HYPZCgI9v/MtiTF/ng8YAWtkooxVwOPR3TatNgGy0WZ/t15ScqytiZi5NdSRqWNRfuAbXKeAlKDdQ==", - "license": "MIT", - "engines": { - "node": ">= 22" - } - }, "node_modules/@release-it/conventional-changelog": { "version": "10.0.5", "resolved": "https://registry.npmjs.org/@release-it/conventional-changelog/-/conventional-changelog-10.0.5.tgz", @@ -1092,6 +1083,15 @@ "release-it": "^18.0.0 || ^19.0.0" } }, + "node_modules/@roberts_lando/vfs": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@roberts_lando/vfs/-/vfs-0.3.0.tgz", + "integrity": "sha512-lXOgbSdVWmqSng5QdAhUaD6mxkDXg93vc1t9a42Yy05N+HVxFj1EVk+yQ8EqQv/2xv4UbfX3AS3jast2iw8UXA==", + "license": "MIT", + "engines": { + "node": ">= 22" + } + }, "node_modules/@rtsao/scc": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@rtsao/scc/-/scc-1.1.0.tgz", diff --git a/package.json b/package.json index ece0aa62b..feddc3d70 100644 --- a/package.json +++ b/package.json @@ -26,7 +26,7 @@ "@babel/parser": "^7.23.0", "@babel/traverse": "^7.23.0", "@babel/types": "^7.23.0", - "@platformatic/vfs": "^0.3.0", + "@roberts_lando/vfs": "^0.3.0", "@yao-pkg/pkg-fetch": "3.5.33", "esbuild": "^0.27.3", "into-stream": "^9.1.0", diff --git a/plans/SEA_VFS_IMPLEMENTATION_PLAN.md b/plans/SEA_VFS_IMPLEMENTATION_PLAN.md index 767e7725f..172bd529c 100644 --- a/plans/SEA_VFS_IMPLEMENTATION_PLAN.md +++ b/plans/SEA_VFS_IMPLEMENTATION_PLAN.md @@ -41,7 +41,7 @@ Evolve `--sea` into a full pipeline that reuses the existing walker for dependen | `--build-sea` (single-step build) | Stable | Node 25.5+ | Replaces `--experimental-sea-config` + `postject` | | `mainFormat: "module"` (ESM entry) | Merged | Node 25.7+ | [PR #61813](https://github.com/nodejs/node/pull/61813) | | `node:vfs` (built-in VFS) | Open PR | TBD | [PR #61478](https://github.com/nodejs/node/pull/61478), 8 approvals | -| `@platformatic/vfs` (polyfill) | Published | Node 22+ | Same author as PR #61478, will deprecate when core lands | +| `@roberts_lando/vfs` (polyfill) | Published | Node 22+ | Same author as PR #61478, will deprecate when core lands | --- @@ -71,7 +71,7 @@ Evolve `--sea` into a full pipeline that reuses the existing walker for dependen | **Memory footprint** | Payload accessed via file descriptor reads on demand (`readPayloadSync` at computed offsets). Files loaded only when accessed | SEA `getRawAsset()` returns a zero-copy `ArrayBuffer` reference to the executable's mapped memory — very efficient. With custom `SEAProvider`, memory usage is comparable | | **Executable size** | Brotli/GZip compression available — can reduce payload by 60-80%. Dictionary path compression adds 5-15% reduction | SEA assets are stored uncompressed. Executable size will be larger for the same project. Compression would require build-time compression + runtime decompression in bootstrap | | **Build time** | V8 bytecode compilation requires spawning a Node.js process per file via fabricator. Cross-arch bytecode needs QEMU/Rosetta. Expensive for large projects | No bytecode compilation step. Build is: walk deps + write assets + generate blob + inject. Significantly faster for large projects | -| **Module loading** | Custom `require` implementation in bootstrap. Each module loaded from VFS via offset reads. Synchronous | VFS polyfill patches `require`/`import` at module resolution level. `@platformatic/vfs` handles 164+ fs functions. Module hooks support ESM natively | +| **Module loading** | Custom `require` implementation in bootstrap. Each module loaded from VFS via offset reads. Synchronous | VFS polyfill patches `require`/`import` at module resolution level. `@roberts_lando/vfs` handles 164+ fs functions. Module hooks support ESM natively | | **Native addons** | Extracted to `~/.cache/pkg/` on first load, SHA256-verified, persisted across runs (`bootstrap.js:155-242`) | Same approach needed — extract from VFS to temp dir, load via `process.dlopen`. Can reuse identical caching strategy | **Key takeaway**: SEA mode trades code protection for build speed and Node.js compatibility. The zero-copy asset access via `getRawAsset()` provides excellent runtime memory efficiency. Build times are substantially faster since there is no bytecode compilation step. However, executable size will be larger without compression support. @@ -91,22 +91,22 @@ Evolve `--sea` into a full pipeline that reuses the existing walker for dependen ## Architecture Decisions -### D1: Use `@platformatic/vfs` as VFS runtime +### D1: Use `@roberts_lando/vfs` as VFS runtime -Building a custom layer that patches 164+ fs functions + module resolution would duplicate `@platformatic/vfs`. The polyfill is maintained by the same author as `node:vfs` PR #61478. Migration path when `node:vfs` lands in core: +Building a custom layer that patches 164+ fs functions + module resolution would duplicate `@roberts_lando/vfs`. The polyfill is maintained by the same author as `node:vfs` PR #61478. Migration path when `node:vfs` lands in core: ```javascript let vfs; try { vfs = require('node:vfs'); } catch { - vfs = require('@platformatic/vfs'); + vfs = require('@roberts_lando/vfs'); } ``` ### D2: Bundle VFS polyfill into self-contained SEA bootstrap at build time -SEA `main` must be self-contained. Use `esbuild` (already a project dependency) to bundle `prelude/sea-bootstrap.js` + `@platformatic/vfs` into a single file at `pkg` build time. +SEA `main` must be self-contained. Use `esbuild` (already a project dependency) to bundle `prelude/sea-bootstrap.js` + `@roberts_lando/vfs` into a single file at `pkg` build time. ### D3: Skip ESM-to-CJS transform and V8 bytecode in SEA mode @@ -126,7 +126,7 @@ Enhanced mode activates when `--sea` is used with a package.json/directory input ### D7: Minimum target Node 22+ for enhanced SEA -`@platformatic/vfs` requires Node >= 22. Node 20 reaches EOL April 2026. +`@roberts_lando/vfs` requires Node >= 22. Node 20 reaches EOL April 2026. --- @@ -140,7 +140,7 @@ Enhanced mode activates when `--sea` is used with a package.json/directory input **Changes:** -1. Add `@platformatic/vfs` to `dependencies` +1. Add `@roberts_lando/vfs` to `dependencies` 2. Add `build:sea-bootstrap` script: ```json "build:sea-bootstrap": "esbuild prelude/sea-bootstrap.js --bundle --platform=node --target=node22 --outfile=prelude/sea-bootstrap.bundle.js --external:node:sea --external:node:fs --external:node:path --external:node:os --external:node:crypto --external:node:module --external:node:vfs" @@ -217,7 +217,7 @@ export async function generateSeaAssets( **New file:** `prelude/sea-bootstrap.js` -This becomes the SEA `main` entry. Bundled with `@platformatic/vfs` at build time. +This becomes the SEA `main` entry. Bundled with `@roberts_lando/vfs` at build time. **Execution flow:** @@ -447,13 +447,13 @@ Extract the extraction logic into `prelude/native-addon-extract.js`. Both bootst | Risk | Impact | Mitigation | | ------------------------------------ | ------------------------------- | ------------------------------------------------------------------------------------------------------- | -| `@platformatic/vfs` bundle size | Larger executable | esbuild tree-shaking. Only import `MemoryProvider` + `VirtualFileSystem`. Measure before/after | +| `@roberts_lando/vfs` bundle size | Larger executable | esbuild tree-shaking. Only import `MemoryProvider` + `VirtualFileSystem`. Measure before/after | | VFS startup latency (large projects) | Slow cold start | Custom `SEAProvider` with lazy `sea.getRawAsset()` — no upfront loading | | Polyfill API instability | Breaking changes | Pin dependency version. Abstract VFS init behind internal interface | | Cross-platform native addons | Wrong `.node` binary for target | Warn when cross-compiling with native addons. Reuse `prebuild-install` logic from `lib/producer.ts:229` | | Large asset counts in SEA | Unknown Node.js limits | Test with 1000+ assets early. File a Node.js issue if limits discovered | | Source code exposure in SEA | IP concerns | Document clearly in README. Recommend traditional mode for code protection needs | -| `node:vfs` lands with different API | Migration friction | Thin abstraction layer in bootstrap. `@platformatic/vfs` author aligns API with PR | +| `node:vfs` lands with different API | Migration friction | Thin abstraction layer in bootstrap. `@roberts_lando/vfs` author aligns API with PR | --- diff --git a/prelude/sea-bootstrap.js b/prelude/sea-bootstrap.js index 9bd6784ef..72ae831b9 100644 --- a/prelude/sea-bootstrap.js +++ b/prelude/sea-bootstrap.js @@ -5,7 +5,7 @@ // It sets up a Virtual File System from SEA-embedded assets so that // fs.readFileSync, require, import, etc. work transparently on packaged files. // -// TODO: Remove the node_modules/@platformatic/vfs patches once +// TODO: Remove the node_modules/@roberts_lando/vfs patches once // https://github.com/platformatic/vfs/pull/9 is merged and released. var path = require('path'); @@ -53,7 +53,7 @@ if (manifest.debug) { // Worker threads don't inherit VFS hooks from the main thread. // Monkey-patch the Worker constructor so that when a worker is spawned // with a /snapshot/... path, we inject a bundled VFS bootstrap that -// reuses the same @platformatic/vfs module hooks as the main thread. +// reuses the same @roberts_lando/vfs module hooks as the main thread. (function patchWorkerThreads() { var workerThreads; try { @@ -68,7 +68,7 @@ if (manifest.debug) { var _fsForWorker = require('fs'); // Worker bootstrap is bundled separately by esbuild from sea-worker-entry.js - // which requires the same sea-vfs-setup.js + @platformatic/vfs as the main + // which requires the same sea-vfs-setup.js + @roberts_lando/vfs as the main // thread — no hand-written VFS duplication. var workerBootstrap = require('./_worker-bootstrap-string'); diff --git a/prelude/sea-vfs-setup.js b/prelude/sea-vfs-setup.js index 56f3bae63..533af479e 100644 --- a/prelude/sea-vfs-setup.js +++ b/prelude/sea-vfs-setup.js @@ -10,10 +10,10 @@ try { vfsModule = require('node:vfs'); } catch (_) { try { - vfsModule = require('@platformatic/vfs'); + vfsModule = require('@roberts_lando/vfs'); } catch (e) { throw new Error( - 'pkg: VFS polyfill (@platformatic/vfs) is not available: ' + e.message, + 'pkg: VFS polyfill (@roberts_lando/vfs) is not available: ' + e.message, ); } } @@ -363,14 +363,14 @@ perf.start('vfs mount + hooks'); var provider = new SEAProvider(manifest); var virtualFs = new VirtualFileSystem(provider); -// Always mount with a POSIX prefix — @platformatic/vfs internally relies on +// Always mount with a POSIX prefix — @roberts_lando/vfs internally relies on // '/' as path separator (isUnderMountPoint, getRelativePath, etc.). // Our prototype patches below convert Windows paths to POSIX before they // reach the VFS, and Node's VFS module hooks use the V: sentinel drive // for subsequent path resolution, which normalizeVFSPath already handles. var SNAPSHOT_PREFIX = '/snapshot'; -// On Windows, @platformatic/vfs normalises with path.normalize() which +// On Windows, @roberts_lando/vfs normalises with path.normalize() which // uses backslashes, but isUnderMountPoint() uses '/'. Patch to convert. if (process.platform === 'win32') { var _winToVFS = function (p) { diff --git a/prelude/sea-worker-entry.js b/prelude/sea-worker-entry.js index 705d1667f..f096801fe 100644 --- a/prelude/sea-worker-entry.js +++ b/prelude/sea-worker-entry.js @@ -2,10 +2,10 @@ // Worker thread VFS entry point. // Bundled by esbuild at build time and inlined into the main bootstrap -// as a string. Uses the same @platformatic/vfs module hooks as the main +// as a string. Uses the same @roberts_lando/vfs module hooks as the main // thread — no hand-written VFS duplication. // -// TODO: Remove the node_modules/@platformatic/vfs patches once +// TODO: Remove the node_modules/@roberts_lando/vfs patches once // https://github.com/platformatic/vfs/pull/9 is merged and released. require('./sea-vfs-setup'); diff --git a/scripts/build-sea-bootstrap.js b/scripts/build-sea-bootstrap.js index f7b9bd8a1..9056e3571 100644 --- a/scripts/build-sea-bootstrap.js +++ b/scripts/build-sea-bootstrap.js @@ -8,7 +8,7 @@ const esbuild = require('esbuild'); const preludeDir = path.join(__dirname, '..', 'prelude'); // Step 1: Bundle the worker entry (sea-worker-entry.js → string). -// This bundles sea-vfs-setup.js + @platformatic/vfs into a single +// This bundles sea-vfs-setup.js + @roberts_lando/vfs into a single // self-contained script that workers can eval. const workerResult = esbuild.buildSync({ entryPoints: [path.join(preludeDir, 'sea-worker-entry.js')], @@ -30,7 +30,7 @@ fs.writeFileSync( ); // Step 2: Bundle the main bootstrap (sea-bootstrap.js). -// This also bundles sea-vfs-setup.js + @platformatic/vfs + the worker +// This also bundles sea-vfs-setup.js + @roberts_lando/vfs + the worker // string module into the final sea-bootstrap.bundle.js. try { esbuild.buildSync({ diff --git a/yarn.lock b/yarn.lock index 31d9199b7..6aabf4c37 100644 --- a/yarn.lock +++ b/yarn.lock @@ -464,11 +464,6 @@ resolved "https://registry.npmjs.org/@phun-ky/typeof/-/typeof-2.0.3.tgz" integrity sha512-oeQJs1aa8Ghke8JIK9yuq/+KjMiaYeDZ38jx7MhkXncXlUKjqQ3wEm2X3qCKyjo+ZZofZj+WsEEiqkTtRuE2xQ== -"@platformatic/vfs@^0.3.0": - version "0.3.0" - resolved "https://registry.npmjs.org/@platformatic/vfs/-/vfs-0.3.0.tgz" - integrity sha512-BGXVOAz59HYPZCgI9v/MtiTF/ng8YAWtkooxVwOPR3TatNgGy0WZ/t15ScqytiZi5NdSRqWNRfuAbXKeAlKDdQ== - "@release-it/conventional-changelog@^10.0.5": version "10.0.5" resolved "https://registry.npmjs.org/@release-it/conventional-changelog/-/conventional-changelog-10.0.5.tgz" @@ -482,6 +477,11 @@ conventional-recommended-bump "^11.2.0" semver "^7.7.3" +"@roberts_lando/vfs@^0.3.0": + version "0.3.0" + resolved "https://registry.npmjs.org/@roberts_lando/vfs/-/vfs-0.3.0.tgz" + integrity sha512-lXOgbSdVWmqSng5QdAhUaD6mxkDXg93vc1t9a42Yy05N+HVxFj1EVk+yQ8EqQv/2xv4UbfX3AS3jast2iw8UXA== + "@rtsao/scc@^1.1.0": version "1.1.0" resolved "https://registry.npmjs.org/@rtsao/scc/-/scc-1.1.0.tgz" From f64bf63ef718faa653c6a533030c68ecb48bc9b9 Mon Sep 17 00:00:00 2001 From: robertsLando Date: Wed, 8 Apr 2026 16:30:24 +0200 Subject: [PATCH 36/41] refactor: update Node.js version requirements and testing commands in documentation --- .claude/rules/development.md | 4 ++-- .claude/rules/project.md | 2 +- .claude/rules/testing.md | 3 +-- 3 files changed, 4 insertions(+), 5 deletions(-) diff --git a/.claude/rules/development.md b/.claude/rules/development.md index 59f2cb898..09735b3a8 100644 --- a/.claude/rules/development.md +++ b/.claude/rules/development.md @@ -25,9 +25,9 @@ npm run lint:style # Prettier only ## TypeScript -- Strict mode enabled. Target: ES2017. Module system: CommonJS. +- Strict mode enabled. Target: ES2022. Module system: CommonJS. - Edit `lib/*.ts` only — never edit `lib-es5/*.js` directly. -- Requires Node.js >= 20.0.0. +- Requires Node.js >= 22.0.0. ## Dependencies diff --git a/.claude/rules/project.md b/.claude/rules/project.md index f31da3145..49db112c1 100644 --- a/.claude/rules/project.md +++ b/.claude/rules/project.md @@ -4,7 +4,7 @@ description: Project overview, structure, and key files for yao-pkg/pkg # Project Overview -`pkg` packages Node.js projects into standalone executables for Linux, macOS, and Windows. It supports multiple Node.js versions (node20, node22+), virtual filesystem bundling, V8 bytecode compilation, native addons, and compression (Brotli, GZip). +`pkg` packages Node.js projects into standalone executables for Linux, macOS, and Windows. It supports Node.js 22 and newer, virtual filesystem bundling, V8 bytecode compilation, native addons, and compression (Brotli, GZip). This is `yao-pkg/pkg` — a maintained fork of the archived `vercel/pkg`. diff --git a/.claude/rules/testing.md b/.claude/rules/testing.md index de2e5ccce..55f8289f1 100644 --- a/.claude/rules/testing.md +++ b/.claude/rules/testing.md @@ -10,10 +10,9 @@ paths: ```bash npm run build # Always build first -npm run test:20 # Test with Node.js 20 npm run test:22 # Test with Node.js 22 npm run test:host # Test with host Node.js version -node test/test.js node20 no-npm test-50-* # Run specific test pattern +node test/test.js node22 no-npm test-50-* # Run specific test pattern ``` ## Organization From 9ed8ce562874c62deb82a2643bbf971c0cb23601 Mon Sep 17 00:00:00 2001 From: robertsLando Date: Wed, 8 Apr 2026 16:30:27 +0200 Subject: [PATCH 37/41] feat: track body modifications in stepStrip for enhanced record handling --- lib/walker.ts | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/lib/walker.ts b/lib/walker.ts index 9c26bc88e..daafe4b70 100644 --- a/lib/walker.ts +++ b/lib/walker.ts @@ -1004,7 +1004,11 @@ class Walker { (this.params.seaMode && (isDotJS(record.file) || isESMFile(record.file))) ) { + const bodyBefore = record.body; stepStrip(record); + if (record.body !== bodyBefore) { + record.bodyModified = true; + } } } From a53643000fb239e08e4134035a8dee6cd24928b7 Mon Sep 17 00:00:00 2001 From: robertsLando Date: Wed, 8 Apr 2026 16:51:28 +0200 Subject: [PATCH 38/41] chore: update @roberts_lando/vfs to version 0.3.1 in package.json, package-lock.json, and yarn.lock --- package-lock.json | 8 ++++---- package.json | 2 +- yarn.lock | 8 ++++---- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/package-lock.json b/package-lock.json index e21fc39b3..be62425e0 100644 --- a/package-lock.json +++ b/package-lock.json @@ -13,7 +13,7 @@ "@babel/parser": "^7.23.0", "@babel/traverse": "^7.23.0", "@babel/types": "^7.23.0", - "@roberts_lando/vfs": "^0.3.0", + "@roberts_lando/vfs": "^0.3.1", "@yao-pkg/pkg-fetch": "3.5.33", "esbuild": "^0.27.3", "into-stream": "^9.1.0", @@ -1084,9 +1084,9 @@ } }, "node_modules/@roberts_lando/vfs": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/@roberts_lando/vfs/-/vfs-0.3.0.tgz", - "integrity": "sha512-lXOgbSdVWmqSng5QdAhUaD6mxkDXg93vc1t9a42Yy05N+HVxFj1EVk+yQ8EqQv/2xv4UbfX3AS3jast2iw8UXA==", + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@roberts_lando/vfs/-/vfs-0.3.1.tgz", + "integrity": "sha512-JpTa6PKdy8a+AZI4TU1Kn2sx4QT02v8AcXFGIYM7FSay8Ji0IDl22BPAQkNdAgRjWyl+pfH9J+4AFWupNDXALg==", "license": "MIT", "engines": { "node": ">= 22" diff --git a/package.json b/package.json index feddc3d70..779a47372 100644 --- a/package.json +++ b/package.json @@ -26,7 +26,7 @@ "@babel/parser": "^7.23.0", "@babel/traverse": "^7.23.0", "@babel/types": "^7.23.0", - "@roberts_lando/vfs": "^0.3.0", + "@roberts_lando/vfs": "^0.3.1", "@yao-pkg/pkg-fetch": "3.5.33", "esbuild": "^0.27.3", "into-stream": "^9.1.0", diff --git a/yarn.lock b/yarn.lock index 6aabf4c37..a624e1383 100644 --- a/yarn.lock +++ b/yarn.lock @@ -477,10 +477,10 @@ conventional-recommended-bump "^11.2.0" semver "^7.7.3" -"@roberts_lando/vfs@^0.3.0": - version "0.3.0" - resolved "https://registry.npmjs.org/@roberts_lando/vfs/-/vfs-0.3.0.tgz" - integrity sha512-lXOgbSdVWmqSng5QdAhUaD6mxkDXg93vc1t9a42Yy05N+HVxFj1EVk+yQ8EqQv/2xv4UbfX3AS3jast2iw8UXA== +"@roberts_lando/vfs@^0.3.1": + version "0.3.1" + resolved "https://registry.npmjs.org/@roberts_lando/vfs/-/vfs-0.3.1.tgz" + integrity sha512-JpTa6PKdy8a+AZI4TU1Kn2sx4QT02v8AcXFGIYM7FSay8Ji0IDl22BPAQkNdAgRjWyl+pfH9J+4AFWupNDXALg== "@rtsao/scc@^1.1.0": version "1.1.0" From 394deb1a031b3514b26597013b5b4514806ee4a3 Mon Sep 17 00:00:00 2001 From: robertsLando Date: Wed, 8 Apr 2026 16:58:55 +0200 Subject: [PATCH 39/41] chore: update @roberts_lando/vfs to version 0.3.2 Co-Authored-By: Claude Opus 4.6 (1M context) --- package.json | 2 +- yarn.lock | 412 +++++++++++++++++++++++++++++++-------------------- 2 files changed, 254 insertions(+), 160 deletions(-) diff --git a/package.json b/package.json index 779a47372..cd74bd71a 100644 --- a/package.json +++ b/package.json @@ -26,7 +26,7 @@ "@babel/parser": "^7.23.0", "@babel/traverse": "^7.23.0", "@babel/types": "^7.23.0", - "@roberts_lando/vfs": "^0.3.1", + "@roberts_lando/vfs": "^0.3.2", "@yao-pkg/pkg-fetch": "3.5.33", "esbuild": "^0.27.3", "into-stream": "^9.1.0", diff --git a/yarn.lock b/yarn.lock index a624e1383..77e8a8948 100644 --- a/yarn.lock +++ b/yarn.lock @@ -83,11 +83,136 @@ "@simple-libs/stream-utils" "^1.1.0" semver "^7.5.2" +"@esbuild/aix-ppc64@0.27.3": + version "0.27.3" + resolved "https://registry.yarnpkg.com/@esbuild/aix-ppc64/-/aix-ppc64-0.27.3.tgz#815b39267f9bffd3407ea6c376ac32946e24f8d2" + integrity sha512-9fJMTNFTWZMh5qwrBItuziu834eOCUcEqymSH7pY+zoMVEZg3gcPuBNxH1EvfVYe9h0x/Ptw8KBzv7qxb7l8dg== + +"@esbuild/android-arm64@0.27.3": + version "0.27.3" + resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.27.3.tgz#19b882408829ad8e12b10aff2840711b2da361e8" + integrity sha512-YdghPYUmj/FX2SYKJ0OZxf+iaKgMsKHVPF1MAq/P8WirnSpCStzKJFjOjzsW0QQ7oIAiccHdcqjbHmJxRb/dmg== + +"@esbuild/android-arm@0.27.3": + version "0.27.3" + resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.27.3.tgz#90be58de27915efa27b767fcbdb37a4470627d7b" + integrity sha512-i5D1hPY7GIQmXlXhs2w8AWHhenb00+GxjxRncS2ZM7YNVGNfaMxgzSGuO8o8SJzRc/oZwU2bcScvVERk03QhzA== + +"@esbuild/android-x64@0.27.3": + version "0.27.3" + resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.27.3.tgz#d7dcc976f16e01a9aaa2f9b938fbec7389f895ac" + integrity sha512-IN/0BNTkHtk8lkOM8JWAYFg4ORxBkZQf9zXiEOfERX/CzxW3Vg1ewAhU7QSWQpVIzTW+b8Xy+lGzdYXV6UZObQ== + +"@esbuild/darwin-arm64@0.27.3": + version "0.27.3" + resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.27.3.tgz#9f6cac72b3a8532298a6a4493ed639a8988e8abd" + integrity sha512-Re491k7ByTVRy0t3EKWajdLIr0gz2kKKfzafkth4Q8A5n1xTHrkqZgLLjFEHVD+AXdUGgQMq+Godfq45mGpCKg== + +"@esbuild/darwin-x64@0.27.3": + version "0.27.3" + resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.27.3.tgz#ac61d645faa37fd650340f1866b0812e1fb14d6a" + integrity sha512-vHk/hA7/1AckjGzRqi6wbo+jaShzRowYip6rt6q7VYEDX4LEy1pZfDpdxCBnGtl+A5zq8iXDcyuxwtv3hNtHFg== + +"@esbuild/freebsd-arm64@0.27.3": + version "0.27.3" + resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.27.3.tgz#b8625689d73cf1830fe58c39051acdc12474ea1b" + integrity sha512-ipTYM2fjt3kQAYOvo6vcxJx3nBYAzPjgTCk7QEgZG8AUO3ydUhvelmhrbOheMnGOlaSFUoHXB6un+A7q4ygY9w== + +"@esbuild/freebsd-x64@0.27.3": + version "0.27.3" + resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.27.3.tgz#07be7dd3c9d42fe0eccd2ab9f9ded780bc53bead" + integrity sha512-dDk0X87T7mI6U3K9VjWtHOXqwAMJBNN2r7bejDsc+j03SEjtD9HrOl8gVFByeM0aJksoUuUVU9TBaZa2rgj0oA== + +"@esbuild/linux-arm64@0.27.3": + version "0.27.3" + resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.27.3.tgz#bf31918fe5c798586460d2b3d6c46ed2c01ca0b6" + integrity sha512-sZOuFz/xWnZ4KH3YfFrKCf1WyPZHakVzTiqji3WDc0BCl2kBwiJLCXpzLzUBLgmp4veFZdvN5ChW4Eq/8Fc2Fg== + +"@esbuild/linux-arm@0.27.3": + version "0.27.3" + resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.27.3.tgz#28493ee46abec1dc3f500223cd9f8d2df08f9d11" + integrity sha512-s6nPv2QkSupJwLYyfS+gwdirm0ukyTFNl3KTgZEAiJDd+iHZcbTPPcWCcRYH+WlNbwChgH2QkE9NSlNrMT8Gfw== + +"@esbuild/linux-ia32@0.27.3": + version "0.27.3" + resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.27.3.tgz#750752a8b30b43647402561eea764d0a41d0ee29" + integrity sha512-yGlQYjdxtLdh0a3jHjuwOrxQjOZYD/C9PfdbgJJF3TIZWnm/tMd/RcNiLngiu4iwcBAOezdnSLAwQDPqTmtTYg== + +"@esbuild/linux-loong64@0.27.3": + version "0.27.3" + resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.27.3.tgz#a5a92813a04e71198c50f05adfaf18fc1e95b9ed" + integrity sha512-WO60Sn8ly3gtzhyjATDgieJNet/KqsDlX5nRC5Y3oTFcS1l0KWba+SEa9Ja1GfDqSF1z6hif/SkpQJbL63cgOA== + +"@esbuild/linux-mips64el@0.27.3": + version "0.27.3" + resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.27.3.tgz#deb45d7fd2d2161eadf1fbc593637ed766d50bb1" + integrity sha512-APsymYA6sGcZ4pD6k+UxbDjOFSvPWyZhjaiPyl/f79xKxwTnrn5QUnXR5prvetuaSMsb4jgeHewIDCIWljrSxw== + +"@esbuild/linux-ppc64@0.27.3": + version "0.27.3" + resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.27.3.tgz#6f39ae0b8c4d3d2d61a65b26df79f6e12a1c3d78" + integrity sha512-eizBnTeBefojtDb9nSh4vvVQ3V9Qf9Df01PfawPcRzJH4gFSgrObw+LveUyDoKU3kxi5+9RJTCWlj4FjYXVPEA== + +"@esbuild/linux-riscv64@0.27.3": + version "0.27.3" + resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.27.3.tgz#4c5c19c3916612ec8e3915187030b9df0b955c1d" + integrity sha512-3Emwh0r5wmfm3ssTWRQSyVhbOHvqegUDRd0WhmXKX2mkHJe1SFCMJhagUleMq+Uci34wLSipf8Lagt4LlpRFWQ== + +"@esbuild/linux-s390x@0.27.3": + version "0.27.3" + resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.27.3.tgz#9ed17b3198fa08ad5ccaa9e74f6c0aff7ad0156d" + integrity sha512-pBHUx9LzXWBc7MFIEEL0yD/ZVtNgLytvx60gES28GcWMqil8ElCYR4kvbV2BDqsHOvVDRrOxGySBM9Fcv744hw== + "@esbuild/linux-x64@0.27.3": version "0.27.3" resolved "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.27.3.tgz" integrity sha512-Czi8yzXUWIQYAtL/2y6vogER8pvcsOsk5cpwL4Gk5nJqH5UZiVByIY8Eorm5R13gq+DQKYg0+JyQoytLQas4dA== +"@esbuild/netbsd-arm64@0.27.3": + version "0.27.3" + resolved "https://registry.yarnpkg.com/@esbuild/netbsd-arm64/-/netbsd-arm64-0.27.3.tgz#dd0cb2fa543205fcd931df44f4786bfcce6df7d7" + integrity sha512-sDpk0RgmTCR/5HguIZa9n9u+HVKf40fbEUt+iTzSnCaGvY9kFP0YKBWZtJaraonFnqef5SlJ8/TiPAxzyS+UoA== + +"@esbuild/netbsd-x64@0.27.3": + version "0.27.3" + resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.27.3.tgz#028ad1807a8e03e155153b2d025b506c3787354b" + integrity sha512-P14lFKJl/DdaE00LItAukUdZO5iqNH7+PjoBm+fLQjtxfcfFE20Xf5CrLsmZdq5LFFZzb5JMZ9grUwvtVYzjiA== + +"@esbuild/openbsd-arm64@0.27.3": + version "0.27.3" + resolved "https://registry.yarnpkg.com/@esbuild/openbsd-arm64/-/openbsd-arm64-0.27.3.tgz#e3c16ff3490c9b59b969fffca87f350ffc0e2af5" + integrity sha512-AIcMP77AvirGbRl/UZFTq5hjXK+2wC7qFRGoHSDrZ5v5b8DK/GYpXW3CPRL53NkvDqb9D+alBiC/dV0Fb7eJcw== + +"@esbuild/openbsd-x64@0.27.3": + version "0.27.3" + resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.27.3.tgz#c5a4693fcb03d1cbecbf8b422422468dfc0d2a8b" + integrity sha512-DnW2sRrBzA+YnE70LKqnM3P+z8vehfJWHXECbwBmH/CU51z6FiqTQTHFenPlHmo3a8UgpLyH3PT+87OViOh1AQ== + +"@esbuild/openharmony-arm64@0.27.3": + version "0.27.3" + resolved "https://registry.yarnpkg.com/@esbuild/openharmony-arm64/-/openharmony-arm64-0.27.3.tgz#082082444f12db564a0775a41e1991c0e125055e" + integrity sha512-NinAEgr/etERPTsZJ7aEZQvvg/A6IsZG/LgZy+81wON2huV7SrK3e63dU0XhyZP4RKGyTm7aOgmQk0bGp0fy2g== + +"@esbuild/sunos-x64@0.27.3": + version "0.27.3" + resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.27.3.tgz#5ab036c53f929e8405c4e96e865a424160a1b537" + integrity sha512-PanZ+nEz+eWoBJ8/f8HKxTTD172SKwdXebZ0ndd953gt1HRBbhMsaNqjTyYLGLPdoWHy4zLU7bDVJztF5f3BHA== + +"@esbuild/win32-arm64@0.27.3": + version "0.27.3" + resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.27.3.tgz#38de700ef4b960a0045370c171794526e589862e" + integrity sha512-B2t59lWWYrbRDw/tjiWOuzSsFh1Y/E95ofKz7rIVYSQkUYBjfSgf6oeYPNWHToFRr2zx52JKApIcAS/D5TUBnA== + +"@esbuild/win32-ia32@0.27.3": + version "0.27.3" + resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.27.3.tgz#451b93dc03ec5d4f38619e6cd64d9f9eff06f55c" + integrity sha512-QLKSFeXNS8+tHW7tZpMtjlNb7HKau0QDpwm49u0vUp9y1WOF+PEzkU84y9GqYaAVW8aH8f3GcBck26jh54cX4Q== + +"@esbuild/win32-x64@0.27.3": + version "0.27.3" + resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.27.3.tgz#0eaf705c941a218a43dba8e09f1df1d6cd2f1f17" + integrity sha512-4uJGhsxuptu3OcpVAzli+/gWusVGwZZHTlS63hh++ehExkVT8SgiEf7/uC/PclrPPkLhZqGgCTjd0VWLo6xMqA== + "@eslint-community/eslint-utils@^4.8.0", "@eslint-community/eslint-utils@^4.9.1": version "4.9.1" resolved "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.1.tgz" @@ -382,13 +507,13 @@ before-after-hook "^4.0.0" universal-user-agent "^7.0.0" -"@octokit/endpoint@^11.0.3": - version "11.0.3" - resolved "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-11.0.3.tgz" - integrity sha512-FWFlNxghg4HrXkD3ifYbS/IdL/mDHjh9QcsNyhQjN8dplUoZbejsdpmuqdA76nxj2xoWPs7p8uX2SNr9rYu0Ag== +"@octokit/endpoint@^9.0.6": + version "9.0.6" + resolved "https://registry.yarnpkg.com/@octokit/endpoint/-/endpoint-9.0.6.tgz#114d912108fe692d8b139cfe7fc0846dfd11b6c0" + integrity sha512-H1fNTMA57HbkFESSt3Y9+FBICv+0jFceJFPWDePYlR/iMGrwM5ph+Dd4XRQs+8X+PUFURLQgX9ChPfhJ/1uNQw== dependencies: - "@octokit/types" "^16.0.0" - universal-user-agent "^7.0.2" + "@octokit/types" "^13.1.0" + universal-user-agent "^6.0.0" "@octokit/graphql@^9.0.3": version "9.0.3" @@ -399,17 +524,27 @@ "@octokit/types" "^16.0.0" universal-user-agent "^7.0.0" +"@octokit/openapi-types@^20.0.0": + version "20.0.0" + resolved "https://registry.yarnpkg.com/@octokit/openapi-types/-/openapi-types-20.0.0.tgz#9ec2daa0090eeb865ee147636e0c00f73790c6e5" + integrity sha512-EtqRBEjp1dL/15V7WiX5LJMIxxkdiGJnabzYx5Apx4FkQIFgAfKumXeYAqqJCj1s+BMX4cPFIFC4OLCR6stlnA== + +"@octokit/openapi-types@^24.2.0": + version "24.2.0" + resolved "https://registry.yarnpkg.com/@octokit/openapi-types/-/openapi-types-24.2.0.tgz#3d55c32eac0d38da1a7083a9c3b0cca77924f7d3" + integrity sha512-9sIH3nSUttelJSXUrmGzl7QUBFul0/mB8HRYl3fOlgHbIWG+WnYDXU3v/2zMtAvuzZ/ed00Ei6on975FhBfzrg== + "@octokit/openapi-types@^27.0.0": version "27.0.0" resolved "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-27.0.0.tgz" integrity sha512-whrdktVs1h6gtR+09+QsNk2+FO+49j6ga1c55YZudfEG+oKJVvJLQi3zkOm5JjiUXAagWK2tI2kTGKJ2Ys7MGA== -"@octokit/plugin-paginate-rest@^14.0.0": - version "14.0.0" - resolved "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-14.0.0.tgz" - integrity sha512-fNVRE7ufJiAA3XUrha2omTA39M6IXIc6GIZLvlbsm8QOQCYvpq/LkMNGyFlB1d8hTDzsAXa3OKtybdMAYsV/fw== +"@octokit/plugin-paginate-rest@^14.0.0", "@octokit/plugin-paginate-rest@^9.2.2": + version "9.2.2" + resolved "https://registry.yarnpkg.com/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-9.2.2.tgz#c516bc498736bcdaa9095b9a1d10d9d0501ae831" + integrity sha512-u3KYkGF7GcZnSD/3UP0S7K5XUFT2FkOQdcfXZGZQPGv3lm4F2Xbf71lvjldr8c1H3nNbF+33cLEkWYbokGWqiQ== dependencies: - "@octokit/types" "^16.0.0" + "@octokit/types" "^12.6.0" "@octokit/plugin-request-log@^6.0.0": version "6.0.0" @@ -423,24 +558,24 @@ dependencies: "@octokit/types" "^16.0.0" -"@octokit/request-error@^7.0.2": - version "7.1.0" - resolved "https://registry.npmjs.org/@octokit/request-error/-/request-error-7.1.0.tgz" - integrity sha512-KMQIfq5sOPpkQYajXHwnhjCC0slzCNScLHs9JafXc4RAJI+9f+jNDlBNaIMTvazOPLgb4BnlhGJOTbnN0wIjPw== +"@octokit/request-error@^5.1.1", "@octokit/request-error@^7.0.2": + version "5.1.1" + resolved "https://registry.yarnpkg.com/@octokit/request-error/-/request-error-5.1.1.tgz#b9218f9c1166e68bb4d0c89b638edc62c9334805" + integrity sha512-v9iyEQJH6ZntoENr9/yXxjuezh4My67CBSu9r6Ve/05Iu5gNgnisNWOsoJHTP6k0Rr0+HQIpnH+kyammu90q/g== dependencies: - "@octokit/types" "^16.0.0" + "@octokit/types" "^13.1.0" + deprecation "^2.0.0" + once "^1.4.0" -"@octokit/request@^10.0.6": - version "10.0.8" - resolved "https://registry.npmjs.org/@octokit/request/-/request-10.0.8.tgz" - integrity sha512-SJZNwY9pur9Agf7l87ywFi14W+Hd9Jg6Ifivsd33+/bGUQIjNujdFiXII2/qSlN2ybqUHfp5xpekMEjIBTjlSw== +"@octokit/request@^10.0.6", "@octokit/request@^8.4.1": + version "8.4.1" + resolved "https://registry.yarnpkg.com/@octokit/request/-/request-8.4.1.tgz#715a015ccf993087977ea4365c44791fc4572486" + integrity sha512-qnB2+SY3hkCmBxZsR/MPCybNmbJe4KAlfWErXq+rBKkQJlbjdJeS85VI9r8UqeLYLvnAenU8Q1okM/0MBsAGXw== dependencies: - "@octokit/endpoint" "^11.0.3" - "@octokit/request-error" "^7.0.2" - "@octokit/types" "^16.0.0" - fast-content-type-parse "^3.0.0" - json-with-bigint "^3.5.3" - universal-user-agent "^7.0.2" + "@octokit/endpoint" "^9.0.6" + "@octokit/request-error" "^5.1.1" + "@octokit/types" "^13.1.0" + universal-user-agent "^6.0.0" "@octokit/rest@22.0.1": version "22.0.1" @@ -452,6 +587,20 @@ "@octokit/plugin-request-log" "^6.0.0" "@octokit/plugin-rest-endpoint-methods" "^17.0.0" +"@octokit/types@^12.6.0": + version "12.6.0" + resolved "https://registry.yarnpkg.com/@octokit/types/-/types-12.6.0.tgz#8100fb9eeedfe083aae66473bd97b15b62aedcb2" + integrity sha512-1rhSOfRa6H9w4YwK0yrf5faDaDTb+yLyBUKOCV4xtCDB5VmIPqd/v9yr9o6SAzOAlRxMiRiCic6JVM1/kunVkw== + dependencies: + "@octokit/openapi-types" "^20.0.0" + +"@octokit/types@^13.1.0": + version "13.10.0" + resolved "https://registry.yarnpkg.com/@octokit/types/-/types-13.10.0.tgz#3e7c6b19c0236c270656e4ea666148c2b51fd1a3" + integrity sha512-ifLaO34EbbPj0Xgro4G5lP5asESjwHracYJvVaPIyXMuiuXLlhic3S47cBdTb+jfODkTE5YtGCLt3Ay3+J97sA== + dependencies: + "@octokit/openapi-types" "^24.2.0" + "@octokit/types@^16.0.0": version "16.0.0" resolved "https://registry.npmjs.org/@octokit/types/-/types-16.0.0.tgz" @@ -477,10 +626,10 @@ conventional-recommended-bump "^11.2.0" semver "^7.7.3" -"@roberts_lando/vfs@^0.3.1": - version "0.3.1" - resolved "https://registry.npmjs.org/@roberts_lando/vfs/-/vfs-0.3.1.tgz" - integrity sha512-JpTa6PKdy8a+AZI4TU1Kn2sx4QT02v8AcXFGIYM7FSay8Ji0IDl22BPAQkNdAgRjWyl+pfH9J+4AFWupNDXALg== +"@roberts_lando/vfs@^0.3.2": + version "0.3.2" + resolved "https://registry.yarnpkg.com/@roberts_lando/vfs/-/vfs-0.3.2.tgz#a552390c4a64bd42dfcb54f0e897b240acdce074" + integrity sha512-whXj9v78S4n3t0RvoTGj8vui27VVtK/oy8YfBL+gDWdlfRFkKpPjry+U8p+3XM++5rAIpXEtXcTUgUAEHZVoFA== "@rtsao/scc@^1.1.0": version "1.1.0" @@ -648,7 +797,7 @@ "@typescript-eslint/types" "8.55.0" "@typescript-eslint/visitor-keys" "8.55.0" -"@typescript-eslint/tsconfig-utils@^8.55.0", "@typescript-eslint/tsconfig-utils@8.55.0": +"@typescript-eslint/tsconfig-utils@8.55.0", "@typescript-eslint/tsconfig-utils@^8.55.0": version "8.55.0" resolved "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.55.0.tgz" integrity sha512-1R9cXqY7RQd7WuqSN47PK9EDpgFUK3VqdmbYrvWJZYDd0cavROGn+74ktWBlmJ13NXUQKlZ/iAEQHI/V0kKe0Q== @@ -664,7 +813,7 @@ debug "^4.4.3" ts-api-utils "^2.4.0" -"@typescript-eslint/types@^8.55.0", "@typescript-eslint/types@8.55.0": +"@typescript-eslint/types@8.55.0", "@typescript-eslint/types@^8.55.0": version "8.55.0" resolved "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.55.0.tgz" integrity sha512-ujT0Je8GI5BJWi+/mMoR0wxwVEQaxM+pi30xuMiJETlX80OPovb2p9E8ss87gnSVtYXtJoU9U1Cowcr6w2FE0w== @@ -725,11 +874,6 @@ acorn@^8.15.0: resolved "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz" integrity sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg== -agent-base@^7.1.0, agent-base@^7.1.2: - version "7.1.4" - resolved "https://registry.npmjs.org/agent-base/-/agent-base-7.1.4.tgz" - integrity sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ== - agent-base@6: version "6.0.2" resolved "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz" @@ -737,6 +881,11 @@ agent-base@6: dependencies: debug "4" +agent-base@^7.1.0, agent-base@^7.1.2: + version "7.1.4" + resolved "https://registry.npmjs.org/agent-base/-/agent-base-7.1.4.tgz" + integrity sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ== + ajv@^6.12.4: version "6.12.6" resolved "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz" @@ -771,12 +920,7 @@ ansi-styles@^4.0.0, ansi-styles@^4.1.0: dependencies: color-convert "^2.0.1" -ansi-styles@^6.0.0: - version "6.2.3" - resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz" - integrity sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg== - -ansi-styles@^6.2.1: +ansi-styles@^6.0.0, ansi-styles@^6.2.1: version "6.2.3" resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz" integrity sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg== @@ -895,11 +1039,6 @@ balanced-match@^1.0.0: resolved "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz" integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== -balanced-match@^4.0.2: - version "4.0.4" - resolved "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz" - integrity sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA== - bare-events@^2.5.4, bare-events@^2.7.0: version "2.8.2" resolved "https://registry.npmjs.org/bare-events/-/bare-events-2.8.2.tgz" @@ -971,28 +1110,13 @@ bluebird@~3.7.2: resolved "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz" integrity sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg== -brace-expansion@^1.1.7: - version "1.1.13" - resolved "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.13.tgz" - integrity sha512-9ZLprWS6EENmhEOpjCYW2c8VkmOvckIJZfkr7rBW6dObmfgJ/L1GpSYW5Hpo9lDz4D1+n0Ckz8rU7FwHDQiG/w== - dependencies: - balanced-match "^1.0.0" - concat-map "0.0.1" - -brace-expansion@^2.0.1: - version "2.0.2" - resolved "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz" - integrity sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ== +brace-expansion@^1.1.7, brace-expansion@^2.0.1, brace-expansion@^2.0.2, brace-expansion@^5.0.2: + version "2.0.3" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-2.0.3.tgz#0493338bdd58e319b1039c67cf7ee439892c01d9" + integrity sha512-MCV/fYJEbqx68aE58kv2cA/kiky1G8vux3OR6/jbS+jIMe/6fJWa0DTzJU7dqijOWYwHi1t29FlfYI9uytqlpA== dependencies: balanced-match "^1.0.0" -brace-expansion@^5.0.2: - version "5.0.5" - resolved "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.5.tgz" - integrity sha512-VZznLgtwhn+Mact9tfiwx64fA9erHH/MCXEUfB/0bX/6Fz6ny5EGTXYltMocqg4xFAQZtnO3DHWWXi8RiuN7cQ== - dependencies: - balanced-match "^4.0.2" - braces@^3.0.3: version "3.0.3" resolved "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz" @@ -1190,11 +1314,6 @@ compare-func@^2.0.0: array-ify "^1.0.0" dot-prop "^5.1.0" -concat-map@0.0.1: - version "0.0.1" - resolved "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz" - integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== - concat-stream@^2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/concat-stream/-/concat-stream-2.0.0.tgz" @@ -1332,6 +1451,13 @@ data-view-byte-offset@^1.0.1: es-errors "^1.3.0" is-data-view "^1.0.1" +debug@4, debug@^4.3.1, debug@^4.3.2, debug@^4.3.4, debug@^4.4.0, debug@^4.4.3: + version "4.4.3" + resolved "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz" + integrity sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA== + dependencies: + ms "^2.1.3" + debug@^3.2.7: version "3.2.7" resolved "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz" @@ -1339,13 +1465,6 @@ debug@^3.2.7: dependencies: ms "^2.1.1" -debug@^4.3.1, debug@^4.3.2, debug@^4.3.4, debug@^4.4.0, debug@^4.4.3, debug@4: - version "4.4.3" - resolved "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz" - integrity sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA== - dependencies: - ms "^2.1.3" - decompress-response@^6.0.0: version "6.0.0" resolved "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz" @@ -1413,6 +1532,11 @@ degenerator@^5.0.0: escodegen "^2.1.0" esprima "^4.0.1" +deprecation@^2.0.0: + version "2.3.1" + resolved "https://registry.yarnpkg.com/deprecation/-/deprecation-2.3.1.tgz#6368cbdb40abf3373b525ac87e4a260c3a700919" + integrity sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ== + destr@^2.0.3: version "2.0.5" resolved "https://registry.npmjs.org/destr/-/destr-2.0.5.tgz" @@ -1844,11 +1968,6 @@ exsolve@^1.0.7, exsolve@^1.0.8: resolved "https://registry.npmjs.org/exsolve/-/exsolve-1.0.8.tgz" integrity sha512-LmDxfWXwcTArk8fUEnOfSZpHOJ6zOMUJKOtFLFqJLoKJetuQG874Uc7/Kki7zFLzYybmZhp1M7+98pfMqeX8yA== -fast-content-type-parse@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/fast-content-type-parse/-/fast-content-type-parse-3.0.0.tgz" - integrity sha512-ZvLdcY8P+N8mGQJahJV5G4U88CSvT1rP8ApL6uETe88MBXrBHAkZlSEySdUlyztF7ccb+Znos3TFqaepHxdhBg== - fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: version "3.1.3" resolved "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz" @@ -2585,11 +2704,6 @@ json-stable-stringify@^1.0.1: jsonify "^0.0.1" object-keys "^1.1.1" -json-with-bigint@^3.5.3: - version "3.5.8" - resolved "https://registry.npmjs.org/json-with-bigint/-/json-with-bigint-3.5.8.tgz" - integrity sha512-eq/4KP6K34kwa7TcFdtvnftvHCD9KvHOGGICWwMFc4dOOKF5t4iYqnfLK8otCRCRv06FXOzGGyqE8h8ElMvvdw== - json5@^1.0.2: version "1.0.2" resolved "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz" @@ -2686,7 +2800,7 @@ lodash.isstring@^4.0.1: resolved "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz" integrity sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw== -lodash.merge@^4.6.2, lodash.merge@4.6.2: +lodash.merge@4.6.2, lodash.merge@^4.6.2: version "4.6.2" resolved "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz" integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== @@ -2696,10 +2810,10 @@ lodash.uniqby@^4.7.0: resolved "https://registry.npmjs.org/lodash.uniqby/-/lodash.uniqby-4.7.0.tgz" integrity sha512-e/zcLx6CSbmaEgFHCA7BnoQKyCtKMxnuWrJygbwPs/AIn+IMKl66L8/s+wBUn5LRw2pZx3bUHibiV1b6aTWIww== -lodash@^4.15.0: - version "4.17.23" - resolved "https://registry.npmjs.org/lodash/-/lodash-4.17.23.tgz" - integrity sha512-LgVTMpQtIopCi79SJeDiP0TfWi5CNEc/L/aRdTh3yIvmZXTnheWpKjSZhnvMl8iXbC1tFg9gdHHDMLoV7CnG+w== +lodash@^4.15.0, lodash@^4.17.23: + version "4.18.1" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.18.1.tgz#ff2b66c1f6326d59513de2407bf881439812771c" + integrity sha512-dMInicTPVE8d1e5otfwmmjlxkZoUpiVLwyeTdUsi/Caj/gfzzblBcCE5sRHV/AsjuCmxWrte2TNGSYuCeCq+0Q== log-symbols@^7.0.1: version "7.0.1" @@ -3290,16 +3404,6 @@ punycode@^2.1.0: resolved "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz" integrity sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg== -rc@^1.2.7: - version "1.2.8" - resolved "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz" - integrity sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw== - dependencies: - deep-extend "^0.6.0" - ini "~1.3.0" - minimist "^1.2.0" - strip-json-comments "~2.0.1" - rc9@^2.1.2: version "2.1.2" resolved "https://registry.npmjs.org/rc9/-/rc9-2.1.2.tgz" @@ -3308,20 +3412,17 @@ rc9@^2.1.2: defu "^6.1.4" destr "^2.0.3" -readable-stream@^2.0.2: - version "2.3.8" - resolved "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz" - integrity sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA== +rc@^1.2.7: + version "1.2.8" + resolved "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz" + integrity sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw== dependencies: - core-util-is "~1.0.0" - inherits "~2.0.3" - isarray "~1.0.0" - process-nextick-args "~2.0.0" - safe-buffer "~5.1.1" - string_decoder "~1.1.1" - util-deprecate "~1.0.1" + deep-extend "^0.6.0" + ini "~1.3.0" + minimist "^1.2.0" + strip-json-comments "~2.0.1" -readable-stream@^2.1.4: +readable-stream@^2.0.2, readable-stream@^2.1.4: version "2.3.8" resolved "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz" integrity sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA== @@ -3481,7 +3582,7 @@ safe-array-concat@^1.1.3: has-symbols "^1.1.0" isarray "^2.0.5" -safe-buffer@^5.0.1: +safe-buffer@^5.0.1, safe-buffer@~5.2.0: version "5.2.1" resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz" integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== @@ -3491,11 +3592,6 @@ safe-buffer@~5.1.0, safe-buffer@~5.1.1: resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz" integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== -safe-buffer@~5.2.0: - version "5.2.1" - resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz" - integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== - safe-push-apply@^1.0.0: version "1.0.0" resolved "https://registry.npmjs.org/safe-push-apply/-/safe-push-apply-1.0.0.tgz" @@ -3518,12 +3614,12 @@ safe-regex-test@^1.1.0: resolved "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz" integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== -semver@^6.3.0: - version "6.3.1" - resolved "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz" - integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== +semver@7.7.3: + version "7.7.3" + resolved "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz" + integrity sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q== -semver@^6.3.1: +semver@^6.3.0, semver@^6.3.1: version "6.3.1" resolved "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz" integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== @@ -3533,11 +3629,6 @@ semver@^7.3.5, semver@^7.5.2, semver@^7.7.3: resolved "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz" integrity sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA== -semver@7.7.3: - version "7.7.3" - resolved "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz" - integrity sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q== - set-function-length@^1.2.2: version "1.2.2" resolved "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz" @@ -3743,20 +3834,6 @@ streamx@^2.15.0, streamx@^2.21.0: fast-fifo "^1.3.2" text-decoder "^1.1.0" -string_decoder@^1.1.1: - version "1.3.0" - resolved "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz" - integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== - dependencies: - safe-buffer "~5.2.0" - -string_decoder@~1.1.1: - version "1.1.1" - resolved "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz" - integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== - dependencies: - safe-buffer "~5.1.0" - string-argv@^0.3.2: version "0.3.2" resolved "https://registry.npmjs.org/string-argv/-/string-argv-0.3.2.tgz" @@ -3820,14 +3897,21 @@ string.prototype.trimstart@^1.0.8: define-properties "^1.2.1" es-object-atoms "^1.0.0" -strip-ansi@^6.0.0: - version "6.0.1" - resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz" - integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== +string_decoder@^1.1.1: + version "1.3.0" + resolved "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz" + integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== dependencies: - ansi-regex "^5.0.1" + safe-buffer "~5.2.0" + +string_decoder@~1.1.1: + version "1.1.1" + resolved "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz" + integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== + dependencies: + safe-buffer "~5.1.0" -strip-ansi@^6.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== @@ -3937,7 +4021,7 @@ tinyexec@^1.0.2: resolved "https://registry.npmjs.org/tinyexec/-/tinyexec-1.0.2.tgz" integrity sha512-W/KYk+NFhkmsYpuHq5JykngiOCnxeVL8v8dFnqxSD8qEEdRfXk1SDM6JzNqcERbcGYj9tMrDQBYV9cjgnunFIg== -tinyglobby@^0.2.11, tinyglobby@^0.2.15, tinyglobby@0.2.15: +tinyglobby@0.2.15, tinyglobby@^0.2.11, tinyglobby@^0.2.15: version "0.2.15" resolved "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz" integrity sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ== @@ -3945,6 +4029,11 @@ tinyglobby@^0.2.11, tinyglobby@^0.2.15, tinyglobby@0.2.15: fdir "^6.5.0" picomatch "^4.0.3" +tmp@^0.2.4: + version "0.2.5" + resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.2.5.tgz#b06bcd23f0f3c8357b426891726d16015abfd8f8" + integrity sha512-voyz6MApa1rQGUxT3E+BK7/ROe8itEx7vD8/HEvt4xwXucvQ5G5oeEiHkmHZJuBO21RpOf+YYm9MOivj709jow== + to-regex-range@^5.0.1: version "5.0.1" resolved "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz" @@ -4081,7 +4170,12 @@ undici@6.23.0: resolved "https://registry.npmjs.org/undici/-/undici-6.23.0.tgz" integrity sha512-VfQPToRA5FZs/qJxLIinmU59u0r7LXqoJkCzinq3ckNJp3vKEh7jTWN589YQ5+aoAC/TGRLyJLCPKcLQbM8r9g== -universal-user-agent@^7.0.0, universal-user-agent@^7.0.2: +universal-user-agent@^6.0.0: + version "6.0.1" + resolved "https://registry.yarnpkg.com/universal-user-agent/-/universal-user-agent-6.0.1.tgz#15f20f55da3c930c57bddbf1734c6654d5fd35aa" + integrity sha512-yCzhz6FN2wU1NiiQRogkTQszlQSlpWaw8SvVegAc+bDxbzHgh1vX8uIe8OYyMH6DwH+sdTJsgMl36+mSMdRJIQ== + +universal-user-agent@^7.0.0: version "7.0.3" resolved "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-7.0.3.tgz" integrity sha512-TmnEAEAsBJVZM/AADELsK76llnwcf9vMKuPz8JflO1frO8Lchitr0fNaN9d+Ap0BjKtqWqd/J17qeDnXh8CL2A== @@ -4281,16 +4375,16 @@ yaml@^2.7.0: resolved "https://registry.npmjs.org/yaml/-/yaml-2.8.2.tgz" integrity sha512-mplynKqc1C2hTVYxd0PU2xQAc22TI1vShAYGksCCfxbn/dFwnHTNi1bvYsBTkhdUNtGIf5xNOg938rrSSYvS9A== -yargs-parser@^20.2.2: - version "20.2.9" - resolved "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz" - integrity sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w== - yargs-parser@21.1.1: version "21.1.1" resolved "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz" integrity sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw== +yargs-parser@^20.2.2: + version "20.2.9" + resolved "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz" + integrity sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w== + yargs@^16.2.0: version "16.2.0" resolved "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz" From af5b85178b8d6cb400430045b073271a0e9fd159 Mon Sep 17 00:00:00 2001 From: robertsLando Date: Fri, 10 Apr 2026 09:34:17 +0200 Subject: [PATCH 40/41] =?UTF-8?q?fix:=20address=20Copilot=20review=20?= =?UTF-8?q?=E2=80=94=20patchDlopen=20regression,=20SEA=20blob=20fallback,?= =?UTF-8?q?=20CRLF=20normalization?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Restore unconditional native addon copy in patchDlopen with per-file SHA-256 checksums, matching original vercel/pkg behavior (PRs #1492, #1611). The existsSync guard on destFolder was a regression — OS cleanup can delete files inside the cache while leaving the directory intact. - Narrow generateSeaBlob fallback to only catch unsupported --build-sea flag errors (exit code 9 / "bad option"), rethrow real failures. - Normalize CRLF in assertSeaOutput and test-00-sea for Windows compat. Uncomment previously disabled Windows SEA assertion. Co-Authored-By: Claude Opus 4.6 (1M context) --- lib/sea.ts | 11 +++++- prelude/bootstrap-shared.js | 68 ++++++++++++++++++++++++++----------- test/test-00-sea/main.js | 26 ++++---------- test/utils.js | 9 +++-- 4 files changed, 69 insertions(+), 45 deletions(-) diff --git a/lib/sea.ts b/lib/sea.ts index a8b516076..de744e626 100644 --- a/lib/sea.ts +++ b/lib/sea.ts @@ -431,7 +431,16 @@ async function generateSeaBlob(seaConfigFilePath: string, nodeMajor: number) { log.info('Generating the blob using --build-sea...'); await execFileAsync(process.execPath, ['--build-sea', seaConfigFilePath]); return; - } catch { + } catch (err: unknown) { + // Only fall back if --build-sea is an unrecognized flag (exit code 9, "bad option"). + // Rethrow real failures (invalid config, permission errors, etc.) + const isUnsupported = + err instanceof Error && + (err.message.includes('bad option') || + (err as NodeJS.ErrnoException & { status?: number }).status === 9); + if (!isUnsupported) { + throw err; + } log.info( '--build-sea not available, falling back to --experimental-sea-config...', ); diff --git a/prelude/bootstrap-shared.js b/prelude/bootstrap-shared.js index ab39cd420..5d9d399ca 100644 --- a/prelude/bootstrap-shared.js +++ b/prelude/bootstrap-shared.js @@ -57,32 +57,60 @@ function patchDlopen(insideSnapshot) { var modulePkgFolder = parts.slice(0, mIndex + 1).join(path.sep); var destFolder = path.join(tmpFolder, path.basename(modulePkgFolder)); - if (!fs.existsSync(destFolder)) { - // Use patched fs primitives instead of fs.cpSync which may not - // be routed through the VFS in SEA mode. - (function cpRecursive(src, dest) { - var st = fs.statSync(src); - if (st.isDirectory()) { - fs.mkdirSync(dest, { recursive: true }); - var entries = fs.readdirSync(src); - for (var i = 0; i < entries.length; i++) { - cpRecursive( - path.join(src, entries[i]), - path.join(dest, entries[i]), - ); + // IMPORTANT: Always run the copy — do NOT guard with existsSync on the folder. + // OS temp cleanup or antivirus can delete files inside the cache directory while + // leaving the directory structure intact. An existsSync check on the directory + // would pass, but the actual .node/.so files inside would be missing, causing + // "module not found" crashes. This was deliberately established in vercel/pkg + // PR #1492 after production incidents. Per-file SHA-256 checksums (PR #1611) + // make this efficient — unchanged files are skipped. + // See also: https://github.com/vercel/pkg/issues/1589 + (function cpRecursive(src, dest) { + var st = fs.statSync(src); + if (st.isDirectory()) { + fs.mkdirSync(dest, { recursive: true }); + var entries = fs.readdirSync(src); + for (var i = 0; i < entries.length; i++) { + cpRecursive( + path.join(src, entries[i]), + path.join(dest, entries[i]), + ); + } + } else { + // Use readFileSync+writeFileSync instead of copyFileSync because + // copyFileSync may not be routed through the VFS in SEA mode. + if (fs.existsSync(dest)) { + var srcContent = fs.readFileSync(src, { encoding: 'binary' }); + var destContent = fs.readFileSync(dest, { encoding: 'binary' }); + var srcHash = createHash('sha256') + .update(srcContent) + .digest('hex'); + var destHash = createHash('sha256') + .update(destContent) + .digest('hex'); + if (srcHash === destHash) { + return; } - } else { - // Use readFileSync+writeFileSync instead of copyFileSync because - // copyFileSync may not be routed through the VFS in SEA mode. - fs.writeFileSync(dest, fs.readFileSync(src)); } - })(modulePkgFolder, destFolder); - } + fs.writeFileSync(dest, fs.readFileSync(src)); + } + })(modulePkgFolder, destFolder); + newPath = path.join(tmpFolder, modulePackagePath, moduleBaseName); } else { var tmpModulePath = path.join(tmpFolder, moduleBaseName); - if (!fs.existsSync(tmpModulePath)) { + // Same rationale as above — always verify the file is present and up-to-date, + // never skip based on directory existence alone (see vercel/pkg PR #1492). + if (fs.existsSync(tmpModulePath)) { + var sContent = fs.readFileSync(modulePath, { encoding: 'binary' }); + var dContent = fs.readFileSync(tmpModulePath, { encoding: 'binary' }); + var sHash = createHash('sha256').update(sContent).digest('hex'); + var dHash = createHash('sha256').update(dContent).digest('hex'); + if (sHash !== dHash) { + fs.copyFileSync(modulePath, tmpModulePath); + } + } else { fs.copyFileSync(modulePath, tmpModulePath); } diff --git a/test/test-00-sea/main.js b/test/test-00-sea/main.js index a63f3538c..330f1f5c0 100644 --- a/test/test-00-sea/main.js +++ b/test/test-00-sea/main.js @@ -21,25 +21,13 @@ const before = utils.filesBefore(newcomers); utils.pkg.sync([input, '--sea'], { stdio: 'inherit' }); // try to spawn one file based on the platform -if (process.platform === 'linux') { - assert.equal( - utils.spawn.sync('./test-sea-linux', []), - 'Hello world\n', - 'Output matches', - ); -} else if (process.platform === 'darwin') { - assert.equal( - utils.spawn.sync('./test-sea-macos', []), - 'Hello world\n', - 'Output matches', - ); -} else if (process.platform === 'win32') { - // FIXME: output doesn't match on windows - // assert.equal( - // utils.spawn.sync('./test-sea-win.exe', []), - // 'Hello world\n', - // 'Output matches', - // ); +const platformSuffix = { linux: 'linux', darwin: 'macos', win32: 'win.exe' }; +const suffix = platformSuffix[process.platform]; +if (suffix) { + const actual = utils.spawn + .sync(`./test-sea-${suffix}`, []) + .replace(/\r\n/g, '\n'); // Normalize Windows CRLF + assert.equal(actual, 'Hello world\n', 'Output matches'); } try { diff --git a/test/utils.js b/test/utils.js index c0c9a0c3c..9daab3519 100644 --- a/test/utils.js +++ b/test/utils.js @@ -294,9 +294,8 @@ module.exports.assertSeaOutput = function (testName, expected) { ); return; } - assert.equal( - module.exports.spawn.sync(`./${testName}-${suffix}`, []), - expected, - 'Output matches', - ); + const actual = module.exports.spawn + .sync(`./${testName}-${suffix}`, []) + .replace(/\r\n/g, '\n'); // Normalize Windows CRLF + assert.equal(actual, expected, 'Output matches'); }; From f2f1d9ff8395ffd306ee63cbfbedf62cc856cf4d Mon Sep 17 00:00:00 2001 From: robertsLando Date: Fri, 10 Apr 2026 10:45:14 +0200 Subject: [PATCH 41/41] refactor: use assertSeaOutput helper in test-00-sea Co-Authored-By: Claude Opus 4.6 (1M context) --- test/test-00-sea/main.js | 10 +--------- 1 file changed, 1 insertion(+), 9 deletions(-) diff --git a/test/test-00-sea/main.js b/test/test-00-sea/main.js index 330f1f5c0..703764e4e 100644 --- a/test/test-00-sea/main.js +++ b/test/test-00-sea/main.js @@ -20,15 +20,7 @@ const before = utils.filesBefore(newcomers); utils.pkg.sync([input, '--sea'], { stdio: 'inherit' }); -// try to spawn one file based on the platform -const platformSuffix = { linux: 'linux', darwin: 'macos', win32: 'win.exe' }; -const suffix = platformSuffix[process.platform]; -if (suffix) { - const actual = utils.spawn - .sync(`./test-sea-${suffix}`, []) - .replace(/\r\n/g, '\n'); // Normalize Windows CRLF - assert.equal(actual, 'Hello world\n', 'Output matches'); -} +utils.assertSeaOutput('test-sea', 'Hello world\n'); try { // FIXME: on windows this throws