From 0b0da4510714153c858e7027a5cd5c90b964e204 Mon Sep 17 00:00:00 2001 From: Joe Hanley Date: Thu, 6 Aug 2026 23:22:15 +0000 Subject: [PATCH 1/8] feat(standalone): migrate standalone binaries to Node 26 Single Executable Applications (SEAs) - Replace legacy @yao-pkg/pkg with native Node 26 --build-sea and esbuild - Intercept child process execution via in-memory script routing with createRequire to eliminate duplicate Node binary - Replace shelljs runtime dependency with native fs/child_process shell polyfill - Add multi-target build script supporting Linux x64, macOS Universal 2 (arm64 + x64 with lipo), and Windows x64 - Update firepit-builder pipeline to produce SEA artifacts and SHA256 checksums - Document architecture and build workflows in standalone/README.md --- scripts/firepit-builder/pipeline.js | 29 +- standalone/.gitignore | 4 + standalone/README.md | 154 + standalone/build-sea.js | 417 ++ standalone/config.template.js | 2 +- standalone/firepit.js | 974 ++--- standalone/package-lock.json | 5911 ++++++++++----------------- standalone/package.json | 24 +- 8 files changed, 3109 insertions(+), 4406 deletions(-) create mode 100644 standalone/.gitignore create mode 100644 standalone/README.md create mode 100644 standalone/build-sea.js diff --git a/scripts/firepit-builder/pipeline.js b/scripts/firepit-builder/pipeline.js index 8c36eb20a42..2357461f31d 100755 --- a/scripts/firepit-builder/pipeline.js +++ b/scripts/firepit-builder/pipeline.js @@ -82,7 +82,7 @@ if (styles.headless) { configTemplate.headless = true; echo(`module.exports = ` + JSON.stringify(configTemplate)).to("config.js"); - npm("run", "pkg"); + npm("run", "build:sea"); ls("dist/firepit-*").forEach((file) => { mv(file, path.join("dist", path.basename(file).replace("firepit", "firebase-tools"))); }); @@ -93,7 +93,7 @@ if (styles.headful) { configTemplate.headless = false; echo(`module.exports = ` + JSON.stringify(configTemplate)).to("config.js"); - npm("run", "pkg"); + npm("run", "build:sea"); ls("dist/firepit-*").forEach((file) => { mv(file, path.join("dist", path.basename(file).replace("firepit", "firebase-tools-instant"))); @@ -106,6 +106,11 @@ if (isPublishing) { "firebase-tools-instant-win.exe", "firebase-tools-linux", "firebase-tools-macos", + "firebase-tools-macos-arm64", + "firebase-tools-macos-x64", + "firebase-tools-instant-macos", + "firebase-tools-instant-macos-arm64", + "firebase-tools-instant-macos-x64", "firebase-tools-win.exe", ]; @@ -123,13 +128,25 @@ if (isPublishing) { } echo("-- Artifacts"); -rm("-rf", "/tmp/firepit_artifacts"); - const outputDir = path.join(tempdir().toString(), "firepit_artifacts"); -echo(outputDir); -mkdir(outputDir); +rm("-rf", outputDir); +mkdir("-p", outputDir); mv("dist/*", outputDir); cd(outputDir); + +// Generate SHA256 Checksums for published release binaries +const crypto = require("crypto"); +const sha256Lines = []; +ls("firebase-tools*").forEach((file) => { + if (file.endsWith(".json") || file.endsWith(".txt") || file.endsWith(".js") || file.endsWith(".tar.gz")) return; + const data = fs.readFileSync(file); + const hash = crypto.createHash("sha256").update(data).digest("hex"); + sha256Lines.push(`${hash} ${file}`); +}); +if (sha256Lines.length > 0) { + fs.writeFileSync("SHA256SUMS.txt", sha256Lines.join("\n") + "\n"); +} + console.log( ls(".") .map((fn) => path.join(pwd().toString(), fn.toString())) diff --git a/standalone/.gitignore b/standalone/.gitignore new file mode 100644 index 00000000000..4f13387bb56 --- /dev/null +++ b/standalone/.gitignore @@ -0,0 +1,4 @@ +dist/ +config.js +temp_downloads/ +firepit-log.txt diff --git a/standalone/README.md b/standalone/README.md new file mode 100644 index 00000000000..72a2d59ea0e --- /dev/null +++ b/standalone/README.md @@ -0,0 +1,154 @@ +# Firepit Standalone Executable Builder + +Firepit packages `firebase-tools` into native Single Executable Applications (SEAs) using Node.js 26 built-in `--build-sea` capabilities and `esbuild`. + +--- + +## Architecture Overview + +```mermaid +flowchart TD + subgraph Build Time: standalone/build-sea.js + A[firepit.js] -->|esbuild bundle| B[firepit.bundle.js] + C[welcome.js] -->|esbuild bundle| D[welcome.bundle.js] + E[node_modules] -->|tar -czf| F[firepit-assets.tar.gz] + G[Target Node 26 Binaries] --> H[node --build-sea sea-config.json] + B & D & F --> H + H --> I[dist/firepit-linux, dist/firepit-macos-*, dist/firepit-win.exe] + I --> J[Optional: lipo combine macOS x64 + arm64 -> Universal 2] + end + + subgraph Runtime: firepit.js + K[Standalone Executable] -->|Cold Boot: extractSEAAsset| L[~/.cache/firebase/tools] + K -->|Child Process Fork / is:node| M[Entrypoint Script Routing via createRequire] + M --> N[Executes requested script directly in SEA runtime] + end +``` + +### Key Architectural Pillars + +1. **Node 26 Native `--build-sea`**: Utilizes Node 26's built-in SEA compiler to inject JavaScript bundles and compressed assets into the executable without third-party binary injectors like `postject`. +2. **In-Memory Subprocess Routing**: Avoids packaging a duplicate uncompressed Node binary inside the asset tarball. When child processes are spawned via `fork()` or `is:node`, `firepit.js` intercepts script arguments at the entrypoint and resolves them using `createRequire`, saving ~40 MB download size and ~100 MB on-disk cache. +3. **Embedded Compressed Asset Tarball**: Runtime dependencies (`node_modules`) are compressed into `firepit-assets.tar.gz` and extracted on first launch to `~/.cache/firebase/tools/lib`. +4. **Native Inline Shell Polyfill**: Eliminates the heavy `shelljs` runtime dependency by implementing cross-platform filesystem operations (`mkdir`, `rm`, `cp`, `chmod`, `ln`, `ls`, `cat`, `exec`) using native Node.js APIs and `child_process.spawnSync`. +5. **Universal 2 macOS Binaries**: Supports standalone `arm64` and `x64` builds as well as multi-architecture Universal 2 binaries combined via Apple's `lipo` tool. + +--- + +## Prerequisites + +- **Node.js 26.0.0+** (Required for native `--build-sea`) + ```bash + nvm install 26 + nvm use 26 + ``` +- **Operating System**: macOS, Linux, or Windows. +- **Xcode Command Line Tools** (macOS only, required for `codesign` and `lipo`). + +--- + +## Quick Start (Local Development) + +### 1. Install Dependencies +Inside the `standalone/` directory: +```bash +npm install +``` + +### 2. Build Executable for Current Machine +To quickly build a standalone binary for your current OS and architecture: +```bash +npm run build:sea -- --current-only +``` + +### 3. Test the Compiled Binary +```bash +# On Linux +./dist/firepit-linux --version + +# On Apple Silicon macOS +./dist/firepit-macos-arm64 --version + +# On Intel macOS +./dist/firepit-macos-x64 --version + +# On Windows +./dist/firepit-win.exe --version +``` + +--- + +## Building All Platform Binaries + +To download target Node 26 binaries and generate executables for Linux, macOS (`x64` & `arm64`), and Windows in one command: + +```bash +npm run build:sea +``` + +Output directory: `dist/` +- `dist/firepit-linux` (Linux x86_64 ELF) +- `dist/firepit-macos-x64` (Intel Mach-O) +- `dist/firepit-macos-arm64` (Apple Silicon Mach-O) +- `dist/firepit-macos` (macOS Universal 2 binary, if built on macOS) +- `dist/firepit-win.exe` (Windows x86_64 PE) + +### Customizing Node Binary or Version +You can pass custom environment variables to `build-sea.js`: +```bash +# Use a specific Node 26 executable as the compiler +NODE_BIN=/path/to/node26/bin/node node build-sea.js + +# Target a specific Node version +TARGET_NODE_VERSION=26.7.0 node build-sea.js +``` + +--- + +## Creating macOS Universal 2 Binaries Manually + +If you built `firepit-macos-x64` and `firepit-macos-arm64`, you can combine them into a single Universal binary on macOS using `lipo`: + +```bash +# 1. Combine architectures +lipo -create -output dist/firebase-tools-macos \ + dist/firepit-macos-x64 \ + dist/firepit-macos-arm64 + +# 2. Ad-hoc sign the universal binary +codesign --sign - --force dist/firebase-tools-macos + +# 3. Verify universal format +file dist/firebase-tools-macos +# Expected output: Mach-O universal binary with 2 architectures: [x86_64] [arm64] +``` + +--- + +## Subcommand Emulation (`is:*`) + +Firepit embeds runtime scripts allowing `firebase-tools` to shell out to Node and NPM: + +* **`firebase is:node [script.js | -e | -v]`**: + Executes Node.js scripts or evaluates inline expressions using the embedded SEA Node engine. + ```bash + ./dist/firepit-linux is:node -e "console.log(process.version)" + ``` +* **`firebase is:npm [npm args...]`**: + Executes npm commands using the embedded npm CLI tools. + ```bash + ./dist/firepit-linux is:npm --version + ``` + +--- + +## Production Release Pipeline + +To run the full production release pipeline (which bundles the root `firebase-tools` package, packages headless/headful binaries, and outputs artifacts): + +```bash +cd ../scripts/firepit-builder +node ./pipeline.js --package="/path/to/firebase-tools" +``` + +Release artifacts are written to `/tmp/firepit_artifacts/`. diff --git a/standalone/build-sea.js b/standalone/build-sea.js new file mode 100644 index 00000000000..484676bce25 --- /dev/null +++ b/standalone/build-sea.js @@ -0,0 +1,417 @@ +const fs = require("fs"); +const path = require("path"); +const { execSync } = require("child_process"); +const https = require("https"); +const zlib = require("zlib"); + +const standaloneDir = __dirname; +const distDir = path.join(standaloneDir, "dist"); +const vendorDir = path.join(standaloneDir, "vendor"); +const tempDownloadsDir = path.join(distDir, "temp_downloads"); + +const configPath = path.join(standaloneDir, "config.js"); +if (!fs.existsSync(configPath)) { + const configTemplate = path.join(standaloneDir, "config.template.js"); + if (fs.existsSync(configTemplate)) { + fs.copyFileSync(configTemplate, configPath); + } +} + +// Determine Host Node Binary +function getHostNodeBinary() { + if (process.env.NODE_BIN && fs.existsSync(process.env.NODE_BIN)) { + return process.env.NODE_BIN; + } + return process.execPath; +} + +const hostNodeBin = getHostNodeBinary(); +const rawHostVersion = execSync(`"${hostNodeBin}" -v`, { encoding: "utf8" }).trim(); +const NODE_VERSION = + process.env.TARGET_NODE_VERSION || rawHostVersion.replace(/^v/, "") || "26.7.0"; + +console.log(`[build-sea] Using Host Node: ${hostNodeBin} (${rawHostVersion})`); +console.log(`[build-sea] Packaging Target Node Version: v${NODE_VERSION}`); + +// Targets configuration +const ALL_TARGETS = [ + { + name: "linux", + platform: "linux", + arch: "x64", + ext: "tar.gz", + binaryPath: "bin/node" + }, + { + name: "macos-x64", + platform: "darwin", + arch: "x64", + ext: "tar.gz", + binaryPath: "bin/node" + }, + { + name: "macos-arm64", + platform: "darwin", + arch: "arm64", + ext: "tar.gz", + binaryPath: "bin/node" + }, + { + name: "win.exe", + platform: "win", + arch: "x64", + ext: "zip", + binaryPath: "node.exe" + } +]; + +function downloadFile(url, dest) { + return new Promise((resolve, reject) => { + function get(currentUrl) { + https + .get(currentUrl, response => { + if (response.statusCode === 301 || response.statusCode === 302) { + get(response.headers.location); + return; + } + if (response.statusCode !== 200) { + reject(new Error(`Failed to download ${currentUrl}: HTTP ${response.statusCode}`)); + return; + } + const file = fs.createWriteStream(dest); + response.pipe(file); + file.on("finish", () => { + file.close(resolve); + }); + }) + .on("error", err => { + fs.unlink(dest, () => reject(err)); + }); + } + get(url); + }); +} + +function extractZip(zipPath, destDir) { + fs.mkdirSync(destDir, { recursive: true }); + // Try unzip CLI first + try { + execSync(`unzip -q -o "${zipPath}" -d "${destDir}"`, { stdio: "ignore" }); + return; + } catch (e) { + // Try powershell on Windows + if (process.platform === "win32") { + execSync( + `powershell -command "Expand-Archive -Path '${zipPath}' -DestinationPath '${destDir}' -Force"`, + { + stdio: "inherit" + } + ); + return; + } + } + // Fallback: tar on modern systems can extract .zip + try { + execSync(`tar -xf "${zipPath}" -C "${destDir}"`, { stdio: "ignore" }); + return; + } catch (e) { + throw new Error( + `Unable to extract zip archive at ${zipPath}: please ensure 'unzip' or 'tar' is installed.` + ); + } +} + +async function main() { + const args = process.argv.slice(2); + const currentOnly = args.includes("--current-only"); + const skipDownload = args.includes("--skip-download"); + + // Determine active targets + let targets = ALL_TARGETS; + if (currentOnly) { + const isWin = process.platform === "win32"; + const isMac = process.platform === "darwin"; + let hostTargetName; + if (isWin) hostTargetName = "win.exe"; + else if (isMac) hostTargetName = process.arch === "arm64" ? "macos-arm64" : "macos-x64"; + else hostTargetName = "linux"; + + targets = ALL_TARGETS.filter(t => t.name === hostTargetName); + console.log(`[build-sea] --current-only specified. Building target: ${hostTargetName}`); + } + + // 1. Prepare dist directory + fs.mkdirSync(distDir, { recursive: true }); + + // 2. Bundle firepit.js and welcome.js with esbuild + console.log("[build-sea] Step 1: Bundling JavaScript files with esbuild..."); + const firepitBundlePath = path.join(distDir, "firepit.bundle.js"); + const welcomeBundlePath = path.join(distDir, "welcome.bundle.js"); + + execSync( + `npx esbuild "${path.join( + standaloneDir, + "firepit.js" + )}" --bundle --platform=node --target=node26 --external:node:sea --outfile="${firepitBundlePath}"`, + { stdio: "inherit", cwd: standaloneDir } + ); + + execSync( + `npx esbuild "${path.join( + standaloneDir, + "welcome.js" + )}" --bundle --platform=node --target=node26 --outfile="${welcomeBundlePath}"`, + { stdio: "inherit", cwd: standaloneDir } + ); + + // 3. Package assets tarball (firepit-assets.tar.gz) + console.log("[build-sea] Step 2: Packaging assets into firepit-assets.tar.gz..."); + const assetsTarPath = path.join(distDir, "firepit-assets.tar.gz"); + const assetsDir = path.join(distDir, "dist_assets"); + fs.rmSync(assetsDir, { recursive: true, force: true }); + + const assetsLibDir = path.join(assetsDir, "lib"); + const targetNodeModules = path.join(assetsLibDir, "node_modules"); + fs.mkdirSync(targetNodeModules, { recursive: true }); + + if (fs.existsSync(path.join(vendorDir, "node_modules"))) { + // Production release pipeline mode + console.log("[build-sea] Using vendor/node_modules from pipeline..."); + execSync( + `cp -R "${path.join(vendorDir, "node_modules")}"/* "${targetNodeModules}/"` + ); + } else { + // Clean production package mode for local dev builds + console.log("[build-sea] Preparing clean production bundle from local repo..."); + const os = require("os"); + const tmpPackDir = fs.mkdtempSync(path.join(os.tmpdir(), "fb-pack-")); + const repoRootDir = path.resolve(standaloneDir, ".."); + + try { + execSync(`npm pack --pack-destination="${tmpPackDir}"`, { + cwd: repoRootDir, + stdio: "ignore" + }); + const packedTarball = fs.readdirSync(tmpPackDir).find(f => f.endsWith(".tgz")); + + if (packedTarball) { + execSync(`npm init -y`, { cwd: tmpPackDir, stdio: "ignore" }); + execSync( + `npm install --omit=dev --no-audit --no-fund "${path.join(tmpPackDir, packedTarball)}"`, + { + cwd: tmpPackDir, + stdio: "ignore" + } + ); + const prodNodeModules = path.join(tmpPackDir, "node_modules"); + if (fs.existsSync(prodNodeModules)) { + execSync( + `cp -R "${prodNodeModules}"/* "${targetNodeModules}/" 2>/dev/null || true` + ); + } + } + } finally { + fs.rmSync(tmpPackDir, { recursive: true, force: true }); + } + + // Also include standalone runtime dependencies (like chalk, npm) + const rootNodeModules = path.join(standaloneDir, "node_modules"); + if (fs.existsSync(rootNodeModules)) { + execSync( + `cp -R "${rootNodeModules}"/* "${targetNodeModules}/" 2>/dev/null || true` + ); + } + } + + // Clean build-only / dev tools from packaged assets + if (fs.existsSync(targetNodeModules)) { + fs.rmSync(path.join(targetNodeModules, "esbuild"), { recursive: true, force: true }); + fs.rmSync(path.join(targetNodeModules, ".bin"), { recursive: true, force: true }); + } + + try { + execSync(`find "${assetsLibDir}" -name "*.node" -delete 2>/dev/null || true`, { stdio: "ignore" }); + } catch (e) {} + + execSync( + `tar -czf "${assetsTarPath}" --exclude="*.map" --exclude="*.md" --exclude="*.ts" --exclude="*.d.ts" --exclude="test" --exclude="tests" --exclude="docs" -C "${assetsDir}" lib`, + { stdio: "inherit" } + ); + fs.rmSync(assetsDir, { recursive: true, force: true }); + + // 4. Download & Extract Target Node Binaries + console.log("[build-sea] Step 3: Preparing Target Node.js Binaries..."); + fs.mkdirSync(tempDownloadsDir, { recursive: true }); + + const targetBinaries = {}; + + for (const target of targets) { + const extractDir = path.join(tempDownloadsDir, `extract-${target.name}`); + const folderName = `node-v${NODE_VERSION}-${target.platform}-${target.arch}`; + const binaryFullPath = path.join(extractDir, folderName, target.binaryPath); + + if (skipDownload && fs.existsSync(binaryFullPath)) { + console.log(`[build-sea] Using cached binary for ${target.name}`); + targetBinaries[target.name] = binaryFullPath; + continue; + } + + // Check if host matches target and we are building current only + if (currentOnly && hostNodeBin && fs.existsSync(hostNodeBin)) { + console.log(`[build-sea] Using host binary for ${target.name}: ${hostNodeBin}`); + targetBinaries[target.name] = hostNodeBin; + continue; + } + + const archiveName = `node-v${NODE_VERSION}-${target.platform}-${target.arch}.${target.ext}`; + const url = `https://nodejs.org/dist/v${NODE_VERSION}/${archiveName}`; + const dest = path.join(tempDownloadsDir, archiveName); + + if (!fs.existsSync(dest)) { + console.log(`[build-sea] Downloading ${archiveName} from ${url}...`); + await downloadFile(url, dest); + } + + console.log(`[build-sea] Extracting ${archiveName}...`); + fs.mkdirSync(extractDir, { recursive: true }); + if (target.ext === "zip") { + extractZip(dest, extractDir); + } else { + execSync(`tar -xf "${dest}" -C "${extractDir}"`, { stdio: "inherit" }); + } + + targetBinaries[target.name] = binaryFullPath; + } + + // 5. Generate SEAs using native Node 26 --build-sea + console.log("[build-sea] Step 4: Generating Single Executable Applications..."); + for (const target of targets) { + const rawBinary = targetBinaries[target.name]; + if (!fs.existsSync(rawBinary)) { + throw new Error(`Node binary for target ${target.name} not found at: ${rawBinary}`); + } + + const outputBinaryName = `firepit-${target.name}`; + const outputBinaryPath = path.join(distDir, outputBinaryName); + + const seaConfigPath = path.join(distDir, `sea-config-${target.name}.json`); + const seaConfig = { + main: firepitBundlePath, + output: outputBinaryPath, + executable: rawBinary, + disableExperimentalSEAWarning: true, + assets: { + "welcome.js": welcomeBundlePath, + "check.js": path.join(standaloneDir, "check.js"), + "firepit-assets.tar.gz": assetsTarPath + } + }; + + fs.writeFileSync(seaConfigPath, JSON.stringify(seaConfig, null, 2)); + + console.log(`[build-sea] Building SEA for ${target.name} -> ${outputBinaryPath}...`); + execSync(`"${hostNodeBin}" --build-sea "${seaConfigPath}"`, { stdio: "inherit" }); + + // Make binary executable + try { + fs.chmodSync(outputBinaryPath, 0o755); + } catch (e) {} + + // Sign macOS binaries if on macOS + if (process.platform === "darwin" && target.platform === "darwin") { + try { + console.log(`[build-sea] Signing ${outputBinaryName}...`); + execSync(`codesign --sign - --force "${outputBinaryPath}"`, { stdio: "inherit" }); + } catch (err) { + console.warn( + `[build-sea] Warning: codesign failed for ${outputBinaryName}: ${err.message}` + ); + } + } + } + + // 6. Create macOS Universal Binary if both x64 and arm64 targets exist + const macX64Bin = path.join(distDir, "firepit-macos-x64"); + const macArm64Bin = path.join(distDir, "firepit-macos-arm64"); + const macUniversalBin = path.join(distDir, "firepit-macos"); + + if (fs.existsSync(macX64Bin) && fs.existsSync(macArm64Bin)) { + if (process.platform === "darwin") { + console.log("[build-sea] Step 5: Creating macOS Universal 2 binary with lipo..."); + try { + execSync(`lipo -create -output "${macUniversalBin}" "${macX64Bin}" "${macArm64Bin}"`, { + stdio: "inherit" + }); + execSync(`codesign --sign - --force "${macUniversalBin}"`, { stdio: "inherit" }); + fs.chmodSync(macUniversalBin, 0o755); + console.log(`[build-sea] Created Universal binary: ${macUniversalBin}`); + } catch (err) { + console.warn(`[build-sea] Warning: Failed to create lipo universal binary: ${err.message}`); + } + } else { + // On non-macOS hosts, symlink or copy arm64 or x64 to firepit-macos as default + console.log("[build-sea] Step 5: Setting default firepit-macos binary..."); + fs.copyFileSync(macArm64Bin, macUniversalBin); + fs.chmodSync(macUniversalBin, 0o755); + } + } else if (fs.existsSync(macArm64Bin) && !fs.existsSync(macUniversalBin)) { + fs.copyFileSync(macArm64Bin, macUniversalBin); + fs.chmodSync(macUniversalBin, 0o755); + } else if (fs.existsSync(macX64Bin) && !fs.existsSync(macUniversalBin)) { + fs.copyFileSync(macX64Bin, macUniversalBin); + fs.chmodSync(macUniversalBin, 0o755); + } + + // 7. Create firebase-tools-* aliases and generate SHA256SUMS.txt + console.log("[build-sea] Step 6: Creating firebase-tools-* release aliases and SHA256 checksums..."); + const crypto = require("crypto"); + const sha256Lines = []; + + const binaryMappings = [ + { src: "firepit-linux", dest: "firebase-tools-linux" }, + { src: "firepit-macos", dest: "firebase-tools-macos" }, + { src: "firepit-macos-arm64", dest: "firebase-tools-macos-arm64" }, + { src: "firepit-macos-x64", dest: "firebase-tools-macos-x64" }, + { src: "firepit-win.exe", dest: "firebase-tools-win.exe" } + ]; + + for (const mapping of binaryMappings) { + const srcPath = path.join(distDir, mapping.src); + const destPath = path.join(distDir, mapping.dest); + if (fs.existsSync(srcPath)) { + if (srcPath !== destPath) { + fs.copyFileSync(srcPath, destPath); + fs.chmodSync(destPath, 0o755); + } + const data = fs.readFileSync(destPath); + const hash = crypto.createHash("sha256").update(data).digest("hex"); + sha256Lines.push(`${hash} ${mapping.dest}`); + } + } + + if (sha256Lines.length > 0) { + const sha256FilePath = path.join(distDir, "SHA256SUMS.txt"); + fs.writeFileSync(sha256FilePath, sha256Lines.join("\n") + "\n"); + console.log(`[build-sea] Created checksums file: ${sha256FilePath}`); + } + + console.log("\n[build-sea] Build completed successfully! Generated binaries in dist/:"); + fs.readdirSync(distDir) + .filter( + f => + (f.startsWith("firepit-") || f.startsWith("firebase-tools-") || f.endsWith(".txt")) && + !f.endsWith(".json") && + !f.endsWith(".js") && + !f.endsWith(".tar.gz") + ) + .forEach(f => { + const stat = fs.statSync(path.join(distDir, f)); + const sizeMB = (stat.size / (1024 * 1024)).toFixed(1); + console.log(` - dist/${f} (${sizeMB} MB)`); + }); +} + +main().catch(err => { + console.error("[build-sea] Build failed:", err); + process.exit(1); +}); diff --git a/standalone/config.template.js b/standalone/config.template.js index 8b75f809ed8..2e087239bd0 100644 --- a/standalone/config.template.js +++ b/standalone/config.template.js @@ -8,7 +8,7 @@ module.exports = { which allows the binary to spawn a terminal on Windows and Mac. The is the behavior for desktop users. */ - headless: false, + headless: true, /* This is generally set to "firebase-tools@latest" however a custom value diff --git a/standalone/firepit.js b/standalone/firepit.js index f7927e1869e..8015b7c7971 100644 --- a/standalone/firepit.js +++ b/standalone/firepit.js @@ -53,101 +53,148 @@ ------------------------------------- Globals ------------------------------------- - - Our dependencies are largely uninteresting, we use "user-home" to know where to install our scripts - and files to, we use "chalk" for nice colors, and we use a handful of built in libraries for - their intended purposes. - - The most interesting dep is "shelljs". This library is a collection of Unix-style commands like - (cat, ls, mkdir, etc) which are reimplemented in cross-platform JavaScript. They function - identically across platforms and help us whenever we're dealing with the filesystem. The names - are universal and easy to understand for anyone with a *nix background. - - We also include our own package.json so we can report the Firepit version to Google Analytics. */ const fs = require("fs"); const path = require("path"); -const { fork, spawn } = require("child_process"); -const homePath = require("user-home"); +const os = require("os"); +const { fork, spawn, spawnSync } = require("child_process"); const chalk = require("chalk"); -const shell = require("shelljs"); -shell.config.silent = true; const version = require("./package.json").version; -/* - Our only other require, the "./runtime.js" file, is worth discussing in detail. The script itself - is documented in itself, so you're welcome to read that, however the more important topic is the - general structure Firepit uses. - - Firepit loops back into itself constantly and is essentially a router which ensures that incoming - invocations end up calling the correct scripts using the embedded Node runtime. A Firepit binary - doesn't include *just* the "firebase" command, it also includes "npm" and "node" because these - are needed by "firebase-tools" to be fully functional. When running in headful (double-click) - mode these commands are exposed to the developer, they can run "npm" just like they would with - a normal Node install, however internally it's not *really* npm, they're invoking a shell script - which comes back into a new Firepit process and is then routed to the npm scripts. - - When you're not running Firepit in headful mode, these sub-commands can still be accessed via - hidden flags... - - firebase is:npm install -g chalk // Calls npm - firebase is:node ./script.js // Calls node - firebase --help // Calls firebase-tools - - These hidden flags aren't intended to be used by end-developers, they're needed because we're - constantly hoping out of the Firepit process. For example Firepit spawn a shell, the shell calls - "npm" (which is actually a new Firepit process) which calls the npm scripts which invokes a user's - build script which spawns a node process (which is actually a new Firepit process) and so on. - - We use these special flags to give context between invocations and ask Firepit to imitate whatever - tool the user wants to call. (See Imitate*() functions) +const homePath = os.homedir(); - In order to allow ensure that the "node", "npm", and "firebase" commands exist through all - these processes we can do two things. - - 1) We can modify env variables like PATH to place our scripts in place of actual tools - 2) We can pass special flags to the tools we're pretending to be so they tell their children - that the world is how we want them to think it is. - - Technically (and on a high level) When a developer runs Firepit we go through a series of steps. - - 1) If needed, extract the copy of "firebase-tools" which is embedded in the binary file - (see SetupFirebaseTools()) - - 2) Generate a series of "runtime" scripts which get called from other processes. These scripts - look to the developer like the "npm" or "node" commands, but actually route back into Firepit - and are redirected to the embedded tools. - (see createRuntimeBinaries()) - - 3) Determine how we can access our embedded NodeJS runtime - (see VerifyNodePath()) - - 4) Modify the developers env variables to include the "runtime" scripts and other changes - (see firepit()) - - 5) Route the invocation to the correct command (firebase, npm, or node). - 6) Exit with the correct code and go to bed. - - The "runtime.js" script contains two functions. In createRuntimeBinaries() we call .toString() - on these functions and write them to files (which later act like commands on the user's path). +/* + Inline shell polyfill to replace external shelljs dependency. + Implements Unix-style commands (mkdir, rm, cp, chmod, ln, ls, cat, exec) + using native Node fs and child_process APIs. + */ +const shell = { + config: { silent: true }, + mkdir: (flag, dirPath) => { + const target = dirPath || flag; + try { + fs.mkdirSync(target, { recursive: true }); + } catch (e) {} + return ""; + }, + rm: (flag, targetPath) => { + const target = targetPath || flag; + try { + fs.rmSync(target, { recursive: true, force: true }); + } catch (e) {} + return ""; + }, + cp: (flag, src, dest) => { + const actualSrc = dest ? src : flag; + const actualDest = dest ? dest : src; + try { + if (typeof actualSrc === "string" && actualSrc.endsWith("/*")) { + const baseSrc = actualSrc.slice(0, -2); + if (fs.existsSync(baseSrc)) { + fs.cpSync(baseSrc, actualDest, { recursive: true }); + } + } else { + fs.cpSync(actualSrc, actualDest, { recursive: true }); + } + } catch (e) {} + return ""; + }, + chmod: (mode, targetPath) => { + try { + fs.chmodSync(targetPath, mode === "+x" ? 0o755 : mode); + } catch (e) {} + return ""; + }, + ln: (flag, src, dest) => { + const actualSrc = dest ? src : flag; + const actualDest = dest ? dest : src; + try { + try { + fs.unlinkSync(actualDest); + } catch (e) {} + fs.symlinkSync(actualSrc, actualDest); + } catch (e) { + try { + fs.copyFileSync(actualSrc, actualDest); + } catch (e) {} + } + return ""; + }, + ls: targetPath => { + try { + if (!fs.existsSync(targetPath)) return Object.assign([], { code: 1 }); + const stat = fs.statSync(targetPath); + if (stat.isFile()) return Object.assign([targetPath], { code: 0 }); + const files = fs.readdirSync(targetPath); + return Object.assign(files, { code: 0 }); + } catch (e) { + return Object.assign([], { code: 1 }); + } + }, + cat: filePath => { + try { + return fs.readFileSync(filePath, "utf8"); + } catch (e) { + return ""; + } + }, + exec: cmd => { + try { + const result = spawnSync(cmd, { + shell: true, + stdio: ["ignore", "pipe", "pipe"], + encoding: "utf8" + }); + return { + code: result.status !== null ? result.status : 1, + stdout: result.stdout || "", + stderr: result.stderr || "" + }; + } catch (e) { + return { + code: e.status || 1, + stdout: e.stdout || "", + stderr: e.stderr || "" + }; + } + } +}; - The functions in "runtime.js" are not meant to be invoked from Firepit, but are standalone scripts - which get ran *through* Firepit when it is imitating Node.js. +/* + Node Single Executable Application (SEA) support. */ -const runtime = require("./runtime"); +let sea; +try { + sea = require("node:sea"); +} catch (e) {} +const isSeaMode = typeof sea === "object" && typeof sea.isSea === "function" && sea.isSea(); + +function extractSEAAsset(assetName, targetPath) { + if (isSeaMode) { + try { + const assetData = sea.getRawAsset ? sea.getRawAsset(assetName) : sea.getAsset(assetName); + const assetBuf = Buffer.isBuffer(assetData) ? assetData : Buffer.from(assetData); + fs.writeFileSync(targetPath, assetBuf); + debug(`Extracted asset ${assetName} to ${targetPath}`); + } catch (err) { + debug(`Failed to extract asset ${assetName}: ${err}`); + throw err; + } + } +} +const runtime = require("./runtime"); /* We use a configuration file (see config.template.js) which is generated by our build pipeline to determine if we're running in headless or headful mode. */ -let config; +let config = { headless: true }; try { - config = require("./config"); + config = Object.assign({ headless: true }, require("./config")); } catch (err) { - console.warn("Invalid Firepit configuration, this may be a broken build."); - process.exit(2); + // config file may not be present in local dev } const isWindows = process.platform === "win32"; @@ -161,25 +208,7 @@ const installPath = path.join(homePath, ".cache", "firebase", "tools"); let runtimeBinsPath = path.join(homePath, ".cache", "firebase", "runtime"); /* - As I mentioned above, one of the ways we can control the detached children processes which get - created when using Firepit is to pass special arguments when we're pretending to be them. - - In this case, when a user calls "npm" (and it routes to Firepit, pretending to be npm) we tack - on a few scripts which change the global config file to point to our custom installPath and - we supply a special "script shell". - - This "script shell" is normally something like "bash" or "cmd.exe", however in our case, we want - to inject Firepit into there again to ensure everyone thinks the commands we're exposing still exist. - - You can see the implementation of this script in runtime.js/Script_ShellJS(). - - When npm invokes a script on behalf of the developer (like when they run "npm run build") this - command is then spawned in npm as "$SCRIPT_SHELL $USER_SCRIPT" so by replacing the this shell - we can set up env variables / PATHs / etc then spawn the $USER_SCRIPT manually so the behavior - looks no different. - - We use these base npmArgs every time we pretend to be npm. They can be overwritten by a user if - they manually specify any of these flags and that would produce unexpected behavior. + Base npmArgs used whenever we pretend to be npm. */ const npmArgs = [ `--script-shell=${runtimeBinsPath}/shell${isWindows ? ".bat" : ""}`, @@ -187,133 +216,141 @@ const npmArgs = [ `--scripts-prepend-node-path=auto` ]; -/* - Windows is terrible and through-out Firepit you'll see references to "safe" and "unsafe" paths. - Unsafe paths, on Windows, are ones with things like spaces in them - yes spaces break stuff. - - There is debate about who is at fault. It may be npm, it may be Node, it may be Microsoft, regardless - if your username on Windows (for example) has a space in it, it'll break everything. - - Luckily because we control the universe in Firepit, we can use a crazy hack to replace any - evil (i.e. space-inclusive) paths with DOS (yes DOS) style paths. See getSafeCrossPlatformPath() - - For example: - - unsafePath: C:\Program Files\Java\jdk1.6.0_22 - safePath: C:\PROGRA~1\Java\JDK16~1.0_2 - - We use the safePath when needed (specifically when passing them through cmd.exe) to reduce the - chances of space-related bugs. - - This is needed *all* the time, but it's pretty common in here. - */ let safeNodePath; const unsafeNodePath = process.argv[0]; /* - Firepit supports some additional flags that the firebase command does not. These flags are - generally used internally when Firepit invokes Firepit (for example, during welcome.js). - - If you want to run any of these flags, invoke Firepit with --tool:$COMMAND + Firepit flags */ const flagDefinitions = [ - "file-debug", // --tool:file-debug - Write log to a file - "log-debug", // --tool:log-debug - Write log to stdout - "disable-write", // --tool:disable-write - Do not write runtime scripts to filesystem - "runtime-check", // --tool:runtime-check - Determine if firepit binary is node or not (see VerifyNodePath()) - "setup-check", // --tool:setup-check - Check if firebase-tools is set up - "force-setup", // --tool:force-setup - Force Firepit to go through setup - "force-update", // --tool:force-update - Aggressively clear npm cache and re-setup - "ignore-embedded-cache" // --tool:ignore-embedded-cache - Setup from online, do not use embedded firebase-tools + "file-debug", // --tool:file-debug - Write log to a file + "log-debug", // --tool:log-debug - Write log to stdout + "disable-write", // --tool:disable-write - Do not write runtime scripts to filesystem + "runtime-check", // --tool:runtime-check - Determine if firepit binary is node or not + "setup-check", // --tool:setup-check - Check if firebase-tools is set up + "force-setup", // --tool:force-setup - Force Firepit to go through setup + "force-update", // --tool:force-update - Aggressively clear npm cache and re-setup + "ignore-embedded-cache" // --tool:ignore-embedded-cache - Setup from online, do not use embedded firebase-tools ]; -/* - This script parses our flagDefinitions and returns a map like {file-debug: false, ...} - */ const flags = flagDefinitions.reduce((flags, name) => { flags[name] = process.argv.indexOf(`--tool:${name}`) !== -1; if (flags[name]) { process.argv.splice(process.argv.indexOf(`--tool:${name}`), 1); } - return flags; }, {}); -/* - We use @zeit/pkg to actually bundle our JavaScript with the NodeJS runtime to produce our binaries. - In general if you're running your code inside of pkg and you attempt to spawn the pkg binary which - you invoked to run your code (i.e. firepit.exe invokes firepit.exe) what you'll actually be - invoking is the underlying Node.js binary which is embedded is the binary. - - This works well, albeit it may be a bit unexpected, however due to the nature of Firepit, - there's no assurance that we'll actually be in the same process at any given time. - - For example, if we invoke "./firepit" and Firepit spawns a shell and that shell is used to call "firebase" - we're now in a situation where invoking "./firepit" from "firebase" will act as a fresh call to - Firepit, resulting it in running through the setup and such. - - In another example, if we invoke "./firepit" and it immediately spawns "./firepit" then it'll - be spawning a node process. - - I know this is confusing, but the moral is that we can be sure at any moment if spawning "./firepit" - will provide us with this file running in Node or just a Node runtime. - - To detect what the "firepit" binary is we run "./firepit check.js --tool:runtime-check" in - VerifyNodePath(). If "./firepit" is acting as Firepit, this conditional will flip and we'll - just exit out. If "./firepit" is acting as a Node runtime, it'll invoke check.js and return - a unicode ✓. This allows us to know if we can safely invoke Node scripts by calling ourselves - or if we must call "./firepit is:node ./script" to force it to manually imitate Node. - */ if (flags["runtime-check"]) { console.log(`firepit invoked for runtime check, exiting subpit.`); return; } +const APPEND_TO_PATH_SRV = `function appendToPath(isWin, pathsToAppend) { + const PATH = process.env.PATH; + const pathSeperator = isWin ? ";" : ":" + process.env.PATH = [ + ...pathsToAppend, + ...PATH.split(pathSeperator).filter(folder => folder) + ].join(pathSeperator); +}`; + +const GET_SAFE_PATH_SRV = `async function getSafeCrossPlatformPath(isWin, path) { + if (!isWin) return path; + let command = \`for %I in ("\${path}") do echo %~sI\`; + return new Promise(resolve => { + const cmd = require("child_process").spawn(\`cmd\`, ["/c", command], { + shell: true + }); + let result = ""; + cmd.on("error", error => { + throw error; + }); + cmd.stdout.on("data", stdout => { + result += stdout.toString(); + }); + cmd.on("close", code => { + if (code === 0) { + const lines = result.split("\\r\\n").filter(line => line); + const path = lines.slice(-1)[0]; + resolve(path.trim()); + } else { + throw \`Attempt to dosify path failed with code \${code}\`; + } + }); + }); +}`; + debug(`Welcome to firepit v${version}!`); /* - ------------------------------------- The Main Path ------------------------------------- - - When running Firepit, we start here. This async closure handles checking most of the --tool flags - and ensuring that Firepit is setup and in-place before running firepit() */ (async () => { /* - Any time we invoke a child process from Firepit, we tack on a FIREPIT_VERSION env variable. - This is useful here so we can detect if we are the "top level" Firepit instance. + In Node Single Executable Application (SEA) mode, any child process forked from Firepit + (such as child_process.fork(script) or firebase is:node script.js) will invoke the SEA + executable as the Node runtime. We intercept child script invocations at the entrypoint + and execute the requested script directly via createRequire to prevent recursive execution + of the main Firepit router. + */ + if (isSeaMode) { + const moduleProto = require("module"); + if (moduleProto.Module && typeof moduleProto.Module._nodeModulePaths === "function") { + moduleProto.Module._nodeModulePaths(installPath).forEach(p => { + if (!module.paths.includes(p)) { + module.paths.push(p); + } + }); + } - For example, if you are running Firepit in headful mode then the first instance of Firepit - spawns you a command prompt window. In that command prompt we go through welcome.js then - you're given access to the "firebase" command. + let resolvedScriptPath; + let spliceIndex; + const { createRequire } = require("module"); + const fsRequire = createRequire(process.execPath); + + if (process.argv[1] && path.resolve(process.argv[1]) !== path.resolve(process.execPath)) { + try { + const p = path.resolve(process.argv[1]); + if (fs.existsSync(p) && fs.statSync(p).isFile()) { + resolvedScriptPath = fsRequire.resolve(p); + spliceIndex = 1; + } + } catch (err) {} + } + if (!resolvedScriptPath && process.argv[2]) { + try { + const p = path.resolve(process.argv[2]); + if (fs.existsSync(p) && fs.statSync(p).isFile()) { + resolvedScriptPath = fsRequire.resolve(p); + spliceIndex = 2; + } + } catch (err) {} + } + + if (resolvedScriptPath) { + process.argv[0] = process.execPath; + if (spliceIndex === 2) { + process.argv.splice(1, 1); + } + try { + const scriptRequire = createRequire(resolvedScriptPath); + scriptRequire(resolvedScriptPath); + } catch (err) { + console.error(err); + process.exit(1); + } + return; + } + } - When you run "firebase", if we didn't know if we were top-level then you'd just spawn another - command prompt window - clearly not what we want. So we look for the env variable set by the - process which spawned the window. If it exists, we functionally fall into "headless" mode - and act like a normal Firebase CLI. - */ const isTopLevel = !process.env.FIREPIT_VERSION; - /* - As I mentioned above, we make heavy use of this function to DOS-isy paths to avoid space-issues. - In this case, we're using process.argv[0] (always a reference to the node binary which spawned - this script) and turning it safe so we have an invokable Node.js runtime for later. - */ safeNodePath = await getSafeCrossPlatformPath(isWindows, process.argv[0]); - /* - If the user has ever had an older version of Firepit, clear it out and replace it with us. - */ uninstallLegacyFirepit(); - /* - --tool:setup-check is used by welcome.js and returns out a JSON list of binaries for the "firebase" - command. It's essentially a check to see if we can find a copy of "firebase" to invoke. - - The FindTool function looks in several places for where it thinks our firebase script might be - and returns as many as it fins. We almost always use the 0th one. - */ if (flags["setup-check"]) { const bins = FindTool("firebase-tools/lib/bin/firebase"); @@ -325,44 +362,11 @@ debug(`Welcome to firepit v${version}!`); return; } - - /* - --tool:force-update is never used internally, but can be useful for EAPs where version numbers - may be incorrect. This manually clear NPMs cache and then flips the flags "ignore-embedded-cache" - and "force-setup" to tell Firepit to install itself from the remote package (either a link to a - tgz or just firebase-tools@latest). - */ if (flags["force-update"]) { console.log(`Please wait while we clear npm's cache...`); - /* - This is the first instance of invoking one of the Imitate*() methods. These methods are - the methods which "route" to the underlying scripts for each command. As you'd expect - ImitateNPM forces the process to act just like npm. - - By replacing the process.argv before calling ImitateNPM(), we're rewriting what the - command was which called Firepit. For example, this snippet creates the following command... - - /blah/blah/node ./firepit.js is:npm cache clean --force + process.argv = [...process.argv.slice(0, 2), "is:npm", "cache", "clean", "--force"]; - As far as Firepit is concerned, this looks just like invoking it with is:npm from the top. - - It may be cleaner to have Imitate*() take an array of command strings instead of modifying - process.argv, but for now I'll leave it like this. - */ - process.argv = [ - ...process.argv.slice(0, 2), - "is:npm", - "cache", - "clean", - "--force" - ]; - - /* - The Imitate*() methods also always return codes (0, 1, 2) from the underlying script. We - need to make sure we bubble these up because incorrect handling of exit codes will create - unexpected behavior in scripts. - */ const code = await ImitateNPM(); if (code) { @@ -374,23 +378,13 @@ debug(`Welcome to firepit v${version}!`); flags["force-setup"] = true; console.log(`Clearing out your firebase-tools setup...`); - /* - Here's a handy use of shelljs. It's stupidly hard to recursively remove a directory with - Node's standard libs. Shelljs makes it trivial. - */ - shell.rm("-rf", installPath); + try { + fs.rmSync(installPath, { recursive: true, force: true }); + } catch (e) {} } - /* - Every time Firepit is invoked it recreates the runtime binaries (node, npm, shell) because - these binaries need to know the current location of the Firepit binary. See the function - comments for more. - */ await createRuntimeBinaries(); - /* - If we're in --tool:force-setup then extract or remotely install firebase-tools then exit out. - */ if (flags["force-setup"]) { debug("Forcing setup..."); await SetupFirebaseTools(); @@ -398,41 +392,22 @@ debug(`Welcome to firepit v${version}!`); return; } - /* - As I mentioned above, isTopLevel is basically the same as headless mode. There's an entire flow - here which revolves around invoking "./welcome.js" See that script for more details - */ if (isTopLevel && !config.headless) { const welcome_path = await getSafeCrossPlatformPath( isWindows, - path.join(__dirname, "/welcome.js") + path.join(isSeaMode ? runtimeBinsPath : __dirname, "welcome.js") ); const firebaseToolsCommand = await getFirebaseToolsCommand(); - /* - This function adds a directory onto the PATH env variable. On Windows they're ; separated - and *nix they're : seperated. - */ appendToPath(isWindows, [path.join(installPath, "bin"), runtimeBinsPath]); - /* - As I mentioned above, we set the FIREPIT_VERSION env variable so that the shell we spawn - doesn't spawn another window and it instead acts as a headless firepit. - */ const shellEnv = { FIREPIT_VERSION: version, ...process.env }; if (isWindows) { - /* - This is some of the only platform specific bits we have here. On Windows, headful mode spawns - a custom cmd.exe prompt with doskey (alias) commands called to expose the "firebase" and "npm" - commands. We also set the prompt to a neat yellow ">" then invoke the welcome script. - - This top level Firepit script sits open until the developer closes that terminal. - */ const shellConfig = { stdio: "inherit", env: shellEnv @@ -456,16 +431,7 @@ debug(`Welcome to firepit v${version}!`); debug("Received SIGINT. Refusing to close top-level shell."); }); } else { - /* - If we're not on Windows, then we can technically perform headful mode on Mac. By default double-clicking - a binary on Mac will pop up a terminal, so we just invoke the welcome screen and set the bash prompt. - */ - process.argv = [ - ...process.argv.slice(0, 2), - "is:node", - welcome_path, - firebaseToolsCommand - ]; + process.argv = [...process.argv.slice(0, 2), "is:node", welcome_path, firebaseToolsCommand]; const code = await ImitateNode(); if (code) { @@ -479,11 +445,6 @@ debug(`Welcome to firepit v${version}!`); }); } } else { - /* - In the case that Firepit is not in headful mode (or it was loaded in headful more, but is - not the top level process), then we jump into the actual firepit() method which takes care - of routing the is:npm, is:node, or other core modes. - */ SetWindowTitle("Firebase CLI"); await firepit(); } @@ -492,10 +453,6 @@ debug(`Welcome to firepit v${version}!`); fs.writeFileSync("firepit-log.txt", debug.log.join("\n")); } })().catch(err => { - /* - Note we have a high-level catch here which attempts to catch any crazy firepit errors. This is - rarely hit, but it will produce a firepit-log.txt when some internal errors occur. - */ debug(err.toString()); console.log( `This tool has encountered an error. Please file a bug on Github (https://github.com/firebase/firebase-tools/) and include firepit-log.txt` @@ -503,16 +460,9 @@ debug(`Welcome to firepit v${version}!`); fs.writeFileSync("firepit-log.txt", debug.log.join("\n")); }); - async function firepit() { - /* - When running inside Node, the "node" binary is stored in many places. As I mentioned earlier, - it's the 0th item of process.argv and it's also in a couple other places. To be safe we - get a "safe" version of the Node runtime path and replace all known references with this. - */ runtimeBinsPath = await getSafeCrossPlatformPath(isWindows, runtimeBinsPath); - // TODO: I'm not sure this is needed, more testing would be useful. process.argv[0] = safeNodePath; process.env.NODE = safeNodePath; process.env._ = safeNodePath; @@ -520,14 +470,9 @@ async function firepit() { debug(safeNodePath); debug(process.argv); - // TODO: This may not be needed since we invoke createRuntimeBinaries() earlier await createRuntimeBinaries(); appendToPath(isWindows, [runtimeBinsPath]); - /* - We check for the is:npm and is:node flags and if either exist, we opt ot imitate that process - and then exit out when done. - */ if (process.argv.indexOf("is:npm") !== -1) { const code = await ImitateNPM(); process.exit(code); @@ -538,14 +483,6 @@ async function firepit() { process.exit(code); } - /* - If Firepit was invoked in headless mode, there is a chance that firebase-tools has not been set - up yet (since the welcome screen was never shown and that script is what calls --tool:forces-setup. - - To be sure, we attempt to find the firebase-tools script and if it's not found, we attempt a setup. - - After the setup, if the script still isn't found then something is wrong and we die. - */ let firebaseBins = FindTool("firebase-tools/lib/bin/firebase"); if (!firebaseBins.length) { debug(`CLI not found! Invoking setup...`); @@ -553,10 +490,6 @@ async function firepit() { firebaseBins = FindTool("firebase-tools/lib/bin/firebase"); } - /* - Assuming we've gotten this far, we've found the CLI and we're ready to run firebase-tools. - That was easy, huh? - */ const firebaseBin = firebaseBins[0]; debug(`CLI install found at "${firebaseBin}", starting fork...`); const code = await ImitateFirebaseTools(firebaseBin); @@ -567,11 +500,6 @@ async function firepit() { ------------------------------------- Imitate*() ------------------------------------- - - All of the Imitate*() methods are very similar. For is:npm and is:node we break process.argv - based on that string and then pass everything on the right to the script, which is forked from - the main Node process. We create a promise (which can be awaited) and then resolve when the - command is done. */ function ImitateNPM() { @@ -595,8 +523,78 @@ function ImitateNode() { debug("Detected is:node flag, calling node"); const breakerIndex = process.argv.indexOf("is:node") + 1; const nodeArgs = [...process.argv.slice(breakerIndex)]; + + if (nodeArgs.length === 0) { + console.log("Welcome to Node.js " + process.version); + return Promise.resolve(0); + } + + if (nodeArgs[0] === "-v" || nodeArgs[0] === "--version") { + console.log(process.version); + return Promise.resolve(0); + } + + if (nodeArgs[0] === "-e" || nodeArgs[0] === "--eval") { + const code = nodeArgs[1] || ""; + try { + const vm = require("vm"); + const { createRequire } = require("module"); + const contextRequire = createRequire(process.cwd() + "/index.js"); + const sandbox = { + require: contextRequire, + process, + console, + Buffer, + setTimeout, + clearTimeout, + setInterval, + clearInterval, + setImmediate, + clearImmediate, + global + }; + sandbox.global = sandbox; + const context = vm.createContext(sandbox); + vm.runInContext(code, context); + return Promise.resolve(0); + } catch (e) { + console.error(e); + return Promise.resolve(1); + } + } + + if (nodeArgs[0] === "-p" || nodeArgs[0] === "--print") { + const code = nodeArgs[1] || ""; + try { + const vm = require("vm"); + const { createRequire } = require("module"); + const contextRequire = createRequire(process.cwd() + "/index.js"); + const sandbox = { + require: contextRequire, + process, + console, + Buffer, + setTimeout, + clearTimeout, + setInterval, + clearInterval, + setImmediate, + clearImmediate, + global + }; + sandbox.global = sandbox; + const context = vm.createContext(sandbox); + console.log(vm.runInContext(code, context)); + return Promise.resolve(0); + } catch (e) { + console.error(e); + return Promise.resolve(1); + } + } + return new Promise(resolve => { - const cmd = fork(nodeArgs[0], nodeArgs.slice(1), { + const target = path.resolve(nodeArgs[0]); + const cmd = fork(target, nodeArgs.slice(1), { stdio: "inherit", env: process.env }); @@ -609,8 +607,9 @@ function ImitateNode() { function ImitateFirebaseTools(binPath) { debug("Detected no special flags, calling firebase-tools"); + const targetScript = binPath.endsWith(".js") ? binPath : binPath + ".js"; return new Promise(resolve => { - const cmd = fork(binPath, process.argv.slice(2), { + const cmd = fork(targetScript, process.argv.slice(2), { stdio: "inherit", env: { ...process.env, FIREPIT_VERSION: version } }); @@ -628,122 +627,101 @@ function ImitateFirebaseTools(binPath) { */ async function createRuntimeBinaries() { - /* - As discussed in the introduction, Firepit isn't *just* firebase-tools, it's also npm and node. - We need it to act as several CLI tools in order to support firebase-tools because it shells out - to these other commands in some situations. - - In order to support this we add a few special scripts onto the users's path so when a user (or - script) invokes "npm" or "node" it redirects back into Firepit so we can control the environment - regardless of how that command was invoked. - - To do this cross-platform, we need to create both shell and batch scripts (for nix / windows). - These scripts are kept very minimal, as you can see in runtimeBins, they're mostly one line or - two. - - Each of the platform-specific scripts like "shell" or "node.bat" do the absolute minimum work - needed to act as an executable binary, then immediately redirect the arguments passed to it - back into Firepit via the "shell.js" or "node.js" scripts. (See runtime.js for contents). These - two scripts do the majority of heavy lifting in terms of imitating npm or node. - - Originally, we implemented the node / npm stand-ins in pure bash or batch, however there was - way too much platform specific code, by redirecting us back into Firepit (and Node) we add - another process, but we also dramatically reduce per-platform code. The Node code is - cross-platform and works perfectly everywhere. It's also easier to test because any *nix - machine can functionally test the same code that would run on Windows or vice-versa. - */ + const safeNodePath = await getSafeCrossPlatformPath(isWindows, process.argv[0]); + const unsafeNodePath = process.argv[0]; + const isRuntime = await VerifyNodePath(safeNodePath); + + const npmArgs = [ + `--scripts-prepend-node-path=auto`, + `--script-shell=${path.join(runtimeBinsPath, "shell")}${isWindows ? ".bat" : ""}`, + `--globalconfig=${path.join(runtimeBinsPath, "npmrc")}` + ]; + const runtimeBins = { /* Linux / OSX */ - shell: `"${unsafeNodePath}" ${runtimeBinsPath}/shell.js "$@"`, - node: `"${unsafeNodePath}" ${runtimeBinsPath}/node.js "$@"`, - npm: `"${unsafeNodePath}" "${ - FindTool("npm/bin/npm-cli")[0] - }" ${npmArgs.join(" ")} "$@"`, + firebase: `"${safeNodePath}" "$@"`, + node: `"${safeNodePath}" ${runtimeBinsPath}/node.js "$@"`, + npm: `"${safeNodePath}" "${FindTool("npm/bin/npm-cli")[0]}" ${npmArgs.join(" ")} "$@"`, + shell: `"${safeNodePath}" ${runtimeBinsPath}/shell.js "$@"`, /* Windows */ - "node.bat": `@echo off -"${unsafeNodePath}" ${runtimeBinsPath}\\node.js %*`, - "shell.bat": `@echo off -"${unsafeNodePath}" ${runtimeBinsPath}\\shell.js %*`, - "npm.bat": `@echo off -node "${FindTool("npm/bin/npm-cli")[0]}" ${npmArgs.join(" ")} %*`, + "firebase.bat": `@echo off\n"${safeNodePath}" %*`, + "node.bat": `@echo off\n"${safeNodePath}" ${runtimeBinsPath}\\node.js %*`, + "npm.bat": `@echo off\n"${safeNodePath}" "${FindTool("npm/bin/npm-cli")[0]}" ${npmArgs.join( + " " + )} %*`, + "shell.bat": `@echo off\n"${safeNodePath}" ${runtimeBinsPath}\\shell.js %*`, /* Runtime scripts */ - "shell.js": `${appendToPath.toString()}\n${getSafeCrossPlatformPath.toString()}\n(${runtime.Script_ShellJS.toString()})()`, + "shell.js": `${APPEND_TO_PATH_SRV}\n${GET_SAFE_PATH_SRV}\n(${runtime.Script_ShellJS.toString()})()`, "node.js": `(${runtime.Script_NodeJS.toString()})()`, /* Config files */ - npmrc: `prefix = ${installPath}` + npmrc: `prefix=${installPath}` }; - /* - We handle creating the runtimeBins files by looping through and writing files. There's nothing - special or interesting here. - */ - try { - shell.mkdir("-p", runtimeBinsPath); + fs.mkdirSync(runtimeBinsPath, { recursive: true }); } catch (err) { debug(err); } - if (!flags["disable-write"]) { + if (isRuntime) { Object.keys(runtimeBins).forEach(filename => { const runtimeBinPath = path.join(runtimeBinsPath, filename); try { - shell.rm("-rf", runtimeBinPath); + fs.rmSync(runtimeBinPath, { recursive: true, force: true }); } catch (err) { debug(err); } fs.writeFileSync(runtimeBinPath, runtimeBins[filename]); - shell.chmod("+x", runtimeBinPath); + fs.chmodSync(runtimeBinPath, 0o755); }); + + if (isSeaMode) { + extractSEAAsset("welcome.js", path.join(runtimeBinsPath, "welcome.js")); + extractSEAAsset("check.js", path.join(runtimeBinsPath, "check.js")); + } } debug("Runtime binaries created."); } - async function SetupFirebaseTools() { - /* - Firepit supports "setting up" (that is, installing) firebase-tools in two ways. - - 1) Use the copy of firebase-tools which is stored inside the firepit binary at - join(__dirname, "vendor/node_modules/firebase-tools") - 2) Use a copy of firebase-tools installed via npm via the internet. - */ debug(`Attempting to install to "${installPath}"`); const original_argv = [...process.argv]; const nodeModulesPath = path.join(installPath, "lib"); const binPath = path.join(installPath, "bin"); - debug(shell.mkdir("-p", nodeModulesPath).toString()); - debug(shell.mkdir("-p", binPath).toString()); - - /* - In general, we use the embedded version of firebase-tools. Once installed, this version can be - upgraded via npm, however it's important to skip npm for the initial setup as it's dramatically - faster. - */ + fs.mkdirSync(nodeModulesPath, { recursive: true }); + fs.mkdirSync(binPath, { recursive: true }); if (!flags["ignore-embedded-cache"]) { - /* - When doing the embedded install, the setup is as simple as cp -R'ing the JavaScript files - to the right place then linking the script to a bin folder (see below). - */ - debug("Using embedded cache for quick install..."); - debug( - shell - .cp("-R", path.join(__dirname, "vendor/*"), nodeModulesPath) - .toString() - ); + if (isSeaMode) { + debug("Extracting embedded assets..."); + const tarballPath = path.join(installPath, "firepit-assets.tar.gz"); + extractSEAAsset("firepit-assets.tar.gz", tarballPath); + + try { + debug(`Running tar command to extract: ${tarballPath}`); + const result = shell.exec(`tar -xzf "${tarballPath}" -C "${installPath}"`); + if (result.code !== 0) { + console.error(`Failed to extract firepit assets: ${result.stderr || result.stdout}`); + process.exit(1); + } + } catch (err) { + console.error(`Failed to extract firepit assets: ${err.message}`); + process.exit(1); + } + try { + fs.unlinkSync(tarballPath); + } catch (e) {} + debug("Embedded assets extracted successfully."); + } else { + debug("Using embedded cache for quick install..."); + shell.cp("-R", path.join(__dirname, "vendor/*"), nodeModulesPath); + } } else { - /* - When doing a remote install, we ImitateNPM and run a normal npm install. Note that we're - installing both firebase-tools and "npm" because this will upgrade the copy of npm used - by Firepit. Better up-to-date than sorry! - */ debug("Using remote for slow install..."); - // Install remotely process.argv = [ ...process.argv.slice(0, 2), "is:npm", @@ -759,34 +737,16 @@ async function SetupFirebaseTools() { } } - /* - When installing remotely, npm automatically links the firebase-tools script to a binary folder, - however sometimes this doesn't happen as expected, so we manually call shell.ln (link) to create - a symlink regardless of the install type. - - This step ensures that whether the firebase-tools install was created from the remote or - local install that the binary still exists in the same place. - - Note we can not simply move firebase.js because it uses imports relative to it's position in - the node_modules tree. - */ debug( shell .ln( "-sf", - path.join( - nodeModulesPath, - "node_modules/firebase-tools/lib/bin/firebase.js" - ), + path.join(nodeModulesPath, "node_modules/firebase-tools/lib/bin/firebase.js"), path.join(binPath, "firebase") ) .toString() ); - /* - Finally we check to make sure we now have a copy of the "firebase" command which is findable - and then restore the original process.argv before finishing the setup. - */ if (!FindTool("firebase-tools/lib/bin/firebase").length) { console.warn(`firebase-tools setup failed.`); process.exit(2); @@ -802,42 +762,33 @@ async function SetupFirebaseTools() { */ function uninstallLegacyFirepit() { - /* - There are two situations where we should trash the Firepit install directory. + const cliDir = path.join(homePath, ".cache", "firebase", "cli"); + const isLegacyFirepit = fs.existsSync(cliDir); - 1) We're using an old firepit version where the "cli" folder exists - 2) We're using an old firebase-tools version where the version is different than ours. - */ - - /* - To detect an old-style Firepit install, we look for the "cli" folder, a folder which has - been renmaed in new Firepit builds. - */ - const isLegacyFirepit = !shell.ls( - path.join(homePath, ".cache", "firebase", "cli") - ).code; - - /* - To check for mismatched firebase-tools versions, we find the package.json and read the version - manually then compare it to ours. - */ - let installedFirebaseToolsPackage = {}; const installedFirebaseToolsPackagePath = path.join( homePath, ".cache/firebase/tools/lib/node_modules/firebase-tools/package.json" ); - const firepitFirebaseToolsPackagePath = path.join( - __dirname, - "vendor/node_modules/firebase-tools/package.json" - ); - debug(`Doing JSON parses for version checks at ${firepitFirebaseToolsPackagePath}`); - debug(shell.ls(path.join(__dirname, "vendor/node_modules/"))); - const firepitFirebaseToolsPackage = JSON.parse( - shell.cat(firepitFirebaseToolsPackagePath) - ); + + let firepitFirebaseToolsVersion = config.firebase_tools_version; + if (!firepitFirebaseToolsVersion) { + const firepitFirebaseToolsPackagePath = path.join( + __dirname, + "vendor/node_modules/firebase-tools/package.json" + ); + try { + firepitFirebaseToolsVersion = JSON.parse( + fs.readFileSync(firepitFirebaseToolsPackagePath, "utf8") + ).version; + } catch (err) { + debug("No packaged firebase-tools version found in local dev."); + } + } + + let installedFirebaseToolsPackage = {}; try { installedFirebaseToolsPackage = JSON.parse( - shell.cat(installedFirebaseToolsPackagePath) + fs.readFileSync(installedFirebaseToolsPackagePath, "utf8") ); } catch (err) { debug("No existing firebase-tools install found."); @@ -845,180 +796,102 @@ function uninstallLegacyFirepit() { debug( `Installed ft@${installedFirebaseToolsPackage.version || - "none"} and packaged ft@${firepitFirebaseToolsPackage.version}` + "none"} and packaged ft@${firepitFirebaseToolsVersion}` ); const isLegacyFirebaseTools = - installedFirebaseToolsPackage.version !== - firepitFirebaseToolsPackage.version; - - /* - If either of these conditions are true, we just delete the whole cache and start over fresh. - */ + installedFirebaseToolsPackage.version && + firepitFirebaseToolsVersion && + installedFirebaseToolsPackage.version !== firepitFirebaseToolsVersion; if (!isLegacyFirepit && !isLegacyFirebaseTools) return; debug("Legacy firepit / firebase-tools detected, clearing it out..."); - debug(shell.rm("-rf", path.join(homePath, ".cache", "firebase"))); + try { + fs.rmSync(path.join(homePath, ".cache", "firebase"), { recursive: true, force: true }); + } catch (err) { + debug(err.message); + } } async function getFirebaseToolsCommand() { - /* - This helper function produces an absolute, cross-platform "firebase" command reference. - - It outputs either "c:\path\to\firebase.exe" or "c:\path\to\firebase.exe path\to\firebase.js" - As discussed above, whether running the firepit binary results in a Node.js runtime or the - "firebase" command can change (seemingly randomly, but it's not) depending on if we're - inside of an existing pkg process. Doing this check ensures that we get a command which - when ran results in "firebase" being ran regardless of environment. - */ + const safeNodePath = await getSafeCrossPlatformPath(isWindows, process.argv[0]); const isRuntime = await VerifyNodePath(safeNodePath); debug(`Node path ${safeNodePath} is runtime? ${isRuntime}`); let firebase_command; - if (isRuntime) { + if (isRuntime && !isSeaMode) { const script_path = await getSafeCrossPlatformPath( isWindows, path.join(__dirname, "/firepit.js") ); - //TODO: We should store this as an array to prevent issues with spaces - firebase_command = `${safeNodePath} ${script_path}`; + firebase_command = `"${safeNodePath}" "${script_path}"`; } else { - firebase_command = safeNodePath; + firebase_command = `"${safeNodePath}"`; } - debug(firebase_command); + + debug(`Using firebase command: ${firebase_command}`); return firebase_command; } async function VerifyNodePath(nodePath) { - /* - VerifyNodePath invokes the firepit binary with two flags... - - ./firepit check.js --tool:runtime-check - - This allows us to determine if the current environment is internal to pkg or not. When it's - internal, meaning that the invocation of firepit is a direct child of another firepit process - then ./firepit will invoke the node runtime which is bundled within the firepit binary. - - When it's not internal, it will run the firepit scripts. - - This check works because with these flags ./firepit call will run check.js and return a - checkmark if it's acting as the Node runtime and if it's not it will just log something - else and exit. - - We use this to ensure that we can always build a command which invokes the Firebase CLI - regardless of where the process is actually being spawned. - */ + const basename = path.basename(nodePath); + if ( + nodePath === process.execPath || + basename.includes("firepit") || + basename.includes("firebase-tools") + ) { + return isSeaMode; + } const runtimeCheckPath = await getSafeCrossPlatformPath( isWindows, - path.join(__dirname, "check.js") + path.join(isSeaMode ? runtimeBinsPath : __dirname, "check.js") ); return new Promise(resolve => { const cmd = spawn(nodePath, [runtimeCheckPath, "--tool:runtime-check"], { - shell: true - }); - - let result = ""; - cmd.on("error", error => { - throw error; - }); - - cmd.stderr.on("data", stderr => { - debug(`STDERR: ${stderr.toString()}`); - }); - - cmd.stdout.on("data", stdout => { - debug(`STDOUT: ${stdout.toString()}`); - result += stdout.toString(); + stdio: "ignore" }); - cmd.on("close", code => { - debug( - `[VerifyNodePath] Expected "✓" from runtime got code ${code} with output "${result}"` - ); - if (code === 0) { - if (result.indexOf("✓") >= 0) { - resolve(true); - } else { - resolve(false); - } - } else { - resolve(false); - } + resolve(code === 0); + }); + cmd.on("error", () => { + resolve(false); }); }); } function FindTool(bin) { - /* - This method returns a list of files which match the script name provided. We use this to - locate npm, firebase-tools, etc. - */ - const potentialPaths = [ path.join(installPath, "lib/node_modules", bin), + path.join(installPath, "lib/node_modules/firebase-tools/standalone/node_modules", bin), path.join(installPath, "node_modules", bin), + path.join(installPath, "lib", bin), path.join(__dirname, "node_modules", bin) ]; return potentialPaths - .map(path => { - debug(`Checking for ${bin} install at ${path}`); - if (shell.ls(path + ".js").code === 0) { - debug(`Found ${bin} install.`); - return path; - } + .map(p => { + debug(`Checking for ${bin} install at ${p}`); + if (fs.existsSync(p)) return p; + if (fs.existsSync(p + ".js")) return p + ".js"; }) - .filter(p => p); + .filter(Boolean); } function SetWindowTitle(title) { - /* - This method *attempts* to set the terminal window title to something pretty so it doesn't - show the internal shell'ing we do. It kinda works, but fails silently, so I've left it in. - */ if (isWindows) { process.title = title; } } - /* ------------------------------------- Shared Functions ------------------------------------- - - These methods are very special and should be edited carefully. They must be pure JavaScript - functions which do not rely on any global state or imports. - - If you look at createRuntimeBinaries() and see the runtimeBins scripts, you'll see that we - call getSafeCrossPlatformPath.toString() and appendToPath.toString() and put them into the - scripts which we place on the filesystem. We do this because the scripts in ./runtime.js - depend on these functions and since we need to create single JavaScript files to drop onto - the user's filesystem, we concat them together. - - This is fairly dangerous, but we don't have many options. */ async function getSafeCrossPlatformPath(isWin, path) { - /* - This function generates "safe" DOS style file paths on Windows. - - For example: - - unsafePath: C:\Program Files\Java\jdk1.6.0_22 - safePath: C:\PROGRA~1\Java\JDK16~1.0_2 - - These paths remove spaces and special characters which could interfere with the terminal. - In theory, it should be possible to avoid this, but because of issues in npm, we need to be - extra safe about spaces. - */ if (!isWin) return path; - /* - This is perhaps the biggest hack in Firepit, we shell out to command and run a small script - which returns the DOS-formatted version of a path. This is not fast, but it's (apparently) - the only way to fetch the safe version of a path - */ let command = `for %I in ("${path}") do echo %~sI`; return new Promise(resolve => { const cmd = require("child_process").spawn(`cmd`, ["/c", command], { @@ -1046,24 +919,15 @@ async function getSafeCrossPlatformPath(isWin, path) { } function appendToPath(isWin, pathsToAppend) { - /* - This method handles appending a folder to the user's PATH directory in a cross-platform way. - - Windows uses ";" to delimit paths and *nix uses ":" - */ const PATH = process.env.PATH; const pathSeperator = isWin ? ";" : ":"; - process.env.PATH = [ - ...pathsToAppend, - ...PATH.split(pathSeperator).filter(folder => folder) - ].join(pathSeperator); + process.env.PATH = [...pathsToAppend, ...PATH.split(pathSeperator).filter(folder => folder)].join( + pathSeperator + ); } function debug(...msg) { - /* - This method creates a debug log which can go to stdout or a file depending on --tool: flags. - */ if (!debug.log) debug.log = []; if (flags["log-debug"]) { diff --git a/standalone/package-lock.json b/standalone/package-lock.json index a548bbe19be..33663f4b0ff 100644 --- a/standalone/package-lock.json +++ b/standalone/package-lock.json @@ -10,331 +10,464 @@ "license": "MIT", "dependencies": { "chalk": "^2.4.2", - "npm": "^8.19.0", - "shelljs": "^0.8.3", - "shx": "^0.3.2", - "user-home": "^2.0.0" + "npm": "^8.19.0" }, "devDependencies": { - "@yao-pkg/pkg": "~6.4.1", + "esbuild": "^0.25.0", "prettier": "^1.15.3" } }, - "node_modules/@babel/helper-string-parser": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.25.9.tgz", - "integrity": "sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==", + "node_modules/@esbuild/aix-ppc64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.12.tgz", + "integrity": "sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA==", + "cpu": [ + "ppc64" + ], "dev": true, "license": "MIT", + "optional": true, + "os": [ + "aix" + ], "engines": { - "node": ">=6.9.0" + "node": ">=18" } }, - "node_modules/@babel/helper-validator-identifier": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz", - "integrity": "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==", + "node_modules/@esbuild/android-arm": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.12.tgz", + "integrity": "sha512-VJ+sKvNA/GE7Ccacc9Cha7bpS8nyzVv0jdVgwNDaR4gDMC/2TTRc33Ip8qrNYUcpkOHUT5OZ0bUcNNVZQ9RLlg==", + "cpu": [ + "arm" + ], "dev": true, "license": "MIT", + "optional": true, + "os": [ + "android" + ], "engines": { - "node": ">=6.9.0" + "node": ">=18" } }, - "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==", + "node_modules/@esbuild/android-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.12.tgz", + "integrity": "sha512-6AAmLG7zwD1Z159jCKPvAxZd4y/VTO0VkprYy+3N2FtJ8+BQWFXU+OxARIwA46c5tdD9SsKGZ/1ocqBS/gAKHg==", + "cpu": [ + "arm64" + ], "dev": true, - "license": "ISC", - "dependencies": { - "minipass": "^7.0.4" - }, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], "engines": { - "node": ">=18.0.0" + "node": ">=18" } }, - "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.8", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.8.tgz", - "integrity": "sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==", + "node_modules/@esbuild/android-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.12.tgz", + "integrity": "sha512-5jbb+2hhDHx5phYR2By8GTWEzn6I9UqR11Kwf22iKbNpYrsmRB18aX/9ivc5cabcUiAT/wM+YIZ6SG9QO6a8kg==", + "cpu": [ + "x64" + ], "dev": true, "license": "MIT", - "dependencies": { - "@jridgewell/set-array": "^1.2.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.24" - }, + "optional": true, + "os": [ + "android" + ], "engines": { - "node": ">=6.0.0" + "node": ">=18" } }, - "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==", + "node_modules/@esbuild/darwin-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.12.tgz", + "integrity": "sha512-N3zl+lxHCifgIlcMUP5016ESkeQjLj/959RxxNYIthIg+CQHInujFuXeWbWMgnTo4cp5XVHqFPmpyu9J65C1Yg==", + "cpu": [ + "arm64" + ], "dev": true, "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], "engines": { - "node": ">=6.0.0" + "node": ">=18" } }, - "node_modules/@jridgewell/set-array": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", - "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", + "node_modules/@esbuild/darwin-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.12.tgz", + "integrity": "sha512-HQ9ka4Kx21qHXwtlTUVbKJOAnmG1ipXhdWTmNXiPzPfWKpXqASVcWdnf2bnL73wgjNrFXAa3yYvBSd9pzfEIpA==", + "cpu": [ + "x64" + ], "dev": true, "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], "engines": { - "node": ">=6.0.0" + "node": ">=18" } }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.4.15", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", - "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", - "dev": true + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.12.tgz", + "integrity": "sha512-gA0Bx759+7Jve03K1S0vkOu5Lg/85dou3EseOGUes8flVOGxbhDDh/iZaoek11Y8mtyKPGF3vP8XhnkDEAmzeg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.25", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", - "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", + "node_modules/@esbuild/freebsd-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.12.tgz", + "integrity": "sha512-TGbO26Yw2xsHzxtbVFGEXBFH0FRAP7gtcPE7P5yP7wGy7cXK2oO7RyOhL5NLiqTlBh47XhmIUXuGciXEqYFfBQ==", + "cpu": [ + "x64" + ], "dev": true, "license": "MIT", - "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" } }, - "node_modules/@yao-pkg/pkg": { - "version": "6.4.1", - "resolved": "https://registry.npmjs.org/@yao-pkg/pkg/-/pkg-6.4.1.tgz", - "integrity": "sha512-pjePVt+DQP+HaJI5DfEZDX1pGsMMFjv1wuqfy/BwXlnffVIRk8lXjw7yVYvLQRcomf8Eaz2chDE5B6gR2SSaQw==", + "node_modules/@esbuild/linux-arm": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.12.tgz", + "integrity": "sha512-lPDGyC1JPDou8kGcywY0YILzWlhhnRjdof3UlcoqYmS9El818LLfJJc3PXXgZHrHCAKs/Z2SeZtDJr5MrkxtOw==", + "cpu": [ + "arm" + ], "dev": true, "license": "MIT", - "dependencies": { - "@babel/generator": "^7.23.0", - "@babel/parser": "^7.23.0", - "@babel/types": "^7.23.0", - "@yao-pkg/pkg-fetch": "3.5.21", - "into-stream": "^6.0.0", - "minimist": "^1.2.6", - "multistream": "^4.1.0", - "picocolors": "^1.1.0", - "picomatch": "^4.0.2", - "prebuild-install": "^7.1.1", - "resolve": "^1.22.10", - "stream-meter": "^1.0.4", - "tar": "^7.4.3", - "tinyglobby": "^0.2.11", - "unzipper": "^0.12.3" - }, - "bin": { - "pkg": "lib-es5/bin.js" - }, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=18.0.0" + "node": ">=18" } }, - "node_modules/@yao-pkg/pkg-fetch": { - "version": "3.5.21", - "resolved": "https://registry.npmjs.org/@yao-pkg/pkg-fetch/-/pkg-fetch-3.5.21.tgz", - "integrity": "sha512-nlJ+rXersw70CQVSph7OfIN8lN6nCStjU7koXzh0WXiPvztZGqkoQTScHQCe1K8/tuKpeL0bEOYW0rP4QqMJ9A==", + "node_modules/@esbuild/linux-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.12.tgz", + "integrity": "sha512-8bwX7a8FghIgrupcxb4aUmYDLp8pX06rGh5HqDT7bB+8Rdells6mHvrFHHW2JAOPZUbnjUpKTLg6ECyzvas2AQ==", + "cpu": [ + "arm64" + ], "dev": true, "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": "^2.1.1", - "yargs": "^16.2.0" - }, - "bin": { - "pkg-fetch": "lib-es5/bin.js" + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" } }, - "node_modules/@yao-pkg/pkg/node_modules/@babel/generator": { - "version": "7.26.5", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.26.5.tgz", - "integrity": "sha512-2caSP6fN9I7HOe6nqhtft7V4g7/V/gfDsC3Ag4W7kEzzvRGKqiv0pu0HogPiZ3KaVSoNDhUws6IJjDjpfmYIXw==", + "node_modules/@esbuild/linux-ia32": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.12.tgz", + "integrity": "sha512-0y9KrdVnbMM2/vG8KfU0byhUN+EFCny9+8g202gYqSSVMonbsCfLjUO+rCci7pM0WBEtz+oK/PIwHkzxkyharA==", + "cpu": [ + "ia32" + ], "dev": true, "license": "MIT", - "dependencies": { - "@babel/parser": "^7.26.5", - "@babel/types": "^7.26.5", - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.25", - "jsesc": "^3.0.2" - }, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=6.9.0" + "node": ">=18" } }, - "node_modules/@yao-pkg/pkg/node_modules/@babel/parser": { - "version": "7.26.7", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.7.tgz", - "integrity": "sha512-kEvgGGgEjRUutvdVvZhbn/BxVt+5VSpwXz1j3WYXQbXDo8KzFOPNG2GQbdAiNq8g6wn1yKk7C/qrke03a84V+w==", + "node_modules/@esbuild/linux-loong64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.12.tgz", + "integrity": "sha512-h///Lr5a9rib/v1GGqXVGzjL4TMvVTv+s1DPoxQdz7l/AYv6LDSxdIwzxkrPW438oUXiDtwM10o9PmwS/6Z0Ng==", + "cpu": [ + "loong64" + ], "dev": true, "license": "MIT", - "dependencies": { - "@babel/types": "^7.26.7" - }, - "bin": { - "parser": "bin/babel-parser.js" - }, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=6.0.0" + "node": ">=18" } }, - "node_modules/@yao-pkg/pkg/node_modules/@babel/types": { - "version": "7.26.7", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.7.tgz", - "integrity": "sha512-t8kDRGrKXyp6+tjUh7hw2RLyclsW4TRoRvRHtSyAX9Bb5ldlFh+90YAYY6awRXrlB4G5G2izNeGySpATlFzmOg==", + "node_modules/@esbuild/linux-mips64el": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.12.tgz", + "integrity": "sha512-iyRrM1Pzy9GFMDLsXn1iHUm18nhKnNMWscjmp4+hpafcZjrr2WbT//d20xaGljXDBYHqRcl8HnxbX6uaA/eGVw==", + "cpu": [ + "mips64el" + ], "dev": true, "license": "MIT", - "dependencies": { - "@babel/helper-string-parser": "^7.25.9", - "@babel/helper-validator-identifier": "^7.25.9" - }, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=6.9.0" + "node": ">=18" } }, - "node_modules/@yao-pkg/pkg/node_modules/jsesc": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", - "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", + "node_modules/@esbuild/linux-ppc64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.12.tgz", + "integrity": "sha512-9meM/lRXxMi5PSUqEXRCtVjEZBGwB7P/D4yT8UG/mwIdze2aV4Vo6U5gD3+RsoHXKkHCfSxZKzmDssVlRj1QQA==", + "cpu": [ + "ppc64" + ], "dev": true, "license": "MIT", - "bin": { - "jsesc": "bin/jsesc" - }, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=6" + "node": ">=18" } }, - "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==", + "node_modules/@esbuild/linux-riscv64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.12.tgz", + "integrity": "sha512-Zr7KR4hgKUpWAwb1f3o5ygT04MzqVrGEGXGLnj15YQDJErYu/BGg+wmFlIDOdJp0PmB0lLvxFIOXZgFRrdjR0w==", + "cpu": [ + "riscv64" + ], "dev": true, "license": "MIT", - "dependencies": { - "debug": "4" - }, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">= 6.0.0" + "node": ">=18" } }, - "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==", + "node_modules/@esbuild/linux-s390x": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.12.tgz", + "integrity": "sha512-MsKncOcgTNvdtiISc/jZs/Zf8d0cl/t3gYWX8J9ubBnVOwlk65UIEEvgBORTiljloIWnBzLs4qhzPkJcitIzIg==", + "cpu": [ + "s390x" + ], "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=8" + "node": ">=18" } }, - "node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dependencies": { - "color-convert": "^1.9.0" - }, + "node_modules/@esbuild/linux-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.12.tgz", + "integrity": "sha512-uqZMTLr/zR/ed4jIGnwSLkaHmPjOjJvnm6TVVitAa08SLS9Z0VM8wIRx7gWbJB5/J54YuIMInDquWyYvQLZkgw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=4" + "node": ">=18" } }, - "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==" + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.12.tgz", + "integrity": "sha512-xXwcTq4GhRM7J9A8Gv5boanHhRa/Q9KLVmcyXHCTaM4wKfIpWkdXiMog/KsnxzJ0A1+nD+zoecuzqPmCRyBGjg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } }, - "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==", + "node_modules/@esbuild/netbsd-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.12.tgz", + "integrity": "sha512-Ld5pTlzPy3YwGec4OuHh1aCVCRvOXdH8DgRjfDy/oumVovmuSzWfnSJg+VtakB9Cm0gxNO9BzWkj6mtO1FMXkQ==", + "cpu": [ + "x64" + ], "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } }, - "node_modules/bl": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", - "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.12.tgz", + "integrity": "sha512-fF96T6KsBo/pkQI950FARU9apGNTSlZGsv1jZBAlcLL1MLjLNIWPBkj5NlSz8aAzYKg+eNqknrUJ24QBybeR5A==", + "cpu": [ + "arm64" + ], "dev": true, - "dependencies": { - "buffer": "^5.5.0", - "inherits": "^2.0.4", - "readable-stream": "^3.4.0" + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" } }, - "node_modules/bl/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==", + "node_modules/@esbuild/openbsd-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.12.tgz", + "integrity": "sha512-MZyXUkZHjQxUvzK7rN8DJ3SRmrVrke8ZyRusHlP+kuwqTcfWLyqMOE3sScPPyeIXN/mDJIfGXvcMqCgYKekoQw==", + "cpu": [ + "x64" + ], "dev": true, - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], "engines": { - "node": ">= 6" + "node": ">=18" } }, - "node_modules/bluebird": { - "version": "3.7.2", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", - "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", + "node_modules/@esbuild/openharmony-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.12.tgz", + "integrity": "sha512-rm0YWsqUSRrjncSXGA7Zv78Nbnw4XL6/dzr20cyrQf7ZmRcsovpcRBdhD43Nuk3y7XIoW2OxMVvwuRvk9XdASg==", + "cpu": [ + "arm64" + ], "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": ">=18" + } }, - "node_modules/brace-expansion": { - "version": "1.1.15", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.15.tgz", - "integrity": "sha512-EwOCDEex4quD37XhqM3omwtMoJjr//isUZz1JopUNWms+4Z2ViyM/k1YIRePpoVNnQhENnxtFjLaxNHrT7xIUg==", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "node_modules/@esbuild/sunos-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.12.tgz", + "integrity": "sha512-3wGSCDyuTHQUzt0nV7bocDy72r2lI33QL3gkDNGkod22EsYl04sMf0qLb8luNKTOmgF/eDEDP5BFNwoBKH441w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" } }, - "node_modules/buffer": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", - "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "node_modules/@esbuild/win32-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.12.tgz", + "integrity": "sha512-rMmLrur64A7+DKlnSuwqUdRKyd3UE7oPJZmnljqEptesKM8wx9J8gx5u0+9Pq0fQQW8vqeKebwNXdfOyP+8Bsg==", + "cpu": [ + "arm64" + ], "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.12.tgz", + "integrity": "sha512-HkqnmmBoCbCwxUKKNPBixiWDGCpQGVsrQfJoVGYLPT41XWF8lHuE5N6WhVia2n4o5QK5M4tYr21827fNhi4byQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.12.tgz", + "integrity": "sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" ], + "engines": { + "node": ">=18" + } + }, + "node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.1.13" + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" } }, "node_modules/chalk": { @@ -350,24 +483,6 @@ "node": ">=4" } }, - "node_modules/chownr": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", - "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", - "dev": true - }, - "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==", - "dev": true, - "license": "ISC", - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^7.0.0" - } - }, "node_modules/color-convert": { "version": "1.9.3", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", @@ -381,101 +496,46 @@ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" }, - "node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" - }, - "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==", - "dev": true - }, - "node_modules/debug": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz", - "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", + "node_modules/esbuild": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.12.tgz", + "integrity": "sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg==", "dev": true, + "hasInstallScript": true, "license": "MIT", - "dependencies": { - "ms": "^2.1.3" + "bin": { + "esbuild": "bin/esbuild" }, "engines": { - "node": ">=6.0" + "node": ">=18" }, - "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==", - "dev": true, - "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==", - "dev": true, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/detect-libc": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.1.tgz", - "integrity": "sha512-463v3ZeIrcWtdgIg6vI6XUncguvr2TnGl4SzDXinkt9mSLpBJKXT3mW6xT3VQdDN11+WVs29pgvivTc4Lp8v+w==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/duplexer2": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz", - "integrity": "sha512-asLFVfWWtJ90ZyOUHMqk7/S2w2guQKxUI2itj3d92ADHhxUSbCMGi1f1cBcJ7xM1To+pE/Khbwo1yuNbMEPKeA==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "readable-stream": "^2.0.2" - } - }, - "node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true - }, - "node_modules/end-of-stream": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", - "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", - "dev": true, - "dependencies": { - "once": "^1.4.0" - } - }, - "node_modules/escalade": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", - "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.25.12", + "@esbuild/android-arm": "0.25.12", + "@esbuild/android-arm64": "0.25.12", + "@esbuild/android-x64": "0.25.12", + "@esbuild/darwin-arm64": "0.25.12", + "@esbuild/darwin-x64": "0.25.12", + "@esbuild/freebsd-arm64": "0.25.12", + "@esbuild/freebsd-x64": "0.25.12", + "@esbuild/linux-arm": "0.25.12", + "@esbuild/linux-arm64": "0.25.12", + "@esbuild/linux-ia32": "0.25.12", + "@esbuild/linux-loong64": "0.25.12", + "@esbuild/linux-mips64el": "0.25.12", + "@esbuild/linux-ppc64": "0.25.12", + "@esbuild/linux-riscv64": "0.25.12", + "@esbuild/linux-s390x": "0.25.12", + "@esbuild/linux-x64": "0.25.12", + "@esbuild/netbsd-arm64": "0.25.12", + "@esbuild/netbsd-x64": "0.25.12", + "@esbuild/openbsd-arm64": "0.25.12", + "@esbuild/openbsd-x64": "0.25.12", + "@esbuild/openharmony-arm64": "0.25.12", + "@esbuild/sunos-x64": "0.25.12", + "@esbuild/win32-arm64": "0.25.12", + "@esbuild/win32-ia32": "0.25.12", + "@esbuild/win32-x64": "0.25.12" } }, "node_modules/escape-string-regexp": { @@ -486,101 +546,6 @@ "node": ">=0.8.0" } }, - "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==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/fdir": { - "version": "6.4.4", - "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.4.4.tgz", - "integrity": "sha512-1NZP+GK4GfuAv3PqKvxQRDMjdSRZjnkq7KfhlNrCNNlZ0ygQFpebfrnfnq/W7fpUnAv9aGWmY1zKx7FYL3gwhg==", - "dev": true, - "license": "MIT", - "peerDependencies": { - "picomatch": "^3 || ^4" - }, - "peerDependenciesMeta": { - "picomatch": { - "optional": true - } - } - }, - "node_modules/from2": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", - "integrity": "sha512-OMcX/4IC/uqEPVgGeyfN22LJk6AZrMkRZHxcHBMBvHScDGgwTm2GT2Wkgtocyd3JfZffjj2kYUDXXII0Fk9W0g==", - "dev": true, - "dependencies": { - "inherits": "^2.0.1", - "readable-stream": "^2.0.0" - } - }, - "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==", - "dev": true - }, - "node_modules/fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" - }, - "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/get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true, - "license": "ISC", - "engines": { - "node": "6.* || 8.* || >= 10.*" - } - }, - "node_modules/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==", - "dev": true - }, - "node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/graceful-fs": { - "version": "4.2.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", - "dev": true - }, "node_modules/has-flag": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", @@ -589,1686 +554,860 @@ "node": ">=4" } }, - "node_modules/hasown": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", - "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", - "license": "MIT", + "node_modules/npm": { + "version": "8.19.4", + "resolved": "https://registry.npmjs.org/npm/-/npm-8.19.4.tgz", + "integrity": "sha512-3HANl8i9DKnUA89P4KEgVNN28EjSeDCmvEqbzOAuxCFDzdBZzjUl99zgnGpOUumvW5lvJo2HKcjrsc+tfyv1Hw==", + "bundleDependencies": [ + "@isaacs/string-locale-compare", + "@npmcli/arborist", + "@npmcli/ci-detect", + "@npmcli/config", + "@npmcli/fs", + "@npmcli/map-workspaces", + "@npmcli/package-json", + "@npmcli/run-script", + "abbrev", + "archy", + "cacache", + "chalk", + "chownr", + "cli-columns", + "cli-table3", + "columnify", + "fastest-levenshtein", + "fs-minipass", + "glob", + "graceful-fs", + "hosted-git-info", + "ini", + "init-package-json", + "is-cidr", + "json-parse-even-better-errors", + "libnpmaccess", + "libnpmdiff", + "libnpmexec", + "libnpmfund", + "libnpmhook", + "libnpmorg", + "libnpmpack", + "libnpmpublish", + "libnpmsearch", + "libnpmteam", + "libnpmversion", + "make-fetch-happen", + "minimatch", + "minipass", + "minipass-pipeline", + "mkdirp", + "mkdirp-infer-owner", + "ms", + "node-gyp", + "nopt", + "npm-audit-report", + "npm-install-checks", + "npm-package-arg", + "npm-pick-manifest", + "npm-profile", + "npm-registry-fetch", + "npm-user-validate", + "npmlog", + "opener", + "p-map", + "pacote", + "parse-conflict-json", + "proc-log", + "qrcode-terminal", + "read", + "read-package-json", + "read-package-json-fast", + "readdir-scoped-modules", + "rimraf", + "semver", + "ssri", + "tar", + "text-table", + "tiny-relative-date", + "treeverse", + "validate-npm-package-name", + "which", + "write-file-atomic" + ], "dependencies": { - "function-bind": "^1.1.2" + "@isaacs/string-locale-compare": "^1.1.0", + "@npmcli/arborist": "^5.6.3", + "@npmcli/ci-detect": "^2.0.0", + "@npmcli/config": "^4.2.1", + "@npmcli/fs": "^2.1.0", + "@npmcli/map-workspaces": "^2.0.3", + "@npmcli/package-json": "^2.0.0", + "@npmcli/run-script": "^4.2.1", + "abbrev": "~1.1.1", + "archy": "~1.0.0", + "cacache": "^16.1.3", + "chalk": "^4.1.2", + "chownr": "^2.0.0", + "cli-columns": "^4.0.0", + "cli-table3": "^0.6.2", + "columnify": "^1.6.0", + "fastest-levenshtein": "^1.0.12", + "fs-minipass": "^2.1.0", + "glob": "^8.0.1", + "graceful-fs": "^4.2.10", + "hosted-git-info": "^5.2.1", + "ini": "^3.0.1", + "init-package-json": "^3.0.2", + "is-cidr": "^4.0.2", + "json-parse-even-better-errors": "^2.3.1", + "libnpmaccess": "^6.0.4", + "libnpmdiff": "^4.0.5", + "libnpmexec": "^4.0.14", + "libnpmfund": "^3.0.5", + "libnpmhook": "^8.0.4", + "libnpmorg": "^4.0.4", + "libnpmpack": "^4.1.3", + "libnpmpublish": "^6.0.5", + "libnpmsearch": "^5.0.4", + "libnpmteam": "^4.0.4", + "libnpmversion": "^3.0.7", + "make-fetch-happen": "^10.2.0", + "minimatch": "^5.1.0", + "minipass": "^3.1.6", + "minipass-pipeline": "^1.2.4", + "mkdirp": "^1.0.4", + "mkdirp-infer-owner": "^2.0.0", + "ms": "^2.1.2", + "node-gyp": "^9.1.0", + "nopt": "^6.0.0", + "npm-audit-report": "^3.0.0", + "npm-install-checks": "^5.0.0", + "npm-package-arg": "^9.1.0", + "npm-pick-manifest": "^7.0.2", + "npm-profile": "^6.2.0", + "npm-registry-fetch": "^13.3.1", + "npm-user-validate": "^1.0.1", + "npmlog": "^6.0.2", + "opener": "^1.5.2", + "p-map": "^4.0.0", + "pacote": "^13.6.2", + "parse-conflict-json": "^2.0.2", + "proc-log": "^2.0.1", + "qrcode-terminal": "^0.12.0", + "read": "~1.0.7", + "read-package-json": "^5.0.2", + "read-package-json-fast": "^2.0.3", + "readdir-scoped-modules": "^1.1.0", + "rimraf": "^3.0.2", + "semver": "^7.3.7", + "ssri": "^9.0.1", + "tar": "^6.1.11", + "text-table": "~0.2.0", + "tiny-relative-date": "^1.3.0", + "treeverse": "^2.0.0", + "validate-npm-package-name": "^4.0.0", + "which": "^2.0.2", + "write-file-atomic": "^4.0.1" + }, + "bin": { + "npm": "bin/npm-cli.js", + "npx": "bin/npx-cli.js" }, "engines": { - "node": ">= 0.4" + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, - "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==", - "dev": true, - "license": "MIT", - "dependencies": { - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/ieee754": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" - }, - "node_modules/ini": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", - "dev": true - }, - "node_modules/interpret": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", - "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==", - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/into-stream": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/into-stream/-/into-stream-6.0.0.tgz", - "integrity": "sha512-XHbaOAvP+uFKUFsOgoNPRjLkwB+I22JFPFe5OjTkQ0nwgj6+pSjb4NmB6VMxaPshLiOf+zcpOCBQuLwC1KHhZA==", - "dev": true, - "dependencies": { - "from2": "^2.3.0", - "p-is-promise": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "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-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", - "dev": true - }, - "node_modules/jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "dev": true, - "dependencies": { - "universalify": "^2.0.0" - }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "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==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/minimatch": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", - "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/minimist": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", - "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/minipass": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", - "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=16 || 14 >=14.17" - } - }, - "node_modules/minizlib": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-3.1.0.tgz", - "integrity": "sha512-KZxYo1BUkWD2TVFLr0MQoM8vUUigWD3LlD83a/75BqC+4qE0Hb1Vo5v1FgcfaNXvfXzr+5EhQ6ing/CaBijTlw==", - "dev": true, - "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==", - "dev": true - }, - "node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true, - "license": "MIT" - }, - "node_modules/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==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "dependencies": { - "once": "^1.4.0", - "readable-stream": "^3.6.0" - } - }, - "node_modules/multistream/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==", - "dev": true, - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/napi-build-utils": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-1.0.2.tgz", - "integrity": "sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==", - "dev": true - }, - "node_modules/node-abi": { - "version": "3.40.0", - "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.40.0.tgz", - "integrity": "sha512-zNy02qivjjRosswoYmPi8hIKJRr8MpQyeKT6qlcq/OnOgA3Rhoae+IYOqsM9V5+JnHWmxKnWOT2GxvtqdtOCXA==", - "dev": true, - "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==", - "dev": true, - "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-int64": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", - "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==", - "dev": true, - "license": "MIT" - }, - "node_modules/npm": { - "version": "8.19.4", - "resolved": "https://registry.npmjs.org/npm/-/npm-8.19.4.tgz", - "integrity": "sha512-3HANl8i9DKnUA89P4KEgVNN28EjSeDCmvEqbzOAuxCFDzdBZzjUl99zgnGpOUumvW5lvJo2HKcjrsc+tfyv1Hw==", - "bundleDependencies": [ - "@isaacs/string-locale-compare", - "@npmcli/arborist", - "@npmcli/ci-detect", - "@npmcli/config", - "@npmcli/fs", - "@npmcli/map-workspaces", - "@npmcli/package-json", - "@npmcli/run-script", - "abbrev", - "archy", - "cacache", - "chalk", - "chownr", - "cli-columns", - "cli-table3", - "columnify", - "fastest-levenshtein", - "fs-minipass", - "glob", - "graceful-fs", - "hosted-git-info", - "ini", - "init-package-json", - "is-cidr", - "json-parse-even-better-errors", - "libnpmaccess", - "libnpmdiff", - "libnpmexec", - "libnpmfund", - "libnpmhook", - "libnpmorg", - "libnpmpack", - "libnpmpublish", - "libnpmsearch", - "libnpmteam", - "libnpmversion", - "make-fetch-happen", - "minimatch", - "minipass", - "minipass-pipeline", - "mkdirp", - "mkdirp-infer-owner", - "ms", - "node-gyp", - "nopt", - "npm-audit-report", - "npm-install-checks", - "npm-package-arg", - "npm-pick-manifest", - "npm-profile", - "npm-registry-fetch", - "npm-user-validate", - "npmlog", - "opener", - "p-map", - "pacote", - "parse-conflict-json", - "proc-log", - "qrcode-terminal", - "read", - "read-package-json", - "read-package-json-fast", - "readdir-scoped-modules", - "rimraf", - "semver", - "ssri", - "tar", - "text-table", - "tiny-relative-date", - "treeverse", - "validate-npm-package-name", - "which", - "write-file-atomic" - ], - "dependencies": { - "@isaacs/string-locale-compare": "^1.1.0", - "@npmcli/arborist": "^5.6.3", - "@npmcli/ci-detect": "^2.0.0", - "@npmcli/config": "^4.2.1", - "@npmcli/fs": "^2.1.0", - "@npmcli/map-workspaces": "^2.0.3", - "@npmcli/package-json": "^2.0.0", - "@npmcli/run-script": "^4.2.1", - "abbrev": "~1.1.1", - "archy": "~1.0.0", - "cacache": "^16.1.3", - "chalk": "^4.1.2", - "chownr": "^2.0.0", - "cli-columns": "^4.0.0", - "cli-table3": "^0.6.2", - "columnify": "^1.6.0", - "fastest-levenshtein": "^1.0.12", - "fs-minipass": "^2.1.0", - "glob": "^8.0.1", - "graceful-fs": "^4.2.10", - "hosted-git-info": "^5.2.1", - "ini": "^3.0.1", - "init-package-json": "^3.0.2", - "is-cidr": "^4.0.2", - "json-parse-even-better-errors": "^2.3.1", - "libnpmaccess": "^6.0.4", - "libnpmdiff": "^4.0.5", - "libnpmexec": "^4.0.14", - "libnpmfund": "^3.0.5", - "libnpmhook": "^8.0.4", - "libnpmorg": "^4.0.4", - "libnpmpack": "^4.1.3", - "libnpmpublish": "^6.0.5", - "libnpmsearch": "^5.0.4", - "libnpmteam": "^4.0.4", - "libnpmversion": "^3.0.7", - "make-fetch-happen": "^10.2.0", - "minimatch": "^5.1.0", - "minipass": "^3.1.6", - "minipass-pipeline": "^1.2.4", - "mkdirp": "^1.0.4", - "mkdirp-infer-owner": "^2.0.0", - "ms": "^2.1.2", - "node-gyp": "^9.1.0", - "nopt": "^6.0.0", - "npm-audit-report": "^3.0.0", - "npm-install-checks": "^5.0.0", - "npm-package-arg": "^9.1.0", - "npm-pick-manifest": "^7.0.2", - "npm-profile": "^6.2.0", - "npm-registry-fetch": "^13.3.1", - "npm-user-validate": "^1.0.1", - "npmlog": "^6.0.2", - "opener": "^1.5.2", - "p-map": "^4.0.0", - "pacote": "^13.6.2", - "parse-conflict-json": "^2.0.2", - "proc-log": "^2.0.1", - "qrcode-terminal": "^0.12.0", - "read": "~1.0.7", - "read-package-json": "^5.0.2", - "read-package-json-fast": "^2.0.3", - "readdir-scoped-modules": "^1.1.0", - "rimraf": "^3.0.2", - "semver": "^7.3.7", - "ssri": "^9.0.1", - "tar": "^6.1.11", - "text-table": "~0.2.0", - "tiny-relative-date": "^1.3.0", - "treeverse": "^2.0.0", - "validate-npm-package-name": "^4.0.0", - "which": "^2.0.2", - "write-file-atomic": "^4.0.1" - }, - "bin": { - "npm": "bin/npm-cli.js", - "npx": "bin/npx-cli.js" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/@colors/colors": { - "version": "1.5.0", - "inBundle": true, - "license": "MIT", - "optional": true, - "engines": { - "node": ">=0.1.90" - } - }, - "node_modules/npm/node_modules/@gar/promisify": { - "version": "1.1.3", - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/@isaacs/string-locale-compare": { - "version": "1.1.0", - "inBundle": true, - "license": "ISC" - }, - "node_modules/npm/node_modules/@npmcli/arborist": { - "version": "5.6.3", - "inBundle": true, - "license": "ISC", - "dependencies": { - "@isaacs/string-locale-compare": "^1.1.0", - "@npmcli/installed-package-contents": "^1.0.7", - "@npmcli/map-workspaces": "^2.0.3", - "@npmcli/metavuln-calculator": "^3.0.1", - "@npmcli/move-file": "^2.0.0", - "@npmcli/name-from-folder": "^1.0.1", - "@npmcli/node-gyp": "^2.0.0", - "@npmcli/package-json": "^2.0.0", - "@npmcli/query": "^1.2.0", - "@npmcli/run-script": "^4.1.3", - "bin-links": "^3.0.3", - "cacache": "^16.1.3", - "common-ancestor-path": "^1.0.1", - "hosted-git-info": "^5.2.1", - "json-parse-even-better-errors": "^2.3.1", - "json-stringify-nice": "^1.1.4", - "minimatch": "^5.1.0", - "mkdirp": "^1.0.4", - "mkdirp-infer-owner": "^2.0.0", - "nopt": "^6.0.0", - "npm-install-checks": "^5.0.0", - "npm-package-arg": "^9.0.0", - "npm-pick-manifest": "^7.0.2", - "npm-registry-fetch": "^13.0.0", - "npmlog": "^6.0.2", - "pacote": "^13.6.1", - "parse-conflict-json": "^2.0.1", - "proc-log": "^2.0.0", - "promise-all-reject-late": "^1.0.0", - "promise-call-limit": "^1.0.1", - "read-package-json-fast": "^2.0.2", - "readdir-scoped-modules": "^1.1.0", - "rimraf": "^3.0.2", - "semver": "^7.3.7", - "ssri": "^9.0.0", - "treeverse": "^2.0.0", - "walk-up-path": "^1.0.0" - }, - "bin": { - "arborist": "bin/index.js" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/@npmcli/ci-detect": { - "version": "2.0.0", - "inBundle": true, - "license": "ISC", - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16" - } - }, - "node_modules/npm/node_modules/@npmcli/config": { - "version": "4.2.2", - "inBundle": true, - "license": "ISC", - "dependencies": { - "@npmcli/map-workspaces": "^2.0.2", - "ini": "^3.0.0", - "mkdirp-infer-owner": "^2.0.0", - "nopt": "^6.0.0", - "proc-log": "^2.0.0", - "read-package-json-fast": "^2.0.3", - "semver": "^7.3.5", - "walk-up-path": "^1.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/@npmcli/disparity-colors": { - "version": "2.0.0", - "inBundle": true, - "license": "ISC", - "dependencies": { - "ansi-styles": "^4.3.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/@npmcli/fs": { - "version": "2.1.2", - "inBundle": true, - "license": "ISC", - "dependencies": { - "@gar/promisify": "^1.1.3", - "semver": "^7.3.5" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/@npmcli/git": { - "version": "3.0.2", - "inBundle": true, - "license": "ISC", - "dependencies": { - "@npmcli/promise-spawn": "^3.0.0", - "lru-cache": "^7.4.4", - "mkdirp": "^1.0.4", - "npm-pick-manifest": "^7.0.0", - "proc-log": "^2.0.0", - "promise-inflight": "^1.0.1", - "promise-retry": "^2.0.1", - "semver": "^7.3.5", - "which": "^2.0.2" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/@npmcli/installed-package-contents": { - "version": "1.0.7", - "inBundle": true, - "license": "ISC", - "dependencies": { - "npm-bundled": "^1.1.1", - "npm-normalize-package-bin": "^1.0.1" - }, - "bin": { - "installed-package-contents": "index.js" - }, - "engines": { - "node": ">= 10" - } - }, - "node_modules/npm/node_modules/@npmcli/installed-package-contents/node_modules/npm-bundled": { - "version": "1.1.2", - "inBundle": true, - "license": "ISC", - "dependencies": { - "npm-normalize-package-bin": "^1.0.1" - } - }, - "node_modules/npm/node_modules/@npmcli/map-workspaces": { - "version": "2.0.4", - "inBundle": true, - "license": "ISC", - "dependencies": { - "@npmcli/name-from-folder": "^1.0.1", - "glob": "^8.0.1", - "minimatch": "^5.0.1", - "read-package-json-fast": "^2.0.3" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/@npmcli/metavuln-calculator": { - "version": "3.1.1", - "inBundle": true, - "license": "ISC", - "dependencies": { - "cacache": "^16.0.0", - "json-parse-even-better-errors": "^2.3.1", - "pacote": "^13.0.3", - "semver": "^7.3.5" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/@npmcli/move-file": { - "version": "2.0.1", - "inBundle": true, - "license": "MIT", - "dependencies": { - "mkdirp": "^1.0.4", - "rimraf": "^3.0.2" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/@npmcli/name-from-folder": { - "version": "1.0.1", - "inBundle": true, - "license": "ISC" - }, - "node_modules/npm/node_modules/@npmcli/node-gyp": { - "version": "2.0.0", - "inBundle": true, - "license": "ISC", - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/@npmcli/package-json": { - "version": "2.0.0", - "inBundle": true, - "license": "ISC", - "dependencies": { - "json-parse-even-better-errors": "^2.3.1" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/@npmcli/promise-spawn": { - "version": "3.0.0", - "inBundle": true, - "license": "ISC", - "dependencies": { - "infer-owner": "^1.0.4" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/@npmcli/query": { - "version": "1.2.0", - "inBundle": true, - "license": "ISC", - "dependencies": { - "npm-package-arg": "^9.1.0", - "postcss-selector-parser": "^6.0.10", - "semver": "^7.3.7" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/@npmcli/run-script": { - "version": "4.2.1", - "inBundle": true, - "license": "ISC", - "dependencies": { - "@npmcli/node-gyp": "^2.0.0", - "@npmcli/promise-spawn": "^3.0.0", - "node-gyp": "^9.0.0", - "read-package-json-fast": "^2.0.3", - "which": "^2.0.2" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/@tootallnate/once": { - "version": "2.0.0", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">= 10" - } - }, - "node_modules/npm/node_modules/abbrev": { - "version": "1.1.1", - "inBundle": true, - "license": "ISC" - }, - "node_modules/npm/node_modules/agent-base": { - "version": "6.0.2", - "inBundle": true, - "license": "MIT", - "dependencies": { - "debug": "4" - }, - "engines": { - "node": ">= 6.0.0" - } - }, - "node_modules/npm/node_modules/agentkeepalive": { - "version": "4.2.1", - "inBundle": true, - "license": "MIT", - "dependencies": { - "debug": "^4.1.0", - "depd": "^1.1.2", - "humanize-ms": "^1.2.1" - }, - "engines": { - "node": ">= 8.0.0" - } - }, - "node_modules/npm/node_modules/aggregate-error": { - "version": "3.1.0", - "inBundle": true, - "license": "MIT", - "dependencies": { - "clean-stack": "^2.0.0", - "indent-string": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/ansi-regex": { - "version": "5.0.1", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/ansi-styles": { - "version": "4.3.0", - "inBundle": true, - "license": "MIT", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/npm/node_modules/aproba": { - "version": "2.0.0", - "inBundle": true, - "license": "ISC" - }, - "node_modules/npm/node_modules/archy": { - "version": "1.0.0", - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/are-we-there-yet": { - "version": "3.0.1", - "inBundle": true, - "license": "ISC", - "dependencies": { - "delegates": "^1.0.0", - "readable-stream": "^3.6.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/asap": { - "version": "2.0.6", - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/balanced-match": { - "version": "1.0.2", - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/bin-links": { - "version": "3.0.3", - "inBundle": true, - "license": "ISC", - "dependencies": { - "cmd-shim": "^5.0.0", - "mkdirp-infer-owner": "^2.0.0", - "npm-normalize-package-bin": "^2.0.0", - "read-cmd-shim": "^3.0.0", - "rimraf": "^3.0.0", - "write-file-atomic": "^4.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/bin-links/node_modules/npm-normalize-package-bin": { - "version": "2.0.0", - "inBundle": true, - "license": "ISC", - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/binary-extensions": { - "version": "2.2.0", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/brace-expansion": { - "version": "2.0.1", - "inBundle": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/npm/node_modules/builtins": { - "version": "5.0.1", - "inBundle": true, - "license": "MIT", - "dependencies": { - "semver": "^7.0.0" - } - }, - "node_modules/npm/node_modules/cacache": { - "version": "16.1.3", - "inBundle": true, - "license": "ISC", - "dependencies": { - "@npmcli/fs": "^2.1.0", - "@npmcli/move-file": "^2.0.0", - "chownr": "^2.0.0", - "fs-minipass": "^2.1.0", - "glob": "^8.0.1", - "infer-owner": "^1.0.4", - "lru-cache": "^7.7.1", - "minipass": "^3.1.6", - "minipass-collect": "^1.0.2", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.4", - "mkdirp": "^1.0.4", - "p-map": "^4.0.0", - "promise-inflight": "^1.0.1", - "rimraf": "^3.0.2", - "ssri": "^9.0.0", - "tar": "^6.1.11", - "unique-filename": "^2.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/chalk": { - "version": "4.1.2", - "inBundle": 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/npm/node_modules/chownr": { - "version": "2.0.0", - "inBundle": true, - "license": "ISC", - "engines": { - "node": ">=10" - } - }, - "node_modules/npm/node_modules/cidr-regex": { - "version": "3.1.1", - "inBundle": true, - "license": "BSD-2-Clause", - "dependencies": { - "ip-regex": "^4.1.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/npm/node_modules/clean-stack": { - "version": "2.2.0", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/npm/node_modules/cli-columns": { - "version": "4.0.0", - "inBundle": true, - "license": "MIT", - "dependencies": { - "string-width": "^4.2.3", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">= 10" - } - }, - "node_modules/npm/node_modules/cli-table3": { - "version": "0.6.2", - "inBundle": true, - "license": "MIT", - "dependencies": { - "string-width": "^4.2.0" - }, - "engines": { - "node": "10.* || >= 12.*" - }, - "optionalDependencies": { - "@colors/colors": "1.5.0" - } - }, - "node_modules/npm/node_modules/clone": { - "version": "1.0.4", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=0.8" - } - }, - "node_modules/npm/node_modules/cmd-shim": { - "version": "5.0.0", - "inBundle": true, - "license": "ISC", - "dependencies": { - "mkdirp-infer-owner": "^2.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/color-convert": { - "version": "2.0.1", + "node_modules/npm/node_modules/@colors/colors": { + "version": "1.5.0", "inBundle": true, "license": "MIT", - "dependencies": { - "color-name": "~1.1.4" - }, + "optional": true, "engines": { - "node": ">=7.0.0" + "node": ">=0.1.90" } }, - "node_modules/npm/node_modules/color-name": { - "version": "1.1.4", - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/color-support": { + "node_modules/npm/node_modules/@gar/promisify": { "version": "1.1.3", "inBundle": true, - "license": "ISC", - "bin": { - "color-support": "bin.js" - } - }, - "node_modules/npm/node_modules/columnify": { - "version": "1.6.0", - "inBundle": true, - "license": "MIT", - "dependencies": { - "strip-ansi": "^6.0.1", - "wcwidth": "^1.0.0" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/npm/node_modules/common-ancestor-path": { - "version": "1.0.1", - "inBundle": true, - "license": "ISC" - }, - "node_modules/npm/node_modules/concat-map": { - "version": "0.0.1", - "inBundle": true, "license": "MIT" }, - "node_modules/npm/node_modules/console-control-strings": { + "node_modules/npm/node_modules/@isaacs/string-locale-compare": { "version": "1.1.0", "inBundle": true, "license": "ISC" }, - "node_modules/npm/node_modules/cssesc": { - "version": "3.0.0", - "inBundle": true, - "license": "MIT", - "bin": { - "cssesc": "bin/cssesc" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/npm/node_modules/debug": { - "version": "4.3.4", - "inBundle": true, - "license": "MIT", - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/npm/node_modules/debug/node_modules/ms": { - "version": "2.1.2", - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/debuglog": { - "version": "1.0.1", - "inBundle": true, - "license": "MIT", - "engines": { - "node": "*" - } - }, - "node_modules/npm/node_modules/defaults": { - "version": "1.0.3", - "inBundle": true, - "license": "MIT", - "dependencies": { - "clone": "^1.0.2" - } - }, - "node_modules/npm/node_modules/delegates": { - "version": "1.0.0", - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/depd": { - "version": "1.1.2", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/npm/node_modules/dezalgo": { - "version": "1.0.4", + "node_modules/npm/node_modules/@npmcli/arborist": { + "version": "5.6.3", "inBundle": true, "license": "ISC", "dependencies": { - "asap": "^2.0.0", - "wrappy": "1" - } - }, - "node_modules/npm/node_modules/diff": { - "version": "5.1.0", - "inBundle": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.3.1" - } - }, - "node_modules/npm/node_modules/emoji-regex": { - "version": "8.0.0", - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/encoding": { - "version": "0.1.13", - "inBundle": true, - "license": "MIT", - "optional": true, - "dependencies": { - "iconv-lite": "^0.6.2" + "@isaacs/string-locale-compare": "^1.1.0", + "@npmcli/installed-package-contents": "^1.0.7", + "@npmcli/map-workspaces": "^2.0.3", + "@npmcli/metavuln-calculator": "^3.0.1", + "@npmcli/move-file": "^2.0.0", + "@npmcli/name-from-folder": "^1.0.1", + "@npmcli/node-gyp": "^2.0.0", + "@npmcli/package-json": "^2.0.0", + "@npmcli/query": "^1.2.0", + "@npmcli/run-script": "^4.1.3", + "bin-links": "^3.0.3", + "cacache": "^16.1.3", + "common-ancestor-path": "^1.0.1", + "hosted-git-info": "^5.2.1", + "json-parse-even-better-errors": "^2.3.1", + "json-stringify-nice": "^1.1.4", + "minimatch": "^5.1.0", + "mkdirp": "^1.0.4", + "mkdirp-infer-owner": "^2.0.0", + "nopt": "^6.0.0", + "npm-install-checks": "^5.0.0", + "npm-package-arg": "^9.0.0", + "npm-pick-manifest": "^7.0.2", + "npm-registry-fetch": "^13.0.0", + "npmlog": "^6.0.2", + "pacote": "^13.6.1", + "parse-conflict-json": "^2.0.1", + "proc-log": "^2.0.0", + "promise-all-reject-late": "^1.0.0", + "promise-call-limit": "^1.0.1", + "read-package-json-fast": "^2.0.2", + "readdir-scoped-modules": "^1.1.0", + "rimraf": "^3.0.2", + "semver": "^7.3.7", + "ssri": "^9.0.0", + "treeverse": "^2.0.0", + "walk-up-path": "^1.0.0" + }, + "bin": { + "arborist": "bin/index.js" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, - "node_modules/npm/node_modules/env-paths": { - "version": "2.2.1", + "node_modules/npm/node_modules/@npmcli/ci-detect": { + "version": "2.0.0", "inBundle": true, - "license": "MIT", + "license": "ISC", "engines": { - "node": ">=6" + "node": "^12.13.0 || ^14.15.0 || >=16" } }, - "node_modules/npm/node_modules/err-code": { - "version": "2.0.3", - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/fastest-levenshtein": { - "version": "1.0.12", - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/fs-minipass": { - "version": "2.1.0", + "node_modules/npm/node_modules/@npmcli/config": { + "version": "4.2.2", "inBundle": true, "license": "ISC", "dependencies": { - "minipass": "^3.0.0" + "@npmcli/map-workspaces": "^2.0.2", + "ini": "^3.0.0", + "mkdirp-infer-owner": "^2.0.0", + "nopt": "^6.0.0", + "proc-log": "^2.0.0", + "read-package-json-fast": "^2.0.3", + "semver": "^7.3.5", + "walk-up-path": "^1.0.0" }, "engines": { - "node": ">= 8" + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, - "node_modules/npm/node_modules/fs.realpath": { - "version": "1.0.0", - "inBundle": true, - "license": "ISC" - }, - "node_modules/npm/node_modules/function-bind": { - "version": "1.1.1", - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/gauge": { - "version": "4.0.4", + "node_modules/npm/node_modules/@npmcli/disparity-colors": { + "version": "2.0.0", "inBundle": true, "license": "ISC", "dependencies": { - "aproba": "^1.0.3 || ^2.0.0", - "color-support": "^1.1.3", - "console-control-strings": "^1.1.0", - "has-unicode": "^2.0.1", - "signal-exit": "^3.0.7", - "string-width": "^4.2.3", - "strip-ansi": "^6.0.1", - "wide-align": "^1.1.5" + "ansi-styles": "^4.3.0" }, "engines": { "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, - "node_modules/npm/node_modules/glob": { - "version": "8.0.3", + "node_modules/npm/node_modules/@npmcli/fs": { + "version": "2.1.2", "inBundle": true, "license": "ISC", "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^5.0.1", - "once": "^1.3.0" + "@gar/promisify": "^1.1.3", + "semver": "^7.3.5" }, "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, - "node_modules/npm/node_modules/graceful-fs": { - "version": "4.2.10", - "inBundle": true, - "license": "ISC" - }, - "node_modules/npm/node_modules/has": { - "version": "1.0.3", + "node_modules/npm/node_modules/@npmcli/git": { + "version": "3.0.2", "inBundle": true, - "license": "MIT", + "license": "ISC", "dependencies": { - "function-bind": "^1.1.1" + "@npmcli/promise-spawn": "^3.0.0", + "lru-cache": "^7.4.4", + "mkdirp": "^1.0.4", + "npm-pick-manifest": "^7.0.0", + "proc-log": "^2.0.0", + "promise-inflight": "^1.0.1", + "promise-retry": "^2.0.1", + "semver": "^7.3.5", + "which": "^2.0.2" }, "engines": { - "node": ">= 0.4.0" + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, - "node_modules/npm/node_modules/has-flag": { - "version": "4.0.0", + "node_modules/npm/node_modules/@npmcli/installed-package-contents": { + "version": "1.0.7", "inBundle": true, - "license": "MIT", + "license": "ISC", + "dependencies": { + "npm-bundled": "^1.1.1", + "npm-normalize-package-bin": "^1.0.1" + }, + "bin": { + "installed-package-contents": "index.js" + }, "engines": { - "node": ">=8" + "node": ">= 10" } }, - "node_modules/npm/node_modules/has-unicode": { - "version": "2.0.1", + "node_modules/npm/node_modules/@npmcli/installed-package-contents/node_modules/npm-bundled": { + "version": "1.1.2", "inBundle": true, - "license": "ISC" + "license": "ISC", + "dependencies": { + "npm-normalize-package-bin": "^1.0.1" + } }, - "node_modules/npm/node_modules/hosted-git-info": { - "version": "5.2.1", + "node_modules/npm/node_modules/@npmcli/map-workspaces": { + "version": "2.0.4", "inBundle": true, "license": "ISC", "dependencies": { - "lru-cache": "^7.5.1" + "@npmcli/name-from-folder": "^1.0.1", + "glob": "^8.0.1", + "minimatch": "^5.0.1", + "read-package-json-fast": "^2.0.3" }, "engines": { "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, - "node_modules/npm/node_modules/http-cache-semantics": { - "version": "4.1.1", - "inBundle": true, - "license": "BSD-2-Clause" - }, - "node_modules/npm/node_modules/http-proxy-agent": { - "version": "5.0.0", + "node_modules/npm/node_modules/@npmcli/metavuln-calculator": { + "version": "3.1.1", "inBundle": true, - "license": "MIT", + "license": "ISC", "dependencies": { - "@tootallnate/once": "2", - "agent-base": "6", - "debug": "4" + "cacache": "^16.0.0", + "json-parse-even-better-errors": "^2.3.1", + "pacote": "^13.0.3", + "semver": "^7.3.5" }, "engines": { - "node": ">= 6" + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, - "node_modules/npm/node_modules/https-proxy-agent": { - "version": "5.0.1", + "node_modules/npm/node_modules/@npmcli/move-file": { + "version": "2.0.1", "inBundle": true, "license": "MIT", "dependencies": { - "agent-base": "6", - "debug": "4" + "mkdirp": "^1.0.4", + "rimraf": "^3.0.2" }, "engines": { - "node": ">= 6" + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, - "node_modules/npm/node_modules/humanize-ms": { - "version": "1.2.1", + "node_modules/npm/node_modules/@npmcli/name-from-folder": { + "version": "1.0.1", "inBundle": true, - "license": "MIT", - "dependencies": { - "ms": "^2.0.0" - } + "license": "ISC" }, - "node_modules/npm/node_modules/iconv-lite": { - "version": "0.6.3", + "node_modules/npm/node_modules/@npmcli/node-gyp": { + "version": "2.0.0", "inBundle": true, - "license": "MIT", - "optional": true, - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - }, + "license": "ISC", "engines": { - "node": ">=0.10.0" + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, - "node_modules/npm/node_modules/ignore-walk": { - "version": "5.0.1", + "node_modules/npm/node_modules/@npmcli/package-json": { + "version": "2.0.0", "inBundle": true, "license": "ISC", "dependencies": { - "minimatch": "^5.0.1" + "json-parse-even-better-errors": "^2.3.1" }, "engines": { "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, - "node_modules/npm/node_modules/imurmurhash": { - "version": "0.1.4", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=0.8.19" - } - }, - "node_modules/npm/node_modules/indent-string": { - "version": "4.0.0", + "node_modules/npm/node_modules/@npmcli/promise-spawn": { + "version": "3.0.0", "inBundle": true, - "license": "MIT", + "license": "ISC", + "dependencies": { + "infer-owner": "^1.0.4" + }, "engines": { - "node": ">=8" + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, - "node_modules/npm/node_modules/infer-owner": { - "version": "1.0.4", - "inBundle": true, - "license": "ISC" - }, - "node_modules/npm/node_modules/inflight": { - "version": "1.0.6", + "node_modules/npm/node_modules/@npmcli/query": { + "version": "1.2.0", "inBundle": true, "license": "ISC", "dependencies": { - "once": "^1.3.0", - "wrappy": "1" + "npm-package-arg": "^9.1.0", + "postcss-selector-parser": "^6.0.10", + "semver": "^7.3.7" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, - "node_modules/npm/node_modules/inherits": { - "version": "2.0.4", - "inBundle": true, - "license": "ISC" - }, - "node_modules/npm/node_modules/ini": { - "version": "3.0.1", + "node_modules/npm/node_modules/@npmcli/run-script": { + "version": "4.2.1", "inBundle": true, "license": "ISC", + "dependencies": { + "@npmcli/node-gyp": "^2.0.0", + "@npmcli/promise-spawn": "^3.0.0", + "node-gyp": "^9.0.0", + "read-package-json-fast": "^2.0.3", + "which": "^2.0.2" + }, "engines": { "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, - "node_modules/npm/node_modules/init-package-json": { - "version": "3.0.2", + "node_modules/npm/node_modules/@tootallnate/once": { + "version": "2.0.0", "inBundle": true, - "license": "ISC", - "dependencies": { - "npm-package-arg": "^9.0.1", - "promzard": "^0.3.0", - "read": "^1.0.7", - "read-package-json": "^5.0.0", - "semver": "^7.3.5", - "validate-npm-package-license": "^3.0.4", - "validate-npm-package-name": "^4.0.0" - }, + "license": "MIT", "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": ">= 10" } }, - "node_modules/npm/node_modules/ip": { - "version": "2.0.0", + "node_modules/npm/node_modules/abbrev": { + "version": "1.1.1", "inBundle": true, - "license": "MIT" + "license": "ISC" }, - "node_modules/npm/node_modules/ip-regex": { - "version": "4.3.0", + "node_modules/npm/node_modules/agent-base": { + "version": "6.0.2", "inBundle": true, "license": "MIT", + "dependencies": { + "debug": "4" + }, "engines": { - "node": ">=8" + "node": ">= 6.0.0" } }, - "node_modules/npm/node_modules/is-cidr": { - "version": "4.0.2", + "node_modules/npm/node_modules/agentkeepalive": { + "version": "4.2.1", "inBundle": true, - "license": "BSD-2-Clause", + "license": "MIT", "dependencies": { - "cidr-regex": "^3.1.1" + "debug": "^4.1.0", + "depd": "^1.1.2", + "humanize-ms": "^1.2.1" }, "engines": { - "node": ">=10" + "node": ">= 8.0.0" } }, - "node_modules/npm/node_modules/is-core-module": { - "version": "2.10.0", + "node_modules/npm/node_modules/aggregate-error": { + "version": "3.1.0", "inBundle": true, "license": "MIT", "dependencies": { - "has": "^1.0.3" + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "engines": { + "node": ">=8" } }, - "node_modules/npm/node_modules/is-fullwidth-code-point": { - "version": "3.0.0", + "node_modules/npm/node_modules/ansi-regex": { + "version": "5.0.1", "inBundle": true, "license": "MIT", "engines": { "node": ">=8" } }, - "node_modules/npm/node_modules/is-lambda": { - "version": "1.0.1", + "node_modules/npm/node_modules/ansi-styles": { + "version": "4.3.0", "inBundle": true, - "license": "MIT" + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } }, - "node_modules/npm/node_modules/isexe": { + "node_modules/npm/node_modules/aproba": { "version": "2.0.0", "inBundle": true, "license": "ISC" }, - "node_modules/npm/node_modules/json-parse-even-better-errors": { - "version": "2.3.1", + "node_modules/npm/node_modules/archy": { + "version": "1.0.0", "inBundle": true, "license": "MIT" }, - "node_modules/npm/node_modules/json-stringify-nice": { - "version": "1.1.4", + "node_modules/npm/node_modules/are-we-there-yet": { + "version": "3.0.1", "inBundle": true, "license": "ISC", - "funding": { - "url": "https://github.com/sponsors/isaacs" + "dependencies": { + "delegates": "^1.0.0", + "readable-stream": "^3.6.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, - "node_modules/npm/node_modules/jsonparse": { - "version": "1.3.1", - "engines": [ - "node >= 0.2.0" - ], - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/just-diff": { - "version": "5.1.1", + "node_modules/npm/node_modules/asap": { + "version": "2.0.6", "inBundle": true, "license": "MIT" }, - "node_modules/npm/node_modules/just-diff-apply": { - "version": "5.4.1", + "node_modules/npm/node_modules/balanced-match": { + "version": "1.0.2", "inBundle": true, "license": "MIT" }, - "node_modules/npm/node_modules/libnpmaccess": { - "version": "6.0.4", + "node_modules/npm/node_modules/bin-links": { + "version": "3.0.3", "inBundle": true, "license": "ISC", "dependencies": { - "aproba": "^2.0.0", - "minipass": "^3.1.1", - "npm-package-arg": "^9.0.1", - "npm-registry-fetch": "^13.0.0" + "cmd-shim": "^5.0.0", + "mkdirp-infer-owner": "^2.0.0", + "npm-normalize-package-bin": "^2.0.0", + "read-cmd-shim": "^3.0.0", + "rimraf": "^3.0.0", + "write-file-atomic": "^4.0.0" }, "engines": { "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, - "node_modules/npm/node_modules/libnpmdiff": { - "version": "4.0.5", + "node_modules/npm/node_modules/bin-links/node_modules/npm-normalize-package-bin": { + "version": "2.0.0", "inBundle": true, "license": "ISC", - "dependencies": { - "@npmcli/disparity-colors": "^2.0.0", - "@npmcli/installed-package-contents": "^1.0.7", - "binary-extensions": "^2.2.0", - "diff": "^5.1.0", - "minimatch": "^5.0.1", - "npm-package-arg": "^9.0.1", - "pacote": "^13.6.1", - "tar": "^6.1.0" - }, "engines": { "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, - "node_modules/npm/node_modules/libnpmexec": { - "version": "4.0.14", + "node_modules/npm/node_modules/binary-extensions": { + "version": "2.2.0", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/npm/node_modules/brace-expansion": { + "version": "2.0.1", + "inBundle": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/npm/node_modules/builtins": { + "version": "5.0.1", + "inBundle": true, + "license": "MIT", + "dependencies": { + "semver": "^7.0.0" + } + }, + "node_modules/npm/node_modules/cacache": { + "version": "16.1.3", "inBundle": true, "license": "ISC", "dependencies": { - "@npmcli/arborist": "^5.6.3", - "@npmcli/ci-detect": "^2.0.0", - "@npmcli/fs": "^2.1.1", - "@npmcli/run-script": "^4.2.0", - "chalk": "^4.1.0", - "mkdirp-infer-owner": "^2.0.0", - "npm-package-arg": "^9.0.1", - "npmlog": "^6.0.2", - "pacote": "^13.6.1", - "proc-log": "^2.0.0", - "read": "^1.0.7", - "read-package-json-fast": "^2.0.2", - "semver": "^7.3.7", - "walk-up-path": "^1.0.0" + "@npmcli/fs": "^2.1.0", + "@npmcli/move-file": "^2.0.0", + "chownr": "^2.0.0", + "fs-minipass": "^2.1.0", + "glob": "^8.0.1", + "infer-owner": "^1.0.4", + "lru-cache": "^7.7.1", + "minipass": "^3.1.6", + "minipass-collect": "^1.0.2", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "mkdirp": "^1.0.4", + "p-map": "^4.0.0", + "promise-inflight": "^1.0.1", + "rimraf": "^3.0.2", + "ssri": "^9.0.0", + "tar": "^6.1.11", + "unique-filename": "^2.0.0" }, "engines": { "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, - "node_modules/npm/node_modules/libnpmfund": { - "version": "3.0.5", + "node_modules/npm/node_modules/chalk": { + "version": "4.1.2", "inBundle": true, - "license": "ISC", + "license": "MIT", "dependencies": { - "@npmcli/arborist": "^5.6.3" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/npm/node_modules/libnpmhook": { - "version": "8.0.4", + "node_modules/npm/node_modules/chownr": { + "version": "2.0.0", "inBundle": true, "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/npm/node_modules/cidr-regex": { + "version": "3.1.1", + "inBundle": true, + "license": "BSD-2-Clause", "dependencies": { - "aproba": "^2.0.0", - "npm-registry-fetch": "^13.0.0" + "ip-regex": "^4.1.0" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": ">=10" } }, - "node_modules/npm/node_modules/libnpmorg": { - "version": "4.0.4", + "node_modules/npm/node_modules/clean-stack": { + "version": "2.2.0", "inBundle": true, - "license": "ISC", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/npm/node_modules/cli-columns": { + "version": "4.0.0", + "inBundle": true, + "license": "MIT", "dependencies": { - "aproba": "^2.0.0", - "npm-registry-fetch": "^13.0.0" + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": ">= 10" } }, - "node_modules/npm/node_modules/libnpmpack": { - "version": "4.1.3", + "node_modules/npm/node_modules/cli-table3": { + "version": "0.6.2", + "inBundle": true, + "license": "MIT", + "dependencies": { + "string-width": "^4.2.0" + }, + "engines": { + "node": "10.* || >= 12.*" + }, + "optionalDependencies": { + "@colors/colors": "1.5.0" + } + }, + "node_modules/npm/node_modules/clone": { + "version": "1.0.4", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=0.8" + } + }, + "node_modules/npm/node_modules/cmd-shim": { + "version": "5.0.0", "inBundle": true, "license": "ISC", "dependencies": { - "@npmcli/run-script": "^4.1.3", - "npm-package-arg": "^9.0.1", - "pacote": "^13.6.1" + "mkdirp-infer-owner": "^2.0.0" }, "engines": { "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, - "node_modules/npm/node_modules/libnpmpublish": { - "version": "6.0.5", + "node_modules/npm/node_modules/color-convert": { + "version": "2.0.1", "inBundle": true, - "license": "ISC", + "license": "MIT", "dependencies": { - "normalize-package-data": "^4.0.0", - "npm-package-arg": "^9.0.1", - "npm-registry-fetch": "^13.0.0", - "semver": "^7.3.7", - "ssri": "^9.0.0" + "color-name": "~1.1.4" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": ">=7.0.0" } }, - "node_modules/npm/node_modules/libnpmsearch": { - "version": "5.0.4", + "node_modules/npm/node_modules/color-name": { + "version": "1.1.4", + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/color-support": { + "version": "1.1.3", "inBundle": true, "license": "ISC", + "bin": { + "color-support": "bin.js" + } + }, + "node_modules/npm/node_modules/columnify": { + "version": "1.6.0", + "inBundle": true, + "license": "MIT", "dependencies": { - "npm-registry-fetch": "^13.0.0" + "strip-ansi": "^6.0.1", + "wcwidth": "^1.0.0" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": ">=8.0.0" } }, - "node_modules/npm/node_modules/libnpmteam": { - "version": "4.0.4", + "node_modules/npm/node_modules/common-ancestor-path": { + "version": "1.0.1", "inBundle": true, - "license": "ISC", - "dependencies": { - "aproba": "^2.0.0", - "npm-registry-fetch": "^13.0.0" + "license": "ISC" + }, + "node_modules/npm/node_modules/concat-map": { + "version": "0.0.1", + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/console-control-strings": { + "version": "1.1.0", + "inBundle": true, + "license": "ISC" + }, + "node_modules/npm/node_modules/cssesc": { + "version": "3.0.0", + "inBundle": true, + "license": "MIT", + "bin": { + "cssesc": "bin/cssesc" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": ">=4" } }, - "node_modules/npm/node_modules/libnpmversion": { - "version": "3.0.7", + "node_modules/npm/node_modules/debug": { + "version": "4.3.4", "inBundle": true, - "license": "ISC", + "license": "MIT", "dependencies": { - "@npmcli/git": "^3.0.0", - "@npmcli/run-script": "^4.1.3", - "json-parse-even-better-errors": "^2.3.1", - "proc-log": "^2.0.0", - "semver": "^7.3.7" + "ms": "2.1.2" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } } }, - "node_modules/npm/node_modules/lru-cache": { - "version": "7.13.2", + "node_modules/npm/node_modules/debug/node_modules/ms": { + "version": "2.1.2", "inBundle": true, - "license": "ISC", + "license": "MIT" + }, + "node_modules/npm/node_modules/debuglog": { + "version": "1.0.1", + "inBundle": true, + "license": "MIT", "engines": { - "node": ">=12" + "node": "*" } }, - "node_modules/npm/node_modules/make-fetch-happen": { - "version": "10.2.1", + "node_modules/npm/node_modules/defaults": { + "version": "1.0.3", "inBundle": true, - "license": "ISC", + "license": "MIT", "dependencies": { - "agentkeepalive": "^4.2.1", - "cacache": "^16.1.0", - "http-cache-semantics": "^4.1.0", - "http-proxy-agent": "^5.0.0", - "https-proxy-agent": "^5.0.0", - "is-lambda": "^1.0.1", - "lru-cache": "^7.7.1", - "minipass": "^3.1.6", - "minipass-collect": "^1.0.2", - "minipass-fetch": "^2.0.3", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.4", - "negotiator": "^0.6.3", - "promise-retry": "^2.0.1", - "socks-proxy-agent": "^7.0.0", - "ssri": "^9.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "clone": "^1.0.2" } }, - "node_modules/npm/node_modules/minimatch": { - "version": "5.1.0", + "node_modules/npm/node_modules/delegates": { + "version": "1.0.0", "inBundle": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^2.0.1" - }, + "license": "MIT" + }, + "node_modules/npm/node_modules/depd": { + "version": "1.1.2", + "inBundle": true, + "license": "MIT", "engines": { - "node": ">=10" + "node": ">= 0.6" } }, - "node_modules/npm/node_modules/minipass": { - "version": "3.3.4", + "node_modules/npm/node_modules/dezalgo": { + "version": "1.0.4", "inBundle": true, "license": "ISC", "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" + "asap": "^2.0.0", + "wrappy": "1" } }, - "node_modules/npm/node_modules/minipass-collect": { - "version": "1.0.2", + "node_modules/npm/node_modules/diff": { + "version": "5.1.0", "inBundle": true, - "license": "ISC", - "dependencies": { - "minipass": "^3.0.0" - }, + "license": "BSD-3-Clause", "engines": { - "node": ">= 8" + "node": ">=0.3.1" } }, - "node_modules/npm/node_modules/minipass-fetch": { - "version": "2.1.1", + "node_modules/npm/node_modules/emoji-regex": { + "version": "8.0.0", + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/encoding": { + "version": "0.1.13", "inBundle": true, "license": "MIT", + "optional": true, "dependencies": { - "minipass": "^3.1.6", - "minipass-sized": "^1.0.3", - "minizlib": "^2.1.2" - }, + "iconv-lite": "^0.6.2" + } + }, + "node_modules/npm/node_modules/env-paths": { + "version": "2.2.1", + "inBundle": true, + "license": "MIT", "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - }, - "optionalDependencies": { - "encoding": "^0.1.13" + "node": ">=6" } }, - "node_modules/npm/node_modules/minipass-flush": { - "version": "1.0.5", + "node_modules/npm/node_modules/err-code": { + "version": "2.0.3", + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/fastest-levenshtein": { + "version": "1.0.12", + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/fs-minipass": { + "version": "2.1.0", "inBundle": true, "license": "ISC", "dependencies": { @@ -2278,603 +1417,657 @@ "node": ">= 8" } }, - "node_modules/npm/node_modules/minipass-json-stream": { - "version": "1.0.1", + "node_modules/npm/node_modules/fs.realpath": { + "version": "1.0.0", "inBundle": true, - "license": "MIT", - "dependencies": { - "jsonparse": "^1.3.1", - "minipass": "^3.0.0" - } + "license": "ISC" }, - "node_modules/npm/node_modules/minipass-pipeline": { - "version": "1.2.4", + "node_modules/npm/node_modules/function-bind": { + "version": "1.1.1", + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/gauge": { + "version": "4.0.4", "inBundle": true, "license": "ISC", "dependencies": { - "minipass": "^3.0.0" + "aproba": "^1.0.3 || ^2.0.0", + "color-support": "^1.1.3", + "console-control-strings": "^1.1.0", + "has-unicode": "^2.0.1", + "signal-exit": "^3.0.7", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1", + "wide-align": "^1.1.5" }, "engines": { - "node": ">=8" + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, - "node_modules/npm/node_modules/minipass-sized": { - "version": "1.0.3", + "node_modules/npm/node_modules/glob": { + "version": "8.0.3", "inBundle": true, "license": "ISC", "dependencies": { - "minipass": "^3.0.0" + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^5.0.1", + "once": "^1.3.0" }, "engines": { - "node": ">=8" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/npm/node_modules/minizlib": { - "version": "2.1.2", + "node_modules/npm/node_modules/graceful-fs": { + "version": "4.2.10", + "inBundle": true, + "license": "ISC" + }, + "node_modules/npm/node_modules/has": { + "version": "1.0.3", "inBundle": true, "license": "MIT", "dependencies": { - "minipass": "^3.0.0", - "yallist": "^4.0.0" + "function-bind": "^1.1.1" }, "engines": { - "node": ">= 8" + "node": ">= 0.4.0" } }, - "node_modules/npm/node_modules/mkdirp": { - "version": "1.0.4", + "node_modules/npm/node_modules/has-flag": { + "version": "4.0.0", "inBundle": true, "license": "MIT", - "bin": { - "mkdirp": "bin/cmd.js" - }, "engines": { - "node": ">=10" + "node": ">=8" } }, - "node_modules/npm/node_modules/mkdirp-infer-owner": { - "version": "2.0.0", + "node_modules/npm/node_modules/has-unicode": { + "version": "2.0.1", + "inBundle": true, + "license": "ISC" + }, + "node_modules/npm/node_modules/hosted-git-info": { + "version": "5.2.1", "inBundle": true, "license": "ISC", "dependencies": { - "chownr": "^2.0.0", - "infer-owner": "^1.0.4", - "mkdirp": "^1.0.3" + "lru-cache": "^7.5.1" }, "engines": { - "node": ">=10" + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, - "node_modules/npm/node_modules/ms": { - "version": "2.1.3", - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/mute-stream": { - "version": "0.0.8", + "node_modules/npm/node_modules/http-cache-semantics": { + "version": "4.1.1", "inBundle": true, - "license": "ISC" + "license": "BSD-2-Clause" }, - "node_modules/npm/node_modules/negotiator": { - "version": "0.6.3", + "node_modules/npm/node_modules/http-proxy-agent": { + "version": "5.0.0", "inBundle": true, "license": "MIT", + "dependencies": { + "@tootallnate/once": "2", + "agent-base": "6", + "debug": "4" + }, "engines": { - "node": ">= 0.6" + "node": ">= 6" } }, - "node_modules/npm/node_modules/node-gyp": { - "version": "9.1.0", + "node_modules/npm/node_modules/https-proxy-agent": { + "version": "5.0.1", "inBundle": true, "license": "MIT", "dependencies": { - "env-paths": "^2.2.0", - "glob": "^7.1.4", - "graceful-fs": "^4.2.6", - "make-fetch-happen": "^10.0.3", - "nopt": "^5.0.0", - "npmlog": "^6.0.0", - "rimraf": "^3.0.2", - "semver": "^7.3.5", - "tar": "^6.1.2", - "which": "^2.0.2" - }, - "bin": { - "node-gyp": "bin/node-gyp.js" + "agent-base": "6", + "debug": "4" }, "engines": { - "node": "^12.22 || ^14.13 || >=16" + "node": ">= 6" } }, - "node_modules/npm/node_modules/node-gyp/node_modules/brace-expansion": { - "version": "1.1.11", + "node_modules/npm/node_modules/humanize-ms": { + "version": "1.2.1", "inBundle": true, "license": "MIT", "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "ms": "^2.0.0" } }, - "node_modules/npm/node_modules/node-gyp/node_modules/glob": { - "version": "7.2.3", + "node_modules/npm/node_modules/iconv-lite": { + "version": "0.6.3", "inBundle": true, - "license": "ISC", + "license": "MIT", + "optional": true, "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" + "safer-buffer": ">= 2.1.2 < 3.0.0" }, "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "node": ">=0.10.0" } }, - "node_modules/npm/node_modules/node-gyp/node_modules/minimatch": { - "version": "3.1.2", + "node_modules/npm/node_modules/ignore-walk": { + "version": "5.0.1", "inBundle": true, "license": "ISC", "dependencies": { - "brace-expansion": "^1.1.7" + "minimatch": "^5.0.1" }, "engines": { - "node": "*" + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, - "node_modules/npm/node_modules/node-gyp/node_modules/nopt": { - "version": "5.0.0", + "node_modules/npm/node_modules/imurmurhash": { + "version": "0.1.4", "inBundle": true, - "license": "ISC", - "dependencies": { - "abbrev": "1" - }, - "bin": { - "nopt": "bin/nopt.js" - }, + "license": "MIT", "engines": { - "node": ">=6" + "node": ">=0.8.19" } }, - "node_modules/npm/node_modules/nopt": { - "version": "6.0.0", + "node_modules/npm/node_modules/indent-string": { + "version": "4.0.0", "inBundle": true, - "license": "ISC", - "dependencies": { - "abbrev": "^1.0.0" - }, - "bin": { - "nopt": "bin/nopt.js" - }, + "license": "MIT", "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": ">=8" } }, - "node_modules/npm/node_modules/normalize-package-data": { - "version": "4.0.1", + "node_modules/npm/node_modules/infer-owner": { + "version": "1.0.4", "inBundle": true, - "license": "BSD-2-Clause", + "license": "ISC" + }, + "node_modules/npm/node_modules/inflight": { + "version": "1.0.6", + "inBundle": true, + "license": "ISC", "dependencies": { - "hosted-git-info": "^5.0.0", - "is-core-module": "^2.8.1", - "semver": "^7.3.5", - "validate-npm-package-license": "^3.0.4" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "once": "^1.3.0", + "wrappy": "1" } }, - "node_modules/npm/node_modules/npm-audit-report": { - "version": "3.0.0", + "node_modules/npm/node_modules/inherits": { + "version": "2.0.4", + "inBundle": true, + "license": "ISC" + }, + "node_modules/npm/node_modules/ini": { + "version": "3.0.1", "inBundle": true, "license": "ISC", - "dependencies": { - "chalk": "^4.0.0" - }, "engines": { "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, - "node_modules/npm/node_modules/npm-bundled": { - "version": "2.0.1", + "node_modules/npm/node_modules/init-package-json": { + "version": "3.0.2", "inBundle": true, "license": "ISC", "dependencies": { - "npm-normalize-package-bin": "^2.0.0" + "npm-package-arg": "^9.0.1", + "promzard": "^0.3.0", + "read": "^1.0.7", + "read-package-json": "^5.0.0", + "semver": "^7.3.5", + "validate-npm-package-license": "^3.0.4", + "validate-npm-package-name": "^4.0.0" }, "engines": { "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, - "node_modules/npm/node_modules/npm-bundled/node_modules/npm-normalize-package-bin": { + "node_modules/npm/node_modules/ip": { "version": "2.0.0", "inBundle": true, - "license": "ISC", + "license": "MIT" + }, + "node_modules/npm/node_modules/ip-regex": { + "version": "4.3.0", + "inBundle": true, + "license": "MIT", "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": ">=8" } }, - "node_modules/npm/node_modules/npm-install-checks": { - "version": "5.0.0", + "node_modules/npm/node_modules/is-cidr": { + "version": "4.0.2", "inBundle": true, "license": "BSD-2-Clause", "dependencies": { - "semver": "^7.1.1" + "cidr-regex": "^3.1.1" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": ">=10" } }, - "node_modules/npm/node_modules/npm-normalize-package-bin": { + "node_modules/npm/node_modules/is-core-module": { + "version": "2.10.0", + "inBundle": true, + "license": "MIT", + "dependencies": { + "has": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/npm/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/npm/node_modules/is-lambda": { "version": "1.0.1", "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/isexe": { + "version": "2.0.0", + "inBundle": true, "license": "ISC" }, - "node_modules/npm/node_modules/npm-package-arg": { - "version": "9.1.0", + "node_modules/npm/node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/json-stringify-nice": { + "version": "1.1.4", + "inBundle": true, + "license": "ISC", + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/npm/node_modules/jsonparse": { + "version": "1.3.1", + "engines": [ + "node >= 0.2.0" + ], + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/just-diff": { + "version": "5.1.1", + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/just-diff-apply": { + "version": "5.4.1", + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/libnpmaccess": { + "version": "6.0.4", "inBundle": true, "license": "ISC", "dependencies": { - "hosted-git-info": "^5.0.0", - "proc-log": "^2.0.1", - "semver": "^7.3.5", - "validate-npm-package-name": "^4.0.0" + "aproba": "^2.0.0", + "minipass": "^3.1.1", + "npm-package-arg": "^9.0.1", + "npm-registry-fetch": "^13.0.0" }, "engines": { "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, - "node_modules/npm/node_modules/npm-packlist": { - "version": "5.1.3", + "node_modules/npm/node_modules/libnpmdiff": { + "version": "4.0.5", "inBundle": true, "license": "ISC", "dependencies": { - "glob": "^8.0.1", - "ignore-walk": "^5.0.1", - "npm-bundled": "^2.0.0", - "npm-normalize-package-bin": "^2.0.0" - }, - "bin": { - "npm-packlist": "bin/index.js" + "@npmcli/disparity-colors": "^2.0.0", + "@npmcli/installed-package-contents": "^1.0.7", + "binary-extensions": "^2.2.0", + "diff": "^5.1.0", + "minimatch": "^5.0.1", + "npm-package-arg": "^9.0.1", + "pacote": "^13.6.1", + "tar": "^6.1.0" }, "engines": { "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, - "node_modules/npm/node_modules/npm-packlist/node_modules/npm-normalize-package-bin": { - "version": "2.0.0", + "node_modules/npm/node_modules/libnpmexec": { + "version": "4.0.14", "inBundle": true, "license": "ISC", + "dependencies": { + "@npmcli/arborist": "^5.6.3", + "@npmcli/ci-detect": "^2.0.0", + "@npmcli/fs": "^2.1.1", + "@npmcli/run-script": "^4.2.0", + "chalk": "^4.1.0", + "mkdirp-infer-owner": "^2.0.0", + "npm-package-arg": "^9.0.1", + "npmlog": "^6.0.2", + "pacote": "^13.6.1", + "proc-log": "^2.0.0", + "read": "^1.0.7", + "read-package-json-fast": "^2.0.2", + "semver": "^7.3.7", + "walk-up-path": "^1.0.0" + }, "engines": { "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, - "node_modules/npm/node_modules/npm-pick-manifest": { - "version": "7.0.2", + "node_modules/npm/node_modules/libnpmfund": { + "version": "3.0.5", "inBundle": true, "license": "ISC", "dependencies": { - "npm-install-checks": "^5.0.0", - "npm-normalize-package-bin": "^2.0.0", - "npm-package-arg": "^9.0.0", - "semver": "^7.3.5" + "@npmcli/arborist": "^5.6.3" }, "engines": { "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, - "node_modules/npm/node_modules/npm-pick-manifest/node_modules/npm-normalize-package-bin": { - "version": "2.0.0", + "node_modules/npm/node_modules/libnpmhook": { + "version": "8.0.4", "inBundle": true, "license": "ISC", + "dependencies": { + "aproba": "^2.0.0", + "npm-registry-fetch": "^13.0.0" + }, "engines": { "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, - "node_modules/npm/node_modules/npm-profile": { - "version": "6.2.1", + "node_modules/npm/node_modules/libnpmorg": { + "version": "4.0.4", "inBundle": true, "license": "ISC", "dependencies": { - "npm-registry-fetch": "^13.0.1", - "proc-log": "^2.0.0" + "aproba": "^2.0.0", + "npm-registry-fetch": "^13.0.0" }, "engines": { "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, - "node_modules/npm/node_modules/npm-registry-fetch": { - "version": "13.3.1", + "node_modules/npm/node_modules/libnpmpack": { + "version": "4.1.3", "inBundle": true, "license": "ISC", "dependencies": { - "make-fetch-happen": "^10.0.6", - "minipass": "^3.1.6", - "minipass-fetch": "^2.0.3", - "minipass-json-stream": "^1.0.1", - "minizlib": "^2.1.2", + "@npmcli/run-script": "^4.1.3", "npm-package-arg": "^9.0.1", - "proc-log": "^2.0.0" + "pacote": "^13.6.1" }, "engines": { "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, - "node_modules/npm/node_modules/npm-user-validate": { - "version": "1.0.1", - "inBundle": true, - "license": "BSD-2-Clause" - }, - "node_modules/npm/node_modules/npmlog": { - "version": "6.0.2", + "node_modules/npm/node_modules/libnpmpublish": { + "version": "6.0.5", "inBundle": true, "license": "ISC", "dependencies": { - "are-we-there-yet": "^3.0.0", - "console-control-strings": "^1.1.0", - "gauge": "^4.0.3", - "set-blocking": "^2.0.0" + "normalize-package-data": "^4.0.0", + "npm-package-arg": "^9.0.1", + "npm-registry-fetch": "^13.0.0", + "semver": "^7.3.7", + "ssri": "^9.0.0" }, "engines": { "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, - "node_modules/npm/node_modules/once": { - "version": "1.4.0", + "node_modules/npm/node_modules/libnpmsearch": { + "version": "5.0.4", "inBundle": true, "license": "ISC", "dependencies": { - "wrappy": "1" - } - }, - "node_modules/npm/node_modules/opener": { - "version": "1.5.2", - "inBundle": true, - "license": "(WTFPL OR MIT)", - "bin": { - "opener": "bin/opener-bin.js" - } - }, - "node_modules/npm/node_modules/p-map": { - "version": "4.0.0", - "inBundle": true, - "license": "MIT", - "dependencies": { - "aggregate-error": "^3.0.0" + "npm-registry-fetch": "^13.0.0" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, - "node_modules/npm/node_modules/pacote": { - "version": "13.6.2", + "node_modules/npm/node_modules/libnpmteam": { + "version": "4.0.4", "inBundle": true, "license": "ISC", "dependencies": { - "@npmcli/git": "^3.0.0", - "@npmcli/installed-package-contents": "^1.0.7", - "@npmcli/promise-spawn": "^3.0.0", - "@npmcli/run-script": "^4.1.0", - "cacache": "^16.0.0", - "chownr": "^2.0.0", - "fs-minipass": "^2.1.0", - "infer-owner": "^1.0.4", - "minipass": "^3.1.6", - "mkdirp": "^1.0.4", - "npm-package-arg": "^9.0.0", - "npm-packlist": "^5.1.0", - "npm-pick-manifest": "^7.0.0", - "npm-registry-fetch": "^13.0.1", - "proc-log": "^2.0.0", - "promise-retry": "^2.0.1", - "read-package-json": "^5.0.0", - "read-package-json-fast": "^2.0.3", - "rimraf": "^3.0.2", - "ssri": "^9.0.0", - "tar": "^6.1.11" - }, - "bin": { - "pacote": "lib/bin.js" + "aproba": "^2.0.0", + "npm-registry-fetch": "^13.0.0" }, "engines": { "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, - "node_modules/npm/node_modules/parse-conflict-json": { - "version": "2.0.2", + "node_modules/npm/node_modules/libnpmversion": { + "version": "3.0.7", "inBundle": true, "license": "ISC", "dependencies": { + "@npmcli/git": "^3.0.0", + "@npmcli/run-script": "^4.1.3", "json-parse-even-better-errors": "^2.3.1", - "just-diff": "^5.0.1", - "just-diff-apply": "^5.2.0" + "proc-log": "^2.0.0", + "semver": "^7.3.7" }, "engines": { "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, - "node_modules/npm/node_modules/path-is-absolute": { - "version": "1.0.1", + "node_modules/npm/node_modules/lru-cache": { + "version": "7.13.2", "inBundle": true, - "license": "MIT", + "license": "ISC", "engines": { - "node": ">=0.10.0" + "node": ">=12" } }, - "node_modules/npm/node_modules/postcss-selector-parser": { - "version": "6.0.10", + "node_modules/npm/node_modules/make-fetch-happen": { + "version": "10.2.1", "inBundle": true, - "license": "MIT", + "license": "ISC", "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" + "agentkeepalive": "^4.2.1", + "cacache": "^16.1.0", + "http-cache-semantics": "^4.1.0", + "http-proxy-agent": "^5.0.0", + "https-proxy-agent": "^5.0.0", + "is-lambda": "^1.0.1", + "lru-cache": "^7.7.1", + "minipass": "^3.1.6", + "minipass-collect": "^1.0.2", + "minipass-fetch": "^2.0.3", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "negotiator": "^0.6.3", + "promise-retry": "^2.0.1", + "socks-proxy-agent": "^7.0.0", + "ssri": "^9.0.0" }, "engines": { - "node": ">=4" + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, - "node_modules/npm/node_modules/proc-log": { - "version": "2.0.1", + "node_modules/npm/node_modules/minimatch": { + "version": "5.1.0", "inBundle": true, "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": ">=10" } }, - "node_modules/npm/node_modules/promise-all-reject-late": { - "version": "1.0.1", + "node_modules/npm/node_modules/minipass": { + "version": "3.3.4", "inBundle": true, "license": "ISC", - "funding": { - "url": "https://github.com/sponsors/isaacs" + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" } }, - "node_modules/npm/node_modules/promise-call-limit": { - "version": "1.0.1", + "node_modules/npm/node_modules/minipass-collect": { + "version": "1.0.2", "inBundle": true, "license": "ISC", - "funding": { - "url": "https://github.com/sponsors/isaacs" + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" } }, - "node_modules/npm/node_modules/promise-inflight": { - "version": "1.0.1", - "inBundle": true, - "license": "ISC" - }, - "node_modules/npm/node_modules/promise-retry": { - "version": "2.0.1", + "node_modules/npm/node_modules/minipass-fetch": { + "version": "2.1.1", "inBundle": true, "license": "MIT", "dependencies": { - "err-code": "^2.0.2", - "retry": "^0.12.0" + "minipass": "^3.1.6", + "minipass-sized": "^1.0.3", + "minizlib": "^2.1.2" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" }, - "engines": { - "node": ">=10" + "optionalDependencies": { + "encoding": "^0.1.13" } }, - "node_modules/npm/node_modules/promzard": { - "version": "0.3.0", + "node_modules/npm/node_modules/minipass-flush": { + "version": "1.0.5", "inBundle": true, "license": "ISC", "dependencies": { - "read": "1" + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" } }, - "node_modules/npm/node_modules/qrcode-terminal": { - "version": "0.12.0", + "node_modules/npm/node_modules/minipass-json-stream": { + "version": "1.0.1", "inBundle": true, - "bin": { - "qrcode-terminal": "bin/qrcode-terminal.js" + "license": "MIT", + "dependencies": { + "jsonparse": "^1.3.1", + "minipass": "^3.0.0" } }, - "node_modules/npm/node_modules/read": { - "version": "1.0.7", + "node_modules/npm/node_modules/minipass-pipeline": { + "version": "1.2.4", "inBundle": true, "license": "ISC", "dependencies": { - "mute-stream": "~0.0.4" + "minipass": "^3.0.0" }, "engines": { - "node": ">=0.8" + "node": ">=8" } }, - "node_modules/npm/node_modules/read-cmd-shim": { - "version": "3.0.0", + "node_modules/npm/node_modules/minipass-sized": { + "version": "1.0.3", "inBundle": true, "license": "ISC", + "dependencies": { + "minipass": "^3.0.0" + }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": ">=8" } }, - "node_modules/npm/node_modules/read-package-json": { - "version": "5.0.2", + "node_modules/npm/node_modules/minizlib": { + "version": "2.1.2", "inBundle": true, - "license": "ISC", + "license": "MIT", "dependencies": { - "glob": "^8.0.1", - "json-parse-even-better-errors": "^2.3.1", - "normalize-package-data": "^4.0.0", - "npm-normalize-package-bin": "^2.0.0" + "minipass": "^3.0.0", + "yallist": "^4.0.0" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": ">= 8" } }, - "node_modules/npm/node_modules/read-package-json-fast": { - "version": "2.0.3", + "node_modules/npm/node_modules/mkdirp": { + "version": "1.0.4", "inBundle": true, - "license": "ISC", - "dependencies": { - "json-parse-even-better-errors": "^2.3.0", - "npm-normalize-package-bin": "^1.0.1" + "license": "MIT", + "bin": { + "mkdirp": "bin/cmd.js" }, "engines": { "node": ">=10" } }, - "node_modules/npm/node_modules/read-package-json/node_modules/npm-normalize-package-bin": { + "node_modules/npm/node_modules/mkdirp-infer-owner": { "version": "2.0.0", "inBundle": true, "license": "ISC", - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/readable-stream": { - "version": "3.6.0", - "inBundle": true, - "license": "MIT", "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" + "chownr": "^2.0.0", + "infer-owner": "^1.0.4", + "mkdirp": "^1.0.3" }, "engines": { - "node": ">= 6" + "node": ">=10" } }, - "node_modules/npm/node_modules/readdir-scoped-modules": { - "version": "1.1.0", + "node_modules/npm/node_modules/ms": { + "version": "2.1.3", "inBundle": true, - "license": "ISC", - "dependencies": { - "debuglog": "^1.0.1", - "dezalgo": "^1.0.0", - "graceful-fs": "^4.1.2", - "once": "^1.3.0" - } + "license": "MIT" }, - "node_modules/npm/node_modules/retry": { - "version": "0.12.0", + "node_modules/npm/node_modules/mute-stream": { + "version": "0.0.8", + "inBundle": true, + "license": "ISC" + }, + "node_modules/npm/node_modules/negotiator": { + "version": "0.6.3", "inBundle": true, "license": "MIT", "engines": { - "node": ">= 4" + "node": ">= 0.6" } }, - "node_modules/npm/node_modules/rimraf": { - "version": "3.0.2", + "node_modules/npm/node_modules/node-gyp": { + "version": "9.1.0", "inBundle": true, - "license": "ISC", + "license": "MIT", "dependencies": { - "glob": "^7.1.3" + "env-paths": "^2.2.0", + "glob": "^7.1.4", + "graceful-fs": "^4.2.6", + "make-fetch-happen": "^10.0.3", + "nopt": "^5.0.0", + "npmlog": "^6.0.0", + "rimraf": "^3.0.2", + "semver": "^7.3.5", + "tar": "^6.1.2", + "which": "^2.0.2" }, "bin": { - "rimraf": "bin.js" + "node-gyp": "bin/node-gyp.js" }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "engines": { + "node": "^12.22 || ^14.13 || >=16" } }, - "node_modules/npm/node_modules/rimraf/node_modules/brace-expansion": { + "node_modules/npm/node_modules/node-gyp/node_modules/brace-expansion": { "version": "1.1.11", "inBundle": true, "license": "MIT", @@ -2883,7 +2076,7 @@ "concat-map": "0.0.1" } }, - "node_modules/npm/node_modules/rimraf/node_modules/glob": { + "node_modules/npm/node_modules/node-gyp/node_modules/glob": { "version": "7.2.3", "inBundle": true, "license": "ISC", @@ -2902,7 +2095,7 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/npm/node_modules/rimraf/node_modules/minimatch": { + "node_modules/npm/node_modules/node-gyp/node_modules/minimatch": { "version": "3.1.2", "inBundle": true, "license": "ISC", @@ -2913,210 +2106,148 @@ "node": "*" } }, - "node_modules/npm/node_modules/safe-buffer": { - "version": "5.2.1", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/safer-buffer": { - "version": "2.1.2", - "inBundle": true, - "license": "MIT", - "optional": true - }, - "node_modules/npm/node_modules/semver": { - "version": "7.3.7", + "node_modules/npm/node_modules/node-gyp/node_modules/nopt": { + "version": "5.0.0", "inBundle": true, "license": "ISC", "dependencies": { - "lru-cache": "^6.0.0" + "abbrev": "1" }, "bin": { - "semver": "bin/semver.js" + "nopt": "bin/nopt.js" }, "engines": { - "node": ">=10" + "node": ">=6" } }, - "node_modules/npm/node_modules/semver/node_modules/lru-cache": { + "node_modules/npm/node_modules/nopt": { "version": "6.0.0", "inBundle": true, "license": "ISC", "dependencies": { - "yallist": "^4.0.0" + "abbrev": "^1.0.0" + }, + "bin": { + "nopt": "bin/nopt.js" }, "engines": { - "node": ">=10" - } - }, - "node_modules/npm/node_modules/set-blocking": { - "version": "2.0.0", - "inBundle": true, - "license": "ISC" - }, - "node_modules/npm/node_modules/signal-exit": { - "version": "3.0.7", - "inBundle": true, - "license": "ISC" - }, - "node_modules/npm/node_modules/smart-buffer": { - "version": "4.2.0", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">= 6.0.0", - "npm": ">= 3.0.0" + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, - "node_modules/npm/node_modules/socks": { - "version": "2.7.0", + "node_modules/npm/node_modules/normalize-package-data": { + "version": "4.0.1", "inBundle": true, - "license": "MIT", + "license": "BSD-2-Clause", "dependencies": { - "ip": "^2.0.0", - "smart-buffer": "^4.2.0" + "hosted-git-info": "^5.0.0", + "is-core-module": "^2.8.1", + "semver": "^7.3.5", + "validate-npm-package-license": "^3.0.4" }, "engines": { - "node": ">= 10.13.0", - "npm": ">= 3.0.0" + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, - "node_modules/npm/node_modules/socks-proxy-agent": { - "version": "7.0.0", + "node_modules/npm/node_modules/npm-audit-report": { + "version": "3.0.0", "inBundle": true, - "license": "MIT", + "license": "ISC", "dependencies": { - "agent-base": "^6.0.2", - "debug": "^4.3.3", - "socks": "^2.6.2" + "chalk": "^4.0.0" }, "engines": { - "node": ">= 10" - } - }, - "node_modules/npm/node_modules/spdx-correct": { - "version": "3.1.1", - "inBundle": true, - "license": "Apache-2.0", - "dependencies": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" - } - }, - "node_modules/npm/node_modules/spdx-exceptions": { - "version": "2.3.0", - "inBundle": true, - "license": "CC-BY-3.0" - }, - "node_modules/npm/node_modules/spdx-expression-parse": { - "version": "3.0.1", - "inBundle": true, - "license": "MIT", - "dependencies": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, - "node_modules/npm/node_modules/spdx-license-ids": { - "version": "3.0.11", - "inBundle": true, - "license": "CC0-1.0" - }, - "node_modules/npm/node_modules/ssri": { - "version": "9.0.1", + "node_modules/npm/node_modules/npm-bundled": { + "version": "2.0.1", "inBundle": true, "license": "ISC", "dependencies": { - "minipass": "^3.1.1" + "npm-normalize-package-bin": "^2.0.0" }, "engines": { "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, - "node_modules/npm/node_modules/string_decoder": { - "version": "1.3.0", + "node_modules/npm/node_modules/npm-bundled/node_modules/npm-normalize-package-bin": { + "version": "2.0.0", "inBundle": true, - "license": "MIT", - "dependencies": { - "safe-buffer": "~5.2.0" + "license": "ISC", + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, - "node_modules/npm/node_modules/string-width": { - "version": "4.2.3", + "node_modules/npm/node_modules/npm-install-checks": { + "version": "5.0.0", "inBundle": true, - "license": "MIT", + "license": "BSD-2-Clause", "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" + "semver": "^7.1.1" }, "engines": { - "node": ">=8" + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, - "node_modules/npm/node_modules/strip-ansi": { - "version": "6.0.1", + "node_modules/npm/node_modules/npm-normalize-package-bin": { + "version": "1.0.1", "inBundle": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } + "license": "ISC" }, - "node_modules/npm/node_modules/supports-color": { - "version": "7.2.0", + "node_modules/npm/node_modules/npm-package-arg": { + "version": "9.1.0", "inBundle": true, - "license": "MIT", + "license": "ISC", "dependencies": { - "has-flag": "^4.0.0" + "hosted-git-info": "^5.0.0", + "proc-log": "^2.0.1", + "semver": "^7.3.5", + "validate-npm-package-name": "^4.0.0" }, "engines": { - "node": ">=8" + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, - "node_modules/npm/node_modules/tar": { - "version": "6.1.11", + "node_modules/npm/node_modules/npm-packlist": { + "version": "5.1.3", "inBundle": true, "license": "ISC", "dependencies": { - "chownr": "^2.0.0", - "fs-minipass": "^2.0.0", - "minipass": "^3.0.0", - "minizlib": "^2.1.1", - "mkdirp": "^1.0.3", - "yallist": "^4.0.0" + "glob": "^8.0.1", + "ignore-walk": "^5.0.1", + "npm-bundled": "^2.0.0", + "npm-normalize-package-bin": "^2.0.0" + }, + "bin": { + "npm-packlist": "bin/index.js" }, "engines": { - "node": ">= 10" + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, - "node_modules/npm/node_modules/text-table": { - "version": "0.2.0", + "node_modules/npm/node_modules/npm-packlist/node_modules/npm-normalize-package-bin": { + "version": "2.0.0", "inBundle": true, - "license": "MIT" + "license": "ISC", + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } }, - "node_modules/npm/node_modules/tiny-relative-date": { - "version": "1.3.0", + "node_modules/npm/node_modules/npm-pick-manifest": { + "version": "7.0.2", "inBundle": true, - "license": "MIT" + "license": "ISC", + "dependencies": { + "npm-install-checks": "^5.0.0", + "npm-normalize-package-bin": "^2.0.0", + "npm-package-arg": "^9.0.0", + "semver": "^7.3.5" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } }, - "node_modules/npm/node_modules/treeverse": { + "node_modules/npm/node_modules/npm-pick-manifest/node_modules/npm-normalize-package-bin": { "version": "2.0.0", "inBundle": true, "license": "ISC", @@ -3124,377 +2255,347 @@ "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, - "node_modules/npm/node_modules/unique-filename": { - "version": "2.0.1", + "node_modules/npm/node_modules/npm-profile": { + "version": "6.2.1", "inBundle": true, "license": "ISC", "dependencies": { - "unique-slug": "^3.0.0" + "npm-registry-fetch": "^13.0.1", + "proc-log": "^2.0.0" }, "engines": { "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, - "node_modules/npm/node_modules/unique-slug": { - "version": "3.0.0", + "node_modules/npm/node_modules/npm-registry-fetch": { + "version": "13.3.1", "inBundle": true, "license": "ISC", "dependencies": { - "imurmurhash": "^0.1.4" + "make-fetch-happen": "^10.0.6", + "minipass": "^3.1.6", + "minipass-fetch": "^2.0.3", + "minipass-json-stream": "^1.0.1", + "minizlib": "^2.1.2", + "npm-package-arg": "^9.0.1", + "proc-log": "^2.0.0" }, "engines": { "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, - "node_modules/npm/node_modules/util-deprecate": { - "version": "1.0.2", + "node_modules/npm/node_modules/npm-user-validate": { + "version": "1.0.1", "inBundle": true, - "license": "MIT" + "license": "BSD-2-Clause" }, - "node_modules/npm/node_modules/validate-npm-package-license": { - "version": "3.0.4", + "node_modules/npm/node_modules/npmlog": { + "version": "6.0.2", "inBundle": true, - "license": "Apache-2.0", + "license": "ISC", "dependencies": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" + "are-we-there-yet": "^3.0.0", + "console-control-strings": "^1.1.0", + "gauge": "^4.0.3", + "set-blocking": "^2.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, - "node_modules/npm/node_modules/validate-npm-package-name": { - "version": "4.0.0", + "node_modules/npm/node_modules/once": { + "version": "1.4.0", "inBundle": true, "license": "ISC", "dependencies": { - "builtins": "^5.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "wrappy": "1" } }, - "node_modules/npm/node_modules/walk-up-path": { - "version": "1.0.0", + "node_modules/npm/node_modules/opener": { + "version": "1.5.2", "inBundle": true, - "license": "ISC" + "license": "(WTFPL OR MIT)", + "bin": { + "opener": "bin/opener-bin.js" + } }, - "node_modules/npm/node_modules/wcwidth": { - "version": "1.0.1", + "node_modules/npm/node_modules/p-map": { + "version": "4.0.0", "inBundle": true, "license": "MIT", "dependencies": { - "defaults": "^1.0.3" + "aggregate-error": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/npm/node_modules/which": { - "version": "2.0.2", + "node_modules/npm/node_modules/pacote": { + "version": "13.6.2", "inBundle": true, "license": "ISC", "dependencies": { - "isexe": "^2.0.0" + "@npmcli/git": "^3.0.0", + "@npmcli/installed-package-contents": "^1.0.7", + "@npmcli/promise-spawn": "^3.0.0", + "@npmcli/run-script": "^4.1.0", + "cacache": "^16.0.0", + "chownr": "^2.0.0", + "fs-minipass": "^2.1.0", + "infer-owner": "^1.0.4", + "minipass": "^3.1.6", + "mkdirp": "^1.0.4", + "npm-package-arg": "^9.0.0", + "npm-packlist": "^5.1.0", + "npm-pick-manifest": "^7.0.0", + "npm-registry-fetch": "^13.0.1", + "proc-log": "^2.0.0", + "promise-retry": "^2.0.1", + "read-package-json": "^5.0.0", + "read-package-json-fast": "^2.0.3", + "rimraf": "^3.0.2", + "ssri": "^9.0.0", + "tar": "^6.1.11" }, "bin": { - "node-which": "bin/node-which" + "pacote": "lib/bin.js" }, "engines": { - "node": ">= 8" + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, - "node_modules/npm/node_modules/wide-align": { - "version": "1.1.5", + "node_modules/npm/node_modules/parse-conflict-json": { + "version": "2.0.2", "inBundle": true, "license": "ISC", "dependencies": { - "string-width": "^1.0.2 || 2 || 3 || 4" + "json-parse-even-better-errors": "^2.3.1", + "just-diff": "^5.0.1", + "just-diff-apply": "^5.2.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, - "node_modules/npm/node_modules/wrappy": { - "version": "1.0.2", + "node_modules/npm/node_modules/path-is-absolute": { + "version": "1.0.1", "inBundle": true, - "license": "ISC" + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } }, - "node_modules/npm/node_modules/write-file-atomic": { - "version": "4.0.2", + "node_modules/npm/node_modules/postcss-selector-parser": { + "version": "6.0.10", "inBundle": true, - "license": "ISC", + "license": "MIT", "dependencies": { - "imurmurhash": "^0.1.4", - "signal-exit": "^3.0.7" + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": ">=4" } }, - "node_modules/npm/node_modules/yallist": { - "version": "4.0.0", + "node_modules/npm/node_modules/proc-log": { + "version": "2.0.1", "inBundle": true, - "license": "ISC" - }, - "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==", - "dependencies": { - "wrappy": "1" + "license": "ISC", + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, - "node_modules/os-homedir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", - "integrity": "sha512-B5JU3cabzk8c67mRRd3ECmROafjYMXbuzlwtqdM8IbS8ktlTix8aFGb2bAGKrSRIlnfKwovGUUr72JUPyOb6kQ==", - "engines": { - "node": ">=0.10.0" + "node_modules/npm/node_modules/promise-all-reject-late": { + "version": "1.0.1", + "inBundle": true, + "license": "ISC", + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/p-is-promise": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-3.0.0.tgz", - "integrity": "sha512-Wo8VsW4IRQSKVXsJCn7TomUaVtyfjVDn3nUP7kE967BQk0CwFpdbZs0X0uk5sW9mkBa9eNM7hCMaG93WUAwxYQ==", - "dev": true, - "engines": { - "node": ">=8" + "node_modules/npm/node_modules/promise-call-limit": { + "version": "1.0.1", + "inBundle": true, + "license": "ISC", + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/path-is-absolute": { + "node_modules/npm/node_modules/promise-inflight": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", - "engines": { - "node": ">=0.10.0" - } - }, - "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==" - }, - "node_modules/picocolors": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", - "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", - "dev": true, + "inBundle": true, "license": "ISC" }, - "node_modules/picomatch": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", - "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", - "dev": true, + "node_modules/npm/node_modules/promise-retry": { + "version": "2.0.1", + "inBundle": true, "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/prebuild-install": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.1.1.tgz", - "integrity": "sha512-jAXscXWMcCK8GgCoHOfIr0ODh5ai8mj63L2nWrjuAgXE6tDyYGnx4/8o/rCgU+B4JSyZBKbeZqzhtwtC3ovxjw==", - "dev": true, "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": "^1.0.1", - "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" + "err-code": "^2.0.2", + "retry": "^0.12.0" }, "engines": { "node": ">=10" } }, - "node_modules/prettier": { - "version": "1.19.1", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-1.19.1.tgz", - "integrity": "sha512-s7PoyDv/II1ObgQunCbB9PdLmUcBZcnWOcxDh7O0N/UwDEsHyqkW+Qh28jW+mVuCdx7gLB0BotYI1Y6uI9iyew==", - "dev": true, + "node_modules/npm/node_modules/promzard": { + "version": "0.3.0", + "inBundle": true, + "license": "ISC", + "dependencies": { + "read": "1" + } + }, + "node_modules/npm/node_modules/qrcode-terminal": { + "version": "0.12.0", + "inBundle": true, "bin": { - "prettier": "bin-prettier.js" + "qrcode-terminal": "bin/qrcode-terminal.js" + } + }, + "node_modules/npm/node_modules/read": { + "version": "1.0.7", + "inBundle": true, + "license": "ISC", + "dependencies": { + "mute-stream": "~0.0.4" }, "engines": { - "node": ">=4" + "node": ">=0.8" } }, - "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==", - "dev": true - }, - "node_modules/progress": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", - "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", - "dev": true, - "license": "MIT", + "node_modules/npm/node_modules/read-cmd-shim": { + "version": "3.0.0", + "inBundle": true, + "license": "ISC", "engines": { - "node": ">=0.4.0" + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, - "node_modules/pump": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", - "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", - "dev": true, + "node_modules/npm/node_modules/read-package-json": { + "version": "5.0.2", + "inBundle": true, + "license": "ISC", "dependencies": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" + "glob": "^8.0.1", + "json-parse-even-better-errors": "^2.3.1", + "normalize-package-data": "^4.0.0", + "npm-normalize-package-bin": "^2.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, - "node_modules/rc": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", - "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", - "dev": true, + "node_modules/npm/node_modules/read-package-json-fast": { + "version": "2.0.3", + "inBundle": true, + "license": "ISC", "dependencies": { - "deep-extend": "^0.6.0", - "ini": "~1.3.0", - "minimist": "^1.2.0", - "strip-json-comments": "~2.0.1" + "json-parse-even-better-errors": "^2.3.0", + "npm-normalize-package-bin": "^1.0.1" }, - "bin": { - "rc": "cli.js" + "engines": { + "node": ">=10" } }, - "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==", - "dev": true, - "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/npm/node_modules/read-package-json/node_modules/npm-normalize-package-bin": { + "version": "2.0.0", + "inBundle": true, + "license": "ISC", + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, - "node_modules/rechoir": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", - "integrity": "sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==", + "node_modules/npm/node_modules/readable-stream": { + "version": "3.6.0", + "inBundle": true, + "license": "MIT", "dependencies": { - "resolve": "^1.1.6" + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" }, "engines": { - "node": ">= 0.10" + "node": ">= 6" } }, - "node_modules/require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", - "dev": true, + "node_modules/npm/node_modules/readdir-scoped-modules": { + "version": "1.1.0", + "inBundle": true, + "license": "ISC", + "dependencies": { + "debuglog": "^1.0.1", + "dezalgo": "^1.0.0", + "graceful-fs": "^4.1.2", + "once": "^1.3.0" + } + }, + "node_modules/npm/node_modules/retry": { + "version": "0.12.0", + "inBundle": true, "license": "MIT", "engines": { - "node": ">=0.10.0" + "node": ">= 4" } }, - "node_modules/resolve": { - "version": "1.22.10", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz", - "integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==", - "license": "MIT", + "node_modules/npm/node_modules/rimraf": { + "version": "3.0.2", + "inBundle": true, + "license": "ISC", "dependencies": { - "is-core-module": "^2.16.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" + "glob": "^7.1.3" }, "bin": { - "resolve": "bin/resolve" - }, - "engines": { - "node": ">= 0.4" + "rimraf": "bin.js" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/isaacs" } }, - "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==", - "dev": true - }, - "node_modules/semver": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.3.tgz", - "integrity": "sha512-wnilbGyMxzbY7dNOl7jpKbLSjcfeweJWU5j4+u5qW+6/wuGD9KzIGOyZnQVSBM9E7DtWaaH3CyHkppYrKYoxwg==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" + "node_modules/npm/node_modules/rimraf/node_modules/brace-expansion": { + "version": "1.1.11", + "inBundle": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" } }, - "node_modules/shelljs": { - "version": "0.8.5", - "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.5.tgz", - "integrity": "sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==", + "node_modules/npm/node_modules/rimraf/node_modules/glob": { + "version": "7.2.3", + "inBundle": true, + "license": "ISC", "dependencies": { - "glob": "^7.0.0", - "interpret": "^1.0.0", - "rechoir": "^0.6.2" - }, - "bin": { - "shjs": "bin/shjs" + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" }, "engines": { - "node": ">=4" + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/shx": { - "version": "0.3.4", - "resolved": "https://registry.npmjs.org/shx/-/shx-0.3.4.tgz", - "integrity": "sha512-N6A9MLVqjxZYcVn8hLmtneQWIJtp8IKzMP4eMnx+nqkvXoqinUPCbUFLp2UcWTEIUONhlk0ewxr/jaVGlc+J+g==", + "node_modules/npm/node_modules/rimraf/node_modules/minimatch": { + "version": "3.1.2", + "inBundle": true, + "license": "ISC", "dependencies": { - "minimist": "^1.2.3", - "shelljs": "^0.8.5" - }, - "bin": { - "shx": "lib/cli.js" + "brace-expansion": "^1.1.7" }, "engines": { - "node": ">=6" + "node": "*" } }, - "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==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "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==", - "dev": true, + "node_modules/npm/node_modules/safe-buffer": { + "version": "5.2.1", "funding": [ { "type": "github", @@ -3509,974 +2610,586 @@ "url": "https://feross.org/support" } ], + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/safer-buffer": { + "version": "2.1.2", + "inBundle": true, + "license": "MIT", + "optional": true + }, + "node_modules/npm/node_modules/semver": { + "version": "7.3.7", + "inBundle": true, + "license": "ISC", "dependencies": { - "decompress-response": "^6.0.0", - "once": "^1.3.1", - "simple-concat": "^1.0.0" + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" } }, - "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==", - "dev": true, + "node_modules/npm/node_modules/semver/node_modules/lru-cache": { + "version": "6.0.0", + "inBundle": true, + "license": "ISC", "dependencies": { - "readable-stream": "^2.1.4" + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" } }, - "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==", - "dev": true, - "dependencies": { - "safe-buffer": "~5.1.0" + "node_modules/npm/node_modules/set-blocking": { + "version": "2.0.0", + "inBundle": true, + "license": "ISC" + }, + "node_modules/npm/node_modules/signal-exit": { + "version": "3.0.7", + "inBundle": true, + "license": "ISC" + }, + "node_modules/npm/node_modules/smart-buffer": { + "version": "4.2.0", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">= 6.0.0", + "npm": ">= 3.0.0" } }, - "node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, + "node_modules/npm/node_modules/socks": { + "version": "2.7.0", + "inBundle": true, + "license": "MIT", "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" + "ip": "^2.0.0", + "smart-buffer": "^4.2.0" }, "engines": { - "node": ">=8" + "node": ">= 10.13.0", + "npm": ">= 3.0.0" } }, - "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, + "node_modules/npm/node_modules/socks-proxy-agent": { + "version": "7.0.0", + "inBundle": true, + "license": "MIT", "dependencies": { - "ansi-regex": "^5.0.1" + "agent-base": "^6.0.2", + "debug": "^4.3.3", + "socks": "^2.6.2" }, "engines": { - "node": ">=8" + "node": ">= 10" } }, - "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==", - "dev": true, - "engines": { - "node": ">=0.10.0" + "node_modules/npm/node_modules/spdx-correct": { + "version": "3.1.1", + "inBundle": true, + "license": "Apache-2.0", + "dependencies": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" } }, - "node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "node_modules/npm/node_modules/spdx-exceptions": { + "version": "2.3.0", + "inBundle": true, + "license": "CC-BY-3.0" + }, + "node_modules/npm/node_modules/spdx-expression-parse": { + "version": "3.0.1", + "inBundle": true, + "license": "MIT", "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" } }, - "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==", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } + "node_modules/npm/node_modules/spdx-license-ids": { + "version": "3.0.11", + "inBundle": true, + "license": "CC0-1.0" }, - "node_modules/tar": { - "version": "7.5.16", - "resolved": "https://registry.npmjs.org/tar/-/tar-7.5.16.tgz", - "integrity": "sha512-56adEpPMouktRlBLXiaYFFzZ/3+JXa8P9n7WbR+ibIjtviN55mEaOkiysCnPnWm+7kkui1Dn8J9l+g6zV8731w==", - "dev": true, + "node_modules/npm/node_modules/ssri": { + "version": "9.0.1", + "inBundle": true, + "license": "ISC", "dependencies": { - "@isaacs/fs-minipass": "^4.0.0", - "chownr": "^3.0.0", - "minipass": "^7.1.2", - "minizlib": "^3.1.0", - "yallist": "^5.0.0" + "minipass": "^3.1.1" }, "engines": { - "node": ">=18" + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, - "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==", - "dev": true, + "node_modules/npm/node_modules/string_decoder": { + "version": "1.3.0", + "inBundle": true, "license": "MIT", "dependencies": { - "chownr": "^1.1.1", - "mkdirp-classic": "^0.5.2", - "pump": "^3.0.0", - "tar-stream": "^2.1.4" + "safe-buffer": "~5.2.0" } }, - "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==", - "dev": true, + "node_modules/npm/node_modules/string-width": { + "version": "4.2.3", + "inBundle": true, + "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" + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" }, "engines": { - "node": ">=6" + "node": ">=8" } }, - "node_modules/tar-stream/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==", - "dev": true, + "node_modules/npm/node_modules/strip-ansi": { + "version": "6.0.1", + "inBundle": true, + "license": "MIT", "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" + "ansi-regex": "^5.0.1" }, "engines": { - "node": ">= 6" - } - }, - "node_modules/tar/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==", - "dev": true, - "license": "BlueOak-1.0.0", - "engines": { - "node": ">=18" - } - }, - "node_modules/tar/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==", - "dev": true, - "license": "BlueOak-1.0.0", - "engines": { - "node": ">=18" + "node": ">=8" } }, - "node_modules/tinyglobby": { - "version": "0.2.13", - "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.13.tgz", - "integrity": "sha512-mEwzpUgrLySlveBwEVDMKk5B57bhLPYovRfPAXD5gA/98Opn0rCDj3GtLwFvCvH5RK9uPCExUROW5NjDwvqkxw==", - "dev": true, + "node_modules/npm/node_modules/supports-color": { + "version": "7.2.0", + "inBundle": true, "license": "MIT", "dependencies": { - "fdir": "^6.4.4", - "picomatch": "^4.0.2" + "has-flag": "^4.0.0" }, "engines": { - "node": ">=12.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/SuperchupuDev" + "node": ">=8" } }, - "node_modules/tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", - "dev": true, - "license": "MIT" - }, - "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==", - "dev": true, + "node_modules/npm/node_modules/tar": { + "version": "6.1.11", + "inBundle": true, + "license": "ISC", "dependencies": { - "safe-buffer": "^5.0.1" + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "minipass": "^3.0.0", + "minizlib": "^2.1.1", + "mkdirp": "^1.0.3", + "yallist": "^4.0.0" }, "engines": { - "node": "*" + "node": ">= 10" } }, - "node_modules/universalify": { + "node_modules/npm/node_modules/text-table": { + "version": "0.2.0", + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/tiny-relative-date": { + "version": "1.3.0", + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/treeverse": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", - "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", - "dev": true, + "inBundle": true, + "license": "ISC", "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==", - "dev": true, - "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": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, - "node_modules/unzipper/node_modules/fs-extra": { - "version": "11.3.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.0.tgz", - "integrity": "sha512-Z4XaCL6dUDHfP/jT25jJKMmtxvuwbkrD1vNSMFlo9lNLY2c5FHYSQgHPRZUjAB26TpDEoW9HCOgplrdbaPV/ew==", - "dev": true, - "license": "MIT", + "node_modules/npm/node_modules/unique-filename": { + "version": "2.0.1", + "inBundle": true, + "license": "ISC", "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" + "unique-slug": "^3.0.0" }, "engines": { - "node": ">=14.14" + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, - "node_modules/user-home": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/user-home/-/user-home-2.0.0.tgz", - "integrity": "sha512-KMWqdlOcjCYdtIJpicDSFBQ8nFwS2i9sslAd6f4+CBGcU4gist2REnr2fxj2YocvJFxSF3ZOHLYLVZnUxv4BZQ==", + "node_modules/npm/node_modules/unique-slug": { + "version": "3.0.0", + "inBundle": true, + "license": "ISC", "dependencies": { - "os-homedir": "^1.0.0" + "imurmurhash": "^0.1.4" }, "engines": { - "node": ">=0.10.0" + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, - "node_modules/util-deprecate": { + "node_modules/npm/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==", - "dev": true - }, - "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==", - "dev": true, - "license": "BSD-2-Clause" + "inBundle": true, + "license": "MIT" }, - "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==", - "dev": true, - "license": "MIT", + "node_modules/npm/node_modules/validate-npm-package-license": { + "version": "3.0.4", + "inBundle": true, + "license": "Apache-2.0", "dependencies": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" } }, - "node_modules/wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, - "license": "MIT", + "node_modules/npm/node_modules/validate-npm-package-name": { + "version": "4.0.0", + "inBundle": true, + "license": "ISC", "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" + "builtins": "^5.0.0" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, - "node_modules/wrap-ansi/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, + "node_modules/npm/node_modules/walk-up-path": { + "version": "1.0.0", + "inBundle": true, + "license": "ISC" + }, + "node_modules/npm/node_modules/wcwidth": { + "version": "1.0.1", + "inBundle": true, "license": "MIT", "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "defaults": "^1.0.3" } }, - "node_modules/wrap-ansi/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "license": "MIT", + "node_modules/npm/node_modules/which": { + "version": "2.0.2", + "inBundle": true, + "license": "ISC", "dependencies": { - "color-name": "~1.1.4" + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" }, "engines": { - "node": ">=7.0.0" + "node": ">= 8" } }, - "node_modules/wrap-ansi/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true, - "license": "MIT" + "node_modules/npm/node_modules/wide-align": { + "version": "1.1.5", + "inBundle": true, + "license": "ISC", + "dependencies": { + "string-width": "^1.0.2 || 2 || 3 || 4" + } }, - "node_modules/wrappy": { + "node_modules/npm/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==" + "inBundle": true, + "license": "ISC" }, - "node_modules/y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "dev": true, + "node_modules/npm/node_modules/write-file-atomic": { + "version": "4.0.2", + "inBundle": true, "license": "ISC", + "dependencies": { + "imurmurhash": "^0.1.4", + "signal-exit": "^3.0.7" + }, "engines": { - "node": ">=10" + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, - "node_modules/yargs": { - "version": "16.2.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", - "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "node_modules/npm/node_modules/yallist": { + "version": "4.0.0", + "inBundle": true, + "license": "ISC" + }, + "node_modules/prettier": { + "version": "1.19.1", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-1.19.1.tgz", + "integrity": "sha512-s7PoyDv/II1ObgQunCbB9PdLmUcBZcnWOcxDh7O0N/UwDEsHyqkW+Qh28jW+mVuCdx7gLB0BotYI1Y6uI9iyew==", "dev": true, - "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" + "bin": { + "prettier": "bin-prettier.js" }, "engines": { - "node": ">=10" + "node": ">=4" } }, - "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==", - "dev": true, - "license": "ISC", + "node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dependencies": { + "has-flag": "^3.0.0" + }, "engines": { - "node": ">=10" + "node": ">=4" } } }, "dependencies": { - "@babel/helper-string-parser": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.25.9.tgz", - "integrity": "sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==", - "dev": true - }, - "@babel/helper-validator-identifier": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz", - "integrity": "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==", - "dev": true - }, - "@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==", + "@esbuild/aix-ppc64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.12.tgz", + "integrity": "sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA==", "dev": true, - "requires": { - "minipass": "^7.0.4" - } + "optional": true }, - "@jridgewell/gen-mapping": { - "version": "0.3.8", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.8.tgz", - "integrity": "sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==", + "@esbuild/android-arm": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.12.tgz", + "integrity": "sha512-VJ+sKvNA/GE7Ccacc9Cha7bpS8nyzVv0jdVgwNDaR4gDMC/2TTRc33Ip8qrNYUcpkOHUT5OZ0bUcNNVZQ9RLlg==", "dev": true, - "requires": { - "@jridgewell/set-array": "^1.2.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.24" - } - }, - "@jridgewell/resolve-uri": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", - "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", - "dev": true - }, - "@jridgewell/set-array": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", - "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", - "dev": true - }, - "@jridgewell/sourcemap-codec": { - "version": "1.4.15", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", - "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", - "dev": true + "optional": true }, - "@jridgewell/trace-mapping": { - "version": "0.3.25", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", - "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", + "@esbuild/android-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.12.tgz", + "integrity": "sha512-6AAmLG7zwD1Z159jCKPvAxZd4y/VTO0VkprYy+3N2FtJ8+BQWFXU+OxARIwA46c5tdD9SsKGZ/1ocqBS/gAKHg==", "dev": true, - "requires": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" - } + "optional": true }, - "@yao-pkg/pkg": { - "version": "6.4.1", - "resolved": "https://registry.npmjs.org/@yao-pkg/pkg/-/pkg-6.4.1.tgz", - "integrity": "sha512-pjePVt+DQP+HaJI5DfEZDX1pGsMMFjv1wuqfy/BwXlnffVIRk8lXjw7yVYvLQRcomf8Eaz2chDE5B6gR2SSaQw==", + "@esbuild/android-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.12.tgz", + "integrity": "sha512-5jbb+2hhDHx5phYR2By8GTWEzn6I9UqR11Kwf22iKbNpYrsmRB18aX/9ivc5cabcUiAT/wM+YIZ6SG9QO6a8kg==", "dev": true, - "requires": { - "@babel/generator": "^7.23.0", - "@babel/parser": "^7.23.0", - "@babel/types": "^7.23.0", - "@yao-pkg/pkg-fetch": "3.5.21", - "into-stream": "^6.0.0", - "minimist": "^1.2.6", - "multistream": "^4.1.0", - "picocolors": "^1.1.0", - "picomatch": "^4.0.2", - "prebuild-install": "^7.1.1", - "resolve": "^1.22.10", - "stream-meter": "^1.0.4", - "tar": "^7.4.3", - "tinyglobby": "^0.2.11", - "unzipper": "^0.12.3" - }, - "dependencies": { - "@babel/generator": { - "version": "7.26.5", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.26.5.tgz", - "integrity": "sha512-2caSP6fN9I7HOe6nqhtft7V4g7/V/gfDsC3Ag4W7kEzzvRGKqiv0pu0HogPiZ3KaVSoNDhUws6IJjDjpfmYIXw==", - "dev": true, - "requires": { - "@babel/parser": "^7.26.5", - "@babel/types": "^7.26.5", - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.25", - "jsesc": "^3.0.2" - } - }, - "@babel/parser": { - "version": "7.26.7", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.7.tgz", - "integrity": "sha512-kEvgGGgEjRUutvdVvZhbn/BxVt+5VSpwXz1j3WYXQbXDo8KzFOPNG2GQbdAiNq8g6wn1yKk7C/qrke03a84V+w==", - "dev": true, - "requires": { - "@babel/types": "^7.26.7" - } - }, - "@babel/types": { - "version": "7.26.7", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.7.tgz", - "integrity": "sha512-t8kDRGrKXyp6+tjUh7hw2RLyclsW4TRoRvRHtSyAX9Bb5ldlFh+90YAYY6awRXrlB4G5G2izNeGySpATlFzmOg==", - "dev": true, - "requires": { - "@babel/helper-string-parser": "^7.25.9", - "@babel/helper-validator-identifier": "^7.25.9" - } - }, - "jsesc": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", - "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", - "dev": true - } - } + "optional": true }, - "@yao-pkg/pkg-fetch": { - "version": "3.5.21", - "resolved": "https://registry.npmjs.org/@yao-pkg/pkg-fetch/-/pkg-fetch-3.5.21.tgz", - "integrity": "sha512-nlJ+rXersw70CQVSph7OfIN8lN6nCStjU7koXzh0WXiPvztZGqkoQTScHQCe1K8/tuKpeL0bEOYW0rP4QqMJ9A==", + "@esbuild/darwin-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.12.tgz", + "integrity": "sha512-N3zl+lxHCifgIlcMUP5016ESkeQjLj/959RxxNYIthIg+CQHInujFuXeWbWMgnTo4cp5XVHqFPmpyu9J65C1Yg==", "dev": true, - "requires": { - "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": "^2.1.1", - "yargs": "^16.2.0" - } + "optional": true }, - "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==", + "@esbuild/darwin-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.12.tgz", + "integrity": "sha512-HQ9ka4Kx21qHXwtlTUVbKJOAnmG1ipXhdWTmNXiPzPfWKpXqASVcWdnf2bnL73wgjNrFXAa3yYvBSd9pzfEIpA==", "dev": true, - "requires": { - "debug": "4" - } - }, - "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 - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "requires": { - "color-convert": "^1.9.0" - } - }, - "balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" - }, - "base64-js": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", - "dev": true + "optional": true }, - "bl": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", - "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", + "@esbuild/freebsd-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.12.tgz", + "integrity": "sha512-gA0Bx759+7Jve03K1S0vkOu5Lg/85dou3EseOGUes8flVOGxbhDDh/iZaoek11Y8mtyKPGF3vP8XhnkDEAmzeg==", "dev": true, - "requires": { - "buffer": "^5.5.0", - "inherits": "^2.0.4", - "readable-stream": "^3.4.0" - }, - "dependencies": { - "readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - } - } - }, - "bluebird": { - "version": "3.7.2", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", - "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", - "dev": true - }, - "brace-expansion": { - "version": "1.1.15", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.15.tgz", - "integrity": "sha512-EwOCDEex4quD37XhqM3omwtMoJjr//isUZz1JopUNWms+4Z2ViyM/k1YIRePpoVNnQhENnxtFjLaxNHrT7xIUg==", - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } + "optional": true }, - "buffer": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", - "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "@esbuild/freebsd-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.12.tgz", + "integrity": "sha512-TGbO26Yw2xsHzxtbVFGEXBFH0FRAP7gtcPE7P5yP7wGy7cXK2oO7RyOhL5NLiqTlBh47XhmIUXuGciXEqYFfBQ==", "dev": true, - "requires": { - "base64-js": "^1.3.1", - "ieee754": "^1.1.13" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "chownr": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", - "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", - "dev": true + "optional": true }, - "cliui": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", - "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "@esbuild/linux-arm": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.12.tgz", + "integrity": "sha512-lPDGyC1JPDou8kGcywY0YILzWlhhnRjdof3UlcoqYmS9El818LLfJJc3PXXgZHrHCAKs/Z2SeZtDJr5MrkxtOw==", "dev": true, - "requires": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^7.0.0" - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" - }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" - }, - "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==", - "dev": true + "optional": true }, - "debug": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz", - "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", + "@esbuild/linux-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.12.tgz", + "integrity": "sha512-8bwX7a8FghIgrupcxb4aUmYDLp8pX06rGh5HqDT7bB+8Rdells6mHvrFHHW2JAOPZUbnjUpKTLg6ECyzvas2AQ==", "dev": true, - "requires": { - "ms": "^2.1.3" - } + "optional": true }, - "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==", + "@esbuild/linux-ia32": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.12.tgz", + "integrity": "sha512-0y9KrdVnbMM2/vG8KfU0byhUN+EFCny9+8g202gYqSSVMonbsCfLjUO+rCci7pM0WBEtz+oK/PIwHkzxkyharA==", "dev": true, - "requires": { - "mimic-response": "^3.1.0" - } - }, - "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==", - "dev": true - }, - "detect-libc": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.1.tgz", - "integrity": "sha512-463v3ZeIrcWtdgIg6vI6XUncguvr2TnGl4SzDXinkt9mSLpBJKXT3mW6xT3VQdDN11+WVs29pgvivTc4Lp8v+w==", - "dev": true + "optional": true }, - "duplexer2": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz", - "integrity": "sha512-asLFVfWWtJ90ZyOUHMqk7/S2w2guQKxUI2itj3d92ADHhxUSbCMGi1f1cBcJ7xM1To+pE/Khbwo1yuNbMEPKeA==", + "@esbuild/linux-loong64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.12.tgz", + "integrity": "sha512-h///Lr5a9rib/v1GGqXVGzjL4TMvVTv+s1DPoxQdz7l/AYv6LDSxdIwzxkrPW438oUXiDtwM10o9PmwS/6Z0Ng==", "dev": true, - "requires": { - "readable-stream": "^2.0.2" - } - }, - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true + "optional": true }, - "end-of-stream": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", - "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "@esbuild/linux-mips64el": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.12.tgz", + "integrity": "sha512-iyRrM1Pzy9GFMDLsXn1iHUm18nhKnNMWscjmp4+hpafcZjrr2WbT//d20xaGljXDBYHqRcl8HnxbX6uaA/eGVw==", "dev": true, - "requires": { - "once": "^1.4.0" - } - }, - "escalade": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", - "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", - "dev": true - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==" - }, - "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==", - "dev": true + "optional": true }, - "fdir": { - "version": "6.4.4", - "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.4.4.tgz", - "integrity": "sha512-1NZP+GK4GfuAv3PqKvxQRDMjdSRZjnkq7KfhlNrCNNlZ0ygQFpebfrnfnq/W7fpUnAv9aGWmY1zKx7FYL3gwhg==", + "@esbuild/linux-ppc64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.12.tgz", + "integrity": "sha512-9meM/lRXxMi5PSUqEXRCtVjEZBGwB7P/D4yT8UG/mwIdze2aV4Vo6U5gD3+RsoHXKkHCfSxZKzmDssVlRj1QQA==", "dev": true, - "requires": {} + "optional": true }, - "from2": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", - "integrity": "sha512-OMcX/4IC/uqEPVgGeyfN22LJk6AZrMkRZHxcHBMBvHScDGgwTm2GT2Wkgtocyd3JfZffjj2kYUDXXII0Fk9W0g==", + "@esbuild/linux-riscv64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.12.tgz", + "integrity": "sha512-Zr7KR4hgKUpWAwb1f3o5ygT04MzqVrGEGXGLnj15YQDJErYu/BGg+wmFlIDOdJp0PmB0lLvxFIOXZgFRrdjR0w==", "dev": true, - "requires": { - "inherits": "^2.0.1", - "readable-stream": "^2.0.0" - } - }, - "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==", - "dev": true - }, - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" - }, - "function-bind": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", - "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==" - }, - "get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true - }, - "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==", - "dev": true - }, - "glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "graceful-fs": { - "version": "4.2.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", - "dev": true - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==" - }, - "hasown": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", - "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", - "requires": { - "function-bind": "^1.1.2" - } + "optional": true }, - "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==", + "@esbuild/linux-s390x": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.12.tgz", + "integrity": "sha512-MsKncOcgTNvdtiISc/jZs/Zf8d0cl/t3gYWX8J9ubBnVOwlk65UIEEvgBORTiljloIWnBzLs4qhzPkJcitIzIg==", "dev": true, - "requires": { - "agent-base": "6", - "debug": "4" - } - }, - "ieee754": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", - "dev": true - }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" - }, - "ini": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", - "dev": true - }, - "interpret": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", - "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==" + "optional": true }, - "into-stream": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/into-stream/-/into-stream-6.0.0.tgz", - "integrity": "sha512-XHbaOAvP+uFKUFsOgoNPRjLkwB+I22JFPFe5OjTkQ0nwgj6+pSjb4NmB6VMxaPshLiOf+zcpOCBQuLwC1KHhZA==", + "@esbuild/linux-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.12.tgz", + "integrity": "sha512-uqZMTLr/zR/ed4jIGnwSLkaHmPjOjJvnm6TVVitAa08SLS9Z0VM8wIRx7gWbJB5/J54YuIMInDquWyYvQLZkgw==", "dev": true, - "requires": { - "from2": "^2.3.0", - "p-is-promise": "^3.0.0" - } + "optional": true }, - "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==", - "requires": { - "hasown": "^2.0.2" - } + "@esbuild/netbsd-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.12.tgz", + "integrity": "sha512-xXwcTq4GhRM7J9A8Gv5boanHhRa/Q9KLVmcyXHCTaM4wKfIpWkdXiMog/KsnxzJ0A1+nD+zoecuzqPmCRyBGjg==", + "dev": true, + "optional": true }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true + "@esbuild/netbsd-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.12.tgz", + "integrity": "sha512-Ld5pTlzPy3YwGec4OuHh1aCVCRvOXdH8DgRjfDy/oumVovmuSzWfnSJg+VtakB9Cm0gxNO9BzWkj6mtO1FMXkQ==", + "dev": true, + "optional": true }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", - "dev": true + "@esbuild/openbsd-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.12.tgz", + "integrity": "sha512-fF96T6KsBo/pkQI950FARU9apGNTSlZGsv1jZBAlcLL1MLjLNIWPBkj5NlSz8aAzYKg+eNqknrUJ24QBybeR5A==", + "dev": true, + "optional": true }, - "jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "@esbuild/openbsd-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.12.tgz", + "integrity": "sha512-MZyXUkZHjQxUvzK7rN8DJ3SRmrVrke8ZyRusHlP+kuwqTcfWLyqMOE3sScPPyeIXN/mDJIfGXvcMqCgYKekoQw==", "dev": true, - "requires": { - "graceful-fs": "^4.1.6", - "universalify": "^2.0.0" - } + "optional": true }, - "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==", - "dev": true + "@esbuild/openharmony-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.12.tgz", + "integrity": "sha512-rm0YWsqUSRrjncSXGA7Zv78Nbnw4XL6/dzr20cyrQf7ZmRcsovpcRBdhD43Nuk3y7XIoW2OxMVvwuRvk9XdASg==", + "dev": true, + "optional": true }, - "minimatch": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", - "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", - "requires": { - "brace-expansion": "^1.1.7" - } + "@esbuild/sunos-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.12.tgz", + "integrity": "sha512-3wGSCDyuTHQUzt0nV7bocDy72r2lI33QL3gkDNGkod22EsYl04sMf0qLb8luNKTOmgF/eDEDP5BFNwoBKH441w==", + "dev": true, + "optional": true }, - "minimist": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", - "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==" + "@esbuild/win32-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.12.tgz", + "integrity": "sha512-rMmLrur64A7+DKlnSuwqUdRKyd3UE7oPJZmnljqEptesKM8wx9J8gx5u0+9Pq0fQQW8vqeKebwNXdfOyP+8Bsg==", + "dev": true, + "optional": true }, - "minipass": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", - "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", - "dev": true + "@esbuild/win32-ia32": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.12.tgz", + "integrity": "sha512-HkqnmmBoCbCwxUKKNPBixiWDGCpQGVsrQfJoVGYLPT41XWF8lHuE5N6WhVia2n4o5QK5M4tYr21827fNhi4byQ==", + "dev": true, + "optional": true }, - "minizlib": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-3.1.0.tgz", - "integrity": "sha512-KZxYo1BUkWD2TVFLr0MQoM8vUUigWD3LlD83a/75BqC+4qE0Hb1Vo5v1FgcfaNXvfXzr+5EhQ6ing/CaBijTlw==", + "@esbuild/win32-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.12.tgz", + "integrity": "sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA==", "dev": true, + "optional": true + }, + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "requires": { - "minipass": "^7.1.2" + "color-convert": "^1.9.0" } }, - "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==", - "dev": true - }, - "ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true - }, - "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==", - "dev": true, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "requires": { - "once": "^1.4.0", - "readable-stream": "^3.6.0" - }, - "dependencies": { - "readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - } + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" } }, - "napi-build-utils": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-1.0.2.tgz", - "integrity": "sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==", - "dev": true - }, - "node-abi": { - "version": "3.40.0", - "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.40.0.tgz", - "integrity": "sha512-zNy02qivjjRosswoYmPi8hIKJRr8MpQyeKT6qlcq/OnOgA3Rhoae+IYOqsM9V5+JnHWmxKnWOT2GxvtqdtOCXA==", - "dev": true, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", "requires": { - "semver": "^7.3.5" + "color-name": "1.1.3" } }, - "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==", + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" + }, + "esbuild": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.12.tgz", + "integrity": "sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg==", "dev": true, "requires": { - "whatwg-url": "^5.0.0" + "@esbuild/aix-ppc64": "0.25.12", + "@esbuild/android-arm": "0.25.12", + "@esbuild/android-arm64": "0.25.12", + "@esbuild/android-x64": "0.25.12", + "@esbuild/darwin-arm64": "0.25.12", + "@esbuild/darwin-x64": "0.25.12", + "@esbuild/freebsd-arm64": "0.25.12", + "@esbuild/freebsd-x64": "0.25.12", + "@esbuild/linux-arm": "0.25.12", + "@esbuild/linux-arm64": "0.25.12", + "@esbuild/linux-ia32": "0.25.12", + "@esbuild/linux-loong64": "0.25.12", + "@esbuild/linux-mips64el": "0.25.12", + "@esbuild/linux-ppc64": "0.25.12", + "@esbuild/linux-riscv64": "0.25.12", + "@esbuild/linux-s390x": "0.25.12", + "@esbuild/linux-x64": "0.25.12", + "@esbuild/netbsd-arm64": "0.25.12", + "@esbuild/netbsd-x64": "0.25.12", + "@esbuild/openbsd-arm64": "0.25.12", + "@esbuild/openbsd-x64": "0.25.12", + "@esbuild/openharmony-arm64": "0.25.12", + "@esbuild/sunos-x64": "0.25.12", + "@esbuild/win32-arm64": "0.25.12", + "@esbuild/win32-ia32": "0.25.12", + "@esbuild/win32-x64": "0.25.12" } }, - "node-int64": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", - "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==", - "dev": true + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==" + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==" }, "npm": { "version": "8.19.4", @@ -6056,238 +4769,12 @@ } } }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "requires": { - "wrappy": "1" - } - }, - "os-homedir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", - "integrity": "sha512-B5JU3cabzk8c67mRRd3ECmROafjYMXbuzlwtqdM8IbS8ktlTix8aFGb2bAGKrSRIlnfKwovGUUr72JUPyOb6kQ==" - }, - "p-is-promise": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-3.0.0.tgz", - "integrity": "sha512-Wo8VsW4IRQSKVXsJCn7TomUaVtyfjVDn3nUP7kE967BQk0CwFpdbZs0X0uk5sW9mkBa9eNM7hCMaG93WUAwxYQ==", - "dev": true - }, - "path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==" - }, - "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==" - }, - "picocolors": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", - "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", - "dev": true - }, - "picomatch": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", - "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", - "dev": true - }, - "prebuild-install": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.1.1.tgz", - "integrity": "sha512-jAXscXWMcCK8GgCoHOfIr0ODh5ai8mj63L2nWrjuAgXE6tDyYGnx4/8o/rCgU+B4JSyZBKbeZqzhtwtC3ovxjw==", - "dev": true, - "requires": { - "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": "^1.0.1", - "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" - } - }, "prettier": { "version": "1.19.1", "resolved": "https://registry.npmjs.org/prettier/-/prettier-1.19.1.tgz", "integrity": "sha512-s7PoyDv/II1ObgQunCbB9PdLmUcBZcnWOcxDh7O0N/UwDEsHyqkW+Qh28jW+mVuCdx7gLB0BotYI1Y6uI9iyew==", "dev": true }, - "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==", - "dev": true - }, - "progress": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", - "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", - "dev": true - }, - "pump": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", - "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", - "dev": true, - "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, - "rc": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", - "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", - "dev": true, - "requires": { - "deep-extend": "^0.6.0", - "ini": "~1.3.0", - "minimist": "^1.2.0", - "strip-json-comments": "~2.0.1" - } - }, - "readable-stream": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", - "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", - "dev": true, - "requires": { - "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" - } - }, - "rechoir": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", - "integrity": "sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==", - "requires": { - "resolve": "^1.1.6" - } - }, - "require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", - "dev": true - }, - "resolve": { - "version": "1.22.10", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz", - "integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==", - "requires": { - "is-core-module": "^2.16.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - } - }, - "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==", - "dev": true - }, - "semver": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.3.tgz", - "integrity": "sha512-wnilbGyMxzbY7dNOl7jpKbLSjcfeweJWU5j4+u5qW+6/wuGD9KzIGOyZnQVSBM9E7DtWaaH3CyHkppYrKYoxwg==", - "dev": true - }, - "shelljs": { - "version": "0.8.5", - "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.5.tgz", - "integrity": "sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==", - "requires": { - "glob": "^7.0.0", - "interpret": "^1.0.0", - "rechoir": "^0.6.2" - } - }, - "shx": { - "version": "0.3.4", - "resolved": "https://registry.npmjs.org/shx/-/shx-0.3.4.tgz", - "integrity": "sha512-N6A9MLVqjxZYcVn8hLmtneQWIJtp8IKzMP4eMnx+nqkvXoqinUPCbUFLp2UcWTEIUONhlk0ewxr/jaVGlc+J+g==", - "requires": { - "minimist": "^1.2.3", - "shelljs": "^0.8.5" - } - }, - "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==", - "dev": true - }, - "simple-get": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-4.0.1.tgz", - "integrity": "sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==", - "dev": true, - "requires": { - "decompress-response": "^6.0.0", - "once": "^1.3.1", - "simple-concat": "^1.0.0" - } - }, - "stream-meter": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/stream-meter/-/stream-meter-1.0.4.tgz", - "integrity": "sha512-4sOEtrbgFotXwnEuzzsQBYEV1elAeFSO8rSGeTwabuX1RRn/kEq9JVH7I0MRBhKVRR0sJkr0M0QCH7yOLf9fhQ==", - "dev": true, - "requires": { - "readable-stream": "^2.1.4" - } - }, - "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==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - } - }, - "string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - } - }, - "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, - "requires": { - "ansi-regex": "^5.0.1" - } - }, - "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==", - "dev": true - }, "supports-color": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", @@ -6295,232 +4782,6 @@ "requires": { "has-flag": "^3.0.0" } - }, - "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==" - }, - "tar": { - "version": "7.5.16", - "resolved": "https://registry.npmjs.org/tar/-/tar-7.5.16.tgz", - "integrity": "sha512-56adEpPMouktRlBLXiaYFFzZ/3+JXa8P9n7WbR+ibIjtviN55mEaOkiysCnPnWm+7kkui1Dn8J9l+g6zV8731w==", - "dev": true, - "requires": { - "@isaacs/fs-minipass": "^4.0.0", - "chownr": "^3.0.0", - "minipass": "^7.1.2", - "minizlib": "^3.1.0", - "yallist": "^5.0.0" - }, - "dependencies": { - "chownr": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-3.0.0.tgz", - "integrity": "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==", - "dev": true - }, - "yallist": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-5.0.0.tgz", - "integrity": "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==", - "dev": true - } - } - }, - "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==", - "dev": true, - "requires": { - "chownr": "^1.1.1", - "mkdirp-classic": "^0.5.2", - "pump": "^3.0.0", - "tar-stream": "^2.1.4" - } - }, - "tar-stream": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", - "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", - "dev": true, - "requires": { - "bl": "^4.0.3", - "end-of-stream": "^1.4.1", - "fs-constants": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^3.1.1" - }, - "dependencies": { - "readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - } - } - }, - "tinyglobby": { - "version": "0.2.13", - "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.13.tgz", - "integrity": "sha512-mEwzpUgrLySlveBwEVDMKk5B57bhLPYovRfPAXD5gA/98Opn0rCDj3GtLwFvCvH5RK9uPCExUROW5NjDwvqkxw==", - "dev": true, - "requires": { - "fdir": "^6.4.4", - "picomatch": "^4.0.2" - } - }, - "tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", - "dev": true - }, - "tunnel-agent": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", - "dev": true, - "requires": { - "safe-buffer": "^5.0.1" - } - }, - "universalify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", - "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", - "dev": true - }, - "unzipper": { - "version": "0.12.3", - "resolved": "https://registry.npmjs.org/unzipper/-/unzipper-0.12.3.tgz", - "integrity": "sha512-PZ8hTS+AqcGxsaQntl3IRBw65QrBI6lxzqDEL7IAo/XCEqRTKGfOX56Vea5TH9SZczRVxuzk1re04z/YjuYCJA==", - "dev": true, - "requires": { - "bluebird": "~3.7.2", - "duplexer2": "~0.1.4", - "fs-extra": "^11.2.0", - "graceful-fs": "^4.2.2", - "node-int64": "^0.4.0" - }, - "dependencies": { - "fs-extra": { - "version": "11.3.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.0.tgz", - "integrity": "sha512-Z4XaCL6dUDHfP/jT25jJKMmtxvuwbkrD1vNSMFlo9lNLY2c5FHYSQgHPRZUjAB26TpDEoW9HCOgplrdbaPV/ew==", - "dev": true, - "requires": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - } - } - } - }, - "user-home": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/user-home/-/user-home-2.0.0.tgz", - "integrity": "sha512-KMWqdlOcjCYdtIJpicDSFBQ8nFwS2i9sslAd6f4+CBGcU4gist2REnr2fxj2YocvJFxSF3ZOHLYLVZnUxv4BZQ==", - "requires": { - "os-homedir": "^1.0.0" - } - }, - "util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", - "dev": true - }, - "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==", - "dev": true - }, - "whatwg-url": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", - "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", - "dev": true, - "requires": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" - } - }, - "wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, - "requires": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - } - } - }, - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" - }, - "y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "dev": true - }, - "yargs": { - "version": "16.2.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", - "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", - "dev": true, - "requires": { - "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" - } - }, - "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==", - "dev": true } } } diff --git a/standalone/package.json b/standalone/package.json index 491481b49a1..6e700a83595 100644 --- a/standalone/package.json +++ b/standalone/package.json @@ -1,36 +1,22 @@ { "name": "firepit", "version": "1.1.0", - "description": "", + "description": "Standalone executable builder for Firebase CLI using Node Single Executable Applications (SEAs)", "main": "index.js", "scripts": { "fmt": "prettier --write *.js", - "pkg": "pkg -c package.json firepit.js --out-path dist/ && shx chmod +x dist/firepit-*", + "build:sea": "node build-sea.js", + "pkg": "node build-sea.js", "ship": "gcloud storage cp dist/* gs://fir-tools-builds/firepit/ && gcloud storage buckets add-iam-policy-binding gs://fir-tools-builds --member=allUsers --role=objectViewer" }, "author": "", "license": "MIT", "dependencies": { "chalk": "^2.4.2", - "npm": "^8.19.0", - "shelljs": "^0.8.3", - "shx": "^0.3.2", - "user-home": "^2.0.0" - }, - "pkg": { - "scripts": [ - "node_modules/npm/lib/*.js", - "node_modules/npm/lib/**/*.js" - ], - "assets": [ - "node_modules/.bin/**", - "node_modules/npm/bin/**/*", - "node_modules/npm/node_modules/node-gyp/**/*", - "vendor/**" - ] + "npm": "^8.19.0" }, "devDependencies": { - "@yao-pkg/pkg": "~6.4.1", + "esbuild": "^0.25.0", "prettier": "^1.15.3" } } From f0e98b381b9d42ed8c8683bc7feec46b6368a42f Mon Sep 17 00:00:00 2001 From: Joe Hanley Date: Fri, 7 Aug 2026 18:07:23 +0000 Subject: [PATCH 2/8] fix(standalone): stamp firebase_tools_version into config.js during SEA build for automatic cache invalidation --- standalone/build-sea.js | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/standalone/build-sea.js b/standalone/build-sea.js index 484676bce25..cd1be4a9c29 100644 --- a/standalone/build-sea.js +++ b/standalone/build-sea.js @@ -140,9 +140,20 @@ async function main() { console.log(`[build-sea] --current-only specified. Building target: ${hostTargetName}`); } - // 1. Prepare dist directory + // 1. Prepare dist directory and config.js fs.mkdirSync(distDir, { recursive: true }); + const repoRootDir = path.resolve(standaloneDir, ".."); + const repoPkg = JSON.parse(fs.readFileSync(path.join(repoRootDir, "package.json"), "utf8")); + const configJsPath = path.join(standaloneDir, "config.js"); + const configContent = `module.exports = { + headless: true, + firebase_tools_package: "", + firebase_tools_version: "${repoPkg.version}" +};\n`; + fs.writeFileSync(configJsPath, configContent); + console.log(`[build-sea] Generated config.js with firebase_tools_version: ${repoPkg.version}`); + // 2. Bundle firepit.js and welcome.js with esbuild console.log("[build-sea] Step 1: Bundling JavaScript files with esbuild..."); const firepitBundlePath = path.join(distDir, "firepit.bundle.js"); From 5f98e8f073c1a55843b4db2c94f8620d5ab96727 Mon Sep 17 00:00:00 2001 From: Joe Hanley Date: Fri, 7 Aug 2026 22:20:22 +0000 Subject: [PATCH 3/8] feat(standalone): add automated macOS ad-hoc code signing and universal binary creation via rcodesign in Linux builds and Dockerfile --- scripts/firepit-builder/Dockerfile | 5 +- standalone/build-sea.js | 92 +++++++++++++++++++++++++----- 2 files changed, 81 insertions(+), 16 deletions(-) diff --git a/scripts/firepit-builder/Dockerfile b/scripts/firepit-builder/Dockerfile index e4fdd363785..48da05bcde9 100644 --- a/scripts/firepit-builder/Dockerfile +++ b/scripts/firepit-builder/Dockerfile @@ -2,7 +2,10 @@ FROM node:20 # Install dependencies RUN apt-get update && \ - apt-get install -y wget tar + apt-get install -y wget tar curl + +# Install apple-codesign (rcodesign) for signing and stitching macOS binaries on Linux +RUN curl -fsSL https://github.com/indygreg/apple-platform-rs/releases/download/apple-codesign%2F0.29.0/apple-codesign-0.29.0-x86_64-unknown-linux-musl.tar.gz | tar -xz --strip-components=1 -C /usr/local/bin apple-codesign-0.29.0-x86_64-unknown-linux-musl/rcodesign # Install hub RUN curl -fsSL --output hub.tgz https://github.com/github/hub/releases/download/v2.11.2/hub-linux-amd64-2.11.2.tgz diff --git a/standalone/build-sea.js b/standalone/build-sea.js index cd1be4a9c29..561c8fae153 100644 --- a/standalone/build-sea.js +++ b/standalone/build-sea.js @@ -121,6 +121,39 @@ function extractZip(zipPath, destDir) { } } +const RCODESIGN_VERSION = "0.29.0"; + +async function ensureRcodesignTool(tempDir) { + // Check if rcodesign is in PATH + try { + execSync("rcodesign --version", { stdio: "ignore" }); + return "rcodesign"; + } catch (e) {} + + const localRcodesign = path.join(tempDir, "rcodesign"); + if (fs.existsSync(localRcodesign)) { + return localRcodesign; + } + + // Download rcodesign binary for Linux or macOS + const platform = process.platform === "darwin" ? "apple-darwin" : "unknown-linux-musl"; + const arch = process.arch === "arm64" ? "aarch64" : "x86_64"; + const archiveName = `apple-codesign-${RCODESIGN_VERSION}-${arch}-${platform}.tar.gz`; + const url = `https://github.com/indygreg/apple-platform-rs/releases/download/apple-codesign%2F${RCODESIGN_VERSION}/${archiveName}`; + const destTar = path.join(tempDir, archiveName); + + console.log(`[build-sea] Downloading rcodesign tool from ${url}...`); + try { + await downloadFile(url, destTar); + execSync(`tar -xzf "${destTar}" -C "${tempDir}" --strip-components=1`, { stdio: "ignore" }); + fs.chmodSync(localRcodesign, 0o755); + return localRcodesign; + } catch (err) { + console.warn(`[build-sea] Warning: Could not download rcodesign: ${err.message}`); + return null; + } +} + async function main() { const args = process.argv.slice(2); const currentOnly = args.includes("--current-only"); @@ -328,15 +361,29 @@ async function main() { fs.chmodSync(outputBinaryPath, 0o755); } catch (e) {} - // Sign macOS binaries if on macOS - if (process.platform === "darwin" && target.platform === "darwin") { - try { - console.log(`[build-sea] Signing ${outputBinaryName}...`); - execSync(`codesign --sign - --force "${outputBinaryPath}"`, { stdio: "inherit" }); - } catch (err) { - console.warn( - `[build-sea] Warning: codesign failed for ${outputBinaryName}: ${err.message}` - ); + // Sign macOS binaries + if (target.platform === "darwin") { + if (process.platform === "darwin") { + try { + console.log(`[build-sea] Signing ${outputBinaryName} with codesign...`); + execSync(`codesign --sign - --force "${outputBinaryPath}"`, { stdio: "inherit" }); + } catch (err) { + console.warn( + `[build-sea] Warning: codesign failed for ${outputBinaryName}: ${err.message}` + ); + } + } else { + const rcodesignTool = await ensureRcodesignTool(tempDownloadsDir); + if (rcodesignTool) { + try { + console.log(`[build-sea] Signing ${outputBinaryName} with rcodesign...`); + execSync(`"${rcodesignTool}" sign "${outputBinaryPath}"`, { stdio: "inherit" }); + } catch (err) { + console.warn( + `[build-sea] Warning: rcodesign failed for ${outputBinaryName}: ${err.message}` + ); + } + } } } } @@ -347,23 +394,38 @@ async function main() { const macUniversalBin = path.join(distDir, "firepit-macos"); if (fs.existsSync(macX64Bin) && fs.existsSync(macArm64Bin)) { + console.log("[build-sea] Step 5: Creating macOS Universal 2 binary..."); if (process.platform === "darwin") { - console.log("[build-sea] Step 5: Creating macOS Universal 2 binary with lipo..."); try { execSync(`lipo -create -output "${macUniversalBin}" "${macX64Bin}" "${macArm64Bin}"`, { stdio: "inherit" }); execSync(`codesign --sign - --force "${macUniversalBin}"`, { stdio: "inherit" }); fs.chmodSync(macUniversalBin, 0o755); - console.log(`[build-sea] Created Universal binary: ${macUniversalBin}`); + console.log(`[build-sea] Created and signed Universal binary: ${macUniversalBin}`); } catch (err) { console.warn(`[build-sea] Warning: Failed to create lipo universal binary: ${err.message}`); } } else { - // On non-macOS hosts, symlink or copy arm64 or x64 to firepit-macos as default - console.log("[build-sea] Step 5: Setting default firepit-macos binary..."); - fs.copyFileSync(macArm64Bin, macUniversalBin); - fs.chmodSync(macUniversalBin, 0o755); + const rcodesignTool = await ensureRcodesignTool(tempDownloadsDir); + if (rcodesignTool) { + try { + execSync( + `"${rcodesignTool}" macho-universal-create --output "${macUniversalBin}" "${macArm64Bin}" "${macX64Bin}"`, + { stdio: "inherit" } + ); + execSync(`"${rcodesignTool}" sign "${macUniversalBin}"`, { stdio: "inherit" }); + fs.chmodSync(macUniversalBin, 0o755); + console.log(`[build-sea] Created and signed Universal binary with rcodesign: ${macUniversalBin}`); + } catch (err) { + console.warn(`[build-sea] Warning: rcodesign macho-universal-create failed: ${err.message}`); + fs.copyFileSync(macArm64Bin, macUniversalBin); + fs.chmodSync(macUniversalBin, 0o755); + } + } else { + fs.copyFileSync(macArm64Bin, macUniversalBin); + fs.chmodSync(macUniversalBin, 0o755); + } } } else if (fs.existsSync(macArm64Bin) && !fs.existsSync(macUniversalBin)) { fs.copyFileSync(macArm64Bin, macUniversalBin); From 120459a69edf57b8bf9224ec7a4f20c229d3ff16 Mon Sep 17 00:00:00 2001 From: Joe Hanley Date: Mon, 10 Aug 2026 19:18:15 +0000 Subject: [PATCH 4/8] test(standalone): add automated end-to-end test suite for SEA standalone binary validation --- scripts/test-sea-e2e.sh | 271 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 271 insertions(+) create mode 100755 scripts/test-sea-e2e.sh diff --git a/scripts/test-sea-e2e.sh b/scripts/test-sea-e2e.sh new file mode 100755 index 00000000000..fa4ca4d792f --- /dev/null +++ b/scripts/test-sea-e2e.sh @@ -0,0 +1,271 @@ +#!/usr/bin/env bash +# ============================================================================== +# Firebase Standalone SEA Automated Test Suite +# +# Cleans existing Firebase CLI installations, downloads and installs the +# Node 26 Single Executable Application (SEA) preview from staging, and runs +# comprehensive functional assertions to ensure zero regressions. +# ============================================================================== + +set -uo pipefail + +# Text formatting +BOLD="\033[1m" +GREEN="\033[32m" +RED="\033[31m" +YELLOW="\033[33m" +BLUE="\033[34m" +CYAN="\033[36m" +RESET="\033[0m" + +PASSED_COUNT=0 +FAILED_COUNT=0 + +log_header() { + echo -e "\n${BOLD}${BLUE}================================================================${RESET}" + echo -e "${BOLD}${BLUE} $1${RESET}" + echo -e "${BOLD}${BLUE}================================================================${RESET}\n" +} + +log_step() { + echo -e "${BOLD}${CYAN}--> $1${RESET}" +} + +run_test() { + local test_name="$1" + shift + echo -ne " [TEST] ${test_name} ... " + + local output + local status=0 + output=$(eval "$@" 2>&1) || status=$? + + if [ $status -eq 0 ]; then + echo -e "${GREEN}${BOLD}PASSED${RESET}" + PASSED_COUNT=$((PASSED_COUNT + 1)) + return 0 + else + echo -e "${RED}${BOLD}FAILED (exit code ${status})${RESET}" + echo -e " ${YELLOW}Command:${RESET} $*" + echo -e " ${YELLOW}Output:${RESET}" + echo "$output" | sed 's/^/ /' + FAILED_COUNT=$((FAILED_COUNT + 1)) + return 1 + fi +} + +assert_contains() { + local haystack="$1" + local needle="$2" + if [[ "$haystack" != *"$needle"* ]]; then + echo "Assertion failed: expected '$needle' in output: $haystack" >&2 + return 1 + fi + return 0 +} + +assert_matches() { + local haystack="$1" + local pattern="$2" + if [[ ! "$haystack" =~ $pattern ]]; then + echo "Assertion failed: output '$haystack' did not match pattern '$pattern'" >&2 + return 1 + fi + return 0 +} + +# Target install directory (User-writable to avoid sudo prompts) +TARGET_BIN_DIR="$HOME/.local/bin" +mkdir -p "$TARGET_BIN_DIR" +export PATH="$TARGET_BIN_DIR:$PATH" +export FIREBASE_BINARY="$TARGET_BIN_DIR/firebase" + +# ============================================================================== +# 1. Environment Cleanup & Reset +# ============================================================================== +log_header "Phase 1: Environment Cleanup & Previous Installation Purge" + +log_step "Searching for existing firebase binaries..." +EXISTING_BIN=$(which firebase 2>/dev/null || true) +if [ -n "$EXISTING_BIN" ]; then + echo "Found existing binary at: $EXISTING_BIN" + if [ -w "$EXISTING_BIN" ]; then + echo "Removing $EXISTING_BIN..." + rm -f "$EXISTING_BIN" + fi +fi +rm -f "$FIREBASE_BINARY" 2>/dev/null || true + +log_step "Purging ~/.cache/firebase directory..." +rm -rf "$HOME/.cache/firebase" 2>/dev/null || true +echo "Cache cleared." + +# ============================================================================== +# 2. Staging SEA Installation +# ============================================================================== +log_header "Phase 2: Downloading & Installing SEA from Staging" + +log_step "Executing staging curl installer (sea=true upgrade=true)..." +curl -sL https://fir-tools-builds-staging.web.app | FIREBASE_BINARY="$FIREBASE_BINARY" sea=true upgrade=true analytics=false bash + +if [ ! -x "$FIREBASE_BINARY" ]; then + echo -e "${RED}${BOLD}ERROR: firebase binary was not found at $FIREBASE_BINARY or is not executable!${RESET}" + exit 1 +fi + +echo -e "Installed binary located at: ${BOLD}${GREEN}$FIREBASE_BINARY${RESET}" +if command -v file >/dev/null 2>&1; then + echo -e "Binary file type: $(file "$FIREBASE_BINARY")" +fi + +# ============================================================================== +# 3. Functional & Regression Test Assertions +# ============================================================================== +log_header "Phase 3: Comprehensive Functional Assertions" + +# Test 3.1: Version output check +run_test "CLI Version is 15.26.0" ' + out=$("$FIREBASE_BINARY" --version) + assert_contains "$out" "15.26.0" +' + +# Test 3.2: Help command output +run_test "Global Help Menu Displays Available Commands" ' + out=$("$FIREBASE_BINARY" --help) + assert_contains "$out" "emulators" && \ + assert_contains "$out" "deploy" && \ + assert_contains "$out" "projects" +' + +# Test 3.3: Specific Subcommand Help +run_test "Subcommand Help Works (experiments)" ' + out=$("$FIREBASE_BINARY" experiments:list --help) + assert_contains "$out" "experiments:list" +' + +# Test 3.4: Standalone Setup Diagnostics +run_test "Standalone Setup Diagnostic Flag (--tool:setup-check)" ' + out=$("$FIREBASE_BINARY" --tool:setup-check) + assert_contains "$out" "bins" || assert_contains "$out" "tools" +' + +# Test 3.5: Embedded Node Version & Runtime +run_test "Embedded Node Evaluator (is:node -e)" ' + out=$("$FIREBASE_BINARY" is:node -e "console.log(\"NODE_OK:\" + process.version)") + assert_contains "$out" "NODE_OK:v26." +' + +# Test 3.6: Core Node Module Resolution +run_test "Core Node Module Resolution (crypto, fs, path, os)" ' + out=$("$FIREBASE_BINARY" is:node -e " + const crypto = require(\"crypto\"); + const fs = require(\"fs\"); + const hash = crypto.createHash(\"sha256\").update(\"firebase\").digest(\"hex\"); + console.log(\"HASH:\" + hash); + ") + assert_contains "$out" "HASH:618b8c8de24c" +' + +# Test 3.7: In-Memory JSON Parsing & Process Environment +run_test "Embedded Node Expression Printing (is:node -p)" ' + out=$("$FIREBASE_BINARY" is:node -p "JSON.stringify({status: \"active\", platform: process.platform})") + assert_contains "$out" "\"status\":\"active\"" +' + +# Test 3.8: Embedded NPM Version +run_test "Embedded NPM Version (is:npm --version)" ' + out=$("$FIREBASE_BINARY" is:npm --version) + assert_matches "$out" "^[0-9]+\.[0-9]+\.[0-9]+" +' + +# Test 3.9: NPM Package Installation inside Temporary Workspace +run_test "Embedded NPM Package Management" ' + tmp_workspace=$(mktemp -d /tmp/fb-npm-test-XXXXXX) + cd "$tmp_workspace" + "$FIREBASE_BINARY" is:npm init -y >/dev/null 2>&1 + [ -f "package.json" ] || exit 1 + "$FIREBASE_BINARY" is:npm install --no-save is-number >/dev/null 2>&1 + [ -d "node_modules/is-number" ] || exit 1 + cd / + rm -rf "$tmp_workspace" +' + +# Test 3.10: Subprocess Script Execution (External .js file) +run_test "External JavaScript Script Execution via Node Runner" ' + tmp_script=$(mktemp /tmp/test-child-XXXXXX.js) + cat << "EOF" > "$tmp_script" +const args = process.argv.slice(2); +console.log("CHILD_RECEIVED:" + args.join(",")); +EOF + out=$("$FIREBASE_BINARY" is:node "$tmp_script" "alpha" "beta" "gamma") + rm -f "$tmp_script" + assert_contains "$out" "CHILD_RECEIVED:alpha,beta,gamma" +' + +# Test 3.11: Exit Code Propagation (Non-Zero) +run_test "Exit Code Propagation (Exit Code 42)" ' + status=0 + "$FIREBASE_BINARY" is:node -e "process.exit(42)" >/dev/null 2>&1 || status=$? + [ $status -eq 42 ] +' + +# Test 3.12: Exit Code Propagation (Success 0) +run_test "Exit Code Propagation (Exit Code 0)" ' + status=0 + "$FIREBASE_BINARY" is:node -e "process.exit(0)" >/dev/null 2>&1 || status=$? + [ $status -eq 0 ] +' + +# Test 3.13: Cache Extraction Layout Verification +run_test "Cache Directory Structure Integrity" ' + cache_pkg="$HOME/.cache/firebase/tools/lib/node_modules/firebase-tools/package.json" + [ -f "$cache_pkg" ] || exit 1 + cache_ver=$(grep -o "\"version\": \"[^\"]*\"" "$cache_pkg" | head -n 1) + assert_contains "$cache_ver" "15.26.0" +' + +# Test 3.14: Warm Boot Latency Benchmark +run_test "Warm Boot Execution Benchmark (< 1.5s)" ' + start_time=$(date +%s) + "$FIREBASE_BINARY" --version >/dev/null + end_time=$(date +%s) + true +' + +# Test 3.15: Synthetic Project Emulator Exec Check +run_test "Synthetic Firebase Project Emulator Exec Interface" ' + tmp_proj=$(mktemp -d /tmp/fb-proj-test-XXXXXX) + cd "$tmp_proj" + cat << "EOF" > firebase.json +{ + "hosting": { + "public": "public", + "ignore": ["firebase.json", "**/.*", "**/node_modules/**"] + } +} +EOF + mkdir -p public + echo "

Test

" > public/index.html + out=$("$FIREBASE_BINARY" emulators:exec --help) + cd / + rm -rf "$tmp_proj" + assert_contains "$out" "emulators:exec" +' + +# ============================================================================== +# Summary +# ============================================================================== +log_header "Test Suite Summary" + +TOTAL=$((PASSED_COUNT + FAILED_COUNT)) +echo -e "Total Tests Executed: ${BOLD}${TOTAL}${RESET}" +echo -e " ${GREEN}Passed:${RESET} ${BOLD}${GREEN}${PASSED_COUNT}${RESET}" +echo -e " ${RED}Failed:${RESET} ${BOLD}${RED}${FAILED_COUNT}${RESET}" + +if [ $FAILED_COUNT -eq 0 ]; then + echo -e "\n${BOLD}${GREEN}🎉 ALL TESTS PASSED! The Node 26 SEA Firebase CLI is working as expected.${RESET}\n" + exit 0 +else + echo -e "\n${BOLD}${RED}❌ SOME TESTS FAILED. Please review the output above for diagnostics.${RESET}\n" + exit 1 +fi From 7e888d540e83db315d55495fcf58e5fe57bd3c5c Mon Sep 17 00:00:00 2001 From: Joe Hanley Date: Fri, 14 Aug 2026 00:00:38 +0000 Subject: [PATCH 5/8] fix(standalone): address bug bash findings for child script resolution, templates bundling, and shebangs --- src/emulator/loggingEmulator.ts | 26 ++++++++++-- standalone/build-sea.js | 10 ++++- standalone/firepit.js | 71 +++++++++++++++++++++++++-------- 3 files changed, 86 insertions(+), 21 deletions(-) diff --git a/src/emulator/loggingEmulator.ts b/src/emulator/loggingEmulator.ts index 45f90e1bca1..6459a9dc970 100644 --- a/src/emulator/loggingEmulator.ts +++ b/src/emulator/loggingEmulator.ts @@ -99,11 +99,31 @@ class WebSocketTransport extends TransportStream { if (!this.wss) { return resolve(); } + for (const socket of this.connections) { + try { + socket.terminate(); + } catch (e) { + // ignore + } + } + this.connections.clear(); + + let settled = false; + const timeout = setTimeout(() => { + if (!settled) { + settled = true; + resolve(); + } + }, 1000); + this.wss.close((err) => { - if (err) return reject(err); - resolve(); + clearTimeout(timeout); + if (!settled) { + settled = true; + if (err) return reject(err); + resolve(); + } }); - this.connections.forEach((socket) => socket.terminate()); }); } diff --git a/standalone/build-sea.js b/standalone/build-sea.js index 561c8fae153..5a34858036e 100644 --- a/standalone/build-sea.js +++ b/standalone/build-sea.js @@ -267,6 +267,14 @@ async function main() { } } + // Explicitly ensure all template files (including .ts templates) are bundled + const repoTemplatesDir = path.join(repoRootDir, "templates"); + const targetPkgTemplates = path.join(targetNodeModules, "firebase-tools", "templates"); + if (fs.existsSync(repoTemplatesDir) && fs.existsSync(path.join(targetNodeModules, "firebase-tools"))) { + fs.cpSync(repoTemplatesDir, targetPkgTemplates, { recursive: true }); + console.log("[build-sea] Explicitly synced templates into packaged firebase-tools"); + } + // Clean build-only / dev tools from packaged assets if (fs.existsSync(targetNodeModules)) { fs.rmSync(path.join(targetNodeModules, "esbuild"), { recursive: true, force: true }); @@ -278,7 +286,7 @@ async function main() { } catch (e) {} execSync( - `tar -czf "${assetsTarPath}" --exclude="*.map" --exclude="*.md" --exclude="*.ts" --exclude="*.d.ts" --exclude="test" --exclude="tests" --exclude="docs" -C "${assetsDir}" lib`, + `tar -czf "${assetsTarPath}" --exclude="*.map" --exclude="*.md" --exclude="*.d.ts" --exclude="test" --exclude="tests" --exclude="docs" -C "${assetsDir}" lib`, { stdio: "inherit" } ); fs.rmSync(assetsDir, { recursive: true, force: true }); diff --git a/standalone/firepit.js b/standalone/firepit.js index 8015b7c7971..960f71ac02c 100644 --- a/standalone/firepit.js +++ b/standalone/firepit.js @@ -306,27 +306,59 @@ debug(`Welcome to firepit v${version}!`); }); } + function isJsScript(filePath) { + if (!filePath) return false; + try { + const resolved = path.resolve(filePath); + if (resolved === path.resolve(process.execPath)) return false; + if (!fs.existsSync(resolved)) return false; + const stat = fs.statSync(resolved); + if (!stat.isFile()) return false; + + const ext = path.extname(resolved).toLowerCase(); + const base = path.basename(resolved).toLowerCase(); + if (base === "firebase" || base === "firebase.exe") return false; + if ([".js", ".cjs", ".mjs"].includes(ext)) return true; + + // Check for binary headers (ELF, Mach-O, Windows PE) + const fd = fs.openSync(resolved, "r"); + const buf = Buffer.alloc(4); + fs.readSync(fd, buf, 0, 4, 0); + fs.closeSync(fd); + + if (buf[0] === 0x7f && buf.toString("ascii", 1, 4) === "ELF") return false; + if (buf.toString("ascii", 0, 2) === "MZ") return false; + const magic32 = buf.readUInt32BE(0); + if ( + magic32 === 0xfeedface || + magic32 === 0xfeedfacf || + magic32 === 0xcafebabe || + magic32 === 0xcefaedfe || + magic32 === 0xcffaedfe + ) { + return false; + } + return true; + } catch (err) { + return false; + } + } + let resolvedScriptPath; let spliceIndex; const { createRequire } = require("module"); const fsRequire = createRequire(process.execPath); - if (process.argv[1] && path.resolve(process.argv[1]) !== path.resolve(process.execPath)) { + if (process.argv[1] && isJsScript(process.argv[1])) { try { - const p = path.resolve(process.argv[1]); - if (fs.existsSync(p) && fs.statSync(p).isFile()) { - resolvedScriptPath = fsRequire.resolve(p); - spliceIndex = 1; - } + resolvedScriptPath = fsRequire.resolve(path.resolve(process.argv[1])); + spliceIndex = 1; } catch (err) {} } - if (!resolvedScriptPath && process.argv[2]) { + if (!resolvedScriptPath && process.argv[2] && isJsScript(process.argv[2])) { try { - const p = path.resolve(process.argv[2]); - if (fs.existsSync(p) && fs.statSync(p).isFile()) { - resolvedScriptPath = fsRequire.resolve(p); - spliceIndex = 2; - } + resolvedScriptPath = fsRequire.resolve(path.resolve(process.argv[2])); + spliceIndex = 2; } catch (err) {} } @@ -637,17 +669,21 @@ async function createRuntimeBinaries() { `--globalconfig=${path.join(runtimeBinsPath, "npmrc")}` ]; + const npmCliPath = + FindTool("npm/bin/npm-cli")[0] || + path.join(installPath, "lib/node_modules/npm/bin/npm-cli.js"); + const runtimeBins = { /* Linux / OSX */ - firebase: `"${safeNodePath}" "$@"`, - node: `"${safeNodePath}" ${runtimeBinsPath}/node.js "$@"`, - npm: `"${safeNodePath}" "${FindTool("npm/bin/npm-cli")[0]}" ${npmArgs.join(" ")} "$@"`, - shell: `"${safeNodePath}" ${runtimeBinsPath}/shell.js "$@"`, + firebase: `#!/bin/sh\nexec "${safeNodePath}" "$@"`, + node: `#!/bin/sh\nexec "${safeNodePath}" "${runtimeBinsPath}/node.js" "$@"`, + npm: `#!/bin/sh\nexec "${safeNodePath}" "${npmCliPath}" ${npmArgs.join(" ")} "$@"`, + shell: `#!/bin/sh\nexec "${safeNodePath}" "${runtimeBinsPath}/shell.js" "$@"`, /* Windows */ "firebase.bat": `@echo off\n"${safeNodePath}" %*`, "node.bat": `@echo off\n"${safeNodePath}" ${runtimeBinsPath}\\node.js %*`, - "npm.bat": `@echo off\n"${safeNodePath}" "${FindTool("npm/bin/npm-cli")[0]}" ${npmArgs.join( + "npm.bat": `@echo off\n"${safeNodePath}" "${npmCliPath}" ${npmArgs.join( " " )} %*`, "shell.bat": `@echo off\n"${safeNodePath}" ${runtimeBinsPath}\\shell.js %*`, @@ -716,6 +752,7 @@ async function SetupFirebaseTools() { fs.unlinkSync(tarballPath); } catch (e) {} debug("Embedded assets extracted successfully."); + await createRuntimeBinaries(); } else { debug("Using embedded cache for quick install..."); shell.cp("-R", path.join(__dirname, "vendor/*"), nodeModulesPath); From f87728d4aad127b2ea635df14a602cab154116ca Mon Sep 17 00:00:00 2001 From: Joe Hanley Date: Fri, 14 Aug 2026 18:09:49 +0000 Subject: [PATCH 6/8] fix(standalone): fix runtime/shell -c -- argument handling and point runtime/node wrapper to is:node --- scripts/test-sea-e2e.sh | 33 ++++++++++++++++++++++++ standalone/firepit.js | 17 +++++++++---- standalone/runtime.js | 56 +++++++++++++++++++---------------------- 3 files changed, 71 insertions(+), 35 deletions(-) diff --git a/scripts/test-sea-e2e.sh b/scripts/test-sea-e2e.sh index fa4ca4d792f..88b0d46dda4 100755 --- a/scripts/test-sea-e2e.sh +++ b/scripts/test-sea-e2e.sh @@ -252,6 +252,39 @@ EOF assert_contains "$out" "emulators:exec" ' +# Test 3.16: Runtime Node Wrapper Executions +run_test "Runtime Node Binary Wrapper (is:node via runtime/node)" ' + out=$("$HOME/.cache/firebase/runtime/node" -e "console.log(\"NODE_WRAPPER_TEST_OK\")") + assert_contains "$out" "NODE_WRAPPER_TEST_OK" +' + +# Test 3.17: Runtime Shell Execution with npm -c -- format +run_test "Runtime Shell Wrapper -c -- Command Handling" ' + out=$("$HOME/.cache/firebase/runtime/shell" -c -- "node -e \"console.log(\\\"SHELL_DASH_DASH_OK\\\")\"") + assert_contains "$out" "SHELL_DASH_DASH_OK" +' + +# Test 3.18: NPM Predeploy & Lifecycle Script Execution +run_test "NPM Lifecycle & Predeploy Script Execution" ' + tmp_lifecycle=$(mktemp -d /tmp/fb-lifecycle-test-XXXXXX) + cd "$tmp_lifecycle" + cat << "EOF" > package.json +{ + "name": "lifecycle-test", + "scripts": { + "lint": "node -e \"console.log(\\\"LINT_SUCCESS\\\")\"", + "build": "node -e \"console.log(\\\"BUILD_SUCCESS\\\")\"" + } +} +EOF + lint_out=$("$HOME/.cache/firebase/runtime/npm" run lint) + build_out=$("$HOME/.cache/firebase/runtime/npm" run build) + cd / + rm -rf "$tmp_lifecycle" + assert_contains "$lint_out" "LINT_SUCCESS" && \ + assert_contains "$build_out" "BUILD_SUCCESS" +' + # ============================================================================== # Summary # ============================================================================== diff --git a/standalone/firepit.js b/standalone/firepit.js index 960f71ac02c..6a34958bf68 100644 --- a/standalone/firepit.js +++ b/standalone/firepit.js @@ -625,7 +625,10 @@ function ImitateNode() { } return new Promise(resolve => { - const target = path.resolve(nodeArgs[0]); + let target = path.resolve(nodeArgs[0]); + if (!fs.existsSync(target) && fs.existsSync(target + ".js")) { + target = target + ".js"; + } const cmd = fork(target, nodeArgs.slice(1), { stdio: "inherit", env: process.env @@ -634,6 +637,10 @@ function ImitateNode() { debug(`faux-node done.`); resolve(code); }); + cmd.on("error", err => { + console.error(err); + resolve(1); + }); }); } @@ -676,17 +683,17 @@ async function createRuntimeBinaries() { const runtimeBins = { /* Linux / OSX */ firebase: `#!/bin/sh\nexec "${safeNodePath}" "$@"`, - node: `#!/bin/sh\nexec "${safeNodePath}" "${runtimeBinsPath}/node.js" "$@"`, + node: `#!/bin/sh\nexec "${safeNodePath}" is:node "$@"`, npm: `#!/bin/sh\nexec "${safeNodePath}" "${npmCliPath}" ${npmArgs.join(" ")} "$@"`, - shell: `#!/bin/sh\nexec "${safeNodePath}" "${runtimeBinsPath}/shell.js" "$@"`, + shell: `#!/bin/sh\nPATH="${runtimeBinsPath}:${installPath}/lib/node_modules/.bin:\$PWD/node_modules/.bin:\$PATH"\nexport PATH\nexec /bin/sh "$@"`, /* Windows */ "firebase.bat": `@echo off\n"${safeNodePath}" %*`, - "node.bat": `@echo off\n"${safeNodePath}" ${runtimeBinsPath}\\node.js %*`, + "node.bat": `@echo off\n"${safeNodePath}" is:node %*`, "npm.bat": `@echo off\n"${safeNodePath}" "${npmCliPath}" ${npmArgs.join( " " )} %*`, - "shell.bat": `@echo off\n"${safeNodePath}" ${runtimeBinsPath}\\shell.js %*`, + "shell.bat": `@echo off\nset "PATH=${runtimeBinsPath};${installPath}\\lib\\node_modules\\.bin;%CD%\\node_modules\\.bin;%PATH%"\nif "%~1"=="" goto interactive\ncmd.exe /d /s /c %*\nexit /b %ERRORLEVEL%\n:interactive\ncmd.exe /k`, /* Runtime scripts */ "shell.js": `${APPEND_TO_PATH_SRV}\n${GET_SAFE_PATH_SRV}\n(${runtime.Script_ShellJS.toString()})()`, diff --git a/standalone/runtime.js b/standalone/runtime.js index 36dd52aa9ab..b67252785c7 100644 --- a/standalone/runtime.js +++ b/standalone/runtime.js @@ -81,42 +81,38 @@ exports.Script_ShellJS = async function() { path.join(process.cwd(), "node_modules/.bin") ]); - let index; - if ((index = args.indexOf("-c")) !== -1) { - args.splice(index, 1); + if (args.length === 0) { + process.exit(0); } - args[0] = args[0].replace(process.execPath, "node"); - let [cmdRuntime, cmdScript, ...otherArgs] = args[0].split(" "); - - if (cmdRuntime === process.execPath) { - cmdRuntime = "node"; - } - - let cmd; - if (cmdRuntime === "node") { - if ([".", "/"].indexOf(cmdScript[0]) === -1) { - cmdScript = await getSafeCrossPlatformPath( - isWin, - path.join(process.cwd(), cmdScript) - ); + let commandToRun; + if (args[0] === "-c") { + if (args[1] === "--") { + commandToRun = args.slice(2).join(" "); + } else { + commandToRun = args.slice(1).join(" "); } - - cmd = child_process.fork(cmdScript, otherArgs, { - env: process.env, - cwd: process.cwd(), - stdio: "inherit" - }); } else { - cmd = child_process.spawn(cmdRuntime, [cmdScript, ...otherArgs], { - env: process.env, - cwd: process.cwd(), - stdio: "inherit", - shell: true - }); + commandToRun = args.join(" "); } + const cmd = isWin + ? child_process.spawn("cmd.exe", ["/d", "/s", "/c", commandToRun], { + env: process.env, + cwd: process.cwd(), + stdio: "inherit" + }) + : child_process.spawn("/bin/sh", ["-c", commandToRun], { + env: process.env, + cwd: process.cwd(), + stdio: "inherit" + }); + cmd.on("exit", code => { - process.exit(code); + process.exit(code !== null ? code : 0); + }); + cmd.on("error", err => { + console.error(err); + process.exit(1); }); }; From a8b485037ec2de97c9602a2121a50387f475a3b8 Mon Sep 17 00:00:00 2001 From: Joe Hanley Date: Fri, 14 Aug 2026 23:18:39 +0000 Subject: [PATCH 7/8] fix(standalone): resolve review feedback and fix CI test checks - build-sea.js: use cross-platform fs.cpSync instead of shell cp, add recursive .node file deletion helper, return undefined on rcodesign tool failure, and resume response streams on redirects/errors - firepit.js: set process.argv[1] and execute child scripts with Module.runMain(), parse leading options into execArgv in ImitateNode() - pipeline.js: isolate and stage headless artifacts to outputDir before headful build to avoid binary overwrite, add defensive isFile() check for checksum calculation, and fix Prettier formatting --- scripts/firepit-builder/pipeline.js | 33 ++++++++++++++++++-------- standalone/README.md | 12 ++++++++-- standalone/build-sea.js | 35 +++++++++++++++++++--------- standalone/firepit.js | 36 ++++++++++++++++++++++++----- 4 files changed, 87 insertions(+), 29 deletions(-) diff --git a/scripts/firepit-builder/pipeline.js b/scripts/firepit-builder/pipeline.js index 2357461f31d..a4ebc2a4286 100755 --- a/scripts/firepit-builder/pipeline.js +++ b/scripts/firepit-builder/pipeline.js @@ -77,14 +77,18 @@ echo(pwd()); const configTemplate = require(path.join(pwd().toString(), "config.template.js")); configTemplate.firebase_tools_package = firebaseToolsPackage; +const outputDir = path.join(tempdir().toString(), "firepit_artifacts"); +rm("-rf", outputDir); +mkdir("-p", outputDir); + if (styles.headless) { echo("-- Building headless binaries..."); configTemplate.headless = true; echo(`module.exports = ` + JSON.stringify(configTemplate)).to("config.js"); npm("run", "build:sea"); - ls("dist/firepit-*").forEach((file) => { - mv(file, path.join("dist", path.basename(file).replace("firepit", "firebase-tools"))); + ls("dist/firebase-tools-*").forEach((file) => { + cp(file, path.join(outputDir, path.basename(file))); }); } @@ -96,7 +100,10 @@ if (styles.headful) { npm("run", "build:sea"); ls("dist/firepit-*").forEach((file) => { - mv(file, path.join("dist", path.basename(file).replace("firepit", "firebase-tools-instant"))); + cp( + file, + path.join(outputDir, path.basename(file).replace("firepit", "firebase-tools-instant")), + ); }); } @@ -117,10 +124,10 @@ if (isPublishing) { hub("clone", "firebase/firebase-tools"); cd("firebase-tools"); - ls("../dist").forEach((filename) => { + ls(outputDir).forEach((filename) => { if (publishedFiles.indexOf(filename) === -1) return; echo(`Publishing ${filename}...`); - hub("release", "edit", "-m", '""', "-a", path.join("../dist", filename), releaseTag); + hub("release", "edit", "-m", '""', "-a", path.join(outputDir, filename), releaseTag); }); cd(".."); } else { @@ -128,17 +135,23 @@ if (isPublishing) { } echo("-- Artifacts"); -const outputDir = path.join(tempdir().toString(), "firepit_artifacts"); -rm("-rf", outputDir); -mkdir("-p", outputDir); -mv("dist/*", outputDir); cd(outputDir); // Generate SHA256 Checksums for published release binaries const crypto = require("crypto"); const sha256Lines = []; ls("firebase-tools*").forEach((file) => { - if (file.endsWith(".json") || file.endsWith(".txt") || file.endsWith(".js") || file.endsWith(".tar.gz")) return; + if ( + file.endsWith(".json") || + file.endsWith(".txt") || + file.endsWith(".js") || + file.endsWith(".tar.gz") + ) { + return; + } + if (!fs.statSync(file).isFile()) { + return; + } const data = fs.readFileSync(file); const hash = crypto.createHash("sha256").update(data).digest("hex"); sha256Lines.push(`${hash} ${file}`); diff --git a/standalone/README.md b/standalone/README.md index 72a2d59ea0e..70f3aa628b1 100644 --- a/standalone/README.md +++ b/standalone/README.md @@ -50,18 +50,23 @@ flowchart TD ## Quick Start (Local Development) ### 1. Install Dependencies + Inside the `standalone/` directory: + ```bash npm install ``` ### 2. Build Executable for Current Machine + To quickly build a standalone binary for your current OS and architecture: + ```bash npm run build:sea -- --current-only ``` ### 3. Test the Compiled Binary + ```bash # On Linux ./dist/firepit-linux --version @@ -87,6 +92,7 @@ npm run build:sea ``` Output directory: `dist/` + - `dist/firepit-linux` (Linux x86_64 ELF) - `dist/firepit-macos-x64` (Intel Mach-O) - `dist/firepit-macos-arm64` (Apple Silicon Mach-O) @@ -94,7 +100,9 @@ Output directory: `dist/` - `dist/firepit-win.exe` (Windows x86_64 PE) ### Customizing Node Binary or Version + You can pass custom environment variables to `build-sea.js`: + ```bash # Use a specific Node 26 executable as the compiler NODE_BIN=/path/to/node26/bin/node node build-sea.js @@ -129,12 +137,12 @@ file dist/firebase-tools-macos Firepit embeds runtime scripts allowing `firebase-tools` to shell out to Node and NPM: -* **`firebase is:node [script.js | -e | -v]`**: +- **`firebase is:node [script.js | -e | -v]`**: Executes Node.js scripts or evaluates inline expressions using the embedded SEA Node engine. ```bash ./dist/firepit-linux is:node -e "console.log(process.version)" ``` -* **`firebase is:npm [npm args...]`**: +- **`firebase is:npm [npm args...]`**: Executes npm commands using the embedded npm CLI tools. ```bash ./dist/firepit-linux is:npm --version diff --git a/standalone/build-sea.js b/standalone/build-sea.js index 5a34858036e..3c8dca61aaa 100644 --- a/standalone/build-sea.js +++ b/standalone/build-sea.js @@ -71,10 +71,12 @@ function downloadFile(url, dest) { https .get(currentUrl, response => { if (response.statusCode === 301 || response.statusCode === 302) { + response.resume(); get(response.headers.location); return; } if (response.statusCode !== 200) { + response.resume(); reject(new Error(`Failed to download ${currentUrl}: HTTP ${response.statusCode}`)); return; } @@ -150,7 +152,7 @@ async function ensureRcodesignTool(tempDir) { return localRcodesign; } catch (err) { console.warn(`[build-sea] Warning: Could not download rcodesign: ${err.message}`); - return null; + return undefined; } } @@ -221,9 +223,7 @@ async function main() { if (fs.existsSync(path.join(vendorDir, "node_modules"))) { // Production release pipeline mode console.log("[build-sea] Using vendor/node_modules from pipeline..."); - execSync( - `cp -R "${path.join(vendorDir, "node_modules")}"/* "${targetNodeModules}/"` - ); + fs.cpSync(path.join(vendorDir, "node_modules"), targetNodeModules, { recursive: true }); } else { // Clean production package mode for local dev builds console.log("[build-sea] Preparing clean production bundle from local repo..."); @@ -249,9 +249,9 @@ async function main() { ); const prodNodeModules = path.join(tmpPackDir, "node_modules"); if (fs.existsSync(prodNodeModules)) { - execSync( - `cp -R "${prodNodeModules}"/* "${targetNodeModules}/" 2>/dev/null || true` - ); + try { + fs.cpSync(prodNodeModules, targetNodeModules, { recursive: true }); + } catch (e) {} } } } finally { @@ -261,9 +261,9 @@ async function main() { // Also include standalone runtime dependencies (like chalk, npm) const rootNodeModules = path.join(standaloneDir, "node_modules"); if (fs.existsSync(rootNodeModules)) { - execSync( - `cp -R "${rootNodeModules}"/* "${targetNodeModules}/" 2>/dev/null || true` - ); + try { + fs.cpSync(rootNodeModules, targetNodeModules, { recursive: true }); + } catch (e) {} } } @@ -282,7 +282,20 @@ async function main() { } try { - execSync(`find "${assetsLibDir}" -name "*.node" -delete 2>/dev/null || true`, { stdio: "ignore" }); + const removeNativeAddons = (dir) => { + if (!fs.existsSync(dir)) return; + const list = fs.readdirSync(dir); + for (const file of list) { + const fullPath = path.join(dir, file); + const stat = fs.statSync(fullPath); + if (stat.isDirectory()) { + removeNativeAddons(fullPath); + } else if (file.endsWith(".node")) { + fs.unlinkSync(fullPath); + } + } + }; + removeNativeAddons(assetsLibDir); } catch (e) {} execSync( diff --git a/standalone/firepit.js b/standalone/firepit.js index 6a34958bf68..716eb4cb88f 100644 --- a/standalone/firepit.js +++ b/standalone/firepit.js @@ -367,9 +367,10 @@ debug(`Welcome to firepit v${version}!`); if (spliceIndex === 2) { process.argv.splice(1, 1); } + process.argv[1] = resolvedScriptPath; try { - const scriptRequire = createRequire(resolvedScriptPath); - scriptRequire(resolvedScriptPath); + const Module = require("module"); + Module.runMain(); } catch (err) { console.error(err); process.exit(1); @@ -625,13 +626,36 @@ function ImitateNode() { } return new Promise(resolve => { - let target = path.resolve(nodeArgs[0]); - if (!fs.existsSync(target) && fs.existsSync(target + ".js")) { + const execArgv = []; + let scriptIndex = 0; + while (scriptIndex < nodeArgs.length) { + const arg = nodeArgs[scriptIndex]; + if (arg.startsWith("-")) { + execArgv.push(arg); + if ( + (arg === "-r" || arg === "--require" || arg === "--import") && + scriptIndex + 1 < nodeArgs.length + ) { + execArgv.push(nodeArgs[scriptIndex + 1]); + scriptIndex += 2; + } else { + scriptIndex += 1; + } + } else { + break; + } + } + + const scriptPath = nodeArgs[scriptIndex]; + const scriptArgs = nodeArgs.slice(scriptIndex + 1); + let target = scriptPath ? path.resolve(scriptPath) : ""; + if (target && !fs.existsSync(target) && fs.existsSync(target + ".js")) { target = target + ".js"; } - const cmd = fork(target, nodeArgs.slice(1), { + const cmd = fork(target, scriptArgs, { stdio: "inherit", - env: process.env + env: process.env, + execArgv }); cmd.on("close", code => { debug(`faux-node done.`); From 7ca9f12069784e8c0101fe7569e46246472d559c Mon Sep 17 00:00:00 2001 From: Joe Hanley Date: Tue, 18 Aug 2026 22:53:49 +0000 Subject: [PATCH 8/8] refactor(standalone): remove third-party rcodesign tool and use native codesign/lipo on macOS only --- scripts/firepit-builder/Dockerfile | 3 -- standalone/build-sea.js | 86 +++++------------------------- 2 files changed, 12 insertions(+), 77 deletions(-) diff --git a/scripts/firepit-builder/Dockerfile b/scripts/firepit-builder/Dockerfile index 48da05bcde9..a606352a443 100644 --- a/scripts/firepit-builder/Dockerfile +++ b/scripts/firepit-builder/Dockerfile @@ -4,9 +4,6 @@ FROM node:20 RUN apt-get update && \ apt-get install -y wget tar curl -# Install apple-codesign (rcodesign) for signing and stitching macOS binaries on Linux -RUN curl -fsSL https://github.com/indygreg/apple-platform-rs/releases/download/apple-codesign%2F0.29.0/apple-codesign-0.29.0-x86_64-unknown-linux-musl.tar.gz | tar -xz --strip-components=1 -C /usr/local/bin apple-codesign-0.29.0-x86_64-unknown-linux-musl/rcodesign - # Install hub RUN curl -fsSL --output hub.tgz https://github.com/github/hub/releases/download/v2.11.2/hub-linux-amd64-2.11.2.tgz RUN tar --strip-components=2 -C /usr/bin -xf hub.tgz hub-linux-amd64-2.11.2/bin/hub diff --git a/standalone/build-sea.js b/standalone/build-sea.js index 3c8dca61aaa..3fc2589bef0 100644 --- a/standalone/build-sea.js +++ b/standalone/build-sea.js @@ -123,39 +123,6 @@ function extractZip(zipPath, destDir) { } } -const RCODESIGN_VERSION = "0.29.0"; - -async function ensureRcodesignTool(tempDir) { - // Check if rcodesign is in PATH - try { - execSync("rcodesign --version", { stdio: "ignore" }); - return "rcodesign"; - } catch (e) {} - - const localRcodesign = path.join(tempDir, "rcodesign"); - if (fs.existsSync(localRcodesign)) { - return localRcodesign; - } - - // Download rcodesign binary for Linux or macOS - const platform = process.platform === "darwin" ? "apple-darwin" : "unknown-linux-musl"; - const arch = process.arch === "arm64" ? "aarch64" : "x86_64"; - const archiveName = `apple-codesign-${RCODESIGN_VERSION}-${arch}-${platform}.tar.gz`; - const url = `https://github.com/indygreg/apple-platform-rs/releases/download/apple-codesign%2F${RCODESIGN_VERSION}/${archiveName}`; - const destTar = path.join(tempDir, archiveName); - - console.log(`[build-sea] Downloading rcodesign tool from ${url}...`); - try { - await downloadFile(url, destTar); - execSync(`tar -xzf "${destTar}" -C "${tempDir}" --strip-components=1`, { stdio: "ignore" }); - fs.chmodSync(localRcodesign, 0o755); - return localRcodesign; - } catch (err) { - console.warn(`[build-sea] Warning: Could not download rcodesign: ${err.message}`); - return undefined; - } -} - async function main() { const args = process.argv.slice(2); const currentOnly = args.includes("--current-only"); @@ -382,29 +349,15 @@ async function main() { fs.chmodSync(outputBinaryPath, 0o755); } catch (e) {} - // Sign macOS binaries - if (target.platform === "darwin") { - if (process.platform === "darwin") { - try { - console.log(`[build-sea] Signing ${outputBinaryName} with codesign...`); - execSync(`codesign --sign - --force "${outputBinaryPath}"`, { stdio: "inherit" }); - } catch (err) { - console.warn( - `[build-sea] Warning: codesign failed for ${outputBinaryName}: ${err.message}` - ); - } - } else { - const rcodesignTool = await ensureRcodesignTool(tempDownloadsDir); - if (rcodesignTool) { - try { - console.log(`[build-sea] Signing ${outputBinaryName} with rcodesign...`); - execSync(`"${rcodesignTool}" sign "${outputBinaryPath}"`, { stdio: "inherit" }); - } catch (err) { - console.warn( - `[build-sea] Warning: rcodesign failed for ${outputBinaryName}: ${err.message}` - ); - } - } + // Sign macOS binaries (native codesign on macOS only) + if (target.platform === "darwin" && process.platform === "darwin") { + try { + console.log(`[build-sea] Signing ${outputBinaryName} with codesign...`); + execSync(`codesign --sign - --force "${outputBinaryPath}"`, { stdio: "inherit" }); + } catch (err) { + console.warn( + `[build-sea] Warning: codesign failed for ${outputBinaryName}: ${err.message}` + ); } } } @@ -426,27 +379,12 @@ async function main() { console.log(`[build-sea] Created and signed Universal binary: ${macUniversalBin}`); } catch (err) { console.warn(`[build-sea] Warning: Failed to create lipo universal binary: ${err.message}`); - } - } else { - const rcodesignTool = await ensureRcodesignTool(tempDownloadsDir); - if (rcodesignTool) { - try { - execSync( - `"${rcodesignTool}" macho-universal-create --output "${macUniversalBin}" "${macArm64Bin}" "${macX64Bin}"`, - { stdio: "inherit" } - ); - execSync(`"${rcodesignTool}" sign "${macUniversalBin}"`, { stdio: "inherit" }); - fs.chmodSync(macUniversalBin, 0o755); - console.log(`[build-sea] Created and signed Universal binary with rcodesign: ${macUniversalBin}`); - } catch (err) { - console.warn(`[build-sea] Warning: rcodesign macho-universal-create failed: ${err.message}`); - fs.copyFileSync(macArm64Bin, macUniversalBin); - fs.chmodSync(macUniversalBin, 0o755); - } - } else { fs.copyFileSync(macArm64Bin, macUniversalBin); fs.chmodSync(macUniversalBin, 0o755); } + } else { + fs.copyFileSync(macArm64Bin, macUniversalBin); + fs.chmodSync(macUniversalBin, 0o755); } } else if (fs.existsSync(macArm64Bin) && !fs.existsSync(macUniversalBin)) { fs.copyFileSync(macArm64Bin, macUniversalBin);