diff --git a/.babelrc b/.babelrc new file mode 100644 index 00000000..d2e7d8df --- /dev/null +++ b/.babelrc @@ -0,0 +1,19 @@ +{ + "presets": [ + [ + "@babel/preset-env", + { + "targets": "node 12.0" + } + ] + ], + "plugins": [ + "@babel/plugin-transform-flow-strip-types", + [ + "@babel/plugin-transform-block-scoping", + { + "throwIfClosureRequired": true + } + ] + ] +} \ No newline at end of file diff --git a/.flowconfig b/.flowconfig new file mode 100644 index 00000000..744cf459 --- /dev/null +++ b/.flowconfig @@ -0,0 +1,13 @@ +[ignore] +.*/node_modules/.* + +[include] + +[libs] +./decls + +[options] +suppress_comment= \\(.\\|\n\\)*\\$FlowIgnore +munge_underscores=true +module.ignore_non_literal_requires=true +esproposal.decorators=ignore \ No newline at end of file diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index fc0c68d0..9d675323 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -1,40 +1,23 @@ name: CI on: [push, pull_request] -permissions: - contents: read jobs: - # Wasm pipeline (the only pipeline now that the legacy JS impl is gone): - # uses the committed js/reg.wasm so we don't pay the wasi-sdk toolchain - # cost on every PR. Rust unit tests (`cargo test`) and the JS CLI/library - # integration tests (`node:test` via `pnpm test` in `js/`) both run here - # and cover junit/reg.json schema compat, -F/-X/-E, and the `compare()` - # EventEmitter surface (reg-suit drop-in). test: runs-on: ubuntu-latest steps: - - uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4.3.1 - - uses: pnpm/action-setup@b906affcce14559ad1aafd4ab0e942779e9f58b1 # v4.3.0 - - uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0 + - uses: actions/checkout@ff7abcd0c3c05ccf6adc123a8cd1fd4fb30fb493 + - uses: actions/setup-node@dda4788290998366da86b6a4f497909644397bb2 with: - node-version: 20 - # `reg_core` embeds `report/ui/dist/{report.js,style.css}` via - # `include_str!`, so `cargo test` fails before we even compile unless - # we materialise them first. The `build-ui.sh` script clones - # `reg-viz/reg-cli-report-ui` at a pinned tag and builds it with - # yarn (enabled via corepack in setup-node). - - name: enable corepack (yarn for report-ui build) + node-version: 22 + - name: corepack enable run: corepack enable - - name: build report-ui (report.js + style.css) - run: sh ./scripts/build-ui.sh v0.3.0 - - uses: actions-rust-lang/setup-rust-toolchain@2b1f5e9b395427c92ee4e3331786ca3c37afe2d7 # v1.16.0 - with: - toolchain: stable - - name: cargo test (reg_core) - run: cargo test -p reg_core --lib - - name: install + - name: corepack prepare pnpm + run: corepack prepare pnpm@10.14.0 --activate + - name: pnpm install run: pnpm install --frozen-lockfile - - name: build (dist + bundle reg.wasm) - run: pnpm build - - name: test (CLI + library) - run: pnpm test + - name: install chrome for puppeteer + run: pnpm exec puppeteer browsers install chrome + - name: flow + run: pnpm run flow + - name: test + run: pnpm run test diff --git a/.gitignore b/.gitignore index 4ea740de..2ad53959 100644 --- a/.gitignore +++ b/.gitignore @@ -1,10 +1,7 @@ /node_modules/* report/assets/cv-wasm_browser.* report/ui -/test/__workspace__/ -/.libtest-* -/.phase-h-* -/.phase-h-subdir/ +/test/__workspace__/* .DS_Store report.html /diff/* @@ -13,159 +10,3 @@ report.html /screenshot/* sample/index.html from-json.html -### Generated by gibo (https://github.com/simonwhitaker/gibo) -### https://raw.github.com/github/gitignore/e5323759e387ba347a9d50f8b0ddd16502eb71d4/Node.gitignore - -# Logs -logs -*.log -npm-debug.log* -yarn-debug.log* -yarn-error.log* -lerna-debug.log* -.pnpm-debug.log* - -# Diagnostic reports (https://nodejs.org/api/report.html) -report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json - -# Runtime data -pids -*.pid -*.seed -*.pid.lock - -# Directory for instrumented libs generated by jscoverage/JSCover -lib-cov - -# Coverage directory used by tools like istanbul -coverage -*.lcov - -# nyc test coverage -.nyc_output - -# Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) -.grunt - -# Bower dependency directory (https://bower.io/) -bower_components - -# node-waf configuration -.lock-wscript - -# Compiled binary addons (https://nodejs.org/api/addons.html) -build/Release - -# Dependency directories -node_modules/ -jspm_packages/ - -# Snowpack dependency directory (https://snowpack.dev/) -web_modules/ - -# TypeScript cache -*.tsbuildinfo - -# Optional npm cache directory -.npm - -# Optional eslint cache -.eslintcache - -# Optional stylelint cache -.stylelintcache - -# Microbundle cache -.rpt2_cache/ -.rts2_cache_cjs/ -.rts2_cache_es/ -.rts2_cache_umd/ - -# Optional REPL history -.node_repl_history - -# Output of 'npm pack' -*.tgz - -# Yarn Integrity file -.yarn-integrity - -# dotenv environment variable files -.env -.env.development.local -.env.test.local -.env.production.local -.env.local - -# parcel-bundler cache (https://parceljs.org/) -.cache -.parcel-cache - -# Next.js build output -.next -out - -# Nuxt.js build / generate output -.nuxt -dist - -# Gatsby files -.cache/ -# Comment in the public line in if your project uses Gatsby and not Next.js -# https://nextjs.org/blog/next-9-1#public-directory-support -# public - -# vuepress build output -.vuepress/dist - -# vuepress v2.x temp and cache directory -.temp -.cache - -# Docusaurus cache and generated files -.docusaurus - -# Serverless directories -.serverless/ - -# FuseBox cache -.fusebox/ - -# DynamoDB Local files -.dynamodb/ - -# TernJS port file -.tern-port - -# Stores VSCode versions used for testing VSCode extensions -.vscode-test - -# yarn v2 -.yarn/cache -.yarn/unplugged -.yarn/build-state.yml -.yarn/install-state.gz -.pnp.* - - -### https://raw.github.com/github/gitignore/e5323759e387ba347a9d50f8b0ddd16502eb71d4/Rust.gitignore - -# Generated by Cargo -# will have compiled files and executables -debug/ -target/ - -# Remove Cargo.lock from gitignore if creating an executable, leave it for libraries -# More information here https://doc.rust-lang.org/cargo/guide/cargo-toml-vs-cargo-lock.html -Cargo.lock - -# These are backup files generated by rustfmt -**/*.rs.bk - -# MSVC Windows builds of rustc generate these, which store debugging information -*.pdb - -wasi-sdk-21.0 -wasi-sdk-* -m.md - diff --git a/.npmignore b/.npmignore new file mode 100644 index 00000000..e69de29b diff --git a/.prettierrc b/.prettierrc index 535e1101..2f9a61f2 100644 --- a/.prettierrc +++ b/.prettierrc @@ -3,4 +3,6 @@ printWidth: 120 tabWidth: 2 singleQuote: true trailingComma: "all" -semi: true +jsxBracketSameLine: false +parser: "flow" +semi: true \ No newline at end of file diff --git a/.travis.yml b/.travis.yml new file mode 100644 index 00000000..436070af --- /dev/null +++ b/.travis.yml @@ -0,0 +1,14 @@ +os: + - linux + +language: node_js +node_js: + - '12' + - '10' +addons: + apt: + packages: + - xvfb +before_install: + - export DISPLAY=':99.0' + - Xvfb :99 -screen 0 1024x768x24 > /dev/null 2>&1 & diff --git a/Cargo.toml b/Cargo.toml deleted file mode 100644 index 53a605bb..00000000 --- a/Cargo.toml +++ /dev/null @@ -1,13 +0,0 @@ -[workspace] -resolver = "2" -members = [ - "crates/*", -] - -# Release optimization settings -[profile.release] -lto = true # Link Time Optimization - significantly improves performance -codegen-units = 1 # Maximize optimization (slower compile, faster runtime) -opt-level = 3 # Maximum optimization level -panic = "abort" # Skip unwinding on panic (smaller binary, faster) -strip = true # Remove debug symbols (smaller binary) diff --git a/README.md b/README.md index 98ff278c..49d91223 100644 --- a/README.md +++ b/README.md @@ -108,9 +108,3 @@ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLI ![reg-viz](https://raw.githubusercontent.com/reg-viz/artwork/master/repository/footer.png) -``` -export WASI_VERSION_FULL=24.0 -export WASI_SDK_PATH=`pwd`/wasi-sdk-${WASI_VERSION_FULL} -CFLAGS="--sysroot ${WASI_SDK_PATH}/share/wasi-sysroot" cargo build --release --target=wasm32-wasip1-threads -cp target/wasm32-wasip1-threads/release/reg_cli.wasm js/reg.wasm -``` \ No newline at end of file diff --git a/appveyor.yml b/appveyor.yml new file mode 100644 index 00000000..f0083136 --- /dev/null +++ b/appveyor.yml @@ -0,0 +1,20 @@ +# Test against the latest version of this Node.js version +environment: + nodejs_version: "12" + +# Install scripts. (runs after repo cloning) +install: + # Get the latest stable version of Node.js or io.js + - ps: Install-Product node $env:nodejs_version + # install modules + - npm i -g yarn + - yarn install --frozen-lockfile + +# Post-install test scripts. +test_script: + # run tests + - yarn build + - yarn run test + +# Don't actually build. +build: off diff --git a/build.config.ts b/build.config.ts deleted file mode 100644 index 400eb9a3..00000000 --- a/build.config.ts +++ /dev/null @@ -1,38 +0,0 @@ -import { defineBuildConfig } from 'unbuild'; -import { cp, mkdir } from 'node:fs/promises'; -import { dirname, join } from 'node:path'; - -// Browser-side worker sources that `ximgdiff.ts` concatenates at runtime -// when `-X client` is used. We stage them into dist/shared/ during build -// so the published package carries them without running any UI build on -// `npm install`. -async function stageXimgdiffSources(outDir: string): Promise { - // After collapsing js/ into the repo root this file lives at the root, - // so its dirname IS repoRoot. (Pre-collapse it was `js/..`.) - const repoRoot = dirname(new URL(import.meta.url).pathname); - const sharedOut = join(outDir, 'shared'); - await mkdir(sharedOut, { recursive: true }); - // `report/ui/dist/worker.js` is produced by `scripts/build-ui.sh v0.3.0` - // (also run during the wasm-test CI job before this build). - await cp( - join(repoRoot, 'report/ui/dist/worker.js'), - join(sharedOut, 'report-worker.js'), - ); - await cp( - join(repoRoot, 'template/worker_pre.js'), - join(sharedOut, 'worker_pre.js'), - ); -} - -export default defineBuildConfig({ - entries: ['./src/index.ts', './src/cli.ts', './src/worker.ts', './src/entry.ts'], - declaration: true, - rollup: { - emitCJS: true, - }, - hooks: { - 'build:done'(ctx): Promise { - return stageXimgdiffSources(ctx.options.outDir); - }, - }, -}); diff --git a/crates/reg_cli/Cargo.toml b/crates/reg_cli/Cargo.toml deleted file mode 100644 index 0942b6dc..00000000 --- a/crates/reg_cli/Cargo.toml +++ /dev/null @@ -1,14 +0,0 @@ -[package] -name = "cli" -version = "0.1.0" -edition = "2021" - -[[bin]] -name = "reg_cli" -path = "src/main.rs" - -[dependencies] -reg_core = { path = "../reg_core" } -clap = { version = "4", features = ["derive"] } -serde_json = { version = "1.0" } -tracing = "0.1" \ No newline at end of file diff --git a/crates/reg_cli/src/main.rs b/crates/reg_cli/src/main.rs deleted file mode 100644 index 0e23a0a4..00000000 --- a/crates/reg_cli/src/main.rs +++ /dev/null @@ -1,242 +0,0 @@ -use clap::{Parser, ValueEnum}; -use reg_core::{run, run_from_json, DiffImageFormat, JsonReport, Options, Url}; -use std::path::{Path, PathBuf}; -use tracing::info_span; - -#[derive(ValueEnum, Debug, Clone, Copy, PartialEq, Eq)] -enum DiffFormatArg { - Webp, - Png, -} - -impl From for DiffImageFormat { - fn from(f: DiffFormatArg) -> Self { - match f { - DiffFormatArg::Webp => DiffImageFormat::Webp, - DiffFormatArg::Png => DiffImageFormat::Png, - } - } -} - -#[derive(ValueEnum, Debug, Clone, Copy, PartialEq, Eq)] -enum AdditionalDetection { - None, - Client, -} - -#[derive(Parser, Debug)] -#[command(author, version, about, long_about = None)] -struct Args { - #[clap(index = 1)] - actual_dir: Option, - - #[clap(index = 2)] - expected_dir: Option, - - #[clap(index = 3)] - diff_dir: Option, - - #[arg(short = 'R', long)] - report: Option, - - #[arg(short = 'J', long)] - json: Option, - - /// Path to write the JUnit XML test report. - #[arg(long = "junit")] - junit: Option, - - /// Escalate added/deleted images to failures in the JUnit XML (and at - /// the CLI exit-code layer on the JS wrapper). Mirrors classic - /// reg-cli's `-E, --extendedErrors`. - #[arg(short = 'E', long = "extendedErrors", default_missing_value = "true", num_args = 0..=1)] - extended_errors: Option, - - #[arg(short = 'M', long = "matchingThreshold")] - matching_threshold: Option, - - #[arg(short = 'T', long = "thresholdRate")] - threshold_rate: Option, - - #[arg(short = 'S', long = "thresholdPixel")] - threshold_pixel: Option, - - #[arg(short = 'P', long = "urlPrefix")] - url_prefix: Option, - - #[arg(short = 'C', long)] - concurrency: Option, - - #[arg(short = 'A', long = "enableAntialias", default_missing_value = "true", num_args = 0..=1)] - enable_antialias: Option, - - /// Output format for diff images. `webp` (default) matches the current - /// Rust/Wasm behaviour. `png` matches the classic JS implementation. - #[arg(long = "diffFormat", value_enum)] - diff_format: Option, - - /// Re-render HTML report from an existing reg.json (no image comparison). - /// Mirrors classic reg-cli's `-F, --from`. - #[arg(short = 'F', long = "from")] - from: Option, - - /// Enable the HTML report's client-side additional detection pass. - /// Mirrors classic reg-cli's `-X, --additionalDetection`. - #[arg(short = 'X', long = "additionalDetection", value_enum)] - additional_detection: Option, -} - -#[cfg(not(all(target_os = "wasi", target_env = "p1")))] -pub fn main() { - // Initialize tracing for non-WASI builds - reg_core::init_tracing(); - let _ = inner(); -} - -#[cfg(all(target_os = "wasi", target_env = "p1"))] -pub fn main() { - // NOP -} - -fn inner() -> Result { - let _root_span = info_span!("reg_cli_main").entered(); - - let args = Args::parse(); - - let options = Options { - report: args.report.as_deref().map(Path::new), - junit_report: args.junit.as_deref().map(Path::new), - json: args.json.as_deref().map(Path::new), - extended_errors: args.extended_errors, - matching_threshold: args.matching_threshold, - threshold_rate: args.threshold_rate, - threshold_pixel: args.threshold_pixel, - concurrency: args.concurrency, - enable_antialias: args.enable_antialias, - url_prefix: args.url_prefix, - diff_image_format: args.diff_format.map(DiffImageFormat::from), - enable_client_additional_detection: args - .additional_detection - .map(|v| matches!(v, AdditionalDetection::Client)), - }; - - // `-F / --from` short-circuits the diff pipeline and re-renders HTML from - // an existing reg.json. Positional dirs are not required in this mode. - if let Some(from) = args.from.as_deref() { - return run_from_json(from, options); - } - - let actual_dir = args.actual_dir.ok_or_else(|| { - std::io::Error::new( - std::io::ErrorKind::InvalidInput, - "actual_dir is required (or pass --from to regenerate from reg.json)", - ) - })?; - let expected_dir = args.expected_dir.ok_or_else(|| { - std::io::Error::new( - std::io::ErrorKind::InvalidInput, - "expected_dir is required", - ) - })?; - let diff_dir = args.diff_dir.ok_or_else(|| { - std::io::Error::new(std::io::ErrorKind::InvalidInput, "diff_dir is required") - })?; - - run(actual_dir, expected_dir, diff_dir, options) -} - -#[cfg(all(target_os = "wasi", target_env = "p1"))] -#[repr(C)] -pub struct WasmOutput { - pub len: usize, - pub buf: *mut u8, -} - -#[cfg(all(target_os = "wasi", target_env = "p1"))] -#[no_mangle] -pub extern "C" fn init_tracing() { - reg_core::init_tracing(); -} - -/// Set JS trace context for context propagation -/// trace_id_ptr: pointer to trace_id string (null-terminated or with length) -/// trace_id_len: length of trace_id string -/// span_id_ptr: pointer to parent span_id string -/// span_id_len: length of span_id string -#[cfg(all(target_os = "wasi", target_env = "p1"))] -#[no_mangle] -pub unsafe extern "C" fn set_trace_context( - trace_id_ptr: *const u8, - trace_id_len: usize, - span_id_ptr: *const u8, - span_id_len: usize, -) { - let trace_id = if trace_id_ptr.is_null() || trace_id_len == 0 { - None - } else { - let slice = std::slice::from_raw_parts(trace_id_ptr, trace_id_len); - std::str::from_utf8(slice).ok() - }; - - let span_id = if span_id_ptr.is_null() || span_id_len == 0 { - None - } else { - let slice = std::slice::from_raw_parts(span_id_ptr, span_id_len); - std::str::from_utf8(slice).ok() - }; - - reg_core::set_js_trace_context(trace_id, span_id); -} - -#[cfg(all(target_os = "wasi", target_env = "p1"))] -#[no_mangle] -pub extern "C" fn wasm_main() -> *mut WasmOutput { - let res = inner(); - if let Ok(res) = res { - let mut s = serde_json::to_string_pretty(&res).unwrap(); - - let len = s.len(); - let ptr = s.as_mut_ptr(); - std::mem::forget(s); - - let output = Box::new(WasmOutput { len, buf: ptr }); - Box::into_raw(output) - } else { - eprintln!("Failed to exec wasm main. Error details: {:?}", res); - panic!("Failed to exec wasm main. reason: {:?}", res); - } -} - -/// Get collected trace data as JSON string -/// Returns a pointer to WasmOutput containing JSON trace data -#[cfg(all(target_os = "wasi", target_env = "p1"))] -#[no_mangle] -pub extern "C" fn get_trace_data() -> *mut WasmOutput { - let mut trace_json = reg_core::get_trace_data_json(); - - let len = trace_json.len(); - let ptr = trace_json.as_mut_ptr(); - std::mem::forget(trace_json); - - let output = Box::new(WasmOutput { len, buf: ptr }); - Box::into_raw(output) -} - -/// Clear all collected trace data -#[cfg(all(target_os = "wasi", target_env = "p1"))] -#[no_mangle] -pub extern "C" fn clear_trace_data() { - reg_core::clear_trace_data(); -} - -#[cfg(all(target_os = "wasi", target_env = "p1"))] -#[no_mangle] -pub extern "C" fn free_wasm_output(ptr: *mut WasmOutput) { - if ptr.is_null() { - return; - } - unsafe { - let output = Box::from_raw(ptr); - Vec::from_raw_parts(output.buf, output.len, output.len); - } -} diff --git a/crates/reg_core/.gitignore b/crates/reg_core/.gitignore deleted file mode 100644 index a5a74d75..00000000 --- a/crates/reg_core/.gitignore +++ /dev/null @@ -1 +0,0 @@ -/reg.json diff --git a/crates/reg_core/Cargo.toml b/crates/reg_core/Cargo.toml deleted file mode 100644 index e4a7308a..00000000 --- a/crates/reg_core/Cargo.toml +++ /dev/null @@ -1,29 +0,0 @@ -[package] -name = "reg_core" -version = "0.1.0" -edition = "2021" - -# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html - -[lib] -name = "reg_core" -path = "src/lib.rs" - -[dependencies] -image-diff-rs = { git = "https://github.com/bokuweb/image-diff-rs.git", tag = "0.1.1" } -rayon = "1.8" -mustache = "0.9.0" -serde = { version = "1.0.207", features = ["derive"] } -serde_json = "1.0.125" -bytes = "1.7.1" -urlencoding = "2.1.3" -base64 = "0.22" -pathdiff = "0.2.1" -thiserror = "1.0" -url = "2.5.2" -tracing = "0.1" -tracing-subscriber = { version = "0.3", features = ["json"] } -once_cell = "1.19" - -[dev-dependencies] -tempfile = "3" diff --git a/crates/reg_core/src/dir.rs b/crates/reg_core/src/dir.rs deleted file mode 100644 index 56ffd342..00000000 --- a/crates/reg_core/src/dir.rs +++ /dev/null @@ -1,68 +0,0 @@ -use std::path::{Path, PathBuf}; - -pub(crate) fn dirname(path: &Path) -> PathBuf { - if path.file_name().is_some() { - path.parent().unwrap_or_else(|| Path::new("")).to_path_buf() - } else { - path.to_path_buf() - } -} - -/// Compute `target` relative to `base`'s directory. -/// -/// `pathdiff::diff_paths` returns `None` when one path is absolute and the -/// other is relative (e.g. user ran reg-cli with a relative fixture dir but -/// an absolute report path). Historically this panicked. To be robust we -/// canonicalize both sides to absolute via the current working directory -/// before diffing; if diff still fails, return the target unchanged. -pub(crate) fn resolve_dir(base: &Path, target: &Path) -> PathBuf { - let base_dir = dirname(base); - - if base_dir.is_absolute() == target.is_absolute() { - if let Some(p) = pathdiff::diff_paths(target, &base_dir) { - return p; - } - } - - // Mixed absolute/relative — try to normalize through $CWD. - let cwd = std::env::current_dir().unwrap_or_default(); - let abs_base = if base_dir.is_absolute() { - base_dir.clone() - } else { - cwd.join(&base_dir) - }; - let abs_target = if target.is_absolute() { - target.to_path_buf() - } else { - cwd.join(target) - }; - pathdiff::diff_paths(&abs_target, &abs_base).unwrap_or_else(|| target.to_path_buf()) -} - -#[cfg(test)] -mod tests { - use super::*; - - #[test] - fn both_relative() { - let r = resolve_dir(Path::new("a/b/reg.json"), Path::new("a/c/diff")); - assert_eq!(r, Path::new("../c/diff")); - } - - #[test] - fn both_absolute() { - let r = resolve_dir(Path::new("/a/b/reg.json"), Path::new("/a/c/diff")); - assert_eq!(r, Path::new("../c/diff")); - } - - #[test] - fn mixed_absolute_base_relative_target_no_panic() { - // Prior to the fix this panicked with `pathdiff returned None`. - let _ = resolve_dir(Path::new("/tmp/out/reg.json"), Path::new("fixtures/actual")); - } - - #[test] - fn mixed_relative_base_absolute_target_no_panic() { - let _ = resolve_dir(Path::new("bench/reg.json"), Path::new("/tmp/actual")); - } -} diff --git a/crates/reg_core/src/lib.rs b/crates/reg_core/src/lib.rs deleted file mode 100644 index 2eb5db3a..00000000 --- a/crates/reg_core/src/lib.rs +++ /dev/null @@ -1,758 +0,0 @@ -mod dir; -mod report; -pub mod tracing_layer; - -use image_diff_rs::{DiffOption, DiffOutput, EncodeFormat, ImageDiffError}; -use rayon::{prelude::*, ThreadPoolBuilder}; -use report::create_reports; -use std::{ - collections::BTreeSet, - path::{Path, PathBuf}, -}; -use tracing::{info, info_span, instrument}; - -use thiserror::Error; - -pub use report::JsonReport; -pub use tracing_layer::{clear_trace_data, get_trace_data_json, init_tracing, set_js_trace_context, SpanData, TraceData}; -pub use url::*; - -#[derive(Error, Debug)] -pub enum CompareError { - #[error("file io error, {0}")] - File(#[from] std::io::Error), - #[error("image diff error, {0}")] - ImageDiff(#[from] ImageDiffError), - #[error("unknown error")] - Unknown, -} - -static SUPPORTED_EXTENTIONS: [&str; 7] = ["tiff", "jpeg", "jpg", "gif", "png", "bmp", "webp"]; - -/// Per-file outcome of the parallel diff loop. We never propagate -/// per-image errors out of the rayon closure — instead each failure is -/// logged to stderr, fired as a `compare-event` of kind "fail", and -/// folded into the `failedItems` bucket downstream. This matches classic -/// reg-cli's tolerance (it forks per image, so a single corrupt PNG -/// can't sink the whole batch). -enum ImageOutcome { - Ok(DiffOutput), - Failed, -} - -static DEFAULT_JSON_PATH: &'static str = "./reg.json"; -static DEFAULT_REPORT_PATH: &'static str = "./report.html"; - -/// Magic line prefix that the JS host (`js/entry.ts`, `js/worker.ts`) parses -/// out of the Wasm's stderr stream to produce live `compare` events on the -/// `EventEmitter` returned by `compare()`. Mirrors classic reg-cli's -/// `ProcessAdaptor` which fires per-file events as each image finishes -/// diffing, so reg-suit spinners and progress UIs animate. -/// -/// Format (one event per line, TAB-delimited, newline-terminated): -/// -/// __REG_CLI_EVT__\t{"type":"pass|fail|new|delete","path":"..."}\n -/// -/// Everything else on stderr is forwarded through to `console.error` on the -/// host, so actual errors still reach users. -const PROGRESS_MARKER: &str = "__REG_CLI_EVT__"; - -/// Print a live progress event to stderr. Uses JSON for the payload so that -/// arbitrary characters in `path` (Unicode, backslashes on Windows, tabs, -/// newlines) don't break the downstream parser. Flushing here would be -/// nice-to-have but `eprintln!` already flushes to the WASI fd per-call. -fn emit_progress(kind: &'static str, path: &str) { - let payload = serde_json::json!({ "type": kind, "path": path }); - eprintln!("{}\t{}", PROGRESS_MARKER, payload); -} - -fn is_supported_extension(path: &Path) -> bool { - if let Some(extension) = path.extension() { - if let Some(ext_str) = extension.to_str() { - return SUPPORTED_EXTENTIONS.contains(&ext_str.to_lowercase().as_str()); - } - } - false -} - -#[derive(Debug)] -pub(crate) struct DetectedImages { - pub(crate) expected: BTreeSet, - pub(crate) actual: BTreeSet, - pub(crate) deleted: BTreeSet, - pub(crate) new: BTreeSet, -} - -/// Options for configuring the comparison process. -/// -/// # Fields -/// -/// * `report` - An optional path to a report file. -/// * `threshold_rate` - An optional threshold rate for comparison. -/// * `threshold_pixel` - An optional threshold pixel count for comparison. -/// * `enable_antialias` - An optional flag to enable or disable antialiasing. -#[derive(Debug)] -pub struct Options<'a> { - pub report: Option<&'a Path>, - /// Where to write the JUnit XML report. `None` means no junit output. - pub junit_report: Option<&'a Path>, - pub json: Option<&'a Path>, - /// Mirror of classic reg-cli's `-E / --extendedErrors`. Affects only the - /// JUnit XML: new/deleted items become `` / - /// `"deletedItem"` instead of silent passed testcases. Non-junit exit - /// code behaviour is still driven by the CLI wrapper itself. - pub extended_errors: Option, - // update?: boolean, - pub url_prefix: Option, - pub matching_threshold: Option, - pub threshold_rate: Option, - pub threshold_pixel: Option, - pub concurrency: Option, - pub enable_antialias: Option, - /// Format for the generated diff images. `None` keeps the default - /// (WebP lossless). Setting `Some(Png)` makes the output apples-to-apples - /// with the classic JS implementation. - pub diff_image_format: Option, - /// Mirror of classic reg-cli's `--additionalDetection client`. When set, - /// the HTML report's `ximgdiffConfig.enabled` is `true` and the report UI - /// runs a second-pass pixel detector in the browser. - pub enable_client_additional_detection: Option, -} - -/// User-facing mirror of `image_diff_rs::EncodeFormat` so that `reg_core` -/// consumers don't have to depend on image-diff-rs directly. -#[derive(Debug, Copy, Clone, PartialEq, Eq, Default)] -pub enum DiffImageFormat { - #[default] - Webp, - Png, -} - -impl From for EncodeFormat { - fn from(f: DiffImageFormat) -> Self { - match f { - DiffImageFormat::Webp => EncodeFormat::Webp, - DiffImageFormat::Png => EncodeFormat::Png, - } - } -} - -impl DiffImageFormat { - fn extension(self) -> &'static str { - match self { - DiffImageFormat::Webp => "webp", - DiffImageFormat::Png => "png", - } - } -} - -impl<'a> Default for Options<'a> { - fn default() -> Self { - Self { - report: None, - junit_report: None, - json: Some(Path::new(DEFAULT_JSON_PATH)), - extended_errors: None, - url_prefix: None, - matching_threshold: Some(0.0), - threshold_rate: None, - threshold_pixel: None, - concurrency: Some(4), - enable_antialias: None, - diff_image_format: None, - enable_client_additional_detection: None, - } - } -} - -/// Runs the comparison process. -/// -/// # Arguments -/// -/// * `actual_dir` - The directory containing the actual images. -/// * `expected_dir` - The directory containing the expected images. -/// * `diff_dir` - The directory where the diff images will be saved. -/// * `options` - The options for configuring the comparison process. -#[instrument(skip(options), fields(actual_dir = %actual_dir.as_ref().display(), expected_dir = %expected_dir.as_ref().display(), diff_dir = %diff_dir.as_ref().display()))] -pub fn run( - actual_dir: impl AsRef, - expected_dir: impl AsRef, - diff_dir: impl AsRef, - options: Options, -) -> Result { - let actual_dir = actual_dir.as_ref(); - let expected_dir = expected_dir.as_ref(); - let diff_dir = diff_dir.as_ref(); - let json_path = options.json.unwrap_or_else(|| Path::new(DEFAULT_JSON_PATH)); - let report = options - .report - .unwrap_or_else(|| Path::new(DEFAULT_REPORT_PATH)); - - info!( - actual_dir = %actual_dir.display(), - expected_dir = %expected_dir.display(), - diff_dir = %diff_dir.display(), - "Starting image comparison" - ); - - let detected = find_images(&expected_dir, &actual_dir); - - // Emit `new` / `delete` progress events up front — classic reg-cli - // fires these before the per-image diff loop starts, and reg-suit / - // spinners depend on live progress. See `emit_progress` for the wire - // format and `js/entry.ts` for the receiving side. - for p in &detected.new { - emit_progress("new", &p.display().to_string()); - } - for p in &detected.deleted { - emit_progress("delete", &p.display().to_string()); - } - - let targets: Vec = detected - .actual - .intersection(&detected.expected) - .cloned() - .collect(); - - // Match classic reg-cli (src/index.js:77): for small image sets the - // rayon thread-pool spin-up + cross-thread span dance costs more than - // any parallelism buys. Force single-threaded until we cross the - // classic's 20-image threshold. - let concurrency = if targets.len() < 20 { - 1 - } else { - options.concurrency.unwrap_or(4) - }; - info!(target_count = targets.len(), concurrency, "Starting parallel image diff"); - - let pool = { - let _pool_span = info_span!("build_thread_pool", num_threads = concurrency).entered(); - ThreadPoolBuilder::new() - .num_threads(concurrency) - .build() - .unwrap() - }; - - let result = { - let diff_span = info_span!("parallel_image_diff", target_count = targets.len()); - let _diff_guard = diff_span.enter(); - - // Capture the parent span to propagate to rayon threads - let parent_span = diff_span.clone(); - - pool.install(|| { - // Note: There may be ~20-30ms delay here due to rayon thread scheduling overhead - // This is especially noticeable in WASI environments - targets - .par_iter() - .map(|path| { - // Explicitly set parent span for cross-thread context propagation - let image_span = info_span!(parent: parent_span.clone(), "diff_single_image", image = %path.display()); - let _image_guard = image_span.enter(); - - let actual_path = actual_dir.join(path); - let expected_path = expected_dir.join(path); - - // Per-file failure policy: read OR decode errors are - // logged to stderr, classified as "fail" via a live - // compare-event, and counted into `failedItems`. We - // never propagate them up — one corrupt PNG must not - // abort a 1000-image batch (parity with classic - // reg-cli, which forks-per-image and tolerates child - // crashes individually). - let img1 = match std::fs::read(&actual_path) { - Ok(b) => b, - Err(e) => { - eprintln!( - "[reg-cli] failed to read actual {}: {}", - actual_path.display(), - e - ); - emit_progress("fail", &path.display().to_string()); - return (path.clone(), ImageOutcome::Failed); - } - }; - let img2 = match std::fs::read(&expected_path) { - Ok(b) => b, - Err(e) => { - eprintln!( - "[reg-cli] failed to read expected {}: {}", - expected_path.display(), - e - ); - emit_progress("fail", &path.display().to_string()); - return (path.clone(), ImageOutcome::Failed); - } - }; - - let res = { - let _calc_span = info_span!(parent: image_span.clone(), "calculate_diff", - actual_size = img1.len(), - expected_size = img2.len() - ).entered(); - match image_diff_rs::diff( - img1, - img2, - &DiffOption { - threshold: options.matching_threshold, - include_anti_alias: Some(!options.enable_antialias.unwrap_or_default()), - encode_format: options - .diff_image_format - .map(EncodeFormat::from), - }, - ) { - Ok(r) => r, - Err(e) => { - eprintln!( - "[reg-cli] failed to diff {}: {}", - path.display(), - e - ); - emit_progress("fail", &path.display().to_string()); - return (path.clone(), ImageOutcome::Failed); - } - } - }; - - // Fire the live pass/fail event as early as we can — - // right after the pixel-diff completes, before the - // caller-thread serialises through `collect`. Classify - // here (not in the post-collect loop) so consumers see - // progress while other rayon threads are still working - // on remaining images. - let kind = match &res { - DiffOutput::Eq => "pass", - DiffOutput::NotEq { - diff_count, - width, - height, - .. - } => { - if is_passed( - *width, - *height, - *diff_count as u64, - options.threshold_pixel, - options.threshold_rate, - ) { - "pass" - } else { - "fail" - } - } - }; - emit_progress(kind, &path.display().to_string()); - - (path.clone(), ImageOutcome::Ok(res)) - }) - .collect::>() - }) - }; - - let mut differences = BTreeSet::new(); - let mut passed = BTreeSet::new(); - let mut failed = BTreeSet::new(); - - for (image_name, item) in result.iter() { - match item { - ImageOutcome::Failed => { - // Per-file read/decode failure: count as failed but - // don't try to write a diff image (we have no pixels). - failed.insert(image_name.clone()); - } - ImageOutcome::Ok(DiffOutput::Eq) => { - passed.insert(image_name.clone()); - } - ImageOutcome::Ok(DiffOutput::NotEq { - diff_count, - diff_image, - width, - height, - }) => { - if is_passed( - width.clone(), - height.clone(), - diff_count.clone() as u64, - options.threshold_pixel, - options.threshold_rate, - ) { - passed.insert(image_name.clone()); - } else { - let mut diff_image_name = image_name.clone(); - failed.insert(image_name.clone()); - diff_image_name.set_extension( - options - .diff_image_format - .unwrap_or_default() - .extension(), - ); - differences.insert(diff_image_name.clone()); - - let diff_path = diff_dir.join(&diff_image_name); - if let Some(parent) = diff_path.parent() { - std::fs::create_dir_all(parent).map_err(|e| { - eprintln!("Failed to create diff directory: {:?}, error: {:?}", parent, e); - e - })?; - } - std::fs::write(&diff_path, diff_image).map_err(|e| { - eprintln!("Failed to write diff file: {:?}, error: {:?}", diff_path, e); - e - })?; - } - } - } - } - - let report = { - let _report_span = info_span!("create_reports").entered(); - info!( - passed_count = passed.len(), - failed_count = failed.len(), - new_count = detected.new.len(), - deleted_count = detected.deleted.len(), - "Creating reports" - ); - create_reports(report::ReportInput { - passed, - failed, - new: detected.new, - deleted: detected.deleted, - actual: detected.actual, - expected: detected.expected, - report, - differences, - json: json_path, - actual_dir, - expected_dir, - diff_dir, - from_json: false, - url_prefix: options.url_prefix, - diff_image_extention: options - .diff_image_format - .unwrap_or_default() - .extension(), - enable_client_additional_detection: options - .enable_client_additional_detection - .unwrap_or(false), - }) - }; - - if let (Some(html), Some(report_path)) = (report.html, options.report) { - let _write_span = info_span!("write_report", path = %report_path.display()).entered(); - if let Some(parent) = report_path.parent() { - std::fs::create_dir_all(parent).map_err(|e| { - eprintln!("Failed to create report directory: {:?}, error: {:?}", parent, e); - e - })?; - } - std::fs::write(report_path, html).map_err(|e| { - eprintln!("Failed to write report file: {:?}, error: {:?}", report_path, e); - e - })?; - info!(path = %report_path.display(), "Report written"); - }; - - // Persist reg.json to disk. Previously this was done on the JS side after - // the Wasm returned the string; moving it to Rust makes the contract - // symmetric with HTML / diff images (reg_core writes every artefact it - // knows how to produce) and keeps the non-wasm `cargo run` CLI useful. - { - let _write_span = info_span!("write_json", path = %json_path.display()).entered(); - if let Some(parent) = json_path.parent() { - std::fs::create_dir_all(parent).ok(); - } - let body = serde_json::to_string_pretty(&report.json).map_err(|e| { - eprintln!("Failed to serialize reg.json: {:?}", e); - std::io::Error::new(std::io::ErrorKind::Other, e) - })?; - std::fs::write(json_path, body + "\n").map_err(|e| { - eprintln!("Failed to write {:?}: {:?}", json_path, e); - e - })?; - } - - // JUnit XML (optional). - if let Some(junit_path) = options.junit_report { - let _write_span = info_span!("write_junit", path = %junit_path.display()).entered(); - if let Some(parent) = junit_path.parent() { - std::fs::create_dir_all(parent).ok(); - } - let xml = report::build_junit_xml( - &report.json, - options.extended_errors.unwrap_or(false), - ); - std::fs::write(junit_path, xml).map_err(|e| { - eprintln!("Failed to write {:?}: {:?}", junit_path, e); - e - })?; - } - - info!("Comparison complete"); - Ok(report.json) -} - -/// Re-render the HTML report from an existing `reg.json` WITHOUT running any -/// image comparison. Mirrors classic reg-cli's `-F / --from` mode. -/// -/// `json_path` is the source reg.json; `options.report` is where to write -/// the resulting HTML; `options.junit_report` / `options.enable_client_*` are -/// honoured as usual. -pub fn run_from_json( - json_path: impl AsRef, - options: Options, -) -> Result { - let _root = info_span!("run_from_json", path = %json_path.as_ref().display()).entered(); - let content = std::fs::read_to_string(json_path.as_ref())?; - let json: JsonReport = serde_json::from_str(&content).map_err(|e| { - eprintln!("Failed to parse {:?}: {:?}", json_path.as_ref(), e); - std::io::Error::new(std::io::ErrorKind::InvalidData, e) - })?; - - let report_path = options - .report - .unwrap_or_else(|| Path::new(DEFAULT_REPORT_PATH)); - let out_json_path = options.json.unwrap_or_else(|| Path::new(DEFAULT_JSON_PATH)); - - // Rebuild ReportInput fields from the parsed JsonReport. Note: the JSON's - // actualDir / expectedDir / diffDir are already strings the template - // expects, so `from_json: true` makes the template use them verbatim - // rather than re-resolving via `resolve_dir`. - let report = { - let _s = info_span!("create_reports_from_json").entered(); - create_reports(report::ReportInput { - passed: json.passed_items.clone(), - failed: json.failed_items.clone(), - new: json.new_items.clone(), - deleted: json.deleted_items.clone(), - actual: json.actual_items.clone(), - expected: json.expected_items.clone(), - differences: json.diff_items.clone(), - report: report_path, - json: out_json_path, - actual_dir: Path::new(&json.actual_dir), - expected_dir: Path::new(&json.expected_dir), - diff_dir: Path::new(&json.diff_dir), - from_json: true, - url_prefix: options.url_prefix, - diff_image_extention: options - .diff_image_format - .unwrap_or_default() - .extension(), - enable_client_additional_detection: options - .enable_client_additional_detection - .unwrap_or(false), - }) - }; - - if let Some(html) = report.html { - if let Some(parent) = report_path.parent() { - std::fs::create_dir_all(parent).ok(); - } - std::fs::write(report_path, html)?; - info!(path = %report_path.display(), "Report written (from-json mode)"); - } - - if let Some(junit_path) = options.junit_report { - if let Some(parent) = junit_path.parent() { - std::fs::create_dir_all(parent).ok(); - } - std::fs::write( - junit_path, - report::build_junit_xml(&report.json, options.extended_errors.unwrap_or(false)), - )?; - } - - Ok(report.json) -} - -// Recursively collect supported image files under `root`, returning paths -// relative to `root` (not absolute). -// -// We avoid `glob::glob` here even though the upstream API would be a -// one-liner. Rationale: -// -// `glob::glob("deep/a/b/actual/**/*")` walks from `.` and opens each -// intermediate directory (`.`, `deep`, `deep/a`, …) to enumerate. Under -// our WASI sandbox the preopen we register is the common-ancestor -// directory (e.g. `./deep/a/b`), so `.` / `deep` / `deep/a` are OUTSIDE -// the sandbox and `read_dir` on them fails. glob swallows that error -// and returns 0 matches — silent data loss: reg.json comes back with -// every list empty, exit code 0, HTML report says "success". -// -// `std::fs::read_dir(root)` on the other hand starts at an absolute-ish -// path that wasi-libc's `__wasilibc_find_relpath` CAN resolve to the -// preopen fd directly (verified empirically). So a direct recursive -// walker starting at `root` sidesteps the trap without needing any -// sandbox widening. -fn walk_images(root: &Path) -> BTreeSet { - let mut out = BTreeSet::new(); - // `root` itself might not exist (e.g. a brand-new actual/ dir that a - // user forgot to populate). Classic reg-cli treats that as "no images - // here" rather than erroring out, so we do too. - let Ok(entries) = std::fs::read_dir(root) else { - return out; - }; - let mut stack: Vec = vec![entries]; - while let Some(dir) = stack.last_mut() { - match dir.next() { - Some(Ok(entry)) => { - let p = entry.path(); - let Ok(ft) = entry.file_type() else { continue }; - if ft.is_dir() { - if let Ok(sub) = std::fs::read_dir(&p) { - stack.push(sub); - } - } else if is_supported_extension(&p) { - // Strip `root` so callers get repo-relative paths like - // `sample.png` or `sub/sample.png`, matching what - // glob used to produce after `.strip_prefix(root)`. - if let Ok(rel) = p.strip_prefix(root) { - out.insert(rel.to_path_buf()); - } - } - } - Some(Err(_)) | None => { - stack.pop(); - } - } - } - out -} - -#[instrument(fields(expected_dir = %expected_dir.as_ref().display(), actual_dir = %actual_dir.as_ref().display()))] -pub(crate) fn find_images( - expected_dir: impl AsRef, - actual_dir: impl AsRef, -) -> DetectedImages { - let expected_dir = expected_dir.as_ref(); - let actual_dir = actual_dir.as_ref(); - - let expected: BTreeSet = walk_images(expected_dir); - let actual: BTreeSet = walk_images(actual_dir); - - let deleted: BTreeSet = expected.difference(&actual).cloned().collect(); - let new: BTreeSet = actual.difference(&expected).cloned().collect(); - - info!( - expected_count = expected.len(), - actual_count = actual.len(), - deleted_count = deleted.len(), - new_count = new.len(), - "Found images" - ); - - DetectedImages { - expected, - actual, - deleted, - new, - } -} - -fn is_passed( - width: u32, - height: u32, - diff_count: u64, - threshold_pixel: Option, - threshold_rate: Option, -) -> bool { - if let Some(t) = threshold_pixel { - diff_count <= t - } else if let Some(t) = threshold_rate { - let pixel = width * height; - let ratio = diff_count as f32 / pixel as f32; - ratio <= t - } else { - diff_count == 0 - } -} - -#[cfg(test)] -mod per_image_failure_tests { - use super::*; - use std::fs; - - /// Smallest possible 1×1 PNG (transparent pixel). Used for the - /// "valid neighbour" image so we can assert that a corrupt sibling - /// doesn't sink the whole batch. - const TINY_PNG: &[u8] = &[ - 0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, 0x00, 0x0d, 0x49, 0x48, 0x44, - 0x52, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x08, 0x06, 0x00, 0x00, 0x00, 0x1f, - 0x15, 0xc4, 0x89, 0x00, 0x00, 0x00, 0x0d, 0x49, 0x44, 0x41, 0x54, 0x78, 0x9c, 0x63, 0x00, - 0x01, 0x00, 0x00, 0x05, 0x00, 0x01, 0x0d, 0x0a, 0x2d, 0xb4, 0x00, 0x00, 0x00, 0x00, 0x49, - 0x45, 0x4e, 0x44, 0xae, 0x42, 0x60, 0x82, - ]; - - fn mkdirs(root: &Path) -> (PathBuf, PathBuf, PathBuf) { - let actual = root.join("actual"); - let expected = root.join("expected"); - let diff = root.join("diff"); - fs::create_dir_all(&actual).unwrap(); - fs::create_dir_all(&expected).unwrap(); - fs::create_dir_all(&diff).unwrap(); - (actual, expected, diff) - } - - /// A single corrupt PNG (0 bytes) on both sides must NOT bubble up - /// as `Err(CompareError)`. It must show up as a `failedItems` entry, - /// while the neighbouring valid pair still passes through normally. - #[test] - fn corrupt_png_is_recorded_as_failed_not_propagated() { - let tmp = tempfile::tempdir().unwrap(); - let (actual, expected, diff) = mkdirs(tmp.path()); - - // Valid pair (same bytes → pass) - fs::write(actual.join("good.png"), TINY_PNG).unwrap(); - fs::write(expected.join("good.png"), TINY_PNG).unwrap(); - - // Corrupt pair: looks like a PNG (right extension, file exists, - // non-zero so find_images doesn't drop it as a delete) but the - // bytes are not a valid image — image_diff_rs will Err on decode. - // Bytes must DIFFER between sides so the lib can't byte-eq fast-path - // its way to a fake "pass". - fs::write(actual.join("bad.png"), b"this is definitely not a png AAA").unwrap(); - fs::write(expected.join("bad.png"), b"this is definitely not a png BBB").unwrap(); - - let report = run(&actual, &expected, &diff, Options::default()) - .expect("per-image decode failures must not propagate as Err"); - - // good.png passed, bad.png went into failedItems. - let passed: Vec = report.passed_items.iter().map(|p| p.display().to_string()).collect(); - let failed: Vec = report.failed_items.iter().map(|p| p.display().to_string()).collect(); - assert!(passed.iter().any(|s| s == "good.png"), "good.png should pass, got passed={:?}", passed); - assert!(failed.iter().any(|s| s == "bad.png"), "bad.png should fail, got failed={:?}", failed); - } - -/// Non-image extensions (`.txt`, `.md`, etc.) are filtered out by - /// `find_images` upstream — they should NOT show up in any of the - /// output buckets. This locks in the "silently skip non-images" - /// contract documented in `SUPPORTED_EXTENTIONS`. - #[test] - fn non_image_extensions_are_silently_skipped() { - let tmp = tempfile::tempdir().unwrap(); - let (actual, expected, diff) = mkdirs(tmp.path()); - - fs::write(actual.join("ok.png"), TINY_PNG).unwrap(); - fs::write(expected.join("ok.png"), TINY_PNG).unwrap(); - // Random non-image siblings on both sides. - fs::write(actual.join("README.md"), b"hello").unwrap(); - fs::write(expected.join("notes.txt"), b"world").unwrap(); - - let report = run(&actual, &expected, &diff, Options::default()).unwrap(); - - for bucket in [ - &report.passed_items, - &report.failed_items, - &report.new_items, - &report.deleted_items, - ] { - let names: Vec = bucket.iter().map(|p| p.display().to_string()).collect(); - assert!( - names.iter().all(|n| !n.ends_with(".md") && !n.ends_with(".txt")), - "non-image leaked into a bucket: {:?}", - names - ); - } - } -} diff --git a/crates/reg_core/src/report.rs b/crates/reg_core/src/report.rs deleted file mode 100644 index 79cc0b71..00000000 --- a/crates/reg_core/src/report.rs +++ /dev/null @@ -1,504 +0,0 @@ -use std::{ - collections::BTreeSet, - path::{Path, PathBuf}, -}; - -use base64::{engine::general_purpose::STANDARD as BASE64_STANDARD, Engine as _}; -use bytes::Bytes; -use mustache::MapBuilder; -use serde::{Deserialize, Serialize}; - -use crate::dir::resolve_dir; - -#[derive(Debug, Serialize)] -#[serde(rename_all = "camelCase")] -pub(crate) enum ReportStatus { - Success, - Danger, -} - -pub(crate) struct ReportInput<'a> { - pub(crate) passed: BTreeSet, - pub(crate) failed: BTreeSet, - pub(crate) new: BTreeSet, - pub(crate) deleted: BTreeSet, - pub(crate) expected: BTreeSet, - pub(crate) actual: BTreeSet, - pub(crate) differences: BTreeSet, - pub(crate) json: &'a Path, - pub(crate) actual_dir: &'a Path, - pub(crate) expected_dir: &'a Path, - pub(crate) diff_dir: &'a Path, - pub(crate) report: &'a Path, - // extendedErrors: boolean, - pub(crate) url_prefix: Option, - pub(crate) enable_client_additional_detection: bool, - pub(crate) from_json: bool, - pub(crate) diff_image_extention: &'static str, -} - -#[derive(Debug, Serialize)] -#[serde(rename_all = "camelCase")] -pub(crate) struct ReportItem { - pub(crate) raw: String, - pub(crate) encoded: String, -} - -impl From for ReportItem { - fn from(item: PathBuf) -> Self { - let encoded = encode_file_path(&item); - ReportItem { - raw: item.display().to_string(), - encoded, - } - } -} - -#[derive(Debug, Serialize)] -#[serde(rename_all = "camelCase")] -pub(crate) struct XimgdiffConfig { - pub(crate) enabled: bool, - pub(crate) worker_url: String, -} - -#[derive(Debug, Serialize)] -#[serde(rename_all = "camelCase")] -pub(crate) struct ReportJsonInput { - r#type: ReportStatus, - has_new: bool, - new_items: Vec, - has_deleted: bool, - deleted_items: Vec, - has_passed: bool, - passed_items: Vec, - has_failed: bool, - failed_items: Vec, - actual_dir: PathBuf, - expected_dir: PathBuf, - diff_dir: PathBuf, - diff_image_extention: &'static str, - ximgdiff_config: XimgdiffConfig, -} - -#[derive(Debug, Serialize, Deserialize)] -#[serde(rename_all = "camelCase")] -pub struct JsonReport { - pub failed_items: BTreeSet, - pub new_items: BTreeSet, - pub deleted_items: BTreeSet, - pub passed_items: BTreeSet, - pub expected_items: BTreeSet, - pub actual_items: BTreeSet, - pub diff_items: BTreeSet, - pub actual_dir: String, - pub expected_dir: String, - pub diff_dir: String, -} - -fn encode_file_path(file_path: &Path) -> String { - file_path - .display() - .to_string() - .split(std::path::MAIN_SEPARATOR) - .map(|p| urlencoding::encode(p).into()) - .collect::>() - .join(std::path::MAIN_SEPARATOR_STR) -} - -pub(crate) struct Reports { - pub(crate) json: JsonReport, - pub(crate) html: Option, -} - -/// Render an image directory path for a reg.json entry, optionally resolved -/// against `url` when `urlPrefix` was supplied. Falls back to the bare -/// relative path on unjoinable URLs (e.g. malformed prefix, non-hierarchical -/// scheme) rather than panicking — classic reg-cli lets garbage -/// url-prefixes through silently, so we do the same and log. `urlPrefix` is -/// validated at the clap layer (it takes `url::Url` directly), so this -/// fallback is defensive and almost never exercised. -pub fn create_dir_for_json_report<'a>( - json: &'a Path, - dir: &'a Path, - url: Option, -) -> String { - let relative = resolve_dir(json, dir).to_string_lossy().to_string(); - if let Some(url) = url { - match url.join(&relative) { - Ok(u) => u.to_string(), - Err(e) => { - tracing::warn!( - url = %url, - relative = %relative, - error = %e, - "url_prefix.join failed — falling back to relative path in reg.json", - ); - relative - } - } - } else { - relative - } -} - -pub fn create_reports(input: ReportInput) -> Reports { - let json_report = JsonReport { - failed_items: input.failed.clone(), - new_items: input.new.clone(), - deleted_items: input.deleted.clone(), - passed_items: input.passed.clone(), - expected_items: input.expected.clone(), - actual_items: input.actual.clone(), - diff_items: input.differences.clone(), - actual_dir: create_dir_for_json_report( - input.json, - input.actual_dir, - input.url_prefix.clone(), - ), - expected_dir: create_dir_for_json_report( - input.json, - input.expected_dir, - input.url_prefix.clone(), - ), - diff_dir: create_dir_for_json_report(input.json, input.diff_dir, input.url_prefix.clone()), - }; - - let html_report = { - let report = input.report; - let template = include_str!("../../../template/template.html"); - let js = include_str!("../../../report/ui/dist/report.js"); - let css = include_str!("../../../report/ui/dist/style.css"); - // Favicon payloads are committed PNG bytes under `report/assets/`. - // Classic reg-cli embeds them as data URLs too - // (`src/report.js::loadFaviconAsDataURL`) so the report is a single - // self-contained HTML file — no separate asset fetch at view time. - let favicon_success: &[u8] = - include_bytes!("../../../report/assets/favicon_success.png"); - let favicon_failure: &[u8] = - include_bytes!("../../../report/assets/favicon_failure.png"); - - let json = ReportJsonInput { - r#type: if input.failed.is_empty() { - ReportStatus::Success - } else { - ReportStatus::Danger - }, - has_new: !input.new.is_empty(), - new_items: input.new.into_iter().map(ReportItem::from).collect(), - has_deleted: !input.deleted.is_empty(), - deleted_items: input.deleted.into_iter().map(ReportItem::from).collect(), - has_passed: !input.passed.is_empty(), - passed_items: input.passed.into_iter().map(ReportItem::from).collect(), - has_failed: !input.differences.is_empty(), - failed_items: input - .differences - .into_iter() - .map(ReportItem::from) - .collect(), - actual_dir: if input.from_json { - input.actual_dir.into() - } else { - resolve_dir(report, input.actual_dir).into() - }, - expected_dir: if input.from_json { - input.expected_dir.into() - } else { - resolve_dir(report, input.expected_dir).into() - }, - diff_dir: if input.from_json { - input.diff_dir.into() - } else { - resolve_dir(report, input.diff_dir).into() - }, - diff_image_extention: input.diff_image_extention, - ximgdiff_config: XimgdiffConfig { - enabled: input.enable_client_additional_detection, - worker_url: "./worker.js".to_string(), - }, - }; - - // Render with base64-encoded PNG bytes so the `` placeholder gets a self-contained - // data URL. Choice of success/failure favicon mirrors - // `json.type == Success/Danger` (i.e. presence of failures/new/deleted - // in the report), same rule classic uses. - let favicon_bytes = match &json.r#type { - ReportStatus::Success => favicon_success, - ReportStatus::Danger => favicon_failure, - }; - let favicon_data = format!( - "data:image/png;base64,{}", - BASE64_STANDARD.encode(favicon_bytes) - ); - let data = MapBuilder::new() - .insert_str("js", js) - .insert_str("css", css) - .insert_str("faviconData", favicon_data) - .insert_str( - "report", - serde_json::to_string(&json).expect("should convert."), - ) - .build(); - let template = mustache::compile_str(template).expect("should compile template."); - let mut html = vec![]; - template - .render_data(&mut html, &data) - .expect("should render report."); - Some(html.into()) - }; - - Reports { - json: json_report, - html: html_report, - } -} - -/// Build a JUnit XML document byte-compatible with classic reg-cli's -/// `src/report.js` output (via `xmlbuilder2`). -/// -/// ```xml -/// -/// -/// -/// -/// -/// -/// -/// -/// -/// ``` -/// -/// Semantics (match classic exactly): -/// - `failedItems` always emit ``. -/// - `newItems` / `deletedItems` become `` -/// ONLY when `extended_errors` is set; otherwise they are reported as -/// passed testcases. -/// - `passedItems` emit bare ``. -/// - `tests` / `failures` attributes appear on BOTH `` and the -/// nested ``. -/// - Output is pretty-printed with 2-space indent, no `encoding=` -/// declaration, no trailing newline (xmlbuilder2's `prettyPrint: true`). -pub(crate) fn build_junit_xml(report: &JsonReport, extended_errors: bool) -> String { - fn esc(s: &str) -> String { - s.replace('&', "&") - .replace('<', "<") - .replace('>', ">") - .replace('"', """) - } - - // Classify items. In non-extended mode, new/deleted are treated as - // successful tests so CI doesn't go red on baseline additions. - let mut passed_names: Vec = Vec::new(); - let mut failure_cases: Vec<(String, &'static str)> = Vec::new(); - - for p in &report.failed_items { - failure_cases.push((p.display().to_string(), "failed")); - } - for p in &report.new_items { - if extended_errors { - failure_cases.push((p.display().to_string(), "newItem")); - } else { - passed_names.push(p.display().to_string()); - } - } - for p in &report.deleted_items { - if extended_errors { - failure_cases.push((p.display().to_string(), "deletedItem")); - } else { - passed_names.push(p.display().to_string()); - } - } - for p in &report.passed_items { - passed_names.push(p.display().to_string()); - } - - let failures = failure_cases.len(); - let tests = passed_names.len() + failures; - - // Classic's testcase ordering is: failed, new, deleted, passed (the order - // classic's forEach loop visits them). `failure_cases` already holds - // failed→new→deleted in that order; `passed_names` holds - // new-treated-as-passed → deleted-as-passed → passed in order. - let mut cases: Vec = Vec::with_capacity(tests); - for p in &report.failed_items { - cases.push(format!( - " \n \n ", - esc(&p.display().to_string()) - )); - } - for p in &report.new_items { - if extended_errors { - cases.push(format!( - " \n \n ", - esc(&p.display().to_string()) - )); - } else { - cases.push(format!( - " ", - esc(&p.display().to_string()) - )); - } - } - for p in &report.deleted_items { - if extended_errors { - cases.push(format!( - " \n \n ", - esc(&p.display().to_string()) - )); - } else { - cases.push(format!( - " ", - esc(&p.display().to_string()) - )); - } - } - for p in &report.passed_items { - cases.push(format!( - " ", - esc(&p.display().to_string()) - )); - } - - // No encoding attr, no trailing newline — matches xmlbuilder2's default - // when created with `{ version: '1.0' }` and rendered with `prettyPrint: true`. - if cases.is_empty() { - format!( - "\n\n \n" - ) - } else { - format!( - "\n\n \n{cases}\n \n", - cases = cases.join("\n"), - ) - } -} - -#[cfg(test)] -mod tests { - use super::*; - - fn mk_report( - passed: &[&str], - failed: &[&str], - new: &[&str], - deleted: &[&str], - ) -> JsonReport { - let to_set = |s: &[&str]| -> BTreeSet { - s.iter().map(|x| PathBuf::from(x)).collect() - }; - JsonReport { - passed_items: to_set(passed), - failed_items: to_set(failed), - new_items: to_set(new), - deleted_items: to_set(deleted), - // The rest are irrelevant to junit output; empty is fine. - expected_items: BTreeSet::new(), - actual_items: BTreeSet::new(), - diff_items: BTreeSet::new(), - actual_dir: String::new(), - expected_dir: String::new(), - diff_dir: String::new(), - } - } - - // Reference bytes come from classic reg-cli (src/report.js via - // xmlbuilder2, { version: '1.0' }, prettyPrint: true). The - // `test/cli.test.mjs` snapshot tests pin these exact bytes, so the - // expected strings below are the same ones the classic test suite - // asserts on. - - #[test] - fn junit_single_failure() { - let r = mk_report(&[], &["sample(cal).png"], &[], &[]); - let xml = build_junit_xml(&r, /*extended=*/ false); - assert_eq!( - xml, - r#" - - - - - - -"# - ); - } - - #[test] - fn junit_passed_and_failed_mix() { - let r = mk_report(&["ok.png"], &["bad.png"], &[], &[]); - let xml = build_junit_xml(&r, false); - assert_eq!( - xml, - r#" - - - - - - - -"# - ); - } - - #[test] - fn junit_new_and_deleted_not_extended_are_passed() { - // Without -E, new/deleted items are counted as passed tests. - let r = mk_report(&[], &[], &["added.png"], &["gone.png"]); - let xml = build_junit_xml(&r, false); - assert_eq!( - xml, - r#" - - - - - -"# - ); - } - - #[test] - fn junit_new_and_deleted_extended_are_failures() { - // With -E, they become . - let r = mk_report(&[], &[], &["added.png"], &["gone.png"]); - let xml = build_junit_xml(&r, true); - assert_eq!( - xml, - r#" - - - - - - - - - -"# - ); - } - - #[test] - fn junit_escapes_xml_special_chars_in_name() { - let r = mk_report(&[], &[r#"a&bd".png"#], &[], &[]); - let xml = build_junit_xml(&r, false); - // Only attribute-value escapes matter here (name="..."). Classic - // xmlbuilder2 also escapes all five, but quoting is consistent. - assert!(xml.contains(r#"name="a&b<c>d".png""#)); - } - - #[test] - fn junit_empty_report_has_self_closing_testsuite() { - let r = mk_report(&[], &[], &[], &[]); - let xml = build_junit_xml(&r, false); - assert_eq!( - xml, - r#" - - -"# - ); - } -} diff --git a/crates/reg_core/src/tracing_layer.rs b/crates/reg_core/src/tracing_layer.rs deleted file mode 100644 index e47731d8..00000000 --- a/crates/reg_core/src/tracing_layer.rs +++ /dev/null @@ -1,323 +0,0 @@ -//! Custom tracing layer for collecting span data to be sent to JS side -//! -//! Since WASI doesn't support direct HTTP connections, we collect trace data -//! and pass it to the JS side via WASM exports, where it's converted to OpenTelemetry spans. - -use once_cell::sync::Lazy; -use serde::{Deserialize, Serialize}; -use std::collections::HashMap; -use std::sync::atomic::{AtomicU64, Ordering}; -use std::sync::Mutex; -use std::time::{Duration, SystemTime, UNIX_EPOCH}; -use tracing::span::{Attributes, Id, Record}; -use tracing::{Event, Subscriber}; -use tracing_subscriber::layer::Context; -use tracing_subscriber::registry::LookupSpan; -use tracing_subscriber::Layer; - -/// Global counter for generating unique span IDs -static SPAN_ID_COUNTER: AtomicU64 = AtomicU64::new(1); - -/// Represents a completed span with all its metadata -#[derive(Debug, Clone, Serialize, Deserialize)] -pub struct SpanData { - /// Unique identifier for this span - pub span_id: String, - /// Parent span id if any - pub parent_span_id: Option, - /// Name of the span (usually the function/operation name) - pub name: String, - /// Start timestamp in milliseconds since UNIX epoch - pub start_time_ms: u64, - /// End timestamp in milliseconds since UNIX epoch - pub end_time_ms: u64, - /// Duration in milliseconds - pub duration_ms: u64, - /// Span level (trace, debug, info, warn, error) - pub level: String, - /// Target module path - pub target: String, - /// Custom attributes - pub attributes: HashMap, - /// Status: "ok" or "error" - pub status: String, - /// Error message if status is "error" - pub error_message: Option, -} - -/// Container for all collected spans -#[derive(Debug, Default, Serialize, Deserialize)] -pub struct TraceData { - /// Service name - pub service_name: String, - /// Trace ID from JS side (for context propagation) - pub trace_id: Option, - /// Parent span ID from JS side (for context propagation) - pub js_parent_span_id: Option, - /// All completed spans - pub spans: Vec, -} - -/// Global storage for trace data -static TRACE_COLLECTOR: Lazy> = - Lazy::new(|| Mutex::new(TraceCollector::new())); - -struct TraceCollector { - spans: Vec, - /// Maps tracing crate's span ID to our unique span ID - id_mapping: HashMap, - active_spans: HashMap, - /// Trace ID from JS side - trace_id: Option, - /// Parent span ID from JS side - js_parent_span_id: Option, -} - -struct ActiveSpan { - unique_id: u64, - name: String, - start_time_ms: u64, - parent_unique_id: Option, - level: String, - target: String, - attributes: HashMap, -} - -impl TraceCollector { - fn new() -> Self { - Self { - spans: Vec::new(), - id_mapping: HashMap::new(), - active_spans: HashMap::new(), - trace_id: None, - js_parent_span_id: None, - } - } - - fn current_time_ms() -> u64 { - SystemTime::now() - .duration_since(UNIX_EPOCH) - .unwrap_or(Duration::ZERO) - .as_millis() as u64 - } - - fn generate_unique_id() -> u64 { - SPAN_ID_COUNTER.fetch_add(1, Ordering::SeqCst) - } - - fn set_js_context(&mut self, trace_id: Option, parent_span_id: Option) { - self.trace_id = trace_id; - self.js_parent_span_id = parent_span_id; - } - - fn start_span(&mut self, tracing_id: u64, parent_tracing_id: Option, name: String, level: String, target: String) { - let start_time_ms = Self::current_time_ms(); - let unique_id = Self::generate_unique_id(); - - // Map tracing's ID to our unique ID - self.id_mapping.insert(tracing_id, unique_id); - - // Look up parent's unique ID - let parent_unique_id = parent_tracing_id.and_then(|pid| self.id_mapping.get(&pid).copied()); - - self.active_spans.insert( - tracing_id, - ActiveSpan { - unique_id, - name, - start_time_ms, - parent_unique_id, - level, - target, - attributes: HashMap::new(), - }, - ); - } - - fn record_attribute(&mut self, tracing_id: u64, key: String, value: String) { - if let Some(span) = self.active_spans.get_mut(&tracing_id) { - span.attributes.insert(key, value); - } - } - - fn end_span(&mut self, tracing_id: u64, error_message: Option) { - if let Some(active) = self.active_spans.remove(&tracing_id) { - let end_time_ms = Self::current_time_ms(); - // Calculate duration from timestamps (more reliable in WASI) - let duration_ms = end_time_ms.saturating_sub(active.start_time_ms); - - self.spans.push(SpanData { - span_id: format!("{:016x}", active.unique_id), - parent_span_id: active.parent_unique_id.map(|pid| format!("{:016x}", pid)), - name: active.name, - start_time_ms: active.start_time_ms, - end_time_ms, - duration_ms, - level: active.level, - target: active.target, - attributes: active.attributes, - status: if error_message.is_some() { - "error".to_string() - } else { - "ok".to_string() - }, - error_message, - }); - } - - // Note: We keep id_mapping entries for now in case of late references - } -} - -/// Custom tracing layer that collects span data -pub struct CollectorLayer; - -impl CollectorLayer { - pub fn new() -> Self { - Self - } -} - -impl Layer for CollectorLayer -where - S: Subscriber + for<'a> LookupSpan<'a>, -{ - fn on_new_span(&self, attrs: &Attributes<'_>, id: &Id, ctx: Context<'_, S>) { - let span = ctx.span(id).expect("Span not found"); - - // Try to get parent from explicit parent first, then from current context - let parent_id = span - .parent() - .map(|p| p.id().into_u64()) - .or_else(|| { - // If no explicit parent, check current span context (for implicit parenting) - ctx.current_span().id().map(|id| id.into_u64()) - }); - - let metadata = span.metadata(); - let name = metadata.name().to_string(); - let level = format!("{:?}", metadata.level()); - let target = metadata.target().to_string(); - - if let Ok(mut collector) = TRACE_COLLECTOR.lock() { - collector.start_span(id.into_u64(), parent_id, name, level, target); - } - - // Record initial attributes - let mut visitor = AttributeVisitor { id: id.into_u64() }; - attrs.record(&mut visitor); - } - - fn on_record(&self, id: &Id, values: &Record<'_>, _ctx: Context<'_, S>) { - let mut visitor = AttributeVisitor { id: id.into_u64() }; - values.record(&mut visitor); - } - - fn on_event(&self, event: &Event<'_>, ctx: Context<'_, S>) { - // Record events as attributes on the current span - if let Some(span) = ctx.current_span().id() { - let mut visitor = AttributeVisitor { - id: span.into_u64(), - }; - event.record(&mut visitor); - } - } - - fn on_close(&self, id: Id, _ctx: Context<'_, S>) { - if let Ok(mut collector) = TRACE_COLLECTOR.lock() { - collector.end_span(id.into_u64(), None); - } - } -} - -struct AttributeVisitor { - id: u64, -} - -impl tracing::field::Visit for AttributeVisitor { - fn record_debug(&mut self, field: &tracing::field::Field, value: &dyn std::fmt::Debug) { - if let Ok(mut collector) = TRACE_COLLECTOR.lock() { - collector.record_attribute(self.id, field.name().to_string(), format!("{:?}", value)); - } - } - - fn record_str(&mut self, field: &tracing::field::Field, value: &str) { - if let Ok(mut collector) = TRACE_COLLECTOR.lock() { - collector.record_attribute(self.id, field.name().to_string(), value.to_string()); - } - } - - fn record_i64(&mut self, field: &tracing::field::Field, value: i64) { - if let Ok(mut collector) = TRACE_COLLECTOR.lock() { - collector.record_attribute(self.id, field.name().to_string(), value.to_string()); - } - } - - fn record_u64(&mut self, field: &tracing::field::Field, value: u64) { - if let Ok(mut collector) = TRACE_COLLECTOR.lock() { - collector.record_attribute(self.id, field.name().to_string(), value.to_string()); - } - } - - fn record_bool(&mut self, field: &tracing::field::Field, value: bool) { - if let Ok(mut collector) = TRACE_COLLECTOR.lock() { - collector.record_attribute(self.id, field.name().to_string(), value.to_string()); - } - } -} - -/// Initialize tracing with the collector layer -pub fn init_tracing() { - use tracing_subscriber::prelude::*; - - let collector_layer = CollectorLayer::new(); - - tracing_subscriber::registry() - .with(collector_layer) - .init(); -} - -/// Set JS context for trace propagation -/// This should be called before starting any spans to link Rust spans to JS parent -pub fn set_js_trace_context(trace_id: Option<&str>, parent_span_id: Option<&str>) { - if let Ok(mut collector) = TRACE_COLLECTOR.lock() { - collector.set_js_context( - trace_id.map(|s| s.to_string()), - parent_span_id.map(|s| s.to_string()), - ); - } -} - -/// Get all collected trace data as JSON string -pub fn get_trace_data_json() -> String { - let (spans, trace_id, js_parent_span_id) = if let Ok(collector) = TRACE_COLLECTOR.lock() { - ( - collector.spans.clone(), - collector.trace_id.clone(), - collector.js_parent_span_id.clone(), - ) - } else { - (Vec::new(), None, None) - }; - - let trace_data = TraceData { - service_name: "reg-cli-wasm".to_string(), - trace_id, - js_parent_span_id, - spans, - }; - - serde_json::to_string(&trace_data).unwrap_or_else(|_| "{}".to_string()) -} - -/// Clear all collected trace data -pub fn clear_trace_data() { - if let Ok(mut collector) = TRACE_COLLECTOR.lock() { - collector.spans.clear(); - collector.active_spans.clear(); - collector.id_mapping.clear(); - collector.trace_id = None; - collector.js_parent_span_id = None; - } -} - diff --git a/decls/cli-spinner.js b/decls/cli-spinner.js new file mode 100644 index 00000000..77bccf1d --- /dev/null +++ b/decls/cli-spinner.js @@ -0,0 +1,5 @@ +declare module 'cli-spinner' { + declare var Spinner:any; +}; + + diff --git a/decls/glob.js b/decls/glob.js new file mode 100644 index 00000000..d0bea637 --- /dev/null +++ b/decls/glob.js @@ -0,0 +1,3 @@ +declare module 'glob' { + declare function sync(path: string): string[]; +}; diff --git a/decls/img-diff.js b/decls/img-diff.js new file mode 100644 index 00000000..0b891c19 --- /dev/null +++ b/decls/img-diff.js @@ -0,0 +1,21 @@ +type Params = { + actualFilename: string; + expectedFilename: string; + diffFilename: string; + options: { + threshold: number; + includeAA: boolean; + } +} + +type Result = { + width: number; + height: number; + imagesAreSame: boolean; + diffCount: number; +} + +declare module 'img-diff-js' { + declare function imgDiff(p: Params): Promise; +}; + diff --git a/decls/mkdirp.js b/decls/mkdirp.js new file mode 100644 index 00000000..ca09140f --- /dev/null +++ b/decls/mkdirp.js @@ -0,0 +1,3 @@ +declare module 'mkdirp' { + declare function sync(path: string, options?: any): string; +}; diff --git a/decls/x-img-diff-js.js b/decls/x-img-diff-js.js new file mode 100644 index 00000000..926bb76b --- /dev/null +++ b/decls/x-img-diff-js.js @@ -0,0 +1,4 @@ +declare module 'x-img-diff-js' { + declare function getBrowserJsPath(): string; + declare function getBrowserWasmPath(): string; +} diff --git a/dist/.keep b/dist/.keep new file mode 100644 index 00000000..e69de29b diff --git a/fixture.html b/fixture.html new file mode 100644 index 00000000..f7f996f5 --- /dev/null +++ b/fixture.html @@ -0,0 +1,17 @@ + + + + + + + + + +
This is fixture sample.
+ + + \ No newline at end of file diff --git a/flow-typed/npm/avaron_vx.x.x.js b/flow-typed/npm/avaron_vx.x.x.js new file mode 100644 index 00000000..32f7f1a4 --- /dev/null +++ b/flow-typed/npm/avaron_vx.x.x.js @@ -0,0 +1,122 @@ +// flow-typed signature: f42f28f31d4218206a65a460826c3bf9 +// flow-typed version: <>/avaron_v^0.0.14/flow_v0.63.1 + +/** + * This is an autogenerated libdef stub for: + * + * 'avaron' + * + * Fill this stub out by replacing all the `any` types. + * + * Once filled out, we encourage you to share your work with the + * community by sending a pull request to: + * https://github.com/flowtype/flow-typed + */ + +declare module 'avaron' { + declare module.exports: any; +} + +/** + * We include stubs for each file inside this npm package in case you need to + * require those files directly. Feel free to delete any files that aren't + * needed. + */ +declare module 'avaron/api' { + declare module.exports: any; +} + +declare module 'avaron/cli' { + declare module.exports: any; +} + +declare module 'avaron/lib/cli' { + declare module.exports: any; +} + +declare module 'avaron/lib/fork' { + declare module.exports: any; +} + +declare module 'avaron/main/create-window' { + declare module.exports: any; +} + +declare module 'avaron/main/initialize-renderer' { + declare module.exports: any; +} + +declare module 'avaron/main/messages' { + declare module.exports: any; +} + +declare module 'avaron/main/renderer-console' { + declare module.exports: any; +} + +declare module 'avaron/main/starter' { + declare module.exports: any; +} + +declare module 'avaron/renderer/console' { + declare module.exports: any; +} + +declare module 'avaron/renderer/process-adapter' { + declare module.exports: any; +} + +declare module 'avaron/renderer/starter' { + declare module.exports: any; +} + +declare module 'avaron/renderer/test-helper' { + declare module.exports: any; +} + +// Filename aliases +declare module 'avaron/api.js' { + declare module.exports: $Exports<'avaron/api'>; +} +declare module 'avaron/cli.js' { + declare module.exports: $Exports<'avaron/cli'>; +} +declare module 'avaron/index' { + declare module.exports: $Exports<'avaron'>; +} +declare module 'avaron/index.js' { + declare module.exports: $Exports<'avaron'>; +} +declare module 'avaron/lib/cli.js' { + declare module.exports: $Exports<'avaron/lib/cli'>; +} +declare module 'avaron/lib/fork.js' { + declare module.exports: $Exports<'avaron/lib/fork'>; +} +declare module 'avaron/main/create-window.js' { + declare module.exports: $Exports<'avaron/main/create-window'>; +} +declare module 'avaron/main/initialize-renderer.js' { + declare module.exports: $Exports<'avaron/main/initialize-renderer'>; +} +declare module 'avaron/main/messages.js' { + declare module.exports: $Exports<'avaron/main/messages'>; +} +declare module 'avaron/main/renderer-console.js' { + declare module.exports: $Exports<'avaron/main/renderer-console'>; +} +declare module 'avaron/main/starter.js' { + declare module.exports: $Exports<'avaron/main/starter'>; +} +declare module 'avaron/renderer/console.js' { + declare module.exports: $Exports<'avaron/renderer/console'>; +} +declare module 'avaron/renderer/process-adapter.js' { + declare module.exports: $Exports<'avaron/renderer/process-adapter'>; +} +declare module 'avaron/renderer/starter.js' { + declare module.exports: $Exports<'avaron/renderer/starter'>; +} +declare module 'avaron/renderer/test-helper.js' { + declare module.exports: $Exports<'avaron/renderer/test-helper'>; +} diff --git a/flow-typed/npm/babel-cli_vx.x.x.js b/flow-typed/npm/babel-cli_vx.x.x.js new file mode 100644 index 00000000..e38c7862 --- /dev/null +++ b/flow-typed/npm/babel-cli_vx.x.x.js @@ -0,0 +1,108 @@ +// flow-typed signature: 806967f09b0efda655ab5cd79fb33bca +// flow-typed version: <>/babel-cli_v^6.24.1/flow_v0.63.1 + +/** + * This is an autogenerated libdef stub for: + * + * 'babel-cli' + * + * Fill this stub out by replacing all the `any` types. + * + * Once filled out, we encourage you to share your work with the + * community by sending a pull request to: + * https://github.com/flowtype/flow-typed + */ + +declare module 'babel-cli' { + declare module.exports: any; +} + +/** + * We include stubs for each file inside this npm package in case you need to + * require those files directly. Feel free to delete any files that aren't + * needed. + */ +declare module 'babel-cli/bin/babel-doctor' { + declare module.exports: any; +} + +declare module 'babel-cli/bin/babel-external-helpers' { + declare module.exports: any; +} + +declare module 'babel-cli/bin/babel-node' { + declare module.exports: any; +} + +declare module 'babel-cli/bin/babel' { + declare module.exports: any; +} + +declare module 'babel-cli/lib/_babel-node' { + declare module.exports: any; +} + +declare module 'babel-cli/lib/babel-external-helpers' { + declare module.exports: any; +} + +declare module 'babel-cli/lib/babel-node' { + declare module.exports: any; +} + +declare module 'babel-cli/lib/babel/dir' { + declare module.exports: any; +} + +declare module 'babel-cli/lib/babel/file' { + declare module.exports: any; +} + +declare module 'babel-cli/lib/babel/index' { + declare module.exports: any; +} + +declare module 'babel-cli/lib/babel/util' { + declare module.exports: any; +} + +// Filename aliases +declare module 'babel-cli/bin/babel-doctor.js' { + declare module.exports: $Exports<'babel-cli/bin/babel-doctor'>; +} +declare module 'babel-cli/bin/babel-external-helpers.js' { + declare module.exports: $Exports<'babel-cli/bin/babel-external-helpers'>; +} +declare module 'babel-cli/bin/babel-node.js' { + declare module.exports: $Exports<'babel-cli/bin/babel-node'>; +} +declare module 'babel-cli/bin/babel.js' { + declare module.exports: $Exports<'babel-cli/bin/babel'>; +} +declare module 'babel-cli/index' { + declare module.exports: $Exports<'babel-cli'>; +} +declare module 'babel-cli/index.js' { + declare module.exports: $Exports<'babel-cli'>; +} +declare module 'babel-cli/lib/_babel-node.js' { + declare module.exports: $Exports<'babel-cli/lib/_babel-node'>; +} +declare module 'babel-cli/lib/babel-external-helpers.js' { + declare module.exports: $Exports<'babel-cli/lib/babel-external-helpers'>; +} +declare module 'babel-cli/lib/babel-node.js' { + declare module.exports: $Exports<'babel-cli/lib/babel-node'>; +} +declare module 'babel-cli/lib/babel/dir.js' { + declare module.exports: $Exports<'babel-cli/lib/babel/dir'>; +} +declare module 'babel-cli/lib/babel/file.js' { + declare module.exports: $Exports<'babel-cli/lib/babel/file'>; +} +declare module 'babel-cli/lib/babel/index.js' { + declare module.exports: $Exports<'babel-cli/lib/babel/index'>; +} +declare module 'babel-cli/lib/babel/util.js' { + declare module.exports: $Exports<'babel-cli/lib/babel/util'>; +} diff --git a/flow-typed/npm/babel-loader_vx.x.x.js b/flow-typed/npm/babel-loader_vx.x.x.js new file mode 100644 index 00000000..70ada55f --- /dev/null +++ b/flow-typed/npm/babel-loader_vx.x.x.js @@ -0,0 +1,67 @@ +// flow-typed signature: b1ed4114820669c4378f69022813d77a +// flow-typed version: <>/babel-loader_v^7.0.0/flow_v0.63.1 + +/** + * This is an autogenerated libdef stub for: + * + * 'babel-loader' + * + * Fill this stub out by replacing all the `any` types. + * + * Once filled out, we encourage you to share your work with the + * community by sending a pull request to: + * https://github.com/flowtype/flow-typed + */ + +declare module 'babel-loader' { + declare module.exports: any; +} + +/** + * We include stubs for each file inside this npm package in case you need to + * require those files directly. Feel free to delete any files that aren't + * needed. + */ +declare module 'babel-loader/lib/fs-cache' { + declare module.exports: any; +} + +declare module 'babel-loader/lib/index' { + declare module.exports: any; +} + +declare module 'babel-loader/lib/resolve-rc' { + declare module.exports: any; +} + +declare module 'babel-loader/lib/utils/exists' { + declare module.exports: any; +} + +declare module 'babel-loader/lib/utils/read' { + declare module.exports: any; +} + +declare module 'babel-loader/lib/utils/relative' { + declare module.exports: any; +} + +// Filename aliases +declare module 'babel-loader/lib/fs-cache.js' { + declare module.exports: $Exports<'babel-loader/lib/fs-cache'>; +} +declare module 'babel-loader/lib/index.js' { + declare module.exports: $Exports<'babel-loader/lib/index'>; +} +declare module 'babel-loader/lib/resolve-rc.js' { + declare module.exports: $Exports<'babel-loader/lib/resolve-rc'>; +} +declare module 'babel-loader/lib/utils/exists.js' { + declare module.exports: $Exports<'babel-loader/lib/utils/exists'>; +} +declare module 'babel-loader/lib/utils/read.js' { + declare module.exports: $Exports<'babel-loader/lib/utils/read'>; +} +declare module 'babel-loader/lib/utils/relative.js' { + declare module.exports: $Exports<'babel-loader/lib/utils/relative'>; +} diff --git a/flow-typed/npm/babel-plugin-transform-es2015-block-scoping_vx.x.x.js b/flow-typed/npm/babel-plugin-transform-es2015-block-scoping_vx.x.x.js new file mode 100644 index 00000000..4aa13c0e --- /dev/null +++ b/flow-typed/npm/babel-plugin-transform-es2015-block-scoping_vx.x.x.js @@ -0,0 +1,39 @@ +// flow-typed signature: 132c7110e1f7d6605329655ee5b4de13 +// flow-typed version: <>/babel-plugin-transform-es2015-block-scoping_v^6.26.0/flow_v0.63.1 + +/** + * This is an autogenerated libdef stub for: + * + * 'babel-plugin-transform-es2015-block-scoping' + * + * Fill this stub out by replacing all the `any` types. + * + * Once filled out, we encourage you to share your work with the + * community by sending a pull request to: + * https://github.com/flowtype/flow-typed + */ + +declare module 'babel-plugin-transform-es2015-block-scoping' { + declare module.exports: any; +} + +/** + * We include stubs for each file inside this npm package in case you need to + * require those files directly. Feel free to delete any files that aren't + * needed. + */ +declare module 'babel-plugin-transform-es2015-block-scoping/lib/index' { + declare module.exports: any; +} + +declare module 'babel-plugin-transform-es2015-block-scoping/lib/tdz' { + declare module.exports: any; +} + +// Filename aliases +declare module 'babel-plugin-transform-es2015-block-scoping/lib/index.js' { + declare module.exports: $Exports<'babel-plugin-transform-es2015-block-scoping/lib/index'>; +} +declare module 'babel-plugin-transform-es2015-block-scoping/lib/tdz.js' { + declare module.exports: $Exports<'babel-plugin-transform-es2015-block-scoping/lib/tdz'>; +} diff --git a/flow-typed/npm/babel-plugin-transform-flow-strip-types_vx.x.x.js b/flow-typed/npm/babel-plugin-transform-flow-strip-types_vx.x.x.js new file mode 100644 index 00000000..fc9606ae --- /dev/null +++ b/flow-typed/npm/babel-plugin-transform-flow-strip-types_vx.x.x.js @@ -0,0 +1,32 @@ +// flow-typed signature: 76cf24c882811a6100dbf999faa85748 +// flow-typed version: <>/babel-plugin-transform-flow-strip-types_v^6.22.0/flow_v0.63.1 + +/** + * This is an autogenerated libdef stub for: + * + * 'babel-plugin-transform-flow-strip-types' + * + * Fill this stub out by replacing all the `any` types. + * + * Once filled out, we encourage you to share your work with the + * community by sending a pull request to: + * https://github.com/flowtype/flow-typed + */ + +declare module 'babel-plugin-transform-flow-strip-types' { + declare module.exports: any; +} + +/** + * We include stubs for each file inside this npm package in case you need to + * require those files directly. Feel free to delete any files that aren't + * needed. + */ +declare module 'babel-plugin-transform-flow-strip-types/lib/index' { + declare module.exports: any; +} + +// Filename aliases +declare module 'babel-plugin-transform-flow-strip-types/lib/index.js' { + declare module.exports: $Exports<'babel-plugin-transform-flow-strip-types/lib/index'>; +} diff --git a/flow-typed/npm/babel-preset-es2015_vx.x.x.js b/flow-typed/npm/babel-preset-es2015_vx.x.x.js new file mode 100644 index 00000000..717def04 --- /dev/null +++ b/flow-typed/npm/babel-preset-es2015_vx.x.x.js @@ -0,0 +1,32 @@ +// flow-typed signature: a687480edaa0c9fd54363a419774ad2c +// flow-typed version: <>/babel-preset-es2015_v^6.24.1/flow_v0.63.1 + +/** + * This is an autogenerated libdef stub for: + * + * 'babel-preset-es2015' + * + * Fill this stub out by replacing all the `any` types. + * + * Once filled out, we encourage you to share your work with the + * community by sending a pull request to: + * https://github.com/flowtype/flow-typed + */ + +declare module 'babel-preset-es2015' { + declare module.exports: any; +} + +/** + * We include stubs for each file inside this npm package in case you need to + * require those files directly. Feel free to delete any files that aren't + * needed. + */ +declare module 'babel-preset-es2015/lib/index' { + declare module.exports: any; +} + +// Filename aliases +declare module 'babel-preset-es2015/lib/index.js' { + declare module.exports: $Exports<'babel-preset-es2015/lib/index'>; +} diff --git a/flow-typed/npm/babel-preset-es2016_vx.x.x.js b/flow-typed/npm/babel-preset-es2016_vx.x.x.js new file mode 100644 index 00000000..228b4be0 --- /dev/null +++ b/flow-typed/npm/babel-preset-es2016_vx.x.x.js @@ -0,0 +1,32 @@ +// flow-typed signature: 574fb5d791136c16e358f056fe87d239 +// flow-typed version: <>/babel-preset-es2016_v^6.24.1/flow_v0.63.1 + +/** + * This is an autogenerated libdef stub for: + * + * 'babel-preset-es2016' + * + * Fill this stub out by replacing all the `any` types. + * + * Once filled out, we encourage you to share your work with the + * community by sending a pull request to: + * https://github.com/flowtype/flow-typed + */ + +declare module 'babel-preset-es2016' { + declare module.exports: any; +} + +/** + * We include stubs for each file inside this npm package in case you need to + * require those files directly. Feel free to delete any files that aren't + * needed. + */ +declare module 'babel-preset-es2016/lib/index' { + declare module.exports: any; +} + +// Filename aliases +declare module 'babel-preset-es2016/lib/index.js' { + declare module.exports: $Exports<'babel-preset-es2016/lib/index'>; +} diff --git a/flow-typed/npm/babel-preset-es2017_vx.x.x.js b/flow-typed/npm/babel-preset-es2017_vx.x.x.js new file mode 100644 index 00000000..0e1e4472 --- /dev/null +++ b/flow-typed/npm/babel-preset-es2017_vx.x.x.js @@ -0,0 +1,32 @@ +// flow-typed signature: 95d01a3766cd938e233d4aff5262fab5 +// flow-typed version: <>/babel-preset-es2017_v^6.24.1/flow_v0.63.1 + +/** + * This is an autogenerated libdef stub for: + * + * 'babel-preset-es2017' + * + * Fill this stub out by replacing all the `any` types. + * + * Once filled out, we encourage you to share your work with the + * community by sending a pull request to: + * https://github.com/flowtype/flow-typed + */ + +declare module 'babel-preset-es2017' { + declare module.exports: any; +} + +/** + * We include stubs for each file inside this npm package in case you need to + * require those files directly. Feel free to delete any files that aren't + * needed. + */ +declare module 'babel-preset-es2017/lib/index' { + declare module.exports: any; +} + +// Filename aliases +declare module 'babel-preset-es2017/lib/index.js' { + declare module.exports: $Exports<'babel-preset-es2017/lib/index'>; +} diff --git a/flow-typed/npm/babel-preset-stage-2_vx.x.x.js b/flow-typed/npm/babel-preset-stage-2_vx.x.x.js new file mode 100644 index 00000000..b0cb3af1 --- /dev/null +++ b/flow-typed/npm/babel-preset-stage-2_vx.x.x.js @@ -0,0 +1,32 @@ +// flow-typed signature: a759917202b9e10e4d52bcc214f707c1 +// flow-typed version: <>/babel-preset-stage-2_v^6.24.1/flow_v0.63.1 + +/** + * This is an autogenerated libdef stub for: + * + * 'babel-preset-stage-2' + * + * Fill this stub out by replacing all the `any` types. + * + * Once filled out, we encourage you to share your work with the + * community by sending a pull request to: + * https://github.com/flowtype/flow-typed + */ + +declare module 'babel-preset-stage-2' { + declare module.exports: any; +} + +/** + * We include stubs for each file inside this npm package in case you need to + * require those files directly. Feel free to delete any files that aren't + * needed. + */ +declare module 'babel-preset-stage-2/lib/index' { + declare module.exports: any; +} + +// Filename aliases +declare module 'babel-preset-stage-2/lib/index.js' { + declare module.exports: $Exports<'babel-preset-stage-2/lib/index'>; +} diff --git a/flow-typed/npm/chalk_v2.x.x.js b/flow-typed/npm/chalk_v2.x.x.js new file mode 100644 index 00000000..50c50089 --- /dev/null +++ b/flow-typed/npm/chalk_v2.x.x.js @@ -0,0 +1,108 @@ +// flow-typed signature: fa51178772ad1f35158cb4238bc3f1eb +// flow-typed version: da30fe6876/chalk_v2.x.x/flow_>=v0.25.x + +type $npm$chalk$StyleElement = { + open: string, + close: string +}; + +type $npm$chalk$Chain = $npm$chalk$Style & ((...text: any[]) => string); + +type $npm$chalk$Style = { + // General + reset: $npm$chalk$Chain, + bold: $npm$chalk$Chain, + dim: $npm$chalk$Chain, + italic: $npm$chalk$Chain, + underline: $npm$chalk$Chain, + inverse: $npm$chalk$Chain, + strikethrough: $npm$chalk$Chain, + + // Text colors + black: $npm$chalk$Chain, + red: $npm$chalk$Chain, + redBright: $npm$chalk$Chain, + green: $npm$chalk$Chain, + greenBright: $npm$chalk$Chain, + yellow: $npm$chalk$Chain, + yellowBright: $npm$chalk$Chain, + blue: $npm$chalk$Chain, + blueBright: $npm$chalk$Chain, + magenta: $npm$chalk$Chain, + magentaBright: $npm$chalk$Chain, + cyan: $npm$chalk$Chain, + cyanBright: $npm$chalk$Chain, + white: $npm$chalk$Chain, + whiteBright: $npm$chalk$Chain, + gray: $npm$chalk$Chain, + grey: $npm$chalk$Chain, + + // Background colors + bgBlack: $npm$chalk$Chain, + bgBlackBright: $npm$chalk$Chain, + bgRed: $npm$chalk$Chain, + bgRedBright: $npm$chalk$Chain, + bgGreen: $npm$chalk$Chain, + bgGreenBright: $npm$chalk$Chain, + bgYellow: $npm$chalk$Chain, + bgYellowBright: $npm$chalk$Chain, + bgBlue: $npm$chalk$Chain, + bgBlueBright: $npm$chalk$Chain, + bgMagenta: $npm$chalk$Chain, + bgMagentaBright: $npm$chalk$Chain, + bgCyan: $npm$chalk$Chain, + bgCyanBright: $npm$chalk$Chain, + bgWhite: $npm$chalk$Chain, + bgWhiteBright: $npm$chalk$Chain +}; + +declare module "chalk" { + declare var enabled: boolean; + declare var supportsColor: boolean; + + // General + declare var reset: $npm$chalk$Chain; + declare var bold: $npm$chalk$Chain; + declare var dim: $npm$chalk$Chain; + declare var italic: $npm$chalk$Chain; + declare var underline: $npm$chalk$Chain; + declare var inverse: $npm$chalk$Chain; + declare var strikethrough: $npm$chalk$Chain; + + // Text colors + declare var black: $npm$chalk$Chain; + declare var red: $npm$chalk$Chain; + declare var redBright: $npm$chalk$Chain; + declare var green: $npm$chalk$Chain; + declare var greenBright: $npm$chalk$Chain; + declare var yellow: $npm$chalk$Chain; + declare var yellowBright: $npm$chalk$Chain; + declare var blue: $npm$chalk$Chain; + declare var blueBright: $npm$chalk$Chain; + declare var magenta: $npm$chalk$Chain; + declare var magentaBright: $npm$chalk$Chain; + declare var cyan: $npm$chalk$Chain; + declare var cyanBright: $npm$chalk$Chain; + declare var white: $npm$chalk$Chain; + declare var whiteBright: $npm$chalk$Chain; + declare var gray: $npm$chalk$Chain; + declare var grey: $npm$chalk$Chain; + + // Background colors + declare var bgBlack: $npm$chalk$Chain; + declare var bgBlackBright: $npm$chalk$Chain; + declare var bgRed: $npm$chalk$Chain; + declare var bgRedBright: $npm$chalk$Chain; + declare var bgGreen: $npm$chalk$Chain; + declare var bgGreenBright: $npm$chalk$Chain; + declare var bgYellow: $npm$chalk$Chain; + declare var bgYellowBright: $npm$chalk$Chain; + declare var bgBlue: $npm$chalk$Chain; + declare var bgBlueBright: $npm$chalk$Chain; + declare var bgMagenta: $npm$chalk$Chain; + declare var bgMagentaBright: $npm$chalk$Chain; + declare var bgCyan: $npm$chalk$Chain; + declare var bgCyanBright: $npm$chalk$Chain; + declare var bgWhite: $npm$chalk$Chain; + declare var bgWhiteBright: $npm$chalk$Chain; +} diff --git a/flow-typed/npm/cli-spinner_vx.x.x.js b/flow-typed/npm/cli-spinner_vx.x.x.js new file mode 100644 index 00000000..dc502cf2 --- /dev/null +++ b/flow-typed/npm/cli-spinner_vx.x.x.js @@ -0,0 +1,38 @@ +// flow-typed signature: 760d91bb2e9b21e0ae30b837a2c19ef6 +// flow-typed version: <>/cli-spinner_v^0.2.7/flow_v0.63.1 + +/** + * This is an autogenerated libdef stub for: + * + * 'cli-spinner' + * + * Fill this stub out by replacing all the `any` types. + * + * Once filled out, we encourage you to share your work with the + * community by sending a pull request to: + * https://github.com/flowtype/flow-typed + */ + +declare module 'cli-spinner' { + declare module.exports: any; +} + +/** + * We include stubs for each file inside this npm package in case you need to + * require those files directly. Feel free to delete any files that aren't + * needed. + */ +declare module 'cli-spinner/example/spinner' { + declare module.exports: any; +} + +// Filename aliases +declare module 'cli-spinner/example/spinner.js' { + declare module.exports: $Exports<'cli-spinner/example/spinner'>; +} +declare module 'cli-spinner/index' { + declare module.exports: $Exports<'cli-spinner'>; +} +declare module 'cli-spinner/index.js' { + declare module.exports: $Exports<'cli-spinner'>; +} diff --git a/flow-typed/npm/copyfiles_vx.x.x.js b/flow-typed/npm/copyfiles_vx.x.x.js new file mode 100644 index 00000000..85ff5cdd --- /dev/null +++ b/flow-typed/npm/copyfiles_vx.x.x.js @@ -0,0 +1,38 @@ +// flow-typed signature: d3fd00b0e27beee612f86cc5638fa301 +// flow-typed version: <>/copyfiles_v^1.2.0/flow_v0.63.1 + +/** + * This is an autogenerated libdef stub for: + * + * 'copyfiles' + * + * Fill this stub out by replacing all the `any` types. + * + * Once filled out, we encourage you to share your work with the + * community by sending a pull request to: + * https://github.com/flowtype/flow-typed + */ + +declare module 'copyfiles' { + declare module.exports: any; +} + +/** + * We include stubs for each file inside this npm package in case you need to + * require those files directly. Feel free to delete any files that aren't + * needed. + */ +declare module 'copyfiles/test/test.fromNode' { + declare module.exports: any; +} + +// Filename aliases +declare module 'copyfiles/index' { + declare module.exports: $Exports<'copyfiles'>; +} +declare module 'copyfiles/index.js' { + declare module.exports: $Exports<'copyfiles'>; +} +declare module 'copyfiles/test/test.fromNode.js' { + declare module.exports: $Exports<'copyfiles/test/test.fromNode'>; +} diff --git a/flow-typed/npm/cross-spawn_vx.x.x.js b/flow-typed/npm/cross-spawn_vx.x.x.js new file mode 100644 index 00000000..3ea99a30 --- /dev/null +++ b/flow-typed/npm/cross-spawn_vx.x.x.js @@ -0,0 +1,80 @@ +// flow-typed signature: 2641901a3aacbf1f64ee2efe3d413b3e +// flow-typed version: <>/cross-spawn_v^5.1.0/flow_v0.63.1 + +/** + * This is an autogenerated libdef stub for: + * + * 'cross-spawn' + * + * Fill this stub out by replacing all the `any` types. + * + * Once filled out, we encourage you to share your work with the + * community by sending a pull request to: + * https://github.com/flowtype/flow-typed + */ + +declare module 'cross-spawn' { + declare module.exports: any; +} + +/** + * We include stubs for each file inside this npm package in case you need to + * require those files directly. Feel free to delete any files that aren't + * needed. + */ +declare module 'cross-spawn/lib/enoent' { + declare module.exports: any; +} + +declare module 'cross-spawn/lib/parse' { + declare module.exports: any; +} + +declare module 'cross-spawn/lib/util/escapeArgument' { + declare module.exports: any; +} + +declare module 'cross-spawn/lib/util/escapeCommand' { + declare module.exports: any; +} + +declare module 'cross-spawn/lib/util/hasEmptyArgumentBug' { + declare module.exports: any; +} + +declare module 'cross-spawn/lib/util/readShebang' { + declare module.exports: any; +} + +declare module 'cross-spawn/lib/util/resolveCommand' { + declare module.exports: any; +} + +// Filename aliases +declare module 'cross-spawn/index' { + declare module.exports: $Exports<'cross-spawn'>; +} +declare module 'cross-spawn/index.js' { + declare module.exports: $Exports<'cross-spawn'>; +} +declare module 'cross-spawn/lib/enoent.js' { + declare module.exports: $Exports<'cross-spawn/lib/enoent'>; +} +declare module 'cross-spawn/lib/parse.js' { + declare module.exports: $Exports<'cross-spawn/lib/parse'>; +} +declare module 'cross-spawn/lib/util/escapeArgument.js' { + declare module.exports: $Exports<'cross-spawn/lib/util/escapeArgument'>; +} +declare module 'cross-spawn/lib/util/escapeCommand.js' { + declare module.exports: $Exports<'cross-spawn/lib/util/escapeCommand'>; +} +declare module 'cross-spawn/lib/util/hasEmptyArgumentBug.js' { + declare module.exports: $Exports<'cross-spawn/lib/util/hasEmptyArgumentBug'>; +} +declare module 'cross-spawn/lib/util/readShebang.js' { + declare module.exports: $Exports<'cross-spawn/lib/util/readShebang'>; +} +declare module 'cross-spawn/lib/util/resolveCommand.js' { + declare module.exports: $Exports<'cross-spawn/lib/util/resolveCommand'>; +} diff --git a/flow-typed/npm/css-loader_vx.x.x.js b/flow-typed/npm/css-loader_vx.x.x.js new file mode 100644 index 00000000..218e0dab --- /dev/null +++ b/flow-typed/npm/css-loader_vx.x.x.js @@ -0,0 +1,101 @@ +// flow-typed signature: ddcd85fb5fdc27da5a6088e7d7a8679c +// flow-typed version: <>/css-loader_v^0.28.8/flow_v0.63.1 + +/** + * This is an autogenerated libdef stub for: + * + * 'css-loader' + * + * Fill this stub out by replacing all the `any` types. + * + * Once filled out, we encourage you to share your work with the + * community by sending a pull request to: + * https://github.com/flowtype/flow-typed + */ + +declare module 'css-loader' { + declare module.exports: any; +} + +/** + * We include stubs for each file inside this npm package in case you need to + * require those files directly. Feel free to delete any files that aren't + * needed. + */ +declare module 'css-loader/lib/compile-exports' { + declare module.exports: any; +} + +declare module 'css-loader/lib/createResolver' { + declare module.exports: any; +} + +declare module 'css-loader/lib/css-base' { + declare module.exports: any; +} + +declare module 'css-loader/lib/getImportPrefix' { + declare module.exports: any; +} + +declare module 'css-loader/lib/getLocalIdent' { + declare module.exports: any; +} + +declare module 'css-loader/lib/loader' { + declare module.exports: any; +} + +declare module 'css-loader/lib/localsLoader' { + declare module.exports: any; +} + +declare module 'css-loader/lib/processCss' { + declare module.exports: any; +} + +declare module 'css-loader/lib/url/escape' { + declare module.exports: any; +} + +declare module 'css-loader/locals' { + declare module.exports: any; +} + +// Filename aliases +declare module 'css-loader/index' { + declare module.exports: $Exports<'css-loader'>; +} +declare module 'css-loader/index.js' { + declare module.exports: $Exports<'css-loader'>; +} +declare module 'css-loader/lib/compile-exports.js' { + declare module.exports: $Exports<'css-loader/lib/compile-exports'>; +} +declare module 'css-loader/lib/createResolver.js' { + declare module.exports: $Exports<'css-loader/lib/createResolver'>; +} +declare module 'css-loader/lib/css-base.js' { + declare module.exports: $Exports<'css-loader/lib/css-base'>; +} +declare module 'css-loader/lib/getImportPrefix.js' { + declare module.exports: $Exports<'css-loader/lib/getImportPrefix'>; +} +declare module 'css-loader/lib/getLocalIdent.js' { + declare module.exports: $Exports<'css-loader/lib/getLocalIdent'>; +} +declare module 'css-loader/lib/loader.js' { + declare module.exports: $Exports<'css-loader/lib/loader'>; +} +declare module 'css-loader/lib/localsLoader.js' { + declare module.exports: $Exports<'css-loader/lib/localsLoader'>; +} +declare module 'css-loader/lib/processCss.js' { + declare module.exports: $Exports<'css-loader/lib/processCss'>; +} +declare module 'css-loader/lib/url/escape.js' { + declare module.exports: $Exports<'css-loader/lib/url/escape'>; +} +declare module 'css-loader/locals.js' { + declare module.exports: $Exports<'css-loader/locals'>; +} diff --git a/flow-typed/npm/flow-bin_v0.x.x.js b/flow-typed/npm/flow-bin_v0.x.x.js new file mode 100644 index 00000000..c538e208 --- /dev/null +++ b/flow-typed/npm/flow-bin_v0.x.x.js @@ -0,0 +1,6 @@ +// flow-typed signature: 6a5610678d4b01e13bbfbbc62bdaf583 +// flow-typed version: 3817bc6980/flow-bin_v0.x.x/flow_>=v0.25.x + +declare module "flow-bin" { + declare module.exports: string; +} diff --git a/flow-typed/npm/flow-typed_vx.x.x.js b/flow-typed/npm/flow-typed_vx.x.x.js new file mode 100644 index 00000000..445ff7f7 --- /dev/null +++ b/flow-typed/npm/flow-typed_vx.x.x.js @@ -0,0 +1,193 @@ +// flow-typed signature: 18900275c28a96722c5b911866345ad4 +// flow-typed version: <>/flow-typed_v^2.2.3/flow_v0.63.1 + +/** + * This is an autogenerated libdef stub for: + * + * 'flow-typed' + * + * Fill this stub out by replacing all the `any` types. + * + * Once filled out, we encourage you to share your work with the + * community by sending a pull request to: + * https://github.com/flowtype/flow-typed + */ + +declare module 'flow-typed' { + declare module.exports: any; +} + +/** + * We include stubs for each file inside this npm package in case you need to + * require those files directly. Feel free to delete any files that aren't + * needed. + */ +declare module 'flow-typed/dist/cli' { + declare module.exports: any; +} + +declare module 'flow-typed/dist/commands/create-stub' { + declare module.exports: any; +} + +declare module 'flow-typed/dist/commands/install' { + declare module.exports: any; +} + +declare module 'flow-typed/dist/commands/runTests' { + declare module.exports: any; +} + +declare module 'flow-typed/dist/commands/search' { + declare module.exports: any; +} + +declare module 'flow-typed/dist/commands/update-cache' { + declare module.exports: any; +} + +declare module 'flow-typed/dist/commands/update' { + declare module.exports: any; +} + +declare module 'flow-typed/dist/commands/validateDefs' { + declare module.exports: any; +} + +declare module 'flow-typed/dist/commands/version' { + declare module.exports: any; +} + +declare module 'flow-typed/dist/lib/cacheRepoUtils' { + declare module.exports: any; +} + +declare module 'flow-typed/dist/lib/codeSign' { + declare module.exports: any; +} + +declare module 'flow-typed/dist/lib/fileUtils' { + declare module.exports: any; +} + +declare module 'flow-typed/dist/lib/flowProjectUtils' { + declare module.exports: any; +} + +declare module 'flow-typed/dist/lib/flowVersion' { + declare module.exports: any; +} + +declare module 'flow-typed/dist/lib/git' { + declare module.exports: any; +} + +declare module 'flow-typed/dist/lib/github' { + declare module.exports: any; +} + +declare module 'flow-typed/dist/lib/isInFlowTypedRepo' { + declare module.exports: any; +} + +declare module 'flow-typed/dist/lib/libDefs' { + declare module.exports: any; +} + +declare module 'flow-typed/dist/lib/node' { + declare module.exports: any; +} + +declare module 'flow-typed/dist/lib/npm/npmLibDefs' { + declare module.exports: any; +} + +declare module 'flow-typed/dist/lib/npm/npmProjectUtils' { + declare module.exports: any; +} + +declare module 'flow-typed/dist/lib/semver' { + declare module.exports: any; +} + +declare module 'flow-typed/dist/lib/stubUtils' { + declare module.exports: any; +} + +declare module 'flow-typed/dist/lib/validationErrors' { + declare module.exports: any; +} + +// Filename aliases +declare module 'flow-typed/dist/cli.js' { + declare module.exports: $Exports<'flow-typed/dist/cli'>; +} +declare module 'flow-typed/dist/commands/create-stub.js' { + declare module.exports: $Exports<'flow-typed/dist/commands/create-stub'>; +} +declare module 'flow-typed/dist/commands/install.js' { + declare module.exports: $Exports<'flow-typed/dist/commands/install'>; +} +declare module 'flow-typed/dist/commands/runTests.js' { + declare module.exports: $Exports<'flow-typed/dist/commands/runTests'>; +} +declare module 'flow-typed/dist/commands/search.js' { + declare module.exports: $Exports<'flow-typed/dist/commands/search'>; +} +declare module 'flow-typed/dist/commands/update-cache.js' { + declare module.exports: $Exports<'flow-typed/dist/commands/update-cache'>; +} +declare module 'flow-typed/dist/commands/update.js' { + declare module.exports: $Exports<'flow-typed/dist/commands/update'>; +} +declare module 'flow-typed/dist/commands/validateDefs.js' { + declare module.exports: $Exports<'flow-typed/dist/commands/validateDefs'>; +} +declare module 'flow-typed/dist/commands/version.js' { + declare module.exports: $Exports<'flow-typed/dist/commands/version'>; +} +declare module 'flow-typed/dist/lib/cacheRepoUtils.js' { + declare module.exports: $Exports<'flow-typed/dist/lib/cacheRepoUtils'>; +} +declare module 'flow-typed/dist/lib/codeSign.js' { + declare module.exports: $Exports<'flow-typed/dist/lib/codeSign'>; +} +declare module 'flow-typed/dist/lib/fileUtils.js' { + declare module.exports: $Exports<'flow-typed/dist/lib/fileUtils'>; +} +declare module 'flow-typed/dist/lib/flowProjectUtils.js' { + declare module.exports: $Exports<'flow-typed/dist/lib/flowProjectUtils'>; +} +declare module 'flow-typed/dist/lib/flowVersion.js' { + declare module.exports: $Exports<'flow-typed/dist/lib/flowVersion'>; +} +declare module 'flow-typed/dist/lib/git.js' { + declare module.exports: $Exports<'flow-typed/dist/lib/git'>; +} +declare module 'flow-typed/dist/lib/github.js' { + declare module.exports: $Exports<'flow-typed/dist/lib/github'>; +} +declare module 'flow-typed/dist/lib/isInFlowTypedRepo.js' { + declare module.exports: $Exports<'flow-typed/dist/lib/isInFlowTypedRepo'>; +} +declare module 'flow-typed/dist/lib/libDefs.js' { + declare module.exports: $Exports<'flow-typed/dist/lib/libDefs'>; +} +declare module 'flow-typed/dist/lib/node.js' { + declare module.exports: $Exports<'flow-typed/dist/lib/node'>; +} +declare module 'flow-typed/dist/lib/npm/npmLibDefs.js' { + declare module.exports: $Exports<'flow-typed/dist/lib/npm/npmLibDefs'>; +} +declare module 'flow-typed/dist/lib/npm/npmProjectUtils.js' { + declare module.exports: $Exports<'flow-typed/dist/lib/npm/npmProjectUtils'>; +} +declare module 'flow-typed/dist/lib/semver.js' { + declare module.exports: $Exports<'flow-typed/dist/lib/semver'>; +} +declare module 'flow-typed/dist/lib/stubUtils.js' { + declare module.exports: $Exports<'flow-typed/dist/lib/stubUtils'>; +} +declare module 'flow-typed/dist/lib/validationErrors.js' { + declare module.exports: $Exports<'flow-typed/dist/lib/validationErrors'>; +} diff --git a/flow-typed/npm/glob_vx.x.x.js b/flow-typed/npm/glob_vx.x.x.js new file mode 100644 index 00000000..21dd56d1 --- /dev/null +++ b/flow-typed/npm/glob_vx.x.x.js @@ -0,0 +1,46 @@ +// flow-typed signature: 021cc1193b38c0a8f0bfb838f636c154 +// flow-typed version: <>/glob_v^7.1.2/flow_v0.63.1 + +/** + * This is an autogenerated libdef stub for: + * + * 'glob' + * + * Fill this stub out by replacing all the `any` types. + * + * Once filled out, we encourage you to share your work with the + * community by sending a pull request to: + * https://github.com/flowtype/flow-typed + */ + +declare module 'glob' { + declare module.exports: any; +} + +/** + * We include stubs for each file inside this npm package in case you need to + * require those files directly. Feel free to delete any files that aren't + * needed. + */ +declare module 'glob/common' { + declare module.exports: any; +} + +declare module 'glob/glob' { + declare module.exports: any; +} + +declare module 'glob/sync' { + declare module.exports: any; +} + +// Filename aliases +declare module 'glob/common.js' { + declare module.exports: $Exports<'glob/common'>; +} +declare module 'glob/glob.js' { + declare module.exports: $Exports<'glob/glob'>; +} +declare module 'glob/sync.js' { + declare module.exports: $Exports<'glob/sync'>; +} diff --git a/flow-typed/npm/husky_vx.x.x.js b/flow-typed/npm/husky_vx.x.x.js new file mode 100644 index 00000000..34b68c3c --- /dev/null +++ b/flow-typed/npm/husky_vx.x.x.js @@ -0,0 +1,88 @@ +// flow-typed signature: 6dc0ba413dee811c0efcd4a99602cc51 +// flow-typed version: <>/husky_v^0.14.0/flow_v0.63.1 + +/** + * This is an autogenerated libdef stub for: + * + * 'husky' + * + * Fill this stub out by replacing all the `any` types. + * + * Once filled out, we encourage you to share your work with the + * community by sending a pull request to: + * https://github.com/flowtype/flow-typed + */ + +declare module 'husky' { + declare module.exports: any; +} + +/** + * We include stubs for each file inside this npm package in case you need to + * require those files directly. Feel free to delete any files that aren't + * needed. + */ +declare module 'husky/__tests__/index' { + declare module.exports: any; +} + +declare module 'husky/bin/install' { + declare module.exports: any; +} + +declare module 'husky/bin/uninstall' { + declare module.exports: any; +} + +declare module 'husky/src/install' { + declare module.exports: any; +} + +declare module 'husky/src/uninstall' { + declare module.exports: any; +} + +declare module 'husky/src/utils/find-hooks-dir' { + declare module.exports: any; +} + +declare module 'husky/src/utils/find-parent' { + declare module.exports: any; +} + +declare module 'husky/src/utils/get-hook-script' { + declare module.exports: any; +} + +declare module 'husky/src/utils/is-husky' { + declare module.exports: any; +} + +// Filename aliases +declare module 'husky/__tests__/index.js' { + declare module.exports: $Exports<'husky/__tests__/index'>; +} +declare module 'husky/bin/install.js' { + declare module.exports: $Exports<'husky/bin/install'>; +} +declare module 'husky/bin/uninstall.js' { + declare module.exports: $Exports<'husky/bin/uninstall'>; +} +declare module 'husky/src/install.js' { + declare module.exports: $Exports<'husky/src/install'>; +} +declare module 'husky/src/uninstall.js' { + declare module.exports: $Exports<'husky/src/uninstall'>; +} +declare module 'husky/src/utils/find-hooks-dir.js' { + declare module.exports: $Exports<'husky/src/utils/find-hooks-dir'>; +} +declare module 'husky/src/utils/find-parent.js' { + declare module.exports: $Exports<'husky/src/utils/find-parent'>; +} +declare module 'husky/src/utils/get-hook-script.js' { + declare module.exports: $Exports<'husky/src/utils/get-hook-script'>; +} +declare module 'husky/src/utils/is-husky.js' { + declare module.exports: $Exports<'husky/src/utils/is-husky'>; +} diff --git a/flow-typed/npm/img-diff-js_vx.x.x.js b/flow-typed/npm/img-diff-js_vx.x.x.js new file mode 100644 index 00000000..5c358b96 --- /dev/null +++ b/flow-typed/npm/img-diff-js_vx.x.x.js @@ -0,0 +1,67 @@ +// flow-typed signature: 8d47c428179c795674ad420a1c21adbb +// flow-typed version: <>/img-diff-js_v^0.4.0/flow_v0.63.1 + +/** + * This is an autogenerated libdef stub for: + * + * 'img-diff-js' + * + * Fill this stub out by replacing all the `any` types. + * + * Once filled out, we encourage you to share your work with the + * community by sending a pull request to: + * https://github.com/flowtype/flow-typed + */ + +declare module 'img-diff-js' { + declare module.exports: any; +} + +/** + * We include stubs for each file inside this npm package in case you need to + * require those files directly. Feel free to delete any files that aren't + * needed. + */ +declare module 'img-diff-js/lib/decode-jpeg' { + declare module.exports: any; +} + +declare module 'img-diff-js/lib/decode-png' { + declare module.exports: any; +} + +declare module 'img-diff-js/lib/decode-tiff' { + declare module.exports: any; +} + +declare module 'img-diff-js/lib/expand' { + declare module.exports: any; +} + +declare module 'img-diff-js/lib/index' { + declare module.exports: any; +} + +declare module 'img-diff-js/tool/perf' { + declare module.exports: any; +} + +// Filename aliases +declare module 'img-diff-js/lib/decode-jpeg.js' { + declare module.exports: $Exports<'img-diff-js/lib/decode-jpeg'>; +} +declare module 'img-diff-js/lib/decode-png.js' { + declare module.exports: $Exports<'img-diff-js/lib/decode-png'>; +} +declare module 'img-diff-js/lib/decode-tiff.js' { + declare module.exports: $Exports<'img-diff-js/lib/decode-tiff'>; +} +declare module 'img-diff-js/lib/expand.js' { + declare module.exports: $Exports<'img-diff-js/lib/expand'>; +} +declare module 'img-diff-js/lib/index.js' { + declare module.exports: $Exports<'img-diff-js/lib/index'>; +} +declare module 'img-diff-js/tool/perf.js' { + declare module.exports: $Exports<'img-diff-js/tool/perf'>; +} diff --git a/flow-typed/npm/lodash_v4.x.x.js b/flow-typed/npm/lodash_v4.x.x.js new file mode 100644 index 00000000..bf3d945d --- /dev/null +++ b/flow-typed/npm/lodash_v4.x.x.js @@ -0,0 +1,4440 @@ +// flow-typed signature: 13b94db0df5081010f4e428ece1d41c5 +// flow-typed version: 0211ce08b2/lodash_v4.x.x/flow_>=v0.55.x + +declare module "lodash" { + declare type __CurriedFunction1 = (...r: [AA]) => R; + declare type CurriedFunction1 = __CurriedFunction1; + + declare type __CurriedFunction2 = (( + ...r: [AA] + ) => CurriedFunction1) & + ((...r: [AA, BB]) => R); + declare type CurriedFunction2 = __CurriedFunction2; + + declare type __CurriedFunction3 = (( + ...r: [AA] + ) => CurriedFunction2) & + ((...r: [AA, BB]) => CurriedFunction1) & + ((...r: [AA, BB, CC]) => R); + declare type CurriedFunction3 = __CurriedFunction3< + A, + B, + C, + R, + *, + *, + * + >; + + declare type __CurriedFunction4< + A, + B, + C, + D, + R, + AA: A, + BB: B, + CC: C, + DD: D + > = ((...r: [AA]) => CurriedFunction3) & + ((...r: [AA, BB]) => CurriedFunction2) & + ((...r: [AA, BB, CC]) => CurriedFunction1) & + ((...r: [AA, BB, CC, DD]) => R); + declare type CurriedFunction4 = __CurriedFunction4< + A, + B, + C, + D, + R, + *, + *, + *, + * + >; + + declare type __CurriedFunction5< + A, + B, + C, + D, + E, + R, + AA: A, + BB: B, + CC: C, + DD: D, + EE: E + > = ((...r: [AA]) => CurriedFunction4) & + ((...r: [AA, BB]) => CurriedFunction3) & + ((...r: [AA, BB, CC]) => CurriedFunction2) & + ((...r: [AA, BB, CC, DD]) => CurriedFunction1) & + ((...r: [AA, BB, CC, DD, EE]) => R); + declare type CurriedFunction5 = __CurriedFunction5< + A, + B, + C, + D, + E, + R, + *, + *, + *, + *, + * + >; + + declare type __CurriedFunction6< + A, + B, + C, + D, + E, + F, + R, + AA: A, + BB: B, + CC: C, + DD: D, + EE: E, + FF: F + > = ((...r: [AA]) => CurriedFunction5) & + ((...r: [AA, BB]) => CurriedFunction4) & + ((...r: [AA, BB, CC]) => CurriedFunction3) & + ((...r: [AA, BB, CC, DD]) => CurriedFunction2) & + ((...r: [AA, BB, CC, DD, EE]) => CurriedFunction1) & + ((...r: [AA, BB, CC, DD, EE, FF]) => R); + declare type CurriedFunction6 = __CurriedFunction6< + A, + B, + C, + D, + E, + F, + R, + *, + *, + *, + *, + *, + * + >; + + declare type Curry = (((...r: [A]) => R) => CurriedFunction1) & + (((...r: [A, B]) => R) => CurriedFunction2) & + (((...r: [A, B, C]) => R) => CurriedFunction3) & + (( + (...r: [A, B, C, D]) => R + ) => CurriedFunction4) & + (( + (...r: [A, B, C, D, E]) => R + ) => CurriedFunction5) & + (( + (...r: [A, B, C, D, E, F]) => R + ) => CurriedFunction6); + + declare type UnaryFn = (a: A) => R; + + declare type TemplateSettings = { + escape?: RegExp, + evaluate?: RegExp, + imports?: Object, + interpolate?: RegExp, + variable?: string + }; + + declare type TruncateOptions = { + length?: number, + omission?: string, + separator?: RegExp | string + }; + + declare type DebounceOptions = { + leading?: boolean, + maxWait?: number, + trailing?: boolean + }; + + declare type ThrottleOptions = { + leading?: boolean, + trailing?: boolean + }; + + declare type NestedArray = Array>; + + declare type matchesIterateeShorthand = Object; + declare type matchesPropertyIterateeShorthand = [string, any]; + declare type propertyIterateeShorthand = string; + + declare type OPredicate = + | ((value: A, key: string, object: O) => any) + | matchesIterateeShorthand + | matchesPropertyIterateeShorthand + | propertyIterateeShorthand; + + declare type OIterateeWithResult = + | Object + | string + | ((value: V, key: string, object: O) => R); + declare type OIteratee = OIterateeWithResult; + declare type OFlatMapIteratee = OIterateeWithResult>; + + declare type Predicate = + | ((value: T, index: number, array: Array) => any) + | matchesIterateeShorthand + | matchesPropertyIterateeShorthand + | propertyIterateeShorthand; + + declare type _ValueOnlyIteratee = (value: T) => mixed; + declare type ValueOnlyIteratee = _ValueOnlyIteratee | string; + declare type _Iteratee = ( + item: T, + index: number, + array: ?Array + ) => mixed; + declare type Iteratee = _Iteratee | Object | string; + declare type FlatMapIteratee = + | ((item: T, index: number, array: ?Array) => Array) + | Object + | string; + declare type Comparator = (item: T, item2: T) => boolean; + + declare type MapIterator = + | ((item: T, index: number, array: Array) => U) + | propertyIterateeShorthand; + + declare type ReadOnlyMapIterator = + | ((item: T, index: number, array: $ReadOnlyArray) => U) + | propertyIterateeShorthand; + + declare type OMapIterator = + | ((item: T, key: string, object: O) => U) + | propertyIterateeShorthand; + + declare class Lodash { + // Array + chunk(array?: ?Array, size?: ?number): Array>; + compact(array?: ?Array): Array; + concat(base?: ?Array, ...elements: Array): Array; + difference(array?: ?Array, values?: ?Array): Array; + differenceBy( + array?: ?Array, + values?: ?Array, + iteratee?: ?ValueOnlyIteratee + ): T[]; + differenceWith(array?: ?T[], values?: ?T[], comparator?: ?Comparator): T[]; + drop(array?: ?Array, n?: ?number): Array; + dropRight(array?: ?Array, n?: ?number): Array; + dropRightWhile(array?: ?Array, predicate?: ?Predicate): Array; + dropWhile(array?: ?Array, predicate?: ?Predicate): Array; + fill( + array?: ?Array, + value?: ?U, + start?: ?number, + end?: ?number + ): Array; + findIndex( + array: $ReadOnlyArray, + predicate?: ?Predicate, + fromIndex?: ?number + ): number; + findIndex( + array: void | null, + predicate?: ?Predicate, + fromIndex?: ?number + ): -1; + findLastIndex( + array: $ReadOnlyArray, + predicate?: ?Predicate, + fromIndex?: ?number + ): number; + findLastIndex( + array: void | null, + predicate?: ?Predicate, + fromIndex?: ?number + ): -1; + // alias of _.head + first(array: ?Array): T; + flatten(array?: ?Array | X>): Array; + flattenDeep(array?: ?any[]): Array; + flattenDepth(array?: ?any[], depth?: ?number): any[]; + fromPairs(pairs?: ?Array<[A, B]>): { [key: A]: B }; + head(array: ?Array): T; + indexOf(array: Array, value: T, fromIndex?: number): number; + indexOf(array: void | null, value?: ?T, fromIndex?: ?number): -1; + initial(array: ?Array): Array; + intersection(...arrays?: Array>): Array; + //Workaround until (...parameter: T, parameter2: U) works + intersectionBy(a1?: ?Array, iteratee?: ?ValueOnlyIteratee): Array; + intersectionBy( + a1?: ?Array, + a2?: ?Array, + iteratee?: ?ValueOnlyIteratee + ): Array; + intersectionBy( + a1?: ?Array, + a2?: ?Array, + a3?: ?Array, + iteratee?: ?ValueOnlyIteratee + ): Array; + intersectionBy( + a1?: ?Array, + a2?: ?Array, + a3?: ?Array, + a4?: ?Array, + iteratee?: ?ValueOnlyIteratee + ): Array; + //Workaround until (...parameter: T, parameter2: U) works + intersectionWith(a1?: ?Array, comparator?: ?Comparator): Array; + intersectionWith( + a1?: ?Array, + a2?: ?Array, + comparator?: ?Comparator + ): Array; + intersectionWith( + a1?: ?Array, + a2?: ?Array, + a3?: ?Array, + comparator?: ?Comparator + ): Array; + intersectionWith( + a1?: ?Array, + a2?: ?Array, + a3?: ?Array, + a4?: ?Array, + comparator?: ?Comparator + ): Array; + join(array: Array, separator?: ?string): string; + join(array: void | null, separator?: ?string): ''; + last(array: ?Array): T; + lastIndexOf(array: Array, value?: ?T, fromIndex?: ?number): number; + lastIndexOf(array: void | null, value?: ?T, fromIndex?: ?number): -1; + nth(array: T[], n?: ?number): T; + nth(array: void | null, n?: ?number): void; + pull(array: Array, ...values?: Array): Array; + pull(array: T, ...values?: Array): T; + pullAll(array: Array, values?: ?Array): Array; + pullAll(array: T, values?: ?Array): T; + pullAllBy( + array: Array, + values?: ?Array, + iteratee?: ?ValueOnlyIteratee + ): Array; + pullAllBy( + array: T, + values?: ?Array, + iteratee?: ?ValueOnlyIteratee + ): T; + pullAllWith(array: T[], values?: ?T[], comparator?: ?Function): T[]; + pullAllWith(array: T, values?: ?Array, comparator?: ?Function): T; + pullAt(array?: ?Array, ...indexed?: Array): Array; + pullAt(array?: ?Array, indexed?: ?Array): Array; + remove(array?: ?Array, predicate?: ?Predicate): Array; + reverse(array: Array): Array; + reverse(array: T): T; + slice(array?: ?Array, start?: ?number, end?: ?number): Array; + sortedIndex(array: Array, value: T): number; + sortedIndex(array: void | null, value: ?T): 0; + sortedIndexBy( + array: Array, + value?: ?T, + iteratee?: ?ValueOnlyIteratee + ): number; + sortedIndexBy( + array: void | null, + value?: ?T, + iteratee?: ?ValueOnlyIteratee + ): 0; + sortedIndexOf(array: Array, value: T): number; + sortedIndexOf(array: void | null, value?: ?T): -1; + sortedLastIndex(array: Array, value: T): number; + sortedLastIndex(array: void | null, value?: ?T): 0; + sortedLastIndexBy( + array: Array, + value: T, + iteratee?: ValueOnlyIteratee + ): number; + sortedLastIndexBy( + array: void | null, + value?: ?T, + iteratee?: ?ValueOnlyIteratee + ): 0; + sortedLastIndexOf(array: Array, value: T): number; + sortedLastIndexOf(array: void | null, value?: ?T): -1; + sortedUniq(array?: ?Array): Array; + sortedUniqBy(array?: ?Array, iteratee?: ?(value: T) => mixed): Array; + tail(array?: ?Array): Array; + take(array?: ?Array, n?: ?number): Array; + takeRight(array?: ?Array, n?: ?number): Array; + takeRightWhile(array?: ?Array, predicate?: ?Predicate): Array; + takeWhile(array?: ?Array, predicate?: ?Predicate): Array; + union(...arrays?: Array>): Array; + //Workaround until (...parameter: T, parameter2: U) works + unionBy(a1?: ?Array, iteratee?: ?ValueOnlyIteratee): Array; + unionBy( + a1?: ?Array, + a2: Array, + iteratee?: ValueOnlyIteratee + ): Array; + unionBy( + a1: Array, + a2: Array, + a3: Array, + iteratee?: ValueOnlyIteratee + ): Array; + unionBy( + a1: Array, + a2: Array, + a3: Array, + a4: Array, + iteratee?: ValueOnlyIteratee + ): Array; + //Workaround until (...parameter: T, parameter2: U) works + unionWith(a1?: ?Array, comparator?: ?Comparator): Array; + unionWith( + a1: Array, + a2: Array, + comparator?: Comparator + ): Array; + unionWith( + a1: Array, + a2: Array, + a3: Array, + comparator?: Comparator + ): Array; + unionWith( + a1: Array, + a2: Array, + a3: Array, + a4: Array, + comparator?: Comparator + ): Array; + uniq(array?: ?Array): Array; + uniqBy(array?: ?Array, iteratee?: ?ValueOnlyIteratee): Array; + uniqWith(array?: ?Array, comparator?: ?Comparator): Array; + unzip(array?: ?Array): Array; + unzipWith(array: ?Array, iteratee?: ?Iteratee): Array; + without(array?: ?Array, ...values?: Array): Array; + xor(...array: Array>): Array; + //Workaround until (...parameter: T, parameter2: U) works + xorBy(a1?: ?Array, iteratee?: ?ValueOnlyIteratee): Array; + xorBy( + a1: Array, + a2: Array, + iteratee?: ValueOnlyIteratee + ): Array; + xorBy( + a1: Array, + a2: Array, + a3: Array, + iteratee?: ValueOnlyIteratee + ): Array; + xorBy( + a1: Array, + a2: Array, + a3: Array, + a4: Array, + iteratee?: ValueOnlyIteratee + ): Array; + //Workaround until (...parameter: T, parameter2: U) works + xorWith(a1?: ?Array, comparator?: ?Comparator): Array; + xorWith( + a1: Array, + a2: Array, + comparator?: Comparator + ): Array; + xorWith( + a1: Array, + a2: Array, + a3: Array, + comparator?: Comparator + ): Array; + xorWith( + a1: Array, + a2: Array, + a3: Array, + a4: Array, + comparator?: Comparator + ): Array; + zip(a1?: ?A[], a2?: ?B[]): Array<[A, B]>; + zip(a1: A[], a2: B[], a3: C[]): Array<[A, B, C]>; + zip(a1: A[], a2: B[], a3: C[], a4: D[]): Array<[A, B, C, D]>; + zip( + a1: A[], + a2: B[], + a3: C[], + a4: D[], + a5: E[] + ): Array<[A, B, C, D, E]>; + + zipObject(props: Array, values?: ?Array): { [key: K]: V }; + zipObject(props: void | null, values?: ?Array): {}; + zipObjectDeep(props: any[], values?: ?any): Object; + zipObjectDeep(props: void | null, values?: ?any): {}; + + zipWith(a1?: ?Array): Array<[A]>; + zipWith(a1: Array, iteratee: (A) => T): Array; + + zipWith(a1: Array, a2: Array): Array<[A, B]>; + zipWith( + a1: Array, + a2: Array, + iteratee: (A, B) => T + ): Array; + + zipWith( + a1: Array, + a2: Array, + a3: Array + ): Array<[A, B, C]>; + zipWith( + a1: Array, + a2: Array, + a3: Array, + iteratee: (A, B, C) => T + ): Array; + + zipWith( + a1: Array, + a2: Array, + a3: Array, + a4: Array + ): Array<[A, B, C, D]>; + zipWith( + a1: Array, + a2: Array, + a3: Array, + a4: Array, + iteratee: (A, B, C, D) => T + ): Array; + + // Collection + countBy(array: Array, iteratee?: ?ValueOnlyIteratee): Object; + countBy(array: void | null, iteratee?: ?ValueOnlyIteratee): {}; + countBy(object: T, iteratee?: ?ValueOnlyIteratee): Object; + // alias of _.forEach + each(array: Array, iteratee?: ?Iteratee): Array; + each(array: T, iteratee?: ?Iteratee): T; + each(object: T, iteratee?: ?OIteratee): T; + // alias of _.forEachRight + eachRight(array: Array, iteratee?: ?Iteratee): Array; + eachRight(array: T, iteratee?: ?Iteratee): T; + eachRight(object: T, iteratee?: OIteratee): T; + every(array?: ?Array, iteratee?: ?Iteratee): boolean; + every(object: T, iteratee?: OIteratee): boolean; + filter(array?: ?Array, predicate?: ?Predicate): Array; + filter( + object: T, + predicate?: OPredicate + ): Array; + find( + array: $ReadOnlyArray, + predicate?: ?Predicate, + fromIndex?: ?number + ): T | void; + find( + array: void | null, + predicate?: ?Predicate, + fromIndex?: ?number + ): void; + find( + object: T, + predicate?: OPredicate, + fromIndex?: number + ): V; + findLast( + array: ?$ReadOnlyArray, + predicate?: ?Predicate, + fromIndex?: ?number + ): T | void; + findLast( + object: T, + predicate?: ?OPredicate + ): V; + flatMap(array?: ?Array, iteratee?: ?FlatMapIteratee): Array; + flatMap( + object: T, + iteratee?: OFlatMapIteratee + ): Array; + flatMapDeep( + array?: ?Array, + iteratee?: ?FlatMapIteratee + ): Array; + flatMapDeep( + object: T, + iteratee?: ?OFlatMapIteratee + ): Array; + flatMapDepth( + array?: ?Array, + iteratee?: ?FlatMapIteratee, + depth?: ?number + ): Array; + flatMapDepth( + object: T, + iteratee?: OFlatMapIteratee, + depth?: number + ): Array; + forEach(array: Array, iteratee?: ?Iteratee): Array; + forEach(array: T, iteratee?: ?Iteratee): T; + forEach(object: T, iteratee?: ?OIteratee): T; + forEachRight(array: Array, iteratee?: ?Iteratee): Array; + forEachRight(array: T, iteratee?: ?Iteratee): T; + forEachRight(object: T, iteratee?: ?OIteratee): T; + groupBy( + array: Array, + iteratee?: ?ValueOnlyIteratee + ): { [key: V]: Array }; + groupBy( + array: void | null, + iteratee?: ?ValueOnlyIteratee + ): {}; + groupBy( + object: T, + iteratee?: ValueOnlyIteratee + ): { [key: V]: Array }; + includes(array: Array, value: T, fromIndex?: ?number): boolean; + includes(array: void | null, value?: ?T, fromIndex?: ?number): false; + includes(object: T, value: any, fromIndex?: number): boolean; + includes(str: string, value: string, fromIndex?: number): boolean; + invokeMap( + array?: ?Array, + path?: ?((value: T) => Array | string) | Array | string, + ...args?: Array + ): Array; + invokeMap( + object: T, + path: ((value: any) => Array | string) | Array | string, + ...args?: Array + ): Array; + keyBy( + array: Array, + iteratee?: ?ValueOnlyIteratee + ): { [key: V]: ?T }; + keyBy( + array: void | null, + iteratee?: ?ValueOnlyIteratee<*> + ): {}; + keyBy( + object: T, + iteratee?: ?ValueOnlyIteratee + ): { [key: V]: ?A }; + map(array?: ?Array, iteratee?: ?MapIterator): Array; + map( + array: ?$ReadOnlyArray, + iteratee?: ReadOnlyMapIterator + ): Array, + map( + object: ?T, + iteratee?: OMapIterator + ): Array; + map( + str: ?string, + iteratee?: (char: string, index: number, str: string) => any + ): string; + orderBy( + array: Array, + iteratees?: ?Array> | ?string, + orders?: ?Array<"asc" | "desc"> | ?string + ): Array; + orderBy( + array: null | void, + iteratees?: ?Array> | ?string, + orders?: ?Array<"asc" | "desc"> | ?string + ): Array; + orderBy( + object: T, + iteratees?: Array> | string, + orders?: Array<"asc" | "desc"> | string + ): Array; + partition( + array?: ?Array, + predicate?: ?Predicate + ): [Array, Array]; + partition( + object: T, + predicate?: OPredicate + ): [Array, Array]; + reduce( + array: Array, + iteratee?: ( + accumulator: U, + value: T, + index: number, + array: ?Array + ) => U, + accumulator?: U + ): U; + reduce( + array: void | null, + iteratee?: ?( + accumulator: U, + value: T, + index: number, + array: ?Array + ) => U, + accumulator?: ?U + ): void | null; + reduce( + object: T, + iteratee?: (accumulator: U, value: any, key: string, object: T) => U, + accumulator?: U + ): U; + reduceRight( + array: void | null, + iteratee?: ?( + accumulator: U, + value: T, + index: number, + array: ?Array + ) => U, + accumulator?: ?U + ): void | null; + reduceRight( + array: Array, + iteratee?: ?( + accumulator: U, + value: T, + index: number, + array: ?Array + ) => U, + accumulator?: ?U + ): U; + reduceRight( + object: T, + iteratee?: ?(accumulator: U, value: any, key: string, object: T) => U, + accumulator?: ?U + ): U; + reject(array: ?Array, predicate?: Predicate): Array; + reject( + object?: ?T, + predicate?: ?OPredicate + ): Array; + sample(array: ?Array): T; + sample(object: T): V; + sampleSize(array?: ?Array, n?: ?number): Array; + sampleSize(object: T, n?: number): Array; + shuffle(array: ?Array): Array; + shuffle(object: T): Array; + size(collection: Array | Object | string): number; + some(array: ?Array, predicate?: Predicate): boolean; + some(array: void | null, predicate?: ?Predicate): false; + some( + object?: ?T, + predicate?: OPredicate + ): boolean; + sortBy(array: ?Array, ...iteratees?: Array>): Array; + sortBy(array: ?Array, iteratees?: Array>): Array; + sortBy( + object: T, + ...iteratees?: Array> + ): Array; + sortBy(object: T, iteratees?: Array>): Array; + + // Date + now(): number; + + // Function + after(n: number, fn: Function): Function; + ary(func: Function, n?: number): Function; + before(n: number, fn: Function): Function; + bind(func: Function, thisArg: any, ...partials: Array): Function; + bindKey(obj?: ?Object, key?: ?string, ...partials?: Array): Function; + curry: Curry; + curry(func: Function, arity?: number): Function; + curryRight(func: Function, arity?: number): Function; + debounce(func: F, wait?: number, options?: DebounceOptions): F; + defer(func: Function, ...args?: Array): number; + delay(func: Function, wait: number, ...args?: Array): number; + flip(func: Function): Function; + memoize(func: F, resolver?: Function): F; + negate(predicate: Function): Function; + once(func: Function): Function; + overArgs(func?: ?Function, ...transforms?: Array): Function; + overArgs(func?: ?Function, transforms?: ?Array): Function; + partial(func: Function, ...partials: any[]): Function; + partialRight(func: Function, ...partials: Array): Function; + partialRight(func: Function, partials: Array): Function; + rearg(func: Function, ...indexes: Array): Function; + rearg(func: Function, indexes: Array): Function; + rest(func: Function, start?: number): Function; + spread(func: Function): Function; + throttle( + func: Function, + wait?: number, + options?: ThrottleOptions + ): Function; + unary(func: Function): Function; + wrap(value?: any, wrapper?: ?Function): Function; + + // Lang + castArray(value: *): any[]; + clone(value: T): T; + cloneDeep(value: T): T; + cloneDeepWith( + value: T, + customizer?: ?(value: T, key: number | string, object: T, stack: any) => U + ): U; + cloneWith( + value: T, + customizer?: ?(value: T, key: number | string, object: T, stack: any) => U + ): U; + conformsTo( + source: T, + predicates: T & { [key: string]: (x: any) => boolean } + ): boolean; + eq(value: any, other: any): boolean; + gt(value: any, other: any): boolean; + gte(value: any, other: any): boolean; + isArguments(value: void | null): false; + isArguments(value: any): boolean; + isArray(value: Array): true; + isArray(value: any): false; + isArrayBuffer(value: ArrayBuffer): true; + isArrayBuffer(value: any): false; + isArrayLike(value: Array | string | {length: number}): true; + isArrayLike(value: any): false; + isArrayLikeObject(value: {length: number} | Array): true; + isArrayLikeObject(value: any): false; + isBoolean(value: boolean): true; + isBoolean(value: any): false; + isBuffer(value: void | null): false; + isBuffer(value: any): boolean; + isDate(value: Date): true; + isDate(value: any): false; + isElement(value: Element): true; + isElement(value: any): false; + isEmpty(value: void | null | '' | {} | [] | number | boolean): true; + isEmpty(value: any): boolean; + isEqual(value: any, other: any): boolean; + isEqualWith( + value?: ?T, + other?: ?U, + customizer?: ?( + objValue: any, + otherValue: any, + key: number | string, + object: T, + other: U, + stack: any + ) => boolean | void + ): boolean; + isError(value: Error): true; + isError(value: any): false; + isFinite(value: number): boolean; + isFinite(value: any): false; + isFunction(value: Function): true; + isFunction(value: any): false; + isInteger(value: number): boolean; + isInteger(value: any): false; + isLength(value: void | null): false; + isLength(value: any): boolean; + isMap(value: Map): true; + isMap(value: any): false; + isMatch(object?: ?Object, source?: ?Object): boolean; + isMatchWith( + object?: ?T, + source?: ?U, + customizer?: ?( + objValue: any, + srcValue: any, + key: number | string, + object: T, + source: U + ) => boolean | void + ): boolean; + isNaN(value: Function | string | void | null | Object): false; + isNaN(value: number): boolean; + isNative(value: number | string | void | null | Object): false; + isNative(value: any): boolean; + isNil(value: void | null): true; + isNil(value: any): false; + isNull(value: null): true; + isNull(value: any): false; + isNumber(value: number): true; + isNumber(value: any): false; + isObject(value: Object): true; + isObject(value: any): false; + isObjectLike(value: void | null): false; + isObjectLike(value: any): boolean; + isPlainObject(value: Object): true; + isPlainObject(value: any): false; + isRegExp(value: RegExp): true; + isRegExp(value: any): false; + isSafeInteger(value: number): boolean; + isSafeInteger(value: any): false; + isSet(value: Set): true; + isSet(value: any): false; + isString(value: string): true; + isString( + value: number | boolean | Function | void | null | Object | Array + ): false; + isSymbol(value: Symbol): true; + isSymbol(value: any): false; + isTypedArray(value: $TypedArray): true; + isTypedArray(value: any): false; + isUndefined(value: void): true; + isUndefined(value: any): false; + isWeakMap(value: WeakMap): true; + isWeakMap(value: any): false; + isWeakSet(value: WeakSet): true; + isWeakSet(value: any): false; + lt(value: any, other: any): boolean; + lte(value: any, other: any): boolean; + toArray(value: any): Array; + toFinite(value: void | null): 0; + toFinite(value: any): number; + toInteger(value: void | null): 0; + toInteger(value: any): number; + toLength(value: void | null): 0; + toLength(value: any): number; + toNumber(value: void | null): 0; + toNumber(value: any): number; + toPlainObject(value: any): Object; + toSafeInteger(value: void | null): 0; + toSafeInteger(value: any): number; + toString(value: void | null): ''; + toString(value: any): string; + + // Math + add(augend: number, addend: number): number; + ceil(number: number, precision?: number): number; + divide(dividend: number, divisor: number): number; + floor(number: number, precision?: number): number; + max(array: ?Array): T; + maxBy(array: ?Array, iteratee?: Iteratee): T; + mean(array: Array<*>): number; + meanBy(array: Array, iteratee?: Iteratee): number; + min(array: ?Array): T; + minBy(array: ?Array, iteratee?: Iteratee): T; + multiply(multiplier: number, multiplicand: number): number; + round(number: number, precision?: number): number; + subtract(minuend: number, subtrahend: number): number; + sum(array: Array<*>): number; + sumBy(array: Array, iteratee?: Iteratee): number; + + // number + clamp(number?: number, lower?: ?number, upper?: ?number): number; + clamp(number: ?number, lower?: ?number, upper?: ?number): 0; + inRange(number: number, start?: number, end: number): boolean; + random(lower?: number, upper?: number, floating?: boolean): number; + + // Object + assign(object?: ?Object, ...sources?: Array): Object; + assignIn(): {}; + assignIn(a: A, b: B): A & B; + assignIn(a: A, b: B, c: C): A & B & C; + assignIn(a: A, b: B, c: C, d: D): A & B & C & D; + assignIn(a: A, b: B, c: C, d: D, e: E): A & B & C & D & E; + assignInWith(): {}; + assignInWith( + object: T, + s1: A, + customizer?: ( + objValue: any, + srcValue: any, + key: string, + object: T, + source: A + ) => any | void + ): Object; + assignInWith( + object: T, + s1: A, + s2: B, + customizer?: ( + objValue: any, + srcValue: any, + key: string, + object: T, + source: A | B + ) => any | void + ): Object; + assignInWith( + object: T, + s1: A, + s2: B, + s3: C, + customizer?: ( + objValue: any, + srcValue: any, + key: string, + object: T, + source: A | B | C + ) => any | void + ): Object; + assignInWith( + object: T, + s1: A, + s2: B, + s3: C, + s4: D, + customizer?: ( + objValue: any, + srcValue: any, + key: string, + object: T, + source: A | B | C | D + ) => any | void + ): Object; + assignWith(): {}; + assignWith( + object: T, + s1: A, + customizer?: ( + objValue: any, + srcValue: any, + key: string, + object: T, + source: A + ) => any | void + ): Object; + assignWith( + object: T, + s1: A, + s2: B, + customizer?: ( + objValue: any, + srcValue: any, + key: string, + object: T, + source: A | B + ) => any | void + ): Object; + assignWith( + object: T, + s1: A, + s2: B, + s3: C, + customizer?: ( + objValue: any, + srcValue: any, + key: string, + object: T, + source: A | B | C + ) => any | void + ): Object; + assignWith( + object: T, + s1: A, + s2: B, + s3: C, + s4: D, + customizer?: ( + objValue: any, + srcValue: any, + key: string, + object: T, + source: A | B | C | D + ) => any | void + ): Object; + at(object?: ?Object, ...paths: Array): Array; + at(object?: ?Object, paths: Array): Array; + create(prototype: T, properties: Object): $Supertype; + create(prototype: any, properties: void | null): {}; + defaults(object?: ?Object, ...sources?: Array): Object; + defaultsDeep(object?: ?Object, ...sources?: Array): Object; + // alias for _.toPairs + entries(object?: ?Object): Array<[string, any]>; + // alias for _.toPairsIn + entriesIn(object?: ?Object): Array<[string, any]>; + // alias for _.assignIn + extend(a?: ?A, b?: ?B): A & B; + extend(a: A, b: B, c: C): A & B & C; + extend(a: A, b: B, c: C, d: D): A & B & C & D; + extend(a: A, b: B, c: C, d: D, e: E): A & B & C & D & E; + // alias for _.assignInWith + extendWith( + object?: ?T, + s1?: ?A, + customizer?: ?( + objValue: any, + srcValue: any, + key: string, + object: T, + source: A + ) => any | void + ): Object; + extendWith( + object: T, + s1: A, + s2: B, + customizer?: ( + objValue: any, + srcValue: any, + key: string, + object: T, + source: A | B + ) => any | void + ): Object; + extendWith( + object: T, + s1: A, + s2: B, + s3: C, + customizer?: ( + objValue: any, + srcValue: any, + key: string, + object: T, + source: A | B | C + ) => any | void + ): Object; + extendWith( + object: T, + s1: A, + s2: B, + s3: C, + s4: D, + customizer?: ( + objValue: any, + srcValue: any, + key: string, + object: T, + source: A | B | C | D + ) => any | void + ): Object; + findKey( + object: T, + predicate?: ?OPredicate + ): string | void; + findKey( + object: void | null, + predicate?: ?OPredicate + ): void; + findLastKey( + object: T, + predicate?: ?OPredicate + ): string | void; + findLastKey( + object: void | null, + predicate?: ?OPredicate + ): void; + forIn(object: Object, iteratee?: ?OIteratee<*>): Object; + forIn(object: void | null, iteratee?: ?OIteratee<*>): null; + forInRight(object: Object, iteratee?: ?OIteratee<*>): Object; + forInRight(object: void | null, iteratee?: ?OIteratee<*>): null; + forOwn(object: Object, iteratee?: ?OIteratee<*>): Object; + forOwn(object: void | null, iteratee?: ?OIteratee<*>): null; + forOwnRight(object: Object, iteratee?: ?OIteratee<*>): Object; + forOwnRight(object: void | null, iteratee?: ?OIteratee<*>): null; + functions(object?: ?Object): Array; + functionsIn(object?: ?Object): Array; + get( + object?: ?Object | ?Array, + path?: ?Array | string, + defaultValue?: any + ): any; + has(object: Object, path: Array | string): boolean; + has(object: Object, path: void | null): false; + has(object: void | null, path?: ?Array | ?string): false; + hasIn(object: Object, path: Array | string): boolean; + hasIn(object: Object, path: void | null): false; + hasIn(object: void | null, path?: ?Array | ?string): false; + invert(object: Object, multiVal?: ?boolean): Object; + invert(object: void | null, multiVal?: ?boolean): {}; + invertBy(object: Object, iteratee?: ?Function): Object; + invertBy(object: void | null, iteratee?: ?Function): {}; + invoke( + object?: ?Object, + path?: ?Array | string, + ...args?: Array + ): any; + keys(object?: ?{ [key: K]: any }): Array; + keys(object?: ?Object): Array; + keysIn(object?: ?Object): Array; + mapKeys(object: Object, iteratee?: ?OIteratee<*>): Object; + mapKeys(object: void | null, iteratee?: ?OIteratee<*>): {}; + mapValues(object: Object, iteratee?: ?OIteratee<*>): Object; + mapValues(object: void | null, iteratee?: ?OIteratee<*>): {}; + merge(object?: ?Object, ...sources?: Array): Object; + mergeWith(): {}; + mergeWith( + object: T, + customizer?: ( + objValue: any, + srcValue: any, + key: string, + object: T, + source: A + ) => any | void + ): Object; + mergeWith( + object: T, + s1: A, + s2: B, + customizer?: ( + objValue: any, + srcValue: any, + key: string, + object: T, + source: A | B + ) => any | void + ): Object; + mergeWith( + object: T, + s1: A, + s2: B, + s3: C, + customizer?: ( + objValue: any, + srcValue: any, + key: string, + object: T, + source: A | B | C + ) => any | void + ): Object; + mergeWith( + object: T, + s1: A, + s2: B, + s3: C, + s4: D, + customizer?: ( + objValue: any, + srcValue: any, + key: string, + object: T, + source: A | B | C | D + ) => any | void + ): Object; + omit(object?: ?Object, ...props: Array): Object; + omit(object?: ?Object, props: Array): Object; + omitBy( + object: T, + predicate?: ?OPredicate + ): Object; + omitBy( + object: T, + predicate?: ?OPredicate + ): {}; + pick(object?: ?Object, ...props: Array): Object; + pick(object?: ?Object, props: Array): Object; + pickBy( + object: T, + predicate?: ?OPredicate + ): Object; + pickBy( + object: T, + predicate?: ?OPredicate + ): {}; + result( + object?: ?Object, + path?: ?Array | string, + defaultValue?: any + ): any; + set(object: Object, path?: ?Array | string, value: any): Object; + set( + object: T, + path?: ?Array | string, + value?: ?any): T; + setWith( + object: T, + path?: ?Array | string, + value: any, + customizer?: (nsValue: any, key: string, nsObject: T) => any + ): Object; + setWith( + object: T, + path?: ?Array | string, + value?: ?any, + customizer?: ?(nsValue: any, key: string, nsObject: T) => any + ): T; + toPairs(object?: ?Object | Array<*>): Array<[string, any]>; + toPairsIn(object?: ?Object): Array<[string, any]>; + transform( + collection: Object | Array, + iteratee?: ?OIteratee<*>, + accumulator?: any + ): any; + transform( + collection: void | null, + iteratee?: ?OIteratee<*>, + accumulator?: ?any + ): {}; + unset(object: Object, path?: ?Array | ?string): boolean; + unset(object: void | null, path?: ?Array | ?string): true; + update(object: Object, path: string[] | string, updater: Function): Object; + update( + object: T, + path?: ?string[] | ?string, + updater?: ?Function): T; + updateWith( + object: Object, + path?: ?string[] | ?string, + updater?: ?Function, + customizer?: ?Function + ): Object; + updateWith( + object: T, + path?: ?string[] | ?string, + updater?: ?Function, + customizer?: ?Function + ): T; + values(object?: ?Object): Array; + valuesIn(object?: ?Object): Array; + + // Seq + // harder to read, but this is _() + (value: any): any; + chain(value: T): any; + tap(value: T, interceptor: (value: T) => any): T; + thru(value: T1, interceptor: (value: T1) => T2): T2; + // TODO: _.prototype.* + + // String + camelCase(string: string): string; + camelCase(string: void | null): ''; + capitalize(string: string): string; + capitalize(string: void | null): ''; + deburr(string: string): string; + deburr(string: void | null): ''; + endsWith(string: string, target?: string, position?: ?number): boolean; + endsWith(string: void | null, target?: ?string, position?: ?number): false; + escape(string: string): string; + escape(string: void | null): ''; + escapeRegExp(string: string): string; + escapeRegExp(string: void | null): ''; + kebabCase(string: string): string; + kebabCase(string: void | null): ''; + lowerCase(string: string): string; + lowerCase(string: void | null): ''; + lowerFirst(string: string): string; + lowerFirst(string: void | null): ''; + pad(string?: ?string, length?: ?number, chars?: ?string): string; + padEnd(string?: ?string, length?: ?number, chars?: ?string): string; + padStart(string?: ?string, length?: ?number, chars?: ?string): string; + parseInt(string: string, radix?: ?number): number; + repeat(string: string, n?: ?number): string; + repeat(string: void | null, n?: ?number): ''; + replace( + string: string, + pattern: RegExp | string, + replacement: ((string: string) => string) | string + ): string; + replace( + string: void | null, + pattern?: ?RegExp | ?string, + replacement: ?((string: string) => string) | ?string + ): ''; + snakeCase(string: string): string; + snakeCase(string: void | null): ''; + split( + string?: ?string, + separator?: ?RegExp | ?string, + limit?: ?number + ): Array; + startCase(string: string): string; + startCase(string: void | null): ''; + startsWith(string: string, target?: string, position?: number): boolean; + startsWith(string: void | null, target?: ?string, position?: ?number): false; + template(string?: ?string, options?: ?TemplateSettings): Function; + toLower(string: string): string; + toLower(string: void | null): ''; + toUpper(string: string): string; + toUpper(string: void | null): ''; + trim(string: string, chars?: string): string; + trim(string: void | null, chars?: ?string): ''; + trimEnd(string: string, chars?: ?string): string; + trimEnd(string: void | null, chars?: ?string): ''; + trimStart(string: string, chars?: ?string): string; + trimStart(string: void | null, chars?: ?string): ''; + truncate(string: string, options?: TruncateOptions): string; + truncate(string: void | null, options?: ?TruncateOptions): ''; + unescape(string: string): string; + unescape(string: void | null): ''; + upperCase(string: string): string; + upperCase(string: void | null): ''; + upperFirst(string: string): string; + upperFirst(string: void | null): ''; + words(string?: ?string, pattern?: ?RegExp | ?string): Array; + + // Util + attempt(func: Function, ...args: Array): any; + bindAll(object: Object, methodNames?: ?Array): Object; + bindAll(object: T, methodNames?: ?Array): T; + bindAll(object: Object, ...methodNames: Array): Object; + cond(pairs?: ?NestedArray): Function; + conforms(source?: ?Object): Function; + constant(value: T): () => T; + defaultTo( + value: T1, + defaultValue: T2 + ): T1; + // NaN is a number instead of its own type, otherwise it would behave like null/void + defaultTo(value: T1, defaultValue: T2): T1 | T2; + defaultTo(value: T1, defaultValue: T2): T2; + flow: $ComposeReverse; + flow(funcs?: Array): Function; + flowRight: $Compose; + flowRight(funcs?: Array): Function; + identity(value: T): T; + iteratee(func?: any): Function; + matches(source?: ?Object): Function; + matchesProperty(path?: ?Array | string, srcValue: any): Function; + method(path?: ?Array | string, ...args?: Array): Function; + methodOf(object?: ?Object, ...args?: Array): Function; + mixin( + object?: T, + source: Object, + options?: { chain: boolean } + ): T; + noConflict(): Lodash; + noop(...args: Array): void; + nthArg(n?: ?number): Function; + over(...iteratees: Array): Function; + over(iteratees: Array): Function; + overEvery(...predicates: Array): Function; + overEvery(predicates: Array): Function; + overSome(...predicates: Array): Function; + overSome(predicates: Array): Function; + property(path?: ?Array | string): Function; + propertyOf(object?: ?Object): Function; + range(start: number, end: number, step?: number): Array; + range(end: number, step?: number): Array; + rangeRight(start?: ?number, end?: ?number, step?: ?number): Array; + rangeRight(end?: ?number, step?: ?number): Array; + runInContext(context?: ?Object): Function; + + stubArray(): Array<*>; + stubFalse(): false; + stubObject(): {}; + stubString(): ""; + stubTrue(): true; + times(n?: ?number, ...rest?: Array): Array; + times(n: number, iteratee: (i: number) => T): Array; + toPath(value: any): Array; + uniqueId(prefix?: ?string): string; + + // Properties + VERSION: string; + templateSettings: TemplateSettings; + } + + declare module.exports: Lodash; +} + +declare module "lodash/fp" { + declare type __CurriedFunction1 = (...r: [AA]) => R; + declare type CurriedFunction1 = __CurriedFunction1; + + declare type __CurriedFunction2 = (( + ...r: [AA] + ) => CurriedFunction1) & + ((...r: [AA, BB]) => R); + declare type CurriedFunction2 = __CurriedFunction2; + + declare type __CurriedFunction3 = (( + ...r: [AA] + ) => CurriedFunction2) & + ((...r: [AA, BB]) => CurriedFunction1) & + ((...r: [AA, BB, CC]) => R); + declare type CurriedFunction3 = __CurriedFunction3< + A, + B, + C, + R, + *, + *, + * + >; + + declare type __CurriedFunction4< + A, + B, + C, + D, + R, + AA: A, + BB: B, + CC: C, + DD: D + > = ((...r: [AA]) => CurriedFunction3) & + ((...r: [AA, BB]) => CurriedFunction2) & + ((...r: [AA, BB, CC]) => CurriedFunction1) & + ((...r: [AA, BB, CC, DD]) => R); + declare type CurriedFunction4 = __CurriedFunction4< + A, + B, + C, + D, + R, + *, + *, + *, + * + >; + + declare type __CurriedFunction5< + A, + B, + C, + D, + E, + R, + AA: A, + BB: B, + CC: C, + DD: D, + EE: E + > = ((...r: [AA]) => CurriedFunction4) & + ((...r: [AA, BB]) => CurriedFunction3) & + ((...r: [AA, BB, CC]) => CurriedFunction2) & + ((...r: [AA, BB, CC, DD]) => CurriedFunction1) & + ((...r: [AA, BB, CC, DD, EE]) => R); + declare type CurriedFunction5 = __CurriedFunction5< + A, + B, + C, + D, + E, + R, + *, + *, + *, + *, + * + >; + + declare type __CurriedFunction6< + A, + B, + C, + D, + E, + F, + R, + AA: A, + BB: B, + CC: C, + DD: D, + EE: E, + FF: F + > = ((...r: [AA]) => CurriedFunction5) & + ((...r: [AA, BB]) => CurriedFunction4) & + ((...r: [AA, BB, CC]) => CurriedFunction3) & + ((...r: [AA, BB, CC, DD]) => CurriedFunction2) & + ((...r: [AA, BB, CC, DD, EE]) => CurriedFunction1) & + ((...r: [AA, BB, CC, DD, EE, FF]) => R); + declare type CurriedFunction6 = __CurriedFunction6< + A, + B, + C, + D, + E, + F, + R, + *, + *, + *, + *, + *, + * + >; + + declare type Curry = (((...r: [A]) => R) => CurriedFunction1) & + (((...r: [A, B]) => R) => CurriedFunction2) & + (((...r: [A, B, C]) => R) => CurriedFunction3) & + (( + (...r: [A, B, C, D]) => R + ) => CurriedFunction4) & + (( + (...r: [A, B, C, D, E]) => R + ) => CurriedFunction5) & + (( + (...r: [A, B, C, D, E, F]) => R + ) => CurriedFunction6); + + declare type UnaryFn = (a: A) => R; + + declare type TemplateSettings = { + escape?: RegExp, + evaluate?: RegExp, + imports?: Object, + interpolate?: RegExp, + variable?: string + }; + + declare type TruncateOptions = { + length?: number, + omission?: string, + separator?: RegExp | string + }; + + declare type DebounceOptions = { + leading?: boolean, + maxWait?: number, + trailing?: boolean + }; + + declare type ThrottleOptions = { + leading?: boolean, + trailing?: boolean + }; + + declare type NestedArray = Array>; + + declare type matchesIterateeShorthand = Object; + declare type matchesPropertyIterateeShorthand = [string, any]; + declare type propertyIterateeShorthand = string; + + declare type OPredicate = + | ((value: A) => any) + | matchesIterateeShorthand + | matchesPropertyIterateeShorthand + | propertyIterateeShorthand; + + declare type OIterateeWithResult = Object | string | ((value: V) => R); + declare type OIteratee = OIterateeWithResult; + declare type OFlatMapIteratee = OIterateeWithResult>; + + declare type Predicate = + | ((value: T) => any) + | matchesIterateeShorthand + | matchesPropertyIterateeShorthand + | propertyIterateeShorthand; + + declare type _ValueOnlyIteratee = (value: T) => mixed; + declare type ValueOnlyIteratee = _ValueOnlyIteratee | string; + declare type _Iteratee = (item: T) => mixed; + declare type Iteratee = _Iteratee | Object | string; + declare type FlatMapIteratee = + | ((item: T) => Array) + | Object + | string; + declare type Comparator = (item: T, item2: T) => boolean; + + declare type MapIterator = ((item: T) => U) | propertyIterateeShorthand; + + declare type OMapIterator = + | ((item: T) => U) + | propertyIterateeShorthand; + + declare class Lodash { + // Array + chunk(size: number): (array: Array) => Array>; + chunk(size: number, array: Array): Array>; + compact(array: Array): Array; + concat | T, B: Array | U>( + base: A + ): (elements: B) => Array; + concat | T, B: Array | U>( + base: A, + elements: B + ): Array; + difference(values: Array): (array: Array) => Array; + difference(values: Array, array: Array): Array; + differenceBy( + iteratee: ValueOnlyIteratee + ): ((values: Array) => (array: Array) => T[]) & + ((values: Array, array: Array) => T[]); + differenceBy( + iteratee: ValueOnlyIteratee, + values: Array + ): (array: Array) => T[]; + differenceBy( + iteratee: ValueOnlyIteratee, + values: Array, + array: Array + ): T[]; + differenceWith( + values: T[] + ): ((comparator: Comparator) => (array: T[]) => T[]) & + ((comparator: Comparator, array: T[]) => T[]); + differenceWith( + values: T[], + comparator: Comparator + ): (array: T[]) => T[]; + differenceWith(values: T[], comparator: Comparator, array: T[]): T[]; + drop(n: number): (array: Array) => Array; + drop(n: number, array: Array): Array; + dropLast(n: number): (array: Array) => Array; + dropLast(n: number, array: Array): Array; + dropRight(n: number): (array: Array) => Array; + dropRight(n: number, array: Array): Array; + dropRightWhile(predicate: Predicate): (array: Array) => Array; + dropRightWhile(predicate: Predicate, array: Array): Array; + dropWhile(predicate: Predicate): (array: Array) => Array; + dropWhile(predicate: Predicate, array: Array): Array; + dropLastWhile(predicate: Predicate): (array: Array) => Array; + dropLastWhile(predicate: Predicate, array: Array): Array; + fill( + start: number + ): (( + end: number + ) => ((value: U) => (array: Array) => Array) & + ((value: U, array: Array) => Array)) & + ((end: number, value: U) => (array: Array) => Array) & + ((end: number, value: U, array: Array) => Array); + fill( + start: number, + end: number + ): ((value: U) => (array: Array) => Array) & + ((value: U, array: Array) => Array); + fill( + start: number, + end: number, + value: U + ): (array: Array) => Array; + fill( + start: number, + end: number, + value: U, + array: Array + ): Array; + findIndex(predicate: Predicate): (array: $ReadOnlyArray) => number; + findIndex(predicate: Predicate, array: $ReadOnlyArray): number; + findIndexFrom( + predicate: Predicate + ): ((fromIndex: number) => (array: $ReadOnlyArray) => number) & + ((fromIndex: number, array: $ReadOnlyArray) => number); + findIndexFrom( + predicate: Predicate, + fromIndex: number + ): (array: $ReadOnlyArray) => number; + findIndexFrom( + predicate: Predicate, + fromIndex: number, + array: $ReadOnlyArray + ): number; + findLastIndex( + predicate: Predicate + ): (array: $ReadOnlyArray) => number; + findLastIndex(predicate: Predicate, array: $ReadOnlyArray): number; + findLastIndexFrom( + predicate: Predicate + ): ((fromIndex: number) => (array: $ReadOnlyArray) => number) & + ((fromIndex: number, array: $ReadOnlyArray) => number); + findLastIndexFrom( + predicate: Predicate, + fromIndex: number + ): (array: $ReadOnlyArray) => number; + findLastIndexFrom( + predicate: Predicate, + fromIndex: number, + array: $ReadOnlyArray + ): number; + // alias of _.head + first(array: Array): T; + flatten(array: Array | X>): Array; + unnest(array: Array | X>): Array; + flattenDeep(array: any[]): Array; + flattenDepth(depth: number): (array: any[]) => any[]; + flattenDepth(depth: number, array: any[]): any[]; + fromPairs(pairs: Array<[A, B]>): { [key: A]: B }; + head(array: Array): T; + indexOf(value: T): (array: Array) => number; + indexOf(value: T, array: Array): number; + indexOfFrom( + value: T + ): ((fromIndex: number) => (array: Array) => number) & + ((fromIndex: number, array: Array) => number); + indexOfFrom(value: T, fromIndex: number): (array: Array) => number; + indexOfFrom(value: T, fromIndex: number, array: Array): number; + initial(array: Array): Array; + init(array: Array): Array; + intersection(a1: Array): (a2: Array) => Array; + intersection(a1: Array, a2: Array): Array; + intersectionBy( + iteratee: ValueOnlyIteratee + ): ((a1: Array) => (a2: Array) => Array) & + ((a1: Array, a2: Array) => Array); + intersectionBy( + iteratee: ValueOnlyIteratee, + a1: Array + ): (a2: Array) => Array; + intersectionBy( + iteratee: ValueOnlyIteratee, + a1: Array, + a2: Array + ): Array; + intersectionWith( + comparator: Comparator + ): ((a1: Array) => (a2: Array) => Array) & + ((a1: Array, a2: Array) => Array); + intersectionWith( + comparator: Comparator, + a1: Array + ): (a2: Array) => Array; + intersectionWith( + comparator: Comparator, + a1: Array, + a2: Array + ): Array; + join(separator: string): (array: Array) => string; + join(separator: string, array: Array): string; + last(array: Array): T; + lastIndexOf(value: T): (array: Array) => number; + lastIndexOf(value: T, array: Array): number; + lastIndexOfFrom( + value: T + ): ((fromIndex: number) => (array: Array) => number) & + ((fromIndex: number, array: Array) => number); + lastIndexOfFrom( + value: T, + fromIndex: number + ): (array: Array) => number; + lastIndexOfFrom(value: T, fromIndex: number, array: Array): number; + nth(n: number): (array: T[]) => T; + nth(n: number, array: T[]): T; + pull(value: T): (array: Array) => Array; + pull(value: T, array: Array): Array; + pullAll(values: Array): (array: Array) => Array; + pullAll(values: Array, array: Array): Array; + pullAllBy( + iteratee: ValueOnlyIteratee + ): ((values: Array) => (array: Array) => Array) & + ((values: Array, array: Array) => Array); + pullAllBy( + iteratee: ValueOnlyIteratee, + values: Array + ): (array: Array) => Array; + pullAllBy( + iteratee: ValueOnlyIteratee, + values: Array, + array: Array + ): Array; + pullAllWith( + comparator: Function + ): ((values: T[]) => (array: T[]) => T[]) & + ((values: T[], array: T[]) => T[]); + pullAllWith(comparator: Function, values: T[]): (array: T[]) => T[]; + pullAllWith(comparator: Function, values: T[], array: T[]): T[]; + pullAt(indexed: Array): (array: Array) => Array; + pullAt(indexed: Array, array: Array): Array; + remove(predicate: Predicate): (array: Array) => Array; + remove(predicate: Predicate, array: Array): Array; + reverse(array: Array): Array; + slice( + start: number + ): ((end: number) => (array: Array) => Array) & + ((end: number, array: Array) => Array); + slice(start: number, end: number): (array: Array) => Array; + slice(start: number, end: number, array: Array): Array; + sortedIndex(value: T): (array: Array) => number; + sortedIndex(value: T, array: Array): number; + sortedIndexBy( + iteratee: ValueOnlyIteratee + ): ((value: T) => (array: Array) => number) & + ((value: T, array: Array) => number); + sortedIndexBy( + iteratee: ValueOnlyIteratee, + value: T + ): (array: Array) => number; + sortedIndexBy( + iteratee: ValueOnlyIteratee, + value: T, + array: Array + ): number; + sortedIndexOf(value: T): (array: Array) => number; + sortedIndexOf(value: T, array: Array): number; + sortedLastIndex(value: T): (array: Array) => number; + sortedLastIndex(value: T, array: Array): number; + sortedLastIndexBy( + iteratee: ValueOnlyIteratee + ): ((value: T) => (array: Array) => number) & + ((value: T, array: Array) => number); + sortedLastIndexBy( + iteratee: ValueOnlyIteratee, + value: T + ): (array: Array) => number; + sortedLastIndexBy( + iteratee: ValueOnlyIteratee, + value: T, + array: Array + ): number; + sortedLastIndexOf(value: T): (array: Array) => number; + sortedLastIndexOf(value: T, array: Array): number; + sortedUniq(array: Array): Array; + sortedUniqBy( + iteratee: (value: T) => mixed + ): (array: Array) => Array; + sortedUniqBy(iteratee: (value: T) => mixed, array: Array): Array; + tail(array: Array): Array; + take(n: number): (array: Array) => Array; + take(n: number, array: Array): Array; + takeRight(n: number): (array: Array) => Array; + takeRight(n: number, array: Array): Array; + takeLast(n: number): (array: Array) => Array; + takeLast(n: number, array: Array): Array; + takeRightWhile(predicate: Predicate): (array: Array) => Array; + takeRightWhile(predicate: Predicate, array: Array): Array; + takeLastWhile(predicate: Predicate): (array: Array) => Array; + takeLastWhile(predicate: Predicate, array: Array): Array; + takeWhile(predicate: Predicate): (array: Array) => Array; + takeWhile(predicate: Predicate, array: Array): Array; + union(a1: Array): (a2: Array) => Array; + union(a1: Array, a2: Array): Array; + unionBy( + iteratee: ValueOnlyIteratee + ): ((a1: Array) => (a2: Array) => Array) & + ((a1: Array, a2: Array) => Array); + unionBy( + iteratee: ValueOnlyIteratee, + a1: Array + ): (a2: Array) => Array; + unionBy( + iteratee: ValueOnlyIteratee, + a1: Array, + a2: Array + ): Array; + unionWith( + comparator: Comparator + ): ((a1: Array) => (a2: Array) => Array) & + ((a1: Array, a2: Array) => Array); + unionWith( + comparator: Comparator, + a1: Array + ): (a2: Array) => Array; + unionWith( + comparator: Comparator, + a1: Array, + a2: Array + ): Array; + uniq(array: Array): Array; + uniqBy(iteratee: ValueOnlyIteratee): (array: Array) => Array; + uniqBy(iteratee: ValueOnlyIteratee, array: Array): Array; + uniqWith(comparator: Comparator): (array: Array) => Array; + uniqWith(comparator: Comparator, array: Array): Array; + unzip(array: Array): Array; + unzipWith(iteratee: Iteratee): (array: Array) => Array; + unzipWith(iteratee: Iteratee, array: Array): Array; + without(values: Array): (array: Array) => Array; + without(values: Array, array: Array): Array; + xor(a1: Array): (a2: Array) => Array; + xor(a1: Array, a2: Array): Array; + symmetricDifference(a1: Array): (a2: Array) => Array; + symmetricDifference(a1: Array, a2: Array): Array; + xorBy( + iteratee: ValueOnlyIteratee + ): ((a1: Array) => (a2: Array) => Array) & + ((a1: Array, a2: Array) => Array); + xorBy( + iteratee: ValueOnlyIteratee, + a1: Array + ): (a2: Array) => Array; + xorBy( + iteratee: ValueOnlyIteratee, + a1: Array, + a2: Array + ): Array; + symmetricDifferenceBy( + iteratee: ValueOnlyIteratee + ): ((a1: Array) => (a2: Array) => Array) & + ((a1: Array, a2: Array) => Array); + symmetricDifferenceBy( + iteratee: ValueOnlyIteratee, + a1: Array + ): (a2: Array) => Array; + symmetricDifferenceBy( + iteratee: ValueOnlyIteratee, + a1: Array, + a2: Array + ): Array; + xorWith( + comparator: Comparator + ): ((a1: Array) => (a2: Array) => Array) & + ((a1: Array, a2: Array) => Array); + xorWith( + comparator: Comparator, + a1: Array + ): (a2: Array) => Array; + xorWith(comparator: Comparator, a1: Array, a2: Array): Array; + symmetricDifferenceWith( + comparator: Comparator + ): ((a1: Array) => (a2: Array) => Array) & + ((a1: Array, a2: Array) => Array); + symmetricDifferenceWith( + comparator: Comparator, + a1: Array + ): (a2: Array) => Array; + symmetricDifferenceWith( + comparator: Comparator, + a1: Array, + a2: Array + ): Array; + zip(a1: A[]): (a2: B[]) => Array<[A, B]>; + zip(a1: A[], a2: B[]): Array<[A, B]>; + zipAll(arrays: Array>): Array; + zipObject(props?: Array): (values?: Array) => { [key: K]: V }; + zipObject(props?: Array, values?: Array): { [key: K]: V }; + zipObj(props: Array): (values: Array) => Object; + zipObj(props: Array, values: Array): Object; + zipObjectDeep(props: any[]): (values: any) => Object; + zipObjectDeep(props: any[], values: any): Object; + zipWith( + iteratee: Iteratee + ): ((a1: NestedArray) => (a2: NestedArray) => Array) & + ((a1: NestedArray, a2: NestedArray) => Array); + zipWith( + iteratee: Iteratee, + a1: NestedArray + ): (a2: NestedArray) => Array; + zipWith( + iteratee: Iteratee, + a1: NestedArray, + a2: NestedArray + ): Array; + // Collection + countBy( + iteratee: ValueOnlyIteratee + ): (collection: Array | { [id: any]: T }) => { [string]: number }; + countBy( + iteratee: ValueOnlyIteratee, + collection: Array | { [id: any]: T } + ): { [string]: number }; + // alias of _.forEach + each( + iteratee: Iteratee | OIteratee + ): (collection: Array | { [id: any]: T }) => Array; + each( + iteratee: Iteratee | OIteratee, + collection: Array | { [id: any]: T } + ): Array; + // alias of _.forEachRight + eachRight( + iteratee: Iteratee | OIteratee + ): (collection: Array | { [id: any]: T }) => Array; + eachRight( + iteratee: Iteratee | OIteratee, + collection: Array | { [id: any]: T } + ): Array; + every( + iteratee: Iteratee | OIteratee + ): (collection: Array | { [id: any]: T }) => boolean; + every( + iteratee: Iteratee | OIteratee, + collection: Array | { [id: any]: T } + ): boolean; + all( + iteratee: Iteratee | OIteratee + ): (collection: Array | { [id: any]: T }) => boolean; + all( + iteratee: Iteratee | OIteratee, + collection: Array | { [id: any]: T } + ): boolean; + filter( + predicate: Predicate | OPredicate + ): (collection: Array | { [id: any]: T }) => Array; + filter( + predicate: Predicate | OPredicate, + collection: Array | { [id: any]: T } + ): Array; + find( + predicate: Predicate | OPredicate + ): (collection: $ReadOnlyArray | { [id: any]: T }) => T | void; + find( + predicate: Predicate | OPredicate, + collection: $ReadOnlyArray | { [id: any]: T } + ): T | void; + findFrom( + predicate: Predicate | OPredicate + ): (( + fromIndex: number + ) => (collection: $ReadOnlyArray | { [id: any]: T }) => T | void) & + (( + fromIndex: number, + collection: $ReadOnlyArray | { [id: any]: T } + ) => T | void); + findFrom( + predicate: Predicate | OPredicate, + fromIndex: number + ): (collection: Array | { [id: any]: T }) => T | void; + findFrom( + predicate: Predicate | OPredicate, + fromIndex: number, + collection: $ReadOnlyArray | { [id: any]: T } + ): T | void; + findLast( + predicate: Predicate | OPredicate + ): (collection: $ReadOnlyArray | { [id: any]: T }) => T | void; + findLast( + predicate: Predicate | OPredicate, + collection: $ReadOnlyArray | { [id: any]: T } + ): T | void; + findLastFrom( + predicate: Predicate | OPredicate + ): (( + fromIndex: number + ) => (collection: $ReadOnlyArray | { [id: any]: T }) => T | void) & + (( + fromIndex: number, + collection: $ReadOnlyArray | { [id: any]: T } + ) => T | void); + findLastFrom( + predicate: Predicate | OPredicate, + fromIndex: number + ): (collection: $ReadOnlyArray | { [id: any]: T }) => T | void; + findLastFrom( + predicate: Predicate | OPredicate, + fromIndex: number, + collection: $ReadOnlyArray | { [id: any]: T } + ): T | void; + flatMap( + iteratee: FlatMapIteratee | OFlatMapIteratee + ): (collection: Array | { [id: any]: T }) => Array; + flatMap( + iteratee: FlatMapIteratee | OFlatMapIteratee, + collection: Array | { [id: any]: T } + ): Array; + flatMapDeep( + iteratee: FlatMapIteratee | OFlatMapIteratee + ): (collection: Array | { [id: any]: T }) => Array; + flatMapDeep( + iteratee: FlatMapIteratee | OFlatMapIteratee, + collection: Array | { [id: any]: T } + ): Array; + flatMapDepth( + iteratee: FlatMapIteratee | OFlatMapIteratee + ): (( + depth: number + ) => (collection: Array | { [id: any]: T }) => Array) & + ((depth: number, collection: Array | { [id: any]: T }) => Array); + flatMapDepth( + iteratee: FlatMapIteratee | OFlatMapIteratee, + depth: number + ): (collection: Array | { [id: any]: T }) => Array; + flatMapDepth( + iteratee: FlatMapIteratee | OFlatMapIteratee, + depth: number, + collection: Array | { [id: any]: T } + ): Array; + forEach( + iteratee: Iteratee | OIteratee + ): (collection: Array | { [id: any]: T }) => Array; + forEach( + iteratee: Iteratee | OIteratee, + collection: Array | { [id: any]: T } + ): Array; + forEachRight( + iteratee: Iteratee | OIteratee + ): (collection: Array | { [id: any]: T }) => Array; + forEachRight( + iteratee: Iteratee | OIteratee, + collection: Array | { [id: any]: T } + ): Array; + groupBy( + iteratee: ValueOnlyIteratee + ): (collection: Array | { [id: any]: T }) => { [key: V]: Array }; + groupBy( + iteratee: ValueOnlyIteratee, + collection: Array | { [id: any]: T } + ): { [key: V]: Array }; + includes(value: string): (str: string) => boolean; + includes(value: string, str: string): boolean; + includes(value: T): (collection: Array | { [id: any]: T }) => boolean; + includes(value: T, collection: Array | { [id: any]: T }): boolean; + contains(value: string): (str: string) => boolean; + contains(value: string, str: string): boolean; + contains(value: T): (collection: Array | { [id: any]: T }) => boolean; + contains(value: T, collection: Array | { [id: any]: T }): boolean; + includesFrom( + value: string + ): ((fromIndex: number) => (str: string) => boolean) & + ((fromIndex: number, str: string) => boolean); + includesFrom(value: string, fromIndex: number): (str: string) => boolean; + includesFrom(value: string, fromIndex: number, str: string): boolean; + includesFrom( + value: T + ): ((fromIndex: number) => (collection: Array) => boolean) & + ((fromIndex: number, collection: Array) => boolean); + includesFrom( + value: T, + fromIndex: number + ): (collection: Array) => boolean; + includesFrom(value: T, fromIndex: number, collection: Array): boolean; + invokeMap( + path: ((value: T) => Array | string) | Array | string + ): (collection: Array | { [id: any]: T }) => Array; + invokeMap( + path: ((value: T) => Array | string) | Array | string, + collection: Array | { [id: any]: T } + ): Array; + invokeArgsMap( + path: ((value: T) => Array | string) | Array | string + ): (( + collection: Array | { [id: any]: T } + ) => (args: Array) => Array) & + (( + collection: Array | { [id: any]: T }, + args: Array + ) => Array); + invokeArgsMap( + path: ((value: T) => Array | string) | Array | string, + collection: Array | { [id: any]: T } + ): (args: Array) => Array; + invokeArgsMap( + path: ((value: T) => Array | string) | Array | string, + collection: Array | { [id: any]: T }, + args: Array + ): Array; + keyBy( + iteratee: ValueOnlyIteratee + ): (collection: Array | { [id: any]: T }) => { [key: V]: T }; + keyBy( + iteratee: ValueOnlyIteratee, + collection: Array | { [id: any]: T } + ): { [key: V]: T }; + indexBy( + iteratee: ValueOnlyIteratee + ): (collection: Array | { [id: any]: T }) => { [key: V]: T }; + indexBy( + iteratee: ValueOnlyIteratee, + collection: Array | { [id: any]: T } + ): { [key: V]: T }; + map( + iteratee: MapIterator | OMapIterator + ): (collection: Array | { [id: any]: T }) => Array; + map( + iteratee: MapIterator | OMapIterator, + collection: Array | { [id: any]: T } + ): Array; + map(iteratee: (char: string) => any): (str: string) => string; + map(iteratee: (char: string) => any, str: string): string; + pluck( + iteratee: MapIterator | OMapIterator + ): (collection: Array | { [id: any]: T }) => Array; + pluck( + iteratee: MapIterator | OMapIterator, + collection: Array | { [id: any]: T } + ): Array; + pluck(iteratee: (char: string) => any): (str: string) => string; + pluck(iteratee: (char: string) => any, str: string): string; + orderBy( + iteratees: Array | OIteratee<*>> | string + ): (( + orders: Array<"asc" | "desc"> | string + ) => (collection: Array | { [id: any]: T }) => Array) & + (( + orders: Array<"asc" | "desc"> | string, + collection: Array | { [id: any]: T } + ) => Array); + orderBy( + iteratees: Array | OIteratee<*>> | string, + orders: Array<"asc" | "desc"> | string + ): (collection: Array | { [id: any]: T }) => Array; + orderBy( + iteratees: Array | OIteratee<*>> | string, + orders: Array<"asc" | "desc"> | string, + collection: Array | { [id: any]: T } + ): Array; + partition( + predicate: Predicate | OPredicate + ): (collection: Array | { [id: any]: T }) => [Array, Array]; + partition( + predicate: Predicate | OPredicate, + collection: Array | { [id: any]: T } + ): [Array, Array]; + reduce( + iteratee: (accumulator: U, value: T) => U + ): ((accumulator: U) => (collection: Array | { [id: any]: T }) => U) & + ((accumulator: U, collection: Array | { [id: any]: T }) => U); + reduce( + iteratee: (accumulator: U, value: T) => U, + accumulator: U + ): (collection: Array | { [id: any]: T }) => U; + reduce( + iteratee: (accumulator: U, value: T) => U, + accumulator: U, + collection: Array | { [id: any]: T } + ): U; + reduceRight( + iteratee: (value: T, accumulator: U) => U + ): ((accumulator: U) => (collection: Array | { [id: any]: T }) => U) & + ((accumulator: U, collection: Array | { [id: any]: T }) => U); + reduceRight( + iteratee: (value: T, accumulator: U) => U, + accumulator: U + ): (collection: Array | { [id: any]: T }) => U; + reduceRight( + iteratee: (value: T, accumulator: U) => U, + accumulator: U, + collection: Array | { [id: any]: T } + ): U; + reject( + predicate: Predicate | OPredicate + ): (collection: Array | { [id: any]: T }) => Array; + reject( + predicate: Predicate | OPredicate, + collection: Array | { [id: any]: T } + ): Array; + sample(collection: Array | { [id: any]: T }): T; + sampleSize( + n: number + ): (collection: Array | { [id: any]: T }) => Array; + sampleSize(n: number, collection: Array | { [id: any]: T }): Array; + shuffle(collection: Array | { [id: any]: T }): Array; + size(collection: Array | Object | string): number; + some( + predicate: Predicate | OPredicate + ): (collection: Array | { [id: any]: T }) => boolean; + some( + predicate: Predicate | OPredicate, + collection: Array | { [id: any]: T } + ): boolean; + any( + predicate: Predicate | OPredicate + ): (collection: Array | { [id: any]: T }) => boolean; + any( + predicate: Predicate | OPredicate, + collection: Array | { [id: any]: T } + ): boolean; + sortBy( + iteratees: Array | OIteratee> | Iteratee | OIteratee + ): (collection: Array | { [id: any]: T }) => Array; + sortBy( + iteratees: Array | OIteratee> | Iteratee | OIteratee, + collection: Array | { [id: any]: T } + ): Array; + + // Date + now(): number; + + // Function + after(fn: Function): (n: number) => Function; + after(fn: Function, n: number): Function; + ary(func: Function): Function; + nAry(n: number): (func: Function) => Function; + nAry(n: number, func: Function): Function; + before(fn: Function): (n: number) => Function; + before(fn: Function, n: number): Function; + bind(func: Function): (thisArg: any) => Function; + bind(func: Function, thisArg: any): Function; + bindKey(obj: Object): (key: string) => Function; + bindKey(obj: Object, key: string): Function; + curry: Curry; + curryN(arity: number): (func: Function) => Function; + curryN(arity: number, func: Function): Function; + curryRight(func: Function): Function; + curryRightN(arity: number): (func: Function) => Function; + curryRightN(arity: number, func: Function): Function; + debounce(wait: number): (func: F) => F; + debounce(wait: number, func: F): F; + defer(func: Function): number; + delay(wait: number): (func: Function) => number; + delay(wait: number, func: Function): number; + flip(func: Function): Function; + memoize(func: F): F; + negate(predicate: Function): Function; + complement(predicate: Function): Function; + once(func: Function): Function; + overArgs(func: Function): (transforms: Array) => Function; + overArgs(func: Function, transforms: Array): Function; + useWith(func: Function): (transforms: Array) => Function; + useWith(func: Function, transforms: Array): Function; + partial(func: Function): (partials: any[]) => Function; + partial(func: Function, partials: any[]): Function; + partialRight(func: Function): (partials: Array) => Function; + partialRight(func: Function, partials: Array): Function; + rearg(indexes: Array): (func: Function) => Function; + rearg(indexes: Array, func: Function): Function; + rest(func: Function): Function; + unapply(func: Function): Function; + restFrom(start: number): (func: Function) => Function; + restFrom(start: number, func: Function): Function; + spread(func: Function): Function; + apply(func: Function): Function; + spreadFrom(start: number): (func: Function) => Function; + spreadFrom(start: number, func: Function): Function; + throttle(wait: number): (func: Function) => Function; + throttle(wait: number, func: Function): Function; + unary(func: Function): Function; + wrap(wrapper: Function): (value: any) => Function; + wrap(wrapper: Function, value: any): Function; + + // Lang + castArray(value: *): any[]; + clone(value: T): T; + cloneDeep(value: T): T; + cloneDeepWith( + customizer: (value: T, key: number | string, object: T, stack: any) => U + ): (value: T) => U; + cloneDeepWith( + customizer: (value: T, key: number | string, object: T, stack: any) => U, + value: T + ): U; + cloneWith( + customizer: (value: T, key: number | string, object: T, stack: any) => U + ): (value: T) => U; + cloneWith( + customizer: (value: T, key: number | string, object: T, stack: any) => U, + value: T + ): U; + conformsTo( + predicates: T & { [key: string]: (x: any) => boolean } + ): (source: T) => boolean; + conformsTo( + predicates: T & { [key: string]: (x: any) => boolean }, + source: T + ): boolean; + where( + predicates: T & { [key: string]: (x: any) => boolean } + ): (source: T) => boolean; + where( + predicates: T & { [key: string]: (x: any) => boolean }, + source: T + ): boolean; + conforms( + predicates: T & { [key: string]: (x: any) => boolean } + ): (source: T) => boolean; + conforms( + predicates: T & { [key: string]: (x: any) => boolean }, + source: T + ): boolean; + eq(value: any): (other: any) => boolean; + eq(value: any, other: any): boolean; + identical(value: any): (other: any) => boolean; + identical(value: any, other: any): boolean; + gt(value: any): (other: any) => boolean; + gt(value: any, other: any): boolean; + gte(value: any): (other: any) => boolean; + gte(value: any, other: any): boolean; + isArguments(value: any): boolean; + isArray(value: any): boolean; + isArrayBuffer(value: any): boolean; + isArrayLike(value: any): boolean; + isArrayLikeObject(value: any): boolean; + isBoolean(value: any): boolean; + isBuffer(value: any): boolean; + isDate(value: any): boolean; + isElement(value: any): boolean; + isEmpty(value: any): boolean; + isEqual(value: any): (other: any) => boolean; + isEqual(value: any, other: any): boolean; + equals(value: any): (other: any) => boolean; + equals(value: any, other: any): boolean; + isEqualWith( + customizer: ( + objValue: any, + otherValue: any, + key: number | string, + object: T, + other: U, + stack: any + ) => boolean | void + ): ((value: T) => (other: U) => boolean) & + ((value: T, other: U) => boolean); + isEqualWith( + customizer: ( + objValue: any, + otherValue: any, + key: number | string, + object: T, + other: U, + stack: any + ) => boolean | void, + value: T + ): (other: U) => boolean; + isEqualWith( + customizer: ( + objValue: any, + otherValue: any, + key: number | string, + object: T, + other: U, + stack: any + ) => boolean | void, + value: T, + other: U + ): boolean; + isError(value: any): boolean; + isFinite(value: any): boolean; + isFunction(value: Function): true; + isFunction(value: number | string | void | null | Object): false; + isInteger(value: any): boolean; + isLength(value: any): boolean; + isMap(value: any): boolean; + isMatch(source: Object): (object: Object) => boolean; + isMatch(source: Object, object: Object): boolean; + whereEq(source: Object): (object: Object) => boolean; + whereEq(source: Object, object: Object): boolean; + isMatchWith( + customizer: ( + objValue: any, + srcValue: any, + key: number | string, + object: T, + source: U + ) => boolean | void + ): ((source: U) => (object: T) => boolean) & + ((source: U, object: T) => boolean); + isMatchWith( + customizer: ( + objValue: any, + srcValue: any, + key: number | string, + object: T, + source: U + ) => boolean | void, + source: U + ): (object: T) => boolean; + isMatchWith( + customizer: ( + objValue: any, + srcValue: any, + key: number | string, + object: T, + source: U + ) => boolean | void, + source: U, + object: T + ): boolean; + isNaN(value: any): boolean; + isNative(value: any): boolean; + isNil(value: any): boolean; + isNull(value: any): boolean; + isNumber(value: any): boolean; + isObject(value: any): boolean; + isObjectLike(value: any): boolean; + isPlainObject(value: any): boolean; + isRegExp(value: any): boolean; + isSafeInteger(value: any): boolean; + isSet(value: any): boolean; + isString(value: string): true; + isString( + value: number | boolean | Function | void | null | Object | Array + ): false; + isSymbol(value: any): boolean; + isTypedArray(value: any): boolean; + isUndefined(value: any): boolean; + isWeakMap(value: any): boolean; + isWeakSet(value: any): boolean; + lt(value: any): (other: any) => boolean; + lt(value: any, other: any): boolean; + lte(value: any): (other: any) => boolean; + lte(value: any, other: any): boolean; + toArray(value: any): Array; + toFinite(value: any): number; + toInteger(value: any): number; + toLength(value: any): number; + toNumber(value: any): number; + toPlainObject(value: any): Object; + toSafeInteger(value: any): number; + toString(value: any): string; + + // Math + add(augend: number): (addend: number) => number; + add(augend: number, addend: number): number; + ceil(number: number): number; + divide(dividend: number): (divisor: number) => number; + divide(dividend: number, divisor: number): number; + floor(number: number): number; + max(array: Array): T; + maxBy(iteratee: Iteratee): (array: Array) => T; + maxBy(iteratee: Iteratee, array: Array): T; + mean(array: Array<*>): number; + meanBy(iteratee: Iteratee): (array: Array) => number; + meanBy(iteratee: Iteratee, array: Array): number; + min(array: Array): T; + minBy(iteratee: Iteratee): (array: Array) => T; + minBy(iteratee: Iteratee, array: Array): T; + multiply(multiplier: number): (multiplicand: number) => number; + multiply(multiplier: number, multiplicand: number): number; + round(number: number): number; + subtract(minuend: number): (subtrahend: number) => number; + subtract(minuend: number, subtrahend: number): number; + sum(array: Array<*>): number; + sumBy(iteratee: Iteratee): (array: Array) => number; + sumBy(iteratee: Iteratee, array: Array): number; + + // number + clamp( + lower: number + ): ((upper: number) => (number: number) => number) & + ((upper: number, number: number) => number); + clamp(lower: number, upper: number): (number: number) => number; + clamp(lower: number, upper: number, number: number): number; + inRange( + start: number + ): ((end: number) => (number: number) => boolean) & + ((end: number, number: number) => boolean); + inRange(start: number, end: number): (number: number) => boolean; + inRange(start: number, end: number, number: number): boolean; + random(lower: number): (upper: number) => number; + random(lower: number, upper: number): number; + + // Object + assign(object: Object): (source: Object) => Object; + assign(object: Object, source: Object): Object; + assignAll(objects: Array): Object; + assignInAll(objects: Array): Object; + extendAll(objects: Array): Object; + assignIn(a: A): (b: B) => A & B; + assignIn(a: A, b: B): A & B; + assignInWith( + customizer: ( + objValue: any, + srcValue: any, + key: string, + object: T, + source: A + ) => any | void + ): ((object: T) => (s1: A) => Object) & ((object: T, s1: A) => Object); + assignInWith( + customizer: ( + objValue: any, + srcValue: any, + key: string, + object: T, + source: A + ) => any | void, + object: T + ): (s1: A) => Object; + assignInWith( + customizer: ( + objValue: any, + srcValue: any, + key: string, + object: T, + source: A + ) => any | void, + object: T, + s1: A + ): Object; + assignWith( + customizer: ( + objValue: any, + srcValue: any, + key: string, + object: T, + source: A + ) => any | void + ): ((object: T) => (s1: A) => Object) & ((object: T, s1: A) => Object); + assignWith( + customizer: ( + objValue: any, + srcValue: any, + key: string, + object: T, + source: A + ) => any | void, + object: T + ): (s1: A) => Object; + assignWith( + customizer: ( + objValue: any, + srcValue: any, + key: string, + object: T, + source: A + ) => any | void, + object: T, + s1: A + ): Object; + assignInAllWith( + customizer: ( + objValue: any, + srcValue: any, + key: string, + object: Object, + source: Object + ) => any | void + ): (objects: Array) => Object; + assignInAllWith( + customizer: ( + objValue: any, + srcValue: any, + key: string, + object: Object, + source: Object + ) => any | void, + objects: Array + ): Object; + extendAllWith( + customizer: ( + objValue: any, + srcValue: any, + key: string, + object: Object, + source: Object + ) => any | void + ): (objects: Array) => Object; + extendAllWith( + customizer: ( + objValue: any, + srcValue: any, + key: string, + object: Object, + source: Object + ) => any | void, + objects: Array + ): Object; + assignAllWith( + customizer: ( + objValue: any, + srcValue: any, + key: string, + object: Object, + source: Object + ) => any | void + ): (objects: Array) => Object; + assignAllWith( + customizer: ( + objValue: any, + srcValue: any, + key: string, + object: Object, + source: Object + ) => any | void, + objects: Array + ): Object; + at(paths: Array): (object: Object) => Array; + at(paths: Array, object: Object): Array; + props(paths: Array): (object: Object) => Array; + props(paths: Array, object: Object): Array; + paths(paths: Array): (object: Object) => Array; + paths(paths: Array, object: Object): Array; + create(prototype: T): $Supertype; + defaults(source: Object): (object: Object) => Object; + defaults(source: Object, object: Object): Object; + defaultsAll(objects: Array): Object; + defaultsDeep(source: Object): (object: Object) => Object; + defaultsDeep(source: Object, object: Object): Object; + defaultsDeepAll(objects: Array): Object; + // alias for _.toPairs + entries(object: Object): Array<[string, any]>; + // alias for _.toPairsIn + entriesIn(object: Object): Array<[string, any]>; + // alias for _.assignIn + extend(a: A): (b: B) => A & B; + extend(a: A, b: B): A & B; + // alias for _.assignInWith + extendWith( + customizer: ( + objValue: any, + srcValue: any, + key: string, + object: T, + source: A + ) => any | void + ): ((object: T) => (s1: A) => Object) & ((object: T, s1: A) => Object); + extendWith( + customizer: ( + objValue: any, + srcValue: any, + key: string, + object: T, + source: A + ) => any | void, + object: T + ): (s1: A) => Object; + extendWith( + customizer: ( + objValue: any, + srcValue: any, + key: string, + object: T, + source: A + ) => any | void, + object: T, + s1: A + ): Object; + findKey( + predicate: OPredicate + ): (object: T) => string | void; + findKey( + predicate: OPredicate, + object: T + ): string | void; + findLastKey( + predicate: OPredicate + ): (object: T) => string | void; + findLastKey( + predicate: OPredicate, + object: T + ): string | void; + forIn(iteratee: OIteratee<*>): (object: Object) => Object; + forIn(iteratee: OIteratee<*>, object: Object): Object; + forInRight(iteratee: OIteratee<*>): (object: Object) => Object; + forInRight(iteratee: OIteratee<*>, object: Object): Object; + forOwn(iteratee: OIteratee<*>): (object: Object) => Object; + forOwn(iteratee: OIteratee<*>, object: Object): Object; + forOwnRight(iteratee: OIteratee<*>): (object: Object) => Object; + forOwnRight(iteratee: OIteratee<*>, object: Object): Object; + functions(object: Object): Array; + functionsIn(object: Object): Array; + get(path: Array | string): (object: Object | Array) => any; + get(path: Array | string, object: Object | Array): any; + prop(path: Array | string): (object: Object | Array) => any; + prop(path: Array | string, object: Object | Array): any; + path(path: Array | string): (object: Object | Array) => any; + path(path: Array | string, object: Object | Array): any; + getOr( + defaultValue: any + ): (( + path: Array | string + ) => (object: Object | Array) => any) & + ((path: Array | string, object: Object | Array) => any); + getOr( + defaultValue: any, + path: Array | string + ): (object: Object | Array) => any; + getOr( + defaultValue: any, + path: Array | string, + object: Object | Array + ): any; + propOr( + defaultValue: any + ): (( + path: Array | string + ) => (object: Object | Array) => any) & + ((path: Array | string, object: Object | Array) => any); + propOr( + defaultValue: any, + path: Array | string + ): (object: Object | Array) => any; + propOr( + defaultValue: any, + path: Array | string, + object: Object | Array + ): any; + pathOr( + defaultValue: any + ): (( + path: Array | string + ) => (object: Object | Array) => any) & + ((path: Array | string, object: Object | Array) => any); + pathOr( + defaultValue: any, + path: Array | string + ): (object: Object | Array) => any; + pathOr( + defaultValue: any, + path: Array | string, + object: Object | Array + ): any; + has(path: Array | string): (object: Object) => boolean; + has(path: Array | string, object: Object): boolean; + hasIn(path: Array | string): (object: Object) => boolean; + hasIn(path: Array | string, object: Object): boolean; + invert(object: Object): Object; + invertObj(object: Object): Object; + invertBy(iteratee: Function): (object: Object) => Object; + invertBy(iteratee: Function, object: Object): Object; + invoke(path: Array | string): (object: Object) => any; + invoke(path: Array | string, object: Object): any; + invokeArgs( + path: Array | string + ): ((object: Object) => (args: Array) => any) & + ((object: Object, args: Array) => any); + invokeArgs( + path: Array | string, + object: Object + ): (args: Array) => any; + invokeArgs( + path: Array | string, + object: Object, + args: Array + ): any; + keys(object: { [key: K]: any }): Array; + keys(object: Object): Array; + keysIn(object: Object): Array; + mapKeys(iteratee: OIteratee<*>): (object: Object) => Object; + mapKeys(iteratee: OIteratee<*>, object: Object): Object; + mapValues(iteratee: OIteratee<*>): (object: Object) => Object; + mapValues(iteratee: OIteratee<*>, object: Object): Object; + merge(object: Object): (source: Object) => Object; + merge(object: Object, source: Object): Object; + mergeAll(objects: Array): Object; + mergeWith( + customizer: ( + objValue: any, + srcValue: any, + key: string, + object: T, + source: A | B + ) => any | void + ): ((object: T) => (s1: A) => Object) & ((object: T, s1: A) => Object); + mergeWith( + customizer: ( + objValue: any, + srcValue: any, + key: string, + object: T, + source: A | B + ) => any | void, + object: T + ): (s1: A) => Object; + mergeWith( + customizer: ( + objValue: any, + srcValue: any, + key: string, + object: T, + source: A | B + ) => any | void, + object: T, + s1: A + ): Object; + mergeAllWith( + customizer: ( + objValue: any, + srcValue: any, + key: string, + object: Object, + source: Object + ) => any | void + ): (objects: Array) => Object; + mergeAllWith( + customizer: ( + objValue: any, + srcValue: any, + key: string, + object: Object, + source: Object + ) => any | void, + objects: Array + ): Object; + omit(props: Array): (object: Object) => Object; + omit(props: Array, object: Object): Object; + omitAll(props: Array): (object: Object) => Object; + omitAll(props: Array, object: Object): Object; + omitBy( + predicate: OPredicate + ): (object: T) => Object; + omitBy(predicate: OPredicate, object: T): Object; + pick(props: Array): (object: Object) => Object; + pick(props: Array, object: Object): Object; + pickAll(props: Array): (object: Object) => Object; + pickAll(props: Array, object: Object): Object; + pickBy( + predicate: OPredicate + ): (object: T) => Object; + pickBy(predicate: OPredicate, object: T): Object; + result(path: Array | string): (object: Object) => any; + result(path: Array | string, object: Object): any; + set( + path: Array | string + ): ((value: any) => (object: Object) => Object) & + ((value: any, object: Object) => Object); + set(path: Array | string, value: any): (object: Object) => Object; + set(path: Array | string, value: any, object: Object): Object; + assoc( + path: Array | string + ): ((value: any) => (object: Object) => Object) & + ((value: any, object: Object) => Object); + assoc(path: Array | string, value: any): (object: Object) => Object; + assoc(path: Array | string, value: any, object: Object): Object; + assocPath( + path: Array | string + ): ((value: any) => (object: Object) => Object) & + ((value: any, object: Object) => Object); + assocPath( + path: Array | string, + value: any + ): (object: Object) => Object; + assocPath(path: Array | string, value: any, object: Object): Object; + setWith( + customizer: (nsValue: any, key: string, nsObject: T) => any + ): (( + path: Array | string + ) => ((value: any) => (object: T) => Object) & + ((value: any, object: T) => Object)) & + ((path: Array | string, value: any) => (object: T) => Object) & + ((path: Array | string, value: any, object: T) => Object); + setWith( + customizer: (nsValue: any, key: string, nsObject: T) => any, + path: Array | string + ): ((value: any) => (object: T) => Object) & + ((value: any, object: T) => Object); + setWith( + customizer: (nsValue: any, key: string, nsObject: T) => any, + path: Array | string, + value: any + ): (object: T) => Object; + setWith( + customizer: (nsValue: any, key: string, nsObject: T) => any, + path: Array | string, + value: any, + object: T + ): Object; + toPairs(object: Object | Array<*>): Array<[string, any]>; + toPairsIn(object: Object): Array<[string, any]>; + transform( + iteratee: OIteratee<*> + ): ((accumulator: any) => (collection: Object | Array) => any) & + ((accumulator: any, collection: Object | Array) => any); + transform( + iteratee: OIteratee<*>, + accumulator: any + ): (collection: Object | Array) => any; + transform( + iteratee: OIteratee<*>, + accumulator: any, + collection: Object | Array + ): any; + unset(path: Array | string): (object: Object) => boolean; + unset(path: Array | string, object: Object): boolean; + dissoc(path: Array | string): (object: Object) => boolean; + dissoc(path: Array | string, object: Object): boolean; + dissocPath(path: Array | string): (object: Object) => boolean; + dissocPath(path: Array | string, object: Object): boolean; + update( + path: string[] | string + ): ((updater: Function) => (object: Object) => Object) & + ((updater: Function, object: Object) => Object); + update( + path: string[] | string, + updater: Function + ): (object: Object) => Object; + update(path: string[] | string, updater: Function, object: Object): Object; + updateWith( + customizer: Function + ): (( + path: string[] | string + ) => ((updater: Function) => (object: Object) => Object) & + ((updater: Function, object: Object) => Object)) & + (( + path: string[] | string, + updater: Function + ) => (object: Object) => Object) & + ((path: string[] | string, updater: Function, object: Object) => Object); + updateWith( + customizer: Function, + path: string[] | string + ): ((updater: Function) => (object: Object) => Object) & + ((updater: Function, object: Object) => Object); + updateWith( + customizer: Function, + path: string[] | string, + updater: Function + ): (object: Object) => Object; + updateWith( + customizer: Function, + path: string[] | string, + updater: Function, + object: Object + ): Object; + values(object: Object): Array; + valuesIn(object: Object): Array; + + tap(interceptor: (value: T) => any): (value: T) => T; + tap(interceptor: (value: T) => any, value: T): T; + thru(interceptor: (value: T1) => T2): (value: T1) => T2; + thru(interceptor: (value: T1) => T2, value: T1): T2; + + // String + camelCase(string: string): string; + capitalize(string: string): string; + deburr(string: string): string; + endsWith(target: string): (string: string) => boolean; + endsWith(target: string, string: string): boolean; + escape(string: string): string; + escapeRegExp(string: string): string; + kebabCase(string: string): string; + lowerCase(string: string): string; + lowerFirst(string: string): string; + pad(length: number): (string: string) => string; + pad(length: number, string: string): string; + padChars( + chars: string + ): ((length: number) => (string: string) => string) & + ((length: number, string: string) => string); + padChars(chars: string, length: number): (string: string) => string; + padChars(chars: string, length: number, string: string): string; + padEnd(length: number): (string: string) => string; + padEnd(length: number, string: string): string; + padCharsEnd( + chars: string + ): ((length: number) => (string: string) => string) & + ((length: number, string: string) => string); + padCharsEnd(chars: string, length: number): (string: string) => string; + padCharsEnd(chars: string, length: number, string: string): string; + padStart(length: number): (string: string) => string; + padStart(length: number, string: string): string; + padCharsStart( + chars: string + ): ((length: number) => (string: string) => string) & + ((length: number, string: string) => string); + padCharsStart(chars: string, length: number): (string: string) => string; + padCharsStart(chars: string, length: number, string: string): string; + parseInt(radix: number): (string: string) => number; + parseInt(radix: number, string: string): number; + repeat(n: number): (string: string) => string; + repeat(n: number, string: string): string; + replace( + pattern: RegExp | string + ): (( + replacement: ((string: string) => string) | string + ) => (string: string) => string) & + (( + replacement: ((string: string) => string) | string, + string: string + ) => string); + replace( + pattern: RegExp | string, + replacement: ((string: string) => string) | string + ): (string: string) => string; + replace( + pattern: RegExp | string, + replacement: ((string: string) => string) | string, + string: string + ): string; + snakeCase(string: string): string; + split(separator: RegExp | string): (string: string) => Array; + split(separator: RegExp | string, string: string): Array; + startCase(string: string): string; + startsWith(target: string): (string: string) => boolean; + startsWith(target: string, string: string): boolean; + template(string: string): Function; + toLower(string: string): string; + toUpper(string: string): string; + trim(string: string): string; + trimChars(chars: string): (string: string) => string; + trimChars(chars: string, string: string): string; + trimEnd(string: string): string; + trimCharsEnd(chars: string): (string: string) => string; + trimCharsEnd(chars: string, string: string): string; + trimStart(string: string): string; + trimCharsStart(chars: string): (string: string) => string; + trimCharsStart(chars: string, string: string): string; + truncate(options: TruncateOptions): (string: string) => string; + truncate(options: TruncateOptions, string: string): string; + unescape(string: string): string; + upperCase(string: string): string; + upperFirst(string: string): string; + words(string: string): Array; + + // Util + attempt(func: Function): any; + bindAll(methodNames: Array): (object: Object) => Object; + bindAll(methodNames: Array, object: Object): Object; + cond(pairs: NestedArray): Function; + constant(value: T): () => T; + always(value: T): () => T; + defaultTo( + defaultValue: T2 + ): (value: T1) => T1; + defaultTo( + defaultValue: T2, + value: T1 + ): T1; + // NaN is a number instead of its own type, otherwise it would behave like null/void + defaultTo(defaultValue: T2): (value: T1) => T1 | T2; + defaultTo(defaultValue: T2, value: T1): T1 | T2; + defaultTo(defaultValue: T2): (value: T1) => T2; + defaultTo(defaultValue: T2, value: T1): T2; + flow: $ComposeReverse; + flow(funcs: Array): Function; + pipe: $ComposeReverse; + pipe(funcs: Array): Function; + flowRight: $Compose; + flowRight(funcs: Array): Function; + compose: $Compose; + compose(funcs: Array): Function; + identity(value: T): T; + iteratee(func: any): Function; + matches(source: Object): (object: Object) => boolean; + matches(source: Object, object: Object): boolean; + matchesProperty(path: Array | string): (srcValue: any) => Function; + matchesProperty(path: Array | string, srcValue: any): Function; + propEq(path: Array | string): (srcValue: any) => Function; + propEq(path: Array | string, srcValue: any): Function; + pathEq(path: Array | string): (srcValue: any) => Function; + pathEq(path: Array | string, srcValue: any): Function; + method(path: Array | string): Function; + methodOf(object: Object): Function; + mixin( + object: T + ): ((source: Object) => (options: { chain: boolean }) => T) & + ((source: Object, options: { chain: boolean }) => T); + mixin( + object: T, + source: Object + ): (options: { chain: boolean }) => T; + mixin( + object: T, + source: Object, + options: { chain: boolean } + ): T; + noConflict(): Lodash; + noop(...args: Array): void; + nthArg(n: number): Function; + over(iteratees: Array): Function; + juxt(iteratees: Array): Function; + overEvery(predicates: Array): Function; + allPass(predicates: Array): Function; + overSome(predicates: Array): Function; + anyPass(predicates: Array): Function; + property( + path: Array | string + ): (object: Object | Array) => any; + property(path: Array | string, object: Object | Array): any; + propertyOf(object: Object): (path: Array | string) => Function; + propertyOf(object: Object, path: Array | string): Function; + range(start: number): (end: number) => Array; + range(start: number, end: number): Array; + rangeStep( + step: number + ): ((start: number) => (end: number) => Array) & + ((start: number, end: number) => Array); + rangeStep(step: number, start: number): (end: number) => Array; + rangeStep(step: number, start: number, end: number): Array; + rangeRight(start: number): (end: number) => Array; + rangeRight(start: number, end: number): Array; + rangeStepRight( + step: number + ): ((start: number) => (end: number) => Array) & + ((start: number, end: number) => Array); + rangeStepRight(step: number, start: number): (end: number) => Array; + rangeStepRight(step: number, start: number, end: number): Array; + runInContext(context: Object): Function; + + stubArray(): Array<*>; + stubFalse(): false; + F(): false; + stubObject(): {}; + stubString(): ""; + stubTrue(): true; + T(): true; + times(iteratee: (i: number) => T): (n: number) => Array; + times(iteratee: (i: number) => T, n: number): Array; + toPath(value: any): Array; + uniqueId(prefix: string): string; + + __: any; + placeholder: any; + + convert(options: { + cap?: boolean, + curry?: boolean, + fixed?: boolean, + immutable?: boolean, + rearg?: boolean + }): void; + + // Properties + VERSION: string; + templateSettings: TemplateSettings; + } + + declare module.exports: Lodash; +} + +declare module "lodash/chunk" { + declare module.exports: $PropertyType<$Exports<"lodash">, "chunk">; +} + +declare module "lodash/compact" { + declare module.exports: $PropertyType<$Exports<"lodash">, "compact">; +} + +declare module "lodash/concat" { + declare module.exports: $PropertyType<$Exports<"lodash">, "concat">; +} + +declare module "lodash/difference" { + declare module.exports: $PropertyType<$Exports<"lodash">, "difference">; +} + +declare module "lodash/differenceBy" { + declare module.exports: $PropertyType<$Exports<"lodash">, "differenceBy">; +} + +declare module "lodash/differenceWith" { + declare module.exports: $PropertyType<$Exports<"lodash">, "differenceWith">; +} + +declare module "lodash/drop" { + declare module.exports: $PropertyType<$Exports<"lodash">, "drop">; +} + +declare module "lodash/dropRight" { + declare module.exports: $PropertyType<$Exports<"lodash">, "dropRight">; +} + +declare module "lodash/dropRightWhile" { + declare module.exports: $PropertyType<$Exports<"lodash">, "dropRightWhile">; +} + +declare module "lodash/dropWhile" { + declare module.exports: $PropertyType<$Exports<"lodash">, "dropWhile">; +} + +declare module "lodash/fill" { + declare module.exports: $PropertyType<$Exports<"lodash">, "fill">; +} + +declare module "lodash/findIndex" { + declare module.exports: $PropertyType<$Exports<"lodash">, "findIndex">; +} + +declare module "lodash/findLastIndex" { + declare module.exports: $PropertyType<$Exports<"lodash">, "findLastIndex">; +} + +declare module "lodash/first" { + declare module.exports: $PropertyType<$Exports<"lodash">, "first">; +} + +declare module "lodash/flatten" { + declare module.exports: $PropertyType<$Exports<"lodash">, "flatten">; +} + +declare module "lodash/flattenDeep" { + declare module.exports: $PropertyType<$Exports<"lodash">, "flattenDeep">; +} + +declare module "lodash/flattenDepth" { + declare module.exports: $PropertyType<$Exports<"lodash">, "flattenDepth">; +} + +declare module "lodash/fromPairs" { + declare module.exports: $PropertyType<$Exports<"lodash">, "fromPairs">; +} + +declare module "lodash/head" { + declare module.exports: $PropertyType<$Exports<"lodash">, "head">; +} + +declare module "lodash/indexOf" { + declare module.exports: $PropertyType<$Exports<"lodash">, "indexOf">; +} + +declare module "lodash/initial" { + declare module.exports: $PropertyType<$Exports<"lodash">, "initial">; +} + +declare module "lodash/intersection" { + declare module.exports: $PropertyType<$Exports<"lodash">, "intersection">; +} + +declare module "lodash/intersectionBy" { + declare module.exports: $PropertyType<$Exports<"lodash">, "intersectionBy">; +} + +declare module "lodash/intersectionWith" { + declare module.exports: $PropertyType<$Exports<"lodash">, "intersectionWith">; +} + +declare module "lodash/join" { + declare module.exports: $PropertyType<$Exports<"lodash">, "join">; +} + +declare module "lodash/last" { + declare module.exports: $PropertyType<$Exports<"lodash">, "last">; +} + +declare module "lodash/lastIndexOf" { + declare module.exports: $PropertyType<$Exports<"lodash">, "lastIndexOf">; +} + +declare module "lodash/nth" { + declare module.exports: $PropertyType<$Exports<"lodash">, "nth">; +} + +declare module "lodash/pull" { + declare module.exports: $PropertyType<$Exports<"lodash">, "pull">; +} + +declare module "lodash/pullAll" { + declare module.exports: $PropertyType<$Exports<"lodash">, "pullAll">; +} + +declare module "lodash/pullAllBy" { + declare module.exports: $PropertyType<$Exports<"lodash">, "pullAllBy">; +} + +declare module "lodash/pullAllWith" { + declare module.exports: $PropertyType<$Exports<"lodash">, "pullAllWith">; +} + +declare module "lodash/pullAt" { + declare module.exports: $PropertyType<$Exports<"lodash">, "pullAt">; +} + +declare module "lodash/remove" { + declare module.exports: $PropertyType<$Exports<"lodash">, "remove">; +} + +declare module "lodash/reverse" { + declare module.exports: $PropertyType<$Exports<"lodash">, "reverse">; +} + +declare module "lodash/slice" { + declare module.exports: $PropertyType<$Exports<"lodash">, "slice">; +} + +declare module "lodash/sortedIndex" { + declare module.exports: $PropertyType<$Exports<"lodash">, "sortedIndex">; +} + +declare module "lodash/sortedIndexBy" { + declare module.exports: $PropertyType<$Exports<"lodash">, "sortedIndexBy">; +} + +declare module "lodash/sortedIndexOf" { + declare module.exports: $PropertyType<$Exports<"lodash">, "sortedIndexOf">; +} + +declare module "lodash/sortedLastIndex" { + declare module.exports: $PropertyType<$Exports<"lodash">, "sortedLastIndex">; +} + +declare module "lodash/sortedLastIndexBy" { + declare module.exports: $PropertyType< + $Exports<"lodash">, + "sortedLastIndexBy" + >; +} + +declare module "lodash/sortedLastIndexOf" { + declare module.exports: $PropertyType< + $Exports<"lodash">, + "sortedLastIndexOf" + >; +} + +declare module "lodash/sortedUniq" { + declare module.exports: $PropertyType<$Exports<"lodash">, "sortedUniq">; +} + +declare module "lodash/sortedUniqBy" { + declare module.exports: $PropertyType<$Exports<"lodash">, "sortedUniqBy">; +} + +declare module "lodash/tail" { + declare module.exports: $PropertyType<$Exports<"lodash">, "tail">; +} + +declare module "lodash/take" { + declare module.exports: $PropertyType<$Exports<"lodash">, "take">; +} + +declare module "lodash/takeRight" { + declare module.exports: $PropertyType<$Exports<"lodash">, "takeRight">; +} + +declare module "lodash/takeRightWhile" { + declare module.exports: $PropertyType<$Exports<"lodash">, "takeRightWhile">; +} + +declare module "lodash/takeWhile" { + declare module.exports: $PropertyType<$Exports<"lodash">, "takeWhile">; +} + +declare module "lodash/union" { + declare module.exports: $PropertyType<$Exports<"lodash">, "union">; +} + +declare module "lodash/unionBy" { + declare module.exports: $PropertyType<$Exports<"lodash">, "unionBy">; +} + +declare module "lodash/unionWith" { + declare module.exports: $PropertyType<$Exports<"lodash">, "unionWith">; +} + +declare module "lodash/uniq" { + declare module.exports: $PropertyType<$Exports<"lodash">, "uniq">; +} + +declare module "lodash/uniqBy" { + declare module.exports: $PropertyType<$Exports<"lodash">, "uniqBy">; +} + +declare module "lodash/uniqWith" { + declare module.exports: $PropertyType<$Exports<"lodash">, "uniqWith">; +} + +declare module "lodash/unzip" { + declare module.exports: $PropertyType<$Exports<"lodash">, "unzip">; +} + +declare module "lodash/unzipWith" { + declare module.exports: $PropertyType<$Exports<"lodash">, "unzipWith">; +} + +declare module "lodash/without" { + declare module.exports: $PropertyType<$Exports<"lodash">, "without">; +} + +declare module "lodash/xor" { + declare module.exports: $PropertyType<$Exports<"lodash">, "xor">; +} + +declare module "lodash/xorBy" { + declare module.exports: $PropertyType<$Exports<"lodash">, "xorBy">; +} + +declare module "lodash/xorWith" { + declare module.exports: $PropertyType<$Exports<"lodash">, "xorWith">; +} + +declare module "lodash/zip" { + declare module.exports: $PropertyType<$Exports<"lodash">, "zip">; +} + +declare module "lodash/zipObject" { + declare module.exports: $PropertyType<$Exports<"lodash">, "zipObject">; +} + +declare module "lodash/zipObjectDeep" { + declare module.exports: $PropertyType<$Exports<"lodash">, "zipObjectDeep">; +} + +declare module "lodash/zipWith" { + declare module.exports: $PropertyType<$Exports<"lodash">, "zipWith">; +} + +declare module "lodash/countBy" { + declare module.exports: $PropertyType<$Exports<"lodash">, "countBy">; +} + +declare module "lodash/each" { + declare module.exports: $PropertyType<$Exports<"lodash">, "each">; +} + +declare module "lodash/eachRight" { + declare module.exports: $PropertyType<$Exports<"lodash">, "eachRight">; +} + +declare module "lodash/every" { + declare module.exports: $PropertyType<$Exports<"lodash">, "every">; +} + +declare module "lodash/filter" { + declare module.exports: $PropertyType<$Exports<"lodash">, "filter">; +} + +declare module "lodash/find" { + declare module.exports: $PropertyType<$Exports<"lodash">, "find">; +} + +declare module "lodash/findLast" { + declare module.exports: $PropertyType<$Exports<"lodash">, "findLast">; +} + +declare module "lodash/flatMap" { + declare module.exports: $PropertyType<$Exports<"lodash">, "flatMap">; +} + +declare module "lodash/flatMapDeep" { + declare module.exports: $PropertyType<$Exports<"lodash">, "flatMapDeep">; +} + +declare module "lodash/flatMapDepth" { + declare module.exports: $PropertyType<$Exports<"lodash">, "flatMapDepth">; +} + +declare module "lodash/forEach" { + declare module.exports: $PropertyType<$Exports<"lodash">, "forEach">; +} + +declare module "lodash/forEachRight" { + declare module.exports: $PropertyType<$Exports<"lodash">, "forEachRight">; +} + +declare module "lodash/groupBy" { + declare module.exports: $PropertyType<$Exports<"lodash">, "groupBy">; +} + +declare module "lodash/includes" { + declare module.exports: $PropertyType<$Exports<"lodash">, "includes">; +} + +declare module "lodash/invokeMap" { + declare module.exports: $PropertyType<$Exports<"lodash">, "invokeMap">; +} + +declare module "lodash/keyBy" { + declare module.exports: $PropertyType<$Exports<"lodash">, "keyBy">; +} + +declare module "lodash/map" { + declare module.exports: $PropertyType<$Exports<"lodash">, "map">; +} + +declare module "lodash/orderBy" { + declare module.exports: $PropertyType<$Exports<"lodash">, "orderBy">; +} + +declare module "lodash/partition" { + declare module.exports: $PropertyType<$Exports<"lodash">, "partition">; +} + +declare module "lodash/reduce" { + declare module.exports: $PropertyType<$Exports<"lodash">, "reduce">; +} + +declare module "lodash/reduceRight" { + declare module.exports: $PropertyType<$Exports<"lodash">, "reduceRight">; +} + +declare module "lodash/reject" { + declare module.exports: $PropertyType<$Exports<"lodash">, "reject">; +} + +declare module "lodash/sample" { + declare module.exports: $PropertyType<$Exports<"lodash">, "sample">; +} + +declare module "lodash/sampleSize" { + declare module.exports: $PropertyType<$Exports<"lodash">, "sampleSize">; +} + +declare module "lodash/shuffle" { + declare module.exports: $PropertyType<$Exports<"lodash">, "shuffle">; +} + +declare module "lodash/size" { + declare module.exports: $PropertyType<$Exports<"lodash">, "size">; +} + +declare module "lodash/some" { + declare module.exports: $PropertyType<$Exports<"lodash">, "some">; +} + +declare module "lodash/sortBy" { + declare module.exports: $PropertyType<$Exports<"lodash">, "sortBy">; +} + +declare module "lodash/now" { + declare module.exports: $PropertyType<$Exports<"lodash">, "now">; +} + +declare module "lodash/after" { + declare module.exports: $PropertyType<$Exports<"lodash">, "after">; +} + +declare module "lodash/ary" { + declare module.exports: $PropertyType<$Exports<"lodash">, "ary">; +} + +declare module "lodash/before" { + declare module.exports: $PropertyType<$Exports<"lodash">, "before">; +} + +declare module "lodash/bind" { + declare module.exports: $PropertyType<$Exports<"lodash">, "bind">; +} + +declare module "lodash/bindKey" { + declare module.exports: $PropertyType<$Exports<"lodash">, "bindKey">; +} + +declare module "lodash/curry" { + declare module.exports: $PropertyType<$Exports<"lodash">, "curry">; +} + +declare module "lodash/curryRight" { + declare module.exports: $PropertyType<$Exports<"lodash">, "curryRight">; +} + +declare module "lodash/debounce" { + declare module.exports: $PropertyType<$Exports<"lodash">, "debounce">; +} + +declare module "lodash/defer" { + declare module.exports: $PropertyType<$Exports<"lodash">, "defer">; +} + +declare module "lodash/delay" { + declare module.exports: $PropertyType<$Exports<"lodash">, "delay">; +} + +declare module "lodash/flip" { + declare module.exports: $PropertyType<$Exports<"lodash">, "flip">; +} + +declare module "lodash/memoize" { + declare module.exports: $PropertyType<$Exports<"lodash">, "memoize">; +} + +declare module "lodash/negate" { + declare module.exports: $PropertyType<$Exports<"lodash">, "negate">; +} + +declare module "lodash/once" { + declare module.exports: $PropertyType<$Exports<"lodash">, "once">; +} + +declare module "lodash/overArgs" { + declare module.exports: $PropertyType<$Exports<"lodash">, "overArgs">; +} + +declare module "lodash/partial" { + declare module.exports: $PropertyType<$Exports<"lodash">, "partial">; +} + +declare module "lodash/partialRight" { + declare module.exports: $PropertyType<$Exports<"lodash">, "partialRight">; +} + +declare module "lodash/rearg" { + declare module.exports: $PropertyType<$Exports<"lodash">, "rearg">; +} + +declare module "lodash/rest" { + declare module.exports: $PropertyType<$Exports<"lodash">, "rest">; +} + +declare module "lodash/spread" { + declare module.exports: $PropertyType<$Exports<"lodash">, "spread">; +} + +declare module "lodash/throttle" { + declare module.exports: $PropertyType<$Exports<"lodash">, "throttle">; +} + +declare module "lodash/unary" { + declare module.exports: $PropertyType<$Exports<"lodash">, "unary">; +} + +declare module "lodash/wrap" { + declare module.exports: $PropertyType<$Exports<"lodash">, "wrap">; +} + +declare module "lodash/castArray" { + declare module.exports: $PropertyType<$Exports<"lodash">, "castArray">; +} + +declare module "lodash/clone" { + declare module.exports: $PropertyType<$Exports<"lodash">, "clone">; +} + +declare module "lodash/cloneDeep" { + declare module.exports: $PropertyType<$Exports<"lodash">, "cloneDeep">; +} + +declare module "lodash/cloneDeepWith" { + declare module.exports: $PropertyType<$Exports<"lodash">, "cloneDeepWith">; +} + +declare module "lodash/cloneWith" { + declare module.exports: $PropertyType<$Exports<"lodash">, "cloneWith">; +} + +declare module "lodash/conformsTo" { + declare module.exports: $PropertyType<$Exports<"lodash">, "conformsTo">; +} + +declare module "lodash/eq" { + declare module.exports: $PropertyType<$Exports<"lodash">, "eq">; +} + +declare module "lodash/gt" { + declare module.exports: $PropertyType<$Exports<"lodash">, "gt">; +} + +declare module "lodash/gte" { + declare module.exports: $PropertyType<$Exports<"lodash">, "gte">; +} + +declare module "lodash/isArguments" { + declare module.exports: $PropertyType<$Exports<"lodash">, "isArguments">; +} + +declare module "lodash/isArray" { + declare module.exports: $PropertyType<$Exports<"lodash">, "isArray">; +} + +declare module "lodash/isArrayBuffer" { + declare module.exports: $PropertyType<$Exports<"lodash">, "isArrayBuffer">; +} + +declare module "lodash/isArrayLike" { + declare module.exports: $PropertyType<$Exports<"lodash">, "isArrayLike">; +} + +declare module "lodash/isArrayLikeObject" { + declare module.exports: $PropertyType< + $Exports<"lodash">, + "isArrayLikeObject" + >; +} + +declare module "lodash/isBoolean" { + declare module.exports: $PropertyType<$Exports<"lodash">, "isBoolean">; +} + +declare module "lodash/isBuffer" { + declare module.exports: $PropertyType<$Exports<"lodash">, "isBuffer">; +} + +declare module "lodash/isDate" { + declare module.exports: $PropertyType<$Exports<"lodash">, "isDate">; +} + +declare module "lodash/isElement" { + declare module.exports: $PropertyType<$Exports<"lodash">, "isElement">; +} + +declare module "lodash/isEmpty" { + declare module.exports: $PropertyType<$Exports<"lodash">, "isEmpty">; +} + +declare module "lodash/isEqual" { + declare module.exports: $PropertyType<$Exports<"lodash">, "isEqual">; +} + +declare module "lodash/isEqualWith" { + declare module.exports: $PropertyType<$Exports<"lodash">, "isEqualWith">; +} + +declare module "lodash/isError" { + declare module.exports: $PropertyType<$Exports<"lodash">, "isError">; +} + +declare module "lodash/isFinite" { + declare module.exports: $PropertyType<$Exports<"lodash">, "isFinite">; +} + +declare module "lodash/isFunction" { + declare module.exports: $PropertyType<$Exports<"lodash">, "isFunction">; +} + +declare module "lodash/isInteger" { + declare module.exports: $PropertyType<$Exports<"lodash">, "isInteger">; +} + +declare module "lodash/isLength" { + declare module.exports: $PropertyType<$Exports<"lodash">, "isLength">; +} + +declare module "lodash/isMap" { + declare module.exports: $PropertyType<$Exports<"lodash">, "isMap">; +} + +declare module "lodash/isMatch" { + declare module.exports: $PropertyType<$Exports<"lodash">, "isMatch">; +} + +declare module "lodash/isMatchWith" { + declare module.exports: $PropertyType<$Exports<"lodash">, "isMatchWith">; +} + +declare module "lodash/isNaN" { + declare module.exports: $PropertyType<$Exports<"lodash">, "isNaN">; +} + +declare module "lodash/isNative" { + declare module.exports: $PropertyType<$Exports<"lodash">, "isNative">; +} + +declare module "lodash/isNil" { + declare module.exports: $PropertyType<$Exports<"lodash">, "isNil">; +} + +declare module "lodash/isNull" { + declare module.exports: $PropertyType<$Exports<"lodash">, "isNull">; +} + +declare module "lodash/isNumber" { + declare module.exports: $PropertyType<$Exports<"lodash">, "isNumber">; +} + +declare module "lodash/isObject" { + declare module.exports: $PropertyType<$Exports<"lodash">, "isObject">; +} + +declare module "lodash/isObjectLike" { + declare module.exports: $PropertyType<$Exports<"lodash">, "isObjectLike">; +} + +declare module "lodash/isPlainObject" { + declare module.exports: $PropertyType<$Exports<"lodash">, "isPlainObject">; +} + +declare module "lodash/isRegExp" { + declare module.exports: $PropertyType<$Exports<"lodash">, "isRegExp">; +} + +declare module "lodash/isSafeInteger" { + declare module.exports: $PropertyType<$Exports<"lodash">, "isSafeInteger">; +} + +declare module "lodash/isSet" { + declare module.exports: $PropertyType<$Exports<"lodash">, "isSet">; +} + +declare module "lodash/isString" { + declare module.exports: $PropertyType<$Exports<"lodash">, "isString">; +} + +declare module "lodash/isSymbol" { + declare module.exports: $PropertyType<$Exports<"lodash">, "isSymbol">; +} + +declare module "lodash/isTypedArray" { + declare module.exports: $PropertyType<$Exports<"lodash">, "isTypedArray">; +} + +declare module "lodash/isUndefined" { + declare module.exports: $PropertyType<$Exports<"lodash">, "isUndefined">; +} + +declare module "lodash/isWeakMap" { + declare module.exports: $PropertyType<$Exports<"lodash">, "isWeakMap">; +} + +declare module "lodash/isWeakSet" { + declare module.exports: $PropertyType<$Exports<"lodash">, "isWeakSet">; +} + +declare module "lodash/lt" { + declare module.exports: $PropertyType<$Exports<"lodash">, "lt">; +} + +declare module "lodash/lte" { + declare module.exports: $PropertyType<$Exports<"lodash">, "lte">; +} + +declare module "lodash/toArray" { + declare module.exports: $PropertyType<$Exports<"lodash">, "toArray">; +} + +declare module "lodash/toFinite" { + declare module.exports: $PropertyType<$Exports<"lodash">, "toFinite">; +} + +declare module "lodash/toInteger" { + declare module.exports: $PropertyType<$Exports<"lodash">, "toInteger">; +} + +declare module "lodash/toLength" { + declare module.exports: $PropertyType<$Exports<"lodash">, "toLength">; +} + +declare module "lodash/toNumber" { + declare module.exports: $PropertyType<$Exports<"lodash">, "toNumber">; +} + +declare module "lodash/toPlainObject" { + declare module.exports: $PropertyType<$Exports<"lodash">, "toPlainObject">; +} + +declare module "lodash/toSafeInteger" { + declare module.exports: $PropertyType<$Exports<"lodash">, "toSafeInteger">; +} + +declare module "lodash/toString" { + declare module.exports: $PropertyType<$Exports<"lodash">, "toString">; +} + +declare module "lodash/add" { + declare module.exports: $PropertyType<$Exports<"lodash">, "add">; +} + +declare module "lodash/ceil" { + declare module.exports: $PropertyType<$Exports<"lodash">, "ceil">; +} + +declare module "lodash/divide" { + declare module.exports: $PropertyType<$Exports<"lodash">, "divide">; +} + +declare module "lodash/floor" { + declare module.exports: $PropertyType<$Exports<"lodash">, "floor">; +} + +declare module "lodash/max" { + declare module.exports: $PropertyType<$Exports<"lodash">, "max">; +} + +declare module "lodash/maxBy" { + declare module.exports: $PropertyType<$Exports<"lodash">, "maxBy">; +} + +declare module "lodash/mean" { + declare module.exports: $PropertyType<$Exports<"lodash">, "mean">; +} + +declare module "lodash/meanBy" { + declare module.exports: $PropertyType<$Exports<"lodash">, "meanBy">; +} + +declare module "lodash/min" { + declare module.exports: $PropertyType<$Exports<"lodash">, "min">; +} + +declare module "lodash/minBy" { + declare module.exports: $PropertyType<$Exports<"lodash">, "minBy">; +} + +declare module "lodash/multiply" { + declare module.exports: $PropertyType<$Exports<"lodash">, "multiply">; +} + +declare module "lodash/round" { + declare module.exports: $PropertyType<$Exports<"lodash">, "round">; +} + +declare module "lodash/subtract" { + declare module.exports: $PropertyType<$Exports<"lodash">, "subtract">; +} + +declare module "lodash/sum" { + declare module.exports: $PropertyType<$Exports<"lodash">, "sum">; +} + +declare module "lodash/sumBy" { + declare module.exports: $PropertyType<$Exports<"lodash">, "sumBy">; +} + +declare module "lodash/clamp" { + declare module.exports: $PropertyType<$Exports<"lodash">, "clamp">; +} + +declare module "lodash/inRange" { + declare module.exports: $PropertyType<$Exports<"lodash">, "inRange">; +} + +declare module "lodash/random" { + declare module.exports: $PropertyType<$Exports<"lodash">, "random">; +} + +declare module "lodash/assign" { + declare module.exports: $PropertyType<$Exports<"lodash">, "assign">; +} + +declare module "lodash/assignIn" { + declare module.exports: $PropertyType<$Exports<"lodash">, "assignIn">; +} + +declare module "lodash/assignInWith" { + declare module.exports: $PropertyType<$Exports<"lodash">, "assignInWith">; +} + +declare module "lodash/assignWith" { + declare module.exports: $PropertyType<$Exports<"lodash">, "assignWith">; +} + +declare module "lodash/at" { + declare module.exports: $PropertyType<$Exports<"lodash">, "at">; +} + +declare module "lodash/create" { + declare module.exports: $PropertyType<$Exports<"lodash">, "create">; +} + +declare module "lodash/defaults" { + declare module.exports: $PropertyType<$Exports<"lodash">, "defaults">; +} + +declare module "lodash/defaultsDeep" { + declare module.exports: $PropertyType<$Exports<"lodash">, "defaultsDeep">; +} + +declare module "lodash/entries" { + declare module.exports: $PropertyType<$Exports<"lodash">, "entries">; +} + +declare module "lodash/entriesIn" { + declare module.exports: $PropertyType<$Exports<"lodash">, "entriesIn">; +} + +declare module "lodash/extend" { + declare module.exports: $PropertyType<$Exports<"lodash">, "extend">; +} + +declare module "lodash/extendWith" { + declare module.exports: $PropertyType<$Exports<"lodash">, "extendWith">; +} + +declare module "lodash/findKey" { + declare module.exports: $PropertyType<$Exports<"lodash">, "findKey">; +} + +declare module "lodash/findLastKey" { + declare module.exports: $PropertyType<$Exports<"lodash">, "findLastKey">; +} + +declare module "lodash/forIn" { + declare module.exports: $PropertyType<$Exports<"lodash">, "forIn">; +} + +declare module "lodash/forInRight" { + declare module.exports: $PropertyType<$Exports<"lodash">, "forInRight">; +} + +declare module "lodash/forOwn" { + declare module.exports: $PropertyType<$Exports<"lodash">, "forOwn">; +} + +declare module "lodash/forOwnRight" { + declare module.exports: $PropertyType<$Exports<"lodash">, "forOwnRight">; +} + +declare module "lodash/functions" { + declare module.exports: $PropertyType<$Exports<"lodash">, "functions">; +} + +declare module "lodash/functionsIn" { + declare module.exports: $PropertyType<$Exports<"lodash">, "functionsIn">; +} + +declare module "lodash/get" { + declare module.exports: $PropertyType<$Exports<"lodash">, "get">; +} + +declare module "lodash/has" { + declare module.exports: $PropertyType<$Exports<"lodash">, "has">; +} + +declare module "lodash/hasIn" { + declare module.exports: $PropertyType<$Exports<"lodash">, "hasIn">; +} + +declare module "lodash/invert" { + declare module.exports: $PropertyType<$Exports<"lodash">, "invert">; +} + +declare module "lodash/invertBy" { + declare module.exports: $PropertyType<$Exports<"lodash">, "invertBy">; +} + +declare module "lodash/invoke" { + declare module.exports: $PropertyType<$Exports<"lodash">, "invoke">; +} + +declare module "lodash/keys" { + declare module.exports: $PropertyType<$Exports<"lodash">, "keys">; +} + +declare module "lodash/keysIn" { + declare module.exports: $PropertyType<$Exports<"lodash">, "keysIn">; +} + +declare module "lodash/mapKeys" { + declare module.exports: $PropertyType<$Exports<"lodash">, "mapKeys">; +} + +declare module "lodash/mapValues" { + declare module.exports: $PropertyType<$Exports<"lodash">, "mapValues">; +} + +declare module "lodash/merge" { + declare module.exports: $PropertyType<$Exports<"lodash">, "merge">; +} + +declare module "lodash/mergeWith" { + declare module.exports: $PropertyType<$Exports<"lodash">, "mergeWith">; +} + +declare module "lodash/omit" { + declare module.exports: $PropertyType<$Exports<"lodash">, "omit">; +} + +declare module "lodash/omitBy" { + declare module.exports: $PropertyType<$Exports<"lodash">, "omitBy">; +} + +declare module "lodash/pick" { + declare module.exports: $PropertyType<$Exports<"lodash">, "pick">; +} + +declare module "lodash/pickBy" { + declare module.exports: $PropertyType<$Exports<"lodash">, "pickBy">; +} + +declare module "lodash/result" { + declare module.exports: $PropertyType<$Exports<"lodash">, "result">; +} + +declare module "lodash/set" { + declare module.exports: $PropertyType<$Exports<"lodash">, "set">; +} + +declare module "lodash/setWith" { + declare module.exports: $PropertyType<$Exports<"lodash">, "setWith">; +} + +declare module "lodash/toPairs" { + declare module.exports: $PropertyType<$Exports<"lodash">, "toPairs">; +} + +declare module "lodash/toPairsIn" { + declare module.exports: $PropertyType<$Exports<"lodash">, "toPairsIn">; +} + +declare module "lodash/transform" { + declare module.exports: $PropertyType<$Exports<"lodash">, "transform">; +} + +declare module "lodash/unset" { + declare module.exports: $PropertyType<$Exports<"lodash">, "unset">; +} + +declare module "lodash/update" { + declare module.exports: $PropertyType<$Exports<"lodash">, "update">; +} + +declare module "lodash/updateWith" { + declare module.exports: $PropertyType<$Exports<"lodash">, "updateWith">; +} + +declare module "lodash/values" { + declare module.exports: $PropertyType<$Exports<"lodash">, "values">; +} + +declare module "lodash/valuesIn" { + declare module.exports: $PropertyType<$Exports<"lodash">, "valuesIn">; +} + +declare module "lodash/chain" { + declare module.exports: $PropertyType<$Exports<"lodash">, "chain">; +} + +declare module "lodash/tap" { + declare module.exports: $PropertyType<$Exports<"lodash">, "tap">; +} + +declare module "lodash/thru" { + declare module.exports: $PropertyType<$Exports<"lodash">, "thru">; +} + +declare module "lodash/camelCase" { + declare module.exports: $PropertyType<$Exports<"lodash">, "camelCase">; +} + +declare module "lodash/capitalize" { + declare module.exports: $PropertyType<$Exports<"lodash">, "capitalize">; +} + +declare module "lodash/deburr" { + declare module.exports: $PropertyType<$Exports<"lodash">, "deburr">; +} + +declare module "lodash/endsWith" { + declare module.exports: $PropertyType<$Exports<"lodash">, "endsWith">; +} + +declare module "lodash/escape" { + declare module.exports: $PropertyType<$Exports<"lodash">, "escape">; +} + +declare module "lodash/escapeRegExp" { + declare module.exports: $PropertyType<$Exports<"lodash">, "escapeRegExp">; +} + +declare module "lodash/kebabCase" { + declare module.exports: $PropertyType<$Exports<"lodash">, "kebabCase">; +} + +declare module "lodash/lowerCase" { + declare module.exports: $PropertyType<$Exports<"lodash">, "lowerCase">; +} + +declare module "lodash/lowerFirst" { + declare module.exports: $PropertyType<$Exports<"lodash">, "lowerFirst">; +} + +declare module "lodash/pad" { + declare module.exports: $PropertyType<$Exports<"lodash">, "pad">; +} + +declare module "lodash/padEnd" { + declare module.exports: $PropertyType<$Exports<"lodash">, "padEnd">; +} + +declare module "lodash/padStart" { + declare module.exports: $PropertyType<$Exports<"lodash">, "padStart">; +} + +declare module "lodash/parseInt" { + declare module.exports: $PropertyType<$Exports<"lodash">, "parseInt">; +} + +declare module "lodash/repeat" { + declare module.exports: $PropertyType<$Exports<"lodash">, "repeat">; +} + +declare module "lodash/replace" { + declare module.exports: $PropertyType<$Exports<"lodash">, "replace">; +} + +declare module "lodash/snakeCase" { + declare module.exports: $PropertyType<$Exports<"lodash">, "snakeCase">; +} + +declare module "lodash/split" { + declare module.exports: $PropertyType<$Exports<"lodash">, "split">; +} + +declare module "lodash/startCase" { + declare module.exports: $PropertyType<$Exports<"lodash">, "startCase">; +} + +declare module "lodash/startsWith" { + declare module.exports: $PropertyType<$Exports<"lodash">, "startsWith">; +} + +declare module "lodash/template" { + declare module.exports: $PropertyType<$Exports<"lodash">, "template">; +} + +declare module "lodash/toLower" { + declare module.exports: $PropertyType<$Exports<"lodash">, "toLower">; +} + +declare module "lodash/toUpper" { + declare module.exports: $PropertyType<$Exports<"lodash">, "toUpper">; +} + +declare module "lodash/trim" { + declare module.exports: $PropertyType<$Exports<"lodash">, "trim">; +} + +declare module "lodash/trimEnd" { + declare module.exports: $PropertyType<$Exports<"lodash">, "trimEnd">; +} + +declare module "lodash/trimStart" { + declare module.exports: $PropertyType<$Exports<"lodash">, "trimStart">; +} + +declare module "lodash/truncate" { + declare module.exports: $PropertyType<$Exports<"lodash">, "truncate">; +} + +declare module "lodash/unescape" { + declare module.exports: $PropertyType<$Exports<"lodash">, "unescape">; +} + +declare module "lodash/upperCase" { + declare module.exports: $PropertyType<$Exports<"lodash">, "upperCase">; +} + +declare module "lodash/upperFirst" { + declare module.exports: $PropertyType<$Exports<"lodash">, "upperFirst">; +} + +declare module "lodash/words" { + declare module.exports: $PropertyType<$Exports<"lodash">, "words">; +} + +declare module "lodash/attempt" { + declare module.exports: $PropertyType<$Exports<"lodash">, "attempt">; +} + +declare module "lodash/bindAll" { + declare module.exports: $PropertyType<$Exports<"lodash">, "bindAll">; +} + +declare module "lodash/cond" { + declare module.exports: $PropertyType<$Exports<"lodash">, "cond">; +} + +declare module "lodash/conforms" { + declare module.exports: $PropertyType<$Exports<"lodash">, "conforms">; +} + +declare module "lodash/constant" { + declare module.exports: $PropertyType<$Exports<"lodash">, "constant">; +} + +declare module "lodash/defaultTo" { + declare module.exports: $PropertyType<$Exports<"lodash">, "defaultTo">; +} + +declare module "lodash/flow" { + declare module.exports: $PropertyType<$Exports<"lodash">, "flow">; +} + +declare module "lodash/flowRight" { + declare module.exports: $PropertyType<$Exports<"lodash">, "flowRight">; +} + +declare module "lodash/identity" { + declare module.exports: $PropertyType<$Exports<"lodash">, "identity">; +} + +declare module "lodash/iteratee" { + declare module.exports: $PropertyType<$Exports<"lodash">, "iteratee">; +} + +declare module "lodash/matches" { + declare module.exports: $PropertyType<$Exports<"lodash">, "matches">; +} + +declare module "lodash/matchesProperty" { + declare module.exports: $PropertyType<$Exports<"lodash">, "matchesProperty">; +} + +declare module "lodash/method" { + declare module.exports: $PropertyType<$Exports<"lodash">, "method">; +} + +declare module "lodash/methodOf" { + declare module.exports: $PropertyType<$Exports<"lodash">, "methodOf">; +} + +declare module "lodash/mixin" { + declare module.exports: $PropertyType<$Exports<"lodash">, "mixin">; +} + +declare module "lodash/noConflict" { + declare module.exports: $PropertyType<$Exports<"lodash">, "noConflict">; +} + +declare module "lodash/noop" { + declare module.exports: $PropertyType<$Exports<"lodash">, "noop">; +} + +declare module "lodash/nthArg" { + declare module.exports: $PropertyType<$Exports<"lodash">, "nthArg">; +} + +declare module "lodash/over" { + declare module.exports: $PropertyType<$Exports<"lodash">, "over">; +} + +declare module "lodash/overEvery" { + declare module.exports: $PropertyType<$Exports<"lodash">, "overEvery">; +} + +declare module "lodash/overSome" { + declare module.exports: $PropertyType<$Exports<"lodash">, "overSome">; +} + +declare module "lodash/property" { + declare module.exports: $PropertyType<$Exports<"lodash">, "property">; +} + +declare module "lodash/propertyOf" { + declare module.exports: $PropertyType<$Exports<"lodash">, "propertyOf">; +} + +declare module "lodash/range" { + declare module.exports: $PropertyType<$Exports<"lodash">, "range">; +} + +declare module "lodash/rangeRight" { + declare module.exports: $PropertyType<$Exports<"lodash">, "rangeRight">; +} + +declare module "lodash/runInContext" { + declare module.exports: $PropertyType<$Exports<"lodash">, "runInContext">; +} + +declare module "lodash/stubArray" { + declare module.exports: $PropertyType<$Exports<"lodash">, "stubArray">; +} + +declare module "lodash/stubFalse" { + declare module.exports: $PropertyType<$Exports<"lodash">, "stubFalse">; +} + +declare module "lodash/stubObject" { + declare module.exports: $PropertyType<$Exports<"lodash">, "stubObject">; +} + +declare module "lodash/stubString" { + declare module.exports: $PropertyType<$Exports<"lodash">, "stubString">; +} + +declare module "lodash/stubTrue" { + declare module.exports: $PropertyType<$Exports<"lodash">, "stubTrue">; +} + +declare module "lodash/times" { + declare module.exports: $PropertyType<$Exports<"lodash">, "times">; +} + +declare module "lodash/toPath" { + declare module.exports: $PropertyType<$Exports<"lodash">, "toPath">; +} + +declare module "lodash/uniqueId" { + declare module.exports: $PropertyType<$Exports<"lodash">, "uniqueId">; +} diff --git a/flow-typed/npm/make-dir_vx.x.x.js b/flow-typed/npm/make-dir_vx.x.x.js new file mode 100644 index 00000000..d7099aef --- /dev/null +++ b/flow-typed/npm/make-dir_vx.x.x.js @@ -0,0 +1,33 @@ +// flow-typed signature: 598f7f6de3cca2bd0c0a1fb0adff6f9b +// flow-typed version: <>/make-dir_v^1.1.0/flow_v0.63.1 + +/** + * This is an autogenerated libdef stub for: + * + * 'make-dir' + * + * Fill this stub out by replacing all the `any` types. + * + * Once filled out, we encourage you to share your work with the + * community by sending a pull request to: + * https://github.com/flowtype/flow-typed + */ + +declare module 'make-dir' { + declare module.exports: any; +} + +/** + * We include stubs for each file inside this npm package in case you need to + * require those files directly. Feel free to delete any files that aren't + * needed. + */ + + +// Filename aliases +declare module 'make-dir/index' { + declare module.exports: $Exports<'make-dir'>; +} +declare module 'make-dir/index.js' { + declare module.exports: $Exports<'make-dir'>; +} diff --git a/flow-typed/npm/md5-file_vx.x.x.js b/flow-typed/npm/md5-file_vx.x.x.js new file mode 100644 index 00000000..525b047c --- /dev/null +++ b/flow-typed/npm/md5-file_vx.x.x.js @@ -0,0 +1,45 @@ +// flow-typed signature: 1a5e8961d35b76202dc28f590c3fe5af +// flow-typed version: <>/md5-file_v^3.2.3/flow_v0.63.1 + +/** + * This is an autogenerated libdef stub for: + * + * 'md5-file' + * + * Fill this stub out by replacing all the `any` types. + * + * Once filled out, we encourage you to share your work with the + * community by sending a pull request to: + * https://github.com/flowtype/flow-typed + */ + +declare module 'md5-file' { + declare module.exports: any; +} + +/** + * We include stubs for each file inside this npm package in case you need to + * require those files directly. Feel free to delete any files that aren't + * needed. + */ +declare module 'md5-file/cli' { + declare module.exports: any; +} + +declare module 'md5-file/promise' { + declare module.exports: any; +} + +// Filename aliases +declare module 'md5-file/cli.js' { + declare module.exports: $Exports<'md5-file/cli'>; +} +declare module 'md5-file/index' { + declare module.exports: $Exports<'md5-file'>; +} +declare module 'md5-file/index.js' { + declare module.exports: $Exports<'md5-file'>; +} +declare module 'md5-file/promise.js' { + declare module.exports: $Exports<'md5-file/promise'>; +} diff --git a/flow-typed/npm/meow_v3.x.x.js b/flow-typed/npm/meow_v3.x.x.js new file mode 100644 index 00000000..859e39e3 --- /dev/null +++ b/flow-typed/npm/meow_v3.x.x.js @@ -0,0 +1,39 @@ +// flow-typed signature: f31bb79b260c49b95de5971e0bcd777d +// flow-typed version: 2c78418fff/meow_v3.x.x/flow_>=v0.25.x + +declare module 'meow' { + declare type options = string | Array | { + description?: string, + help: string, + version?: string | boolean, + pkg?: string | Object, + argv?: Array, + inferType?: boolean + }; + + declare type minimistOptions = { + string?: string | Array, + boolean?: boolean | string | Array, + alias?: { [arg: string]: string | Array }, + default?: { [arg: string]: any }, + stopEarly?: boolean, + '--'?: boolean, + unknown?: (param: string) => boolean + }; + + declare type Flags = { + '--'?: Array, + [flag: string]: string | boolean + }; + + declare module.exports: ( + options: options, + minimistOptions?: minimistOptions, + ) => { + input: Array, + flags: Flags, + pkg: Object, + help: string, + showHelp: Function + } +} diff --git a/flow-typed/npm/mustache_vx.x.x.js b/flow-typed/npm/mustache_vx.x.x.js new file mode 100644 index 00000000..a6afb745 --- /dev/null +++ b/flow-typed/npm/mustache_vx.x.x.js @@ -0,0 +1,39 @@ +// flow-typed signature: 27e77d5a06f741b9e737a754a65f33a9 +// flow-typed version: <>/mustache_v^2.3.0/flow_v0.63.1 + +/** + * This is an autogenerated libdef stub for: + * + * 'mustache' + * + * Fill this stub out by replacing all the `any` types. + * + * Once filled out, we encourage you to share your work with the + * community by sending a pull request to: + * https://github.com/flowtype/flow-typed + */ + +declare module 'mustache' { + declare module.exports: any; +} + +/** + * We include stubs for each file inside this npm package in case you need to + * require those files directly. Feel free to delete any files that aren't + * needed. + */ +declare module 'mustache/mustache' { + declare module.exports: any; +} + +declare module 'mustache/mustache.min' { + declare module.exports: any; +} + +// Filename aliases +declare module 'mustache/mustache.js' { + declare module.exports: $Exports<'mustache/mustache'>; +} +declare module 'mustache/mustache.min.js' { + declare module.exports: $Exports<'mustache/mustache.min'>; +} diff --git a/flow-typed/npm/nightmare_vx.x.x.js b/flow-typed/npm/nightmare_vx.x.x.js new file mode 100644 index 00000000..a41907bc --- /dev/null +++ b/flow-typed/npm/nightmare_vx.x.x.js @@ -0,0 +1,144 @@ +// flow-typed signature: 4638c816b07da7905592d5337e929ba4 +// flow-typed version: <>/nightmare_v^2.10.0/flow_v0.63.1 + +/** + * This is an autogenerated libdef stub for: + * + * 'nightmare' + * + * Fill this stub out by replacing all the `any` types. + * + * Once filled out, we encourage you to share your work with the + * community by sending a pull request to: + * https://github.com/flowtype/flow-typed + */ + +declare module 'nightmare' { + declare module.exports: any; +} + +/** + * We include stubs for each file inside this npm package in case you need to + * require those files directly. Feel free to delete any files that aren't + * needed. + */ +declare module 'nightmare/example' { + declare module.exports: any; +} + +declare module 'nightmare/lib/actions' { + declare module.exports: any; +} + +declare module 'nightmare/lib/frame-manager' { + declare module.exports: any; +} + +declare module 'nightmare/lib/ipc' { + declare module.exports: any; +} + +declare module 'nightmare/lib/javascript' { + declare module.exports: any; +} + +declare module 'nightmare/lib/nightmare' { + declare module.exports: any; +} + +declare module 'nightmare/lib/preload' { + declare module.exports: any; +} + +declare module 'nightmare/lib/runner' { + declare module.exports: any; +} + +declare module 'nightmare/test/files/globals' { + declare module.exports: any; +} + +declare module 'nightmare/test/files/jquery-1.9.0.min' { + declare module.exports: any; +} + +declare module 'nightmare/test/files/jquery-2.1.1.min' { + declare module.exports: any; +} + +declare module 'nightmare/test/files/nightmare-created' { + declare module.exports: any; +} + +declare module 'nightmare/test/files/nightmare-error' { + declare module.exports: any; +} + +declare module 'nightmare/test/files/nightmare-unended' { + declare module.exports: any; +} + +declare module 'nightmare/test/fixtures/preload/index' { + declare module.exports: any; +} + +declare module 'nightmare/test/index' { + declare module.exports: any; +} + +declare module 'nightmare/test/server' { + declare module.exports: any; +} + +// Filename aliases +declare module 'nightmare/example.js' { + declare module.exports: $Exports<'nightmare/example'>; +} +declare module 'nightmare/lib/actions.js' { + declare module.exports: $Exports<'nightmare/lib/actions'>; +} +declare module 'nightmare/lib/frame-manager.js' { + declare module.exports: $Exports<'nightmare/lib/frame-manager'>; +} +declare module 'nightmare/lib/ipc.js' { + declare module.exports: $Exports<'nightmare/lib/ipc'>; +} +declare module 'nightmare/lib/javascript.js' { + declare module.exports: $Exports<'nightmare/lib/javascript'>; +} +declare module 'nightmare/lib/nightmare.js' { + declare module.exports: $Exports<'nightmare/lib/nightmare'>; +} +declare module 'nightmare/lib/preload.js' { + declare module.exports: $Exports<'nightmare/lib/preload'>; +} +declare module 'nightmare/lib/runner.js' { + declare module.exports: $Exports<'nightmare/lib/runner'>; +} +declare module 'nightmare/test/files/globals.js' { + declare module.exports: $Exports<'nightmare/test/files/globals'>; +} +declare module 'nightmare/test/files/jquery-1.9.0.min.js' { + declare module.exports: $Exports<'nightmare/test/files/jquery-1.9.0.min'>; +} +declare module 'nightmare/test/files/jquery-2.1.1.min.js' { + declare module.exports: $Exports<'nightmare/test/files/jquery-2.1.1.min'>; +} +declare module 'nightmare/test/files/nightmare-created.js' { + declare module.exports: $Exports<'nightmare/test/files/nightmare-created'>; +} +declare module 'nightmare/test/files/nightmare-error.js' { + declare module.exports: $Exports<'nightmare/test/files/nightmare-error'>; +} +declare module 'nightmare/test/files/nightmare-unended.js' { + declare module.exports: $Exports<'nightmare/test/files/nightmare-unended'>; +} +declare module 'nightmare/test/fixtures/preload/index.js' { + declare module.exports: $Exports<'nightmare/test/fixtures/preload/index'>; +} +declare module 'nightmare/test/index.js' { + declare module.exports: $Exports<'nightmare/test/index'>; +} +declare module 'nightmare/test/server.js' { + declare module.exports: $Exports<'nightmare/test/server'>; +} diff --git a/flow-typed/npm/reg-keygen-git-hash-plugin_vx.x.x.js b/flow-typed/npm/reg-keygen-git-hash-plugin_vx.x.x.js new file mode 100644 index 00000000..1a99641d --- /dev/null +++ b/flow-typed/npm/reg-keygen-git-hash-plugin_vx.x.x.js @@ -0,0 +1,46 @@ +// flow-typed signature: 54c4169176d533712d40ce6fd1e6afca +// flow-typed version: <>/reg-keygen-git-hash-plugin_v^0.6.3/flow_v0.63.1 + +/** + * This is an autogenerated libdef stub for: + * + * 'reg-keygen-git-hash-plugin' + * + * Fill this stub out by replacing all the `any` types. + * + * Once filled out, we encourage you to share your work with the + * community by sending a pull request to: + * https://github.com/flowtype/flow-typed + */ + +declare module 'reg-keygen-git-hash-plugin' { + declare module.exports: any; +} + +/** + * We include stubs for each file inside this npm package in case you need to + * require those files directly. Feel free to delete any files that aren't + * needed. + */ +declare module 'reg-keygen-git-hash-plugin/lib/commit-explorer' { + declare module.exports: any; +} + +declare module 'reg-keygen-git-hash-plugin/lib/git-cmd-client' { + declare module.exports: any; +} + +declare module 'reg-keygen-git-hash-plugin/lib/index' { + declare module.exports: any; +} + +// Filename aliases +declare module 'reg-keygen-git-hash-plugin/lib/commit-explorer.js' { + declare module.exports: $Exports<'reg-keygen-git-hash-plugin/lib/commit-explorer'>; +} +declare module 'reg-keygen-git-hash-plugin/lib/git-cmd-client.js' { + declare module.exports: $Exports<'reg-keygen-git-hash-plugin/lib/git-cmd-client'>; +} +declare module 'reg-keygen-git-hash-plugin/lib/index.js' { + declare module.exports: $Exports<'reg-keygen-git-hash-plugin/lib/index'>; +} diff --git a/flow-typed/npm/reg-notify-github-plugin_vx.x.x.js b/flow-typed/npm/reg-notify-github-plugin_vx.x.x.js new file mode 100644 index 00000000..6e1b6ee5 --- /dev/null +++ b/flow-typed/npm/reg-notify-github-plugin_vx.x.x.js @@ -0,0 +1,53 @@ +// flow-typed signature: 2fb36989f7274d45e5d2dcb9d5221ba2 +// flow-typed version: <>/reg-notify-github-plugin_v^0.6.0/flow_v0.63.1 + +/** + * This is an autogenerated libdef stub for: + * + * 'reg-notify-github-plugin' + * + * Fill this stub out by replacing all the `any` types. + * + * Once filled out, we encourage you to share your work with the + * community by sending a pull request to: + * https://github.com/flowtype/flow-typed + */ + +declare module 'reg-notify-github-plugin' { + declare module.exports: any; +} + +/** + * We include stubs for each file inside this npm package in case you need to + * require those files directly. Feel free to delete any files that aren't + * needed. + */ +declare module 'reg-notify-github-plugin/lib/git-config-parser' { + declare module.exports: any; +} + +declare module 'reg-notify-github-plugin/lib/github-notifier-plugin' { + declare module.exports: any; +} + +declare module 'reg-notify-github-plugin/lib/github-preparer' { + declare module.exports: any; +} + +declare module 'reg-notify-github-plugin/lib/index' { + declare module.exports: any; +} + +// Filename aliases +declare module 'reg-notify-github-plugin/lib/git-config-parser.js' { + declare module.exports: $Exports<'reg-notify-github-plugin/lib/git-config-parser'>; +} +declare module 'reg-notify-github-plugin/lib/github-notifier-plugin.js' { + declare module.exports: $Exports<'reg-notify-github-plugin/lib/github-notifier-plugin'>; +} +declare module 'reg-notify-github-plugin/lib/github-preparer.js' { + declare module.exports: $Exports<'reg-notify-github-plugin/lib/github-preparer'>; +} +declare module 'reg-notify-github-plugin/lib/index.js' { + declare module.exports: $Exports<'reg-notify-github-plugin/lib/index'>; +} diff --git a/flow-typed/npm/reg-publish-s3-plugin_vx.x.x.js b/flow-typed/npm/reg-publish-s3-plugin_vx.x.x.js new file mode 100644 index 00000000..11df9e88 --- /dev/null +++ b/flow-typed/npm/reg-publish-s3-plugin_vx.x.x.js @@ -0,0 +1,46 @@ +// flow-typed signature: bba32553c057327629d930d8272be038 +// flow-typed version: <>/reg-publish-s3-plugin_v^0.6.3/flow_v0.63.1 + +/** + * This is an autogenerated libdef stub for: + * + * 'reg-publish-s3-plugin' + * + * Fill this stub out by replacing all the `any` types. + * + * Once filled out, we encourage you to share your work with the + * community by sending a pull request to: + * https://github.com/flowtype/flow-typed + */ + +declare module 'reg-publish-s3-plugin' { + declare module.exports: any; +} + +/** + * We include stubs for each file inside this npm package in case you need to + * require those files directly. Feel free to delete any files that aren't + * needed. + */ +declare module 'reg-publish-s3-plugin/lib/index' { + declare module.exports: any; +} + +declare module 'reg-publish-s3-plugin/lib/s3-bucket-preparer' { + declare module.exports: any; +} + +declare module 'reg-publish-s3-plugin/lib/s3-publisher-plugin' { + declare module.exports: any; +} + +// Filename aliases +declare module 'reg-publish-s3-plugin/lib/index.js' { + declare module.exports: $Exports<'reg-publish-s3-plugin/lib/index'>; +} +declare module 'reg-publish-s3-plugin/lib/s3-bucket-preparer.js' { + declare module.exports: $Exports<'reg-publish-s3-plugin/lib/s3-bucket-preparer'>; +} +declare module 'reg-publish-s3-plugin/lib/s3-publisher-plugin.js' { + declare module.exports: $Exports<'reg-publish-s3-plugin/lib/s3-publisher-plugin'>; +} diff --git a/flow-typed/npm/reg-suit_vx.x.x.js b/flow-typed/npm/reg-suit_vx.x.x.js new file mode 100644 index 00000000..322ed522 --- /dev/null +++ b/flow-typed/npm/reg-suit_vx.x.x.js @@ -0,0 +1,102 @@ +// flow-typed signature: 92deae86ef2a73e2b5b01df0fd0561f7 +// flow-typed version: <>/reg-suit_v^0.6.0/flow_v0.63.1 + +/** + * This is an autogenerated libdef stub for: + * + * 'reg-suit' + * + * Fill this stub out by replacing all the `any` types. + * + * Once filled out, we encourage you to share your work with the + * community by sending a pull request to: + * https://github.com/flowtype/flow-typed + */ + +declare module 'reg-suit' { + declare module.exports: any; +} + +/** + * We include stubs for each file inside this npm package in case you need to + * require those files directly. Feel free to delete any files that aren't + * needed. + */ +declare module 'reg-suit/lib/cli-options' { + declare module.exports: any; +} + +declare module 'reg-suit/lib/cli' { + declare module.exports: any; +} + +declare module 'reg-suit/lib/commands/compare' { + declare module.exports: any; +} + +declare module 'reg-suit/lib/commands/init' { + declare module.exports: any; +} + +declare module 'reg-suit/lib/commands/install' { + declare module.exports: any; +} + +declare module 'reg-suit/lib/commands/prepare' { + declare module.exports: any; +} + +declare module 'reg-suit/lib/commands/publish' { + declare module.exports: any; +} + +declare module 'reg-suit/lib/commands/run' { + declare module.exports: any; +} + +declare module 'reg-suit/lib/commands/sync-expected' { + declare module.exports: any; +} + +declare module 'reg-suit/lib/get-reg-core' { + declare module.exports: any; +} + +declare module 'reg-suit/lib/package-util' { + declare module.exports: any; +} + +// Filename aliases +declare module 'reg-suit/lib/cli-options.js' { + declare module.exports: $Exports<'reg-suit/lib/cli-options'>; +} +declare module 'reg-suit/lib/cli.js' { + declare module.exports: $Exports<'reg-suit/lib/cli'>; +} +declare module 'reg-suit/lib/commands/compare.js' { + declare module.exports: $Exports<'reg-suit/lib/commands/compare'>; +} +declare module 'reg-suit/lib/commands/init.js' { + declare module.exports: $Exports<'reg-suit/lib/commands/init'>; +} +declare module 'reg-suit/lib/commands/install.js' { + declare module.exports: $Exports<'reg-suit/lib/commands/install'>; +} +declare module 'reg-suit/lib/commands/prepare.js' { + declare module.exports: $Exports<'reg-suit/lib/commands/prepare'>; +} +declare module 'reg-suit/lib/commands/publish.js' { + declare module.exports: $Exports<'reg-suit/lib/commands/publish'>; +} +declare module 'reg-suit/lib/commands/run.js' { + declare module.exports: $Exports<'reg-suit/lib/commands/run'>; +} +declare module 'reg-suit/lib/commands/sync-expected.js' { + declare module.exports: $Exports<'reg-suit/lib/commands/sync-expected'>; +} +declare module 'reg-suit/lib/get-reg-core.js' { + declare module.exports: $Exports<'reg-suit/lib/get-reg-core'>; +} +declare module 'reg-suit/lib/package-util.js' { + declare module.exports: $Exports<'reg-suit/lib/package-util'>; +} diff --git a/flow-typed/npm/require-extension-hooks-babel_vx.x.x.js b/flow-typed/npm/require-extension-hooks-babel_vx.x.x.js new file mode 100644 index 00000000..02cf6962 --- /dev/null +++ b/flow-typed/npm/require-extension-hooks-babel_vx.x.x.js @@ -0,0 +1,33 @@ +// flow-typed signature: 7a2a812ee3c97d8039206c3ceef680dc +// flow-typed version: <>/require-extension-hooks-babel_v^0.1.1/flow_v0.63.1 + +/** + * This is an autogenerated libdef stub for: + * + * 'require-extension-hooks-babel' + * + * Fill this stub out by replacing all the `any` types. + * + * Once filled out, we encourage you to share your work with the + * community by sending a pull request to: + * https://github.com/flowtype/flow-typed + */ + +declare module 'require-extension-hooks-babel' { + declare module.exports: any; +} + +/** + * We include stubs for each file inside this npm package in case you need to + * require those files directly. Feel free to delete any files that aren't + * needed. + */ + + +// Filename aliases +declare module 'require-extension-hooks-babel/index' { + declare module.exports: $Exports<'require-extension-hooks-babel'>; +} +declare module 'require-extension-hooks-babel/index.js' { + declare module.exports: $Exports<'require-extension-hooks-babel'>; +} diff --git a/flow-typed/npm/require-extension-hooks-vue_vx.x.x.js b/flow-typed/npm/require-extension-hooks-vue_vx.x.x.js new file mode 100644 index 00000000..cdb38c77 --- /dev/null +++ b/flow-typed/npm/require-extension-hooks-vue_vx.x.x.js @@ -0,0 +1,39 @@ +// flow-typed signature: 5a626c4cdbf2bc8bbf7ab9911b7f0b59 +// flow-typed version: <>/require-extension-hooks-vue_v^0.4.1/flow_v0.63.1 + +/** + * This is an autogenerated libdef stub for: + * + * 'require-extension-hooks-vue' + * + * Fill this stub out by replacing all the `any` types. + * + * Once filled out, we encourage you to share your work with the + * community by sending a pull request to: + * https://github.com/flowtype/flow-typed + */ + +declare module 'require-extension-hooks-vue' { + declare module.exports: any; +} + +/** + * We include stubs for each file inside this npm package in case you need to + * require those files directly. Feel free to delete any files that aren't + * needed. + */ +declare module 'require-extension-hooks-vue/src/index' { + declare module.exports: any; +} + +declare module 'require-extension-hooks-vue/src/renderTemplate' { + declare module.exports: any; +} + +// Filename aliases +declare module 'require-extension-hooks-vue/src/index.js' { + declare module.exports: $Exports<'require-extension-hooks-vue/src/index'>; +} +declare module 'require-extension-hooks-vue/src/renderTemplate.js' { + declare module.exports: $Exports<'require-extension-hooks-vue/src/renderTemplate'>; +} diff --git a/flow-typed/npm/require-extension-hooks_vx.x.x.js b/flow-typed/npm/require-extension-hooks_vx.x.x.js new file mode 100644 index 00000000..5be2ede6 --- /dev/null +++ b/flow-typed/npm/require-extension-hooks_vx.x.x.js @@ -0,0 +1,60 @@ +// flow-typed signature: 0b754ac19405a8a14167f13793adeafb +// flow-typed version: <>/require-extension-hooks_v^0.3.2/flow_v0.63.1 + +/** + * This is an autogenerated libdef stub for: + * + * 'require-extension-hooks' + * + * Fill this stub out by replacing all the `any` types. + * + * Once filled out, we encourage you to share your work with the + * community by sending a pull request to: + * https://github.com/flowtype/flow-typed + */ + +declare module 'require-extension-hooks' { + declare module.exports: any; +} + +/** + * We include stubs for each file inside this npm package in case you need to + * require those files directly. Feel free to delete any files that aren't + * needed. + */ +declare module 'require-extension-hooks/src/api' { + declare module.exports: any; +} + +declare module 'require-extension-hooks/src/cache' { + declare module.exports: any; +} + +declare module 'require-extension-hooks/src/hook' { + declare module.exports: any; +} + +declare module 'require-extension-hooks/src/index' { + declare module.exports: any; +} + +declare module 'require-extension-hooks/src/permaCache' { + declare module.exports: any; +} + +// Filename aliases +declare module 'require-extension-hooks/src/api.js' { + declare module.exports: $Exports<'require-extension-hooks/src/api'>; +} +declare module 'require-extension-hooks/src/cache.js' { + declare module.exports: $Exports<'require-extension-hooks/src/cache'>; +} +declare module 'require-extension-hooks/src/hook.js' { + declare module.exports: $Exports<'require-extension-hooks/src/hook'>; +} +declare module 'require-extension-hooks/src/index.js' { + declare module.exports: $Exports<'require-extension-hooks/src/index'>; +} +declare module 'require-extension-hooks/src/permaCache.js' { + declare module.exports: $Exports<'require-extension-hooks/src/permaCache'>; +} diff --git a/flow-typed/npm/rimraf_v2.x.x.js b/flow-typed/npm/rimraf_v2.x.x.js new file mode 100644 index 00000000..13b85249 --- /dev/null +++ b/flow-typed/npm/rimraf_v2.x.x.js @@ -0,0 +1,18 @@ +// flow-typed signature: 1dff23447d5e18f5ac2b05aaec7cfb74 +// flow-typed version: a453e98ea2/rimraf_v2.x.x/flow_>=v0.25.0 + +declare module 'rimraf' { + declare type Options = { + maxBusyTries?: number, + emfileWait?: number, + glob?: boolean, + disableGlob?: boolean + }; + + declare type Callback = (err: ?Error, path: ?string) => void; + + declare module.exports: { + (f: string, opts?: Options | Callback, callback?: Callback): void; + sync(path: string, opts?: Options): void; + }; +} diff --git a/flow-typed/npm/uglify-js_vx.x.x.js b/flow-typed/npm/uglify-js_vx.x.x.js new file mode 100644 index 00000000..dc335c9e --- /dev/null +++ b/flow-typed/npm/uglify-js_vx.x.x.js @@ -0,0 +1,123 @@ +// flow-typed signature: 2b61eeca24f2e524abec0eb03e0e779a +// flow-typed version: <>/uglify-js_v^3.3.5/flow_v0.63.1 + +/** + * This is an autogenerated libdef stub for: + * + * 'uglify-js' + * + * Fill this stub out by replacing all the `any` types. + * + * Once filled out, we encourage you to share your work with the + * community by sending a pull request to: + * https://github.com/flowtype/flow-typed + */ + +declare module 'uglify-js' { + declare module.exports: any; +} + +/** + * We include stubs for each file inside this npm package in case you need to + * require those files directly. Feel free to delete any files that aren't + * needed. + */ +declare module 'uglify-js/lib/ast' { + declare module.exports: any; +} + +declare module 'uglify-js/lib/compress' { + declare module.exports: any; +} + +declare module 'uglify-js/lib/minify' { + declare module.exports: any; +} + +declare module 'uglify-js/lib/mozilla-ast' { + declare module.exports: any; +} + +declare module 'uglify-js/lib/output' { + declare module.exports: any; +} + +declare module 'uglify-js/lib/parse' { + declare module.exports: any; +} + +declare module 'uglify-js/lib/propmangle' { + declare module.exports: any; +} + +declare module 'uglify-js/lib/scope' { + declare module.exports: any; +} + +declare module 'uglify-js/lib/sourcemap' { + declare module.exports: any; +} + +declare module 'uglify-js/lib/transform' { + declare module.exports: any; +} + +declare module 'uglify-js/lib/utils' { + declare module.exports: any; +} + +declare module 'uglify-js/tools/exit' { + declare module.exports: any; +} + +declare module 'uglify-js/tools/exports' { + declare module.exports: any; +} + +declare module 'uglify-js/tools/node' { + declare module.exports: any; +} + +// Filename aliases +declare module 'uglify-js/lib/ast.js' { + declare module.exports: $Exports<'uglify-js/lib/ast'>; +} +declare module 'uglify-js/lib/compress.js' { + declare module.exports: $Exports<'uglify-js/lib/compress'>; +} +declare module 'uglify-js/lib/minify.js' { + declare module.exports: $Exports<'uglify-js/lib/minify'>; +} +declare module 'uglify-js/lib/mozilla-ast.js' { + declare module.exports: $Exports<'uglify-js/lib/mozilla-ast'>; +} +declare module 'uglify-js/lib/output.js' { + declare module.exports: $Exports<'uglify-js/lib/output'>; +} +declare module 'uglify-js/lib/parse.js' { + declare module.exports: $Exports<'uglify-js/lib/parse'>; +} +declare module 'uglify-js/lib/propmangle.js' { + declare module.exports: $Exports<'uglify-js/lib/propmangle'>; +} +declare module 'uglify-js/lib/scope.js' { + declare module.exports: $Exports<'uglify-js/lib/scope'>; +} +declare module 'uglify-js/lib/sourcemap.js' { + declare module.exports: $Exports<'uglify-js/lib/sourcemap'>; +} +declare module 'uglify-js/lib/transform.js' { + declare module.exports: $Exports<'uglify-js/lib/transform'>; +} +declare module 'uglify-js/lib/utils.js' { + declare module.exports: $Exports<'uglify-js/lib/utils'>; +} +declare module 'uglify-js/tools/exit.js' { + declare module.exports: $Exports<'uglify-js/tools/exit'>; +} +declare module 'uglify-js/tools/exports.js' { + declare module.exports: $Exports<'uglify-js/tools/exports'>; +} +declare module 'uglify-js/tools/node.js' { + declare module.exports: $Exports<'uglify-js/tools/node'>; +} diff --git a/flow-typed/npm/uglifyjs-webpack-plugin_vx.x.x.js b/flow-typed/npm/uglifyjs-webpack-plugin_vx.x.x.js new file mode 100644 index 00000000..0e0772fe --- /dev/null +++ b/flow-typed/npm/uglifyjs-webpack-plugin_vx.x.x.js @@ -0,0 +1,67 @@ +// flow-typed signature: 6308ab9ce123f8b69def77c0fbdf6980 +// flow-typed version: <>/uglifyjs-webpack-plugin_v^1.1.6/flow_v0.63.1 + +/** + * This is an autogenerated libdef stub for: + * + * 'uglifyjs-webpack-plugin' + * + * Fill this stub out by replacing all the `any` types. + * + * Once filled out, we encourage you to share your work with the + * community by sending a pull request to: + * https://github.com/flowtype/flow-typed + */ + +declare module 'uglifyjs-webpack-plugin' { + declare module.exports: any; +} + +/** + * We include stubs for each file inside this npm package in case you need to + * require those files directly. Feel free to delete any files that aren't + * needed. + */ +declare module 'uglifyjs-webpack-plugin/dist/cjs' { + declare module.exports: any; +} + +declare module 'uglifyjs-webpack-plugin/dist/index' { + declare module.exports: any; +} + +declare module 'uglifyjs-webpack-plugin/dist/uglify/index' { + declare module.exports: any; +} + +declare module 'uglifyjs-webpack-plugin/dist/uglify/minify' { + declare module.exports: any; +} + +declare module 'uglifyjs-webpack-plugin/dist/uglify/versions' { + declare module.exports: any; +} + +declare module 'uglifyjs-webpack-plugin/dist/uglify/worker' { + declare module.exports: any; +} + +// Filename aliases +declare module 'uglifyjs-webpack-plugin/dist/cjs.js' { + declare module.exports: $Exports<'uglifyjs-webpack-plugin/dist/cjs'>; +} +declare module 'uglifyjs-webpack-plugin/dist/index.js' { + declare module.exports: $Exports<'uglifyjs-webpack-plugin/dist/index'>; +} +declare module 'uglifyjs-webpack-plugin/dist/uglify/index.js' { + declare module.exports: $Exports<'uglifyjs-webpack-plugin/dist/uglify/index'>; +} +declare module 'uglifyjs-webpack-plugin/dist/uglify/minify.js' { + declare module.exports: $Exports<'uglifyjs-webpack-plugin/dist/uglify/minify'>; +} +declare module 'uglifyjs-webpack-plugin/dist/uglify/versions.js' { + declare module.exports: $Exports<'uglifyjs-webpack-plugin/dist/uglify/versions'>; +} +declare module 'uglifyjs-webpack-plugin/dist/uglify/worker.js' { + declare module.exports: $Exports<'uglifyjs-webpack-plugin/dist/uglify/worker'>; +} diff --git a/flow-typed/npm/url-loader_vx.x.x.js b/flow-typed/npm/url-loader_vx.x.x.js new file mode 100644 index 00000000..944261c7 --- /dev/null +++ b/flow-typed/npm/url-loader_vx.x.x.js @@ -0,0 +1,33 @@ +// flow-typed signature: 256b1b6361a73c147babad793d6e8722 +// flow-typed version: <>/url-loader_v^0.6.2/flow_v0.63.1 + +/** + * This is an autogenerated libdef stub for: + * + * 'url-loader' + * + * Fill this stub out by replacing all the `any` types. + * + * Once filled out, we encourage you to share your work with the + * community by sending a pull request to: + * https://github.com/flowtype/flow-typed + */ + +declare module 'url-loader' { + declare module.exports: any; +} + +/** + * We include stubs for each file inside this npm package in case you need to + * require those files directly. Feel free to delete any files that aren't + * needed. + */ + + +// Filename aliases +declare module 'url-loader/index' { + declare module.exports: $Exports<'url-loader'>; +} +declare module 'url-loader/index.js' { + declare module.exports: $Exports<'url-loader'>; +} diff --git a/flow-typed/npm/vue-lazyload_vx.x.x.js b/flow-typed/npm/vue-lazyload_vx.x.x.js new file mode 100644 index 00000000..541d2f1f --- /dev/null +++ b/flow-typed/npm/vue-lazyload_vx.x.x.js @@ -0,0 +1,74 @@ +// flow-typed signature: 937249951f60d12ebd2510a344c2e278 +// flow-typed version: <>/vue-lazyload_v^1.0.3/flow_v0.63.1 + +/** + * This is an autogenerated libdef stub for: + * + * 'vue-lazyload' + * + * Fill this stub out by replacing all the `any` types. + * + * Once filled out, we encourage you to share your work with the + * community by sending a pull request to: + * https://github.com/flowtype/flow-typed + */ + +declare module 'vue-lazyload' { + declare module.exports: any; +} + +/** + * We include stubs for each file inside this npm package in case you need to + * require those files directly. Feel free to delete any files that aren't + * needed. + */ +declare module 'vue-lazyload/build' { + declare module.exports: any; +} + +declare module 'vue-lazyload/src/index' { + declare module.exports: any; +} + +declare module 'vue-lazyload/src/lazy-component' { + declare module.exports: any; +} + +declare module 'vue-lazyload/src/lazy' { + declare module.exports: any; +} + +declare module 'vue-lazyload/src/listener' { + declare module.exports: any; +} + +declare module 'vue-lazyload/src/util' { + declare module.exports: any; +} + +declare module 'vue-lazyload/vue-lazyload' { + declare module.exports: any; +} + +// Filename aliases +declare module 'vue-lazyload/build.js' { + declare module.exports: $Exports<'vue-lazyload/build'>; +} +declare module 'vue-lazyload/src/index.js' { + declare module.exports: $Exports<'vue-lazyload/src/index'>; +} +declare module 'vue-lazyload/src/lazy-component.js' { + declare module.exports: $Exports<'vue-lazyload/src/lazy-component'>; +} +declare module 'vue-lazyload/src/lazy.js' { + declare module.exports: $Exports<'vue-lazyload/src/lazy'>; +} +declare module 'vue-lazyload/src/listener.js' { + declare module.exports: $Exports<'vue-lazyload/src/listener'>; +} +declare module 'vue-lazyload/src/util.js' { + declare module.exports: $Exports<'vue-lazyload/src/util'>; +} +declare module 'vue-lazyload/vue-lazyload.js' { + declare module.exports: $Exports<'vue-lazyload/vue-lazyload'>; +} diff --git a/flow-typed/npm/vue-loader_vx.x.x.js b/flow-typed/npm/vue-loader_vx.x.x.js new file mode 100644 index 00000000..f8dedd06 --- /dev/null +++ b/flow-typed/npm/vue-loader_vx.x.x.js @@ -0,0 +1,129 @@ +// flow-typed signature: a9660627569f334a4a9753569bd272f9 +// flow-typed version: <>/vue-loader_v~12.2.2/flow_v0.63.1 + +/** + * This is an autogenerated libdef stub for: + * + * 'vue-loader' + * + * Fill this stub out by replacing all the `any` types. + * + * Once filled out, we encourage you to share your work with the + * community by sending a pull request to: + * https://github.com/flowtype/flow-typed + */ + +declare module 'vue-loader' { + declare module.exports: any; +} + +/** + * We include stubs for each file inside this npm package in case you need to + * require those files directly. Feel free to delete any files that aren't + * needed. + */ +declare module 'vue-loader/lib/component-normalizer' { + declare module.exports: any; +} + +declare module 'vue-loader/lib/loader' { + declare module.exports: any; +} + +declare module 'vue-loader/lib/parser' { + declare module.exports: any; +} + +declare module 'vue-loader/lib/selector' { + declare module.exports: any; +} + +declare module 'vue-loader/lib/style-compiler/index' { + declare module.exports: any; +} + +declare module 'vue-loader/lib/style-compiler/load-postcss-config' { + declare module.exports: any; +} + +declare module 'vue-loader/lib/style-compiler/plugins/scope-id' { + declare module.exports: any; +} + +declare module 'vue-loader/lib/style-compiler/plugins/trim' { + declare module.exports: any; +} + +declare module 'vue-loader/lib/template-compiler/index' { + declare module.exports: any; +} + +declare module 'vue-loader/lib/template-compiler/modules/transform-require' { + declare module.exports: any; +} + +declare module 'vue-loader/lib/template-compiler/preprocessor' { + declare module.exports: any; +} + +declare module 'vue-loader/lib/utils/gen-id' { + declare module.exports: any; +} + +declare module 'vue-loader/lib/utils/normalize' { + declare module.exports: any; +} + +declare module 'vue-loader/lib/utils/try-require' { + declare module.exports: any; +} + +// Filename aliases +declare module 'vue-loader/index' { + declare module.exports: $Exports<'vue-loader'>; +} +declare module 'vue-loader/index.js' { + declare module.exports: $Exports<'vue-loader'>; +} +declare module 'vue-loader/lib/component-normalizer.js' { + declare module.exports: $Exports<'vue-loader/lib/component-normalizer'>; +} +declare module 'vue-loader/lib/loader.js' { + declare module.exports: $Exports<'vue-loader/lib/loader'>; +} +declare module 'vue-loader/lib/parser.js' { + declare module.exports: $Exports<'vue-loader/lib/parser'>; +} +declare module 'vue-loader/lib/selector.js' { + declare module.exports: $Exports<'vue-loader/lib/selector'>; +} +declare module 'vue-loader/lib/style-compiler/index.js' { + declare module.exports: $Exports<'vue-loader/lib/style-compiler/index'>; +} +declare module 'vue-loader/lib/style-compiler/load-postcss-config.js' { + declare module.exports: $Exports<'vue-loader/lib/style-compiler/load-postcss-config'>; +} +declare module 'vue-loader/lib/style-compiler/plugins/scope-id.js' { + declare module.exports: $Exports<'vue-loader/lib/style-compiler/plugins/scope-id'>; +} +declare module 'vue-loader/lib/style-compiler/plugins/trim.js' { + declare module.exports: $Exports<'vue-loader/lib/style-compiler/plugins/trim'>; +} +declare module 'vue-loader/lib/template-compiler/index.js' { + declare module.exports: $Exports<'vue-loader/lib/template-compiler/index'>; +} +declare module 'vue-loader/lib/template-compiler/modules/transform-require.js' { + declare module.exports: $Exports<'vue-loader/lib/template-compiler/modules/transform-require'>; +} +declare module 'vue-loader/lib/template-compiler/preprocessor.js' { + declare module.exports: $Exports<'vue-loader/lib/template-compiler/preprocessor'>; +} +declare module 'vue-loader/lib/utils/gen-id.js' { + declare module.exports: $Exports<'vue-loader/lib/utils/gen-id'>; +} +declare module 'vue-loader/lib/utils/normalize.js' { + declare module.exports: $Exports<'vue-loader/lib/utils/normalize'>; +} +declare module 'vue-loader/lib/utils/try-require.js' { + declare module.exports: $Exports<'vue-loader/lib/utils/try-require'>; +} diff --git a/flow-typed/npm/vue-template-compiler_vx.x.x.js b/flow-typed/npm/vue-template-compiler_vx.x.x.js new file mode 100644 index 00000000..5efe3f10 --- /dev/null +++ b/flow-typed/npm/vue-template-compiler_vx.x.x.js @@ -0,0 +1,38 @@ +// flow-typed signature: 4661a03662dabee218c24fe8baf7b302 +// flow-typed version: <>/vue-template-compiler_v^2.3.3/flow_v0.63.1 + +/** + * This is an autogenerated libdef stub for: + * + * 'vue-template-compiler' + * + * Fill this stub out by replacing all the `any` types. + * + * Once filled out, we encourage you to share your work with the + * community by sending a pull request to: + * https://github.com/flowtype/flow-typed + */ + +declare module 'vue-template-compiler' { + declare module.exports: any; +} + +/** + * We include stubs for each file inside this npm package in case you need to + * require those files directly. Feel free to delete any files that aren't + * needed. + */ +declare module 'vue-template-compiler/build' { + declare module.exports: any; +} + +// Filename aliases +declare module 'vue-template-compiler/build.js' { + declare module.exports: $Exports<'vue-template-compiler/build'>; +} +declare module 'vue-template-compiler/index' { + declare module.exports: $Exports<'vue-template-compiler'>; +} +declare module 'vue-template-compiler/index.js' { + declare module.exports: $Exports<'vue-template-compiler'>; +} diff --git a/flow-typed/npm/vue-thin-modal_vx.x.x.js b/flow-typed/npm/vue-thin-modal_vx.x.x.js new file mode 100644 index 00000000..be38ea88 --- /dev/null +++ b/flow-typed/npm/vue-thin-modal_vx.x.x.js @@ -0,0 +1,53 @@ +// flow-typed signature: 4308d4eacd1050d43e2768399b4fc0dd +// flow-typed version: <>/vue-thin-modal_v^0.2.5/flow_v0.63.1 + +/** + * This is an autogenerated libdef stub for: + * + * 'vue-thin-modal' + * + * Fill this stub out by replacing all the `any` types. + * + * Once filled out, we encourage you to share your work with the + * community by sending a pull request to: + * https://github.com/flowtype/flow-typed + */ + +declare module 'vue-thin-modal' { + declare module.exports: any; +} + +/** + * We include stubs for each file inside this npm package in case you need to + * require those files directly. Feel free to delete any files that aren't + * needed. + */ +declare module 'vue-thin-modal/dist/vue-thin-modal.cjs' { + declare module.exports: any; +} + +declare module 'vue-thin-modal/dist/vue-thin-modal.esm' { + declare module.exports: any; +} + +declare module 'vue-thin-modal/dist/vue-thin-modal' { + declare module.exports: any; +} + +declare module 'vue-thin-modal/dist/vue-thin-modal.min' { + declare module.exports: any; +} + +// Filename aliases +declare module 'vue-thin-modal/dist/vue-thin-modal.cjs.js' { + declare module.exports: $Exports<'vue-thin-modal/dist/vue-thin-modal.cjs'>; +} +declare module 'vue-thin-modal/dist/vue-thin-modal.esm.js' { + declare module.exports: $Exports<'vue-thin-modal/dist/vue-thin-modal.esm'>; +} +declare module 'vue-thin-modal/dist/vue-thin-modal.js' { + declare module.exports: $Exports<'vue-thin-modal/dist/vue-thin-modal'>; +} +declare module 'vue-thin-modal/dist/vue-thin-modal.min.js' { + declare module.exports: $Exports<'vue-thin-modal/dist/vue-thin-modal.min'>; +} diff --git a/flow-typed/npm/vue_vx.x.x.js b/flow-typed/npm/vue_vx.x.x.js new file mode 100644 index 00000000..2a30c83f --- /dev/null +++ b/flow-typed/npm/vue_vx.x.x.js @@ -0,0 +1,1264 @@ +// flow-typed signature: a6c6a477ce4893d4ac80623770221a1b +// flow-typed version: <>/vue_v^2.3.3/flow_v0.63.1 + +/** + * This is an autogenerated libdef stub for: + * + * 'vue' + * + * Fill this stub out by replacing all the `any` types. + * + * Once filled out, we encourage you to share your work with the + * community by sending a pull request to: + * https://github.com/flowtype/flow-typed + */ + +declare module 'vue' { + declare module.exports: any; +} + +/** + * We include stubs for each file inside this npm package in case you need to + * require those files directly. Feel free to delete any files that aren't + * needed. + */ +declare module 'vue/dist/vue.common' { + declare module.exports: any; +} + +declare module 'vue/dist/vue.esm' { + declare module.exports: any; +} + +declare module 'vue/dist/vue' { + declare module.exports: any; +} + +declare module 'vue/dist/vue.min' { + declare module.exports: any; +} + +declare module 'vue/dist/vue.runtime.common' { + declare module.exports: any; +} + +declare module 'vue/dist/vue.runtime.esm' { + declare module.exports: any; +} + +declare module 'vue/dist/vue.runtime' { + declare module.exports: any; +} + +declare module 'vue/dist/vue.runtime.min' { + declare module.exports: any; +} + +declare module 'vue/src/compiler/codegen/events' { + declare module.exports: any; +} + +declare module 'vue/src/compiler/codegen/index' { + declare module.exports: any; +} + +declare module 'vue/src/compiler/create-compiler' { + declare module.exports: any; +} + +declare module 'vue/src/compiler/directives/bind' { + declare module.exports: any; +} + +declare module 'vue/src/compiler/directives/index' { + declare module.exports: any; +} + +declare module 'vue/src/compiler/directives/model' { + declare module.exports: any; +} + +declare module 'vue/src/compiler/directives/on' { + declare module.exports: any; +} + +declare module 'vue/src/compiler/error-detector' { + declare module.exports: any; +} + +declare module 'vue/src/compiler/helpers' { + declare module.exports: any; +} + +declare module 'vue/src/compiler/index' { + declare module.exports: any; +} + +declare module 'vue/src/compiler/optimizer' { + declare module.exports: any; +} + +declare module 'vue/src/compiler/parser/entity-decoder' { + declare module.exports: any; +} + +declare module 'vue/src/compiler/parser/filter-parser' { + declare module.exports: any; +} + +declare module 'vue/src/compiler/parser/html-parser' { + declare module.exports: any; +} + +declare module 'vue/src/compiler/parser/index' { + declare module.exports: any; +} + +declare module 'vue/src/compiler/parser/text-parser' { + declare module.exports: any; +} + +declare module 'vue/src/compiler/to-function' { + declare module.exports: any; +} + +declare module 'vue/src/core/components/index' { + declare module.exports: any; +} + +declare module 'vue/src/core/components/keep-alive' { + declare module.exports: any; +} + +declare module 'vue/src/core/config' { + declare module.exports: any; +} + +declare module 'vue/src/core/global-api/assets' { + declare module.exports: any; +} + +declare module 'vue/src/core/global-api/extend' { + declare module.exports: any; +} + +declare module 'vue/src/core/global-api/index' { + declare module.exports: any; +} + +declare module 'vue/src/core/global-api/mixin' { + declare module.exports: any; +} + +declare module 'vue/src/core/global-api/use' { + declare module.exports: any; +} + +declare module 'vue/src/core/index' { + declare module.exports: any; +} + +declare module 'vue/src/core/instance/events' { + declare module.exports: any; +} + +declare module 'vue/src/core/instance/index' { + declare module.exports: any; +} + +declare module 'vue/src/core/instance/init' { + declare module.exports: any; +} + +declare module 'vue/src/core/instance/inject' { + declare module.exports: any; +} + +declare module 'vue/src/core/instance/lifecycle' { + declare module.exports: any; +} + +declare module 'vue/src/core/instance/proxy' { + declare module.exports: any; +} + +declare module 'vue/src/core/instance/render-helpers/bind-object-listeners' { + declare module.exports: any; +} + +declare module 'vue/src/core/instance/render-helpers/bind-object-props' { + declare module.exports: any; +} + +declare module 'vue/src/core/instance/render-helpers/check-keycodes' { + declare module.exports: any; +} + +declare module 'vue/src/core/instance/render-helpers/render-list' { + declare module.exports: any; +} + +declare module 'vue/src/core/instance/render-helpers/render-slot' { + declare module.exports: any; +} + +declare module 'vue/src/core/instance/render-helpers/render-static' { + declare module.exports: any; +} + +declare module 'vue/src/core/instance/render-helpers/resolve-filter' { + declare module.exports: any; +} + +declare module 'vue/src/core/instance/render-helpers/resolve-slots' { + declare module.exports: any; +} + +declare module 'vue/src/core/instance/render' { + declare module.exports: any; +} + +declare module 'vue/src/core/instance/state' { + declare module.exports: any; +} + +declare module 'vue/src/core/observer/array' { + declare module.exports: any; +} + +declare module 'vue/src/core/observer/dep' { + declare module.exports: any; +} + +declare module 'vue/src/core/observer/index' { + declare module.exports: any; +} + +declare module 'vue/src/core/observer/scheduler' { + declare module.exports: any; +} + +declare module 'vue/src/core/observer/watcher' { + declare module.exports: any; +} + +declare module 'vue/src/core/util/debug' { + declare module.exports: any; +} + +declare module 'vue/src/core/util/env' { + declare module.exports: any; +} + +declare module 'vue/src/core/util/error' { + declare module.exports: any; +} + +declare module 'vue/src/core/util/index' { + declare module.exports: any; +} + +declare module 'vue/src/core/util/lang' { + declare module.exports: any; +} + +declare module 'vue/src/core/util/options' { + declare module.exports: any; +} + +declare module 'vue/src/core/util/perf' { + declare module.exports: any; +} + +declare module 'vue/src/core/util/props' { + declare module.exports: any; +} + +declare module 'vue/src/core/vdom/create-component' { + declare module.exports: any; +} + +declare module 'vue/src/core/vdom/create-element' { + declare module.exports: any; +} + +declare module 'vue/src/core/vdom/create-functional-component' { + declare module.exports: any; +} + +declare module 'vue/src/core/vdom/helpers/extract-props' { + declare module.exports: any; +} + +declare module 'vue/src/core/vdom/helpers/get-first-component-child' { + declare module.exports: any; +} + +declare module 'vue/src/core/vdom/helpers/index' { + declare module.exports: any; +} + +declare module 'vue/src/core/vdom/helpers/merge-hook' { + declare module.exports: any; +} + +declare module 'vue/src/core/vdom/helpers/normalize-children' { + declare module.exports: any; +} + +declare module 'vue/src/core/vdom/helpers/resolve-async-component' { + declare module.exports: any; +} + +declare module 'vue/src/core/vdom/helpers/update-listeners' { + declare module.exports: any; +} + +declare module 'vue/src/core/vdom/modules/directives' { + declare module.exports: any; +} + +declare module 'vue/src/core/vdom/modules/index' { + declare module.exports: any; +} + +declare module 'vue/src/core/vdom/modules/ref' { + declare module.exports: any; +} + +declare module 'vue/src/core/vdom/patch' { + declare module.exports: any; +} + +declare module 'vue/src/core/vdom/vnode' { + declare module.exports: any; +} + +declare module 'vue/src/platforms/web/compiler/directives/html' { + declare module.exports: any; +} + +declare module 'vue/src/platforms/web/compiler/directives/index' { + declare module.exports: any; +} + +declare module 'vue/src/platforms/web/compiler/directives/model' { + declare module.exports: any; +} + +declare module 'vue/src/platforms/web/compiler/directives/text' { + declare module.exports: any; +} + +declare module 'vue/src/platforms/web/compiler/index' { + declare module.exports: any; +} + +declare module 'vue/src/platforms/web/compiler/modules/class' { + declare module.exports: any; +} + +declare module 'vue/src/platforms/web/compiler/modules/index' { + declare module.exports: any; +} + +declare module 'vue/src/platforms/web/compiler/modules/style' { + declare module.exports: any; +} + +declare module 'vue/src/platforms/web/compiler/options' { + declare module.exports: any; +} + +declare module 'vue/src/platforms/web/compiler/util' { + declare module.exports: any; +} + +declare module 'vue/src/platforms/web/entry-compiler' { + declare module.exports: any; +} + +declare module 'vue/src/platforms/web/entry-runtime-with-compiler' { + declare module.exports: any; +} + +declare module 'vue/src/platforms/web/entry-runtime' { + declare module.exports: any; +} + +declare module 'vue/src/platforms/web/entry-server-basic-renderer' { + declare module.exports: any; +} + +declare module 'vue/src/platforms/web/entry-server-renderer' { + declare module.exports: any; +} + +declare module 'vue/src/platforms/web/runtime/class-util' { + declare module.exports: any; +} + +declare module 'vue/src/platforms/web/runtime/components/index' { + declare module.exports: any; +} + +declare module 'vue/src/platforms/web/runtime/components/transition-group' { + declare module.exports: any; +} + +declare module 'vue/src/platforms/web/runtime/components/transition' { + declare module.exports: any; +} + +declare module 'vue/src/platforms/web/runtime/directives/index' { + declare module.exports: any; +} + +declare module 'vue/src/platforms/web/runtime/directives/model' { + declare module.exports: any; +} + +declare module 'vue/src/platforms/web/runtime/directives/show' { + declare module.exports: any; +} + +declare module 'vue/src/platforms/web/runtime/index' { + declare module.exports: any; +} + +declare module 'vue/src/platforms/web/runtime/modules/attrs' { + declare module.exports: any; +} + +declare module 'vue/src/platforms/web/runtime/modules/class' { + declare module.exports: any; +} + +declare module 'vue/src/platforms/web/runtime/modules/dom-props' { + declare module.exports: any; +} + +declare module 'vue/src/platforms/web/runtime/modules/events' { + declare module.exports: any; +} + +declare module 'vue/src/platforms/web/runtime/modules/index' { + declare module.exports: any; +} + +declare module 'vue/src/platforms/web/runtime/modules/style' { + declare module.exports: any; +} + +declare module 'vue/src/platforms/web/runtime/modules/transition' { + declare module.exports: any; +} + +declare module 'vue/src/platforms/web/runtime/node-ops' { + declare module.exports: any; +} + +declare module 'vue/src/platforms/web/runtime/patch' { + declare module.exports: any; +} + +declare module 'vue/src/platforms/web/runtime/transition-util' { + declare module.exports: any; +} + +declare module 'vue/src/platforms/web/server/compiler' { + declare module.exports: any; +} + +declare module 'vue/src/platforms/web/server/directives/index' { + declare module.exports: any; +} + +declare module 'vue/src/platforms/web/server/directives/show' { + declare module.exports: any; +} + +declare module 'vue/src/platforms/web/server/modules/attrs' { + declare module.exports: any; +} + +declare module 'vue/src/platforms/web/server/modules/class' { + declare module.exports: any; +} + +declare module 'vue/src/platforms/web/server/modules/dom-props' { + declare module.exports: any; +} + +declare module 'vue/src/platforms/web/server/modules/index' { + declare module.exports: any; +} + +declare module 'vue/src/platforms/web/server/modules/style' { + declare module.exports: any; +} + +declare module 'vue/src/platforms/web/server/util' { + declare module.exports: any; +} + +declare module 'vue/src/platforms/web/util/attrs' { + declare module.exports: any; +} + +declare module 'vue/src/platforms/web/util/class' { + declare module.exports: any; +} + +declare module 'vue/src/platforms/web/util/compat' { + declare module.exports: any; +} + +declare module 'vue/src/platforms/web/util/element' { + declare module.exports: any; +} + +declare module 'vue/src/platforms/web/util/index' { + declare module.exports: any; +} + +declare module 'vue/src/platforms/web/util/style' { + declare module.exports: any; +} + +declare module 'vue/src/platforms/weex/compiler/directives/index' { + declare module.exports: any; +} + +declare module 'vue/src/platforms/weex/compiler/directives/model' { + declare module.exports: any; +} + +declare module 'vue/src/platforms/weex/compiler/index' { + declare module.exports: any; +} + +declare module 'vue/src/platforms/weex/compiler/modules/append' { + declare module.exports: any; +} + +declare module 'vue/src/platforms/weex/compiler/modules/class' { + declare module.exports: any; +} + +declare module 'vue/src/platforms/weex/compiler/modules/index' { + declare module.exports: any; +} + +declare module 'vue/src/platforms/weex/compiler/modules/props' { + declare module.exports: any; +} + +declare module 'vue/src/platforms/weex/compiler/modules/style' { + declare module.exports: any; +} + +declare module 'vue/src/platforms/weex/entry-compiler' { + declare module.exports: any; +} + +declare module 'vue/src/platforms/weex/entry-framework' { + declare module.exports: any; +} + +declare module 'vue/src/platforms/weex/entry-runtime-factory' { + declare module.exports: any; +} + +declare module 'vue/src/platforms/weex/runtime/components/index' { + declare module.exports: any; +} + +declare module 'vue/src/platforms/weex/runtime/components/transition-group' { + declare module.exports: any; +} + +declare module 'vue/src/platforms/weex/runtime/components/transition' { + declare module.exports: any; +} + +declare module 'vue/src/platforms/weex/runtime/directives/index' { + declare module.exports: any; +} + +declare module 'vue/src/platforms/weex/runtime/index' { + declare module.exports: any; +} + +declare module 'vue/src/platforms/weex/runtime/modules/attrs' { + declare module.exports: any; +} + +declare module 'vue/src/platforms/weex/runtime/modules/class' { + declare module.exports: any; +} + +declare module 'vue/src/platforms/weex/runtime/modules/events' { + declare module.exports: any; +} + +declare module 'vue/src/platforms/weex/runtime/modules/index' { + declare module.exports: any; +} + +declare module 'vue/src/platforms/weex/runtime/modules/style' { + declare module.exports: any; +} + +declare module 'vue/src/platforms/weex/runtime/modules/transition' { + declare module.exports: any; +} + +declare module 'vue/src/platforms/weex/runtime/node-ops' { + declare module.exports: any; +} + +declare module 'vue/src/platforms/weex/runtime/patch' { + declare module.exports: any; +} + +declare module 'vue/src/platforms/weex/runtime/text-node' { + declare module.exports: any; +} + +declare module 'vue/src/platforms/weex/util/index' { + declare module.exports: any; +} + +declare module 'vue/src/server/bundle-renderer/create-bundle-renderer' { + declare module.exports: any; +} + +declare module 'vue/src/server/bundle-renderer/create-bundle-runner' { + declare module.exports: any; +} + +declare module 'vue/src/server/bundle-renderer/source-map-support' { + declare module.exports: any; +} + +declare module 'vue/src/server/create-basic-renderer' { + declare module.exports: any; +} + +declare module 'vue/src/server/create-renderer' { + declare module.exports: any; +} + +declare module 'vue/src/server/optimizing-compiler/codegen' { + declare module.exports: any; +} + +declare module 'vue/src/server/optimizing-compiler/index' { + declare module.exports: any; +} + +declare module 'vue/src/server/optimizing-compiler/modules' { + declare module.exports: any; +} + +declare module 'vue/src/server/optimizing-compiler/optimizer' { + declare module.exports: any; +} + +declare module 'vue/src/server/optimizing-compiler/runtime-helpers' { + declare module.exports: any; +} + +declare module 'vue/src/server/render-context' { + declare module.exports: any; +} + +declare module 'vue/src/server/render-stream' { + declare module.exports: any; +} + +declare module 'vue/src/server/render' { + declare module.exports: any; +} + +declare module 'vue/src/server/template-renderer/create-async-file-mapper' { + declare module.exports: any; +} + +declare module 'vue/src/server/template-renderer/index' { + declare module.exports: any; +} + +declare module 'vue/src/server/template-renderer/parse-template' { + declare module.exports: any; +} + +declare module 'vue/src/server/template-renderer/template-stream' { + declare module.exports: any; +} + +declare module 'vue/src/server/util' { + declare module.exports: any; +} + +declare module 'vue/src/server/webpack-plugin/client' { + declare module.exports: any; +} + +declare module 'vue/src/server/webpack-plugin/server' { + declare module.exports: any; +} + +declare module 'vue/src/server/webpack-plugin/util' { + declare module.exports: any; +} + +declare module 'vue/src/server/write' { + declare module.exports: any; +} + +declare module 'vue/src/sfc/parser' { + declare module.exports: any; +} + +declare module 'vue/src/shared/constants' { + declare module.exports: any; +} + +declare module 'vue/src/shared/util' { + declare module.exports: any; +} + +// Filename aliases +declare module 'vue/dist/vue.common.js' { + declare module.exports: $Exports<'vue/dist/vue.common'>; +} +declare module 'vue/dist/vue.esm.js' { + declare module.exports: $Exports<'vue/dist/vue.esm'>; +} +declare module 'vue/dist/vue.js' { + declare module.exports: $Exports<'vue/dist/vue'>; +} +declare module 'vue/dist/vue.min.js' { + declare module.exports: $Exports<'vue/dist/vue.min'>; +} +declare module 'vue/dist/vue.runtime.common.js' { + declare module.exports: $Exports<'vue/dist/vue.runtime.common'>; +} +declare module 'vue/dist/vue.runtime.esm.js' { + declare module.exports: $Exports<'vue/dist/vue.runtime.esm'>; +} +declare module 'vue/dist/vue.runtime.js' { + declare module.exports: $Exports<'vue/dist/vue.runtime'>; +} +declare module 'vue/dist/vue.runtime.min.js' { + declare module.exports: $Exports<'vue/dist/vue.runtime.min'>; +} +declare module 'vue/src/compiler/codegen/events.js' { + declare module.exports: $Exports<'vue/src/compiler/codegen/events'>; +} +declare module 'vue/src/compiler/codegen/index.js' { + declare module.exports: $Exports<'vue/src/compiler/codegen/index'>; +} +declare module 'vue/src/compiler/create-compiler.js' { + declare module.exports: $Exports<'vue/src/compiler/create-compiler'>; +} +declare module 'vue/src/compiler/directives/bind.js' { + declare module.exports: $Exports<'vue/src/compiler/directives/bind'>; +} +declare module 'vue/src/compiler/directives/index.js' { + declare module.exports: $Exports<'vue/src/compiler/directives/index'>; +} +declare module 'vue/src/compiler/directives/model.js' { + declare module.exports: $Exports<'vue/src/compiler/directives/model'>; +} +declare module 'vue/src/compiler/directives/on.js' { + declare module.exports: $Exports<'vue/src/compiler/directives/on'>; +} +declare module 'vue/src/compiler/error-detector.js' { + declare module.exports: $Exports<'vue/src/compiler/error-detector'>; +} +declare module 'vue/src/compiler/helpers.js' { + declare module.exports: $Exports<'vue/src/compiler/helpers'>; +} +declare module 'vue/src/compiler/index.js' { + declare module.exports: $Exports<'vue/src/compiler/index'>; +} +declare module 'vue/src/compiler/optimizer.js' { + declare module.exports: $Exports<'vue/src/compiler/optimizer'>; +} +declare module 'vue/src/compiler/parser/entity-decoder.js' { + declare module.exports: $Exports<'vue/src/compiler/parser/entity-decoder'>; +} +declare module 'vue/src/compiler/parser/filter-parser.js' { + declare module.exports: $Exports<'vue/src/compiler/parser/filter-parser'>; +} +declare module 'vue/src/compiler/parser/html-parser.js' { + declare module.exports: $Exports<'vue/src/compiler/parser/html-parser'>; +} +declare module 'vue/src/compiler/parser/index.js' { + declare module.exports: $Exports<'vue/src/compiler/parser/index'>; +} +declare module 'vue/src/compiler/parser/text-parser.js' { + declare module.exports: $Exports<'vue/src/compiler/parser/text-parser'>; +} +declare module 'vue/src/compiler/to-function.js' { + declare module.exports: $Exports<'vue/src/compiler/to-function'>; +} +declare module 'vue/src/core/components/index.js' { + declare module.exports: $Exports<'vue/src/core/components/index'>; +} +declare module 'vue/src/core/components/keep-alive.js' { + declare module.exports: $Exports<'vue/src/core/components/keep-alive'>; +} +declare module 'vue/src/core/config.js' { + declare module.exports: $Exports<'vue/src/core/config'>; +} +declare module 'vue/src/core/global-api/assets.js' { + declare module.exports: $Exports<'vue/src/core/global-api/assets'>; +} +declare module 'vue/src/core/global-api/extend.js' { + declare module.exports: $Exports<'vue/src/core/global-api/extend'>; +} +declare module 'vue/src/core/global-api/index.js' { + declare module.exports: $Exports<'vue/src/core/global-api/index'>; +} +declare module 'vue/src/core/global-api/mixin.js' { + declare module.exports: $Exports<'vue/src/core/global-api/mixin'>; +} +declare module 'vue/src/core/global-api/use.js' { + declare module.exports: $Exports<'vue/src/core/global-api/use'>; +} +declare module 'vue/src/core/index.js' { + declare module.exports: $Exports<'vue/src/core/index'>; +} +declare module 'vue/src/core/instance/events.js' { + declare module.exports: $Exports<'vue/src/core/instance/events'>; +} +declare module 'vue/src/core/instance/index.js' { + declare module.exports: $Exports<'vue/src/core/instance/index'>; +} +declare module 'vue/src/core/instance/init.js' { + declare module.exports: $Exports<'vue/src/core/instance/init'>; +} +declare module 'vue/src/core/instance/inject.js' { + declare module.exports: $Exports<'vue/src/core/instance/inject'>; +} +declare module 'vue/src/core/instance/lifecycle.js' { + declare module.exports: $Exports<'vue/src/core/instance/lifecycle'>; +} +declare module 'vue/src/core/instance/proxy.js' { + declare module.exports: $Exports<'vue/src/core/instance/proxy'>; +} +declare module 'vue/src/core/instance/render-helpers/bind-object-listeners.js' { + declare module.exports: $Exports<'vue/src/core/instance/render-helpers/bind-object-listeners'>; +} +declare module 'vue/src/core/instance/render-helpers/bind-object-props.js' { + declare module.exports: $Exports<'vue/src/core/instance/render-helpers/bind-object-props'>; +} +declare module 'vue/src/core/instance/render-helpers/check-keycodes.js' { + declare module.exports: $Exports<'vue/src/core/instance/render-helpers/check-keycodes'>; +} +declare module 'vue/src/core/instance/render-helpers/render-list.js' { + declare module.exports: $Exports<'vue/src/core/instance/render-helpers/render-list'>; +} +declare module 'vue/src/core/instance/render-helpers/render-slot.js' { + declare module.exports: $Exports<'vue/src/core/instance/render-helpers/render-slot'>; +} +declare module 'vue/src/core/instance/render-helpers/render-static.js' { + declare module.exports: $Exports<'vue/src/core/instance/render-helpers/render-static'>; +} +declare module 'vue/src/core/instance/render-helpers/resolve-filter.js' { + declare module.exports: $Exports<'vue/src/core/instance/render-helpers/resolve-filter'>; +} +declare module 'vue/src/core/instance/render-helpers/resolve-slots.js' { + declare module.exports: $Exports<'vue/src/core/instance/render-helpers/resolve-slots'>; +} +declare module 'vue/src/core/instance/render.js' { + declare module.exports: $Exports<'vue/src/core/instance/render'>; +} +declare module 'vue/src/core/instance/state.js' { + declare module.exports: $Exports<'vue/src/core/instance/state'>; +} +declare module 'vue/src/core/observer/array.js' { + declare module.exports: $Exports<'vue/src/core/observer/array'>; +} +declare module 'vue/src/core/observer/dep.js' { + declare module.exports: $Exports<'vue/src/core/observer/dep'>; +} +declare module 'vue/src/core/observer/index.js' { + declare module.exports: $Exports<'vue/src/core/observer/index'>; +} +declare module 'vue/src/core/observer/scheduler.js' { + declare module.exports: $Exports<'vue/src/core/observer/scheduler'>; +} +declare module 'vue/src/core/observer/watcher.js' { + declare module.exports: $Exports<'vue/src/core/observer/watcher'>; +} +declare module 'vue/src/core/util/debug.js' { + declare module.exports: $Exports<'vue/src/core/util/debug'>; +} +declare module 'vue/src/core/util/env.js' { + declare module.exports: $Exports<'vue/src/core/util/env'>; +} +declare module 'vue/src/core/util/error.js' { + declare module.exports: $Exports<'vue/src/core/util/error'>; +} +declare module 'vue/src/core/util/index.js' { + declare module.exports: $Exports<'vue/src/core/util/index'>; +} +declare module 'vue/src/core/util/lang.js' { + declare module.exports: $Exports<'vue/src/core/util/lang'>; +} +declare module 'vue/src/core/util/options.js' { + declare module.exports: $Exports<'vue/src/core/util/options'>; +} +declare module 'vue/src/core/util/perf.js' { + declare module.exports: $Exports<'vue/src/core/util/perf'>; +} +declare module 'vue/src/core/util/props.js' { + declare module.exports: $Exports<'vue/src/core/util/props'>; +} +declare module 'vue/src/core/vdom/create-component.js' { + declare module.exports: $Exports<'vue/src/core/vdom/create-component'>; +} +declare module 'vue/src/core/vdom/create-element.js' { + declare module.exports: $Exports<'vue/src/core/vdom/create-element'>; +} +declare module 'vue/src/core/vdom/create-functional-component.js' { + declare module.exports: $Exports<'vue/src/core/vdom/create-functional-component'>; +} +declare module 'vue/src/core/vdom/helpers/extract-props.js' { + declare module.exports: $Exports<'vue/src/core/vdom/helpers/extract-props'>; +} +declare module 'vue/src/core/vdom/helpers/get-first-component-child.js' { + declare module.exports: $Exports<'vue/src/core/vdom/helpers/get-first-component-child'>; +} +declare module 'vue/src/core/vdom/helpers/index.js' { + declare module.exports: $Exports<'vue/src/core/vdom/helpers/index'>; +} +declare module 'vue/src/core/vdom/helpers/merge-hook.js' { + declare module.exports: $Exports<'vue/src/core/vdom/helpers/merge-hook'>; +} +declare module 'vue/src/core/vdom/helpers/normalize-children.js' { + declare module.exports: $Exports<'vue/src/core/vdom/helpers/normalize-children'>; +} +declare module 'vue/src/core/vdom/helpers/resolve-async-component.js' { + declare module.exports: $Exports<'vue/src/core/vdom/helpers/resolve-async-component'>; +} +declare module 'vue/src/core/vdom/helpers/update-listeners.js' { + declare module.exports: $Exports<'vue/src/core/vdom/helpers/update-listeners'>; +} +declare module 'vue/src/core/vdom/modules/directives.js' { + declare module.exports: $Exports<'vue/src/core/vdom/modules/directives'>; +} +declare module 'vue/src/core/vdom/modules/index.js' { + declare module.exports: $Exports<'vue/src/core/vdom/modules/index'>; +} +declare module 'vue/src/core/vdom/modules/ref.js' { + declare module.exports: $Exports<'vue/src/core/vdom/modules/ref'>; +} +declare module 'vue/src/core/vdom/patch.js' { + declare module.exports: $Exports<'vue/src/core/vdom/patch'>; +} +declare module 'vue/src/core/vdom/vnode.js' { + declare module.exports: $Exports<'vue/src/core/vdom/vnode'>; +} +declare module 'vue/src/platforms/web/compiler/directives/html.js' { + declare module.exports: $Exports<'vue/src/platforms/web/compiler/directives/html'>; +} +declare module 'vue/src/platforms/web/compiler/directives/index.js' { + declare module.exports: $Exports<'vue/src/platforms/web/compiler/directives/index'>; +} +declare module 'vue/src/platforms/web/compiler/directives/model.js' { + declare module.exports: $Exports<'vue/src/platforms/web/compiler/directives/model'>; +} +declare module 'vue/src/platforms/web/compiler/directives/text.js' { + declare module.exports: $Exports<'vue/src/platforms/web/compiler/directives/text'>; +} +declare module 'vue/src/platforms/web/compiler/index.js' { + declare module.exports: $Exports<'vue/src/platforms/web/compiler/index'>; +} +declare module 'vue/src/platforms/web/compiler/modules/class.js' { + declare module.exports: $Exports<'vue/src/platforms/web/compiler/modules/class'>; +} +declare module 'vue/src/platforms/web/compiler/modules/index.js' { + declare module.exports: $Exports<'vue/src/platforms/web/compiler/modules/index'>; +} +declare module 'vue/src/platforms/web/compiler/modules/style.js' { + declare module.exports: $Exports<'vue/src/platforms/web/compiler/modules/style'>; +} +declare module 'vue/src/platforms/web/compiler/options.js' { + declare module.exports: $Exports<'vue/src/platforms/web/compiler/options'>; +} +declare module 'vue/src/platforms/web/compiler/util.js' { + declare module.exports: $Exports<'vue/src/platforms/web/compiler/util'>; +} +declare module 'vue/src/platforms/web/entry-compiler.js' { + declare module.exports: $Exports<'vue/src/platforms/web/entry-compiler'>; +} +declare module 'vue/src/platforms/web/entry-runtime-with-compiler.js' { + declare module.exports: $Exports<'vue/src/platforms/web/entry-runtime-with-compiler'>; +} +declare module 'vue/src/platforms/web/entry-runtime.js' { + declare module.exports: $Exports<'vue/src/platforms/web/entry-runtime'>; +} +declare module 'vue/src/platforms/web/entry-server-basic-renderer.js' { + declare module.exports: $Exports<'vue/src/platforms/web/entry-server-basic-renderer'>; +} +declare module 'vue/src/platforms/web/entry-server-renderer.js' { + declare module.exports: $Exports<'vue/src/platforms/web/entry-server-renderer'>; +} +declare module 'vue/src/platforms/web/runtime/class-util.js' { + declare module.exports: $Exports<'vue/src/platforms/web/runtime/class-util'>; +} +declare module 'vue/src/platforms/web/runtime/components/index.js' { + declare module.exports: $Exports<'vue/src/platforms/web/runtime/components/index'>; +} +declare module 'vue/src/platforms/web/runtime/components/transition-group.js' { + declare module.exports: $Exports<'vue/src/platforms/web/runtime/components/transition-group'>; +} +declare module 'vue/src/platforms/web/runtime/components/transition.js' { + declare module.exports: $Exports<'vue/src/platforms/web/runtime/components/transition'>; +} +declare module 'vue/src/platforms/web/runtime/directives/index.js' { + declare module.exports: $Exports<'vue/src/platforms/web/runtime/directives/index'>; +} +declare module 'vue/src/platforms/web/runtime/directives/model.js' { + declare module.exports: $Exports<'vue/src/platforms/web/runtime/directives/model'>; +} +declare module 'vue/src/platforms/web/runtime/directives/show.js' { + declare module.exports: $Exports<'vue/src/platforms/web/runtime/directives/show'>; +} +declare module 'vue/src/platforms/web/runtime/index.js' { + declare module.exports: $Exports<'vue/src/platforms/web/runtime/index'>; +} +declare module 'vue/src/platforms/web/runtime/modules/attrs.js' { + declare module.exports: $Exports<'vue/src/platforms/web/runtime/modules/attrs'>; +} +declare module 'vue/src/platforms/web/runtime/modules/class.js' { + declare module.exports: $Exports<'vue/src/platforms/web/runtime/modules/class'>; +} +declare module 'vue/src/platforms/web/runtime/modules/dom-props.js' { + declare module.exports: $Exports<'vue/src/platforms/web/runtime/modules/dom-props'>; +} +declare module 'vue/src/platforms/web/runtime/modules/events.js' { + declare module.exports: $Exports<'vue/src/platforms/web/runtime/modules/events'>; +} +declare module 'vue/src/platforms/web/runtime/modules/index.js' { + declare module.exports: $Exports<'vue/src/platforms/web/runtime/modules/index'>; +} +declare module 'vue/src/platforms/web/runtime/modules/style.js' { + declare module.exports: $Exports<'vue/src/platforms/web/runtime/modules/style'>; +} +declare module 'vue/src/platforms/web/runtime/modules/transition.js' { + declare module.exports: $Exports<'vue/src/platforms/web/runtime/modules/transition'>; +} +declare module 'vue/src/platforms/web/runtime/node-ops.js' { + declare module.exports: $Exports<'vue/src/platforms/web/runtime/node-ops'>; +} +declare module 'vue/src/platforms/web/runtime/patch.js' { + declare module.exports: $Exports<'vue/src/platforms/web/runtime/patch'>; +} +declare module 'vue/src/platforms/web/runtime/transition-util.js' { + declare module.exports: $Exports<'vue/src/platforms/web/runtime/transition-util'>; +} +declare module 'vue/src/platforms/web/server/compiler.js' { + declare module.exports: $Exports<'vue/src/platforms/web/server/compiler'>; +} +declare module 'vue/src/platforms/web/server/directives/index.js' { + declare module.exports: $Exports<'vue/src/platforms/web/server/directives/index'>; +} +declare module 'vue/src/platforms/web/server/directives/show.js' { + declare module.exports: $Exports<'vue/src/platforms/web/server/directives/show'>; +} +declare module 'vue/src/platforms/web/server/modules/attrs.js' { + declare module.exports: $Exports<'vue/src/platforms/web/server/modules/attrs'>; +} +declare module 'vue/src/platforms/web/server/modules/class.js' { + declare module.exports: $Exports<'vue/src/platforms/web/server/modules/class'>; +} +declare module 'vue/src/platforms/web/server/modules/dom-props.js' { + declare module.exports: $Exports<'vue/src/platforms/web/server/modules/dom-props'>; +} +declare module 'vue/src/platforms/web/server/modules/index.js' { + declare module.exports: $Exports<'vue/src/platforms/web/server/modules/index'>; +} +declare module 'vue/src/platforms/web/server/modules/style.js' { + declare module.exports: $Exports<'vue/src/platforms/web/server/modules/style'>; +} +declare module 'vue/src/platforms/web/server/util.js' { + declare module.exports: $Exports<'vue/src/platforms/web/server/util'>; +} +declare module 'vue/src/platforms/web/util/attrs.js' { + declare module.exports: $Exports<'vue/src/platforms/web/util/attrs'>; +} +declare module 'vue/src/platforms/web/util/class.js' { + declare module.exports: $Exports<'vue/src/platforms/web/util/class'>; +} +declare module 'vue/src/platforms/web/util/compat.js' { + declare module.exports: $Exports<'vue/src/platforms/web/util/compat'>; +} +declare module 'vue/src/platforms/web/util/element.js' { + declare module.exports: $Exports<'vue/src/platforms/web/util/element'>; +} +declare module 'vue/src/platforms/web/util/index.js' { + declare module.exports: $Exports<'vue/src/platforms/web/util/index'>; +} +declare module 'vue/src/platforms/web/util/style.js' { + declare module.exports: $Exports<'vue/src/platforms/web/util/style'>; +} +declare module 'vue/src/platforms/weex/compiler/directives/index.js' { + declare module.exports: $Exports<'vue/src/platforms/weex/compiler/directives/index'>; +} +declare module 'vue/src/platforms/weex/compiler/directives/model.js' { + declare module.exports: $Exports<'vue/src/platforms/weex/compiler/directives/model'>; +} +declare module 'vue/src/platforms/weex/compiler/index.js' { + declare module.exports: $Exports<'vue/src/platforms/weex/compiler/index'>; +} +declare module 'vue/src/platforms/weex/compiler/modules/append.js' { + declare module.exports: $Exports<'vue/src/platforms/weex/compiler/modules/append'>; +} +declare module 'vue/src/platforms/weex/compiler/modules/class.js' { + declare module.exports: $Exports<'vue/src/platforms/weex/compiler/modules/class'>; +} +declare module 'vue/src/platforms/weex/compiler/modules/index.js' { + declare module.exports: $Exports<'vue/src/platforms/weex/compiler/modules/index'>; +} +declare module 'vue/src/platforms/weex/compiler/modules/props.js' { + declare module.exports: $Exports<'vue/src/platforms/weex/compiler/modules/props'>; +} +declare module 'vue/src/platforms/weex/compiler/modules/style.js' { + declare module.exports: $Exports<'vue/src/platforms/weex/compiler/modules/style'>; +} +declare module 'vue/src/platforms/weex/entry-compiler.js' { + declare module.exports: $Exports<'vue/src/platforms/weex/entry-compiler'>; +} +declare module 'vue/src/platforms/weex/entry-framework.js' { + declare module.exports: $Exports<'vue/src/platforms/weex/entry-framework'>; +} +declare module 'vue/src/platforms/weex/entry-runtime-factory.js' { + declare module.exports: $Exports<'vue/src/platforms/weex/entry-runtime-factory'>; +} +declare module 'vue/src/platforms/weex/runtime/components/index.js' { + declare module.exports: $Exports<'vue/src/platforms/weex/runtime/components/index'>; +} +declare module 'vue/src/platforms/weex/runtime/components/transition-group.js' { + declare module.exports: $Exports<'vue/src/platforms/weex/runtime/components/transition-group'>; +} +declare module 'vue/src/platforms/weex/runtime/components/transition.js' { + declare module.exports: $Exports<'vue/src/platforms/weex/runtime/components/transition'>; +} +declare module 'vue/src/platforms/weex/runtime/directives/index.js' { + declare module.exports: $Exports<'vue/src/platforms/weex/runtime/directives/index'>; +} +declare module 'vue/src/platforms/weex/runtime/index.js' { + declare module.exports: $Exports<'vue/src/platforms/weex/runtime/index'>; +} +declare module 'vue/src/platforms/weex/runtime/modules/attrs.js' { + declare module.exports: $Exports<'vue/src/platforms/weex/runtime/modules/attrs'>; +} +declare module 'vue/src/platforms/weex/runtime/modules/class.js' { + declare module.exports: $Exports<'vue/src/platforms/weex/runtime/modules/class'>; +} +declare module 'vue/src/platforms/weex/runtime/modules/events.js' { + declare module.exports: $Exports<'vue/src/platforms/weex/runtime/modules/events'>; +} +declare module 'vue/src/platforms/weex/runtime/modules/index.js' { + declare module.exports: $Exports<'vue/src/platforms/weex/runtime/modules/index'>; +} +declare module 'vue/src/platforms/weex/runtime/modules/style.js' { + declare module.exports: $Exports<'vue/src/platforms/weex/runtime/modules/style'>; +} +declare module 'vue/src/platforms/weex/runtime/modules/transition.js' { + declare module.exports: $Exports<'vue/src/platforms/weex/runtime/modules/transition'>; +} +declare module 'vue/src/platforms/weex/runtime/node-ops.js' { + declare module.exports: $Exports<'vue/src/platforms/weex/runtime/node-ops'>; +} +declare module 'vue/src/platforms/weex/runtime/patch.js' { + declare module.exports: $Exports<'vue/src/platforms/weex/runtime/patch'>; +} +declare module 'vue/src/platforms/weex/runtime/text-node.js' { + declare module.exports: $Exports<'vue/src/platforms/weex/runtime/text-node'>; +} +declare module 'vue/src/platforms/weex/util/index.js' { + declare module.exports: $Exports<'vue/src/platforms/weex/util/index'>; +} +declare module 'vue/src/server/bundle-renderer/create-bundle-renderer.js' { + declare module.exports: $Exports<'vue/src/server/bundle-renderer/create-bundle-renderer'>; +} +declare module 'vue/src/server/bundle-renderer/create-bundle-runner.js' { + declare module.exports: $Exports<'vue/src/server/bundle-renderer/create-bundle-runner'>; +} +declare module 'vue/src/server/bundle-renderer/source-map-support.js' { + declare module.exports: $Exports<'vue/src/server/bundle-renderer/source-map-support'>; +} +declare module 'vue/src/server/create-basic-renderer.js' { + declare module.exports: $Exports<'vue/src/server/create-basic-renderer'>; +} +declare module 'vue/src/server/create-renderer.js' { + declare module.exports: $Exports<'vue/src/server/create-renderer'>; +} +declare module 'vue/src/server/optimizing-compiler/codegen.js' { + declare module.exports: $Exports<'vue/src/server/optimizing-compiler/codegen'>; +} +declare module 'vue/src/server/optimizing-compiler/index.js' { + declare module.exports: $Exports<'vue/src/server/optimizing-compiler/index'>; +} +declare module 'vue/src/server/optimizing-compiler/modules.js' { + declare module.exports: $Exports<'vue/src/server/optimizing-compiler/modules'>; +} +declare module 'vue/src/server/optimizing-compiler/optimizer.js' { + declare module.exports: $Exports<'vue/src/server/optimizing-compiler/optimizer'>; +} +declare module 'vue/src/server/optimizing-compiler/runtime-helpers.js' { + declare module.exports: $Exports<'vue/src/server/optimizing-compiler/runtime-helpers'>; +} +declare module 'vue/src/server/render-context.js' { + declare module.exports: $Exports<'vue/src/server/render-context'>; +} +declare module 'vue/src/server/render-stream.js' { + declare module.exports: $Exports<'vue/src/server/render-stream'>; +} +declare module 'vue/src/server/render.js' { + declare module.exports: $Exports<'vue/src/server/render'>; +} +declare module 'vue/src/server/template-renderer/create-async-file-mapper.js' { + declare module.exports: $Exports<'vue/src/server/template-renderer/create-async-file-mapper'>; +} +declare module 'vue/src/server/template-renderer/index.js' { + declare module.exports: $Exports<'vue/src/server/template-renderer/index'>; +} +declare module 'vue/src/server/template-renderer/parse-template.js' { + declare module.exports: $Exports<'vue/src/server/template-renderer/parse-template'>; +} +declare module 'vue/src/server/template-renderer/template-stream.js' { + declare module.exports: $Exports<'vue/src/server/template-renderer/template-stream'>; +} +declare module 'vue/src/server/util.js' { + declare module.exports: $Exports<'vue/src/server/util'>; +} +declare module 'vue/src/server/webpack-plugin/client.js' { + declare module.exports: $Exports<'vue/src/server/webpack-plugin/client'>; +} +declare module 'vue/src/server/webpack-plugin/server.js' { + declare module.exports: $Exports<'vue/src/server/webpack-plugin/server'>; +} +declare module 'vue/src/server/webpack-plugin/util.js' { + declare module.exports: $Exports<'vue/src/server/webpack-plugin/util'>; +} +declare module 'vue/src/server/write.js' { + declare module.exports: $Exports<'vue/src/server/write'>; +} +declare module 'vue/src/sfc/parser.js' { + declare module.exports: $Exports<'vue/src/sfc/parser'>; +} +declare module 'vue/src/shared/constants.js' { + declare module.exports: $Exports<'vue/src/shared/constants'>; +} +declare module 'vue/src/shared/util.js' { + declare module.exports: $Exports<'vue/src/shared/util'>; +} diff --git a/flow-typed/npm/webpack-dev-server_vx.x.x.js b/flow-typed/npm/webpack-dev-server_vx.x.x.js new file mode 100644 index 00000000..34261521 --- /dev/null +++ b/flow-typed/npm/webpack-dev-server_vx.x.x.js @@ -0,0 +1,151 @@ +// flow-typed signature: 162893f2e7d568a32f79aed973446735 +// flow-typed version: <>/webpack-dev-server_v^2.10.0/flow_v0.63.1 + +/** + * This is an autogenerated libdef stub for: + * + * 'webpack-dev-server' + * + * Fill this stub out by replacing all the `any` types. + * + * Once filled out, we encourage you to share your work with the + * community by sending a pull request to: + * https://github.com/flowtype/flow-typed + */ + +declare module 'webpack-dev-server' { + declare module.exports: any; +} + +/** + * We include stubs for each file inside this npm package in case you need to + * require those files directly. Feel free to delete any files that aren't + * needed. + */ +declare module 'webpack-dev-server/bin/webpack-dev-server' { + declare module.exports: any; +} + +declare module 'webpack-dev-server/client/index.bundle' { + declare module.exports: any; +} + +declare module 'webpack-dev-server/client/index' { + declare module.exports: any; +} + +declare module 'webpack-dev-server/client/live.bundle' { + declare module.exports: any; +} + +declare module 'webpack-dev-server/client/live' { + declare module.exports: any; +} + +declare module 'webpack-dev-server/client/overlay' { + declare module.exports: any; +} + +declare module 'webpack-dev-server/client/socket' { + declare module.exports: any; +} + +declare module 'webpack-dev-server/client/sockjs.bundle' { + declare module.exports: any; +} + +declare module 'webpack-dev-server/client/sockjs' { + declare module.exports: any; +} + +declare module 'webpack-dev-server/client/web_modules/jquery/index' { + declare module.exports: any; +} + +declare module 'webpack-dev-server/client/web_modules/jquery/jquery-1.8.1' { + declare module.exports: any; +} + +declare module 'webpack-dev-server/client/webpack.config' { + declare module.exports: any; +} + +declare module 'webpack-dev-server/client/webpack.sockjs.config' { + declare module.exports: any; +} + +declare module 'webpack-dev-server/lib/OptionsValidationError' { + declare module.exports: any; +} + +declare module 'webpack-dev-server/lib/polyfills' { + declare module.exports: any; +} + +declare module 'webpack-dev-server/lib/Server' { + declare module.exports: any; +} + +declare module 'webpack-dev-server/lib/util/addDevServerEntrypoints' { + declare module.exports: any; +} + +declare module 'webpack-dev-server/lib/util/createDomain' { + declare module.exports: any; +} + +// Filename aliases +declare module 'webpack-dev-server/bin/webpack-dev-server.js' { + declare module.exports: $Exports<'webpack-dev-server/bin/webpack-dev-server'>; +} +declare module 'webpack-dev-server/client/index.bundle.js' { + declare module.exports: $Exports<'webpack-dev-server/client/index.bundle'>; +} +declare module 'webpack-dev-server/client/index.js' { + declare module.exports: $Exports<'webpack-dev-server/client/index'>; +} +declare module 'webpack-dev-server/client/live.bundle.js' { + declare module.exports: $Exports<'webpack-dev-server/client/live.bundle'>; +} +declare module 'webpack-dev-server/client/live.js' { + declare module.exports: $Exports<'webpack-dev-server/client/live'>; +} +declare module 'webpack-dev-server/client/overlay.js' { + declare module.exports: $Exports<'webpack-dev-server/client/overlay'>; +} +declare module 'webpack-dev-server/client/socket.js' { + declare module.exports: $Exports<'webpack-dev-server/client/socket'>; +} +declare module 'webpack-dev-server/client/sockjs.bundle.js' { + declare module.exports: $Exports<'webpack-dev-server/client/sockjs.bundle'>; +} +declare module 'webpack-dev-server/client/sockjs.js' { + declare module.exports: $Exports<'webpack-dev-server/client/sockjs'>; +} +declare module 'webpack-dev-server/client/web_modules/jquery/index.js' { + declare module.exports: $Exports<'webpack-dev-server/client/web_modules/jquery/index'>; +} +declare module 'webpack-dev-server/client/web_modules/jquery/jquery-1.8.1.js' { + declare module.exports: $Exports<'webpack-dev-server/client/web_modules/jquery/jquery-1.8.1'>; +} +declare module 'webpack-dev-server/client/webpack.config.js' { + declare module.exports: $Exports<'webpack-dev-server/client/webpack.config'>; +} +declare module 'webpack-dev-server/client/webpack.sockjs.config.js' { + declare module.exports: $Exports<'webpack-dev-server/client/webpack.sockjs.config'>; +} +declare module 'webpack-dev-server/lib/OptionsValidationError.js' { + declare module.exports: $Exports<'webpack-dev-server/lib/OptionsValidationError'>; +} +declare module 'webpack-dev-server/lib/polyfills.js' { + declare module.exports: $Exports<'webpack-dev-server/lib/polyfills'>; +} +declare module 'webpack-dev-server/lib/Server.js' { + declare module.exports: $Exports<'webpack-dev-server/lib/Server'>; +} +declare module 'webpack-dev-server/lib/util/addDevServerEntrypoints.js' { + declare module.exports: $Exports<'webpack-dev-server/lib/util/addDevServerEntrypoints'>; +} +declare module 'webpack-dev-server/lib/util/createDomain.js' { + declare module.exports: $Exports<'webpack-dev-server/lib/util/createDomain'>; +} diff --git a/flow-typed/npm/webpack_vx.x.x.js b/flow-typed/npm/webpack_vx.x.x.js new file mode 100644 index 00000000..766c1fe8 --- /dev/null +++ b/flow-typed/npm/webpack_vx.x.x.js @@ -0,0 +1,1957 @@ +// flow-typed signature: 3330876feb18875b3f070fc7d5c15d6e +// flow-typed version: <>/webpack_v~3.10.0/flow_v0.63.1 + +/** + * This is an autogenerated libdef stub for: + * + * 'webpack' + * + * Fill this stub out by replacing all the `any` types. + * + * Once filled out, we encourage you to share your work with the + * community by sending a pull request to: + * https://github.com/flowtype/flow-typed + */ + +declare module 'webpack' { + declare module.exports: any; +} + +/** + * We include stubs for each file inside this npm package in case you need to + * require those files directly. Feel free to delete any files that aren't + * needed. + */ +declare module 'webpack/bin/config-optimist' { + declare module.exports: any; +} + +declare module 'webpack/bin/config-yargs' { + declare module.exports: any; +} + +declare module 'webpack/bin/convert-argv' { + declare module.exports: any; +} + +declare module 'webpack/bin/webpack' { + declare module.exports: any; +} + +declare module 'webpack/buildin/amd-define' { + declare module.exports: any; +} + +declare module 'webpack/buildin/amd-options' { + declare module.exports: any; +} + +declare module 'webpack/buildin/global' { + declare module.exports: any; +} + +declare module 'webpack/buildin/harmony-module' { + declare module.exports: any; +} + +declare module 'webpack/buildin/module' { + declare module.exports: any; +} + +declare module 'webpack/buildin/system' { + declare module.exports: any; +} + +declare module 'webpack/hot/dev-server' { + declare module.exports: any; +} + +declare module 'webpack/hot/emitter' { + declare module.exports: any; +} + +declare module 'webpack/hot/log-apply-result' { + declare module.exports: any; +} + +declare module 'webpack/hot/log' { + declare module.exports: any; +} + +declare module 'webpack/hot/only-dev-server' { + declare module.exports: any; +} + +declare module 'webpack/hot/poll' { + declare module.exports: any; +} + +declare module 'webpack/hot/signal' { + declare module.exports: any; +} + +declare module 'webpack/lib/AmdMainTemplatePlugin' { + declare module.exports: any; +} + +declare module 'webpack/lib/APIPlugin' { + declare module.exports: any; +} + +declare module 'webpack/lib/AsyncDependenciesBlock' { + declare module.exports: any; +} + +declare module 'webpack/lib/AsyncDependencyToInitialChunkWarning' { + declare module.exports: any; +} + +declare module 'webpack/lib/AutomaticPrefetchPlugin' { + declare module.exports: any; +} + +declare module 'webpack/lib/BannerPlugin' { + declare module.exports: any; +} + +declare module 'webpack/lib/BasicEvaluatedExpression' { + declare module.exports: any; +} + +declare module 'webpack/lib/CachePlugin' { + declare module.exports: any; +} + +declare module 'webpack/lib/CaseSensitiveModulesWarning' { + declare module.exports: any; +} + +declare module 'webpack/lib/Chunk' { + declare module.exports: any; +} + +declare module 'webpack/lib/ChunkRenderError' { + declare module.exports: any; +} + +declare module 'webpack/lib/ChunkTemplate' { + declare module.exports: any; +} + +declare module 'webpack/lib/compareLocations' { + declare module.exports: any; +} + +declare module 'webpack/lib/CompatibilityPlugin' { + declare module.exports: any; +} + +declare module 'webpack/lib/Compilation' { + declare module.exports: any; +} + +declare module 'webpack/lib/Compiler' { + declare module.exports: any; +} + +declare module 'webpack/lib/ConstPlugin' { + declare module.exports: any; +} + +declare module 'webpack/lib/ContextExclusionPlugin' { + declare module.exports: any; +} + +declare module 'webpack/lib/ContextModule' { + declare module.exports: any; +} + +declare module 'webpack/lib/ContextModuleFactory' { + declare module.exports: any; +} + +declare module 'webpack/lib/ContextReplacementPlugin' { + declare module.exports: any; +} + +declare module 'webpack/lib/DefinePlugin' { + declare module.exports: any; +} + +declare module 'webpack/lib/DelegatedModule' { + declare module.exports: any; +} + +declare module 'webpack/lib/DelegatedModuleFactoryPlugin' { + declare module.exports: any; +} + +declare module 'webpack/lib/DelegatedPlugin' { + declare module.exports: any; +} + +declare module 'webpack/lib/dependencies/AMDDefineDependency' { + declare module.exports: any; +} + +declare module 'webpack/lib/dependencies/AMDDefineDependencyParserPlugin' { + declare module.exports: any; +} + +declare module 'webpack/lib/dependencies/AMDPlugin' { + declare module.exports: any; +} + +declare module 'webpack/lib/dependencies/AMDRequireArrayDependency' { + declare module.exports: any; +} + +declare module 'webpack/lib/dependencies/AMDRequireContextDependency' { + declare module.exports: any; +} + +declare module 'webpack/lib/dependencies/AMDRequireDependenciesBlock' { + declare module.exports: any; +} + +declare module 'webpack/lib/dependencies/AMDRequireDependenciesBlockParserPlugin' { + declare module.exports: any; +} + +declare module 'webpack/lib/dependencies/AMDRequireDependency' { + declare module.exports: any; +} + +declare module 'webpack/lib/dependencies/AMDRequireItemDependency' { + declare module.exports: any; +} + +declare module 'webpack/lib/dependencies/CommonJsPlugin' { + declare module.exports: any; +} + +declare module 'webpack/lib/dependencies/CommonJsRequireContextDependency' { + declare module.exports: any; +} + +declare module 'webpack/lib/dependencies/CommonJsRequireDependency' { + declare module.exports: any; +} + +declare module 'webpack/lib/dependencies/CommonJsRequireDependencyParserPlugin' { + declare module.exports: any; +} + +declare module 'webpack/lib/dependencies/ConstDependency' { + declare module.exports: any; +} + +declare module 'webpack/lib/dependencies/ContextDependency' { + declare module.exports: any; +} + +declare module 'webpack/lib/dependencies/ContextDependencyHelpers' { + declare module.exports: any; +} + +declare module 'webpack/lib/dependencies/ContextDependencyTemplateAsId' { + declare module.exports: any; +} + +declare module 'webpack/lib/dependencies/ContextDependencyTemplateAsRequireCall' { + declare module.exports: any; +} + +declare module 'webpack/lib/dependencies/ContextElementDependency' { + declare module.exports: any; +} + +declare module 'webpack/lib/dependencies/CriticalDependencyWarning' { + declare module.exports: any; +} + +declare module 'webpack/lib/dependencies/DelegatedExportsDependency' { + declare module.exports: any; +} + +declare module 'webpack/lib/dependencies/DelegatedSourceDependency' { + declare module.exports: any; +} + +declare module 'webpack/lib/dependencies/DepBlockHelpers' { + declare module.exports: any; +} + +declare module 'webpack/lib/dependencies/DllEntryDependency' { + declare module.exports: any; +} + +declare module 'webpack/lib/dependencies/getFunctionExpression' { + declare module.exports: any; +} + +declare module 'webpack/lib/dependencies/HarmonyAcceptDependency' { + declare module.exports: any; +} + +declare module 'webpack/lib/dependencies/HarmonyAcceptImportDependency' { + declare module.exports: any; +} + +declare module 'webpack/lib/dependencies/HarmonyCompatibilityDependency' { + declare module.exports: any; +} + +declare module 'webpack/lib/dependencies/HarmonyDetectionParserPlugin' { + declare module.exports: any; +} + +declare module 'webpack/lib/dependencies/HarmonyExportDependencyParserPlugin' { + declare module.exports: any; +} + +declare module 'webpack/lib/dependencies/HarmonyExportExpressionDependency' { + declare module.exports: any; +} + +declare module 'webpack/lib/dependencies/HarmonyExportHeaderDependency' { + declare module.exports: any; +} + +declare module 'webpack/lib/dependencies/HarmonyExportImportedSpecifierDependency' { + declare module.exports: any; +} + +declare module 'webpack/lib/dependencies/HarmonyExportSpecifierDependency' { + declare module.exports: any; +} + +declare module 'webpack/lib/dependencies/HarmonyImportDependency' { + declare module.exports: any; +} + +declare module 'webpack/lib/dependencies/HarmonyImportDependencyParserPlugin' { + declare module.exports: any; +} + +declare module 'webpack/lib/dependencies/HarmonyImportSpecifierDependency' { + declare module.exports: any; +} + +declare module 'webpack/lib/dependencies/HarmonyModulesHelpers' { + declare module.exports: any; +} + +declare module 'webpack/lib/dependencies/HarmonyModulesPlugin' { + declare module.exports: any; +} + +declare module 'webpack/lib/dependencies/ImportContextDependency' { + declare module.exports: any; +} + +declare module 'webpack/lib/dependencies/ImportDependenciesBlock' { + declare module.exports: any; +} + +declare module 'webpack/lib/dependencies/ImportDependency' { + declare module.exports: any; +} + +declare module 'webpack/lib/dependencies/ImportEagerContextDependency' { + declare module.exports: any; +} + +declare module 'webpack/lib/dependencies/ImportEagerDependency' { + declare module.exports: any; +} + +declare module 'webpack/lib/dependencies/ImportLazyContextDependency' { + declare module.exports: any; +} + +declare module 'webpack/lib/dependencies/ImportLazyOnceContextDependency' { + declare module.exports: any; +} + +declare module 'webpack/lib/dependencies/ImportParserPlugin' { + declare module.exports: any; +} + +declare module 'webpack/lib/dependencies/ImportPlugin' { + declare module.exports: any; +} + +declare module 'webpack/lib/dependencies/ImportWeakContextDependency' { + declare module.exports: any; +} + +declare module 'webpack/lib/dependencies/ImportWeakDependency' { + declare module.exports: any; +} + +declare module 'webpack/lib/dependencies/LoaderDependency' { + declare module.exports: any; +} + +declare module 'webpack/lib/dependencies/LoaderPlugin' { + declare module.exports: any; +} + +declare module 'webpack/lib/dependencies/LocalModule' { + declare module.exports: any; +} + +declare module 'webpack/lib/dependencies/LocalModuleDependency' { + declare module.exports: any; +} + +declare module 'webpack/lib/dependencies/LocalModulesHelpers' { + declare module.exports: any; +} + +declare module 'webpack/lib/dependencies/ModuleDependency' { + declare module.exports: any; +} + +declare module 'webpack/lib/dependencies/ModuleDependencyTemplateAsId' { + declare module.exports: any; +} + +declare module 'webpack/lib/dependencies/ModuleDependencyTemplateAsRequireId' { + declare module.exports: any; +} + +declare module 'webpack/lib/dependencies/ModuleHotAcceptDependency' { + declare module.exports: any; +} + +declare module 'webpack/lib/dependencies/ModuleHotDeclineDependency' { + declare module.exports: any; +} + +declare module 'webpack/lib/dependencies/MultiEntryDependency' { + declare module.exports: any; +} + +declare module 'webpack/lib/dependencies/NullDependency' { + declare module.exports: any; +} + +declare module 'webpack/lib/dependencies/PrefetchDependency' { + declare module.exports: any; +} + +declare module 'webpack/lib/dependencies/RequireContextDependency' { + declare module.exports: any; +} + +declare module 'webpack/lib/dependencies/RequireContextDependencyParserPlugin' { + declare module.exports: any; +} + +declare module 'webpack/lib/dependencies/RequireContextPlugin' { + declare module.exports: any; +} + +declare module 'webpack/lib/dependencies/RequireEnsureDependenciesBlock' { + declare module.exports: any; +} + +declare module 'webpack/lib/dependencies/RequireEnsureDependenciesBlockParserPlugin' { + declare module.exports: any; +} + +declare module 'webpack/lib/dependencies/RequireEnsureDependency' { + declare module.exports: any; +} + +declare module 'webpack/lib/dependencies/RequireEnsureItemDependency' { + declare module.exports: any; +} + +declare module 'webpack/lib/dependencies/RequireEnsurePlugin' { + declare module.exports: any; +} + +declare module 'webpack/lib/dependencies/RequireHeaderDependency' { + declare module.exports: any; +} + +declare module 'webpack/lib/dependencies/RequireIncludeDependency' { + declare module.exports: any; +} + +declare module 'webpack/lib/dependencies/RequireIncludeDependencyParserPlugin' { + declare module.exports: any; +} + +declare module 'webpack/lib/dependencies/RequireIncludePlugin' { + declare module.exports: any; +} + +declare module 'webpack/lib/dependencies/RequireResolveContextDependency' { + declare module.exports: any; +} + +declare module 'webpack/lib/dependencies/RequireResolveDependency' { + declare module.exports: any; +} + +declare module 'webpack/lib/dependencies/RequireResolveDependencyParserPlugin' { + declare module.exports: any; +} + +declare module 'webpack/lib/dependencies/RequireResolveHeaderDependency' { + declare module.exports: any; +} + +declare module 'webpack/lib/dependencies/SingleEntryDependency' { + declare module.exports: any; +} + +declare module 'webpack/lib/dependencies/SystemPlugin' { + declare module.exports: any; +} + +declare module 'webpack/lib/dependencies/UnsupportedDependency' { + declare module.exports: any; +} + +declare module 'webpack/lib/dependencies/WebpackMissingModule' { + declare module.exports: any; +} + +declare module 'webpack/lib/DependenciesBlock' { + declare module.exports: any; +} + +declare module 'webpack/lib/DependenciesBlockVariable' { + declare module.exports: any; +} + +declare module 'webpack/lib/Dependency' { + declare module.exports: any; +} + +declare module 'webpack/lib/DllEntryPlugin' { + declare module.exports: any; +} + +declare module 'webpack/lib/DllModule' { + declare module.exports: any; +} + +declare module 'webpack/lib/DllModuleFactory' { + declare module.exports: any; +} + +declare module 'webpack/lib/DllPlugin' { + declare module.exports: any; +} + +declare module 'webpack/lib/DllReferencePlugin' { + declare module.exports: any; +} + +declare module 'webpack/lib/DynamicEntryPlugin' { + declare module.exports: any; +} + +declare module 'webpack/lib/EntryModuleNotFoundError' { + declare module.exports: any; +} + +declare module 'webpack/lib/EntryOptionPlugin' { + declare module.exports: any; +} + +declare module 'webpack/lib/Entrypoint' { + declare module.exports: any; +} + +declare module 'webpack/lib/EnvironmentPlugin' { + declare module.exports: any; +} + +declare module 'webpack/lib/ErrorHelpers' { + declare module.exports: any; +} + +declare module 'webpack/lib/EvalDevToolModulePlugin' { + declare module.exports: any; +} + +declare module 'webpack/lib/EvalDevToolModuleTemplatePlugin' { + declare module.exports: any; +} + +declare module 'webpack/lib/EvalSourceMapDevToolModuleTemplatePlugin' { + declare module.exports: any; +} + +declare module 'webpack/lib/EvalSourceMapDevToolPlugin' { + declare module.exports: any; +} + +declare module 'webpack/lib/ExportPropertyMainTemplatePlugin' { + declare module.exports: any; +} + +declare module 'webpack/lib/ExtendedAPIPlugin' { + declare module.exports: any; +} + +declare module 'webpack/lib/ExternalModule' { + declare module.exports: any; +} + +declare module 'webpack/lib/ExternalModuleFactoryPlugin' { + declare module.exports: any; +} + +declare module 'webpack/lib/ExternalsPlugin' { + declare module.exports: any; +} + +declare module 'webpack/lib/FlagDependencyExportsPlugin' { + declare module.exports: any; +} + +declare module 'webpack/lib/FlagDependencyUsagePlugin' { + declare module.exports: any; +} + +declare module 'webpack/lib/FlagInitialModulesAsUsedPlugin' { + declare module.exports: any; +} + +declare module 'webpack/lib/formatLocation' { + declare module.exports: any; +} + +declare module 'webpack/lib/FunctionModulePlugin' { + declare module.exports: any; +} + +declare module 'webpack/lib/FunctionModuleTemplatePlugin' { + declare module.exports: any; +} + +declare module 'webpack/lib/HashedModuleIdsPlugin' { + declare module.exports: any; +} + +declare module 'webpack/lib/HotModuleReplacement.runtime' { + declare module.exports: any; +} + +declare module 'webpack/lib/HotModuleReplacementPlugin' { + declare module.exports: any; +} + +declare module 'webpack/lib/HotUpdateChunkTemplate' { + declare module.exports: any; +} + +declare module 'webpack/lib/IgnorePlugin' { + declare module.exports: any; +} + +declare module 'webpack/lib/JsonpChunkTemplatePlugin' { + declare module.exports: any; +} + +declare module 'webpack/lib/JsonpExportMainTemplatePlugin' { + declare module.exports: any; +} + +declare module 'webpack/lib/JsonpHotUpdateChunkTemplatePlugin' { + declare module.exports: any; +} + +declare module 'webpack/lib/JsonpMainTemplate.runtime' { + declare module.exports: any; +} + +declare module 'webpack/lib/JsonpMainTemplatePlugin' { + declare module.exports: any; +} + +declare module 'webpack/lib/JsonpTemplatePlugin' { + declare module.exports: any; +} + +declare module 'webpack/lib/LibManifestPlugin' { + declare module.exports: any; +} + +declare module 'webpack/lib/LibraryTemplatePlugin' { + declare module.exports: any; +} + +declare module 'webpack/lib/LoaderOptionsPlugin' { + declare module.exports: any; +} + +declare module 'webpack/lib/LoaderTargetPlugin' { + declare module.exports: any; +} + +declare module 'webpack/lib/MainTemplate' { + declare module.exports: any; +} + +declare module 'webpack/lib/MemoryOutputFileSystem' { + declare module.exports: any; +} + +declare module 'webpack/lib/Module' { + declare module.exports: any; +} + +declare module 'webpack/lib/ModuleBuildError' { + declare module.exports: any; +} + +declare module 'webpack/lib/ModuleDependencyError' { + declare module.exports: any; +} + +declare module 'webpack/lib/ModuleDependencyWarning' { + declare module.exports: any; +} + +declare module 'webpack/lib/ModuleError' { + declare module.exports: any; +} + +declare module 'webpack/lib/ModuleFilenameHelpers' { + declare module.exports: any; +} + +declare module 'webpack/lib/ModuleNotFoundError' { + declare module.exports: any; +} + +declare module 'webpack/lib/ModuleParseError' { + declare module.exports: any; +} + +declare module 'webpack/lib/ModuleReason' { + declare module.exports: any; +} + +declare module 'webpack/lib/ModuleTemplate' { + declare module.exports: any; +} + +declare module 'webpack/lib/ModuleWarning' { + declare module.exports: any; +} + +declare module 'webpack/lib/MovedToPluginWarningPlugin' { + declare module.exports: any; +} + +declare module 'webpack/lib/MultiCompiler' { + declare module.exports: any; +} + +declare module 'webpack/lib/MultiEntryPlugin' { + declare module.exports: any; +} + +declare module 'webpack/lib/MultiModule' { + declare module.exports: any; +} + +declare module 'webpack/lib/MultiModuleFactory' { + declare module.exports: any; +} + +declare module 'webpack/lib/MultiStats' { + declare module.exports: any; +} + +declare module 'webpack/lib/MultiWatching' { + declare module.exports: any; +} + +declare module 'webpack/lib/NamedChunksPlugin' { + declare module.exports: any; +} + +declare module 'webpack/lib/NamedModulesPlugin' { + declare module.exports: any; +} + +declare module 'webpack/lib/NewWatchingPlugin' { + declare module.exports: any; +} + +declare module 'webpack/lib/node/NodeChunkTemplatePlugin' { + declare module.exports: any; +} + +declare module 'webpack/lib/node/NodeEnvironmentPlugin' { + declare module.exports: any; +} + +declare module 'webpack/lib/node/NodeHotUpdateChunkTemplatePlugin' { + declare module.exports: any; +} + +declare module 'webpack/lib/node/NodeMainTemplate.runtime' { + declare module.exports: any; +} + +declare module 'webpack/lib/node/NodeMainTemplateAsync.runtime' { + declare module.exports: any; +} + +declare module 'webpack/lib/node/NodeMainTemplatePlugin' { + declare module.exports: any; +} + +declare module 'webpack/lib/node/NodeOutputFileSystem' { + declare module.exports: any; +} + +declare module 'webpack/lib/node/NodeSourcePlugin' { + declare module.exports: any; +} + +declare module 'webpack/lib/node/NodeTargetPlugin' { + declare module.exports: any; +} + +declare module 'webpack/lib/node/NodeTemplatePlugin' { + declare module.exports: any; +} + +declare module 'webpack/lib/node/NodeWatchFileSystem' { + declare module.exports: any; +} + +declare module 'webpack/lib/NodeStuffPlugin' { + declare module.exports: any; +} + +declare module 'webpack/lib/NoEmitOnErrorsPlugin' { + declare module.exports: any; +} + +declare module 'webpack/lib/NoErrorsPlugin' { + declare module.exports: any; +} + +declare module 'webpack/lib/NormalModule' { + declare module.exports: any; +} + +declare module 'webpack/lib/NormalModuleFactory' { + declare module.exports: any; +} + +declare module 'webpack/lib/NormalModuleReplacementPlugin' { + declare module.exports: any; +} + +declare module 'webpack/lib/NullFactory' { + declare module.exports: any; +} + +declare module 'webpack/lib/optimize/AggressiveMergingPlugin' { + declare module.exports: any; +} + +declare module 'webpack/lib/optimize/AggressiveSplittingPlugin' { + declare module.exports: any; +} + +declare module 'webpack/lib/optimize/ChunkModuleIdRangePlugin' { + declare module.exports: any; +} + +declare module 'webpack/lib/optimize/CommonsChunkPlugin' { + declare module.exports: any; +} + +declare module 'webpack/lib/optimize/ConcatenatedModule' { + declare module.exports: any; +} + +declare module 'webpack/lib/optimize/DedupePlugin' { + declare module.exports: any; +} + +declare module 'webpack/lib/optimize/EnsureChunkConditionsPlugin' { + declare module.exports: any; +} + +declare module 'webpack/lib/optimize/FlagIncludedChunksPlugin' { + declare module.exports: any; +} + +declare module 'webpack/lib/optimize/LimitChunkCountPlugin' { + declare module.exports: any; +} + +declare module 'webpack/lib/optimize/MergeDuplicateChunksPlugin' { + declare module.exports: any; +} + +declare module 'webpack/lib/optimize/MinChunkSizePlugin' { + declare module.exports: any; +} + +declare module 'webpack/lib/optimize/ModuleConcatenationPlugin' { + declare module.exports: any; +} + +declare module 'webpack/lib/optimize/OccurrenceOrderPlugin' { + declare module.exports: any; +} + +declare module 'webpack/lib/optimize/RemoveEmptyChunksPlugin' { + declare module.exports: any; +} + +declare module 'webpack/lib/optimize/RemoveParentModulesPlugin' { + declare module.exports: any; +} + +declare module 'webpack/lib/optimize/UglifyJsPlugin' { + declare module.exports: any; +} + +declare module 'webpack/lib/OptionsApply' { + declare module.exports: any; +} + +declare module 'webpack/lib/OptionsDefaulter' { + declare module.exports: any; +} + +declare module 'webpack/lib/Parser' { + declare module.exports: any; +} + +declare module 'webpack/lib/ParserHelpers' { + declare module.exports: any; +} + +declare module 'webpack/lib/performance/AssetsOverSizeLimitWarning' { + declare module.exports: any; +} + +declare module 'webpack/lib/performance/EntrypointsOverSizeLimitWarning' { + declare module.exports: any; +} + +declare module 'webpack/lib/performance/NoAsyncChunksWarning' { + declare module.exports: any; +} + +declare module 'webpack/lib/performance/SizeLimitsPlugin' { + declare module.exports: any; +} + +declare module 'webpack/lib/PrefetchPlugin' { + declare module.exports: any; +} + +declare module 'webpack/lib/prepareOptions' { + declare module.exports: any; +} + +declare module 'webpack/lib/ProgressPlugin' { + declare module.exports: any; +} + +declare module 'webpack/lib/ProvidePlugin' { + declare module.exports: any; +} + +declare module 'webpack/lib/RawModule' { + declare module.exports: any; +} + +declare module 'webpack/lib/RecordIdsPlugin' { + declare module.exports: any; +} + +declare module 'webpack/lib/removeAndDo' { + declare module.exports: any; +} + +declare module 'webpack/lib/RequestShortener' { + declare module.exports: any; +} + +declare module 'webpack/lib/RequireJsStuffPlugin' { + declare module.exports: any; +} + +declare module 'webpack/lib/RuleSet' { + declare module.exports: any; +} + +declare module 'webpack/lib/SetVarMainTemplatePlugin' { + declare module.exports: any; +} + +declare module 'webpack/lib/SingleEntryPlugin' { + declare module.exports: any; +} + +declare module 'webpack/lib/SizeFormatHelpers' { + declare module.exports: any; +} + +declare module 'webpack/lib/SourceMapDevToolModuleOptionsPlugin' { + declare module.exports: any; +} + +declare module 'webpack/lib/SourceMapDevToolPlugin' { + declare module.exports: any; +} + +declare module 'webpack/lib/Stats' { + declare module.exports: any; +} + +declare module 'webpack/lib/Template' { + declare module.exports: any; +} + +declare module 'webpack/lib/TemplatedPathPlugin' { + declare module.exports: any; +} + +declare module 'webpack/lib/UmdMainTemplatePlugin' { + declare module.exports: any; +} + +declare module 'webpack/lib/UnsupportedFeatureWarning' { + declare module.exports: any; +} + +declare module 'webpack/lib/UseStrictPlugin' { + declare module.exports: any; +} + +declare module 'webpack/lib/util/identifier' { + declare module.exports: any; +} + +declare module 'webpack/lib/util/Queue' { + declare module.exports: any; +} + +declare module 'webpack/lib/util/Semaphore' { + declare module.exports: any; +} + +declare module 'webpack/lib/util/SortableSet' { + declare module.exports: any; +} + +declare module 'webpack/lib/validateSchema' { + declare module.exports: any; +} + +declare module 'webpack/lib/WarnCaseSensitiveModulesPlugin' { + declare module.exports: any; +} + +declare module 'webpack/lib/WatchIgnorePlugin' { + declare module.exports: any; +} + +declare module 'webpack/lib/web/WebEnvironmentPlugin' { + declare module.exports: any; +} + +declare module 'webpack/lib/webpack' { + declare module.exports: any; +} + +declare module 'webpack/lib/webpack.web' { + declare module.exports: any; +} + +declare module 'webpack/lib/WebpackError' { + declare module.exports: any; +} + +declare module 'webpack/lib/WebpackOptionsApply' { + declare module.exports: any; +} + +declare module 'webpack/lib/WebpackOptionsDefaulter' { + declare module.exports: any; +} + +declare module 'webpack/lib/WebpackOptionsValidationError' { + declare module.exports: any; +} + +declare module 'webpack/lib/webworker/WebWorkerChunkTemplatePlugin' { + declare module.exports: any; +} + +declare module 'webpack/lib/webworker/WebWorkerHotUpdateChunkTemplatePlugin' { + declare module.exports: any; +} + +declare module 'webpack/lib/webworker/WebWorkerMainTemplate.runtime' { + declare module.exports: any; +} + +declare module 'webpack/lib/webworker/WebWorkerMainTemplatePlugin' { + declare module.exports: any; +} + +declare module 'webpack/lib/webworker/WebWorkerTemplatePlugin' { + declare module.exports: any; +} + +declare module 'webpack/schemas/ajv.absolutePath' { + declare module.exports: any; +} + +declare module 'webpack/web_modules/node-libs-browser' { + declare module.exports: any; +} + +// Filename aliases +declare module 'webpack/bin/config-optimist.js' { + declare module.exports: $Exports<'webpack/bin/config-optimist'>; +} +declare module 'webpack/bin/config-yargs.js' { + declare module.exports: $Exports<'webpack/bin/config-yargs'>; +} +declare module 'webpack/bin/convert-argv.js' { + declare module.exports: $Exports<'webpack/bin/convert-argv'>; +} +declare module 'webpack/bin/webpack.js' { + declare module.exports: $Exports<'webpack/bin/webpack'>; +} +declare module 'webpack/buildin/amd-define.js' { + declare module.exports: $Exports<'webpack/buildin/amd-define'>; +} +declare module 'webpack/buildin/amd-options.js' { + declare module.exports: $Exports<'webpack/buildin/amd-options'>; +} +declare module 'webpack/buildin/global.js' { + declare module.exports: $Exports<'webpack/buildin/global'>; +} +declare module 'webpack/buildin/harmony-module.js' { + declare module.exports: $Exports<'webpack/buildin/harmony-module'>; +} +declare module 'webpack/buildin/module.js' { + declare module.exports: $Exports<'webpack/buildin/module'>; +} +declare module 'webpack/buildin/system.js' { + declare module.exports: $Exports<'webpack/buildin/system'>; +} +declare module 'webpack/hot/dev-server.js' { + declare module.exports: $Exports<'webpack/hot/dev-server'>; +} +declare module 'webpack/hot/emitter.js' { + declare module.exports: $Exports<'webpack/hot/emitter'>; +} +declare module 'webpack/hot/log-apply-result.js' { + declare module.exports: $Exports<'webpack/hot/log-apply-result'>; +} +declare module 'webpack/hot/log.js' { + declare module.exports: $Exports<'webpack/hot/log'>; +} +declare module 'webpack/hot/only-dev-server.js' { + declare module.exports: $Exports<'webpack/hot/only-dev-server'>; +} +declare module 'webpack/hot/poll.js' { + declare module.exports: $Exports<'webpack/hot/poll'>; +} +declare module 'webpack/hot/signal.js' { + declare module.exports: $Exports<'webpack/hot/signal'>; +} +declare module 'webpack/lib/AmdMainTemplatePlugin.js' { + declare module.exports: $Exports<'webpack/lib/AmdMainTemplatePlugin'>; +} +declare module 'webpack/lib/APIPlugin.js' { + declare module.exports: $Exports<'webpack/lib/APIPlugin'>; +} +declare module 'webpack/lib/AsyncDependenciesBlock.js' { + declare module.exports: $Exports<'webpack/lib/AsyncDependenciesBlock'>; +} +declare module 'webpack/lib/AsyncDependencyToInitialChunkWarning.js' { + declare module.exports: $Exports<'webpack/lib/AsyncDependencyToInitialChunkWarning'>; +} +declare module 'webpack/lib/AutomaticPrefetchPlugin.js' { + declare module.exports: $Exports<'webpack/lib/AutomaticPrefetchPlugin'>; +} +declare module 'webpack/lib/BannerPlugin.js' { + declare module.exports: $Exports<'webpack/lib/BannerPlugin'>; +} +declare module 'webpack/lib/BasicEvaluatedExpression.js' { + declare module.exports: $Exports<'webpack/lib/BasicEvaluatedExpression'>; +} +declare module 'webpack/lib/CachePlugin.js' { + declare module.exports: $Exports<'webpack/lib/CachePlugin'>; +} +declare module 'webpack/lib/CaseSensitiveModulesWarning.js' { + declare module.exports: $Exports<'webpack/lib/CaseSensitiveModulesWarning'>; +} +declare module 'webpack/lib/Chunk.js' { + declare module.exports: $Exports<'webpack/lib/Chunk'>; +} +declare module 'webpack/lib/ChunkRenderError.js' { + declare module.exports: $Exports<'webpack/lib/ChunkRenderError'>; +} +declare module 'webpack/lib/ChunkTemplate.js' { + declare module.exports: $Exports<'webpack/lib/ChunkTemplate'>; +} +declare module 'webpack/lib/compareLocations.js' { + declare module.exports: $Exports<'webpack/lib/compareLocations'>; +} +declare module 'webpack/lib/CompatibilityPlugin.js' { + declare module.exports: $Exports<'webpack/lib/CompatibilityPlugin'>; +} +declare module 'webpack/lib/Compilation.js' { + declare module.exports: $Exports<'webpack/lib/Compilation'>; +} +declare module 'webpack/lib/Compiler.js' { + declare module.exports: $Exports<'webpack/lib/Compiler'>; +} +declare module 'webpack/lib/ConstPlugin.js' { + declare module.exports: $Exports<'webpack/lib/ConstPlugin'>; +} +declare module 'webpack/lib/ContextExclusionPlugin.js' { + declare module.exports: $Exports<'webpack/lib/ContextExclusionPlugin'>; +} +declare module 'webpack/lib/ContextModule.js' { + declare module.exports: $Exports<'webpack/lib/ContextModule'>; +} +declare module 'webpack/lib/ContextModuleFactory.js' { + declare module.exports: $Exports<'webpack/lib/ContextModuleFactory'>; +} +declare module 'webpack/lib/ContextReplacementPlugin.js' { + declare module.exports: $Exports<'webpack/lib/ContextReplacementPlugin'>; +} +declare module 'webpack/lib/DefinePlugin.js' { + declare module.exports: $Exports<'webpack/lib/DefinePlugin'>; +} +declare module 'webpack/lib/DelegatedModule.js' { + declare module.exports: $Exports<'webpack/lib/DelegatedModule'>; +} +declare module 'webpack/lib/DelegatedModuleFactoryPlugin.js' { + declare module.exports: $Exports<'webpack/lib/DelegatedModuleFactoryPlugin'>; +} +declare module 'webpack/lib/DelegatedPlugin.js' { + declare module.exports: $Exports<'webpack/lib/DelegatedPlugin'>; +} +declare module 'webpack/lib/dependencies/AMDDefineDependency.js' { + declare module.exports: $Exports<'webpack/lib/dependencies/AMDDefineDependency'>; +} +declare module 'webpack/lib/dependencies/AMDDefineDependencyParserPlugin.js' { + declare module.exports: $Exports<'webpack/lib/dependencies/AMDDefineDependencyParserPlugin'>; +} +declare module 'webpack/lib/dependencies/AMDPlugin.js' { + declare module.exports: $Exports<'webpack/lib/dependencies/AMDPlugin'>; +} +declare module 'webpack/lib/dependencies/AMDRequireArrayDependency.js' { + declare module.exports: $Exports<'webpack/lib/dependencies/AMDRequireArrayDependency'>; +} +declare module 'webpack/lib/dependencies/AMDRequireContextDependency.js' { + declare module.exports: $Exports<'webpack/lib/dependencies/AMDRequireContextDependency'>; +} +declare module 'webpack/lib/dependencies/AMDRequireDependenciesBlock.js' { + declare module.exports: $Exports<'webpack/lib/dependencies/AMDRequireDependenciesBlock'>; +} +declare module 'webpack/lib/dependencies/AMDRequireDependenciesBlockParserPlugin.js' { + declare module.exports: $Exports<'webpack/lib/dependencies/AMDRequireDependenciesBlockParserPlugin'>; +} +declare module 'webpack/lib/dependencies/AMDRequireDependency.js' { + declare module.exports: $Exports<'webpack/lib/dependencies/AMDRequireDependency'>; +} +declare module 'webpack/lib/dependencies/AMDRequireItemDependency.js' { + declare module.exports: $Exports<'webpack/lib/dependencies/AMDRequireItemDependency'>; +} +declare module 'webpack/lib/dependencies/CommonJsPlugin.js' { + declare module.exports: $Exports<'webpack/lib/dependencies/CommonJsPlugin'>; +} +declare module 'webpack/lib/dependencies/CommonJsRequireContextDependency.js' { + declare module.exports: $Exports<'webpack/lib/dependencies/CommonJsRequireContextDependency'>; +} +declare module 'webpack/lib/dependencies/CommonJsRequireDependency.js' { + declare module.exports: $Exports<'webpack/lib/dependencies/CommonJsRequireDependency'>; +} +declare module 'webpack/lib/dependencies/CommonJsRequireDependencyParserPlugin.js' { + declare module.exports: $Exports<'webpack/lib/dependencies/CommonJsRequireDependencyParserPlugin'>; +} +declare module 'webpack/lib/dependencies/ConstDependency.js' { + declare module.exports: $Exports<'webpack/lib/dependencies/ConstDependency'>; +} +declare module 'webpack/lib/dependencies/ContextDependency.js' { + declare module.exports: $Exports<'webpack/lib/dependencies/ContextDependency'>; +} +declare module 'webpack/lib/dependencies/ContextDependencyHelpers.js' { + declare module.exports: $Exports<'webpack/lib/dependencies/ContextDependencyHelpers'>; +} +declare module 'webpack/lib/dependencies/ContextDependencyTemplateAsId.js' { + declare module.exports: $Exports<'webpack/lib/dependencies/ContextDependencyTemplateAsId'>; +} +declare module 'webpack/lib/dependencies/ContextDependencyTemplateAsRequireCall.js' { + declare module.exports: $Exports<'webpack/lib/dependencies/ContextDependencyTemplateAsRequireCall'>; +} +declare module 'webpack/lib/dependencies/ContextElementDependency.js' { + declare module.exports: $Exports<'webpack/lib/dependencies/ContextElementDependency'>; +} +declare module 'webpack/lib/dependencies/CriticalDependencyWarning.js' { + declare module.exports: $Exports<'webpack/lib/dependencies/CriticalDependencyWarning'>; +} +declare module 'webpack/lib/dependencies/DelegatedExportsDependency.js' { + declare module.exports: $Exports<'webpack/lib/dependencies/DelegatedExportsDependency'>; +} +declare module 'webpack/lib/dependencies/DelegatedSourceDependency.js' { + declare module.exports: $Exports<'webpack/lib/dependencies/DelegatedSourceDependency'>; +} +declare module 'webpack/lib/dependencies/DepBlockHelpers.js' { + declare module.exports: $Exports<'webpack/lib/dependencies/DepBlockHelpers'>; +} +declare module 'webpack/lib/dependencies/DllEntryDependency.js' { + declare module.exports: $Exports<'webpack/lib/dependencies/DllEntryDependency'>; +} +declare module 'webpack/lib/dependencies/getFunctionExpression.js' { + declare module.exports: $Exports<'webpack/lib/dependencies/getFunctionExpression'>; +} +declare module 'webpack/lib/dependencies/HarmonyAcceptDependency.js' { + declare module.exports: $Exports<'webpack/lib/dependencies/HarmonyAcceptDependency'>; +} +declare module 'webpack/lib/dependencies/HarmonyAcceptImportDependency.js' { + declare module.exports: $Exports<'webpack/lib/dependencies/HarmonyAcceptImportDependency'>; +} +declare module 'webpack/lib/dependencies/HarmonyCompatibilityDependency.js' { + declare module.exports: $Exports<'webpack/lib/dependencies/HarmonyCompatibilityDependency'>; +} +declare module 'webpack/lib/dependencies/HarmonyDetectionParserPlugin.js' { + declare module.exports: $Exports<'webpack/lib/dependencies/HarmonyDetectionParserPlugin'>; +} +declare module 'webpack/lib/dependencies/HarmonyExportDependencyParserPlugin.js' { + declare module.exports: $Exports<'webpack/lib/dependencies/HarmonyExportDependencyParserPlugin'>; +} +declare module 'webpack/lib/dependencies/HarmonyExportExpressionDependency.js' { + declare module.exports: $Exports<'webpack/lib/dependencies/HarmonyExportExpressionDependency'>; +} +declare module 'webpack/lib/dependencies/HarmonyExportHeaderDependency.js' { + declare module.exports: $Exports<'webpack/lib/dependencies/HarmonyExportHeaderDependency'>; +} +declare module 'webpack/lib/dependencies/HarmonyExportImportedSpecifierDependency.js' { + declare module.exports: $Exports<'webpack/lib/dependencies/HarmonyExportImportedSpecifierDependency'>; +} +declare module 'webpack/lib/dependencies/HarmonyExportSpecifierDependency.js' { + declare module.exports: $Exports<'webpack/lib/dependencies/HarmonyExportSpecifierDependency'>; +} +declare module 'webpack/lib/dependencies/HarmonyImportDependency.js' { + declare module.exports: $Exports<'webpack/lib/dependencies/HarmonyImportDependency'>; +} +declare module 'webpack/lib/dependencies/HarmonyImportDependencyParserPlugin.js' { + declare module.exports: $Exports<'webpack/lib/dependencies/HarmonyImportDependencyParserPlugin'>; +} +declare module 'webpack/lib/dependencies/HarmonyImportSpecifierDependency.js' { + declare module.exports: $Exports<'webpack/lib/dependencies/HarmonyImportSpecifierDependency'>; +} +declare module 'webpack/lib/dependencies/HarmonyModulesHelpers.js' { + declare module.exports: $Exports<'webpack/lib/dependencies/HarmonyModulesHelpers'>; +} +declare module 'webpack/lib/dependencies/HarmonyModulesPlugin.js' { + declare module.exports: $Exports<'webpack/lib/dependencies/HarmonyModulesPlugin'>; +} +declare module 'webpack/lib/dependencies/ImportContextDependency.js' { + declare module.exports: $Exports<'webpack/lib/dependencies/ImportContextDependency'>; +} +declare module 'webpack/lib/dependencies/ImportDependenciesBlock.js' { + declare module.exports: $Exports<'webpack/lib/dependencies/ImportDependenciesBlock'>; +} +declare module 'webpack/lib/dependencies/ImportDependency.js' { + declare module.exports: $Exports<'webpack/lib/dependencies/ImportDependency'>; +} +declare module 'webpack/lib/dependencies/ImportEagerContextDependency.js' { + declare module.exports: $Exports<'webpack/lib/dependencies/ImportEagerContextDependency'>; +} +declare module 'webpack/lib/dependencies/ImportEagerDependency.js' { + declare module.exports: $Exports<'webpack/lib/dependencies/ImportEagerDependency'>; +} +declare module 'webpack/lib/dependencies/ImportLazyContextDependency.js' { + declare module.exports: $Exports<'webpack/lib/dependencies/ImportLazyContextDependency'>; +} +declare module 'webpack/lib/dependencies/ImportLazyOnceContextDependency.js' { + declare module.exports: $Exports<'webpack/lib/dependencies/ImportLazyOnceContextDependency'>; +} +declare module 'webpack/lib/dependencies/ImportParserPlugin.js' { + declare module.exports: $Exports<'webpack/lib/dependencies/ImportParserPlugin'>; +} +declare module 'webpack/lib/dependencies/ImportPlugin.js' { + declare module.exports: $Exports<'webpack/lib/dependencies/ImportPlugin'>; +} +declare module 'webpack/lib/dependencies/ImportWeakContextDependency.js' { + declare module.exports: $Exports<'webpack/lib/dependencies/ImportWeakContextDependency'>; +} +declare module 'webpack/lib/dependencies/ImportWeakDependency.js' { + declare module.exports: $Exports<'webpack/lib/dependencies/ImportWeakDependency'>; +} +declare module 'webpack/lib/dependencies/LoaderDependency.js' { + declare module.exports: $Exports<'webpack/lib/dependencies/LoaderDependency'>; +} +declare module 'webpack/lib/dependencies/LoaderPlugin.js' { + declare module.exports: $Exports<'webpack/lib/dependencies/LoaderPlugin'>; +} +declare module 'webpack/lib/dependencies/LocalModule.js' { + declare module.exports: $Exports<'webpack/lib/dependencies/LocalModule'>; +} +declare module 'webpack/lib/dependencies/LocalModuleDependency.js' { + declare module.exports: $Exports<'webpack/lib/dependencies/LocalModuleDependency'>; +} +declare module 'webpack/lib/dependencies/LocalModulesHelpers.js' { + declare module.exports: $Exports<'webpack/lib/dependencies/LocalModulesHelpers'>; +} +declare module 'webpack/lib/dependencies/ModuleDependency.js' { + declare module.exports: $Exports<'webpack/lib/dependencies/ModuleDependency'>; +} +declare module 'webpack/lib/dependencies/ModuleDependencyTemplateAsId.js' { + declare module.exports: $Exports<'webpack/lib/dependencies/ModuleDependencyTemplateAsId'>; +} +declare module 'webpack/lib/dependencies/ModuleDependencyTemplateAsRequireId.js' { + declare module.exports: $Exports<'webpack/lib/dependencies/ModuleDependencyTemplateAsRequireId'>; +} +declare module 'webpack/lib/dependencies/ModuleHotAcceptDependency.js' { + declare module.exports: $Exports<'webpack/lib/dependencies/ModuleHotAcceptDependency'>; +} +declare module 'webpack/lib/dependencies/ModuleHotDeclineDependency.js' { + declare module.exports: $Exports<'webpack/lib/dependencies/ModuleHotDeclineDependency'>; +} +declare module 'webpack/lib/dependencies/MultiEntryDependency.js' { + declare module.exports: $Exports<'webpack/lib/dependencies/MultiEntryDependency'>; +} +declare module 'webpack/lib/dependencies/NullDependency.js' { + declare module.exports: $Exports<'webpack/lib/dependencies/NullDependency'>; +} +declare module 'webpack/lib/dependencies/PrefetchDependency.js' { + declare module.exports: $Exports<'webpack/lib/dependencies/PrefetchDependency'>; +} +declare module 'webpack/lib/dependencies/RequireContextDependency.js' { + declare module.exports: $Exports<'webpack/lib/dependencies/RequireContextDependency'>; +} +declare module 'webpack/lib/dependencies/RequireContextDependencyParserPlugin.js' { + declare module.exports: $Exports<'webpack/lib/dependencies/RequireContextDependencyParserPlugin'>; +} +declare module 'webpack/lib/dependencies/RequireContextPlugin.js' { + declare module.exports: $Exports<'webpack/lib/dependencies/RequireContextPlugin'>; +} +declare module 'webpack/lib/dependencies/RequireEnsureDependenciesBlock.js' { + declare module.exports: $Exports<'webpack/lib/dependencies/RequireEnsureDependenciesBlock'>; +} +declare module 'webpack/lib/dependencies/RequireEnsureDependenciesBlockParserPlugin.js' { + declare module.exports: $Exports<'webpack/lib/dependencies/RequireEnsureDependenciesBlockParserPlugin'>; +} +declare module 'webpack/lib/dependencies/RequireEnsureDependency.js' { + declare module.exports: $Exports<'webpack/lib/dependencies/RequireEnsureDependency'>; +} +declare module 'webpack/lib/dependencies/RequireEnsureItemDependency.js' { + declare module.exports: $Exports<'webpack/lib/dependencies/RequireEnsureItemDependency'>; +} +declare module 'webpack/lib/dependencies/RequireEnsurePlugin.js' { + declare module.exports: $Exports<'webpack/lib/dependencies/RequireEnsurePlugin'>; +} +declare module 'webpack/lib/dependencies/RequireHeaderDependency.js' { + declare module.exports: $Exports<'webpack/lib/dependencies/RequireHeaderDependency'>; +} +declare module 'webpack/lib/dependencies/RequireIncludeDependency.js' { + declare module.exports: $Exports<'webpack/lib/dependencies/RequireIncludeDependency'>; +} +declare module 'webpack/lib/dependencies/RequireIncludeDependencyParserPlugin.js' { + declare module.exports: $Exports<'webpack/lib/dependencies/RequireIncludeDependencyParserPlugin'>; +} +declare module 'webpack/lib/dependencies/RequireIncludePlugin.js' { + declare module.exports: $Exports<'webpack/lib/dependencies/RequireIncludePlugin'>; +} +declare module 'webpack/lib/dependencies/RequireResolveContextDependency.js' { + declare module.exports: $Exports<'webpack/lib/dependencies/RequireResolveContextDependency'>; +} +declare module 'webpack/lib/dependencies/RequireResolveDependency.js' { + declare module.exports: $Exports<'webpack/lib/dependencies/RequireResolveDependency'>; +} +declare module 'webpack/lib/dependencies/RequireResolveDependencyParserPlugin.js' { + declare module.exports: $Exports<'webpack/lib/dependencies/RequireResolveDependencyParserPlugin'>; +} +declare module 'webpack/lib/dependencies/RequireResolveHeaderDependency.js' { + declare module.exports: $Exports<'webpack/lib/dependencies/RequireResolveHeaderDependency'>; +} +declare module 'webpack/lib/dependencies/SingleEntryDependency.js' { + declare module.exports: $Exports<'webpack/lib/dependencies/SingleEntryDependency'>; +} +declare module 'webpack/lib/dependencies/SystemPlugin.js' { + declare module.exports: $Exports<'webpack/lib/dependencies/SystemPlugin'>; +} +declare module 'webpack/lib/dependencies/UnsupportedDependency.js' { + declare module.exports: $Exports<'webpack/lib/dependencies/UnsupportedDependency'>; +} +declare module 'webpack/lib/dependencies/WebpackMissingModule.js' { + declare module.exports: $Exports<'webpack/lib/dependencies/WebpackMissingModule'>; +} +declare module 'webpack/lib/DependenciesBlock.js' { + declare module.exports: $Exports<'webpack/lib/DependenciesBlock'>; +} +declare module 'webpack/lib/DependenciesBlockVariable.js' { + declare module.exports: $Exports<'webpack/lib/DependenciesBlockVariable'>; +} +declare module 'webpack/lib/Dependency.js' { + declare module.exports: $Exports<'webpack/lib/Dependency'>; +} +declare module 'webpack/lib/DllEntryPlugin.js' { + declare module.exports: $Exports<'webpack/lib/DllEntryPlugin'>; +} +declare module 'webpack/lib/DllModule.js' { + declare module.exports: $Exports<'webpack/lib/DllModule'>; +} +declare module 'webpack/lib/DllModuleFactory.js' { + declare module.exports: $Exports<'webpack/lib/DllModuleFactory'>; +} +declare module 'webpack/lib/DllPlugin.js' { + declare module.exports: $Exports<'webpack/lib/DllPlugin'>; +} +declare module 'webpack/lib/DllReferencePlugin.js' { + declare module.exports: $Exports<'webpack/lib/DllReferencePlugin'>; +} +declare module 'webpack/lib/DynamicEntryPlugin.js' { + declare module.exports: $Exports<'webpack/lib/DynamicEntryPlugin'>; +} +declare module 'webpack/lib/EntryModuleNotFoundError.js' { + declare module.exports: $Exports<'webpack/lib/EntryModuleNotFoundError'>; +} +declare module 'webpack/lib/EntryOptionPlugin.js' { + declare module.exports: $Exports<'webpack/lib/EntryOptionPlugin'>; +} +declare module 'webpack/lib/Entrypoint.js' { + declare module.exports: $Exports<'webpack/lib/Entrypoint'>; +} +declare module 'webpack/lib/EnvironmentPlugin.js' { + declare module.exports: $Exports<'webpack/lib/EnvironmentPlugin'>; +} +declare module 'webpack/lib/ErrorHelpers.js' { + declare module.exports: $Exports<'webpack/lib/ErrorHelpers'>; +} +declare module 'webpack/lib/EvalDevToolModulePlugin.js' { + declare module.exports: $Exports<'webpack/lib/EvalDevToolModulePlugin'>; +} +declare module 'webpack/lib/EvalDevToolModuleTemplatePlugin.js' { + declare module.exports: $Exports<'webpack/lib/EvalDevToolModuleTemplatePlugin'>; +} +declare module 'webpack/lib/EvalSourceMapDevToolModuleTemplatePlugin.js' { + declare module.exports: $Exports<'webpack/lib/EvalSourceMapDevToolModuleTemplatePlugin'>; +} +declare module 'webpack/lib/EvalSourceMapDevToolPlugin.js' { + declare module.exports: $Exports<'webpack/lib/EvalSourceMapDevToolPlugin'>; +} +declare module 'webpack/lib/ExportPropertyMainTemplatePlugin.js' { + declare module.exports: $Exports<'webpack/lib/ExportPropertyMainTemplatePlugin'>; +} +declare module 'webpack/lib/ExtendedAPIPlugin.js' { + declare module.exports: $Exports<'webpack/lib/ExtendedAPIPlugin'>; +} +declare module 'webpack/lib/ExternalModule.js' { + declare module.exports: $Exports<'webpack/lib/ExternalModule'>; +} +declare module 'webpack/lib/ExternalModuleFactoryPlugin.js' { + declare module.exports: $Exports<'webpack/lib/ExternalModuleFactoryPlugin'>; +} +declare module 'webpack/lib/ExternalsPlugin.js' { + declare module.exports: $Exports<'webpack/lib/ExternalsPlugin'>; +} +declare module 'webpack/lib/FlagDependencyExportsPlugin.js' { + declare module.exports: $Exports<'webpack/lib/FlagDependencyExportsPlugin'>; +} +declare module 'webpack/lib/FlagDependencyUsagePlugin.js' { + declare module.exports: $Exports<'webpack/lib/FlagDependencyUsagePlugin'>; +} +declare module 'webpack/lib/FlagInitialModulesAsUsedPlugin.js' { + declare module.exports: $Exports<'webpack/lib/FlagInitialModulesAsUsedPlugin'>; +} +declare module 'webpack/lib/formatLocation.js' { + declare module.exports: $Exports<'webpack/lib/formatLocation'>; +} +declare module 'webpack/lib/FunctionModulePlugin.js' { + declare module.exports: $Exports<'webpack/lib/FunctionModulePlugin'>; +} +declare module 'webpack/lib/FunctionModuleTemplatePlugin.js' { + declare module.exports: $Exports<'webpack/lib/FunctionModuleTemplatePlugin'>; +} +declare module 'webpack/lib/HashedModuleIdsPlugin.js' { + declare module.exports: $Exports<'webpack/lib/HashedModuleIdsPlugin'>; +} +declare module 'webpack/lib/HotModuleReplacement.runtime.js' { + declare module.exports: $Exports<'webpack/lib/HotModuleReplacement.runtime'>; +} +declare module 'webpack/lib/HotModuleReplacementPlugin.js' { + declare module.exports: $Exports<'webpack/lib/HotModuleReplacementPlugin'>; +} +declare module 'webpack/lib/HotUpdateChunkTemplate.js' { + declare module.exports: $Exports<'webpack/lib/HotUpdateChunkTemplate'>; +} +declare module 'webpack/lib/IgnorePlugin.js' { + declare module.exports: $Exports<'webpack/lib/IgnorePlugin'>; +} +declare module 'webpack/lib/JsonpChunkTemplatePlugin.js' { + declare module.exports: $Exports<'webpack/lib/JsonpChunkTemplatePlugin'>; +} +declare module 'webpack/lib/JsonpExportMainTemplatePlugin.js' { + declare module.exports: $Exports<'webpack/lib/JsonpExportMainTemplatePlugin'>; +} +declare module 'webpack/lib/JsonpHotUpdateChunkTemplatePlugin.js' { + declare module.exports: $Exports<'webpack/lib/JsonpHotUpdateChunkTemplatePlugin'>; +} +declare module 'webpack/lib/JsonpMainTemplate.runtime.js' { + declare module.exports: $Exports<'webpack/lib/JsonpMainTemplate.runtime'>; +} +declare module 'webpack/lib/JsonpMainTemplatePlugin.js' { + declare module.exports: $Exports<'webpack/lib/JsonpMainTemplatePlugin'>; +} +declare module 'webpack/lib/JsonpTemplatePlugin.js' { + declare module.exports: $Exports<'webpack/lib/JsonpTemplatePlugin'>; +} +declare module 'webpack/lib/LibManifestPlugin.js' { + declare module.exports: $Exports<'webpack/lib/LibManifestPlugin'>; +} +declare module 'webpack/lib/LibraryTemplatePlugin.js' { + declare module.exports: $Exports<'webpack/lib/LibraryTemplatePlugin'>; +} +declare module 'webpack/lib/LoaderOptionsPlugin.js' { + declare module.exports: $Exports<'webpack/lib/LoaderOptionsPlugin'>; +} +declare module 'webpack/lib/LoaderTargetPlugin.js' { + declare module.exports: $Exports<'webpack/lib/LoaderTargetPlugin'>; +} +declare module 'webpack/lib/MainTemplate.js' { + declare module.exports: $Exports<'webpack/lib/MainTemplate'>; +} +declare module 'webpack/lib/MemoryOutputFileSystem.js' { + declare module.exports: $Exports<'webpack/lib/MemoryOutputFileSystem'>; +} +declare module 'webpack/lib/Module.js' { + declare module.exports: $Exports<'webpack/lib/Module'>; +} +declare module 'webpack/lib/ModuleBuildError.js' { + declare module.exports: $Exports<'webpack/lib/ModuleBuildError'>; +} +declare module 'webpack/lib/ModuleDependencyError.js' { + declare module.exports: $Exports<'webpack/lib/ModuleDependencyError'>; +} +declare module 'webpack/lib/ModuleDependencyWarning.js' { + declare module.exports: $Exports<'webpack/lib/ModuleDependencyWarning'>; +} +declare module 'webpack/lib/ModuleError.js' { + declare module.exports: $Exports<'webpack/lib/ModuleError'>; +} +declare module 'webpack/lib/ModuleFilenameHelpers.js' { + declare module.exports: $Exports<'webpack/lib/ModuleFilenameHelpers'>; +} +declare module 'webpack/lib/ModuleNotFoundError.js' { + declare module.exports: $Exports<'webpack/lib/ModuleNotFoundError'>; +} +declare module 'webpack/lib/ModuleParseError.js' { + declare module.exports: $Exports<'webpack/lib/ModuleParseError'>; +} +declare module 'webpack/lib/ModuleReason.js' { + declare module.exports: $Exports<'webpack/lib/ModuleReason'>; +} +declare module 'webpack/lib/ModuleTemplate.js' { + declare module.exports: $Exports<'webpack/lib/ModuleTemplate'>; +} +declare module 'webpack/lib/ModuleWarning.js' { + declare module.exports: $Exports<'webpack/lib/ModuleWarning'>; +} +declare module 'webpack/lib/MovedToPluginWarningPlugin.js' { + declare module.exports: $Exports<'webpack/lib/MovedToPluginWarningPlugin'>; +} +declare module 'webpack/lib/MultiCompiler.js' { + declare module.exports: $Exports<'webpack/lib/MultiCompiler'>; +} +declare module 'webpack/lib/MultiEntryPlugin.js' { + declare module.exports: $Exports<'webpack/lib/MultiEntryPlugin'>; +} +declare module 'webpack/lib/MultiModule.js' { + declare module.exports: $Exports<'webpack/lib/MultiModule'>; +} +declare module 'webpack/lib/MultiModuleFactory.js' { + declare module.exports: $Exports<'webpack/lib/MultiModuleFactory'>; +} +declare module 'webpack/lib/MultiStats.js' { + declare module.exports: $Exports<'webpack/lib/MultiStats'>; +} +declare module 'webpack/lib/MultiWatching.js' { + declare module.exports: $Exports<'webpack/lib/MultiWatching'>; +} +declare module 'webpack/lib/NamedChunksPlugin.js' { + declare module.exports: $Exports<'webpack/lib/NamedChunksPlugin'>; +} +declare module 'webpack/lib/NamedModulesPlugin.js' { + declare module.exports: $Exports<'webpack/lib/NamedModulesPlugin'>; +} +declare module 'webpack/lib/NewWatchingPlugin.js' { + declare module.exports: $Exports<'webpack/lib/NewWatchingPlugin'>; +} +declare module 'webpack/lib/node/NodeChunkTemplatePlugin.js' { + declare module.exports: $Exports<'webpack/lib/node/NodeChunkTemplatePlugin'>; +} +declare module 'webpack/lib/node/NodeEnvironmentPlugin.js' { + declare module.exports: $Exports<'webpack/lib/node/NodeEnvironmentPlugin'>; +} +declare module 'webpack/lib/node/NodeHotUpdateChunkTemplatePlugin.js' { + declare module.exports: $Exports<'webpack/lib/node/NodeHotUpdateChunkTemplatePlugin'>; +} +declare module 'webpack/lib/node/NodeMainTemplate.runtime.js' { + declare module.exports: $Exports<'webpack/lib/node/NodeMainTemplate.runtime'>; +} +declare module 'webpack/lib/node/NodeMainTemplateAsync.runtime.js' { + declare module.exports: $Exports<'webpack/lib/node/NodeMainTemplateAsync.runtime'>; +} +declare module 'webpack/lib/node/NodeMainTemplatePlugin.js' { + declare module.exports: $Exports<'webpack/lib/node/NodeMainTemplatePlugin'>; +} +declare module 'webpack/lib/node/NodeOutputFileSystem.js' { + declare module.exports: $Exports<'webpack/lib/node/NodeOutputFileSystem'>; +} +declare module 'webpack/lib/node/NodeSourcePlugin.js' { + declare module.exports: $Exports<'webpack/lib/node/NodeSourcePlugin'>; +} +declare module 'webpack/lib/node/NodeTargetPlugin.js' { + declare module.exports: $Exports<'webpack/lib/node/NodeTargetPlugin'>; +} +declare module 'webpack/lib/node/NodeTemplatePlugin.js' { + declare module.exports: $Exports<'webpack/lib/node/NodeTemplatePlugin'>; +} +declare module 'webpack/lib/node/NodeWatchFileSystem.js' { + declare module.exports: $Exports<'webpack/lib/node/NodeWatchFileSystem'>; +} +declare module 'webpack/lib/NodeStuffPlugin.js' { + declare module.exports: $Exports<'webpack/lib/NodeStuffPlugin'>; +} +declare module 'webpack/lib/NoEmitOnErrorsPlugin.js' { + declare module.exports: $Exports<'webpack/lib/NoEmitOnErrorsPlugin'>; +} +declare module 'webpack/lib/NoErrorsPlugin.js' { + declare module.exports: $Exports<'webpack/lib/NoErrorsPlugin'>; +} +declare module 'webpack/lib/NormalModule.js' { + declare module.exports: $Exports<'webpack/lib/NormalModule'>; +} +declare module 'webpack/lib/NormalModuleFactory.js' { + declare module.exports: $Exports<'webpack/lib/NormalModuleFactory'>; +} +declare module 'webpack/lib/NormalModuleReplacementPlugin.js' { + declare module.exports: $Exports<'webpack/lib/NormalModuleReplacementPlugin'>; +} +declare module 'webpack/lib/NullFactory.js' { + declare module.exports: $Exports<'webpack/lib/NullFactory'>; +} +declare module 'webpack/lib/optimize/AggressiveMergingPlugin.js' { + declare module.exports: $Exports<'webpack/lib/optimize/AggressiveMergingPlugin'>; +} +declare module 'webpack/lib/optimize/AggressiveSplittingPlugin.js' { + declare module.exports: $Exports<'webpack/lib/optimize/AggressiveSplittingPlugin'>; +} +declare module 'webpack/lib/optimize/ChunkModuleIdRangePlugin.js' { + declare module.exports: $Exports<'webpack/lib/optimize/ChunkModuleIdRangePlugin'>; +} +declare module 'webpack/lib/optimize/CommonsChunkPlugin.js' { + declare module.exports: $Exports<'webpack/lib/optimize/CommonsChunkPlugin'>; +} +declare module 'webpack/lib/optimize/ConcatenatedModule.js' { + declare module.exports: $Exports<'webpack/lib/optimize/ConcatenatedModule'>; +} +declare module 'webpack/lib/optimize/DedupePlugin.js' { + declare module.exports: $Exports<'webpack/lib/optimize/DedupePlugin'>; +} +declare module 'webpack/lib/optimize/EnsureChunkConditionsPlugin.js' { + declare module.exports: $Exports<'webpack/lib/optimize/EnsureChunkConditionsPlugin'>; +} +declare module 'webpack/lib/optimize/FlagIncludedChunksPlugin.js' { + declare module.exports: $Exports<'webpack/lib/optimize/FlagIncludedChunksPlugin'>; +} +declare module 'webpack/lib/optimize/LimitChunkCountPlugin.js' { + declare module.exports: $Exports<'webpack/lib/optimize/LimitChunkCountPlugin'>; +} +declare module 'webpack/lib/optimize/MergeDuplicateChunksPlugin.js' { + declare module.exports: $Exports<'webpack/lib/optimize/MergeDuplicateChunksPlugin'>; +} +declare module 'webpack/lib/optimize/MinChunkSizePlugin.js' { + declare module.exports: $Exports<'webpack/lib/optimize/MinChunkSizePlugin'>; +} +declare module 'webpack/lib/optimize/ModuleConcatenationPlugin.js' { + declare module.exports: $Exports<'webpack/lib/optimize/ModuleConcatenationPlugin'>; +} +declare module 'webpack/lib/optimize/OccurrenceOrderPlugin.js' { + declare module.exports: $Exports<'webpack/lib/optimize/OccurrenceOrderPlugin'>; +} +declare module 'webpack/lib/optimize/RemoveEmptyChunksPlugin.js' { + declare module.exports: $Exports<'webpack/lib/optimize/RemoveEmptyChunksPlugin'>; +} +declare module 'webpack/lib/optimize/RemoveParentModulesPlugin.js' { + declare module.exports: $Exports<'webpack/lib/optimize/RemoveParentModulesPlugin'>; +} +declare module 'webpack/lib/optimize/UglifyJsPlugin.js' { + declare module.exports: $Exports<'webpack/lib/optimize/UglifyJsPlugin'>; +} +declare module 'webpack/lib/OptionsApply.js' { + declare module.exports: $Exports<'webpack/lib/OptionsApply'>; +} +declare module 'webpack/lib/OptionsDefaulter.js' { + declare module.exports: $Exports<'webpack/lib/OptionsDefaulter'>; +} +declare module 'webpack/lib/Parser.js' { + declare module.exports: $Exports<'webpack/lib/Parser'>; +} +declare module 'webpack/lib/ParserHelpers.js' { + declare module.exports: $Exports<'webpack/lib/ParserHelpers'>; +} +declare module 'webpack/lib/performance/AssetsOverSizeLimitWarning.js' { + declare module.exports: $Exports<'webpack/lib/performance/AssetsOverSizeLimitWarning'>; +} +declare module 'webpack/lib/performance/EntrypointsOverSizeLimitWarning.js' { + declare module.exports: $Exports<'webpack/lib/performance/EntrypointsOverSizeLimitWarning'>; +} +declare module 'webpack/lib/performance/NoAsyncChunksWarning.js' { + declare module.exports: $Exports<'webpack/lib/performance/NoAsyncChunksWarning'>; +} +declare module 'webpack/lib/performance/SizeLimitsPlugin.js' { + declare module.exports: $Exports<'webpack/lib/performance/SizeLimitsPlugin'>; +} +declare module 'webpack/lib/PrefetchPlugin.js' { + declare module.exports: $Exports<'webpack/lib/PrefetchPlugin'>; +} +declare module 'webpack/lib/prepareOptions.js' { + declare module.exports: $Exports<'webpack/lib/prepareOptions'>; +} +declare module 'webpack/lib/ProgressPlugin.js' { + declare module.exports: $Exports<'webpack/lib/ProgressPlugin'>; +} +declare module 'webpack/lib/ProvidePlugin.js' { + declare module.exports: $Exports<'webpack/lib/ProvidePlugin'>; +} +declare module 'webpack/lib/RawModule.js' { + declare module.exports: $Exports<'webpack/lib/RawModule'>; +} +declare module 'webpack/lib/RecordIdsPlugin.js' { + declare module.exports: $Exports<'webpack/lib/RecordIdsPlugin'>; +} +declare module 'webpack/lib/removeAndDo.js' { + declare module.exports: $Exports<'webpack/lib/removeAndDo'>; +} +declare module 'webpack/lib/RequestShortener.js' { + declare module.exports: $Exports<'webpack/lib/RequestShortener'>; +} +declare module 'webpack/lib/RequireJsStuffPlugin.js' { + declare module.exports: $Exports<'webpack/lib/RequireJsStuffPlugin'>; +} +declare module 'webpack/lib/RuleSet.js' { + declare module.exports: $Exports<'webpack/lib/RuleSet'>; +} +declare module 'webpack/lib/SetVarMainTemplatePlugin.js' { + declare module.exports: $Exports<'webpack/lib/SetVarMainTemplatePlugin'>; +} +declare module 'webpack/lib/SingleEntryPlugin.js' { + declare module.exports: $Exports<'webpack/lib/SingleEntryPlugin'>; +} +declare module 'webpack/lib/SizeFormatHelpers.js' { + declare module.exports: $Exports<'webpack/lib/SizeFormatHelpers'>; +} +declare module 'webpack/lib/SourceMapDevToolModuleOptionsPlugin.js' { + declare module.exports: $Exports<'webpack/lib/SourceMapDevToolModuleOptionsPlugin'>; +} +declare module 'webpack/lib/SourceMapDevToolPlugin.js' { + declare module.exports: $Exports<'webpack/lib/SourceMapDevToolPlugin'>; +} +declare module 'webpack/lib/Stats.js' { + declare module.exports: $Exports<'webpack/lib/Stats'>; +} +declare module 'webpack/lib/Template.js' { + declare module.exports: $Exports<'webpack/lib/Template'>; +} +declare module 'webpack/lib/TemplatedPathPlugin.js' { + declare module.exports: $Exports<'webpack/lib/TemplatedPathPlugin'>; +} +declare module 'webpack/lib/UmdMainTemplatePlugin.js' { + declare module.exports: $Exports<'webpack/lib/UmdMainTemplatePlugin'>; +} +declare module 'webpack/lib/UnsupportedFeatureWarning.js' { + declare module.exports: $Exports<'webpack/lib/UnsupportedFeatureWarning'>; +} +declare module 'webpack/lib/UseStrictPlugin.js' { + declare module.exports: $Exports<'webpack/lib/UseStrictPlugin'>; +} +declare module 'webpack/lib/util/identifier.js' { + declare module.exports: $Exports<'webpack/lib/util/identifier'>; +} +declare module 'webpack/lib/util/Queue.js' { + declare module.exports: $Exports<'webpack/lib/util/Queue'>; +} +declare module 'webpack/lib/util/Semaphore.js' { + declare module.exports: $Exports<'webpack/lib/util/Semaphore'>; +} +declare module 'webpack/lib/util/SortableSet.js' { + declare module.exports: $Exports<'webpack/lib/util/SortableSet'>; +} +declare module 'webpack/lib/validateSchema.js' { + declare module.exports: $Exports<'webpack/lib/validateSchema'>; +} +declare module 'webpack/lib/WarnCaseSensitiveModulesPlugin.js' { + declare module.exports: $Exports<'webpack/lib/WarnCaseSensitiveModulesPlugin'>; +} +declare module 'webpack/lib/WatchIgnorePlugin.js' { + declare module.exports: $Exports<'webpack/lib/WatchIgnorePlugin'>; +} +declare module 'webpack/lib/web/WebEnvironmentPlugin.js' { + declare module.exports: $Exports<'webpack/lib/web/WebEnvironmentPlugin'>; +} +declare module 'webpack/lib/webpack.js' { + declare module.exports: $Exports<'webpack/lib/webpack'>; +} +declare module 'webpack/lib/webpack.web.js' { + declare module.exports: $Exports<'webpack/lib/webpack.web'>; +} +declare module 'webpack/lib/WebpackError.js' { + declare module.exports: $Exports<'webpack/lib/WebpackError'>; +} +declare module 'webpack/lib/WebpackOptionsApply.js' { + declare module.exports: $Exports<'webpack/lib/WebpackOptionsApply'>; +} +declare module 'webpack/lib/WebpackOptionsDefaulter.js' { + declare module.exports: $Exports<'webpack/lib/WebpackOptionsDefaulter'>; +} +declare module 'webpack/lib/WebpackOptionsValidationError.js' { + declare module.exports: $Exports<'webpack/lib/WebpackOptionsValidationError'>; +} +declare module 'webpack/lib/webworker/WebWorkerChunkTemplatePlugin.js' { + declare module.exports: $Exports<'webpack/lib/webworker/WebWorkerChunkTemplatePlugin'>; +} +declare module 'webpack/lib/webworker/WebWorkerHotUpdateChunkTemplatePlugin.js' { + declare module.exports: $Exports<'webpack/lib/webworker/WebWorkerHotUpdateChunkTemplatePlugin'>; +} +declare module 'webpack/lib/webworker/WebWorkerMainTemplate.runtime.js' { + declare module.exports: $Exports<'webpack/lib/webworker/WebWorkerMainTemplate.runtime'>; +} +declare module 'webpack/lib/webworker/WebWorkerMainTemplatePlugin.js' { + declare module.exports: $Exports<'webpack/lib/webworker/WebWorkerMainTemplatePlugin'>; +} +declare module 'webpack/lib/webworker/WebWorkerTemplatePlugin.js' { + declare module.exports: $Exports<'webpack/lib/webworker/WebWorkerTemplatePlugin'>; +} +declare module 'webpack/schemas/ajv.absolutePath.js' { + declare module.exports: $Exports<'webpack/schemas/ajv.absolutePath'>; +} +declare module 'webpack/web_modules/node-libs-browser.js' { + declare module.exports: $Exports<'webpack/web_modules/node-libs-browser'>; +} diff --git a/flow-typed/npm/x-img-diff-js_vx.x.x.js b/flow-typed/npm/x-img-diff-js_vx.x.x.js new file mode 100644 index 00000000..d3f26192 --- /dev/null +++ b/flow-typed/npm/x-img-diff-js_vx.x.x.js @@ -0,0 +1,60 @@ +// flow-typed signature: 8f32dd23b7a079fa1e3e5ea796c84508 +// flow-typed version: <>/x-img-diff-js_v0.3.5/flow_v0.63.1 + +/** + * This is an autogenerated libdef stub for: + * + * 'x-img-diff-js' + * + * Fill this stub out by replacing all the `any` types. + * + * Once filled out, we encourage you to share your work with the + * community by sending a pull request to: + * https://github.com/flowtype/flow-typed + */ + +declare module 'x-img-diff-js' { + declare module.exports: any; +} + +/** + * We include stubs for each file inside this npm package in case you need to + * require those files directly. Feel free to delete any files that aren't + * needed. + */ +declare module 'x-img-diff-js/binding-gen/post' { + declare module.exports: any; +} + +declare module 'x-img-diff-js/build/cv-wasm_browser' { + declare module.exports: any; +} + +declare module 'x-img-diff-js/build/cv-wasm_node' { + declare module.exports: any; +} + +declare module 'x-img-diff-js/src/index' { + declare module.exports: any; +} + +declare module 'x-img-diff-js/test/test_node' { + declare module.exports: any; +} + +// Filename aliases +declare module 'x-img-diff-js/binding-gen/post.js' { + declare module.exports: $Exports<'x-img-diff-js/binding-gen/post'>; +} +declare module 'x-img-diff-js/build/cv-wasm_browser.js' { + declare module.exports: $Exports<'x-img-diff-js/build/cv-wasm_browser'>; +} +declare module 'x-img-diff-js/build/cv-wasm_node.js' { + declare module.exports: $Exports<'x-img-diff-js/build/cv-wasm_node'>; +} +declare module 'x-img-diff-js/src/index.js' { + declare module.exports: $Exports<'x-img-diff-js/src/index'>; +} +declare module 'x-img-diff-js/test/test_node.js' { + declare module.exports: $Exports<'x-img-diff-js/test/test_node'>; +} diff --git a/package.json b/package.json index 009fbc08..7e2e84dc 100644 --- a/package.json +++ b/package.json @@ -1,56 +1,129 @@ { - "name": "@bokuweb/reg-cli-wasm", - "version": "0.0.0-experimental6", - "description": "Visual regression testing CLI, Wasm-backed. Drop-in compatible with classic reg-cli's CLI flags, reg.json/junit schema, and `compare()` EventEmitter API (verified against reg-suit's processor.ts).", - "type": "module", - "exports": { - ".": { - "types": "./dist/index.d.ts", - "import": "./dist/index.mjs", - "require": "./dist/index.cjs" - } + "name": "reg-cli", + "version": "0.18.16", + "description": "", + "main": "./dist/index.js", + "start": "node ./dist/cli.js", + "scripts": { + "watch": "babel src --watch -d dist", + "build": "npm run build:cli && npm run build:report", + "build:cli": "babel src -d dist", + "build:report": "sh ./scripts/build-ui.sh v0.5.0", + "flow": "flow", + "copy:ximgdiff": "copyfiles -u 3 node_modules/x-img-diff-js/build/cv-wasm_browser.* report/assets", + "prepublishOnly": "npm run build", + "reg": "node dist/cli.js ./sample/actual ./sample/expected ./sample/diff -I -R ./sample/index.html -T 0.01 -X client", + "reg:from": "node dist/cli.js -F ./sample/reg.json -R ./sample/index.html", + "screenshot": "node test/screenshot.js", + "test:cli": "chmod +x dist/cli.js && ava test/cli.test.mjs", + "test:screenshot": "npm run build:report && npm run reg && npm run screenshot", + "test": "export NODE_OPTIONS=--openssl-legacy-provider && cross-env NODE_ENV=\"debug\" npm run build:report && npm run build && npm run test:cli && npm run test:screenshot" }, "engines": { - "node": ">=20" - }, - "main": "./dist/index.cjs", - "module": "./dist/index.mjs", - "types": "./dist/index.d.ts", - "files": [ - "dist" - ], - "bin": { - "reg-cli": "./dist/cli.mjs" - }, - "scripts": { - "build": "unbuild && cp reg.wasm ./dist/shared/reg.wasm", - "build:report": "sh ./scripts/build-ui.sh v0.3.0", - "build:wasm": "bash ./scripts/build-wasm.sh", - "release:prep": "bash ./scripts/release.sh", - "release:pack": "bash ./scripts/release.sh --pack", - "test": "node --test test/", - "prepublishOnly": "npm run build" + "node": ">=18" }, "repository": { "type": "git", "url": "https://github.com/reg-viz/reg-cli/" }, - "keywords": [], + "ava": { + "workerThreads": false + }, "author": "bokuweb", "license": "MIT", + "pnpm": { + "overrides": { + "set-value": "4.1.0", + "tar": "^7.5.13", + "tar-fs": "3.1.2", + "ws": "8.17.1", + "kind-of": "^6.0.3", + "randomatic": "3.1.1", + "deep-extend": "0.6.0", + "lodash": "4.18.1", + "yargs-parser": "^21.0.0", + "minimist": "^1.2.3", + "ajv": "^8.0.0", + "json-schema": "^0.4.0", + "ansi-regex": "^5.0.1", + "glob-parent": "^6.0.1", + "dot-prop": "^10.0.0", + "node-forge": "^1.0.0", + "serialize-javascript": "^7.0.0", + "y18n": "^5.0.0", + "braces": "^3.0.0", + "trim-newlines": "3.0.1", + "brace-expansion": "5.0.5", + "debug": "^4.3.4", + "@octokit/request-error@>=1.0.0 <5.1.1": ">=5.1.1", + "@octokit/plugin-paginate-rest@>=1.0.0 <9.2.2": ">=9.2.2", + "@octokit/request@>=1.0.0 <8.4.1": ">=8.4.1", + "minimatch@<3.1.4": "^3.1.4", + "minimatch@>=4.0.0 <4.2.5": "^4.2.5", + "minimatch@>=5.0.0 <5.1.8": "^5.1.8", + "minimatch@>=6.0.0 <6.2.2": "^6.2.2", + "minimatch@>=7.0.0 <7.4.8": "^7.4.8", + "minimatch@>=8.0.0 <8.0.6": "^8.0.6", + "minimatch@>=9.0.0 <9.0.7": "^9.0.7", + "minimatch@>=10.0.0 <10.2.3": "^10.2.3", + "basic-ftp@<5.2.0": ">=5.2.0", + "ajv@>=7.0.0-alpha.0 <8.18.0": ">=8.18.0", + "picomatch@<2.3.2": ">=2.3.2", + "picomatch@>=4.0.0 <4.0.4": ">=4.0.4", + "basic-ftp@<=5.2.1": ">=5.2.2", + "simple-git@<3.32.0": ">=3.32.0", + "simple-git@>=3.15.0 <3.32.3": ">=3.32.3", + "basic-ftp@<=5.2.2": ">=5.3.0" + } + }, "dependencies": { - "@tybys/wasm-util": "^0.9.0", - "x-img-diff-js": "^0.3.5", - "@opentelemetry/api": "^1.9.0", - "@opentelemetry/sdk-node": "^0.57.2", - "@opentelemetry/exporter-trace-otlp-http": "^0.57.2", - "@opentelemetry/resources": "^1.30.1", - "@opentelemetry/semantic-conventions": "^1.28.0" + "bluebird": "3.7.2", + "chalk": "4.1.2", + "cli-spinner": "0.2.10", + "cross-spawn": "7.0.6", + "del": "8.0.1", + "glob": "7.2.3", + "img-diff-js": "0.5.4", + "jpeg-js": "^0.4.4", + "lodash": "4.18.1", + "make-dir": "3.1.0", + "md5-file": "4.0.0", + "meow": "^9.0.0", + "mustache": "4.2.0", + "x-img-diff-js": "0.3.5", + "xmlbuilder2": "^4.0.3", + "yargs-parser": "^21.0.1" }, "devDependencies": { - "@types/node": "^22.5.5", - "@pyroscope/nodejs": "^0.4.1", - "unbuild": "^2.0.0" + "@babel/cli": "^7.28.3", + "@babel/core": "^7.28.5", + "@babel/plugin-transform-block-scoping": "^7.28.5", + "@babel/plugin-transform-flow-strip-types": "^7.27.1", + "@babel/preset-env": "^7.28.5", + "@babel/preset-flow": "^7.27.1", + "@babel/preset-stage-2": "^7.8.3", + "ava": "8.0.0", + "copyfiles": "2.4.1", + "cross-env": "10.1.0", + "finalhandler": "2.1.1", + "flow-bin": "0.77.0", + "flow-typed": "4.1.1", + "puppeteer": "24.42.0", + "rimraf": "3.0.2", + "serve-static": "2.2.1" + }, + "files": [ + "dist", + "template", + "report/ui/dist/report.js", + "report/ui/dist/worker.js", + "report/ui/dist/style.css", + "report/assets/favicon_failure.png", + "report/assets/favicon_success.png", + "report/sample" + ], + "bin": { + "reg-cli": "./dist/cli.js" }, "packageManager": "pnpm@10.33.2+sha512.a90faf6feeab71ad6c6e57f94e0fe1a12f5dcc22cd754db40ae9593eb6a3e0b6b12e3540218bb37ae083404b1f2ce6db2a4121e979829b4aff94b99f49da1cf8" } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index c94b32ef..44616c12 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -4,698 +4,810 @@ settings: autoInstallPeers: true excludeLinksFromLockfile: false +overrides: + set-value: 4.1.0 + tar: ^7.5.13 + tar-fs: 3.1.2 + ws: 8.17.1 + kind-of: ^6.0.3 + randomatic: 3.1.1 + deep-extend: 0.6.0 + lodash: 4.18.1 + yargs-parser: ^21.0.0 + minimist: ^1.2.3 + ajv: ^8.0.0 + json-schema: ^0.4.0 + ansi-regex: ^5.0.1 + glob-parent: ^6.0.1 + dot-prop: ^10.0.0 + node-forge: ^1.0.0 + serialize-javascript: ^7.0.0 + y18n: ^5.0.0 + braces: ^3.0.0 + trim-newlines: 3.0.1 + brace-expansion: 5.0.5 + debug: ^4.3.4 + '@octokit/request-error@>=1.0.0 <5.1.1': '>=5.1.1' + '@octokit/plugin-paginate-rest@>=1.0.0 <9.2.2': '>=9.2.2' + '@octokit/request@>=1.0.0 <8.4.1': '>=8.4.1' + minimatch@<3.1.4: ^3.1.4 + minimatch@>=4.0.0 <4.2.5: ^4.2.5 + minimatch@>=5.0.0 <5.1.8: ^5.1.8 + minimatch@>=6.0.0 <6.2.2: ^6.2.2 + minimatch@>=7.0.0 <7.4.8: ^7.4.8 + minimatch@>=8.0.0 <8.0.6: ^8.0.6 + minimatch@>=9.0.0 <9.0.7: ^9.0.7 + minimatch@>=10.0.0 <10.2.3: ^10.2.3 + basic-ftp@<5.2.0: '>=5.2.0' + ajv@>=7.0.0-alpha.0 <8.18.0: '>=8.18.0' + picomatch@<2.3.2: '>=2.3.2' + picomatch@>=4.0.0 <4.0.4: '>=4.0.4' + basic-ftp@<=5.2.1: '>=5.2.2' + simple-git@<3.32.0: '>=3.32.0' + simple-git@>=3.15.0 <3.32.3: '>=3.32.3' + basic-ftp@<=5.2.2: '>=5.3.0' + importers: .: dependencies: - '@opentelemetry/api': - specifier: ^1.9.0 - version: 1.9.0 - '@opentelemetry/exporter-trace-otlp-http': - specifier: ^0.57.2 - version: 0.57.2(@opentelemetry/api@1.9.0) - '@opentelemetry/resources': - specifier: ^1.30.1 - version: 1.30.1(@opentelemetry/api@1.9.0) - '@opentelemetry/sdk-node': - specifier: ^0.57.2 - version: 0.57.2(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': - specifier: ^1.28.0 - version: 1.38.0 - '@tybys/wasm-util': - specifier: ^0.9.0 - version: 0.9.0 + bluebird: + specifier: 3.7.2 + version: 3.7.2 + chalk: + specifier: 4.1.2 + version: 4.1.2 + cli-spinner: + specifier: 0.2.10 + version: 0.2.10 + cross-spawn: + specifier: 7.0.6 + version: 7.0.6 + del: + specifier: 8.0.1 + version: 8.0.1 + glob: + specifier: 7.2.3 + version: 7.2.3 + img-diff-js: + specifier: 0.5.4 + version: 0.5.4 + jpeg-js: + specifier: ^0.4.4 + version: 0.4.4 + lodash: + specifier: 4.18.1 + version: 4.18.1 + make-dir: + specifier: 3.1.0 + version: 3.1.0 + md5-file: + specifier: 4.0.0 + version: 4.0.0 + meow: + specifier: ^9.0.0 + version: 9.0.0 + mustache: + specifier: 4.2.0 + version: 4.2.0 x-img-diff-js: - specifier: ^0.3.5 + specifier: 0.3.5 version: 0.3.5 + xmlbuilder2: + specifier: ^4.0.3 + version: 4.0.3 + yargs-parser: + specifier: ^21.0.0 + version: 21.1.1 devDependencies: - '@pyroscope/nodejs': - specifier: ^0.4.1 - version: 0.4.1 - '@types/node': - specifier: ^22.5.5 - version: 22.5.5 - unbuild: - specifier: ^2.0.0 - version: 2.0.0(typescript@5.6.2) + '@babel/cli': + specifier: ^7.28.3 + version: 7.28.6(@babel/core@7.29.0) + '@babel/core': + specifier: ^7.28.5 + version: 7.29.0 + '@babel/plugin-transform-block-scoping': + specifier: ^7.28.5 + version: 7.28.6(@babel/core@7.29.0) + '@babel/plugin-transform-flow-strip-types': + specifier: ^7.27.1 + version: 7.27.1(@babel/core@7.29.0) + '@babel/preset-env': + specifier: ^7.28.5 + version: 7.29.3(@babel/core@7.29.0) + '@babel/preset-flow': + specifier: ^7.27.1 + version: 7.27.1(@babel/core@7.29.0) + '@babel/preset-stage-2': + specifier: ^7.8.3 + version: 7.8.3 + ava: + specifier: 8.0.0 + version: 8.0.0 + copyfiles: + specifier: 2.4.1 + version: 2.4.1 + cross-env: + specifier: 10.1.0 + version: 10.1.0 + finalhandler: + specifier: 2.1.1 + version: 2.1.1 + flow-bin: + specifier: 0.77.0 + version: 0.77.0 + flow-typed: + specifier: 4.1.1 + version: 4.1.1 + puppeteer: + specifier: 24.42.0 + version: 24.42.0 + rimraf: + specifier: 3.0.2 + version: 3.0.2 + serve-static: + specifier: 2.2.1 + version: 2.2.1 packages: - '@ampproject/remapping@2.3.0': - resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} - engines: {node: '>=6.0.0'} + '@babel/cli@7.28.6': + resolution: {integrity: sha512-6EUNcuBbNkj08Oj4gAZ+BUU8yLCgKzgVX4gaTh09Ya2C8ICM4P+G30g4m3akRxSYAp3A/gnWchrNst7px4/nUQ==} + engines: {node: '>=6.9.0'} + hasBin: true + peerDependencies: + '@babel/core': ^7.0.0-0 - '@babel/code-frame@7.24.7': - resolution: {integrity: sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA==} + '@babel/code-frame@7.29.0': + resolution: {integrity: sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw==} engines: {node: '>=6.9.0'} - '@babel/compat-data@7.25.4': - resolution: {integrity: sha512-+LGRog6RAsCJrrrg/IO6LGmpphNe5DiK30dGjCoxxeGv49B10/3XYGxPsAwrDlMFcFEvdAUavDT8r9k/hSyQqQ==} + '@babel/compat-data@7.29.3': + resolution: {integrity: sha512-LIVqM46zQWZhj17qA8wb4nW/ixr2y1Nw+r1etiAWgRM6U1IqP+LNhL1yg440jYZR72jCWcWbLWzIosH+uP1fqg==} engines: {node: '>=6.9.0'} - '@babel/core@7.25.2': - resolution: {integrity: sha512-BBt3opiCOxUr9euZ5/ro/Xv8/V7yJ5bjYMqG/C1YAo8MIKAnumZalCN+msbci3Pigy4lIQfPUpfMM27HMGaYEA==} + '@babel/core@7.29.0': + resolution: {integrity: sha512-CGOfOJqWjg2qW/Mb6zNsDm+u5vFQ8DxXfbM09z69p5Z6+mE1ikP2jUXw+j42Pf1XTYED2Rni5f95npYeuwMDQA==} engines: {node: '>=6.9.0'} - '@babel/generator@7.25.6': - resolution: {integrity: sha512-VPC82gr1seXOpkjAAKoLhP50vx4vGNlF4msF64dSFq1P8RfB+QAuJWGHPXXPc8QyfVWwwB/TNNU4+ayZmHNbZw==} + '@babel/generator@7.29.0': + resolution: {integrity: sha512-vSH118/wwM/pLR38g/Sgk05sNtro6TlTJKuiMXDaZqPUfjTFcudpCOt00IhOfj+1BFAX+UFAlzCU+6WXr3GLFQ==} engines: {node: '>=6.9.0'} - '@babel/helper-compilation-targets@7.25.2': - resolution: {integrity: sha512-U2U5LsSaZ7TAt3cfaymQ8WHh0pxvdHoEk6HVpaexxixjyEquMh0L0YNJNM6CTGKMXV1iksi0iZkGw4AcFkPaaw==} + '@babel/helper-annotate-as-pure@7.27.3': + resolution: {integrity: sha512-fXSwMQqitTGeHLBC08Eq5yXz2m37E4pJX1qAU1+2cNedz/ifv/bVXft90VeSav5nFO61EcNgwr0aJxbyPaWBPg==} engines: {node: '>=6.9.0'} - '@babel/helper-module-imports@7.24.7': - resolution: {integrity: sha512-8AyH3C+74cgCVVXow/myrynrAGv+nTVg5vKu2nZph9x7RcRwzmh0VFallJuFTZ9mx6u4eSdXZfcOzSqTUm0HCA==} + '@babel/helper-compilation-targets@7.28.6': + resolution: {integrity: sha512-JYtls3hqi15fcx5GaSNL7SCTJ2MNmjrkHXg4FSpOA/grxK8KwyZ5bubHsCq8FXCkua6xhuaaBit+3b7+VZRfcA==} engines: {node: '>=6.9.0'} - '@babel/helper-module-transforms@7.25.2': - resolution: {integrity: sha512-BjyRAbix6j/wv83ftcVJmBt72QtHI56C7JXZoG2xATiLpmoC7dpd8WnkikExHDVPpi/3qCmO6WY1EaXOluiecQ==} + '@babel/helper-create-class-features-plugin@7.29.3': + resolution: {integrity: sha512-RpLYy2sb51oNLjuu1iD3bwBqCBWUzjO0ocp+iaCP/lJtb2CPLcnC2Fftw+4sAzaMELGeWTgExSKADbdo0GFVzA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 - '@babel/helper-simple-access@7.24.7': - resolution: {integrity: sha512-zBAIvbCMh5Ts+b86r/CjU+4XGYIs+R1j951gxI3KmmxBMhCg4oQMsv6ZXQ64XOm/cvzfU1FmoCyt6+owc5QMYg==} + '@babel/helper-create-regexp-features-plugin@7.28.5': + resolution: {integrity: sha512-N1EhvLtHzOvj7QQOUCCS3NrPJP8c5W6ZXCHDn7Yialuy1iu4r5EmIYkXlKNqT99Ciw+W0mDqWoR6HWMZlFP3hw==} engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 - '@babel/helper-string-parser@7.24.8': - resolution: {integrity: sha512-pO9KhhRcuUyGnJWwyEgnRJTSIZHiT+vMD0kPeD+so0l7mxkMT19g3pjY9GTnHySck/hDzq+dtW/4VgnMkippsQ==} - engines: {node: '>=6.9.0'} + '@babel/helper-define-polyfill-provider@0.6.8': + resolution: {integrity: sha512-47UwBLPpQi1NoWzLuHNjRoHlYXMwIJoBf7MFou6viC/sIHWYygpvr0B6IAyh5sBdA2nr2LPIRww8lfaUVQINBA==} + peerDependencies: + '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 - '@babel/helper-validator-identifier@7.24.7': - resolution: {integrity: sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==} + '@babel/helper-globals@7.28.0': + resolution: {integrity: sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==} engines: {node: '>=6.9.0'} - '@babel/helper-validator-option@7.24.8': - resolution: {integrity: sha512-xb8t9tD1MHLungh/AIoWYN+gVHaB9kwlu8gffXGSt3FFEIT7RjS+xWbc2vUD1UTZdIpKj/ab3rdqJ7ufngyi2Q==} + '@babel/helper-member-expression-to-functions@7.28.5': + resolution: {integrity: sha512-cwM7SBRZcPCLgl8a7cY0soT1SptSzAlMH39vwiRpOQkJlh53r5hdHwLSCZpQdVLT39sZt+CRpNwYG4Y2v77atg==} engines: {node: '>=6.9.0'} - '@babel/helpers@7.25.6': - resolution: {integrity: sha512-Xg0tn4HcfTijTwfDwYlvVCl43V6h4KyVVX2aEm4qdO/PC6L2YvzLHFdmxhoeSA3eslcE6+ZVXHgWwopXYLNq4Q==} + '@babel/helper-module-imports@7.28.6': + resolution: {integrity: sha512-l5XkZK7r7wa9LucGw9LwZyyCUscb4x37JWTPz7swwFE/0FMQAGpiWUZn8u9DzkSBWEcK25jmvubfpw2dnAMdbw==} engines: {node: '>=6.9.0'} - '@babel/highlight@7.24.7': - resolution: {integrity: sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw==} + '@babel/helper-module-transforms@7.28.6': + resolution: {integrity: sha512-67oXFAYr2cDLDVGLXTEABjdBJZ6drElUSI7WKp70NrpyISso3plG9SAGEF6y7zbha/wOzUByWWTJvEDVNIUGcA==} engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 - '@babel/parser@7.25.6': - resolution: {integrity: sha512-trGdfBdbD0l1ZPmcJ83eNxB9rbEax4ALFTF7fN386TMYbeCQbyme5cOEXQhbGXKebwGaB/J52w1mrklMcbgy6Q==} - engines: {node: '>=6.0.0'} - hasBin: true - - '@babel/standalone@7.25.6': - resolution: {integrity: sha512-Kf2ZcZVqsKbtYhlA7sP0z5A3q5hmCVYMKMWRWNK/5OVwHIve3JY1djVRmIVAx8FMueLIfZGKQDIILK2w8zO4mg==} + '@babel/helper-optimise-call-expression@7.27.1': + resolution: {integrity: sha512-URMGH08NzYFhubNSGJrpUEphGKQwMQYBySzat5cAByY1/YgIRkULnIy3tAMeszlL/so2HbeilYloUmSpd7GdVw==} engines: {node: '>=6.9.0'} - '@babel/template@7.25.0': - resolution: {integrity: sha512-aOOgh1/5XzKvg1jvVz7AVrx2piJ2XBi227DHmbY6y+bM9H2FlN+IfecYu4Xl0cNiiVejlsCri89LUsbj8vJD9Q==} + '@babel/helper-plugin-utils@7.27.1': + resolution: {integrity: sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==} engines: {node: '>=6.9.0'} - '@babel/traverse@7.25.6': - resolution: {integrity: sha512-9Vrcx5ZW6UwK5tvqsj0nGpp/XzqthkT0dqIc9g1AdtygFToNtTF67XzYS//dm+SAK9cp3B9R4ZO/46p63SCjlQ==} + '@babel/helper-plugin-utils@7.28.6': + resolution: {integrity: sha512-S9gzZ/bz83GRysI7gAD4wPT/AI3uCnY+9xn+Mx/KPs2JwHJIz1W8PZkg2cqyt3RNOBM8ejcXhV6y8Og7ly/Dug==} engines: {node: '>=6.9.0'} - '@babel/types@7.25.6': - resolution: {integrity: sha512-/l42B1qxpG6RdfYf343Uw1vmDjeNhneUXtzhojE7pDgfpEypmRhI6j1kr17XCVv4Cgl9HdAiQY2x0GwKm7rWCw==} + '@babel/helper-remap-async-to-generator@7.27.1': + resolution: {integrity: sha512-7fiA521aVw8lSPeI4ZOD3vRFkoqkJcS+z4hFo82bFSH/2tNd6eJ5qCVMS5OzDmZh/kaHQeBaeyxK6wljcPtveA==} engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 - '@datadog/pprof@5.4.1': - resolution: {integrity: sha512-IvpL96e/cuh8ugP5O8Czdup7XQOLHeIDgM5pac5W7Lc1YzGe5zTtebKFpitvb1CPw1YY+1qFx0pWGgKP2kOfHg==} - engines: {node: '>=16'} - - '@esbuild/aix-ppc64@0.19.12': - resolution: {integrity: sha512-bmoCYyWdEL3wDQIVbcyzRyeKLgk2WtWLTWz1ZIAZF/EGbNOwSA6ew3PftJ1PqMiOOGu0OyFMzG53L0zqIpPeNA==} - engines: {node: '>=12'} - cpu: [ppc64] - os: [aix] - - '@esbuild/aix-ppc64@0.23.1': - resolution: {integrity: sha512-6VhYk1diRqrhBAqpJEdjASR/+WVRtfjpqKuNw11cLiaWpAT/Uu+nokB+UJnevzy/P9C/ty6AOe0dwueMrGh/iQ==} - engines: {node: '>=18'} - cpu: [ppc64] - os: [aix] - - '@esbuild/android-arm64@0.19.12': - resolution: {integrity: sha512-P0UVNGIienjZv3f5zq0DP3Nt2IE/3plFzuaS96vihvD0Hd6H/q4WXUGpCxD/E8YrSXfNyRPbpTq+T8ZQioSuPA==} - engines: {node: '>=12'} - cpu: [arm64] - os: [android] - - '@esbuild/android-arm64@0.23.1': - resolution: {integrity: sha512-xw50ipykXcLstLeWH7WRdQuysJqejuAGPd30vd1i5zSyKK3WE+ijzHmLKxdiCMtH1pHz78rOg0BKSYOSB/2Khw==} - engines: {node: '>=18'} - cpu: [arm64] - os: [android] - - '@esbuild/android-arm@0.19.12': - resolution: {integrity: sha512-qg/Lj1mu3CdQlDEEiWrlC4eaPZ1KztwGJ9B6J+/6G+/4ewxJg7gqj8eVYWvao1bXrqGiW2rsBZFSX3q2lcW05w==} - engines: {node: '>=12'} - cpu: [arm] - os: [android] - - '@esbuild/android-arm@0.23.1': - resolution: {integrity: sha512-uz6/tEy2IFm9RYOyvKl88zdzZfwEfKZmnX9Cj1BHjeSGNuGLuMD1kR8y5bteYmwqKm1tj8m4cb/aKEorr6fHWQ==} - engines: {node: '>=18'} - cpu: [arm] - os: [android] - - '@esbuild/android-x64@0.19.12': - resolution: {integrity: sha512-3k7ZoUW6Q6YqhdhIaq/WZ7HwBpnFBlW905Fa4s4qWJyiNOgT1dOqDiVAQFwBH7gBRZr17gLrlFCRzF6jFh7Kew==} - engines: {node: '>=12'} - cpu: [x64] - os: [android] - - '@esbuild/android-x64@0.23.1': - resolution: {integrity: sha512-nlN9B69St9BwUoB+jkyU090bru8L0NA3yFvAd7k8dNsVH8bi9a8cUAUSEcEEgTp2z3dbEDGJGfP6VUnkQnlReg==} - engines: {node: '>=18'} - cpu: [x64] - os: [android] - - '@esbuild/darwin-arm64@0.19.12': - resolution: {integrity: sha512-B6IeSgZgtEzGC42jsI+YYu9Z3HKRxp8ZT3cqhvliEHovq8HSX2YX8lNocDn79gCKJXOSaEot9MVYky7AKjCs8g==} - engines: {node: '>=12'} - cpu: [arm64] - os: [darwin] - - '@esbuild/darwin-arm64@0.23.1': - resolution: {integrity: sha512-YsS2e3Wtgnw7Wq53XXBLcV6JhRsEq8hkfg91ESVadIrzr9wO6jJDMZnCQbHm1Guc5t/CdDiFSSfWP58FNuvT3Q==} - engines: {node: '>=18'} - cpu: [arm64] - os: [darwin] - - '@esbuild/darwin-x64@0.19.12': - resolution: {integrity: sha512-hKoVkKzFiToTgn+41qGhsUJXFlIjxI/jSYeZf3ugemDYZldIXIxhvwN6erJGlX4t5h417iFuheZ7l+YVn05N3A==} - engines: {node: '>=12'} - cpu: [x64] - os: [darwin] - - '@esbuild/darwin-x64@0.23.1': - resolution: {integrity: sha512-aClqdgTDVPSEGgoCS8QDG37Gu8yc9lTHNAQlsztQ6ENetKEO//b8y31MMu2ZaPbn4kVsIABzVLXYLhCGekGDqw==} - engines: {node: '>=18'} - cpu: [x64] - os: [darwin] + '@babel/helper-replace-supers@7.28.6': + resolution: {integrity: sha512-mq8e+laIk94/yFec3DxSjCRD2Z0TAjhVbEJY3UQrlwVo15Lmt7C2wAUbK4bjnTs4APkwsYLTahXRraQXhb1WCg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 - '@esbuild/freebsd-arm64@0.19.12': - resolution: {integrity: sha512-4aRvFIXmwAcDBw9AueDQ2YnGmz5L6obe5kmPT8Vd+/+x/JMVKCgdcRwH6APrbpNXsPz+K653Qg8HB/oXvXVukA==} - engines: {node: '>=12'} - cpu: [arm64] - os: [freebsd] + '@babel/helper-skip-transparent-expression-wrappers@7.27.1': + resolution: {integrity: sha512-Tub4ZKEXqbPjXgWLl2+3JpQAYBJ8+ikpQ2Ocj/q/r0LwE3UhENh7EUabyHjz2kCEsrRY83ew2DQdHluuiDQFzg==} + engines: {node: '>=6.9.0'} - '@esbuild/freebsd-arm64@0.23.1': - resolution: {integrity: sha512-h1k6yS8/pN/NHlMl5+v4XPfikhJulk4G+tKGFIOwURBSFzE8bixw1ebjluLOjfwtLqY0kewfjLSrO6tN2MgIhA==} - engines: {node: '>=18'} - cpu: [arm64] - os: [freebsd] + '@babel/helper-string-parser@7.27.1': + resolution: {integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==} + engines: {node: '>=6.9.0'} - '@esbuild/freebsd-x64@0.19.12': - resolution: {integrity: sha512-EYoXZ4d8xtBoVN7CEwWY2IN4ho76xjYXqSXMNccFSx2lgqOG/1TBPW0yPx1bJZk94qu3tX0fycJeeQsKovA8gg==} - engines: {node: '>=12'} - cpu: [x64] - os: [freebsd] + '@babel/helper-validator-identifier@7.28.5': + resolution: {integrity: sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==} + engines: {node: '>=6.9.0'} - '@esbuild/freebsd-x64@0.23.1': - resolution: {integrity: sha512-lK1eJeyk1ZX8UklqFd/3A60UuZ/6UVfGT2LuGo3Wp4/z7eRTRYY+0xOu2kpClP+vMTi9wKOfXi2vjUpO1Ro76g==} - engines: {node: '>=18'} - cpu: [x64] - os: [freebsd] + '@babel/helper-validator-option@7.27.1': + resolution: {integrity: sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==} + engines: {node: '>=6.9.0'} - '@esbuild/linux-arm64@0.19.12': - resolution: {integrity: sha512-EoTjyYyLuVPfdPLsGVVVC8a0p1BFFvtpQDB/YLEhaXyf/5bczaGeN15QkR+O4S5LeJ92Tqotve7i1jn35qwvdA==} - engines: {node: '>=12'} - cpu: [arm64] - os: [linux] + '@babel/helper-wrap-function@7.28.6': + resolution: {integrity: sha512-z+PwLziMNBeSQJonizz2AGnndLsP2DeGHIxDAn+wdHOGuo4Fo1x1HBPPXeE9TAOPHNNWQKCSlA2VZyYyyibDnQ==} + engines: {node: '>=6.9.0'} - '@esbuild/linux-arm64@0.23.1': - resolution: {integrity: sha512-/93bf2yxencYDnItMYV/v116zff6UyTjo4EtEQjUBeGiVpMmffDNUyD9UN2zV+V3LRV3/on4xdZ26NKzn6754g==} - engines: {node: '>=18'} - cpu: [arm64] - os: [linux] + '@babel/helpers@7.28.6': + resolution: {integrity: sha512-xOBvwq86HHdB7WUDTfKfT/Vuxh7gElQ+Sfti2Cy6yIWNW05P8iUslOVcZ4/sKbE+/jQaukQAdz/gf3724kYdqw==} + engines: {node: '>=6.9.0'} - '@esbuild/linux-arm@0.19.12': - resolution: {integrity: sha512-J5jPms//KhSNv+LO1S1TX1UWp1ucM6N6XuL6ITdKWElCu8wXP72l9MM0zDTzzeikVyqFE6U8YAV9/tFyj0ti+w==} - engines: {node: '>=12'} - cpu: [arm] - os: [linux] + '@babel/highlight@7.25.9': + resolution: {integrity: sha512-llL88JShoCsth8fF8R4SJnIn+WLvR6ccFxu1H3FlMhDontdcmZWf2HgIZ7AIqV3Xcck1idlohrN4EUBQz6klbw==} + engines: {node: '>=6.9.0'} - '@esbuild/linux-arm@0.23.1': - resolution: {integrity: sha512-CXXkzgn+dXAPs3WBwE+Kvnrf4WECwBdfjfeYHpMeVxWE0EceB6vhWGShs6wi0IYEqMSIzdOF1XjQ/Mkm5d7ZdQ==} - engines: {node: '>=18'} - cpu: [arm] - os: [linux] + '@babel/parser@7.29.0': + resolution: {integrity: sha512-IyDgFV5GeDUVX4YdF/3CPULtVGSXXMLh1xVIgdCgxApktqnQV0r7/8Nqthg+8YLGaAtdyIlo2qIdZrbCv4+7ww==} + engines: {node: '>=6.0.0'} + hasBin: true - '@esbuild/linux-ia32@0.19.12': - resolution: {integrity: sha512-Thsa42rrP1+UIGaWz47uydHSBOgTUnwBwNq59khgIwktK6x60Hivfbux9iNR0eHCHzOLjLMLfUMLCypBkZXMHA==} - engines: {node: '>=12'} - cpu: [ia32] - os: [linux] + '@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.28.5': + resolution: {integrity: sha512-87GDMS3tsmMSi/3bWOte1UblL+YUTFMV8SZPZ2eSEL17s74Cw/l63rR6NmGVKMYW2GYi85nE+/d6Hw5N0bEk2Q==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 - '@esbuild/linux-ia32@0.23.1': - resolution: {integrity: sha512-VTN4EuOHwXEkXzX5nTvVY4s7E/Krz7COC8xkftbbKRYAl96vPiUssGkeMELQMOnLOJ8k3BY1+ZY52tttZnHcXQ==} - engines: {node: '>=18'} - cpu: [ia32] - os: [linux] + '@babel/plugin-bugfix-safari-class-field-initializer-scope@7.27.1': + resolution: {integrity: sha512-qNeq3bCKnGgLkEXUuFry6dPlGfCdQNZbn7yUAPCInwAJHMU7THJfrBSozkcWq5sNM6RcF3S8XyQL2A52KNR9IA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 - '@esbuild/linux-loong64@0.19.12': - resolution: {integrity: sha512-LiXdXA0s3IqRRjm6rV6XaWATScKAXjI4R4LoDlvO7+yQqFdlr1Bax62sRwkVvRIrwXxvtYEHHI4dm50jAXkuAA==} - engines: {node: '>=12'} - cpu: [loong64] - os: [linux] + '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.27.1': + resolution: {integrity: sha512-g4L7OYun04N1WyqMNjldFwlfPCLVkgB54A/YCXICZYBsvJJE3kByKv9c9+R/nAfmIfjl2rKYLNyMHboYbZaWaA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 - '@esbuild/linux-loong64@0.23.1': - resolution: {integrity: sha512-Vx09LzEoBa5zDnieH8LSMRToj7ir/Jeq0Gu6qJ/1GcBq9GkfoEAoXvLiW1U9J1qE/Y/Oyaq33w5p2ZWrNNHNEw==} - engines: {node: '>=18'} - cpu: [loong64] - os: [linux] + '@babel/plugin-bugfix-safari-rest-destructuring-rhs-array@7.29.3': + resolution: {integrity: sha512-SRS46DFR4HqzUzCVgi90/xMoL+zeBDBvWdKYXSEzh79kXswNFEglUpMKxR04//dPqwYXWUBJ3mpUd933ru9Kmg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 - '@esbuild/linux-mips64el@0.19.12': - resolution: {integrity: sha512-fEnAuj5VGTanfJ07ff0gOA6IPsvrVHLVb6Lyd1g2/ed67oU1eFzL0r9WL7ZzscD+/N6i3dWumGE1Un4f7Amf+w==} - engines: {node: '>=12'} - cpu: [mips64el] - os: [linux] + '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.27.1': + resolution: {integrity: sha512-oO02gcONcD5O1iTLi/6frMJBIwWEHceWGSGqrpCmEL8nogiS6J9PBlE48CaK20/Jx1LuRml9aDftLgdjXT8+Cw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.13.0 - '@esbuild/linux-mips64el@0.23.1': - resolution: {integrity: sha512-nrFzzMQ7W4WRLNUOU5dlWAqa6yVeI0P78WKGUo7lg2HShq/yx+UYkeNSE0SSfSure0SqgnsxPvmAUu/vu0E+3Q==} - engines: {node: '>=18'} - cpu: [mips64el] - os: [linux] + '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.28.6': + resolution: {integrity: sha512-a0aBScVTlNaiUe35UtfxAN7A/tehvvG4/ByO6+46VPKTRSlfnAFsgKy0FUh+qAkQrDTmhDkT+IBOKlOoMUxQ0g==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 - '@esbuild/linux-ppc64@0.19.12': - resolution: {integrity: sha512-nYJA2/QPimDQOh1rKWedNOe3Gfc8PabU7HT3iXWtNUbRzXS9+vgB0Fjaqr//XNbd82mCxHzik2qotuI89cfixg==} - engines: {node: '>=12'} - cpu: [ppc64] - os: [linux] + '@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2': + resolution: {integrity: sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 - '@esbuild/linux-ppc64@0.23.1': - resolution: {integrity: sha512-dKN8fgVqd0vUIjxuJI6P/9SSSe/mB9rvA98CSH2sJnlZ/OCZWO1DJvxj8jvKTfYUdGfcq2dDxoKaC6bHuTlgcw==} - engines: {node: '>=18'} - cpu: [ppc64] - os: [linux] + '@babel/plugin-syntax-flow@7.27.1': + resolution: {integrity: sha512-p9OkPbZ5G7UT1MofwYFigGebnrzGJacoBSQM0/6bi/PUMVE+qlWDD/OalvQKbwgQzU6dl0xAv6r4X7Jme0RYxA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 - '@esbuild/linux-riscv64@0.19.12': - resolution: {integrity: sha512-2MueBrlPQCw5dVJJpQdUYgeqIzDQgw3QtiAHUC4RBz9FXPrskyyU3VI1hw7C0BSKB9OduwSJ79FTCqtGMWqJHg==} - engines: {node: '>=12'} - cpu: [riscv64] - os: [linux] + '@babel/plugin-syntax-import-assertions@7.28.6': + resolution: {integrity: sha512-pSJUpFHdx9z5nqTSirOCMtYVP2wFgoWhP0p3g8ONK/4IHhLIBd0B9NYqAvIUAhq+OkhO4VM1tENCt0cjlsNShw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 - '@esbuild/linux-riscv64@0.23.1': - resolution: {integrity: sha512-5AV4Pzp80fhHL83JM6LoA6pTQVWgB1HovMBsLQ9OZWLDqVY8MVobBXNSmAJi//Csh6tcY7e7Lny2Hg1tElMjIA==} - engines: {node: '>=18'} - cpu: [riscv64] - os: [linux] + '@babel/plugin-syntax-import-attributes@7.28.6': + resolution: {integrity: sha512-jiLC0ma9XkQT3TKJ9uYvlakm66Pamywo+qwL+oL8HJOvc6TWdZXVfhqJr8CCzbSGUAbDOzlGHJC1U+vRfLQDvw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 - '@esbuild/linux-s390x@0.19.12': - resolution: {integrity: sha512-+Pil1Nv3Umes4m3AZKqA2anfhJiVmNCYkPchwFJNEJN5QxmTs1uzyy4TvmDrCRNT2ApwSari7ZIgrPeUx4UZDg==} - engines: {node: '>=12'} - cpu: [s390x] - os: [linux] + '@babel/plugin-syntax-unicode-sets-regex@7.18.6': + resolution: {integrity: sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 - '@esbuild/linux-s390x@0.23.1': - resolution: {integrity: sha512-9ygs73tuFCe6f6m/Tb+9LtYxWR4c9yg7zjt2cYkjDbDpV/xVn+68cQxMXCjUpYwEkze2RcU/rMnfIXNRFmSoDw==} - engines: {node: '>=18'} - cpu: [s390x] - os: [linux] + '@babel/plugin-transform-arrow-functions@7.27.1': + resolution: {integrity: sha512-8Z4TGic6xW70FKThA5HYEKKyBpOOsucTOD1DjU3fZxDg+K3zBJcXMFnt/4yQiZnf5+MiOMSXQ9PaEK/Ilh1DeA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 - '@esbuild/linux-x64@0.19.12': - resolution: {integrity: sha512-B71g1QpxfwBvNrfyJdVDexenDIt1CiDN1TIXLbhOw0KhJzE78KIFGX6OJ9MrtC0oOqMWf+0xop4qEU8JrJTwCg==} - engines: {node: '>=12'} - cpu: [x64] - os: [linux] + '@babel/plugin-transform-async-generator-functions@7.29.0': + resolution: {integrity: sha512-va0VdWro4zlBr2JsXC+ofCPB2iG12wPtVGTWFx2WLDOM3nYQZZIGP82qku2eW/JR83sD+k2k+CsNtyEbUqhU6w==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 - '@esbuild/linux-x64@0.23.1': - resolution: {integrity: sha512-EV6+ovTsEXCPAp58g2dD68LxoP/wK5pRvgy0J/HxPGB009omFPv3Yet0HiaqvrIrgPTBuC6wCH1LTOY91EO5hQ==} - engines: {node: '>=18'} - cpu: [x64] - os: [linux] + '@babel/plugin-transform-async-to-generator@7.28.6': + resolution: {integrity: sha512-ilTRcmbuXjsMmcZ3HASTe4caH5Tpo93PkTxF9oG2VZsSWsahydmcEHhix9Ik122RcTnZnUzPbmux4wh1swfv7g==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 - '@esbuild/netbsd-x64@0.19.12': - resolution: {integrity: sha512-3ltjQ7n1owJgFbuC61Oj++XhtzmymoCihNFgT84UAmJnxJfm4sYCiSLTXZtE00VWYpPMYc+ZQmB6xbSdVh0JWA==} - engines: {node: '>=12'} - cpu: [x64] - os: [netbsd] + '@babel/plugin-transform-block-scoped-functions@7.27.1': + resolution: {integrity: sha512-cnqkuOtZLapWYZUYM5rVIdv1nXYuFVIltZ6ZJ7nIj585QsjKM5dhL2Fu/lICXZ1OyIAFc7Qy+bvDAtTXqGrlhg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 - '@esbuild/netbsd-x64@0.23.1': - resolution: {integrity: sha512-aevEkCNu7KlPRpYLjwmdcuNz6bDFiE7Z8XC4CPqExjTvrHugh28QzUXVOZtiYghciKUacNktqxdpymplil1beA==} - engines: {node: '>=18'} - cpu: [x64] - os: [netbsd] + '@babel/plugin-transform-block-scoping@7.28.6': + resolution: {integrity: sha512-tt/7wOtBmwHPNMPu7ax4pdPz6shjFrmHDghvNC+FG9Qvj7D6mJcoRQIF5dy4njmxR941l6rgtvfSB2zX3VlUIw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 - '@esbuild/openbsd-arm64@0.23.1': - resolution: {integrity: sha512-3x37szhLexNA4bXhLrCC/LImN/YtWis6WXr1VESlfVtVeoFJBRINPJ3f0a/6LV8zpikqoUg4hyXw0sFBt5Cr+Q==} - engines: {node: '>=18'} - cpu: [arm64] - os: [openbsd] + '@babel/plugin-transform-class-properties@7.28.6': + resolution: {integrity: sha512-dY2wS3I2G7D697VHndN91TJr8/AAfXQNt5ynCTI/MpxMsSzHp+52uNivYT5wCPax3whc47DR8Ba7cmlQMg24bw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 - '@esbuild/openbsd-x64@0.19.12': - resolution: {integrity: sha512-RbrfTB9SWsr0kWmb9srfF+L933uMDdu9BIzdA7os2t0TXhCRjrQyCeOt6wVxr79CKD4c+p+YhCj31HBkYcXebw==} - engines: {node: '>=12'} - cpu: [x64] - os: [openbsd] + '@babel/plugin-transform-class-static-block@7.28.6': + resolution: {integrity: sha512-rfQ++ghVwTWTqQ7w8qyDxL1XGihjBss4CmTgGRCTAC9RIbhVpyp4fOeZtta0Lbf+dTNIVJer6ych2ibHwkZqsQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.12.0 - '@esbuild/openbsd-x64@0.23.1': - resolution: {integrity: sha512-aY2gMmKmPhxfU+0EdnN+XNtGbjfQgwZj43k8G3fyrDM/UdZww6xrWxmDkuz2eCZchqVeABjV5BpildOrUbBTqA==} - engines: {node: '>=18'} - cpu: [x64] - os: [openbsd] + '@babel/plugin-transform-classes@7.28.6': + resolution: {integrity: sha512-EF5KONAqC5zAqT783iMGuM2ZtmEBy+mJMOKl2BCvPZ2lVrwvXnB6o+OBWCS+CoeCCpVRF2sA2RBKUxvT8tQT5Q==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 - '@esbuild/sunos-x64@0.19.12': - resolution: {integrity: sha512-HKjJwRrW8uWtCQnQOz9qcU3mUZhTUQvi56Q8DPTLLB+DawoiQdjsYq+j+D3s9I8VFtDr+F9CjgXKKC4ss89IeA==} - engines: {node: '>=12'} - cpu: [x64] - os: [sunos] + '@babel/plugin-transform-computed-properties@7.28.6': + resolution: {integrity: sha512-bcc3k0ijhHbc2lEfpFHgx7eYw9KNXqOerKWfzbxEHUGKnS3sz9C4CNL9OiFN1297bDNfUiSO7DaLzbvHQQQ1BQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 - '@esbuild/sunos-x64@0.23.1': - resolution: {integrity: sha512-RBRT2gqEl0IKQABT4XTj78tpk9v7ehp+mazn2HbUeZl1YMdaGAQqhapjGTCe7uw7y0frDi4gS0uHzhvpFuI1sA==} - engines: {node: '>=18'} - cpu: [x64] - os: [sunos] + '@babel/plugin-transform-destructuring@7.28.5': + resolution: {integrity: sha512-Kl9Bc6D0zTUcFUvkNuQh4eGXPKKNDOJQXVyyM4ZAQPMveniJdxi8XMJwLo+xSoW3MIq81bD33lcUe9kZpl0MCw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 - '@esbuild/win32-arm64@0.19.12': - resolution: {integrity: sha512-URgtR1dJnmGvX864pn1B2YUYNzjmXkuJOIqG2HdU62MVS4EHpU2946OZoTMnRUHklGtJdJZ33QfzdjGACXhn1A==} - engines: {node: '>=12'} - cpu: [arm64] - os: [win32] + '@babel/plugin-transform-dotall-regex@7.28.6': + resolution: {integrity: sha512-SljjowuNKB7q5Oayv4FoPzeB74g3QgLt8IVJw9ADvWy3QnUb/01aw8I4AVv8wYnPvQz2GDDZ/g3GhcNyDBI4Bg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 - '@esbuild/win32-arm64@0.23.1': - resolution: {integrity: sha512-4O+gPR5rEBe2FpKOVyiJ7wNDPA8nGzDuJ6gN4okSA1gEOYZ67N8JPk58tkWtdtPeLz7lBnY6I5L3jdsr3S+A6A==} - engines: {node: '>=18'} - cpu: [arm64] - os: [win32] + '@babel/plugin-transform-duplicate-keys@7.27.1': + resolution: {integrity: sha512-MTyJk98sHvSs+cvZ4nOauwTTG1JeonDjSGvGGUNHreGQns+Mpt6WX/dVzWBHgg+dYZhkC4X+zTDfkTU+Vy9y7Q==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 - '@esbuild/win32-ia32@0.19.12': - resolution: {integrity: sha512-+ZOE6pUkMOJfmxmBZElNOx72NKpIa/HFOMGzu8fqzQJ5kgf6aTGrcJaFsNiVMH4JKpMipyK+7k0n2UXN7a8YKQ==} - engines: {node: '>=12'} - cpu: [ia32] - os: [win32] + '@babel/plugin-transform-duplicate-named-capturing-groups-regex@7.29.0': + resolution: {integrity: sha512-zBPcW2lFGxdiD8PUnPwJjag2J9otbcLQzvbiOzDxpYXyCuYX9agOwMPGn1prVH0a4qzhCKu24rlH4c1f7yA8rw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 - '@esbuild/win32-ia32@0.23.1': - resolution: {integrity: sha512-BcaL0Vn6QwCwre3Y717nVHZbAa4UBEigzFm6VdsVdT/MbZ38xoj1X9HPkZhbmaBGUD1W8vxAfffbDe8bA6AKnQ==} - engines: {node: '>=18'} - cpu: [ia32] - os: [win32] + '@babel/plugin-transform-dynamic-import@7.27.1': + resolution: {integrity: sha512-MHzkWQcEmjzzVW9j2q8LGjwGWpG2mjwaaB0BNQwst3FIjqsg8Ct/mIZlvSPJvfi9y2AC8mi/ktxbFVL9pZ1I4A==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 - '@esbuild/win32-x64@0.19.12': - resolution: {integrity: sha512-T1QyPSDCyMXaO3pzBkF96E8xMkiRYbUEZADd29SyPGabqxMViNoii+NcK7eWJAEoU6RZyEm5lVSIjTmcdoB9HA==} - engines: {node: '>=12'} - cpu: [x64] - os: [win32] + '@babel/plugin-transform-explicit-resource-management@7.28.6': + resolution: {integrity: sha512-Iao5Konzx2b6g7EPqTy40UZbcdXE126tTxVFr/nAIj+WItNxjKSYTEw3RC+A2/ZetmdJsgueL1KhaMCQHkLPIg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 - '@esbuild/win32-x64@0.23.1': - resolution: {integrity: sha512-BHpFFeslkWrXWyUPnbKm+xYYVYruCinGcftSBaa8zoF9hZO4BcSCFUvHVTtzpIY6YzUnYtuEhZ+C9iEXjxnasg==} - engines: {node: '>=18'} - cpu: [x64] - os: [win32] + '@babel/plugin-transform-exponentiation-operator@7.28.6': + resolution: {integrity: sha512-WitabqiGjV/vJ0aPOLSFfNY1u9U3R7W36B03r5I2KoNix+a3sOhJ3pKFB3R5It9/UiK78NiO0KE9P21cMhlPkw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 - '@grpc/grpc-js@1.14.3': - resolution: {integrity: sha512-Iq8QQQ/7X3Sac15oB6p0FmUg/klxQvXLeileoqrTRGJYLV+/9tubbr9ipz0GKHjmXVsgFPo/+W+2cA8eNcR+XA==} - engines: {node: '>=12.10.0'} + '@babel/plugin-transform-export-namespace-from@7.27.1': + resolution: {integrity: sha512-tQvHWSZ3/jH2xuq/vZDy0jNn+ZdXJeM8gHvX4lnJmsc3+50yPlWdZXIc5ay+umX+2/tJIqHqiEqcJvxlmIvRvQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 - '@grpc/proto-loader@0.8.0': - resolution: {integrity: sha512-rc1hOQtjIWGxcxpb9aHAfLpIctjEnsDehj0DAiVfBlmT84uvR0uUtN2hEi/ecvWVjXUGf5qPF4qEgiLOx1YIMQ==} - engines: {node: '>=6'} - hasBin: true + '@babel/plugin-transform-flow-strip-types@7.27.1': + resolution: {integrity: sha512-G5eDKsu50udECw7DL2AcsysXiQyB7Nfg521t2OAJ4tbfTJ27doHLeF/vlI1NZGlLdbb/v+ibvtL1YBQqYOwJGg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 - '@jridgewell/gen-mapping@0.3.5': - resolution: {integrity: sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==} - engines: {node: '>=6.0.0'} + '@babel/plugin-transform-for-of@7.27.1': + resolution: {integrity: sha512-BfbWFFEJFQzLCQ5N8VocnCtA8J1CLkNTe2Ms2wocj75dd6VpiqS5Z5quTYcUoo4Yq+DN0rtikODccuv7RU81sw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 - '@jridgewell/resolve-uri@3.1.2': - resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} - engines: {node: '>=6.0.0'} + '@babel/plugin-transform-function-name@7.27.1': + resolution: {integrity: sha512-1bQeydJF9Nr1eBCMMbC+hdwmRlsv5XYOMu03YSWFwNs0HsAmtSxxF1fyuYPqemVldVyFmlCU7w8UE14LupUSZQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 - '@jridgewell/set-array@1.2.1': - resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==} - engines: {node: '>=6.0.0'} + '@babel/plugin-transform-json-strings@7.28.6': + resolution: {integrity: sha512-Nr+hEN+0geQkzhbdgQVPoqr47lZbm+5fCUmO70722xJZd0Mvb59+33QLImGj6F+DkK3xgDi1YVysP8whD6FQAw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 - '@jridgewell/sourcemap-codec@1.5.0': - resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==} + '@babel/plugin-transform-literals@7.27.1': + resolution: {integrity: sha512-0HCFSepIpLTkLcsi86GG3mTUzxV5jpmbv97hTETW3yzrAij8aqlD36toB1D0daVFJM8NK6GvKO0gslVQmm+zZA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 - '@jridgewell/trace-mapping@0.3.25': - resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} + '@babel/plugin-transform-logical-assignment-operators@7.28.6': + resolution: {integrity: sha512-+anKKair6gpi8VsM/95kmomGNMD0eLz1NQ8+Pfw5sAwWH9fGYXT50E55ZpV0pHUHWf6IUTWPM+f/7AAff+wr9A==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 - '@js-sdsl/ordered-map@4.4.2': - resolution: {integrity: sha512-iUKgm52T8HOE/makSxjqoWhe95ZJA1/G1sYsGev2JDKUSS14KAgg1LHb+Ba+IPow0xflbnSkOsZcO08C7w1gYw==} + '@babel/plugin-transform-member-expression-literals@7.27.1': + resolution: {integrity: sha512-hqoBX4dcZ1I33jCSWcXrP+1Ku7kdqXf1oeah7ooKOIiAdKQ+uqftgCFNOSzA5AMS2XIHEYeGFg4cKRCdpxzVOQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 - '@nodelib/fs.scandir@2.1.5': - resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} - engines: {node: '>= 8'} + '@babel/plugin-transform-modules-amd@7.27.1': + resolution: {integrity: sha512-iCsytMg/N9/oFq6n+gFTvUYDZQOMK5kEdeYxmxt91fcJGycfxVP9CnrxoliM0oumFERba2i8ZtwRUCMhvP1LnA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 - '@nodelib/fs.stat@2.0.5': - resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} - engines: {node: '>= 8'} + '@babel/plugin-transform-modules-commonjs@7.28.6': + resolution: {integrity: sha512-jppVbf8IV9iWWwWTQIxJMAJCWBuuKx71475wHwYytrRGQ2CWiDvYlADQno3tcYpS/T2UUWFQp3nVtYfK/YBQrA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 - '@nodelib/fs.walk@1.2.8': - resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} - engines: {node: '>= 8'} + '@babel/plugin-transform-modules-systemjs@7.29.0': + resolution: {integrity: sha512-PrujnVFbOdUpw4UHiVwKvKRLMMic8+eC0CuNlxjsyZUiBjhFdPsewdXCkveh2KqBA9/waD0W1b4hXSOBQJezpQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 - '@opentelemetry/api-logs@0.57.2': - resolution: {integrity: sha512-uIX52NnTM0iBh84MShlpouI7UKqkZ7MrUszTmaypHBu4r7NofznSnQRfJ+uUeDtQDj6w8eFGg5KBLDAwAPz1+A==} - engines: {node: '>=14'} + '@babel/plugin-transform-modules-umd@7.27.1': + resolution: {integrity: sha512-iQBE/xC5BV1OxJbp6WG7jq9IWiD+xxlZhLrdwpPkTX3ydmXdvoCpyfJN7acaIBZaOqTfr76pgzqBJflNbeRK+w==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 - '@opentelemetry/api@1.9.0': - resolution: {integrity: sha512-3giAOQvZiH5F9bMlMiv8+GSPMeqg0dbaeo58/0SlA9sxSqZhnUtxzX9/2FzyhS9sWQf5S0GJE0AKBrFqjpeYcg==} - engines: {node: '>=8.0.0'} + '@babel/plugin-transform-named-capturing-groups-regex@7.29.0': + resolution: {integrity: sha512-1CZQA5KNAD6ZYQLPw7oi5ewtDNxH/2vuCh+6SmvgDfhumForvs8a1o9n0UrEoBD8HU4djO2yWngTQlXl1NDVEQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 - '@opentelemetry/context-async-hooks@1.30.1': - resolution: {integrity: sha512-s5vvxXPVdjqS3kTLKMeBMvop9hbWkwzBpu+mUO2M7sZtlkyDJGwFe33wRKnbaYDo8ExRVBIIdwIGrqpxHuKttA==} - engines: {node: '>=14'} + '@babel/plugin-transform-new-target@7.27.1': + resolution: {integrity: sha512-f6PiYeqXQ05lYq3TIfIDu/MtliKUbNwkGApPUvyo6+tc7uaR4cPjPe7DFPr15Uyycg2lZU6btZ575CuQoYh7MQ==} + engines: {node: '>=6.9.0'} peerDependencies: - '@opentelemetry/api': '>=1.0.0 <1.10.0' + '@babel/core': ^7.0.0-0 - '@opentelemetry/core@1.30.1': - resolution: {integrity: sha512-OOCM2C/QIURhJMuKaekP3TRBxBKxG/TWWA0TL2J6nXUtDnuCtccy49LUJF8xPFXMX+0LMcxFpCo8M9cGY1W6rQ==} - engines: {node: '>=14'} + '@babel/plugin-transform-nullish-coalescing-operator@7.28.6': + resolution: {integrity: sha512-3wKbRgmzYbw24mDJXT7N+ADXw8BC/imU9yo9c9X9NKaLF1fW+e5H1U5QjMUBe4Qo4Ox/o++IyUkl1sVCLgevKg==} + engines: {node: '>=6.9.0'} peerDependencies: - '@opentelemetry/api': '>=1.0.0 <1.10.0' + '@babel/core': ^7.0.0-0 - '@opentelemetry/exporter-logs-otlp-grpc@0.57.2': - resolution: {integrity: sha512-eovEy10n3umjKJl2Ey6TLzikPE+W4cUQ4gCwgGP1RqzTGtgDra0WjIqdy29ohiUKfvmbiL3MndZww58xfIvyFw==} - engines: {node: '>=14'} + '@babel/plugin-transform-numeric-separator@7.28.6': + resolution: {integrity: sha512-SJR8hPynj8outz+SlStQSwvziMN4+Bq99it4tMIf5/Caq+3iOc0JtKyse8puvyXkk3eFRIA5ID/XfunGgO5i6w==} + engines: {node: '>=6.9.0'} peerDependencies: - '@opentelemetry/api': ^1.3.0 + '@babel/core': ^7.0.0-0 - '@opentelemetry/exporter-logs-otlp-http@0.57.2': - resolution: {integrity: sha512-0rygmvLcehBRp56NQVLSleJ5ITTduq/QfU7obOkyWgPpFHulwpw2LYTqNIz5TczKZuy5YY+5D3SDnXZL1tXImg==} - engines: {node: '>=14'} + '@babel/plugin-transform-object-rest-spread@7.28.6': + resolution: {integrity: sha512-5rh+JR4JBC4pGkXLAcYdLHZjXudVxWMXbB6u6+E9lRL5TrGVbHt1TjxGbZ8CkmYw9zjkB7jutzOROArsqtncEA==} + engines: {node: '>=6.9.0'} peerDependencies: - '@opentelemetry/api': ^1.3.0 + '@babel/core': ^7.0.0-0 - '@opentelemetry/exporter-logs-otlp-proto@0.57.2': - resolution: {integrity: sha512-ta0ithCin0F8lu9eOf4lEz9YAScecezCHkMMyDkvd9S7AnZNX5ikUmC5EQOQADU+oCcgo/qkQIaKcZvQ0TYKDw==} - engines: {node: '>=14'} + '@babel/plugin-transform-object-super@7.27.1': + resolution: {integrity: sha512-SFy8S9plRPbIcxlJ8A6mT/CxFdJx/c04JEctz4jf8YZaVS2px34j7NXRrlGlHkN/M2gnpL37ZpGRGVFLd3l8Ng==} + engines: {node: '>=6.9.0'} peerDependencies: - '@opentelemetry/api': ^1.3.0 + '@babel/core': ^7.0.0-0 - '@opentelemetry/exporter-metrics-otlp-grpc@0.57.2': - resolution: {integrity: sha512-r70B8yKR41F0EC443b5CGB4rUaOMm99I5N75QQt6sHKxYDzSEc6gm48Diz1CI1biwa5tDPznpylTrywO/pT7qw==} - engines: {node: '>=14'} + '@babel/plugin-transform-optional-catch-binding@7.28.6': + resolution: {integrity: sha512-R8ja/Pyrv0OGAvAXQhSTmWyPJPml+0TMqXlO5w+AsMEiwb2fg3WkOvob7UxFSL3OIttFSGSRFKQsOhJ/X6HQdQ==} + engines: {node: '>=6.9.0'} peerDependencies: - '@opentelemetry/api': ^1.3.0 + '@babel/core': ^7.0.0-0 - '@opentelemetry/exporter-metrics-otlp-http@0.57.2': - resolution: {integrity: sha512-ttb9+4iKw04IMubjm3t0EZsYRNWr3kg44uUuzfo9CaccYlOh8cDooe4QObDUkvx9d5qQUrbEckhrWKfJnKhemA==} - engines: {node: '>=14'} + '@babel/plugin-transform-optional-chaining@7.28.6': + resolution: {integrity: sha512-A4zobikRGJTsX9uqVFdafzGkqD30t26ck2LmOzAuLL8b2x6k3TIqRiT2xVvA9fNmFeTX484VpsdgmKNA0bS23w==} + engines: {node: '>=6.9.0'} peerDependencies: - '@opentelemetry/api': ^1.3.0 + '@babel/core': ^7.0.0-0 - '@opentelemetry/exporter-metrics-otlp-proto@0.57.2': - resolution: {integrity: sha512-HX068Q2eNs38uf7RIkNN9Hl4Ynl+3lP0++KELkXMCpsCbFO03+0XNNZ1SkwxPlP9jrhQahsMPMkzNXpq3fKsnw==} - engines: {node: '>=14'} + '@babel/plugin-transform-parameters@7.27.7': + resolution: {integrity: sha512-qBkYTYCb76RRxUM6CcZA5KRu8K4SM8ajzVeUgVdMVO9NN9uI/GaVmBg/WKJJGnNokV9SY8FxNOVWGXzqzUidBg==} + engines: {node: '>=6.9.0'} peerDependencies: - '@opentelemetry/api': ^1.3.0 + '@babel/core': ^7.0.0-0 - '@opentelemetry/exporter-prometheus@0.57.2': - resolution: {integrity: sha512-VqIqXnuxWMWE/1NatAGtB1PvsQipwxDcdG4RwA/umdBcW3/iOHp0uejvFHTRN2O78ZPged87ErJajyUBPUhlDQ==} - engines: {node: '>=14'} + '@babel/plugin-transform-private-methods@7.28.6': + resolution: {integrity: sha512-piiuapX9CRv7+0st8lmuUlRSmX6mBcVeNQ1b4AYzJxfCMuBfB0vBXDiGSmm03pKJw1v6cZ8KSeM+oUnM6yAExg==} + engines: {node: '>=6.9.0'} peerDependencies: - '@opentelemetry/api': ^1.3.0 + '@babel/core': ^7.0.0-0 - '@opentelemetry/exporter-trace-otlp-grpc@0.57.2': - resolution: {integrity: sha512-gHU1vA3JnHbNxEXg5iysqCWxN9j83d7/epTYBZflqQnTyCC4N7yZXn/dMM+bEmyhQPGjhCkNZLx4vZuChH1PYw==} - engines: {node: '>=14'} + '@babel/plugin-transform-private-property-in-object@7.28.6': + resolution: {integrity: sha512-b97jvNSOb5+ehyQmBpmhOCiUC5oVK4PMnpRvO7+ymFBoqYjeDHIU9jnrNUuwHOiL9RpGDoKBpSViarV+BU+eVA==} + engines: {node: '>=6.9.0'} peerDependencies: - '@opentelemetry/api': ^1.3.0 + '@babel/core': ^7.0.0-0 - '@opentelemetry/exporter-trace-otlp-http@0.57.2': - resolution: {integrity: sha512-sB/gkSYFu+0w2dVQ0PWY9fAMl172PKMZ/JrHkkW8dmjCL0CYkmXeE+ssqIL/yBUTPOvpLIpenX5T9RwXRBW/3g==} - engines: {node: '>=14'} + '@babel/plugin-transform-property-literals@7.27.1': + resolution: {integrity: sha512-oThy3BCuCha8kDZ8ZkgOg2exvPYUlprMukKQXI1r1pJ47NCvxfkEy8vK+r/hT9nF0Aa4H1WUPZZjHTFtAhGfmQ==} + engines: {node: '>=6.9.0'} peerDependencies: - '@opentelemetry/api': ^1.3.0 + '@babel/core': ^7.0.0-0 - '@opentelemetry/exporter-trace-otlp-proto@0.57.2': - resolution: {integrity: sha512-awDdNRMIwDvUtoRYxRhja5QYH6+McBLtoz1q9BeEsskhZcrGmH/V1fWpGx8n+Rc+542e8pJA6y+aullbIzQmlw==} - engines: {node: '>=14'} + '@babel/plugin-transform-regenerator@7.29.0': + resolution: {integrity: sha512-FijqlqMA7DmRdg/aINBSs04y8XNTYw/lr1gJ2WsmBnnaNw1iS43EPkJW+zK7z65auG3AWRFXWj+NcTQwYptUog==} + engines: {node: '>=6.9.0'} peerDependencies: - '@opentelemetry/api': ^1.3.0 + '@babel/core': ^7.0.0-0 - '@opentelemetry/exporter-zipkin@1.30.1': - resolution: {integrity: sha512-6S2QIMJahIquvFaaxmcwpvQQRD/YFaMTNoIxrfPIPOeITN+a8lfEcPDxNxn8JDAaxkg+4EnXhz8upVDYenoQjA==} - engines: {node: '>=14'} + '@babel/plugin-transform-regexp-modifiers@7.28.6': + resolution: {integrity: sha512-QGWAepm9qxpaIs7UM9FvUSnCGlb8Ua1RhyM4/veAxLwt3gMat/LSGrZixyuj4I6+Kn9iwvqCyPTtbdxanYoWYg==} + engines: {node: '>=6.9.0'} peerDependencies: - '@opentelemetry/api': ^1.0.0 + '@babel/core': ^7.0.0 - '@opentelemetry/instrumentation@0.57.2': - resolution: {integrity: sha512-BdBGhQBh8IjZ2oIIX6F2/Q3LKm/FDDKi6ccYKcBTeilh6SNdNKveDOLk73BkSJjQLJk6qe4Yh+hHw1UPhCDdrg==} - engines: {node: '>=14'} + '@babel/plugin-transform-reserved-words@7.27.1': + resolution: {integrity: sha512-V2ABPHIJX4kC7HegLkYoDpfg9PVmuWy/i6vUM5eGK22bx4YVFD3M5F0QQnWQoDs6AGsUWTVOopBiMFQgHaSkVw==} + engines: {node: '>=6.9.0'} peerDependencies: - '@opentelemetry/api': ^1.3.0 + '@babel/core': ^7.0.0-0 - '@opentelemetry/otlp-exporter-base@0.57.2': - resolution: {integrity: sha512-XdxEzL23Urhidyebg5E6jZoaiW5ygP/mRjxLHixogbqwDy2Faduzb5N0o/Oi+XTIJu+iyxXdVORjXax+Qgfxag==} - engines: {node: '>=14'} + '@babel/plugin-transform-shorthand-properties@7.27.1': + resolution: {integrity: sha512-N/wH1vcn4oYawbJ13Y/FxcQrWk63jhfNa7jef0ih7PHSIHX2LB7GWE1rkPrOnka9kwMxb6hMl19p7lidA+EHmQ==} + engines: {node: '>=6.9.0'} peerDependencies: - '@opentelemetry/api': ^1.3.0 + '@babel/core': ^7.0.0-0 - '@opentelemetry/otlp-grpc-exporter-base@0.57.2': - resolution: {integrity: sha512-USn173KTWy0saqqRB5yU9xUZ2xdgb1Rdu5IosJnm9aV4hMTuFFRTUsQxbgc24QxpCHeoKzzCSnS/JzdV0oM2iQ==} - engines: {node: '>=14'} + '@babel/plugin-transform-spread@7.28.6': + resolution: {integrity: sha512-9U4QObUC0FtJl05AsUcodau/RWDytrU6uKgkxu09mLR9HLDAtUMoPuuskm5huQsoktmsYpI+bGmq+iapDcriKA==} + engines: {node: '>=6.9.0'} peerDependencies: - '@opentelemetry/api': ^1.3.0 + '@babel/core': ^7.0.0-0 - '@opentelemetry/otlp-transformer@0.57.2': - resolution: {integrity: sha512-48IIRj49gbQVK52jYsw70+Jv+JbahT8BqT2Th7C4H7RCM9d0gZ5sgNPoMpWldmfjvIsSgiGJtjfk9MeZvjhoig==} - engines: {node: '>=14'} + '@babel/plugin-transform-sticky-regex@7.27.1': + resolution: {integrity: sha512-lhInBO5bi/Kowe2/aLdBAawijx+q1pQzicSgnkB6dUPc1+RC8QmJHKf2OjvU+NZWitguJHEaEmbV6VWEouT58g==} + engines: {node: '>=6.9.0'} peerDependencies: - '@opentelemetry/api': ^1.3.0 + '@babel/core': ^7.0.0-0 - '@opentelemetry/propagator-b3@1.30.1': - resolution: {integrity: sha512-oATwWWDIJzybAZ4pO76ATN5N6FFbOA1otibAVlS8v90B4S1wClnhRUk7K+2CHAwN1JKYuj4jh/lpCEG5BAqFuQ==} - engines: {node: '>=14'} + '@babel/plugin-transform-template-literals@7.27.1': + resolution: {integrity: sha512-fBJKiV7F2DxZUkg5EtHKXQdbsbURW3DZKQUWphDum0uRP6eHGGa/He9mc0mypL680pb+e/lDIthRohlv8NCHkg==} + engines: {node: '>=6.9.0'} peerDependencies: - '@opentelemetry/api': '>=1.0.0 <1.10.0' + '@babel/core': ^7.0.0-0 - '@opentelemetry/propagator-jaeger@1.30.1': - resolution: {integrity: sha512-Pj/BfnYEKIOImirH76M4hDaBSx6HyZ2CXUqk+Kj02m6BB80c/yo4BdWkn/1gDFfU+YPY+bPR2U0DKBfdxCKwmg==} - engines: {node: '>=14'} + '@babel/plugin-transform-typeof-symbol@7.27.1': + resolution: {integrity: sha512-RiSILC+nRJM7FY5srIyc4/fGIwUhyDuuBSdWn4y6yT6gm652DpCHZjIipgn6B7MQ1ITOUnAKWixEUjQRIBIcLw==} + engines: {node: '>=6.9.0'} peerDependencies: - '@opentelemetry/api': '>=1.0.0 <1.10.0' + '@babel/core': ^7.0.0-0 - '@opentelemetry/resources@1.30.1': - resolution: {integrity: sha512-5UxZqiAgLYGFjS4s9qm5mBVo433u+dSPUFWVWXmLAD4wB65oMCoXaJP1KJa9DIYYMeHu3z4BZcStG3LC593cWA==} - engines: {node: '>=14'} + '@babel/plugin-transform-unicode-escapes@7.27.1': + resolution: {integrity: sha512-Ysg4v6AmF26k9vpfFuTZg8HRfVWzsh1kVfowA23y9j/Gu6dOuahdUVhkLqpObp3JIv27MLSii6noRnuKN8H0Mg==} + engines: {node: '>=6.9.0'} peerDependencies: - '@opentelemetry/api': '>=1.0.0 <1.10.0' + '@babel/core': ^7.0.0-0 - '@opentelemetry/sdk-logs@0.57.2': - resolution: {integrity: sha512-TXFHJ5c+BKggWbdEQ/inpgIzEmS2BGQowLE9UhsMd7YYlUfBQJ4uax0VF/B5NYigdM/75OoJGhAV3upEhK+3gg==} - engines: {node: '>=14'} + '@babel/plugin-transform-unicode-property-regex@7.28.6': + resolution: {integrity: sha512-4Wlbdl/sIZjzi/8St0evF0gEZrgOswVO6aOzqxh1kDZOl9WmLrHq2HtGhnOJZmHZYKP8WZ1MDLCt5DAWwRo57A==} + engines: {node: '>=6.9.0'} peerDependencies: - '@opentelemetry/api': '>=1.4.0 <1.10.0' + '@babel/core': ^7.0.0-0 - '@opentelemetry/sdk-metrics@1.30.1': - resolution: {integrity: sha512-q9zcZ0Okl8jRgmy7eNW3Ku1XSgg3sDLa5evHZpCwjspw7E8Is4K/haRPDJrBcX3YSn/Y7gUvFnByNYEKQNbNog==} - engines: {node: '>=14'} + '@babel/plugin-transform-unicode-regex@7.27.1': + resolution: {integrity: sha512-xvINq24TRojDuyt6JGtHmkVkrfVV3FPT16uytxImLeBZqW3/H52yN+kM1MGuyPkIQxrzKwPHs5U/MP3qKyzkGw==} + engines: {node: '>=6.9.0'} peerDependencies: - '@opentelemetry/api': '>=1.3.0 <1.10.0' + '@babel/core': ^7.0.0-0 - '@opentelemetry/sdk-node@0.57.2': - resolution: {integrity: sha512-8BaeqZyN5sTuPBtAoY+UtKwXBdqyuRKmekN5bFzAO40CgbGzAxfTpiL3PBerT7rhZ7p2nBdq7FaMv/tBQgHE4A==} - engines: {node: '>=14'} + '@babel/plugin-transform-unicode-sets-regex@7.28.6': + resolution: {integrity: sha512-/wHc/paTUmsDYN7SZkpWxogTOBNnlx7nBQYfy6JJlCT7G3mVhltk3e++N7zV0XfgGsrqBxd4rJQt9H16I21Y1Q==} + engines: {node: '>=6.9.0'} peerDependencies: - '@opentelemetry/api': '>=1.3.0 <1.10.0' + '@babel/core': ^7.0.0 - '@opentelemetry/sdk-trace-base@1.30.1': - resolution: {integrity: sha512-jVPgBbH1gCy2Lb7X0AVQ8XAfgg0pJ4nvl8/IiQA6nxOsPvS+0zMJaFSs2ltXe0J6C8dqjcnpyqINDJmU30+uOg==} - engines: {node: '>=14'} + '@babel/preset-env@7.29.3': + resolution: {integrity: sha512-ySZypNLAIH1ClygLDQzVMoGQRViATnkHkYYV6TcNDz+8+jwZCdsguGvsb3EY5d9wyWyhmF1iSuFM0Yh5XPnqSA==} + engines: {node: '>=6.9.0'} peerDependencies: - '@opentelemetry/api': '>=1.0.0 <1.10.0' + '@babel/core': ^7.0.0-0 - '@opentelemetry/sdk-trace-node@1.30.1': - resolution: {integrity: sha512-cBjYOINt1JxXdpw1e5MlHmFRc5fgj4GW/86vsKFxJCJ8AL4PdVtYH41gWwl4qd4uQjqEL1oJVrXkSy5cnduAnQ==} - engines: {node: '>=14'} + '@babel/preset-flow@7.27.1': + resolution: {integrity: sha512-ez3a2it5Fn6P54W8QkbfIyyIbxlXvcxyWHHvno1Wg0Ej5eiJY5hBb8ExttoIOJJk7V2dZE6prP7iby5q2aQ0Lg==} + engines: {node: '>=6.9.0'} peerDependencies: - '@opentelemetry/api': '>=1.0.0 <1.10.0' + '@babel/core': ^7.0.0-0 - '@opentelemetry/semantic-conventions@1.28.0': - resolution: {integrity: sha512-lp4qAiMTD4sNWW4DbKLBkfiMZ4jbAboJIGOQr5DvciMRI494OapieI9qiODpOt0XBr1LjIDy1xAGAnVs5supTA==} - engines: {node: '>=14'} + '@babel/preset-modules@0.1.6-no-external-plugins': + resolution: {integrity: sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==} + peerDependencies: + '@babel/core': ^7.0.0-0 || ^8.0.0-0 <8.0.0 - '@opentelemetry/semantic-conventions@1.38.0': - resolution: {integrity: sha512-kocjix+/sSggfJhwXqClZ3i9Y/MI0fp7b+g7kCRm6psy2dsf8uApTRclwG18h8Avm7C9+fnt+O36PspJ/OzoWg==} - engines: {node: '>=14'} + '@babel/preset-stage-2@7.8.3': + resolution: {integrity: sha512-dStnEQgejNYIHFNACdDCigK4BF7wgW6Zahv9Dc2un7rGjbeVtZhBfR3sy0I7ZJOhBexkFxVdMZ5hqmll7BFShw==} - '@protobufjs/aspromise@1.1.2': - resolution: {integrity: sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==} + '@babel/template@7.28.6': + resolution: {integrity: sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ==} + engines: {node: '>=6.9.0'} - '@protobufjs/base64@1.1.2': - resolution: {integrity: sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==} + '@babel/traverse@7.29.0': + resolution: {integrity: sha512-4HPiQr0X7+waHfyXPZpWPfWL/J7dcN1mx9gL6WdQVMbPnF3+ZhSMs8tCxN7oHddJE9fhNE7+lxdnlyemKfJRuA==} + engines: {node: '>=6.9.0'} - '@protobufjs/codegen@2.0.4': - resolution: {integrity: sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==} + '@babel/types@7.29.0': + resolution: {integrity: sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==} + engines: {node: '>=6.9.0'} - '@protobufjs/eventemitter@1.1.0': - resolution: {integrity: sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==} + '@epic-web/invariant@1.0.0': + resolution: {integrity: sha512-lrTPqgvfFQtR/eY/qkIzp98OGdNJu0m5ji3q/nJI8v3SXkRKEnWiOxMmbvcSoAIzv/cGiuvRy57k4suKQSAdwA==} - '@protobufjs/fetch@1.1.0': - resolution: {integrity: sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==} + '@isaacs/fs-minipass@4.0.1': + resolution: {integrity: sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==} + engines: {node: '>=18.0.0'} - '@protobufjs/float@1.0.2': - resolution: {integrity: sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==} + '@jridgewell/gen-mapping@0.3.13': + resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==} - '@protobufjs/inquire@1.1.0': - resolution: {integrity: sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==} + '@jridgewell/remapping@2.3.5': + resolution: {integrity: sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==} - '@protobufjs/path@1.1.2': - resolution: {integrity: sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==} + '@jridgewell/resolve-uri@3.1.2': + resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} + engines: {node: '>=6.0.0'} - '@protobufjs/pool@1.1.0': - resolution: {integrity: sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==} + '@jridgewell/sourcemap-codec@1.5.5': + resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==} - '@protobufjs/utf8@1.1.0': - resolution: {integrity: sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==} + '@jridgewell/trace-mapping@0.3.31': + resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==} - '@pyroscope/nodejs@0.4.1': - resolution: {integrity: sha512-Qh4Iyj7No6BDHJcdMkUXw6YRI/X3gkU1q1GJamJwF/n68E94tZosExQVYU4PFmX3NEl27N6SBhcXEo3qbEB0AA==} - engines: {node: '>=v18'} + '@kwsites/file-exists@1.1.1': + resolution: {integrity: sha512-m9/5YGR18lIwxSFDwfE3oA7bWuq9kdau6ugN4H2rJeyhFQZcG9AgSHkQtSD15a8WvTgfz9aikZMrKPHvbpqFiw==} - '@rollup/plugin-alias@5.1.1': - resolution: {integrity: sha512-PR9zDb+rOzkRb2VD+EuKB7UC41vU5DIwZ5qqCpk0KJudcWAyi8rvYOhS7+L5aZCspw1stTViLgN5v6FF1p5cgQ==} - engines: {node: '>=14.0.0'} - peerDependencies: - rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 - peerDependenciesMeta: - rollup: - optional: true + '@kwsites/promise-deferred@1.1.1': + resolution: {integrity: sha512-GaHYm+c0O9MjZRu0ongGBRbinu8gVAMd2UZjji6jVmqKtZluZnptXGWhz1E8j8D2HJ3f/yMxKAUC0b+57wncIw==} - '@rollup/plugin-commonjs@25.0.8': - resolution: {integrity: sha512-ZEZWTK5n6Qde0to4vS9Mr5x/0UZoqCxPVR9KRUjU4kA2sO7GEUn1fop0DAwpO6z0Nw/kJON9bDmSxdWxO/TT1A==} - engines: {node: '>=14.0.0'} - peerDependencies: - rollup: ^2.68.0||^3.0.0||^4.0.0 - peerDependenciesMeta: - rollup: - optional: true + '@mapbox/node-pre-gyp@2.0.3': + resolution: {integrity: sha512-uwPAhccfFJlsfCxMYTwOdVfOz3xqyj8xYL3zJj8f0pb30tLohnnFPhLuqp4/qoEz8sNxe4SESZedcBojRefIzg==} + engines: {node: '>=18'} + hasBin: true - '@rollup/plugin-json@6.1.0': - resolution: {integrity: sha512-EGI2te5ENk1coGeADSIwZ7G2Q8CJS2sF120T7jLw4xFw9n7wIOXHo+kIYRAoVpJAN+kmqZSoO3Fp4JtoNF4ReA==} - engines: {node: '>=14.0.0'} + '@nicolo-ribaudo/chokidar-2@2.1.8-no-fsevents.3': + resolution: {integrity: sha512-s88O1aVtXftvp5bCPB7WnmXc5IwOZZ7YPuwNPt+GtOOXpPvad1LfbmjYv+qII7zP6RU2QGnqve27dnLycEnyEQ==} + + '@nodelib/fs.scandir@2.1.5': + resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} + engines: {node: '>= 8'} + + '@nodelib/fs.stat@2.0.5': + resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} + engines: {node: '>= 8'} + + '@nodelib/fs.walk@1.2.8': + resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} + engines: {node: '>= 8'} + + '@octokit/auth-token@2.5.0': + resolution: {integrity: sha512-r5FVUJCOLl19AxiuZD2VRZ/ORjp/4IN98Of6YJoJOkY75CIBuYfmiNHGrDwXr+aLGG55igl9QrxX3hbiXlLb+g==} + + '@octokit/core@3.6.0': + resolution: {integrity: sha512-7RKRKuA4xTjMhY+eG3jthb3hlZCsOwg3rztWh75Xc+ShDWOfDDATWbeZpAHBNRpm4Tv9WgBMOy1zEJYXG6NJ7Q==} + + '@octokit/endpoint@11.0.3': + resolution: {integrity: sha512-FWFlNxghg4HrXkD3ifYbS/IdL/mDHjh9QcsNyhQjN8dplUoZbejsdpmuqdA76nxj2xoWPs7p8uX2SNr9rYu0Ag==} + engines: {node: '>= 20'} + + '@octokit/graphql@4.8.0': + resolution: {integrity: sha512-0gv+qLSBLKF0z8TKaSKTsS39scVKF9dbMxJpj3U0vC7wjNWFuIpL/z76Qe2fiuCbDRcJSavkXsVtMS6/dtQQsg==} + + '@octokit/openapi-types@12.11.0': + resolution: {integrity: sha512-VsXyi8peyRq9PqIz/tpqiL2w3w80OgVMwBHltTml3LmVvXiphgeqmY9mvBw9Wu7e0QWk/fqD37ux8yP5uVekyQ==} + + '@octokit/openapi-types@27.0.0': + resolution: {integrity: sha512-whrdktVs1h6gtR+09+QsNk2+FO+49j6ga1c55YZudfEG+oKJVvJLQi3zkOm5JjiUXAagWK2tI2kTGKJ2Ys7MGA==} + + '@octokit/plugin-paginate-rest@14.0.0': + resolution: {integrity: sha512-fNVRE7ufJiAA3XUrha2omTA39M6IXIc6GIZLvlbsm8QOQCYvpq/LkMNGyFlB1d8hTDzsAXa3OKtybdMAYsV/fw==} + engines: {node: '>= 20'} peerDependencies: - rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 - peerDependenciesMeta: - rollup: - optional: true + '@octokit/core': '>=6' - '@rollup/plugin-node-resolve@15.3.0': - resolution: {integrity: sha512-9eO5McEICxMzJpDW9OnMYSv4Sta3hmt7VtBFz5zR9273suNOydOyq/FrGeGy+KsTRFm8w0SLVhzig2ILFT63Ag==} - engines: {node: '>=14.0.0'} + '@octokit/plugin-request-log@1.0.4': + resolution: {integrity: sha512-mLUsMkgP7K/cnFEw07kWqXGF5LKrOkD+lhCrKvPHXWDywAwuDUeDwWBpc69XK3pNX0uKiVt8g5z96PJ6z9xCFA==} peerDependencies: - rollup: ^2.78.0||^3.0.0||^4.0.0 - peerDependenciesMeta: - rollup: - optional: true + '@octokit/core': '>=3' - '@rollup/plugin-replace@5.0.7': - resolution: {integrity: sha512-PqxSfuorkHz/SPpyngLyg5GCEkOcee9M1bkxiVDr41Pd61mqP1PLOoDPbpl44SB2mQGKwV/In74gqQmGITOhEQ==} - engines: {node: '>=14.0.0'} + '@octokit/plugin-rest-endpoint-methods@5.16.2': + resolution: {integrity: sha512-8QFz29Fg5jDuTPXVtey05BLm7OB+M8fnvE64RNegzX7U+5NUXcOcnpTIK0YfSHBg8gYd0oxIq3IZTe9SfPZiRw==} peerDependencies: - rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 - peerDependenciesMeta: - rollup: - optional: true + '@octokit/core': '>=3' + + '@octokit/request-error@7.1.0': + resolution: {integrity: sha512-KMQIfq5sOPpkQYajXHwnhjCC0slzCNScLHs9JafXc4RAJI+9f+jNDlBNaIMTvazOPLgb4BnlhGJOTbnN0wIjPw==} + engines: {node: '>= 20'} + + '@octokit/request@10.0.8': + resolution: {integrity: sha512-SJZNwY9pur9Agf7l87ywFi14W+Hd9Jg6Ifivsd33+/bGUQIjNujdFiXII2/qSlN2ybqUHfp5xpekMEjIBTjlSw==} + engines: {node: '>= 20'} + + '@octokit/rest@18.12.0': + resolution: {integrity: sha512-gDPiOHlyGavxr72y0guQEhLsemgVjwRePayJ+FcKc2SJqKUbxbkvf5kAZEWA/MKvsfYlQAMVzNJE3ezQcxMJ2Q==} + + '@octokit/types@16.0.0': + resolution: {integrity: sha512-sKq+9r1Mm4efXW1FCk7hFSeJo4QKreL/tTbR0rz/qx/r1Oa2VV83LTA/H/MuCOX7uCIJmQVRKBcbmWoySjAnSg==} + + '@octokit/types@6.41.0': + resolution: {integrity: sha512-eJ2jbzjdijiL3B4PrSQaSjuF2sPEQPVCPzBvTHJD9Nz+9dw2SGH4K4xeQJ77YfTq5bRQ+bD8wT11JbeDPmxmGg==} + + '@oozcitak/dom@2.0.2': + resolution: {integrity: sha512-GjpKhkSYC3Mj4+lfwEyI1dqnsKTgwGy48ytZEhm4A/xnH/8z9M3ZVXKr/YGQi3uCLs1AEBS+x5T2JPiueEDW8w==} + engines: {node: '>=20.0'} + + '@oozcitak/infra@2.0.2': + resolution: {integrity: sha512-2g+E7hoE2dgCz/APPOEK5s3rMhJvNxSMBrP+U+j1OWsIbtSpWxxlUjq1lU8RIsFJNYv7NMlnVsCuHcUzJW+8vA==} + engines: {node: '>=20.0'} - '@rollup/pluginutils@5.1.2': - resolution: {integrity: sha512-/FIdS3PyZ39bjZlwqFnWqCOVnW7o963LtKMwQOD0NhQqw22gSr2YY1afu3FxRip4ZCZNsD5jq6Aaz6QV3D/Njw==} + '@oozcitak/url@3.0.0': + resolution: {integrity: sha512-ZKfET8Ak1wsLAiLWNfFkZc/BraDccuTJKR6svTYc7sVjbR+Iu0vtXdiDMY4o6jaFl5TW2TlS7jbLl4VovtAJWQ==} + engines: {node: '>=20.0'} + + '@oozcitak/util@10.0.0': + resolution: {integrity: sha512-hAX0pT/73190NLqBPPWSdBVGtbY6VOhWYK3qqHqtXQ1gK7kS2yz4+ivsN07hpJ6I3aeMtKP6J6npsEKOAzuTLA==} + engines: {node: '>=20.0'} + + '@puppeteer/browsers@2.13.0': + resolution: {integrity: sha512-46BZJYJjc/WwmKjsvDFykHtXrtomsCIrwYQPOP7VfMJoZY2bsDF9oROBABR3paDjDcmkUye1Pb1BqdcdiipaWA==} + engines: {node: '>=18'} + hasBin: true + + '@rollup/pluginutils@5.3.0': + resolution: {integrity: sha512-5EdhGZtnu3V88ces7s53hhfK5KSASnJZv8Lulpc04cWO3REESroJXg73DFsOmgbU2BhwV0E20bu2IDZb3VKW4Q==} engines: {node: '>=14.0.0'} peerDependencies: rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 @@ -703,40 +815,88 @@ packages: rollup: optional: true - '@trysound/sax@0.2.0': - resolution: {integrity: sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==} - engines: {node: '>=10.13.0'} + '@simple-git/args-pathspec@1.0.3': + resolution: {integrity: sha512-ngJMaHlsWDTfjyq9F3VIQ8b7NXbBLq5j9i5bJ6XLYtD6qlDXT7fdKY2KscWWUF8t18xx052Y/PUO1K1TRc9yKA==} + + '@simple-git/argv-parser@1.1.1': + resolution: {integrity: sha512-Q9lBcfQ+VQCpQqGJFHe5yooOS5hGdLFFbJ5R+R5aDsnkPCahtn1hSkMcORX65J2Z5lxSkD0lQorMsncuBQxYUw==} + + '@sindresorhus/is@4.6.0': + resolution: {integrity: sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==} + engines: {node: '>=10'} + + '@sindresorhus/merge-streams@2.3.0': + resolution: {integrity: sha512-LtoMMhxAlorcGhmFYI+LhPgbPZCkgP6ra1YL604EeF6U98pLlQ3iWIGMdWSC+vWmPBWBNgmDBAhnAobLROJmwg==} + engines: {node: '>=18'} + + '@sindresorhus/merge-streams@4.0.0': + resolution: {integrity: sha512-tlqY9xq5ukxTUZBmoOp+m61cqwQD5pHJtFY3Mn8CA8ps6yghLH/Hw8UPdqg4OLmFW3IFlcXnQNmo/dh8HzXYIQ==} + engines: {node: '>=18'} + + '@szmarczak/http-timer@4.0.6': + resolution: {integrity: sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==} + engines: {node: '>=10'} + + '@tootallnate/quickjs-emscripten@0.23.0': + resolution: {integrity: sha512-C5Mc6rdnsaJDjO3UpGW/CQTHtCKaYlScZTly4JIu97Jxo/odCiH0ITnDXSJPTOrEKk/ycSZ0AOgTmkDtkOsvIA==} - '@tybys/wasm-util@0.9.0': - resolution: {integrity: sha512-6+7nlbMVX/PVDCwaIQ8nTOPveOcFLSt8GcXdx8hD0bt39uWxYT88uXzqTd4fTvqta7oeUJqudepapKNt2DYJFw==} + '@types/cacheable-request@6.0.3': + resolution: {integrity: sha512-IQ3EbTzGxIigb1I3qPZc1rWJnH0BmSKv5QYTalEwweFvyBDLSAe24zP0le/hyi7ecGfZVlIVAg4BZqb8WBwKqw==} - '@types/estree@1.0.6': - resolution: {integrity: sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==} + '@types/estree@1.0.8': + resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} - '@types/node@22.5.5': - resolution: {integrity: sha512-Xjs4y5UPO/CLdzpgR6GirZJx36yScjh73+2NlLlkFRSoQN8B0DpfXPdZGnvVmLRLOsqDpOfTNv7D9trgGhmOIA==} + '@types/http-cache-semantics@4.0.4': + resolution: {integrity: sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA==} - '@types/resolve@1.20.2': - resolution: {integrity: sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q==} + '@types/keyv@3.1.4': + resolution: {integrity: sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==} - '@types/shimmer@1.2.0': - resolution: {integrity: sha512-UE7oxhQLLd9gub6JKIAhDq06T0F6FnztwMNRvYgjeQSBeMc1ZG/tA47EwfduvkuQS8apbkM/lpLpWsaCeYsXVg==} + '@types/minimist@1.2.5': + resolution: {integrity: sha512-hov8bUuiLiyFPGyFPE1lwWhmzYbirOXQNNo40+y3zow8aFVTeyn3VWL0VFFfdNddA8S4Vf0Tc062rzyNr7Paag==} + + '@types/node@25.0.3': + resolution: {integrity: sha512-W609buLVRVmeW693xKfzHeIV6nJGGz98uCPfeXI1ELMLXVeKYZ9m15fAMSaUPBHYLGFsVRcMmSCksQOrZV9BYA==} + + '@types/normalize-package-data@2.4.4': + resolution: {integrity: sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==} + + '@types/responselike@1.0.3': + resolution: {integrity: sha512-H/+L+UkTV33uf49PH5pCAUBVPNj2nDBXTN+qS1dOwyyg24l3CcicicCA7ca+HMvJBZcFgl5r8e+RR6elsb4Lyw==} + + '@types/yauzl@2.10.3': + resolution: {integrity: sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==} + + '@vercel/nft@1.5.0': + resolution: {integrity: sha512-IWTDeIoWhQ7ZtRO/JRKH+jhmeQvZYhtGPmzw/QGDY+wDCQqfm25P9yIdoAFagu4fWsK4IwZXDFIjrmp5rRm/sA==} + engines: {node: '>=20'} + hasBin: true + + abbrev@3.0.1: + resolution: {integrity: sha512-AO2ac6pjRB3SJmGJo+v5/aK6Omggp6fsLrs6wN9bd35ulu4cCwaAU9+7ZhXjeqHVkaHThLuzH0nZr0YpCDhygg==} + engines: {node: ^18.17.0 || >=20.5.0} acorn-import-attributes@1.9.5: resolution: {integrity: sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ==} peerDependencies: acorn: ^8 - acorn@8.12.1: - resolution: {integrity: sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==} + acorn-walk@8.3.5: + resolution: {integrity: sha512-HEHNfbars9v4pgpW6SO1KSPkfoS0xVOM/9UzkJltjlsHZmJasxg8aXkuZa7SMf8vKGIBhpUsPluQSqhJFCqebw==} engines: {node: '>=0.4.0'} - hasBin: true - acorn@8.15.0: - resolution: {integrity: sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==} + acorn@8.16.0: + resolution: {integrity: sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==} engines: {node: '>=0.4.0'} hasBin: true + agent-base@7.1.4: + resolution: {integrity: sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==} + engines: {node: '>= 14'} + + ajv@8.20.0: + resolution: {integrity: sha512-Thbli+OlOj+iMPYFBVBfJ3OmCAnaSyNn4M1vz9T6Gka5Jt9ba/HIR56joy65tY6kx/FCF5VXNB819Y7/GUrBGA==} + ansi-regex@5.0.1: resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} engines: {node: '>=8'} @@ -749,61 +909,261 @@ packages: resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} engines: {node: '>=8'} - asynckit@0.4.0: - resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} + ansi-styles@6.2.3: + resolution: {integrity: sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==} + engines: {node: '>=12'} + + anymatch@3.1.3: + resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} + engines: {node: '>= 8'} + + argparse@1.0.10: + resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} + + argparse@2.0.1: + resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + + array-find-index@1.0.2: + resolution: {integrity: sha512-M1HQyIXcBGtVywBt8WVdim+lrNaK7VHp99Qt5pSNziXznKHViIBbXWtfRTpEFpF/c4FdfxNAsCCwPp5phBYJtw==} + engines: {node: '>=0.10.0'} + + arrgv@1.0.2: + resolution: {integrity: sha512-a4eg4yhp7mmruZDQFqVMlxNRFGi/i1r87pt8SDHy0/I8PqSXoUTlWZRdAZo0VXgvEARcujbtTk8kiZRi1uDGRw==} + engines: {node: '>=8.0.0'} + + arrify@1.0.1: + resolution: {integrity: sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==} + engines: {node: '>=0.10.0'} + + arrify@3.0.0: + resolution: {integrity: sha512-tLkvA81vQG/XqE2mjDkGQHoOINtMHtysSnemrmoGe6PydDPMRbVugqyk4A6V/WDWEfm3l+0d8anA9r8cv/5Jaw==} + engines: {node: '>=12'} + + ast-types@0.13.4: + resolution: {integrity: sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w==} + engines: {node: '>=4'} + + astral-regex@2.0.0: + resolution: {integrity: sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==} + engines: {node: '>=8'} + + async-sema@3.1.1: + resolution: {integrity: sha512-tLRNUXati5MFePdAk8dw7Qt7DpxPB60ofAgn8WRhW6a2rcimZnYBP9oxHiv0OHy+Wz7kPMG+t4LGdt31+4EmGg==} - autoprefixer@10.4.20: - resolution: {integrity: sha512-XY25y5xSv/wEoqzDyXXME4AFfkZI0P23z6Fs3YgymDnKJkCGOnkL0iTxCa85UTqaSgfcqyf3UA6+c7wUvx/16g==} - engines: {node: ^10 || ^12 || >=14} + ava@8.0.0: + resolution: {integrity: sha512-KMUyT3LcnZ/5ipDAqnTGn6PQUvr1Jk4dex3v7ieQrGaMlAblfIpMLwK56HfPcObvJEzyhCWXfZjbM98FeAy0oQ==} + engines: {node: ^22.20 || ^24.12 || >=25} hasBin: true peerDependencies: - postcss: ^8.1.0 + '@ava/typescript': '*' + peerDependenciesMeta: + '@ava/typescript': + optional: true + + b4a@1.7.3: + resolution: {integrity: sha512-5Q2mfq2WfGuFp3uS//0s6baOJLMoVduPYVeNmDYxu5OUA1/cBfvr2RIS7vi62LdNj/urk1hfmj867I3qt6uZ7Q==} + peerDependencies: + react-native-b4a: '*' + peerDependenciesMeta: + react-native-b4a: + optional: true + + babel-plugin-polyfill-corejs2@0.4.17: + resolution: {integrity: sha512-aTyf30K/rqAsNwN76zYrdtx8obu0E4KoUME29B1xj+B3WxgvWkp943vYQ+z8Mv3lw9xHXMHpvSPOBxzAkIa94w==} + peerDependencies: + '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 + + babel-plugin-polyfill-corejs3@0.14.2: + resolution: {integrity: sha512-coWpDLJ410R781Npmn/SIBZEsAetR4xVi0SxLMXPaMO4lSf1MwnkGYMtkFxew0Dn8B3/CpbpYxN0JCgg8mn67g==} + peerDependencies: + '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 + + babel-plugin-polyfill-regenerator@0.6.8: + resolution: {integrity: sha512-M762rNHfSF1EV3SLtnCJXFoQbbIIz0OyRwnCmV0KPC7qosSfCO0QLTSuJX3ayAebubhE6oYBAYPrBA5ljowaZg==} + peerDependencies: + '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 + + balanced-match@4.0.4: + resolution: {integrity: sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==} + engines: {node: 18 || 20 || >=22} + + bare-events@2.8.2: + resolution: {integrity: sha512-riJjyv1/mHLIPX4RwiK+oW9/4c3TEUeORHKefKAKnZ5kyslbN+HXowtbaVEqt4IMUB7OXlfixcs6gsFeo/jhiQ==} + peerDependencies: + bare-abort-controller: '*' + peerDependenciesMeta: + bare-abort-controller: + optional: true + + bare-fs@4.5.2: + resolution: {integrity: sha512-veTnRzkb6aPHOvSKIOy60KzURfBdUflr5VReI+NSaPL6xf+XLdONQgZgpYvUuZLVQ8dCqxpBAudaOM1+KpAUxw==} + engines: {bare: '>=1.16.0'} + peerDependencies: + bare-buffer: '*' + peerDependenciesMeta: + bare-buffer: + optional: true + + bare-os@3.6.2: + resolution: {integrity: sha512-T+V1+1srU2qYNBmJCXZkUY5vQ0B4FSlL3QDROnKQYOqeiQR8UbjNHlPa+TIbM4cuidiN9GaTaOZgSEgsvPbh5A==} + engines: {bare: '>=1.14.0'} + + bare-path@3.0.0: + resolution: {integrity: sha512-tyfW2cQcB5NN8Saijrhqn0Zh7AnFNsnczRcuWODH0eYAXBsJ5gVxAUuNr7tsHSC6IZ77cA0SitzT+s47kot8Mw==} + + bare-stream@2.7.0: + resolution: {integrity: sha512-oyXQNicV1y8nc2aKffH+BUHFRXmx6VrPzlnaEvMhram0nPBrKcEdcyBg5r08D0i8VxngHFAiVyn1QKXpSG0B8A==} + peerDependencies: + bare-buffer: '*' + bare-events: '*' + peerDependenciesMeta: + bare-buffer: + optional: true + bare-events: + optional: true - axios@0.28.1: - resolution: {integrity: sha512-iUcGA5a7p0mVb4Gm/sy+FSECNkPFT4y7wt6OM/CDpO/OnNCvSs3PoMG8ibrC9jRoGYU0gUK5pXVC4NPXq6lHRQ==} + bare-url@2.3.2: + resolution: {integrity: sha512-ZMq4gd9ngV5aTMa5p9+UfY0b3skwhHELaDkhEHetMdX0LRkW9kzaym4oo/Eh+Ghm0CCDuMTsRIGM/ytUc1ZYmw==} - balanced-match@1.0.2: - resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + baseline-browser-mapping@2.10.24: + resolution: {integrity: sha512-I2NkZOOrj2XuguvWCK6OVh9GavsNjZjK908Rq3mIBK25+GD8vPX5w2WdxVqnQ7xx3SrZJiCiZFu+/Oz50oSYSA==} + engines: {node: '>=6.0.0'} + hasBin: true + + basic-ftp@6.0.0: + resolution: {integrity: sha512-e7YiZyECW7BauqLe6c+oyb49q0VwpMfEGBftvDwtH96uasvkRbFmloKX3Bdd0L38DCUAVgV2uwSJ5ErIAgFzlw==} + engines: {node: '>=10.0.0'} + + before-after-hook@2.2.3: + resolution: {integrity: sha512-NzUnlZexiaH/46WDhANlyR2bXRopNg4F/zuSA3OpZnllCUgRaOF2znDioDWrmbNVsuZk6l9pMquQB38cfBZwkQ==} + + binary-extensions@2.3.0: + resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} + engines: {node: '>=8'} + + bindings@1.5.0: + resolution: {integrity: sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==} + + bluebird@3.7.2: + resolution: {integrity: sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==} - boolbase@1.0.0: - resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==} + blueimp-md5@2.19.0: + resolution: {integrity: sha512-DRQrD6gJyy8FbiE4s+bDoXS9hiW3Vbx5uCdwvcCf3zLHL+Iv7LtGHLpr+GZV8rHG8tK766FGYBwRbu8pELTt+w==} - brace-expansion@2.0.1: - resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} + brace-expansion@5.0.5: + resolution: {integrity: sha512-VZznLgtwhn+Mact9tfiwx64fA9erHH/MCXEUfB/0bX/6Fz6ny5EGTXYltMocqg4xFAQZtnO3DHWWXi8RiuN7cQ==} + engines: {node: 18 || 20 || >=22} braces@3.0.3: resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} engines: {node: '>=8'} - browserslist@4.24.0: - resolution: {integrity: sha512-Rmb62sR1Zpjql25eSanFGEhAxcFwfA1K0GuQcLoaJBAcENegrQut3hYdhXFF1obQfiDyqIW/cLM5HSJ/9k884A==} + browserslist@4.28.2: + resolution: {integrity: sha512-48xSriZYYg+8qXna9kwqjIVzuQxi+KYWp2+5nCYnYKPTr0LvD89Jqk2Or5ogxz0NUMfIjhh2lIUX/LyX9B4oIg==} engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true - caniuse-api@3.0.0: - resolution: {integrity: sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==} + buffer-crc32@0.2.13: + resolution: {integrity: sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==} + + cacheable-lookup@5.0.4: + resolution: {integrity: sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==} + engines: {node: '>=10.6.0'} + + cacheable-request@7.0.4: + resolution: {integrity: sha512-v+p6ongsrp0yTGbJXjgxPow2+DL93DASP4kXCDKb8/bwRtt9OEF3whggkkDkGNzgcWy2XaF4a8nZglC7uElscg==} + engines: {node: '>=8'} + + callsites@3.1.0: + resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} + engines: {node: '>=6'} + + callsites@4.2.0: + resolution: {integrity: sha512-kfzR4zzQtAE9PC7CzZsjl3aBNbXWuXiSeOCdLcPpBfGW8YuCqQHcRPFDbr/BPVmd3EEPVpuFzLyuT/cUhPr4OQ==} + engines: {node: '>=12.20'} + + camelcase-keys@6.2.2: + resolution: {integrity: sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==} + engines: {node: '>=8'} + + camelcase@5.3.1: + resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==} + engines: {node: '>=6'} + + caniuse-lite@1.0.30001791: + resolution: {integrity: sha512-yk0l/YSrOnFZk3UROpDLQD9+kC1l4meK/wed583AXrzoarMGJcbRi2Q4RaUYbKxYAsZ8sWmaSa/DsLmdBeI1vQ==} - caniuse-lite@1.0.30001664: - resolution: {integrity: sha512-AmE7k4dXiNKQipgn7a2xg558IRqPN3jMQY/rOsbxDhrd0tyChwbITBfiwtnqz8bi2M5mIWbxAYBvk7W7QBUS2g==} + cbor@10.0.12: + resolution: {integrity: sha512-exQDevYd7ZQLP4moMQcZkKCVZsXLAtUSflObr3xTh4xzFIv/xBCdvCd6L259kQOUP2kcTC0jvC6PpZIf/WmRXA==} + engines: {node: '>=20'} chalk@2.4.2: resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} engines: {node: '>=4'} - chalk@5.3.0: - resolution: {integrity: sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==} + chalk@4.1.2: + resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} + engines: {node: '>=10'} + + chalk@5.6.2: + resolution: {integrity: sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==} engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} - citty@0.1.6: - resolution: {integrity: sha512-tskPPKEs8D2KPafUypv2gxwJP8h/OaJmC82QQGGDQcHvXX43xF2VDACcJVmZ0EuSxkpO9Kc4MlrA3q0+FG58AQ==} + charenc@0.0.2: + resolution: {integrity: sha512-yrLQ/yVUFXkzg7EDQsPieE/53+0RlaWTs+wBrvW36cyilJ2SaDWfl4Yj7MtLTXleV9uEKefbAGUPv2/iWSooRA==} + + chokidar@3.6.0: + resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} + engines: {node: '>= 8.10.0'} + + chownr@3.0.0: + resolution: {integrity: sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==} + engines: {node: '>=18'} + + chromium-bidi@14.0.0: + resolution: {integrity: sha512-9gYlLtS6tStdRWzrtXaTMnqcM4dudNegMXJxkR0I/CXObHalYeYcAMPrL19eroNZHtJ8DQmu1E+ZNOYu/IXMXw==} + peerDependencies: + devtools-protocol: '*' + + chunkd@2.0.1: + resolution: {integrity: sha512-7d58XsFmOq0j6el67Ug9mHf9ELUXsQXYJBkyxhH/k+6Ke0qXRnv0kbemx+Twc6fRJ07C49lcbdgm9FL1Ei/6SQ==} + + ci-info@4.4.0: + resolution: {integrity: sha512-77PSwercCZU2Fc4sX94eF8k8Pxte6JAwL4/ICZLFjJLqegs7kCuAsqqj/70NQF6TvDpgFjkubQB2FW2ZZddvQg==} + engines: {node: '>=8'} + + ci-parallel-vars@1.0.1: + resolution: {integrity: sha512-uvzpYrpmidaoxvIQHM+rKSrigjOe9feHYbw4uOI2gdfe1C3xIlxO+kVXq83WQWNniTf8bAxVpy+cQeFQsMERKg==} + + cli-spinner@0.2.10: + resolution: {integrity: sha512-U0sSQ+JJvSLi1pAYuJykwiA8Dsr15uHEy85iCJ6A+0DjVxivr3d+N2Wjvodeg89uP5K6TswFkKBfAD7B3YSn/Q==} + engines: {node: '>=0.10'} + + cli-truncate@6.0.0: + resolution: {integrity: sha512-3+YKIUFsohD9MIoOFPFBldjAlnfCmCDcqe6aYGFqlDTRKg80p4wg35L+j83QQ63iOlKRccEkbn8IuM++HsgEjA==} + engines: {node: '>=22'} - cjs-module-lexer@1.4.3: - resolution: {integrity: sha512-9z8TZaGM1pfswYeXrUpzPrkx8UnWYdhJclsiYMm6x/w5+nN+8Tf/LnAgfLGQCm59qAOxU8WwHEq2vNwF6i4j+Q==} + cliui@6.0.0: + resolution: {integrity: sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==} + + cliui@7.0.4: + resolution: {integrity: sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==} cliui@8.0.1: resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} engines: {node: '>=12'} + cliui@9.0.1: + resolution: {integrity: sha512-k7ndgKhwoQveBL+/1tqGJYNz097I7WOvwbmmU2AR5+magtbjPWQTS1C5vzGkBC8Ym8UWRzfKUzUUqFLypY4Q+w==} + engines: {node: '>=20'} + + clone-response@1.0.3: + resolution: {integrity: sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==} + + code-excerpt@4.0.0: + resolution: {integrity: sha512-xxodCmBen3iy2i0WtAK8FlFNrRzjUqjRsMfho58xT/wvZU1YTM3fCnRjcy1gJPMepaRlgm/0e6w8SpWHpn3/cA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + color-convert@1.9.3: resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} @@ -817,80 +1177,77 @@ packages: color-name@1.1.4: resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} - colord@2.9.3: - resolution: {integrity: sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==} - - combined-stream@1.0.8: - resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} - engines: {node: '>= 0.8'} + colors@1.4.0: + resolution: {integrity: sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==} + engines: {node: '>=0.1.90'} - commander@7.2.0: - resolution: {integrity: sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==} - engines: {node: '>= 10'} + commander@6.2.1: + resolution: {integrity: sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==} + engines: {node: '>= 6'} - commondir@1.0.1: - resolution: {integrity: sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==} + common-path-prefix@3.0.0: + resolution: {integrity: sha512-QE33hToZseCH3jS0qN96O/bSh3kaw/h+Tq7ngyY9eWDUnTlTNUyqfqvCXioLe5Na5jFsL78ra/wuBU4iuEgd4w==} - confbox@0.1.7: - resolution: {integrity: sha512-uJcB/FKZtBMCJpK8MQji6bJHgu1tixKPxRLeGkNzBoOZzpnZUJm0jm2/sBDWcuBx1dYgxV4JU+g5hmNxCyAmdA==} + concordance@5.0.4: + resolution: {integrity: sha512-OAcsnTEYu1ARJqWVGwf4zh4JDfHZEaSNlNccFmt8YjB2l/n19/PF2viLINHc57vO4FKIAFl2FWASIGZZWZ2Kxw==} + engines: {node: '>=10.18.0 <11 || >=12.14.0 <13 || >=14'} - consola@3.2.3: - resolution: {integrity: sha512-I5qxpzLv+sJhTVEoLYNcTW+bThDCPsit0vLNKShZx6rLtpilNpmmeTPaeqJb9ZE9dV3DGaeby6Vuhrw38WjeyQ==} + consola@3.4.2: + resolution: {integrity: sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA==} engines: {node: ^14.18.0 || >=16.10.0} convert-source-map@2.0.0: resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} - css-declaration-sorter@7.2.0: - resolution: {integrity: sha512-h70rUM+3PNFuaBDTLe8wF/cdWu+dOZmb7pJt8Z2sedYbAcQVQV/tEchueg3GWxwqS0cxtbxmaHEdkNACqcvsow==} - engines: {node: ^14 || ^16 || >=18} - peerDependencies: - postcss: ^8.0.9 + convert-to-spaces@2.0.1: + resolution: {integrity: sha512-rcQ1bsQO9799wq24uE5AM2tAILy4gXGIK/njFWcVQkGNZ96edlpY+A7bjwvzjYvLDyzmG1MmMLZhpcsb+klNMQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - css-select@5.1.0: - resolution: {integrity: sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==} + copyfiles@2.4.1: + resolution: {integrity: sha512-fereAvAvxDrQDOXybk3Qu3dPbOoKoysFMWtkY3mv5BsL8//OSZVL5DCLYqgRfY5cWirgRzlC+WSrxp6Bo3eNZg==} + hasBin: true - css-tree@2.2.1: - resolution: {integrity: sha512-OA0mILzGc1kCOCSJerOeqDxDQ4HOh+G8NbOJFOTgOCzpw7fCBubk0fEyxp8AgOL/jvLgYA/uV0cMbe43ElF1JA==} - engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0, npm: '>=7.0.0'} + core-js-compat@3.49.0: + resolution: {integrity: sha512-VQXt1jr9cBz03b331DFDCCP90b3fanciLkgiOoy8SBHy06gNf+vQ1A3WFLqG7I8TipYIKeYK9wxd0tUrvHcOZA==} - css-tree@2.3.1: - resolution: {integrity: sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw==} - engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0} + core-util-is@1.0.3: + resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} - css-what@6.1.0: - resolution: {integrity: sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==} - engines: {node: '>= 6'} + cosmiconfig@9.0.0: + resolution: {integrity: sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==} + engines: {node: '>=14'} + peerDependencies: + typescript: '>=4.9.5' + peerDependenciesMeta: + typescript: + optional: true - cssesc@3.0.0: - resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} - engines: {node: '>=4'} + cross-env@10.1.0: + resolution: {integrity: sha512-GsYosgnACZTADcmEyJctkJIoqAhHjttw7RsFrVoJNXbsWWqaq6Ym+7kZjq6mS45O0jij6vtiReppKQEtqWy6Dw==} + engines: {node: '>=20'} hasBin: true - cssnano-preset-default@7.0.6: - resolution: {integrity: sha512-ZzrgYupYxEvdGGuqL+JKOY70s7+saoNlHSCK/OGn1vB2pQK8KSET8jvenzItcY+kA7NoWvfbb/YhlzuzNKjOhQ==} - engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} - peerDependencies: - postcss: ^8.4.31 + cross-spawn@7.0.6: + resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} + engines: {node: '>= 8'} - cssnano-utils@5.0.0: - resolution: {integrity: sha512-Uij0Xdxc24L6SirFr25MlwC2rCFX6scyUmuKpzI+JQ7cyqDEwD42fJ0xfB3yLfOnRDU5LKGgjQ9FA6LYh76GWQ==} - engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} - peerDependencies: - postcss: ^8.4.31 + crypt@0.0.2: + resolution: {integrity: sha512-mCxBlsHFYh9C+HVpiEacem8FEBnMXgU9gy4zmNC+SXAZNB/1idgp/aulFJ4FgCi7GPEVbfyng092GqL2k2rmow==} - cssnano@7.0.6: - resolution: {integrity: sha512-54woqx8SCbp8HwvNZYn68ZFAepuouZW4lTwiMVnBErM3VkO7/Sd4oTOt3Zz3bPx3kxQ36aISppyXj2Md4lg8bw==} - engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} - peerDependencies: - postcss: ^8.4.31 + currently-unhandled@0.4.1: + resolution: {integrity: sha512-/fITjgjGU50vjQ4FH6eUoYu+iUoUKIXws2hL15JJpIR+BbTxaXQsMuuyjtNh2WqsSBS5nsaZHFsFecyw5CCAng==} + engines: {node: '>=0.10.0'} + + data-uri-to-buffer@6.0.2: + resolution: {integrity: sha512-7hvf7/GW8e86rW0ptuwS3OcBGDjIi6SZva7hCyWC0yYry2cOPmLIjXAUHI6DK2HsnwJd9ifmt57i8eV2n4YNpw==} + engines: {node: '>= 14'} - csso@5.0.5: - resolution: {integrity: sha512-0LrrStPOdJj+SPCCrGhzryycLjwcgUSHBtxNA8aIDxf0GLsRh1cKYhB00Gd1lDOS4yGH69+SNn13+TWbVHETFQ==} - engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0, npm: '>=7.0.0'} + date-time@3.1.0: + resolution: {integrity: sha512-uqCUKXE5q1PNBXjPqvwhwJf9SwMoAHBgWJ6DcrnS5o+W2JOiIILl0JEdVD8SGujrNS02GGxgwAg2PN2zONgtjg==} + engines: {node: '>=6'} - debug@4.3.7: - resolution: {integrity: sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==} + debug@4.4.3: + resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==} engines: {node: '>=6.0'} peerDependencies: supports-color: '*' @@ -898,95 +1255,205 @@ packages: supports-color: optional: true - deepmerge@4.3.1: - resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} + decamelize-keys@1.1.1: + resolution: {integrity: sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg==} + engines: {node: '>=0.10.0'} + + decamelize@1.2.0: + resolution: {integrity: sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==} engines: {node: '>=0.10.0'} - defu@6.1.4: - resolution: {integrity: sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg==} + decode-tiff@0.2.1: + resolution: {integrity: sha512-v/7hQBv/DrOVQ+Eljg0BLMRbXZYuuw3YZ8duZuFxYpo6qUkdn7oFRkN95RZKbnh08EHNjrMXMbEUNhTLuhPvvA==} - delay@5.0.0: - resolution: {integrity: sha512-ReEBKkIfe4ya47wlPYf/gu5ib6yUG0/Aez0JQZQz94kiWtRQvZIQbTiehsnwHvLSWJnQdhVeqYue7Id1dKr0qw==} + decompress-response@6.0.0: + resolution: {integrity: sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==} engines: {node: '>=10'} - delayed-stream@1.0.0: - resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} - engines: {node: '>=0.4.0'} + defer-to-connect@2.0.1: + resolution: {integrity: sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==} + engines: {node: '>=10'} + + degenerator@5.0.1: + resolution: {integrity: sha512-TllpMR/t0M5sqCXfj85i4XaAzxmS5tVA16dqvdkMwGmzI+dXLXnw3J+3Vdv7VKw+ThlTMboK6i9rnZ6Nntj5CQ==} + engines: {node: '>= 14'} + + del@8.0.1: + resolution: {integrity: sha512-gPqh0mKTPvaUZGAuHbrBUYKZWBNAeHG7TU3QH5EhVwPMyKvmfJaNXhcD2jTcXsJRRcffuho4vaYweu80dRrMGA==} + engines: {node: '>=18'} - dir-glob@3.0.1: - resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} + depd@2.0.0: + resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} + engines: {node: '>= 0.8'} + + deprecation@2.3.1: + resolution: {integrity: sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ==} + + detect-libc@2.1.2: + resolution: {integrity: sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==} engines: {node: '>=8'} - dom-serializer@2.0.0: - resolution: {integrity: sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==} + devtools-protocol@0.0.1595872: + resolution: {integrity: sha512-kRfgp8vWVjBu/fbYCiVFiOqsCk3CrMKEo3WbgGT2NXK2dG7vawWPBljixajVgGK9II8rDO9G0oD0zLt3I1daRg==} - domelementtype@2.3.0: - resolution: {integrity: sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==} + ee-first@1.1.1: + resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} - domhandler@5.0.3: - resolution: {integrity: sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==} - engines: {node: '>= 4'} + electron-to-chromium@1.5.346: + resolution: {integrity: sha512-3PGbvVwt9AppQsta0Kuq5DIcSj7aQfDfCVS7KnV3nhXEDtuJVRS7kK28Q+qy5KRkQ4bICV4xOaXNeUaXe78dDg==} - domutils@3.1.0: - resolution: {integrity: sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==} + emittery@2.0.0: + resolution: {integrity: sha512-FLtgn/CGBXiX3ZtPAm5q4LWWepHChOt55J9u01WFu3dyap2U7IwptlrqoE1COR/kxwdy/DOxIBALSxIW449I1g==} + engines: {node: '>=22'} - electron-to-chromium@1.5.29: - resolution: {integrity: sha512-PF8n2AlIhCKXQ+gTpiJi0VhcHDb69kYX4MtCiivctc2QD3XuNZ/XIOlbGzt7WAjjEev0TtaH6Cu3arZExm5DOw==} + emoji-regex@10.6.0: + resolution: {integrity: sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==} emoji-regex@8.0.0: resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} - entities@4.5.0: - resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} - engines: {node: '>=0.12'} + encodeurl@2.0.0: + resolution: {integrity: sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==} + engines: {node: '>= 0.8'} - esbuild@0.19.12: - resolution: {integrity: sha512-aARqgq8roFBj054KvQr5f1sFu0D65G+miZRCuJyJ0G13Zwx7vRar5Zhn2tkQNzIXcBrNVsv/8stehpj+GAjgbg==} - engines: {node: '>=12'} - hasBin: true + end-of-stream@1.4.5: + resolution: {integrity: sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==} - esbuild@0.23.1: - resolution: {integrity: sha512-VVNz/9Sa0bs5SELtn3f7qhJCDPCF5oMEl5cO9/SSinpE9hbPVvxbd572HH5AKiP7WD8INO53GgfDDhRjkylHEg==} - engines: {node: '>=18'} - hasBin: true + env-paths@2.2.1: + resolution: {integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==} + engines: {node: '>=6'} + + error-ex@1.3.4: + resolution: {integrity: sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==} + + es-errors@1.3.0: + resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} + engines: {node: '>= 0.4'} escalade@3.2.0: resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} engines: {node: '>=6'} + escape-html@1.0.3: + resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} + escape-string-regexp@1.0.5: resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} engines: {node: '>=0.8.0'} + escape-string-regexp@2.0.0: + resolution: {integrity: sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==} + engines: {node: '>=8'} + + escape-string-regexp@5.0.0: + resolution: {integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==} + engines: {node: '>=12'} + + escodegen@2.1.0: + resolution: {integrity: sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==} + engines: {node: '>=6.0'} + hasBin: true + + esprima@4.0.1: + resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} + engines: {node: '>=4'} + hasBin: true + + estraverse@5.3.0: + resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} + engines: {node: '>=4.0'} + estree-walker@2.0.2: resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} - fast-glob@3.3.2: - resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} + esutils@2.0.3: + resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} + engines: {node: '>=0.10.0'} + + etag@1.8.1: + resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==} + engines: {node: '>= 0.6'} + + events-universal@1.0.1: + resolution: {integrity: sha512-LUd5euvbMLpwOF8m6ivPCbhQeSiYVNb8Vs0fQ8QjXo0JTkEHpz8pxdQf0gStltaPpw0Cca8b39KxvK9cfKRiAw==} + + extract-zip@2.0.1: + resolution: {integrity: sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==} + engines: {node: '>= 10.17.0'} + hasBin: true + + fast-content-type-parse@3.0.0: + resolution: {integrity: sha512-ZvLdcY8P+N8mGQJahJV5G4U88CSvT1rP8ApL6uETe88MBXrBHAkZlSEySdUlyztF7ccb+Znos3TFqaepHxdhBg==} + + fast-deep-equal@3.1.3: + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + + fast-diff@1.3.0: + resolution: {integrity: sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==} + + fast-fifo@1.3.2: + resolution: {integrity: sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==} + + fast-glob@3.3.3: + resolution: {integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==} engines: {node: '>=8.6.0'} - fastq@1.17.1: - resolution: {integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==} + fast-uri@3.1.0: + resolution: {integrity: sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA==} + + fastq@1.19.1: + resolution: {integrity: sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==} + + fd-slicer@1.1.0: + resolution: {integrity: sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==} + + figures@6.1.0: + resolution: {integrity: sha512-d+l3qxjSesT4V7v2fh+QnmFnUWv9lSpjarhShNTgBOfA0ttejbQUAlHLitbjkoRiDulW0OPoQPYIGhIC8ohejg==} + engines: {node: '>=18'} + + file-uri-to-path@1.0.0: + resolution: {integrity: sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==} fill-range@7.1.1: resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} engines: {node: '>=8'} - follow-redirects@1.15.9: - resolution: {integrity: sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==} - engines: {node: '>=4.0'} - peerDependencies: - debug: '*' - peerDependenciesMeta: - debug: - optional: true + finalhandler@2.1.1: + resolution: {integrity: sha512-S8KoZgRZN+a5rNwqTxlZZePjT/4cnm0ROV70LedRHZ0p8u9fRID0hJUZQpkKLzro8LfmC8sx23bY6tVNxv8pQA==} + engines: {node: '>= 18.0.0'} - form-data@4.0.1: - resolution: {integrity: sha512-tzN8e4TX8+kkxGPK8D5u0FNmjPUjw3lwC9lSLxxoB/+GtsJG91CO8bSWy73APlgAZzZbXEYZJuxjkHH2w+Ezhw==} - engines: {node: '>= 6'} + find-up-simple@1.0.1: + resolution: {integrity: sha512-afd4O7zpqHeRyg4PfDQsXmlDe2PfdHtJt6Akt8jOWaApLOZk5JXs6VMR29lz03pRe9mpykrRCYIYxaJYcfpncQ==} + engines: {node: '>=18'} - fraction.js@4.3.7: - resolution: {integrity: sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==} + find-up@4.1.0: + resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} + engines: {node: '>=8'} + + flow-bin@0.77.0: + resolution: {integrity: sha512-ejne8bZMAx1/H3J3icWEVZC2GkCZeesclnFEb8eAcb1WCs/CCep/0T5A2x+BssHzC2w/x57IDZWHuy2Vj200Kw==} + engines: {node: '>=0.10.0'} + hasBin: true + + flow-typed@4.1.1: + resolution: {integrity: sha512-S1NSkTm81UkoSiuDp9vUAY+jYSB8r/Bec1RFqjK3o+XagFu+OQtm1nh3ZyoshHtg1oPKfrSnslXHlqWiP76BSw==} + engines: {node: '>=10.0.0'} + hasBin: true + + flowgen@1.21.0: + resolution: {integrity: sha512-pFNFFyMLRmW6njhOIm5TrbGUDTv64aujmys2KrkRE2NYD8sXwJUyicQRwU5SPRBRJnFSD/FNlnHo2NnHI5eJSw==} + hasBin: true + + fresh@2.0.0: + resolution: {integrity: sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==} + engines: {node: '>= 0.8'} + + fs-extra@8.1.0: + resolution: {integrity: sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==} + engines: {node: '>=6 <7 || >=8'} + + fs-readdir-recursive@1.1.0: + resolution: {integrity: sha512-GNanXlVr2pf02+sPN40XN8HG+ePaNcvM0q5mZBd668Obwb0yD5GiUbZOFgwn8kGMY6I3mdyDJzieUy3PTYyTRA==} fs.realpath@1.0.0: resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} @@ -1007,40 +1474,113 @@ packages: resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} engines: {node: 6.* || 8.* || >= 10.*} - glob-parent@5.1.2: - resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} - engines: {node: '>= 6'} + get-east-asian-width@1.4.0: + resolution: {integrity: sha512-QZjmEOC+IT1uk6Rx0sX22V6uHWVwbdbxf1faPqJ1QhLdGgsRGCZoyaQBm/piRdJy/D2um6hM1UP7ZEeQ4EkP+Q==} + engines: {node: '>=18'} - glob@8.1.0: - resolution: {integrity: sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==} - engines: {node: '>=12'} - deprecated: Glob versions prior to v9 are no longer supported + get-east-asian-width@1.5.0: + resolution: {integrity: sha512-CQ+bEO+Tva/qlmw24dCejulK5pMzVnUOFOijVogd3KQs07HnRIgp8TGipvCCRT06xeYEbpbgwaCxglFyiuIcmA==} + engines: {node: '>=18'} - globals@11.12.0: - resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} - engines: {node: '>=4'} + get-stream@5.2.0: + resolution: {integrity: sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==} + engines: {node: '>=8'} - globby@13.2.2: - resolution: {integrity: sha512-Y1zNGV+pzQdh7H39l9zgB4PJqjRNqydvdYCDG4HFXM4XuvSaQQlEc91IU1yALL8gUTDomgBAfz3XJdmUS+oo0w==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + get-uri@6.0.5: + resolution: {integrity: sha512-b1O07XYq8eRuVzBNgJLstU6FYc1tS6wnMtF1I1D9lE8LxZSOGZ7LhxN54yPP6mGw5f2CkXY2BQUL9Fx41qvcIg==} + engines: {node: '>= 14'} + + glob-parent@6.0.2: + resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} + engines: {node: '>=10.13.0'} + + glob@13.0.6: + resolution: {integrity: sha512-Wjlyrolmm8uDpm/ogGyXZXb1Z+Ca2B8NbJwqBVg0axK9GbBeoS7yGV6vjXnYdGm6X53iehEuxxbyiKp8QmN4Vw==} + engines: {node: 18 || 20 || >=22} + + glob@7.2.3: + resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} + deprecated: Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me + + globby@14.1.0: + resolution: {integrity: sha512-0Ia46fDOaT7k4og1PDW4YbodWWr3scS2vAr2lTbsplOt2WkKp0vQbkI9wKis/T5LV/dqPjO3bpS/z6GTJB82LA==} + engines: {node: '>=18'} + + globby@16.2.0: + resolution: {integrity: sha512-QrJia2qDf5BB/V6HYlDTs0I0lBahyjLzpGQg3KT7FnCdTonAyPy2RtY802m2k4ALx6Dp752f82WsOczEVr3l6Q==} + engines: {node: '>=20'} + + got@11.8.6: + resolution: {integrity: sha512-6tfZ91bOr7bOXnK7PRDCGBLa1H4U080YHNaAQ2KsMGlLEzRbk44nsZF2E1IeRc3vtJHPVbKCYgdFbaGO2ljd8g==} + engines: {node: '>=10.19.0'} + + graceful-fs@4.2.11: + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + + hard-rejection@2.1.0: + resolution: {integrity: sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==} + engines: {node: '>=6'} has-flag@3.0.0: resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} engines: {node: '>=4'} + has-flag@4.0.0: + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + engines: {node: '>=8'} + hasown@2.0.2: resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} engines: {node: '>= 0.4'} - hookable@5.5.3: - resolution: {integrity: sha512-Yc+BQe8SvoXH1643Qez1zqLRmbA5rCL+sSmk6TVos0LWVfNIB7PGncdlId77WzLGSIB5KaWgTaNTs2lNVEI6VQ==} + hosted-git-info@2.8.9: + resolution: {integrity: sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==} - ignore@5.3.2: - resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} + hosted-git-info@4.1.0: + resolution: {integrity: sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==} + engines: {node: '>=10'} + + http-cache-semantics@4.2.0: + resolution: {integrity: sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ==} + + http-errors@2.0.1: + resolution: {integrity: sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==} + engines: {node: '>= 0.8'} + + http-proxy-agent@7.0.2: + resolution: {integrity: sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==} + engines: {node: '>= 14'} + + http2-wrapper@1.0.3: + resolution: {integrity: sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg==} + engines: {node: '>=10.19.0'} + + https-proxy-agent@7.0.6: + resolution: {integrity: sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==} + engines: {node: '>= 14'} + + ignore-by-default@2.1.0: + resolution: {integrity: sha512-yiWd4GVmJp0Q6ghmM2B/V3oZGRmjrKLXvHR3TE1nfoXsmoggllfZUQe74EN0fJdPFZu2NIvNdrMMLm3OsV7Ohw==} + engines: {node: '>=10 <11 || >=12 <13 || >=14'} + + ignore@7.0.5: + resolution: {integrity: sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==} engines: {node: '>= 4'} - import-in-the-middle@1.15.0: - resolution: {integrity: sha512-bpQy+CrsRmYmoPMAE/0G33iwRqwW4ouqdRg8jgbH3aKuCtOc8lxgmYXg2dMM92CRiGP660EtBcymH/eVUpCSaA==} + img-diff-js@0.5.4: + resolution: {integrity: sha512-FTGQ7i/1W/3nmhiYxoN81FBcxESVSgv/4/e5LnfRzd/w5hBcD1LPxmYu2N8euzVsLrsgztOQcSTDQZKaf0+LOA==} + + import-fresh@3.3.1: + resolution: {integrity: sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==} + engines: {node: '>=6'} + + indent-string@4.0.0: + resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==} + engines: {node: '>=8'} + + indent-string@5.0.0: + resolution: {integrity: sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg==} + engines: {node: '>=12'} inflight@1.0.6: resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} @@ -1049,8 +1589,30 @@ packages: inherits@2.0.4: resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} - is-core-module@2.15.1: - resolution: {integrity: sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ==} + interpret@1.4.0: + resolution: {integrity: sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==} + engines: {node: '>= 0.10'} + + ip-address@10.1.0: + resolution: {integrity: sha512-XXADHxXmvT9+CRxhXg56LJovE+bmWnEWB78LB83VZTprKTmaC5QfruXocxzTZ2Kl0DNwKuBdlIhjL8LeY8Sf8Q==} + engines: {node: '>= 12'} + + irregular-plurals@4.2.0: + resolution: {integrity: sha512-bW9UXHL7bnUcNtTo+9ccSngbxc+V40H32IgvdVin0Xs8gbo+AVYD5g/72ce/54Kjfhq66vcZr8H8TKEvsifeOw==} + engines: {node: '>=18.20'} + + is-arrayish@0.2.1: + resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} + + is-binary-path@2.1.0: + resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} + engines: {node: '>=8'} + + is-buffer@1.1.6: + resolution: {integrity: sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==} + + is-core-module@2.16.1: + resolution: {integrity: sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==} engines: {node: '>= 0.4'} is-extglob@2.1.1: @@ -1061,68 +1623,178 @@ packages: resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} engines: {node: '>=8'} + is-fullwidth-code-point@5.1.0: + resolution: {integrity: sha512-5XHYaSyiqADb4RnZ1Bdad6cPp8Toise4TzEjcOYDHZkTCbKgiUl7WTUCpNWHuxmDt91wnsZBc9xinNzopv3JMQ==} + engines: {node: '>=18'} + is-glob@4.0.3: resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} engines: {node: '>=0.10.0'} - is-module@1.0.0: - resolution: {integrity: sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==} - is-number@7.0.0: resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} engines: {node: '>=0.12.0'} - is-reference@1.2.1: - resolution: {integrity: sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ==} + is-path-cwd@3.0.0: + resolution: {integrity: sha512-kyiNFFLU0Ampr6SDZitD/DwUo4Zs1nSdnygUBqsu3LooL00Qvb5j+UnvApUn/TTj1J3OuE6BTdQ5rudKmU2ZaA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - jiti@1.21.6: - resolution: {integrity: sha512-2yTgeWTWzMWkHu6Jp9NKgePDaYHbntiwvYuuJLbbN9vl7DC9DvXKOB2BC3ZZ92D3cvV/aflH0osDfwpHepQ53w==} - hasBin: true + is-path-inside@4.0.0: + resolution: {integrity: sha512-lJJV/5dYS+RcL8uQdBDW9c9uWFLLBNRyFhnAKXw5tVqLlKZ4RMGZKv+YQ/IA3OhD+RpbJa1LLFM1FQPGyIXvOA==} + engines: {node: '>=12'} - jiti@2.0.0: - resolution: {integrity: sha512-CJ7e7Abb779OTRv3lomfp7Mns/Sy1+U4pcAx5VbjxCZD5ZM/VJaXPpPjNKjtSvWQy/H86E49REXR34dl1JEz9w==} - hasBin: true + is-plain-obj@1.1.0: + resolution: {integrity: sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==} + engines: {node: '>=0.10.0'} + + is-plain-object@5.0.0: + resolution: {integrity: sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==} + engines: {node: '>=0.10.0'} + + is-promise@4.0.0: + resolution: {integrity: sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==} + + is-unicode-supported@2.1.0: + resolution: {integrity: sha512-mE00Gnza5EEB3Ds0HfMyllZzbBrmLOX3vfWoj9A9PEnTfratQ/BcaJOuMhnkhjXvb2+FkY3VuHqtAGpTPmglFQ==} + engines: {node: '>=18'} + + isarray@0.0.1: + resolution: {integrity: sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==} + + isarray@1.0.0: + resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} + + isexe@2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + + jpeg-js@0.4.4: + resolution: {integrity: sha512-WZzeDOEtTOBK4Mdsar0IqEU5sMr3vSV2RqkAIzUEV2BHnUfKGyswWFPFwK5EeDo93K3FohSHbLAjj0s1Wzd+dg==} + + js-string-escape@1.0.1: + resolution: {integrity: sha512-Smw4xcfIQ5LVjAOuJCvN/zIodzA/BBSsluuoSykP+lUvScIi4U6RJLfwHet5cxFnCswUjISV8oAXaqaJDY3chg==} + engines: {node: '>= 0.8'} js-tokens@4.0.0: resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} - jsesc@2.5.2: - resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==} - engines: {node: '>=4'} + js-yaml@3.14.2: + resolution: {integrity: sha512-PMSmkqxr106Xa156c2M265Z+FTrPl+oxd/rgOQy2tijQeK5TxQ43psO1ZCwhVOSdnn+RzkzlRz/eY4BgJBYVpg==} + hasBin: true + + js-yaml@4.1.1: + resolution: {integrity: sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==} hasBin: true + jsesc@3.1.0: + resolution: {integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==} + engines: {node: '>=6'} + hasBin: true + + json-buffer@3.0.1: + resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} + + json-parse-even-better-errors@2.3.1: + resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} + + json-schema-traverse@1.0.0: + resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} + + json-with-bigint@3.5.8: + resolution: {integrity: sha512-eq/4KP6K34kwa7TcFdtvnftvHCD9KvHOGGICWwMFc4dOOKF5t4iYqnfLK8otCRCRv06FXOzGGyqE8h8ElMvvdw==} + json5@2.2.3: resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} engines: {node: '>=6'} hasBin: true - lilconfig@3.1.2: - resolution: {integrity: sha512-eop+wDAvpItUys0FWkHIKeC9ybYrTGbU41U5K7+bttZZeohvnY7M9dZ5kB21GNWiFT2q1OoPTvncPCgSOVO5ow==} - engines: {node: '>=14'} + jsonfile@4.0.0: + resolution: {integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==} + + keyv@4.5.4: + resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} + + kind-of@6.0.3: + resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} + engines: {node: '>=0.10.0'} + + lines-and-columns@1.2.4: + resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} - lodash.camelcase@4.3.0: - resolution: {integrity: sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==} + load-json-file@7.0.1: + resolution: {integrity: sha512-Gnxj3ev3mB5TkVBGad0JM6dmLiQL+o0t23JPBZ9sd+yvSLk05mFoqKBw5N8gbbkU4TNXyqCgIrl/VM17OgUIgQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + locate-path@5.0.0: + resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} + engines: {node: '>=8'} + + lodash.debounce@4.0.8: + resolution: {integrity: sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==} - lodash.memoize@4.1.2: - resolution: {integrity: sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==} + lodash.truncate@4.4.2: + resolution: {integrity: sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==} - lodash.uniq@4.5.0: - resolution: {integrity: sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==} + lodash@4.18.1: + resolution: {integrity: sha512-dMInicTPVE8d1e5otfwmmjlxkZoUpiVLwyeTdUsi/Caj/gfzzblBcCE5sRHV/AsjuCmxWrte2TNGSYuCeCq+0Q==} - long@5.3.2: - resolution: {integrity: sha512-mNAgZ1GmyNhD7AuqnTG3/VQ26o760+ZYBPKjPvugO8+nLbYfX6TVpJPseBvopbdY+qpZ/lKUnmEc1LeZYS3QAA==} + lowercase-keys@2.0.0: + resolution: {integrity: sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==} + engines: {node: '>=8'} + + lru-cache@11.3.5: + resolution: {integrity: sha512-NxVFwLAnrd9i7KUBxC4DrUhmgjzOs+1Qm50D3oF1/oL+r1NpZ4gA7xvG0/zJ8evR7zIKn4vLf7qTNduWFtCrRw==} + engines: {node: 20 || >=22} lru-cache@5.1.1: resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} - magic-string@0.30.11: - resolution: {integrity: sha512-+Wri9p0QHMy+545hKww7YAu5NyzF8iomPL/RQazugQ9+Ez4Ic3mERMd8ZTX5rfK944j+560ZJi8iAwgak1Ac7A==} + lru-cache@6.0.0: + resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} + engines: {node: '>=10'} + + lru-cache@7.18.3: + resolution: {integrity: sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==} + engines: {node: '>=12'} + + make-dir@2.1.0: + resolution: {integrity: sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==} + engines: {node: '>=6'} + + make-dir@3.1.0: + resolution: {integrity: sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==} + engines: {node: '>=8'} + + map-obj@1.0.1: + resolution: {integrity: sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==} + engines: {node: '>=0.10.0'} + + map-obj@4.3.0: + resolution: {integrity: sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==} + engines: {node: '>=8'} + + matcher@6.0.0: + resolution: {integrity: sha512-TzDerdcNtI79w7Av4GT57bLdElPA/VAkjqdMZv8yhuc8geU2z0ljW9anXbX/55aHEMTpYypZb1lxsA/46r9oOQ==} + engines: {node: '>=20'} + + md5-file@4.0.0: + resolution: {integrity: sha512-UC0qFwyAjn4YdPpKaDNw6gNxRf7Mcx7jC1UGCY4boCzgvU2Aoc1mOGzTtrjjLKhM5ivsnhoKpQVxKPp+1j1qwg==} + engines: {node: '>=6.0'} + hasBin: true + + md5-hex@3.0.1: + resolution: {integrity: sha512-BUiRtTtV39LIJwinWBjqVsU9xhdnz7/i889V859IBFpuqGAj6LuOvHv5XLbgZ2R7ptJoJaEcxkv88/h25T7Ciw==} + engines: {node: '>=8'} + + md5@2.3.0: + resolution: {integrity: sha512-T1GITYmFaKuO91vxyoQMFETst+O71VUPEU3ze5GNzDm0OWdP8v1ziTaAEPUr/3kLsY3Sftgz242A1SetQiDL7g==} - mdn-data@2.0.28: - resolution: {integrity: sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g==} + memoize@11.0.0: + resolution: {integrity: sha512-cjsfZaC9b1clqPeIVMbb5dLHSXgdgGWGxdAU3oTUUkHiwWTKTBNnSmcqWJncNjYtBi3S8Rp0c5GIiyGztR8TRA==} + engines: {node: '>=22'} - mdn-data@2.0.30: - resolution: {integrity: sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==} + meow@9.0.0: + resolution: {integrity: sha512-+obSblOQmRhcyBt62furQqRAQpNyWXo8BuQ5bN7dG8wmwQ+vwHKp/rCFD4CrTP8CsDQD1sjoZ94K417XEUk8IQ==} + engines: {node: '>=10'} merge2@1.4.1: resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} @@ -1132,413 +1804,655 @@ packages: resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} engines: {node: '>=8.6'} - mime-db@1.52.0: - resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} + mime-db@1.54.0: + resolution: {integrity: sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==} engines: {node: '>= 0.6'} - mime-types@2.1.35: - resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} - engines: {node: '>= 0.6'} + mime-types@3.0.2: + resolution: {integrity: sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A==} + engines: {node: '>=18'} + + mimic-function@5.0.1: + resolution: {integrity: sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==} + engines: {node: '>=18'} + + mimic-response@1.0.1: + resolution: {integrity: sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==} + engines: {node: '>=4'} + + mimic-response@3.1.0: + resolution: {integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==} + engines: {node: '>=10'} + + min-indent@1.0.1: + resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==} + engines: {node: '>=4'} + + minimatch@10.2.5: + resolution: {integrity: sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==} + engines: {node: 18 || 20 || >=22} + + minimatch@3.1.5: + resolution: {integrity: sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==} + + minimist-options@4.1.0: + resolution: {integrity: sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==} + engines: {node: '>= 6'} + + minipass@7.1.2: + resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} + engines: {node: '>=16 || 14 >=14.17'} - minimatch@5.1.6: - resolution: {integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==} + minipass@7.1.3: + resolution: {integrity: sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==} + engines: {node: '>=16 || 14 >=14.17'} + + minizlib@3.1.0: + resolution: {integrity: sha512-KZxYo1BUkWD2TVFLr0MQoM8vUUigWD3LlD83a/75BqC+4qE0Hb1Vo5v1FgcfaNXvfXzr+5EhQ6ing/CaBijTlw==} + engines: {node: '>= 18'} + + mitt@3.0.1: + resolution: {integrity: sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==} + + mkdirp@1.0.4: + resolution: {integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==} engines: {node: '>=10'} + hasBin: true - mkdist@1.5.9: - resolution: {integrity: sha512-PdJimzhcgDxaHpk1SUabw56gT3BU15vBHUTHkeeus8Kl7jUkpgG7+z0PiS/y23XXgO8TiU/dKP3L1oG55qrP1g==} + ms@2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + + mustache@4.2.0: + resolution: {integrity: sha512-71ippSywq5Yb7/tVYyGbkBggbU8H3u5Rz56fH60jGFgr8uHwxs+aSKeqmluIVzM0m0kB7xQjKS6qPfd0b2ZoqQ==} hasBin: true + + netmask@2.0.2: + resolution: {integrity: sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg==} + engines: {node: '>= 0.4.0'} + + node-fetch@2.7.0: + resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} + engines: {node: 4.x || >=6.0.0} peerDependencies: - sass: ^1.78.0 - typescript: '>=5.5.4' - vue-tsc: ^1.8.27 || ^2.0.21 + encoding: ^0.1.0 peerDependenciesMeta: - sass: - optional: true - typescript: - optional: true - vue-tsc: + encoding: optional: true - mlly@1.7.1: - resolution: {integrity: sha512-rrVRZRELyQzrIUAVMHxP97kv+G786pHmOKzuFII8zDYahFBS7qnHh2AlYSl1GAHhaMPCz6/oHjVMcfFYgFYHgA==} + node-gyp-build@4.8.4: + resolution: {integrity: sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ==} + hasBin: true - module-details-from-path@1.0.4: - resolution: {integrity: sha512-EGWKgxALGMgzvxYF1UyGTy0HXX/2vHLkw6+NvDKW2jypWbHpjQuj4UMcqQWXHERJhVGKikolT06G3bcKe4fi7w==} + node-releases@2.0.38: + resolution: {integrity: sha512-3qT/88Y3FbH/Kx4szpQQ4HzUbVrHPKTLVpVocKiLfoYvw9XSGOX2FmD2d6DrXbVYyAQTF2HeF6My8jmzx7/CRw==} - mri@1.2.0: - resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==} - engines: {node: '>=4'} + node-stream-zip@1.15.0: + resolution: {integrity: sha512-LN4fydt9TqhZhThkZIVQnF9cwjU3qmUH9h78Mx/K7d3VvfRqqwthLwJEUOEL0QPZ0XQmNN7be5Ggit5+4dq3Bw==} + engines: {node: '>=0.12.0'} - ms@2.1.3: - resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + nofilter@3.1.0: + resolution: {integrity: sha512-l2NNj07e9afPnhAhvgVrCD/oy2Ai1yfLpuo3EpiO1jFTsB4sFz6oIfAfSZyQzVpkZQ9xS8ZS5g1jCBgq4Hwo0g==} + engines: {node: '>=12.19'} - nanoid@3.3.7: - resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==} - engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} - hasBin: true + noms@0.0.0: + resolution: {integrity: sha512-lNDU9VJaOPxUmXcLb+HQFeUgQQPtMI24Gt6hgfuMHRJgMRHMF/qZ4HJD3GDru4sSw9IQl2jPjAYnQrdIeLbwow==} - node-gyp-build@3.9.0: - resolution: {integrity: sha512-zLcTg6P4AbcHPq465ZMFNXx7XpKKJh+7kkN699NiQWisR2uWYOWNWqRHAmbnmKiL4e9aLSlmy5U7rEMUXV59+A==} + nopt@8.1.0: + resolution: {integrity: sha512-ieGu42u/Qsa4TFktmaKEwM6MQH0pOWnaB3htzh0JRtx84+Mebc0cbZYN5bC+6WTZ4+77xrL9Pn5m7CV6VIkV7A==} + engines: {node: ^18.17.0 || >=20.5.0} hasBin: true - node-releases@2.0.18: - resolution: {integrity: sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==} + normalize-package-data@2.5.0: + resolution: {integrity: sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==} + + normalize-package-data@3.0.3: + resolution: {integrity: sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==} + engines: {node: '>=10'} - normalize-range@0.1.2: - resolution: {integrity: sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==} + normalize-path@3.0.0: + resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} engines: {node: '>=0.10.0'} - nth-check@2.1.1: - resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==} + normalize-url@6.1.0: + resolution: {integrity: sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==} + engines: {node: '>=10'} + + on-finished@2.4.1: + resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==} + engines: {node: '>= 0.8'} once@1.4.0: resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} - p-limit@3.1.0: - resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} - engines: {node: '>=10'} + p-cancelable@2.1.1: + resolution: {integrity: sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==} + engines: {node: '>=8'} - path-parse@1.0.7: - resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + p-limit@2.3.0: + resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} + engines: {node: '>=6'} - path-type@4.0.0: - resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} + p-locate@4.1.0: + resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} engines: {node: '>=8'} - pathe@1.1.2: - resolution: {integrity: sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==} + p-map@7.0.4: + resolution: {integrity: sha512-tkAQEw8ysMzmkhgw8k+1U/iPhWNhykKnSk4Rd5zLoPJCuJaGRPo6YposrZgaxHKzDHdDWWZvE/Sk7hsL2X/CpQ==} + engines: {node: '>=18'} - picocolors@1.1.0: - resolution: {integrity: sha512-TQ92mBOW0l3LeMeyLV6mzy/kWr8lkd/hp3mTg7wYK7zJhuBStmGMBG0BdeDZS/dZx1IukaX6Bk11zcln25o1Aw==} + p-try@2.2.0: + resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} + engines: {node: '>=6'} - picomatch@2.3.1: - resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} - engines: {node: '>=8.6'} + pac-proxy-agent@7.2.0: + resolution: {integrity: sha512-TEB8ESquiLMc0lV8vcd5Ql/JAKAoyzHFXaStwjkzpOpC5Yv+pIzLfHvjTSdf3vpa2bMiUQrg9i6276yn8666aA==} + engines: {node: '>= 14'} - pkg-types@1.2.0: - resolution: {integrity: sha512-+ifYuSSqOQ8CqP4MbZA5hDpb97n3E8SVWdJe+Wms9kj745lmd3b7EZJiqvmLwAlmRfjrI7Hi5z3kdBJ93lFNPA==} + pac-resolver@7.0.1: + resolution: {integrity: sha512-5NPgf87AT2STgwa2ntRMr45jTKrYBGkVU36yT0ig/n/GMAa3oPqhZfIQ2kMEimReg0+t9kZViDVZ83qfVUlckg==} + engines: {node: '>= 14'} - postcss-calc@10.0.2: - resolution: {integrity: sha512-DT/Wwm6fCKgpYVI7ZEWuPJ4az8hiEHtCUeYjZXqU7Ou4QqYh1Df2yCQ7Ca6N7xqKPFkxN3fhf+u9KSoOCJNAjg==} - engines: {node: ^18.12 || ^20.9 || >=22.0} - peerDependencies: - postcss: ^8.4.38 + package-config@5.0.0: + resolution: {integrity: sha512-GYTTew2slBcYdvRHqjhwaaydVMvn/qrGC323+nKclYioNSLTDUM/lGgtGTgyHVtYcozb+XkE8CNhwcraOmZ9Mg==} + engines: {node: '>=18'} - postcss-colormin@7.0.2: - resolution: {integrity: sha512-YntRXNngcvEvDbEjTdRWGU606eZvB5prmHG4BF0yLmVpamXbpsRJzevyy6MZVyuecgzI2AWAlvFi8DAeCqwpvA==} - engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} - peerDependencies: - postcss: ^8.4.31 + parent-module@1.0.1: + resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} + engines: {node: '>=6'} - postcss-convert-values@7.0.4: - resolution: {integrity: sha512-e2LSXPqEHVW6aoGbjV9RsSSNDO3A0rZLCBxN24zvxF25WknMPpX8Dm9UxxThyEbaytzggRuZxaGXqaOhxQ514Q==} - engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} - peerDependencies: - postcss: ^8.4.31 + parse-json@5.2.0: + resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} + engines: {node: '>=8'} - postcss-discard-comments@7.0.3: - resolution: {integrity: sha512-q6fjd4WU4afNhWOA2WltHgCbkRhZPgQe7cXF74fuVB/ge4QbM9HEaOIzGSiMvM+g/cOsNAUGdf2JDzqA2F8iLA==} - engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} - peerDependencies: - postcss: ^8.4.31 + parse-ms@4.0.0: + resolution: {integrity: sha512-TXfryirbmq34y8QBwgqCVLi+8oA3oWx2eAnSn62ITyEhEYaWRlVZ2DvMM9eZbMs/RfxPu/PK/aBLyGj4IrqMHw==} + engines: {node: '>=18'} - postcss-discard-duplicates@7.0.1: - resolution: {integrity: sha512-oZA+v8Jkpu1ct/xbbrntHRsfLGuzoP+cpt0nJe5ED2FQF8n8bJtn7Bo28jSmBYwqgqnqkuSXJfSUEE7if4nClQ==} - engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} - peerDependencies: - postcss: ^8.4.31 + parseurl@1.3.3: + resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} + engines: {node: '>= 0.8'} - postcss-discard-empty@7.0.0: - resolution: {integrity: sha512-e+QzoReTZ8IAwhnSdp/++7gBZ/F+nBq9y6PomfwORfP7q9nBpK5AMP64kOt0bA+lShBFbBDcgpJ3X4etHg4lzA==} - engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} - peerDependencies: - postcss: ^8.4.31 + path-exists@4.0.0: + resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} + engines: {node: '>=8'} - postcss-discard-overridden@7.0.0: - resolution: {integrity: sha512-GmNAzx88u3k2+sBTZrJSDauR0ccpE24omTQCVmaTTZFz1du6AasspjaUPMJ2ud4RslZpoFKyf+6MSPETLojc6w==} - engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} - peerDependencies: - postcss: ^8.4.31 + path-is-absolute@1.0.1: + resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} + engines: {node: '>=0.10.0'} - postcss-merge-longhand@7.0.4: - resolution: {integrity: sha512-zer1KoZA54Q8RVHKOY5vMke0cCdNxMP3KBfDerjH/BYHh4nCIh+1Yy0t1pAEQF18ac/4z3OFclO+ZVH8azjR4A==} - engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} - peerDependencies: - postcss: ^8.4.31 + path-key@3.1.1: + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + engines: {node: '>=8'} - postcss-merge-rules@7.0.4: - resolution: {integrity: sha512-ZsaamiMVu7uBYsIdGtKJ64PkcQt6Pcpep/uO90EpLS3dxJi6OXamIobTYcImyXGoW0Wpugh7DSD3XzxZS9JCPg==} - engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} - peerDependencies: - postcss: ^8.4.31 + path-parse@1.0.7: + resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} - postcss-minify-font-values@7.0.0: - resolution: {integrity: sha512-2ckkZtgT0zG8SMc5aoNwtm5234eUx1GGFJKf2b1bSp8UflqaeFzR50lid4PfqVI9NtGqJ2J4Y7fwvnP/u1cQog==} - engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} - peerDependencies: - postcss: ^8.4.31 + path-scurry@2.0.2: + resolution: {integrity: sha512-3O/iVVsJAPsOnpwWIeD+d6z/7PmqApyQePUtCndjatj/9I5LylHvt5qluFaBT3I5h3r1ejfR056c+FCv+NnNXg==} + engines: {node: 18 || 20 || >=22} - postcss-minify-gradients@7.0.0: - resolution: {integrity: sha512-pdUIIdj/C93ryCHew0UgBnL2DtUS3hfFa5XtERrs4x+hmpMYGhbzo6l/Ir5de41O0GaKVpK1ZbDNXSY6GkXvtg==} - engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} - peerDependencies: - postcss: ^8.4.31 + path-type@6.0.0: + resolution: {integrity: sha512-Vj7sf++t5pBD637NSfkxpHSMfWaeig5+DKWLhcqIYx6mWQz5hdJTGDVMQiJcw1ZYkhs7AazKDGpRVji1LJCZUQ==} + engines: {node: '>=18'} - postcss-minify-params@7.0.2: - resolution: {integrity: sha512-nyqVLu4MFl9df32zTsdcLqCFfE/z2+f8GE1KHPxWOAmegSo6lpV2GNy5XQvrzwbLmiU7d+fYay4cwto1oNdAaQ==} - engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} - peerDependencies: - postcss: ^8.4.31 + pend@1.2.0: + resolution: {integrity: sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==} - postcss-minify-selectors@7.0.4: - resolution: {integrity: sha512-JG55VADcNb4xFCf75hXkzc1rNeURhlo7ugf6JjiiKRfMsKlDzN9CXHZDyiG6x/zGchpjQS+UAgb1d4nqXqOpmA==} - engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} - peerDependencies: - postcss: ^8.4.31 + picocolors@1.1.1: + resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} - postcss-nested@6.2.0: - resolution: {integrity: sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ==} - engines: {node: '>=12.0'} - peerDependencies: - postcss: ^8.2.14 + picomatch@4.0.4: + resolution: {integrity: sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==} + engines: {node: '>=12'} - postcss-normalize-charset@7.0.0: - resolution: {integrity: sha512-ABisNUXMeZeDNzCQxPxBCkXexvBrUHV+p7/BXOY+ulxkcjUZO0cp8ekGBwvIh2LbCwnWbyMPNJVtBSdyhM2zYQ==} - engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} - peerDependencies: - postcss: ^8.4.31 + pify@4.0.1: + resolution: {integrity: sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==} + engines: {node: '>=6'} - postcss-normalize-display-values@7.0.0: - resolution: {integrity: sha512-lnFZzNPeDf5uGMPYgGOw7v0BfB45+irSRz9gHQStdkkhiM0gTfvWkWB5BMxpn0OqgOQuZG/mRlZyJxp0EImr2Q==} - engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} - peerDependencies: - postcss: ^8.4.31 + pixelmatch@5.3.0: + resolution: {integrity: sha512-o8mkY4E/+LNUf6LzX96ht6k6CEDi65k9G2rjMtBe9Oo+VPKSvl+0GKHuH/AlG+GA5LPG/i5hrekkxUc3s2HU+Q==} + hasBin: true - postcss-normalize-positions@7.0.0: - resolution: {integrity: sha512-I0yt8wX529UKIGs2y/9Ybs2CelSvItfmvg/DBIjTnoUSrPxSV7Z0yZ8ShSVtKNaV/wAY+m7bgtyVQLhB00A1NQ==} - engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} - peerDependencies: - postcss: ^8.4.31 + plur@6.0.0: + resolution: {integrity: sha512-Y9wXQivjRX0REtwpA9+n0bYYypWESn3cWtW2vazymw711qn+AQXxzZjRqhANYGBLIMC1UzVdpwe/1hHQwHfwng==} + engines: {node: '>=20'} - postcss-normalize-repeat-style@7.0.0: - resolution: {integrity: sha512-o3uSGYH+2q30ieM3ppu9GTjSXIzOrRdCUn8UOMGNw7Af61bmurHTWI87hRybrP6xDHvOe5WlAj3XzN6vEO8jLw==} - engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} - peerDependencies: - postcss: ^8.4.31 + pngjs@6.0.0: + resolution: {integrity: sha512-TRzzuFRRmEoSW/p1KVAmiOgPco2Irlah+bGFCeNfJXxxYGwSw7YwAOAcd7X28K/m5bjBWKsC29KyoMfHbypayg==} + engines: {node: '>=12.13.0'} - postcss-normalize-string@7.0.0: - resolution: {integrity: sha512-w/qzL212DFVOpMy3UGyxrND+Kb0fvCiBBujiaONIihq7VvtC7bswjWgKQU/w4VcRyDD8gpfqUiBQ4DUOwEJ6Qg==} - engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} - peerDependencies: - postcss: ^8.4.31 + pngjs@7.0.0: + resolution: {integrity: sha512-LKWqWJRhstyYo9pGvgor/ivk2w94eSjE3RGVuzLGlr3NmD8bf7RcYGze1mNdEHRP6TRP6rMuDHk5t44hnTRyow==} + engines: {node: '>=14.19.0'} - postcss-normalize-timing-functions@7.0.0: - resolution: {integrity: sha512-tNgw3YV0LYoRwg43N3lTe3AEWZ66W7Dh7lVEpJbHoKOuHc1sLrzMLMFjP8SNULHaykzsonUEDbKedv8C+7ej6g==} - engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} - peerDependencies: - postcss: ^8.4.31 + presentable-error@0.0.1: + resolution: {integrity: sha512-E6rsNU1QNJgB3sjj7OANinGncFKuK+164sLXw1/CqBjj/EkXSoSdHCtWQGBNlREIGLnL7IEUEGa08YFVUbrhVg==} + engines: {node: '>=16'} - postcss-normalize-unicode@7.0.2: - resolution: {integrity: sha512-ztisabK5C/+ZWBdYC+Y9JCkp3M9qBv/XFvDtSw0d/XwfT3UaKeW/YTm/MD/QrPNxuecia46vkfEhewjwcYFjkg==} - engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} - peerDependencies: - postcss: ^8.4.31 + prettier@1.19.1: + resolution: {integrity: sha512-s7PoyDv/II1ObgQunCbB9PdLmUcBZcnWOcxDh7O0N/UwDEsHyqkW+Qh28jW+mVuCdx7gLB0BotYI1Y6uI9iyew==} + engines: {node: '>=4'} + hasBin: true - postcss-normalize-url@7.0.0: - resolution: {integrity: sha512-+d7+PpE+jyPX1hDQZYG+NaFD+Nd2ris6r8fPTBAjE8z/U41n/bib3vze8x7rKs5H1uEw5ppe9IojewouHk0klQ==} - engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} - peerDependencies: - postcss: ^8.4.31 + prettier@2.8.8: + resolution: {integrity: sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==} + engines: {node: '>=10.13.0'} + hasBin: true - postcss-normalize-whitespace@7.0.0: - resolution: {integrity: sha512-37/toN4wwZErqohedXYqWgvcHUGlT8O/m2jVkAfAe9Bd4MzRqlBmXrJRePH0e9Wgnz2X7KymTgTOaaFizQe3AQ==} - engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} - peerDependencies: - postcss: ^8.4.31 + pretty-ms@9.3.0: + resolution: {integrity: sha512-gjVS5hOP+M3wMm5nmNOucbIrqudzs9v/57bWRHQWLYklXqoXKrVfYW2W9+glfGsqtPgpiz5WwyEEB+ksXIx3gQ==} + engines: {node: '>=18'} - postcss-ordered-values@7.0.1: - resolution: {integrity: sha512-irWScWRL6nRzYmBOXReIKch75RRhNS86UPUAxXdmW/l0FcAsg0lvAXQCby/1lymxn/o0gVa6Rv/0f03eJOwHxw==} - engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} - peerDependencies: - postcss: ^8.4.31 + process-nextick-args@2.0.1: + resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} - postcss-reduce-initial@7.0.2: - resolution: {integrity: sha512-pOnu9zqQww7dEKf62Nuju6JgsW2V0KRNBHxeKohU+JkHd/GAH5uvoObqFLqkeB2n20mr6yrlWDvo5UBU5GnkfA==} - engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} - peerDependencies: - postcss: ^8.4.31 + progress@2.0.3: + resolution: {integrity: sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==} + engines: {node: '>=0.4.0'} - postcss-reduce-transforms@7.0.0: - resolution: {integrity: sha512-pnt1HKKZ07/idH8cpATX/ujMbtOGhUfE+m8gbqwJE05aTaNw8gbo34a2e3if0xc0dlu75sUOiqvwCGY3fzOHew==} - engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} - peerDependencies: - postcss: ^8.4.31 + proxy-agent@6.5.0: + resolution: {integrity: sha512-TmatMXdr2KlRiA2CyDu8GqR8EjahTG3aY3nXjdzFyoZbmB8hrBsTyMezhULIXKnC0jpfjlmiZ3+EaCzoInSu/A==} + engines: {node: '>= 14'} - postcss-selector-parser@6.1.2: - resolution: {integrity: sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==} - engines: {node: '>=4'} + proxy-from-env@1.1.0: + resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} - postcss-svgo@7.0.1: - resolution: {integrity: sha512-0WBUlSL4lhD9rA5k1e5D8EN5wCEyZD6HJk0jIvRxl+FDVOMlJ7DePHYWGGVc5QRqrJ3/06FTXM0bxjmJpmTPSA==} - engines: {node: ^18.12.0 || ^20.9.0 || >= 18} - peerDependencies: - postcss: ^8.4.31 + pump@3.0.3: + resolution: {integrity: sha512-todwxLMY7/heScKmntwQG8CXVkWUOdYxIvY2s0VWAAMh/nd8SoYiRaKjlr7+iCs984f2P8zvrfWcDDYVb73NfA==} - postcss-unique-selectors@7.0.3: - resolution: {integrity: sha512-J+58u5Ic5T1QjP/LDV9g3Cx4CNOgB5vz+kM6+OxHHhFACdcDeKhBXjQmB7fnIZM12YSTvsL0Opwco83DmacW2g==} - engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} - peerDependencies: - postcss: ^8.4.31 + puppeteer-core@24.42.0: + resolution: {integrity: sha512-T4zXokk/izH01fYPhyyev1A4piWiOKrYq7CUFpdoYQxmOnXoV6YjUabmfIjCYkNspSoAXIxRid3Tw+Vg0fthYg==} + engines: {node: '>=18'} - postcss-value-parser@4.2.0: - resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} + puppeteer@24.42.0: + resolution: {integrity: sha512-94MoPfFp2eY3eYIMdINkez4IOP5TMHntlZbVx06fHlQTtiQiYgaY0L2Zzfod8PVUkPqP7m3Qlre2v8YS8cudPA==} + engines: {node: '>=18'} + hasBin: true - postcss@8.4.47: - resolution: {integrity: sha512-56rxCq7G/XfB4EkXq9Egn5GCqugWvDFjafDOThIdMBsI15iqPqR5r15TfSr1YPYeEI19YeaXMCbY6u88Y76GLQ==} - engines: {node: ^10 || ^12 || >=14} + queue-microtask@1.2.3: + resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} - pprof-format@2.1.0: - resolution: {integrity: sha512-0+G5bHH0RNr8E5hoZo/zJYsL92MhkZjwrHp3O2IxmY8RJL9ooKeuZ8Tm0ZNBw5sGZ9TiM71sthTjWoR2Vf5/xw==} + quick-lru@4.0.1: + resolution: {integrity: sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==} + engines: {node: '>=8'} - pretty-bytes@6.1.1: - resolution: {integrity: sha512-mQUvGU6aUFQ+rNvTIAcZuWGRT9a6f6Yrg9bHs4ImKF+HZCEK+plBvnAZYSIQztknZF2qnzNtr6F8s0+IuptdlQ==} - engines: {node: ^14.13.1 || >=16.0.0} + quick-lru@5.1.1: + resolution: {integrity: sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==} + engines: {node: '>=10'} - protobufjs@7.5.4: - resolution: {integrity: sha512-CvexbZtbov6jW2eXAvLukXjXUW1TzFaivC46BpWc/3BpcCysb5Vffu+B3XHMm8lVEuy2Mm4XGex8hBSg1yapPg==} - engines: {node: '>=12.0.0'} + range-parser@1.2.1: + resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==} + engines: {node: '>= 0.6'} - proxy-from-env@1.1.0: - resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} + read-pkg-up@7.0.1: + resolution: {integrity: sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==} + engines: {node: '>=8'} - queue-microtask@1.2.3: - resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + read-pkg@5.2.0: + resolution: {integrity: sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==} + engines: {node: '>=8'} + + readable-stream@1.0.34: + resolution: {integrity: sha512-ok1qVCJuRkNmvebYikljxJA/UEsKwLl2nI1OmaqAu4/UE+h0wKCHok4XkL/gvi39OacXvw59RJUOFUkDib2rHg==} + + readable-stream@2.3.8: + resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==} + + readdirp@3.6.0: + resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} + engines: {node: '>=8.10.0'} + + rechoir@0.6.2: + resolution: {integrity: sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==} + engines: {node: '>= 0.10'} + + redent@3.0.0: + resolution: {integrity: sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==} + engines: {node: '>=8'} + + regenerate-unicode-properties@10.2.2: + resolution: {integrity: sha512-m03P+zhBeQd1RGnYxrGyDAPpWX/epKirLrp8e3qevZdVkKtnCrjjWczIbYc8+xd6vcTStVlqfycTx1KR4LOr0g==} + engines: {node: '>=4'} + + regenerate@1.4.2: + resolution: {integrity: sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==} + + regexpu-core@6.4.0: + resolution: {integrity: sha512-0ghuzq67LI9bLXpOX/ISfve/Mq33a4aFRzoQYhnnok1JOFpmE/A2TBGkNVenOGEeSBCjIiWcc6MVOG5HEQv0sA==} + engines: {node: '>=4'} - regenerator-runtime@0.13.11: - resolution: {integrity: sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==} + regjsgen@0.8.0: + resolution: {integrity: sha512-RvwtGe3d7LvWiDQXeQw8p5asZUmfU1G/l6WbUXeHta7Y2PEIvBTwH6E2EfmYUK8pxcxEdEmaomqyp0vZZ7C+3Q==} + + regjsparser@0.13.1: + resolution: {integrity: sha512-dLsljMd9sqwRkby8zhO1gSg3PnJIBFid8f4CQj/sXx+7cKx+E7u0PKhZ+U4wmhx7EfmtvnA318oVaIkAB1lRJw==} + hasBin: true require-directory@2.1.1: resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} engines: {node: '>=0.10.0'} - require-in-the-middle@7.5.2: - resolution: {integrity: sha512-gAZ+kLqBdHarXB64XpAe2VCjB7rIRv+mU8tfRWziHRJ5umKsIHN2tLLv6EtMw7WCdP19S0ERVMldNvxYCHnhSQ==} - engines: {node: '>=8.6.0'} + require-from-string@2.0.2: + resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} + engines: {node: '>=0.10.0'} - resolve@1.22.8: - resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==} + require-main-filename@2.0.0: + resolution: {integrity: sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==} + + resolve-alpn@1.2.1: + resolution: {integrity: sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==} + + resolve-cwd@3.0.0: + resolution: {integrity: sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==} + engines: {node: '>=8'} + + resolve-from@4.0.0: + resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} + engines: {node: '>=4'} + + resolve-from@5.0.0: + resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} + engines: {node: '>=8'} + + resolve@1.22.12: + resolution: {integrity: sha512-TyeJ1zif53BPfHootBGwPRYT1RUt6oGWsaQr8UyZW/eAm9bKoijtvruSDEmZHm92CwS9nj7/fWttqPCgzep8CA==} + engines: {node: '>= 0.4'} hasBin: true - reusify@1.0.4: - resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} - engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + responselike@2.0.1: + resolution: {integrity: sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw==} - rollup-plugin-dts@6.1.1: - resolution: {integrity: sha512-aSHRcJ6KG2IHIioYlvAOcEq6U99sVtqDDKVhnwt70rW6tsz3tv5OSjEiWcgzfsHdLyGXZ/3b/7b/+Za3Y6r1XA==} - engines: {node: '>=16'} - peerDependencies: - rollup: ^3.29.4 || ^4 - typescript: ^4.5 || ^5.0 + reusify@1.1.0: + resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==} + engines: {iojs: '>=1.0.0', node: '>=0.10.0'} - rollup@3.29.5: - resolution: {integrity: sha512-GVsDdsbJzzy4S/v3dqWPJ7EfvZJfCHiDqe80IyrF59LYuP+e6U1LJoUqeuqRbwAWoMNoXivMNeNAOf5E22VA1w==} - engines: {node: '>=14.18.0', npm: '>=8.0.0'} + rimraf@3.0.2: + resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} + deprecated: Rimraf versions prior to v4 are no longer supported hasBin: true run-parallel@1.2.0: resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} - scule@1.3.0: - resolution: {integrity: sha512-6FtHJEvt+pVMIB9IBY+IcCJ6Z5f1iQnytgyfKMhDKgmzYG+TeH/wx1y3l27rshSbLiSanrR9ffZDrEsmjlQF2g==} + safe-buffer@5.1.2: + resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} + + semver@5.7.2: + resolution: {integrity: sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==} + hasBin: true semver@6.3.1: resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} hasBin: true - semver@7.6.3: - resolution: {integrity: sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==} + semver@7.7.3: + resolution: {integrity: sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==} + engines: {node: '>=10'} + hasBin: true + + semver@7.7.4: + resolution: {integrity: sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==} engines: {node: '>=10'} hasBin: true - shimmer@1.2.1: - resolution: {integrity: sha512-sQTKC1Re/rM6XyFM6fIAGHRPVGvyXfgzIDvzoq608vM+jeyVD0Tu1E6Np0Kc2zAIFWIj963V2800iF/9LPieQw==} + send@1.2.1: + resolution: {integrity: sha512-1gnZf7DFcoIcajTjTwjwuDjzuz4PPcY2StKPlsGAQ1+YH20IRVrBaXSWmdjowTJ6u8Rc01PoYOGHXfP1mYcZNQ==} + engines: {node: '>= 18'} - slash@4.0.0: - resolution: {integrity: sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==} - engines: {node: '>=12'} + serialize-error@7.0.1: + resolution: {integrity: sha512-8I8TjW5KMOKsZQTvoxjuSIa7foAwPWGOts+6o7sgjz41/qMD9VQHEDxi6PBvK2l0MXUmqZyNpUK+T2tQaaElvw==} + engines: {node: '>=10'} - source-map-js@1.2.1: - resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} - engines: {node: '>=0.10.0'} + serve-static@2.2.1: + resolution: {integrity: sha512-xRXBn0pPqQTVQiC8wyQrKs2MOlX24zQ0POGaj0kultvoOCstBQM5yvOhAVSUwOMjQtTvsPWoNCHfPGwaaQJhTw==} + engines: {node: '>= 18'} - source-map@0.7.4: - resolution: {integrity: sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==} - engines: {node: '>= 8'} + set-blocking@2.0.0: + resolution: {integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==} - string-width@4.2.3: - resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} - engines: {node: '>=8'} + setprototypeof@1.2.0: + resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} - strip-ansi@6.0.1: - resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + shebang-command@2.0.0: + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} engines: {node: '>=8'} - stylehacks@7.0.4: - resolution: {integrity: sha512-i4zfNrGMt9SB4xRK9L83rlsFCgdGANfeDAYacO1pkqcE7cRHPdWHwnKZVz7WY17Veq/FvyYsRAU++Ga+qDFIww==} - engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} - peerDependencies: - postcss: ^8.4.31 + shebang-regex@3.0.0: + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} + engines: {node: '>=8'} - supports-color@5.5.0: - resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} + shelljs@0.8.5: + resolution: {integrity: sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==} engines: {node: '>=4'} + hasBin: true + + signal-exit@4.1.0: + resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} + engines: {node: '>=14'} + + simple-git@3.36.0: + resolution: {integrity: sha512-cGQjLjK8bxJw4QuYT7gxHw3/IouVESbhahSsHrX97MzCL1gu2u7oy38W6L2ZIGECEfIBG4BabsWDPjBxJENv9Q==} + + slash@2.0.0: + resolution: {integrity: sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==} + engines: {node: '>=6'} + + slash@5.1.0: + resolution: {integrity: sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg==} + engines: {node: '>=14.16'} + + slice-ansi@4.0.0: + resolution: {integrity: sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==} + engines: {node: '>=10'} + + slice-ansi@9.0.0: + resolution: {integrity: sha512-SO/3iYL5S3W57LLEniscOGPZgOqZUPCx6d3dB+52B80yJ0XstzsC/eV8gnA4tM3MHDrKz+OCFSLNjswdSC+/bA==} + engines: {node: '>=22'} + + smart-buffer@4.2.0: + resolution: {integrity: sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==} + engines: {node: '>= 6.0.0', npm: '>= 3.0.0'} + + socks-proxy-agent@8.0.5: + resolution: {integrity: sha512-HehCEsotFqbPW9sJ8WVYB6UbmIMv7kUUORIF2Nncq4VQvBfNBLibW9YZR5dlYCSUhwcD628pRllm7n+E+YTzJw==} + engines: {node: '>= 14'} + + socks@2.8.7: + resolution: {integrity: sha512-HLpt+uLy/pxB+bum/9DzAgiKS8CX1EvbWxI4zlmgGCExImLdiad2iCwXT5Z4c9c3Eq8rP2318mPW2c+QbtjK8A==} + engines: {node: '>= 10.0.0', npm: '>= 3.0.0'} + + source-map@0.6.1: + resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} + engines: {node: '>=0.10.0'} + + spdx-correct@3.2.0: + resolution: {integrity: sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==} + + spdx-exceptions@2.5.0: + resolution: {integrity: sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==} + + spdx-expression-parse@3.0.1: + resolution: {integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==} + + spdx-license-ids@3.0.22: + resolution: {integrity: sha512-4PRT4nh1EImPbt2jASOKHX7PB7I+e4IWNLvkKFDxNhJlfjbYlleYQh285Z/3mPTHSAK/AvdMmw5BNNuYH8ShgQ==} + + sprintf-js@1.0.3: + resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} + + stack-utils@2.0.6: + resolution: {integrity: sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==} + engines: {node: '>=10'} + + statuses@2.0.2: + resolution: {integrity: sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==} + engines: {node: '>= 0.8'} + + streamx@2.23.0: + resolution: {integrity: sha512-kn+e44esVfn2Fa/O0CPFcex27fjIL6MkVae0Mm6q+E6f0hWv578YCERbv+4m02cjxvDsPKLnmxral/rR6lBMAg==} + + string-width@4.2.3: + resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} + engines: {node: '>=8'} + + string-width@7.2.0: + resolution: {integrity: sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==} + engines: {node: '>=18'} + + string-width@8.2.1: + resolution: {integrity: sha512-IIaP0g3iy9Cyy18w3M9YcaDudujEAVHKt3a3QJg1+sr/oX96TbaGUubG0hJyCjCBThFH+tFpcIyoUHUn1ogaLA==} + engines: {node: '>=20'} + + string_decoder@0.10.31: + resolution: {integrity: sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==} + + string_decoder@1.1.1: + resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} + + strip-ansi@6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} + + strip-ansi@7.1.2: + resolution: {integrity: sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==} + engines: {node: '>=12'} + + strip-indent@3.0.0: + resolution: {integrity: sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==} + engines: {node: '>=8'} + + supertap@3.0.1: + resolution: {integrity: sha512-u1ZpIBCawJnO+0QePsEiOknOfCRq0yERxiAchT0i4li0WHNUJbf0evXXSXOcCAR4M8iMDoajXYmstm/qO81Isw==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + supports-color@5.5.0: + resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} + engines: {node: '>=4'} + + supports-color@7.2.0: + resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} + engines: {node: '>=8'} supports-preserve-symlinks-flag@1.0.0: resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} engines: {node: '>= 0.4'} - svgo@3.3.2: - resolution: {integrity: sha512-OoohrmuUlBs8B8o6MB2Aevn+pRIH9zDALSR+6hhqVfa6fRwG/Qw9VUMSMW9VNg2CFc/MTIfabtdOVl9ODIJjpw==} - engines: {node: '>=14.0.0'} - hasBin: true + table@6.9.0: + resolution: {integrity: sha512-9kY+CygyYM6j02t5YFHbNz2FN5QmYGv9zAjVp4lCDjlCw7amdckXlEt/bjMhUIfj4ThGRE4gCUH5+yGnNuPo5A==} + engines: {node: '>=10.0.0'} + + tar-fs@3.1.2: + resolution: {integrity: sha512-QGxxTxxyleAdyM3kpFs14ymbYmNFrfY+pHj7Z8FgtbZ7w2//VAgLMac7sT6nRpIHjppXO2AwwEOg0bPFVRcmXw==} + + tar-stream@3.1.7: + resolution: {integrity: sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ==} + + tar@7.5.13: + resolution: {integrity: sha512-tOG/7GyXpFevhXVh8jOPJrmtRpOTsYqUIkVdVooZYJS/z8WhfQUX8RJILmeuJNinGAMSu1veBr4asSHFt5/hng==} + engines: {node: '>=18'} + + temp-dir@3.0.0: + resolution: {integrity: sha512-nHc6S/bwIilKHNRgK/3jlhDoIHcp45YgyiwcAk46Tr0LfEqGBVpmiAyuiuxeVE44m3mXnEeVhaipLOEWmH+Njw==} + engines: {node: '>=14.16'} - to-fast-properties@2.0.0: - resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==} + text-decoder@1.2.3: + resolution: {integrity: sha512-3/o9z3X0X0fTupwsYvR03pJ/DjWuqqrfwBgTQzdWDiQSm9KitAyz/9WqsT2JQW7KV2m+bC2ol/zqpW37NHxLaA==} + + through2@2.0.5: + resolution: {integrity: sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==} + + time-zone@1.0.0: + resolution: {integrity: sha512-TIsDdtKo6+XrPtiTm1ssmMngN1sAhyKnTO2kunQWqNPWIVvCm15Wmw4SWInwTVgJ5u/Tr04+8Ei9TNcw4x4ONA==} engines: {node: '>=4'} to-regex-range@5.0.1: resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} engines: {node: '>=8.0'} - tslib@2.7.0: - resolution: {integrity: sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA==} + toidentifier@1.0.1: + resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} + engines: {node: '>=0.6'} - typescript@5.6.2: - resolution: {integrity: sha512-NW8ByodCSNCwZeghjN3o+JX5OFH0Ojg6sadjEKY4huZ52TqbJTJnDo5+Tw98lSy63NZvi4n+ez5m2u5d4PkZyw==} - engines: {node: '>=14.17'} - hasBin: true + tr46@0.0.3: + resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} - ufo@1.5.4: - resolution: {integrity: sha512-UsUk3byDzKd04EyoZ7U4DOlxQaD14JUKQl6/P7wiX4FNvUfm3XL246n9W5AmqwW5RSFJ27NAuM0iLscAOYUiGQ==} + trim-newlines@3.0.1: + resolution: {integrity: sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==} + engines: {node: '>=8'} - unbuild@2.0.0: - resolution: {integrity: sha512-JWCUYx3Oxdzvw2J9kTAp+DKE8df/BnH/JTSj6JyA4SH40ECdFu7FoJJcrm8G92B7TjofQ6GZGjJs50TRxoH6Wg==} - hasBin: true - peerDependencies: - typescript: ^5.1.6 - peerDependenciesMeta: - typescript: - optional: true + tslib@2.8.1: + resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} + + type-fest@0.13.1: + resolution: {integrity: sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==} + engines: {node: '>=10'} + + type-fest@0.18.1: + resolution: {integrity: sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==} + engines: {node: '>=10'} + + type-fest@0.6.0: + resolution: {integrity: sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==} + engines: {node: '>=8'} + + type-fest@0.8.1: + resolution: {integrity: sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==} + engines: {node: '>=8'} + + typed-query-selector@2.12.1: + resolution: {integrity: sha512-uzR+FzI8qrUEIu96oaeBJmd9E7CFEiQ3goA5qCVgc4s5llSubcfGHq9yUstZx/k4s9dXHVKsE35YWoFyvEqEHA==} - undici-types@6.19.8: - resolution: {integrity: sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==} + typescript-compiler@1.4.1-2: + resolution: {integrity: sha512-EMopKmoAEJqA4XXRFGOb7eSBhmQMbBahW6P1Koayeatp0b4AW2q/bBqYWkpG7QVQc9HGQUiS4trx2ZHcnAaZUg==} - untyped@1.5.0: - resolution: {integrity: sha512-o2Vjmn2dal08BzCcINxSmWuAteReUUiXseii5VRhmxyLF0b21K0iKZQ9fMYK7RWspVkY+0saqaVQNq4roe3Efg==} + typescript@4.4.4: + resolution: {integrity: sha512-DqGhF5IKoBl8WNf8C1gu8q0xZSInh9j1kJJMqT3a94w1JzVaBU4EXOSMrz9yDqMT0xt3selp83fuFMQ0uzv6qA==} + engines: {node: '>=4.2.0'} hasBin: true - update-browserslist-db@1.1.1: - resolution: {integrity: sha512-R8UzCaa9Az+38REPiJ1tXlImTJXlVfgHZsglwBD/k6nj76ctsH1E3q4doGrukiLQd3sGQYu56r5+lo5r94l29A==} + undici-types@7.16.0: + resolution: {integrity: sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==} + + unicode-canonical-property-names-ecmascript@2.0.1: + resolution: {integrity: sha512-dA8WbNeb2a6oQzAQ55YlT5vQAWGV9WXOsi3SskE3bcCdM0P4SDd+24zS/OCacdRq5BkdsRj9q3Pg6YyQoxIGqg==} + engines: {node: '>=4'} + + unicode-match-property-ecmascript@2.0.0: + resolution: {integrity: sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==} + engines: {node: '>=4'} + + unicode-match-property-value-ecmascript@2.2.1: + resolution: {integrity: sha512-JQ84qTuMg4nVkx8ga4A16a1epI9H6uTXAknqxkGF/aFfRLw1xC/Bp24HNLaZhHSkWd3+84t8iXnp1J0kYcZHhg==} + engines: {node: '>=4'} + + unicode-property-aliases-ecmascript@2.2.0: + resolution: {integrity: sha512-hpbDzxUY9BFwX+UeBnxv3Sh1q7HFxj48DTmXchNgRa46lO8uj3/1iEn3MiNUYTg1g9ctIqXCCERn8gYZhHC5lQ==} + engines: {node: '>=4'} + + unicorn-magic@0.3.0: + resolution: {integrity: sha512-+QBBXBCvifc56fsbuxZQ6Sic3wqqc3WWaqxs58gvJrcOuN83HGTCwz3oS5phzU9LthRNE9VrJCFCLUgHeeFnfA==} + engines: {node: '>=18'} + + unicorn-magic@0.4.0: + resolution: {integrity: sha512-wH590V9VNgYH9g3lH9wWjTrUoKsjLF6sGLjhR4sH1LWpLmCOH0Zf7PukhDA8BiS7KHe4oPNkcTHqYkj7SOGUOw==} + engines: {node: '>=20'} + + universal-user-agent@6.0.1: + resolution: {integrity: sha512-yCzhz6FN2wU1NiiQRogkTQszlQSlpWaw8SvVegAc+bDxbzHgh1vX8uIe8OYyMH6DwH+sdTJsgMl36+mSMdRJIQ==} + + universal-user-agent@7.0.3: + resolution: {integrity: sha512-TmnEAEAsBJVZM/AADELsK76llnwcf9vMKuPz8JflO1frO8Lchitr0fNaN9d+Ap0BjKtqWqd/J17qeDnXh8CL2A==} + + universalify@0.1.2: + resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==} + engines: {node: '>= 4.0.0'} + + untildify@4.0.0: + resolution: {integrity: sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==} + engines: {node: '>=8'} + + update-browserslist-db@1.2.3: + resolution: {integrity: sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==} hasBin: true peerDependencies: browserslist: '>= 4.21.0' @@ -1546,1524 +2460,2672 @@ packages: util-deprecate@1.0.2: resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + validate-npm-package-license@3.0.4: + resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==} + + webdriver-bidi-protocol@0.4.1: + resolution: {integrity: sha512-ARrjNjtWRRs2w4Tk7nqrf2gBI0QXWuOmMCx2hU+1jUt6d00MjMxURrhxhGbrsoiZKJrhTSTzbIrc554iKI10qw==} + + webidl-conversions@3.0.1: + resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} + + well-known-symbols@2.0.0: + resolution: {integrity: sha512-ZMjC3ho+KXo0BfJb7JgtQ5IBuvnShdlACNkKkdsqBmYw3bPAaJfPeYUo6tLUaT5tG/Gkh7xkpBhKRQ9e7pyg9Q==} + engines: {node: '>=6'} + + whatwg-url@5.0.0: + resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} + + which-module@2.0.1: + resolution: {integrity: sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==} + + which@2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true + + wrap-ansi@6.2.0: + resolution: {integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==} + engines: {node: '>=8'} + wrap-ansi@7.0.0: resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} engines: {node: '>=10'} + wrap-ansi@9.0.2: + resolution: {integrity: sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww==} + engines: {node: '>=18'} + wrappy@1.0.2: resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + write-file-atomic@7.0.1: + resolution: {integrity: sha512-OTIk8iR8/aCRWBqvxrzxR0hgxWpnYBblY1S5hDWBQfk/VFmJwzmJgQFN3WsoUKHISv2eAwe+PpbUzyL1CKTLXg==} + engines: {node: ^20.17.0 || >=22.9.0} + + ws@8.17.1: + resolution: {integrity: sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==} + engines: {node: '>=10.0.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: '>=5.0.2' + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + x-img-diff-js@0.3.5: resolution: {integrity: sha512-B97ztoc2JeM+62HH1zFhmTyilsVqL486WMm8X3oQz16lTCGITY1cz+H57mTsNG0QuyVxv1yGq06qC8wy6UPCmQ==} - y18n@5.0.8: - resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} - engines: {node: '>=10'} + xmlbuilder2@4.0.3: + resolution: {integrity: sha512-bx8Q1STctnNaaDymWnkfQLKofs0mGNN7rLLapJlGuV3VlvegD7Ls4ggMjE3aUSWItCCzU0PEv45lI87iSigiCA==} + engines: {node: '>=20.0'} + + xtend@4.0.2: + resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==} + engines: {node: '>=0.4'} + + y18n@5.0.8: + resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} + engines: {node: '>=10'} + + yallist@3.1.1: + resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} + + yallist@4.0.0: + resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} + + yallist@5.0.0: + resolution: {integrity: sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==} + engines: {node: '>=18'} + + yargs-parser@21.1.1: + resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} + engines: {node: '>=12'} + + yargs@15.4.1: + resolution: {integrity: sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==} + engines: {node: '>=8'} + + yargs@16.2.0: + resolution: {integrity: sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==} + engines: {node: '>=10'} + + yargs@17.7.2: + resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} + engines: {node: '>=12'} + + yargs@18.0.0: + resolution: {integrity: sha512-4UEqdc2RYGHZc7Doyqkrqiln3p9X2DZVxaGbwhn2pi7MrRagKaOcIKe8L3OxYcbhXLgLFUS3zAYuQjKBQgmuNg==} + engines: {node: ^20.19.0 || ^22.12.0 || >=23} + + yauzl@2.10.0: + resolution: {integrity: sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==} + + zod@3.25.76: + resolution: {integrity: sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==} + +snapshots: + + '@babel/cli@7.28.6(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 + '@jridgewell/trace-mapping': 0.3.31 + commander: 6.2.1 + convert-source-map: 2.0.0 + fs-readdir-recursive: 1.1.0 + glob: 7.2.3 + make-dir: 2.1.0 + slash: 2.0.0 + optionalDependencies: + '@nicolo-ribaudo/chokidar-2': 2.1.8-no-fsevents.3 + chokidar: 3.6.0 + + '@babel/code-frame@7.29.0': + dependencies: + '@babel/helper-validator-identifier': 7.28.5 + js-tokens: 4.0.0 + picocolors: 1.1.1 + + '@babel/compat-data@7.29.3': {} + + '@babel/core@7.29.0': + dependencies: + '@babel/code-frame': 7.29.0 + '@babel/generator': 7.29.0 + '@babel/helper-compilation-targets': 7.28.6 + '@babel/helper-module-transforms': 7.28.6(@babel/core@7.29.0) + '@babel/helpers': 7.28.6 + '@babel/parser': 7.29.0 + '@babel/template': 7.28.6 + '@babel/traverse': 7.29.0 + '@babel/types': 7.29.0 + '@jridgewell/remapping': 2.3.5 + convert-source-map: 2.0.0 + debug: 4.4.3 + gensync: 1.0.0-beta.2 + json5: 2.2.3 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + + '@babel/generator@7.29.0': + dependencies: + '@babel/parser': 7.29.0 + '@babel/types': 7.29.0 + '@jridgewell/gen-mapping': 0.3.13 + '@jridgewell/trace-mapping': 0.3.31 + jsesc: 3.1.0 + + '@babel/helper-annotate-as-pure@7.27.3': + dependencies: + '@babel/types': 7.29.0 + + '@babel/helper-compilation-targets@7.28.6': + dependencies: + '@babel/compat-data': 7.29.3 + '@babel/helper-validator-option': 7.27.1 + browserslist: 4.28.2 + lru-cache: 5.1.1 + semver: 6.3.1 + + '@babel/helper-create-class-features-plugin@7.29.3(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-annotate-as-pure': 7.27.3 + '@babel/helper-member-expression-to-functions': 7.28.5 + '@babel/helper-optimise-call-expression': 7.27.1 + '@babel/helper-replace-supers': 7.28.6(@babel/core@7.29.0) + '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 + '@babel/traverse': 7.29.0 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + + '@babel/helper-create-regexp-features-plugin@7.28.5(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-annotate-as-pure': 7.27.3 + regexpu-core: 6.4.0 + semver: 6.3.1 + + '@babel/helper-define-polyfill-provider@0.6.8(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-compilation-targets': 7.28.6 + '@babel/helper-plugin-utils': 7.28.6 + debug: 4.4.3 + lodash.debounce: 4.0.8 + resolve: 1.22.12 + transitivePeerDependencies: + - supports-color + + '@babel/helper-globals@7.28.0': {} + + '@babel/helper-member-expression-to-functions@7.28.5': + dependencies: + '@babel/traverse': 7.29.0 + '@babel/types': 7.29.0 + transitivePeerDependencies: + - supports-color + + '@babel/helper-module-imports@7.28.6': + dependencies: + '@babel/traverse': 7.29.0 + '@babel/types': 7.29.0 + transitivePeerDependencies: + - supports-color + + '@babel/helper-module-transforms@7.28.6(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-module-imports': 7.28.6 + '@babel/helper-validator-identifier': 7.28.5 + '@babel/traverse': 7.29.0 + transitivePeerDependencies: + - supports-color + + '@babel/helper-optimise-call-expression@7.27.1': + dependencies: + '@babel/types': 7.29.0 + + '@babel/helper-plugin-utils@7.27.1': {} + + '@babel/helper-plugin-utils@7.28.6': {} + + '@babel/helper-remap-async-to-generator@7.27.1(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-annotate-as-pure': 7.27.3 + '@babel/helper-wrap-function': 7.28.6 + '@babel/traverse': 7.29.0 + transitivePeerDependencies: + - supports-color + + '@babel/helper-replace-supers@7.28.6(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-member-expression-to-functions': 7.28.5 + '@babel/helper-optimise-call-expression': 7.27.1 + '@babel/traverse': 7.29.0 + transitivePeerDependencies: + - supports-color + + '@babel/helper-skip-transparent-expression-wrappers@7.27.1': + dependencies: + '@babel/traverse': 7.29.0 + '@babel/types': 7.29.0 + transitivePeerDependencies: + - supports-color + + '@babel/helper-string-parser@7.27.1': {} + + '@babel/helper-validator-identifier@7.28.5': {} + + '@babel/helper-validator-option@7.27.1': {} + + '@babel/helper-wrap-function@7.28.6': + dependencies: + '@babel/template': 7.28.6 + '@babel/traverse': 7.29.0 + '@babel/types': 7.29.0 + transitivePeerDependencies: + - supports-color + + '@babel/helpers@7.28.6': + dependencies: + '@babel/template': 7.28.6 + '@babel/types': 7.29.0 + + '@babel/highlight@7.25.9': + dependencies: + '@babel/helper-validator-identifier': 7.28.5 + chalk: 2.4.2 + js-tokens: 4.0.0 + picocolors: 1.1.1 + + '@babel/parser@7.29.0': + dependencies: + '@babel/types': 7.29.0 + + '@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.28.5(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-plugin-utils': 7.28.6 + '@babel/traverse': 7.29.0 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-bugfix-safari-class-field-initializer-scope@7.27.1(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-plugin-utils': 7.28.6 + + '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.27.1(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-plugin-utils': 7.28.6 + + '@babel/plugin-bugfix-safari-rest-destructuring-rhs-array@7.29.3(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-plugin-utils': 7.28.6 + '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.27.1(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-plugin-utils': 7.28.6 + '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 + '@babel/plugin-transform-optional-chaining': 7.28.6(@babel/core@7.29.0) + transitivePeerDependencies: + - supports-color + + '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.28.6(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-plugin-utils': 7.28.6 + '@babel/traverse': 7.29.0 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 + + '@babel/plugin-syntax-flow@7.27.1(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-syntax-import-assertions@7.28.6(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-plugin-utils': 7.28.6 + + '@babel/plugin-syntax-import-attributes@7.28.6(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-plugin-utils': 7.28.6 + + '@babel/plugin-syntax-unicode-sets-regex@7.18.6(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-create-regexp-features-plugin': 7.28.5(@babel/core@7.29.0) + '@babel/helper-plugin-utils': 7.28.6 + + '@babel/plugin-transform-arrow-functions@7.27.1(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-plugin-utils': 7.28.6 + + '@babel/plugin-transform-async-generator-functions@7.29.0(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-plugin-utils': 7.28.6 + '@babel/helper-remap-async-to-generator': 7.27.1(@babel/core@7.29.0) + '@babel/traverse': 7.29.0 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-async-to-generator@7.28.6(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-module-imports': 7.28.6 + '@babel/helper-plugin-utils': 7.28.6 + '@babel/helper-remap-async-to-generator': 7.27.1(@babel/core@7.29.0) + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-block-scoped-functions@7.27.1(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-plugin-utils': 7.28.6 + + '@babel/plugin-transform-block-scoping@7.28.6(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-plugin-utils': 7.28.6 + + '@babel/plugin-transform-class-properties@7.28.6(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-create-class-features-plugin': 7.29.3(@babel/core@7.29.0) + '@babel/helper-plugin-utils': 7.28.6 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-class-static-block@7.28.6(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-create-class-features-plugin': 7.29.3(@babel/core@7.29.0) + '@babel/helper-plugin-utils': 7.28.6 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-classes@7.28.6(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-annotate-as-pure': 7.27.3 + '@babel/helper-compilation-targets': 7.28.6 + '@babel/helper-globals': 7.28.0 + '@babel/helper-plugin-utils': 7.28.6 + '@babel/helper-replace-supers': 7.28.6(@babel/core@7.29.0) + '@babel/traverse': 7.29.0 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-computed-properties@7.28.6(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-plugin-utils': 7.28.6 + '@babel/template': 7.28.6 + + '@babel/plugin-transform-destructuring@7.28.5(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-plugin-utils': 7.28.6 + '@babel/traverse': 7.29.0 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-dotall-regex@7.28.6(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-create-regexp-features-plugin': 7.28.5(@babel/core@7.29.0) + '@babel/helper-plugin-utils': 7.28.6 + + '@babel/plugin-transform-duplicate-keys@7.27.1(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-plugin-utils': 7.28.6 + + '@babel/plugin-transform-duplicate-named-capturing-groups-regex@7.29.0(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-create-regexp-features-plugin': 7.28.5(@babel/core@7.29.0) + '@babel/helper-plugin-utils': 7.28.6 + + '@babel/plugin-transform-dynamic-import@7.27.1(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-plugin-utils': 7.28.6 + + '@babel/plugin-transform-explicit-resource-management@7.28.6(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-plugin-utils': 7.28.6 + '@babel/plugin-transform-destructuring': 7.28.5(@babel/core@7.29.0) + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-exponentiation-operator@7.28.6(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-plugin-utils': 7.28.6 + + '@babel/plugin-transform-export-namespace-from@7.27.1(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-plugin-utils': 7.28.6 + + '@babel/plugin-transform-flow-strip-types@7.27.1(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/plugin-syntax-flow': 7.27.1(@babel/core@7.29.0) + + '@babel/plugin-transform-for-of@7.27.1(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-plugin-utils': 7.28.6 + '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-function-name@7.27.1(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-compilation-targets': 7.28.6 + '@babel/helper-plugin-utils': 7.28.6 + '@babel/traverse': 7.29.0 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-json-strings@7.28.6(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-plugin-utils': 7.28.6 + + '@babel/plugin-transform-literals@7.27.1(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-plugin-utils': 7.28.6 + + '@babel/plugin-transform-logical-assignment-operators@7.28.6(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-plugin-utils': 7.28.6 + + '@babel/plugin-transform-member-expression-literals@7.27.1(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-plugin-utils': 7.28.6 + + '@babel/plugin-transform-modules-amd@7.27.1(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-module-transforms': 7.28.6(@babel/core@7.29.0) + '@babel/helper-plugin-utils': 7.28.6 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-modules-commonjs@7.28.6(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-module-transforms': 7.28.6(@babel/core@7.29.0) + '@babel/helper-plugin-utils': 7.28.6 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-modules-systemjs@7.29.0(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-module-transforms': 7.28.6(@babel/core@7.29.0) + '@babel/helper-plugin-utils': 7.28.6 + '@babel/helper-validator-identifier': 7.28.5 + '@babel/traverse': 7.29.0 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-modules-umd@7.27.1(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-module-transforms': 7.28.6(@babel/core@7.29.0) + '@babel/helper-plugin-utils': 7.28.6 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-named-capturing-groups-regex@7.29.0(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-create-regexp-features-plugin': 7.28.5(@babel/core@7.29.0) + '@babel/helper-plugin-utils': 7.28.6 + + '@babel/plugin-transform-new-target@7.27.1(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-plugin-utils': 7.28.6 + + '@babel/plugin-transform-nullish-coalescing-operator@7.28.6(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-plugin-utils': 7.28.6 + + '@babel/plugin-transform-numeric-separator@7.28.6(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-plugin-utils': 7.28.6 + + '@babel/plugin-transform-object-rest-spread@7.28.6(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-compilation-targets': 7.28.6 + '@babel/helper-plugin-utils': 7.28.6 + '@babel/plugin-transform-destructuring': 7.28.5(@babel/core@7.29.0) + '@babel/plugin-transform-parameters': 7.27.7(@babel/core@7.29.0) + '@babel/traverse': 7.29.0 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-object-super@7.27.1(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-plugin-utils': 7.28.6 + '@babel/helper-replace-supers': 7.28.6(@babel/core@7.29.0) + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-optional-catch-binding@7.28.6(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-plugin-utils': 7.28.6 + + '@babel/plugin-transform-optional-chaining@7.28.6(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-plugin-utils': 7.28.6 + '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-parameters@7.27.7(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-plugin-utils': 7.28.6 + + '@babel/plugin-transform-private-methods@7.28.6(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-create-class-features-plugin': 7.29.3(@babel/core@7.29.0) + '@babel/helper-plugin-utils': 7.28.6 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-private-property-in-object@7.28.6(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-annotate-as-pure': 7.27.3 + '@babel/helper-create-class-features-plugin': 7.29.3(@babel/core@7.29.0) + '@babel/helper-plugin-utils': 7.28.6 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-property-literals@7.27.1(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-plugin-utils': 7.28.6 + + '@babel/plugin-transform-regenerator@7.29.0(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-plugin-utils': 7.28.6 + + '@babel/plugin-transform-regexp-modifiers@7.28.6(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-create-regexp-features-plugin': 7.28.5(@babel/core@7.29.0) + '@babel/helper-plugin-utils': 7.28.6 + + '@babel/plugin-transform-reserved-words@7.27.1(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-plugin-utils': 7.28.6 + + '@babel/plugin-transform-shorthand-properties@7.27.1(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-plugin-utils': 7.28.6 + + '@babel/plugin-transform-spread@7.28.6(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-plugin-utils': 7.28.6 + '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-sticky-regex@7.27.1(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-plugin-utils': 7.28.6 + + '@babel/plugin-transform-template-literals@7.27.1(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-plugin-utils': 7.28.6 + + '@babel/plugin-transform-typeof-symbol@7.27.1(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-plugin-utils': 7.28.6 + + '@babel/plugin-transform-unicode-escapes@7.27.1(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-plugin-utils': 7.28.6 + + '@babel/plugin-transform-unicode-property-regex@7.28.6(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-create-regexp-features-plugin': 7.28.5(@babel/core@7.29.0) + '@babel/helper-plugin-utils': 7.28.6 + + '@babel/plugin-transform-unicode-regex@7.27.1(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-create-regexp-features-plugin': 7.28.5(@babel/core@7.29.0) + '@babel/helper-plugin-utils': 7.28.6 + + '@babel/plugin-transform-unicode-sets-regex@7.28.6(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-create-regexp-features-plugin': 7.28.5(@babel/core@7.29.0) + '@babel/helper-plugin-utils': 7.28.6 + + '@babel/preset-env@7.29.3(@babel/core@7.29.0)': + dependencies: + '@babel/compat-data': 7.29.3 + '@babel/core': 7.29.0 + '@babel/helper-compilation-targets': 7.28.6 + '@babel/helper-plugin-utils': 7.28.6 + '@babel/helper-validator-option': 7.27.1 + '@babel/plugin-bugfix-firefox-class-in-computed-class-key': 7.28.5(@babel/core@7.29.0) + '@babel/plugin-bugfix-safari-class-field-initializer-scope': 7.27.1(@babel/core@7.29.0) + '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.27.1(@babel/core@7.29.0) + '@babel/plugin-bugfix-safari-rest-destructuring-rhs-array': 7.29.3(@babel/core@7.29.0) + '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining': 7.27.1(@babel/core@7.29.0) + '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly': 7.28.6(@babel/core@7.29.0) + '@babel/plugin-proposal-private-property-in-object': 7.21.0-placeholder-for-preset-env.2(@babel/core@7.29.0) + '@babel/plugin-syntax-import-assertions': 7.28.6(@babel/core@7.29.0) + '@babel/plugin-syntax-import-attributes': 7.28.6(@babel/core@7.29.0) + '@babel/plugin-syntax-unicode-sets-regex': 7.18.6(@babel/core@7.29.0) + '@babel/plugin-transform-arrow-functions': 7.27.1(@babel/core@7.29.0) + '@babel/plugin-transform-async-generator-functions': 7.29.0(@babel/core@7.29.0) + '@babel/plugin-transform-async-to-generator': 7.28.6(@babel/core@7.29.0) + '@babel/plugin-transform-block-scoped-functions': 7.27.1(@babel/core@7.29.0) + '@babel/plugin-transform-block-scoping': 7.28.6(@babel/core@7.29.0) + '@babel/plugin-transform-class-properties': 7.28.6(@babel/core@7.29.0) + '@babel/plugin-transform-class-static-block': 7.28.6(@babel/core@7.29.0) + '@babel/plugin-transform-classes': 7.28.6(@babel/core@7.29.0) + '@babel/plugin-transform-computed-properties': 7.28.6(@babel/core@7.29.0) + '@babel/plugin-transform-destructuring': 7.28.5(@babel/core@7.29.0) + '@babel/plugin-transform-dotall-regex': 7.28.6(@babel/core@7.29.0) + '@babel/plugin-transform-duplicate-keys': 7.27.1(@babel/core@7.29.0) + '@babel/plugin-transform-duplicate-named-capturing-groups-regex': 7.29.0(@babel/core@7.29.0) + '@babel/plugin-transform-dynamic-import': 7.27.1(@babel/core@7.29.0) + '@babel/plugin-transform-explicit-resource-management': 7.28.6(@babel/core@7.29.0) + '@babel/plugin-transform-exponentiation-operator': 7.28.6(@babel/core@7.29.0) + '@babel/plugin-transform-export-namespace-from': 7.27.1(@babel/core@7.29.0) + '@babel/plugin-transform-for-of': 7.27.1(@babel/core@7.29.0) + '@babel/plugin-transform-function-name': 7.27.1(@babel/core@7.29.0) + '@babel/plugin-transform-json-strings': 7.28.6(@babel/core@7.29.0) + '@babel/plugin-transform-literals': 7.27.1(@babel/core@7.29.0) + '@babel/plugin-transform-logical-assignment-operators': 7.28.6(@babel/core@7.29.0) + '@babel/plugin-transform-member-expression-literals': 7.27.1(@babel/core@7.29.0) + '@babel/plugin-transform-modules-amd': 7.27.1(@babel/core@7.29.0) + '@babel/plugin-transform-modules-commonjs': 7.28.6(@babel/core@7.29.0) + '@babel/plugin-transform-modules-systemjs': 7.29.0(@babel/core@7.29.0) + '@babel/plugin-transform-modules-umd': 7.27.1(@babel/core@7.29.0) + '@babel/plugin-transform-named-capturing-groups-regex': 7.29.0(@babel/core@7.29.0) + '@babel/plugin-transform-new-target': 7.27.1(@babel/core@7.29.0) + '@babel/plugin-transform-nullish-coalescing-operator': 7.28.6(@babel/core@7.29.0) + '@babel/plugin-transform-numeric-separator': 7.28.6(@babel/core@7.29.0) + '@babel/plugin-transform-object-rest-spread': 7.28.6(@babel/core@7.29.0) + '@babel/plugin-transform-object-super': 7.27.1(@babel/core@7.29.0) + '@babel/plugin-transform-optional-catch-binding': 7.28.6(@babel/core@7.29.0) + '@babel/plugin-transform-optional-chaining': 7.28.6(@babel/core@7.29.0) + '@babel/plugin-transform-parameters': 7.27.7(@babel/core@7.29.0) + '@babel/plugin-transform-private-methods': 7.28.6(@babel/core@7.29.0) + '@babel/plugin-transform-private-property-in-object': 7.28.6(@babel/core@7.29.0) + '@babel/plugin-transform-property-literals': 7.27.1(@babel/core@7.29.0) + '@babel/plugin-transform-regenerator': 7.29.0(@babel/core@7.29.0) + '@babel/plugin-transform-regexp-modifiers': 7.28.6(@babel/core@7.29.0) + '@babel/plugin-transform-reserved-words': 7.27.1(@babel/core@7.29.0) + '@babel/plugin-transform-shorthand-properties': 7.27.1(@babel/core@7.29.0) + '@babel/plugin-transform-spread': 7.28.6(@babel/core@7.29.0) + '@babel/plugin-transform-sticky-regex': 7.27.1(@babel/core@7.29.0) + '@babel/plugin-transform-template-literals': 7.27.1(@babel/core@7.29.0) + '@babel/plugin-transform-typeof-symbol': 7.27.1(@babel/core@7.29.0) + '@babel/plugin-transform-unicode-escapes': 7.27.1(@babel/core@7.29.0) + '@babel/plugin-transform-unicode-property-regex': 7.28.6(@babel/core@7.29.0) + '@babel/plugin-transform-unicode-regex': 7.27.1(@babel/core@7.29.0) + '@babel/plugin-transform-unicode-sets-regex': 7.28.6(@babel/core@7.29.0) + '@babel/preset-modules': 0.1.6-no-external-plugins(@babel/core@7.29.0) + babel-plugin-polyfill-corejs2: 0.4.17(@babel/core@7.29.0) + babel-plugin-polyfill-corejs3: 0.14.2(@babel/core@7.29.0) + babel-plugin-polyfill-regenerator: 0.6.8(@babel/core@7.29.0) + core-js-compat: 3.49.0 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + + '@babel/preset-flow@7.27.1(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-validator-option': 7.27.1 + '@babel/plugin-transform-flow-strip-types': 7.27.1(@babel/core@7.29.0) + + '@babel/preset-modules@0.1.6-no-external-plugins(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-plugin-utils': 7.28.6 + '@babel/types': 7.29.0 + esutils: 2.0.3 + + '@babel/preset-stage-2@7.8.3': {} + + '@babel/template@7.28.6': + dependencies: + '@babel/code-frame': 7.29.0 + '@babel/parser': 7.29.0 + '@babel/types': 7.29.0 + + '@babel/traverse@7.29.0': + dependencies: + '@babel/code-frame': 7.29.0 + '@babel/generator': 7.29.0 + '@babel/helper-globals': 7.28.0 + '@babel/parser': 7.29.0 + '@babel/template': 7.28.6 + '@babel/types': 7.29.0 + debug: 4.4.3 + transitivePeerDependencies: + - supports-color + + '@babel/types@7.29.0': + dependencies: + '@babel/helper-string-parser': 7.27.1 + '@babel/helper-validator-identifier': 7.28.5 + + '@epic-web/invariant@1.0.0': {} + + '@isaacs/fs-minipass@4.0.1': + dependencies: + minipass: 7.1.2 + + '@jridgewell/gen-mapping@0.3.13': + dependencies: + '@jridgewell/sourcemap-codec': 1.5.5 + '@jridgewell/trace-mapping': 0.3.31 + + '@jridgewell/remapping@2.3.5': + dependencies: + '@jridgewell/gen-mapping': 0.3.13 + '@jridgewell/trace-mapping': 0.3.31 + + '@jridgewell/resolve-uri@3.1.2': {} + + '@jridgewell/sourcemap-codec@1.5.5': {} + + '@jridgewell/trace-mapping@0.3.31': + dependencies: + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.5.5 + + '@kwsites/file-exists@1.1.1': + dependencies: + debug: 4.4.3 + transitivePeerDependencies: + - supports-color + + '@kwsites/promise-deferred@1.1.1': {} + + '@mapbox/node-pre-gyp@2.0.3': + dependencies: + consola: 3.4.2 + detect-libc: 2.1.2 + https-proxy-agent: 7.0.6 + node-fetch: 2.7.0 + nopt: 8.1.0 + semver: 7.7.4 + tar: 7.5.13 + transitivePeerDependencies: + - encoding + - supports-color + + '@nicolo-ribaudo/chokidar-2@2.1.8-no-fsevents.3': + optional: true + + '@nodelib/fs.scandir@2.1.5': + dependencies: + '@nodelib/fs.stat': 2.0.5 + run-parallel: 1.2.0 + + '@nodelib/fs.stat@2.0.5': {} + + '@nodelib/fs.walk@1.2.8': + dependencies: + '@nodelib/fs.scandir': 2.1.5 + fastq: 1.19.1 + + '@octokit/auth-token@2.5.0': + dependencies: + '@octokit/types': 6.41.0 + + '@octokit/core@3.6.0': + dependencies: + '@octokit/auth-token': 2.5.0 + '@octokit/graphql': 4.8.0 + '@octokit/request': 10.0.8 + '@octokit/request-error': 7.1.0 + '@octokit/types': 6.41.0 + before-after-hook: 2.2.3 + universal-user-agent: 6.0.1 + + '@octokit/endpoint@11.0.3': + dependencies: + '@octokit/types': 16.0.0 + universal-user-agent: 7.0.3 + + '@octokit/graphql@4.8.0': + dependencies: + '@octokit/request': 10.0.8 + '@octokit/types': 6.41.0 + universal-user-agent: 6.0.1 + + '@octokit/openapi-types@12.11.0': {} + + '@octokit/openapi-types@27.0.0': {} + + '@octokit/plugin-paginate-rest@14.0.0(@octokit/core@3.6.0)': + dependencies: + '@octokit/core': 3.6.0 + '@octokit/types': 16.0.0 + + '@octokit/plugin-request-log@1.0.4(@octokit/core@3.6.0)': + dependencies: + '@octokit/core': 3.6.0 + + '@octokit/plugin-rest-endpoint-methods@5.16.2(@octokit/core@3.6.0)': + dependencies: + '@octokit/core': 3.6.0 + '@octokit/types': 6.41.0 + deprecation: 2.3.1 + + '@octokit/request-error@7.1.0': + dependencies: + '@octokit/types': 16.0.0 + + '@octokit/request@10.0.8': + dependencies: + '@octokit/endpoint': 11.0.3 + '@octokit/request-error': 7.1.0 + '@octokit/types': 16.0.0 + fast-content-type-parse: 3.0.0 + json-with-bigint: 3.5.8 + universal-user-agent: 7.0.3 + + '@octokit/rest@18.12.0': + dependencies: + '@octokit/core': 3.6.0 + '@octokit/plugin-paginate-rest': 14.0.0(@octokit/core@3.6.0) + '@octokit/plugin-request-log': 1.0.4(@octokit/core@3.6.0) + '@octokit/plugin-rest-endpoint-methods': 5.16.2(@octokit/core@3.6.0) + + '@octokit/types@16.0.0': + dependencies: + '@octokit/openapi-types': 27.0.0 + + '@octokit/types@6.41.0': + dependencies: + '@octokit/openapi-types': 12.11.0 + + '@oozcitak/dom@2.0.2': + dependencies: + '@oozcitak/infra': 2.0.2 + '@oozcitak/url': 3.0.0 + '@oozcitak/util': 10.0.0 + + '@oozcitak/infra@2.0.2': + dependencies: + '@oozcitak/util': 10.0.0 + + '@oozcitak/url@3.0.0': + dependencies: + '@oozcitak/infra': 2.0.2 + '@oozcitak/util': 10.0.0 + + '@oozcitak/util@10.0.0': {} + + '@puppeteer/browsers@2.13.0': + dependencies: + debug: 4.4.3 + extract-zip: 2.0.1 + progress: 2.0.3 + proxy-agent: 6.5.0 + semver: 7.7.4 + tar-fs: 3.1.2 + yargs: 17.7.2 + transitivePeerDependencies: + - bare-abort-controller + - bare-buffer + - react-native-b4a + - supports-color + + '@rollup/pluginutils@5.3.0': + dependencies: + '@types/estree': 1.0.8 + estree-walker: 2.0.2 + picomatch: 4.0.4 + + '@simple-git/args-pathspec@1.0.3': {} + + '@simple-git/argv-parser@1.1.1': + dependencies: + '@simple-git/args-pathspec': 1.0.3 + + '@sindresorhus/is@4.6.0': {} + + '@sindresorhus/merge-streams@2.3.0': {} + + '@sindresorhus/merge-streams@4.0.0': {} + + '@szmarczak/http-timer@4.0.6': + dependencies: + defer-to-connect: 2.0.1 + + '@tootallnate/quickjs-emscripten@0.23.0': {} + + '@types/cacheable-request@6.0.3': + dependencies: + '@types/http-cache-semantics': 4.0.4 + '@types/keyv': 3.1.4 + '@types/node': 25.0.3 + '@types/responselike': 1.0.3 + + '@types/estree@1.0.8': {} + + '@types/http-cache-semantics@4.0.4': {} + + '@types/keyv@3.1.4': + dependencies: + '@types/node': 25.0.3 + + '@types/minimist@1.2.5': {} + + '@types/node@25.0.3': + dependencies: + undici-types: 7.16.0 + + '@types/normalize-package-data@2.4.4': {} + + '@types/responselike@1.0.3': + dependencies: + '@types/node': 25.0.3 + + '@types/yauzl@2.10.3': + dependencies: + '@types/node': 25.0.3 + optional: true + + '@vercel/nft@1.5.0': + dependencies: + '@mapbox/node-pre-gyp': 2.0.3 + '@rollup/pluginutils': 5.3.0 + acorn: 8.16.0 + acorn-import-attributes: 1.9.5(acorn@8.16.0) + async-sema: 3.1.1 + bindings: 1.5.0 + estree-walker: 2.0.2 + glob: 13.0.6 + graceful-fs: 4.2.11 + node-gyp-build: 4.8.4 + picomatch: 4.0.4 + resolve-from: 5.0.0 + transitivePeerDependencies: + - encoding + - rollup + - supports-color + + abbrev@3.0.1: {} + + acorn-import-attributes@1.9.5(acorn@8.16.0): + dependencies: + acorn: 8.16.0 + + acorn-walk@8.3.5: + dependencies: + acorn: 8.16.0 + + acorn@8.16.0: {} + + agent-base@7.1.4: {} + + ajv@8.20.0: + dependencies: + fast-deep-equal: 3.1.3 + fast-uri: 3.1.0 + json-schema-traverse: 1.0.0 + require-from-string: 2.0.2 + + ansi-regex@5.0.1: {} + + ansi-styles@3.2.1: + dependencies: + color-convert: 1.9.3 + + ansi-styles@4.3.0: + dependencies: + color-convert: 2.0.1 + + ansi-styles@6.2.3: {} + + anymatch@3.1.3: + dependencies: + normalize-path: 3.0.0 + picomatch: 4.0.4 + optional: true + + argparse@1.0.10: + dependencies: + sprintf-js: 1.0.3 + + argparse@2.0.1: {} + + array-find-index@1.0.2: {} + + arrgv@1.0.2: {} + + arrify@1.0.1: {} + + arrify@3.0.0: {} + + ast-types@0.13.4: + dependencies: + tslib: 2.8.1 + + astral-regex@2.0.0: {} + + async-sema@3.1.1: {} + + ava@8.0.0: + dependencies: + '@vercel/nft': 1.5.0 + acorn: 8.16.0 + acorn-walk: 8.3.5 + ansi-styles: 6.2.3 + arrgv: 1.0.2 + arrify: 3.0.0 + callsites: 4.2.0 + cbor: 10.0.12 + chalk: 5.6.2 + chunkd: 2.0.1 + ci-info: 4.4.0 + ci-parallel-vars: 1.0.1 + cli-truncate: 6.0.0 + code-excerpt: 4.0.0 + common-path-prefix: 3.0.0 + concordance: 5.0.4 + currently-unhandled: 0.4.1 + debug: 4.4.3 + emittery: 2.0.0 + figures: 6.1.0 + globby: 16.2.0 + ignore-by-default: 2.1.0 + indent-string: 5.0.0 + is-plain-object: 5.0.0 + is-promise: 4.0.0 + matcher: 6.0.0 + memoize: 11.0.0 + ms: 2.1.3 + p-map: 7.0.4 + package-config: 5.0.0 + picomatch: 4.0.4 + plur: 6.0.0 + pretty-ms: 9.3.0 + resolve-cwd: 3.0.0 + slash: 5.1.0 + stack-utils: 2.0.6 + supertap: 3.0.1 + temp-dir: 3.0.0 + write-file-atomic: 7.0.1 + yargs: 18.0.0 + transitivePeerDependencies: + - encoding + - rollup + - supports-color + + b4a@1.7.3: {} + + babel-plugin-polyfill-corejs2@0.4.17(@babel/core@7.29.0): + dependencies: + '@babel/compat-data': 7.29.3 + '@babel/core': 7.29.0 + '@babel/helper-define-polyfill-provider': 0.6.8(@babel/core@7.29.0) + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + + babel-plugin-polyfill-corejs3@0.14.2(@babel/core@7.29.0): + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-define-polyfill-provider': 0.6.8(@babel/core@7.29.0) + core-js-compat: 3.49.0 + transitivePeerDependencies: + - supports-color + + babel-plugin-polyfill-regenerator@0.6.8(@babel/core@7.29.0): + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-define-polyfill-provider': 0.6.8(@babel/core@7.29.0) + transitivePeerDependencies: + - supports-color + + balanced-match@4.0.4: {} + + bare-events@2.8.2: {} + + bare-fs@4.5.2: + dependencies: + bare-events: 2.8.2 + bare-path: 3.0.0 + bare-stream: 2.7.0(bare-events@2.8.2) + bare-url: 2.3.2 + fast-fifo: 1.3.2 + transitivePeerDependencies: + - bare-abort-controller + - react-native-b4a + optional: true + + bare-os@3.6.2: + optional: true + + bare-path@3.0.0: + dependencies: + bare-os: 3.6.2 + optional: true + + bare-stream@2.7.0(bare-events@2.8.2): + dependencies: + streamx: 2.23.0 + optionalDependencies: + bare-events: 2.8.2 + transitivePeerDependencies: + - bare-abort-controller + - react-native-b4a + optional: true + + bare-url@2.3.2: + dependencies: + bare-path: 3.0.0 + optional: true + + baseline-browser-mapping@2.10.24: {} + + basic-ftp@6.0.0: {} + + before-after-hook@2.2.3: {} + + binary-extensions@2.3.0: + optional: true + + bindings@1.5.0: + dependencies: + file-uri-to-path: 1.0.0 + + bluebird@3.7.2: {} + + blueimp-md5@2.19.0: {} + + brace-expansion@5.0.5: + dependencies: + balanced-match: 4.0.4 + + braces@3.0.3: + dependencies: + fill-range: 7.1.1 + + browserslist@4.28.2: + dependencies: + baseline-browser-mapping: 2.10.24 + caniuse-lite: 1.0.30001791 + electron-to-chromium: 1.5.346 + node-releases: 2.0.38 + update-browserslist-db: 1.2.3(browserslist@4.28.2) + + buffer-crc32@0.2.13: {} + + cacheable-lookup@5.0.4: {} + + cacheable-request@7.0.4: + dependencies: + clone-response: 1.0.3 + get-stream: 5.2.0 + http-cache-semantics: 4.2.0 + keyv: 4.5.4 + lowercase-keys: 2.0.0 + normalize-url: 6.1.0 + responselike: 2.0.1 + + callsites@3.1.0: {} + + callsites@4.2.0: {} + + camelcase-keys@6.2.2: + dependencies: + camelcase: 5.3.1 + map-obj: 4.3.0 + quick-lru: 4.0.1 + + camelcase@5.3.1: {} + + caniuse-lite@1.0.30001791: {} + + cbor@10.0.12: + dependencies: + nofilter: 3.1.0 + + chalk@2.4.2: + dependencies: + ansi-styles: 3.2.1 + escape-string-regexp: 1.0.5 + supports-color: 5.5.0 + + chalk@4.1.2: + dependencies: + ansi-styles: 4.3.0 + supports-color: 7.2.0 + + chalk@5.6.2: {} + + charenc@0.0.2: {} + + chokidar@3.6.0: + dependencies: + anymatch: 3.1.3 + braces: 3.0.3 + glob-parent: 6.0.2 + is-binary-path: 2.1.0 + is-glob: 4.0.3 + normalize-path: 3.0.0 + readdirp: 3.6.0 + optionalDependencies: + fsevents: 2.3.3 + optional: true + + chownr@3.0.0: {} - yallist@3.1.1: - resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} + chromium-bidi@14.0.0(devtools-protocol@0.0.1595872): + dependencies: + devtools-protocol: 0.0.1595872 + mitt: 3.0.1 + zod: 3.25.76 - yargs-parser@21.1.1: - resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} - engines: {node: '>=12'} + chunkd@2.0.1: {} - yargs@17.7.2: - resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} - engines: {node: '>=12'} + ci-info@4.4.0: {} - yocto-queue@0.1.0: - resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} - engines: {node: '>=10'} + ci-parallel-vars@1.0.1: {} -snapshots: + cli-spinner@0.2.10: {} - '@ampproject/remapping@2.3.0': + cli-truncate@6.0.0: dependencies: - '@jridgewell/gen-mapping': 0.3.5 - '@jridgewell/trace-mapping': 0.3.25 + slice-ansi: 9.0.0 + string-width: 8.2.1 - '@babel/code-frame@7.24.7': + cliui@6.0.0: dependencies: - '@babel/highlight': 7.24.7 - picocolors: 1.1.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 6.2.0 - '@babel/compat-data@7.25.4': {} + cliui@7.0.4: + dependencies: + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 7.0.0 - '@babel/core@7.25.2': + cliui@8.0.1: dependencies: - '@ampproject/remapping': 2.3.0 - '@babel/code-frame': 7.24.7 - '@babel/generator': 7.25.6 - '@babel/helper-compilation-targets': 7.25.2 - '@babel/helper-module-transforms': 7.25.2(@babel/core@7.25.2) - '@babel/helpers': 7.25.6 - '@babel/parser': 7.25.6 - '@babel/template': 7.25.0 - '@babel/traverse': 7.25.6 - '@babel/types': 7.25.6 - convert-source-map: 2.0.0 - debug: 4.3.7 - gensync: 1.0.0-beta.2 - json5: 2.2.3 - semver: 6.3.1 - transitivePeerDependencies: - - supports-color + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 7.0.0 - '@babel/generator@7.25.6': + cliui@9.0.1: dependencies: - '@babel/types': 7.25.6 - '@jridgewell/gen-mapping': 0.3.5 - '@jridgewell/trace-mapping': 0.3.25 - jsesc: 2.5.2 + string-width: 7.2.0 + strip-ansi: 7.1.2 + wrap-ansi: 9.0.2 - '@babel/helper-compilation-targets@7.25.2': + clone-response@1.0.3: dependencies: - '@babel/compat-data': 7.25.4 - '@babel/helper-validator-option': 7.24.8 - browserslist: 4.24.0 - lru-cache: 5.1.1 - semver: 6.3.1 + mimic-response: 1.0.1 - '@babel/helper-module-imports@7.24.7': + code-excerpt@4.0.0: dependencies: - '@babel/traverse': 7.25.6 - '@babel/types': 7.25.6 - transitivePeerDependencies: - - supports-color + convert-to-spaces: 2.0.1 - '@babel/helper-module-transforms@7.25.2(@babel/core@7.25.2)': + color-convert@1.9.3: dependencies: - '@babel/core': 7.25.2 - '@babel/helper-module-imports': 7.24.7 - '@babel/helper-simple-access': 7.24.7 - '@babel/helper-validator-identifier': 7.24.7 - '@babel/traverse': 7.25.6 - transitivePeerDependencies: - - supports-color + color-name: 1.1.3 - '@babel/helper-simple-access@7.24.7': + color-convert@2.0.1: dependencies: - '@babel/traverse': 7.25.6 - '@babel/types': 7.25.6 - transitivePeerDependencies: - - supports-color + color-name: 1.1.4 + + color-name@1.1.3: {} - '@babel/helper-string-parser@7.24.8': {} + color-name@1.1.4: {} + + colors@1.4.0: {} - '@babel/helper-validator-identifier@7.24.7': {} + commander@6.2.1: {} - '@babel/helper-validator-option@7.24.8': {} + common-path-prefix@3.0.0: {} - '@babel/helpers@7.25.6': + concordance@5.0.4: dependencies: - '@babel/template': 7.25.0 - '@babel/types': 7.25.6 + date-time: 3.1.0 + esutils: 2.0.3 + fast-diff: 1.3.0 + js-string-escape: 1.0.1 + lodash: 4.18.1 + md5-hex: 3.0.1 + semver: 7.7.4 + well-known-symbols: 2.0.0 + + consola@3.4.2: {} + + convert-source-map@2.0.0: {} + + convert-to-spaces@2.0.1: {} - '@babel/highlight@7.24.7': + copyfiles@2.4.1: dependencies: - '@babel/helper-validator-identifier': 7.24.7 - chalk: 2.4.2 - js-tokens: 4.0.0 - picocolors: 1.1.0 + glob: 7.2.3 + minimatch: 3.1.5 + mkdirp: 1.0.4 + noms: 0.0.0 + through2: 2.0.5 + untildify: 4.0.0 + yargs: 16.2.0 - '@babel/parser@7.25.6': + core-js-compat@3.49.0: dependencies: - '@babel/types': 7.25.6 + browserslist: 4.28.2 - '@babel/standalone@7.25.6': {} + core-util-is@1.0.3: {} - '@babel/template@7.25.0': + cosmiconfig@9.0.0: dependencies: - '@babel/code-frame': 7.24.7 - '@babel/parser': 7.25.6 - '@babel/types': 7.25.6 + env-paths: 2.2.1 + import-fresh: 3.3.1 + js-yaml: 4.1.1 + parse-json: 5.2.0 - '@babel/traverse@7.25.6': + cross-env@10.1.0: dependencies: - '@babel/code-frame': 7.24.7 - '@babel/generator': 7.25.6 - '@babel/parser': 7.25.6 - '@babel/template': 7.25.0 - '@babel/types': 7.25.6 - debug: 4.3.7 - globals: 11.12.0 - transitivePeerDependencies: - - supports-color + '@epic-web/invariant': 1.0.0 + cross-spawn: 7.0.6 - '@babel/types@7.25.6': + cross-spawn@7.0.6: dependencies: - '@babel/helper-string-parser': 7.24.8 - '@babel/helper-validator-identifier': 7.24.7 - to-fast-properties: 2.0.0 + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 - '@datadog/pprof@5.4.1': + crypt@0.0.2: {} + + currently-unhandled@0.4.1: dependencies: - delay: 5.0.0 - node-gyp-build: 3.9.0 - p-limit: 3.1.0 - pprof-format: 2.1.0 - source-map: 0.7.4 + array-find-index: 1.0.2 - '@esbuild/aix-ppc64@0.19.12': - optional: true + data-uri-to-buffer@6.0.2: {} - '@esbuild/aix-ppc64@0.23.1': - optional: true + date-time@3.1.0: + dependencies: + time-zone: 1.0.0 - '@esbuild/android-arm64@0.19.12': - optional: true + debug@4.4.3: + dependencies: + ms: 2.1.3 - '@esbuild/android-arm64@0.23.1': - optional: true + decamelize-keys@1.1.1: + dependencies: + decamelize: 1.2.0 + map-obj: 1.0.1 - '@esbuild/android-arm@0.19.12': - optional: true + decamelize@1.2.0: {} - '@esbuild/android-arm@0.23.1': - optional: true + decode-tiff@0.2.1: {} - '@esbuild/android-x64@0.19.12': - optional: true + decompress-response@6.0.0: + dependencies: + mimic-response: 3.1.0 - '@esbuild/android-x64@0.23.1': - optional: true + defer-to-connect@2.0.1: {} - '@esbuild/darwin-arm64@0.19.12': - optional: true + degenerator@5.0.1: + dependencies: + ast-types: 0.13.4 + escodegen: 2.1.0 + esprima: 4.0.1 - '@esbuild/darwin-arm64@0.23.1': - optional: true + del@8.0.1: + dependencies: + globby: 14.1.0 + is-glob: 4.0.3 + is-path-cwd: 3.0.0 + is-path-inside: 4.0.0 + p-map: 7.0.4 + presentable-error: 0.0.1 + slash: 5.1.0 - '@esbuild/darwin-x64@0.19.12': - optional: true + depd@2.0.0: {} - '@esbuild/darwin-x64@0.23.1': - optional: true + deprecation@2.3.1: {} - '@esbuild/freebsd-arm64@0.19.12': - optional: true + detect-libc@2.1.2: {} - '@esbuild/freebsd-arm64@0.23.1': - optional: true + devtools-protocol@0.0.1595872: {} - '@esbuild/freebsd-x64@0.19.12': - optional: true + ee-first@1.1.1: {} - '@esbuild/freebsd-x64@0.23.1': - optional: true + electron-to-chromium@1.5.346: {} - '@esbuild/linux-arm64@0.19.12': - optional: true + emittery@2.0.0: {} - '@esbuild/linux-arm64@0.23.1': - optional: true + emoji-regex@10.6.0: {} - '@esbuild/linux-arm@0.19.12': - optional: true + emoji-regex@8.0.0: {} - '@esbuild/linux-arm@0.23.1': - optional: true + encodeurl@2.0.0: {} - '@esbuild/linux-ia32@0.19.12': - optional: true + end-of-stream@1.4.5: + dependencies: + once: 1.4.0 - '@esbuild/linux-ia32@0.23.1': - optional: true + env-paths@2.2.1: {} - '@esbuild/linux-loong64@0.19.12': - optional: true + error-ex@1.3.4: + dependencies: + is-arrayish: 0.2.1 - '@esbuild/linux-loong64@0.23.1': - optional: true + es-errors@1.3.0: {} - '@esbuild/linux-mips64el@0.19.12': - optional: true + escalade@3.2.0: {} - '@esbuild/linux-mips64el@0.23.1': - optional: true + escape-html@1.0.3: {} - '@esbuild/linux-ppc64@0.19.12': - optional: true + escape-string-regexp@1.0.5: {} - '@esbuild/linux-ppc64@0.23.1': - optional: true + escape-string-regexp@2.0.0: {} - '@esbuild/linux-riscv64@0.19.12': - optional: true + escape-string-regexp@5.0.0: {} - '@esbuild/linux-riscv64@0.23.1': - optional: true + escodegen@2.1.0: + dependencies: + esprima: 4.0.1 + estraverse: 5.3.0 + esutils: 2.0.3 + optionalDependencies: + source-map: 0.6.1 - '@esbuild/linux-s390x@0.19.12': - optional: true + esprima@4.0.1: {} - '@esbuild/linux-s390x@0.23.1': - optional: true + estraverse@5.3.0: {} - '@esbuild/linux-x64@0.19.12': - optional: true + estree-walker@2.0.2: {} - '@esbuild/linux-x64@0.23.1': - optional: true + esutils@2.0.3: {} - '@esbuild/netbsd-x64@0.19.12': - optional: true + etag@1.8.1: {} - '@esbuild/netbsd-x64@0.23.1': - optional: true + events-universal@1.0.1: + dependencies: + bare-events: 2.8.2 + transitivePeerDependencies: + - bare-abort-controller - '@esbuild/openbsd-arm64@0.23.1': - optional: true + extract-zip@2.0.1: + dependencies: + debug: 4.4.3 + get-stream: 5.2.0 + yauzl: 2.10.0 + optionalDependencies: + '@types/yauzl': 2.10.3 + transitivePeerDependencies: + - supports-color - '@esbuild/openbsd-x64@0.19.12': - optional: true + fast-content-type-parse@3.0.0: {} - '@esbuild/openbsd-x64@0.23.1': - optional: true + fast-deep-equal@3.1.3: {} - '@esbuild/sunos-x64@0.19.12': - optional: true + fast-diff@1.3.0: {} - '@esbuild/sunos-x64@0.23.1': - optional: true + fast-fifo@1.3.2: {} - '@esbuild/win32-arm64@0.19.12': - optional: true + fast-glob@3.3.3: + dependencies: + '@nodelib/fs.stat': 2.0.5 + '@nodelib/fs.walk': 1.2.8 + glob-parent: 6.0.2 + merge2: 1.4.1 + micromatch: 4.0.8 - '@esbuild/win32-arm64@0.23.1': - optional: true + fast-uri@3.1.0: {} - '@esbuild/win32-ia32@0.19.12': - optional: true + fastq@1.19.1: + dependencies: + reusify: 1.1.0 - '@esbuild/win32-ia32@0.23.1': - optional: true + fd-slicer@1.1.0: + dependencies: + pend: 1.2.0 - '@esbuild/win32-x64@0.19.12': - optional: true + figures@6.1.0: + dependencies: + is-unicode-supported: 2.1.0 - '@esbuild/win32-x64@0.23.1': - optional: true + file-uri-to-path@1.0.0: {} - '@grpc/grpc-js@1.14.3': + fill-range@7.1.1: dependencies: - '@grpc/proto-loader': 0.8.0 - '@js-sdsl/ordered-map': 4.4.2 + to-regex-range: 5.0.1 - '@grpc/proto-loader@0.8.0': + finalhandler@2.1.1: dependencies: - lodash.camelcase: 4.3.0 - long: 5.3.2 - protobufjs: 7.5.4 - yargs: 17.7.2 + debug: 4.4.3 + encodeurl: 2.0.0 + escape-html: 1.0.3 + on-finished: 2.4.1 + parseurl: 1.3.3 + statuses: 2.0.2 + transitivePeerDependencies: + - supports-color + + find-up-simple@1.0.1: {} + + find-up@4.1.0: + dependencies: + locate-path: 5.0.0 + path-exists: 4.0.0 + + flow-bin@0.77.0: {} + + flow-typed@4.1.1: + dependencies: + '@octokit/rest': 18.12.0 + colors: 1.4.0 + flowgen: 1.21.0 + fs-extra: 8.1.0 + glob: 7.2.3 + got: 11.8.6 + js-yaml: 4.1.1 + md5: 2.3.0 + mkdirp: 1.0.4 + node-stream-zip: 1.15.0 + prettier: 1.19.1 + rimraf: 3.0.2 + semver: 7.7.3 + simple-git: 3.36.0 + table: 6.9.0 + which: 2.0.2 + yargs: 15.4.1 + transitivePeerDependencies: + - supports-color - '@jridgewell/gen-mapping@0.3.5': + flowgen@1.21.0: dependencies: - '@jridgewell/set-array': 1.2.1 - '@jridgewell/sourcemap-codec': 1.5.0 - '@jridgewell/trace-mapping': 0.3.25 + '@babel/code-frame': 7.29.0 + '@babel/highlight': 7.25.9 + commander: 6.2.1 + lodash: 4.18.1 + prettier: 2.8.8 + shelljs: 0.8.5 + typescript: 4.4.4 + typescript-compiler: 1.4.1-2 - '@jridgewell/resolve-uri@3.1.2': {} + fresh@2.0.0: {} - '@jridgewell/set-array@1.2.1': {} + fs-extra@8.1.0: + dependencies: + graceful-fs: 4.2.11 + jsonfile: 4.0.0 + universalify: 0.1.2 - '@jridgewell/sourcemap-codec@1.5.0': {} + fs-readdir-recursive@1.1.0: {} - '@jridgewell/trace-mapping@0.3.25': - dependencies: - '@jridgewell/resolve-uri': 3.1.2 - '@jridgewell/sourcemap-codec': 1.5.0 + fs.realpath@1.0.0: {} - '@js-sdsl/ordered-map@4.4.2': {} + fsevents@2.3.3: + optional: true - '@nodelib/fs.scandir@2.1.5': - dependencies: - '@nodelib/fs.stat': 2.0.5 - run-parallel: 1.2.0 + function-bind@1.1.2: {} - '@nodelib/fs.stat@2.0.5': {} + gensync@1.0.0-beta.2: {} - '@nodelib/fs.walk@1.2.8': - dependencies: - '@nodelib/fs.scandir': 2.1.5 - fastq: 1.17.1 + get-caller-file@2.0.5: {} - '@opentelemetry/api-logs@0.57.2': - dependencies: - '@opentelemetry/api': 1.9.0 + get-east-asian-width@1.4.0: {} - '@opentelemetry/api@1.9.0': {} + get-east-asian-width@1.5.0: {} - '@opentelemetry/context-async-hooks@1.30.1(@opentelemetry/api@1.9.0)': - dependencies: - '@opentelemetry/api': 1.9.0 - - '@opentelemetry/core@1.30.1(@opentelemetry/api@1.9.0)': + get-stream@5.2.0: dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/semantic-conventions': 1.28.0 + pump: 3.0.3 - '@opentelemetry/exporter-logs-otlp-grpc@0.57.2(@opentelemetry/api@1.9.0)': + get-uri@6.0.5: dependencies: - '@grpc/grpc-js': 1.14.3 - '@opentelemetry/api': 1.9.0 - '@opentelemetry/core': 1.30.1(@opentelemetry/api@1.9.0) - '@opentelemetry/otlp-exporter-base': 0.57.2(@opentelemetry/api@1.9.0) - '@opentelemetry/otlp-grpc-exporter-base': 0.57.2(@opentelemetry/api@1.9.0) - '@opentelemetry/otlp-transformer': 0.57.2(@opentelemetry/api@1.9.0) - '@opentelemetry/sdk-logs': 0.57.2(@opentelemetry/api@1.9.0) - - '@opentelemetry/exporter-logs-otlp-http@0.57.2(@opentelemetry/api@1.9.0)': - dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/api-logs': 0.57.2 - '@opentelemetry/core': 1.30.1(@opentelemetry/api@1.9.0) - '@opentelemetry/otlp-exporter-base': 0.57.2(@opentelemetry/api@1.9.0) - '@opentelemetry/otlp-transformer': 0.57.2(@opentelemetry/api@1.9.0) - '@opentelemetry/sdk-logs': 0.57.2(@opentelemetry/api@1.9.0) - - '@opentelemetry/exporter-logs-otlp-proto@0.57.2(@opentelemetry/api@1.9.0)': - dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/api-logs': 0.57.2 - '@opentelemetry/core': 1.30.1(@opentelemetry/api@1.9.0) - '@opentelemetry/otlp-exporter-base': 0.57.2(@opentelemetry/api@1.9.0) - '@opentelemetry/otlp-transformer': 0.57.2(@opentelemetry/api@1.9.0) - '@opentelemetry/resources': 1.30.1(@opentelemetry/api@1.9.0) - '@opentelemetry/sdk-logs': 0.57.2(@opentelemetry/api@1.9.0) - '@opentelemetry/sdk-trace-base': 1.30.1(@opentelemetry/api@1.9.0) - - '@opentelemetry/exporter-metrics-otlp-grpc@0.57.2(@opentelemetry/api@1.9.0)': - dependencies: - '@grpc/grpc-js': 1.14.3 - '@opentelemetry/api': 1.9.0 - '@opentelemetry/core': 1.30.1(@opentelemetry/api@1.9.0) - '@opentelemetry/exporter-metrics-otlp-http': 0.57.2(@opentelemetry/api@1.9.0) - '@opentelemetry/otlp-exporter-base': 0.57.2(@opentelemetry/api@1.9.0) - '@opentelemetry/otlp-grpc-exporter-base': 0.57.2(@opentelemetry/api@1.9.0) - '@opentelemetry/otlp-transformer': 0.57.2(@opentelemetry/api@1.9.0) - '@opentelemetry/resources': 1.30.1(@opentelemetry/api@1.9.0) - '@opentelemetry/sdk-metrics': 1.30.1(@opentelemetry/api@1.9.0) - - '@opentelemetry/exporter-metrics-otlp-http@0.57.2(@opentelemetry/api@1.9.0)': - dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/core': 1.30.1(@opentelemetry/api@1.9.0) - '@opentelemetry/otlp-exporter-base': 0.57.2(@opentelemetry/api@1.9.0) - '@opentelemetry/otlp-transformer': 0.57.2(@opentelemetry/api@1.9.0) - '@opentelemetry/resources': 1.30.1(@opentelemetry/api@1.9.0) - '@opentelemetry/sdk-metrics': 1.30.1(@opentelemetry/api@1.9.0) - - '@opentelemetry/exporter-metrics-otlp-proto@0.57.2(@opentelemetry/api@1.9.0)': - dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/core': 1.30.1(@opentelemetry/api@1.9.0) - '@opentelemetry/exporter-metrics-otlp-http': 0.57.2(@opentelemetry/api@1.9.0) - '@opentelemetry/otlp-exporter-base': 0.57.2(@opentelemetry/api@1.9.0) - '@opentelemetry/otlp-transformer': 0.57.2(@opentelemetry/api@1.9.0) - '@opentelemetry/resources': 1.30.1(@opentelemetry/api@1.9.0) - '@opentelemetry/sdk-metrics': 1.30.1(@opentelemetry/api@1.9.0) - - '@opentelemetry/exporter-prometheus@0.57.2(@opentelemetry/api@1.9.0)': - dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/core': 1.30.1(@opentelemetry/api@1.9.0) - '@opentelemetry/resources': 1.30.1(@opentelemetry/api@1.9.0) - '@opentelemetry/sdk-metrics': 1.30.1(@opentelemetry/api@1.9.0) - - '@opentelemetry/exporter-trace-otlp-grpc@0.57.2(@opentelemetry/api@1.9.0)': - dependencies: - '@grpc/grpc-js': 1.14.3 - '@opentelemetry/api': 1.9.0 - '@opentelemetry/core': 1.30.1(@opentelemetry/api@1.9.0) - '@opentelemetry/otlp-exporter-base': 0.57.2(@opentelemetry/api@1.9.0) - '@opentelemetry/otlp-grpc-exporter-base': 0.57.2(@opentelemetry/api@1.9.0) - '@opentelemetry/otlp-transformer': 0.57.2(@opentelemetry/api@1.9.0) - '@opentelemetry/resources': 1.30.1(@opentelemetry/api@1.9.0) - '@opentelemetry/sdk-trace-base': 1.30.1(@opentelemetry/api@1.9.0) - - '@opentelemetry/exporter-trace-otlp-http@0.57.2(@opentelemetry/api@1.9.0)': - dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/core': 1.30.1(@opentelemetry/api@1.9.0) - '@opentelemetry/otlp-exporter-base': 0.57.2(@opentelemetry/api@1.9.0) - '@opentelemetry/otlp-transformer': 0.57.2(@opentelemetry/api@1.9.0) - '@opentelemetry/resources': 1.30.1(@opentelemetry/api@1.9.0) - '@opentelemetry/sdk-trace-base': 1.30.1(@opentelemetry/api@1.9.0) - - '@opentelemetry/exporter-trace-otlp-proto@0.57.2(@opentelemetry/api@1.9.0)': - dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/core': 1.30.1(@opentelemetry/api@1.9.0) - '@opentelemetry/otlp-exporter-base': 0.57.2(@opentelemetry/api@1.9.0) - '@opentelemetry/otlp-transformer': 0.57.2(@opentelemetry/api@1.9.0) - '@opentelemetry/resources': 1.30.1(@opentelemetry/api@1.9.0) - '@opentelemetry/sdk-trace-base': 1.30.1(@opentelemetry/api@1.9.0) - - '@opentelemetry/exporter-zipkin@1.30.1(@opentelemetry/api@1.9.0)': - dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/core': 1.30.1(@opentelemetry/api@1.9.0) - '@opentelemetry/resources': 1.30.1(@opentelemetry/api@1.9.0) - '@opentelemetry/sdk-trace-base': 1.30.1(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': 1.28.0 - - '@opentelemetry/instrumentation@0.57.2(@opentelemetry/api@1.9.0)': - dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/api-logs': 0.57.2 - '@types/shimmer': 1.2.0 - import-in-the-middle: 1.15.0 - require-in-the-middle: 7.5.2 - semver: 7.6.3 - shimmer: 1.2.1 + basic-ftp: 6.0.0 + data-uri-to-buffer: 6.0.2 + debug: 4.4.3 transitivePeerDependencies: - supports-color - '@opentelemetry/otlp-exporter-base@0.57.2(@opentelemetry/api@1.9.0)': + glob-parent@6.0.2: + dependencies: + is-glob: 4.0.3 + + glob@13.0.6: dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/core': 1.30.1(@opentelemetry/api@1.9.0) - '@opentelemetry/otlp-transformer': 0.57.2(@opentelemetry/api@1.9.0) + minimatch: 10.2.5 + minipass: 7.1.3 + path-scurry: 2.0.2 - '@opentelemetry/otlp-grpc-exporter-base@0.57.2(@opentelemetry/api@1.9.0)': + glob@7.2.3: dependencies: - '@grpc/grpc-js': 1.14.3 - '@opentelemetry/api': 1.9.0 - '@opentelemetry/core': 1.30.1(@opentelemetry/api@1.9.0) - '@opentelemetry/otlp-exporter-base': 0.57.2(@opentelemetry/api@1.9.0) - '@opentelemetry/otlp-transformer': 0.57.2(@opentelemetry/api@1.9.0) + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 3.1.5 + once: 1.4.0 + path-is-absolute: 1.0.1 - '@opentelemetry/otlp-transformer@0.57.2(@opentelemetry/api@1.9.0)': + globby@14.1.0: dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/api-logs': 0.57.2 - '@opentelemetry/core': 1.30.1(@opentelemetry/api@1.9.0) - '@opentelemetry/resources': 1.30.1(@opentelemetry/api@1.9.0) - '@opentelemetry/sdk-logs': 0.57.2(@opentelemetry/api@1.9.0) - '@opentelemetry/sdk-metrics': 1.30.1(@opentelemetry/api@1.9.0) - '@opentelemetry/sdk-trace-base': 1.30.1(@opentelemetry/api@1.9.0) - protobufjs: 7.5.4 + '@sindresorhus/merge-streams': 2.3.0 + fast-glob: 3.3.3 + ignore: 7.0.5 + path-type: 6.0.0 + slash: 5.1.0 + unicorn-magic: 0.3.0 - '@opentelemetry/propagator-b3@1.30.1(@opentelemetry/api@1.9.0)': + globby@16.2.0: dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/core': 1.30.1(@opentelemetry/api@1.9.0) + '@sindresorhus/merge-streams': 4.0.0 + fast-glob: 3.3.3 + ignore: 7.0.5 + is-path-inside: 4.0.0 + slash: 5.1.0 + unicorn-magic: 0.4.0 - '@opentelemetry/propagator-jaeger@1.30.1(@opentelemetry/api@1.9.0)': + got@11.8.6: dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/core': 1.30.1(@opentelemetry/api@1.9.0) + '@sindresorhus/is': 4.6.0 + '@szmarczak/http-timer': 4.0.6 + '@types/cacheable-request': 6.0.3 + '@types/responselike': 1.0.3 + cacheable-lookup: 5.0.4 + cacheable-request: 7.0.4 + decompress-response: 6.0.0 + http2-wrapper: 1.0.3 + lowercase-keys: 2.0.0 + p-cancelable: 2.1.1 + responselike: 2.0.1 - '@opentelemetry/resources@1.30.1(@opentelemetry/api@1.9.0)': + graceful-fs@4.2.11: {} + + hard-rejection@2.1.0: {} + + has-flag@3.0.0: {} + + has-flag@4.0.0: {} + + hasown@2.0.2: dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/core': 1.30.1(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': 1.28.0 + function-bind: 1.1.2 + + hosted-git-info@2.8.9: {} - '@opentelemetry/sdk-logs@0.57.2(@opentelemetry/api@1.9.0)': + hosted-git-info@4.1.0: dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/api-logs': 0.57.2 - '@opentelemetry/core': 1.30.1(@opentelemetry/api@1.9.0) - '@opentelemetry/resources': 1.30.1(@opentelemetry/api@1.9.0) + lru-cache: 6.0.0 - '@opentelemetry/sdk-metrics@1.30.1(@opentelemetry/api@1.9.0)': + http-cache-semantics@4.2.0: {} + + http-errors@2.0.1: dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/core': 1.30.1(@opentelemetry/api@1.9.0) - '@opentelemetry/resources': 1.30.1(@opentelemetry/api@1.9.0) + depd: 2.0.0 + inherits: 2.0.4 + setprototypeof: 1.2.0 + statuses: 2.0.2 + toidentifier: 1.0.1 - '@opentelemetry/sdk-node@0.57.2(@opentelemetry/api@1.9.0)': + http-proxy-agent@7.0.2: dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/api-logs': 0.57.2 - '@opentelemetry/core': 1.30.1(@opentelemetry/api@1.9.0) - '@opentelemetry/exporter-logs-otlp-grpc': 0.57.2(@opentelemetry/api@1.9.0) - '@opentelemetry/exporter-logs-otlp-http': 0.57.2(@opentelemetry/api@1.9.0) - '@opentelemetry/exporter-logs-otlp-proto': 0.57.2(@opentelemetry/api@1.9.0) - '@opentelemetry/exporter-metrics-otlp-grpc': 0.57.2(@opentelemetry/api@1.9.0) - '@opentelemetry/exporter-metrics-otlp-http': 0.57.2(@opentelemetry/api@1.9.0) - '@opentelemetry/exporter-metrics-otlp-proto': 0.57.2(@opentelemetry/api@1.9.0) - '@opentelemetry/exporter-prometheus': 0.57.2(@opentelemetry/api@1.9.0) - '@opentelemetry/exporter-trace-otlp-grpc': 0.57.2(@opentelemetry/api@1.9.0) - '@opentelemetry/exporter-trace-otlp-http': 0.57.2(@opentelemetry/api@1.9.0) - '@opentelemetry/exporter-trace-otlp-proto': 0.57.2(@opentelemetry/api@1.9.0) - '@opentelemetry/exporter-zipkin': 1.30.1(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation': 0.57.2(@opentelemetry/api@1.9.0) - '@opentelemetry/resources': 1.30.1(@opentelemetry/api@1.9.0) - '@opentelemetry/sdk-logs': 0.57.2(@opentelemetry/api@1.9.0) - '@opentelemetry/sdk-metrics': 1.30.1(@opentelemetry/api@1.9.0) - '@opentelemetry/sdk-trace-base': 1.30.1(@opentelemetry/api@1.9.0) - '@opentelemetry/sdk-trace-node': 1.30.1(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': 1.28.0 + agent-base: 7.1.4 + debug: 4.4.3 transitivePeerDependencies: - supports-color - '@opentelemetry/sdk-trace-base@1.30.1(@opentelemetry/api@1.9.0)': + http2-wrapper@1.0.3: dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/core': 1.30.1(@opentelemetry/api@1.9.0) - '@opentelemetry/resources': 1.30.1(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': 1.28.0 + quick-lru: 5.1.1 + resolve-alpn: 1.2.1 - '@opentelemetry/sdk-trace-node@1.30.1(@opentelemetry/api@1.9.0)': + https-proxy-agent@7.0.6: dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/context-async-hooks': 1.30.1(@opentelemetry/api@1.9.0) - '@opentelemetry/core': 1.30.1(@opentelemetry/api@1.9.0) - '@opentelemetry/propagator-b3': 1.30.1(@opentelemetry/api@1.9.0) - '@opentelemetry/propagator-jaeger': 1.30.1(@opentelemetry/api@1.9.0) - '@opentelemetry/sdk-trace-base': 1.30.1(@opentelemetry/api@1.9.0) - semver: 7.6.3 + agent-base: 7.1.4 + debug: 4.4.3 + transitivePeerDependencies: + - supports-color - '@opentelemetry/semantic-conventions@1.28.0': {} + ignore-by-default@2.1.0: {} - '@opentelemetry/semantic-conventions@1.38.0': {} + ignore@7.0.5: {} - '@protobufjs/aspromise@1.1.2': {} + img-diff-js@0.5.4: + dependencies: + decode-tiff: 0.2.1 + jpeg-js: 0.4.4 + mkdirp: 1.0.4 + pixelmatch: 5.3.0 + pngjs: 7.0.0 - '@protobufjs/base64@1.1.2': {} + import-fresh@3.3.1: + dependencies: + parent-module: 1.0.1 + resolve-from: 4.0.0 - '@protobufjs/codegen@2.0.4': {} + indent-string@4.0.0: {} - '@protobufjs/eventemitter@1.1.0': {} + indent-string@5.0.0: {} - '@protobufjs/fetch@1.1.0': + inflight@1.0.6: dependencies: - '@protobufjs/aspromise': 1.1.2 - '@protobufjs/inquire': 1.1.0 + once: 1.4.0 + wrappy: 1.0.2 - '@protobufjs/float@1.0.2': {} + inherits@2.0.4: {} - '@protobufjs/inquire@1.1.0': {} + interpret@1.4.0: {} - '@protobufjs/path@1.1.2': {} + ip-address@10.1.0: {} - '@protobufjs/pool@1.1.0': {} + irregular-plurals@4.2.0: {} - '@protobufjs/utf8@1.1.0': {} + is-arrayish@0.2.1: {} - '@pyroscope/nodejs@0.4.1': + is-binary-path@2.1.0: dependencies: - '@datadog/pprof': 5.4.1 - axios: 0.28.1(debug@4.3.7) - debug: 4.3.7 - form-data: 4.0.1 - p-limit: 3.1.0 - regenerator-runtime: 0.13.11 - source-map: 0.7.4 - transitivePeerDependencies: - - supports-color + binary-extensions: 2.3.0 + optional: true - '@rollup/plugin-alias@5.1.1(rollup@3.29.5)': - optionalDependencies: - rollup: 3.29.5 + is-buffer@1.1.6: {} - '@rollup/plugin-commonjs@25.0.8(rollup@3.29.5)': + is-core-module@2.16.1: dependencies: - '@rollup/pluginutils': 5.1.2(rollup@3.29.5) - commondir: 1.0.1 - estree-walker: 2.0.2 - glob: 8.1.0 - is-reference: 1.2.1 - magic-string: 0.30.11 - optionalDependencies: - rollup: 3.29.5 + hasown: 2.0.2 + + is-extglob@2.1.1: {} + + is-fullwidth-code-point@3.0.0: {} - '@rollup/plugin-json@6.1.0(rollup@3.29.5)': + is-fullwidth-code-point@5.1.0: dependencies: - '@rollup/pluginutils': 5.1.2(rollup@3.29.5) - optionalDependencies: - rollup: 3.29.5 + get-east-asian-width: 1.4.0 - '@rollup/plugin-node-resolve@15.3.0(rollup@3.29.5)': + is-glob@4.0.3: dependencies: - '@rollup/pluginutils': 5.1.2(rollup@3.29.5) - '@types/resolve': 1.20.2 - deepmerge: 4.3.1 - is-module: 1.0.0 - resolve: 1.22.8 - optionalDependencies: - rollup: 3.29.5 + is-extglob: 2.1.1 + + is-number@7.0.0: {} + + is-path-cwd@3.0.0: {} + + is-path-inside@4.0.0: {} + + is-plain-obj@1.1.0: {} + + is-plain-object@5.0.0: {} + + is-promise@4.0.0: {} - '@rollup/plugin-replace@5.0.7(rollup@3.29.5)': + is-unicode-supported@2.1.0: {} + + isarray@0.0.1: {} + + isarray@1.0.0: {} + + isexe@2.0.0: {} + + jpeg-js@0.4.4: {} + + js-string-escape@1.0.1: {} + + js-tokens@4.0.0: {} + + js-yaml@3.14.2: dependencies: - '@rollup/pluginutils': 5.1.2(rollup@3.29.5) - magic-string: 0.30.11 - optionalDependencies: - rollup: 3.29.5 + argparse: 1.0.10 + esprima: 4.0.1 - '@rollup/pluginutils@5.1.2(rollup@3.29.5)': + js-yaml@4.1.1: dependencies: - '@types/estree': 1.0.6 - estree-walker: 2.0.2 - picomatch: 2.3.1 + argparse: 2.0.1 + + jsesc@3.1.0: {} + + json-buffer@3.0.1: {} + + json-parse-even-better-errors@2.3.1: {} + + json-schema-traverse@1.0.0: {} + + json-with-bigint@3.5.8: {} + + json5@2.2.3: {} + + jsonfile@4.0.0: optionalDependencies: - rollup: 3.29.5 + graceful-fs: 4.2.11 + + keyv@4.5.4: + dependencies: + json-buffer: 3.0.1 - '@trysound/sax@0.2.0': {} + kind-of@6.0.3: {} - '@tybys/wasm-util@0.9.0': + lines-and-columns@1.2.4: {} + + load-json-file@7.0.1: {} + + locate-path@5.0.0: dependencies: - tslib: 2.7.0 + p-locate: 4.1.0 + + lodash.debounce@4.0.8: {} + + lodash.truncate@4.4.2: {} - '@types/estree@1.0.6': {} + lodash@4.18.1: {} - '@types/node@22.5.5': + lowercase-keys@2.0.0: {} + + lru-cache@11.3.5: {} + + lru-cache@5.1.1: dependencies: - undici-types: 6.19.8 + yallist: 3.1.1 - '@types/resolve@1.20.2': {} + lru-cache@6.0.0: + dependencies: + yallist: 4.0.0 - '@types/shimmer@1.2.0': {} + lru-cache@7.18.3: {} - acorn-import-attributes@1.9.5(acorn@8.15.0): + make-dir@2.1.0: dependencies: - acorn: 8.15.0 + pify: 4.0.1 + semver: 5.7.2 - acorn@8.12.1: {} + make-dir@3.1.0: + dependencies: + semver: 6.3.1 - acorn@8.15.0: {} + map-obj@1.0.1: {} - ansi-regex@5.0.1: {} + map-obj@4.3.0: {} - ansi-styles@3.2.1: + matcher@6.0.0: dependencies: - color-convert: 1.9.3 + escape-string-regexp: 5.0.0 - ansi-styles@4.3.0: + md5-file@4.0.0: {} + + md5-hex@3.0.1: dependencies: - color-convert: 2.0.1 + blueimp-md5: 2.19.0 + + md5@2.3.0: + dependencies: + charenc: 0.0.2 + crypt: 0.0.2 + is-buffer: 1.1.6 + + memoize@11.0.0: + dependencies: + mimic-function: 5.0.1 + + meow@9.0.0: + dependencies: + '@types/minimist': 1.2.5 + camelcase-keys: 6.2.2 + decamelize: 1.2.0 + decamelize-keys: 1.1.1 + hard-rejection: 2.1.0 + minimist-options: 4.1.0 + normalize-package-data: 3.0.3 + read-pkg-up: 7.0.1 + redent: 3.0.0 + trim-newlines: 3.0.1 + type-fest: 0.18.1 + yargs-parser: 21.1.1 - asynckit@0.4.0: {} + merge2@1.4.1: {} - autoprefixer@10.4.20(postcss@8.4.47): + micromatch@4.0.8: dependencies: - browserslist: 4.24.0 - caniuse-lite: 1.0.30001664 - fraction.js: 4.3.7 - normalize-range: 0.1.2 - picocolors: 1.1.0 - postcss: 8.4.47 - postcss-value-parser: 4.2.0 + braces: 3.0.3 + picomatch: 4.0.4 + + mime-db@1.54.0: {} - axios@0.28.1(debug@4.3.7): + mime-types@3.0.2: dependencies: - follow-redirects: 1.15.9(debug@4.3.7) - form-data: 4.0.1 - proxy-from-env: 1.1.0 - transitivePeerDependencies: - - debug + mime-db: 1.54.0 - balanced-match@1.0.2: {} + mimic-function@5.0.1: {} - boolbase@1.0.0: {} + mimic-response@1.0.1: {} - brace-expansion@2.0.1: - dependencies: - balanced-match: 1.0.2 + mimic-response@3.1.0: {} - braces@3.0.3: - dependencies: - fill-range: 7.1.1 + min-indent@1.0.1: {} - browserslist@4.24.0: + minimatch@10.2.5: dependencies: - caniuse-lite: 1.0.30001664 - electron-to-chromium: 1.5.29 - node-releases: 2.0.18 - update-browserslist-db: 1.1.1(browserslist@4.24.0) + brace-expansion: 5.0.5 - caniuse-api@3.0.0: + minimatch@3.1.5: dependencies: - browserslist: 4.24.0 - caniuse-lite: 1.0.30001664 - lodash.memoize: 4.1.2 - lodash.uniq: 4.5.0 + brace-expansion: 5.0.5 - caniuse-lite@1.0.30001664: {} - - chalk@2.4.2: + minimist-options@4.1.0: dependencies: - ansi-styles: 3.2.1 - escape-string-regexp: 1.0.5 - supports-color: 5.5.0 - - chalk@5.3.0: {} + arrify: 1.0.1 + is-plain-obj: 1.1.0 + kind-of: 6.0.3 - citty@0.1.6: - dependencies: - consola: 3.2.3 + minipass@7.1.2: {} - cjs-module-lexer@1.4.3: {} + minipass@7.1.3: {} - cliui@8.0.1: + minizlib@3.1.0: dependencies: - string-width: 4.2.3 - strip-ansi: 6.0.1 - wrap-ansi: 7.0.0 + minipass: 7.1.2 - color-convert@1.9.3: - dependencies: - color-name: 1.1.3 + mitt@3.0.1: {} - color-convert@2.0.1: - dependencies: - color-name: 1.1.4 + mkdirp@1.0.4: {} - color-name@1.1.3: {} + ms@2.1.3: {} - color-name@1.1.4: {} + mustache@4.2.0: {} - colord@2.9.3: {} + netmask@2.0.2: {} - combined-stream@1.0.8: + node-fetch@2.7.0: dependencies: - delayed-stream: 1.0.0 + whatwg-url: 5.0.0 - commander@7.2.0: {} + node-gyp-build@4.8.4: {} - commondir@1.0.1: {} + node-releases@2.0.38: {} - confbox@0.1.7: {} + node-stream-zip@1.15.0: {} - consola@3.2.3: {} - - convert-source-map@2.0.0: {} + nofilter@3.1.0: {} - css-declaration-sorter@7.2.0(postcss@8.4.47): + noms@0.0.0: dependencies: - postcss: 8.4.47 + inherits: 2.0.4 + readable-stream: 1.0.34 - css-select@5.1.0: + nopt@8.1.0: dependencies: - boolbase: 1.0.0 - css-what: 6.1.0 - domhandler: 5.0.3 - domutils: 3.1.0 - nth-check: 2.1.1 + abbrev: 3.0.1 - css-tree@2.2.1: + normalize-package-data@2.5.0: dependencies: - mdn-data: 2.0.28 - source-map-js: 1.2.1 + hosted-git-info: 2.8.9 + resolve: 1.22.12 + semver: 5.7.2 + validate-npm-package-license: 3.0.4 - css-tree@2.3.1: + normalize-package-data@3.0.3: dependencies: - mdn-data: 2.0.30 - source-map-js: 1.2.1 + hosted-git-info: 4.1.0 + is-core-module: 2.16.1 + semver: 7.7.4 + validate-npm-package-license: 3.0.4 - css-what@6.1.0: {} + normalize-path@3.0.0: + optional: true - cssesc@3.0.0: {} + normalize-url@6.1.0: {} - cssnano-preset-default@7.0.6(postcss@8.4.47): + on-finished@2.4.1: dependencies: - browserslist: 4.24.0 - css-declaration-sorter: 7.2.0(postcss@8.4.47) - cssnano-utils: 5.0.0(postcss@8.4.47) - postcss: 8.4.47 - postcss-calc: 10.0.2(postcss@8.4.47) - postcss-colormin: 7.0.2(postcss@8.4.47) - postcss-convert-values: 7.0.4(postcss@8.4.47) - postcss-discard-comments: 7.0.3(postcss@8.4.47) - postcss-discard-duplicates: 7.0.1(postcss@8.4.47) - postcss-discard-empty: 7.0.0(postcss@8.4.47) - postcss-discard-overridden: 7.0.0(postcss@8.4.47) - postcss-merge-longhand: 7.0.4(postcss@8.4.47) - postcss-merge-rules: 7.0.4(postcss@8.4.47) - postcss-minify-font-values: 7.0.0(postcss@8.4.47) - postcss-minify-gradients: 7.0.0(postcss@8.4.47) - postcss-minify-params: 7.0.2(postcss@8.4.47) - postcss-minify-selectors: 7.0.4(postcss@8.4.47) - postcss-normalize-charset: 7.0.0(postcss@8.4.47) - postcss-normalize-display-values: 7.0.0(postcss@8.4.47) - postcss-normalize-positions: 7.0.0(postcss@8.4.47) - postcss-normalize-repeat-style: 7.0.0(postcss@8.4.47) - postcss-normalize-string: 7.0.0(postcss@8.4.47) - postcss-normalize-timing-functions: 7.0.0(postcss@8.4.47) - postcss-normalize-unicode: 7.0.2(postcss@8.4.47) - postcss-normalize-url: 7.0.0(postcss@8.4.47) - postcss-normalize-whitespace: 7.0.0(postcss@8.4.47) - postcss-ordered-values: 7.0.1(postcss@8.4.47) - postcss-reduce-initial: 7.0.2(postcss@8.4.47) - postcss-reduce-transforms: 7.0.0(postcss@8.4.47) - postcss-svgo: 7.0.1(postcss@8.4.47) - postcss-unique-selectors: 7.0.3(postcss@8.4.47) + ee-first: 1.1.1 - cssnano-utils@5.0.0(postcss@8.4.47): + once@1.4.0: dependencies: - postcss: 8.4.47 + wrappy: 1.0.2 - cssnano@7.0.6(postcss@8.4.47): - dependencies: - cssnano-preset-default: 7.0.6(postcss@8.4.47) - lilconfig: 3.1.2 - postcss: 8.4.47 + p-cancelable@2.1.1: {} - csso@5.0.5: + p-limit@2.3.0: dependencies: - css-tree: 2.2.1 + p-try: 2.2.0 - debug@4.3.7: + p-locate@4.1.0: dependencies: - ms: 2.1.3 - - deepmerge@4.3.1: {} - - defu@6.1.4: {} + p-limit: 2.3.0 - delay@5.0.0: {} + p-map@7.0.4: {} - delayed-stream@1.0.0: {} + p-try@2.2.0: {} - dir-glob@3.0.1: + pac-proxy-agent@7.2.0: dependencies: - path-type: 4.0.0 + '@tootallnate/quickjs-emscripten': 0.23.0 + agent-base: 7.1.4 + debug: 4.4.3 + get-uri: 6.0.5 + http-proxy-agent: 7.0.2 + https-proxy-agent: 7.0.6 + pac-resolver: 7.0.1 + socks-proxy-agent: 8.0.5 + transitivePeerDependencies: + - supports-color - dom-serializer@2.0.0: + pac-resolver@7.0.1: dependencies: - domelementtype: 2.3.0 - domhandler: 5.0.3 - entities: 4.5.0 + degenerator: 5.0.1 + netmask: 2.0.2 - domelementtype@2.3.0: {} - - domhandler@5.0.3: + package-config@5.0.0: dependencies: - domelementtype: 2.3.0 + find-up-simple: 1.0.1 + load-json-file: 7.0.1 - domutils@3.1.0: + parent-module@1.0.1: dependencies: - dom-serializer: 2.0.0 - domelementtype: 2.3.0 - domhandler: 5.0.3 + callsites: 3.1.0 - electron-to-chromium@1.5.29: {} + parse-json@5.2.0: + dependencies: + '@babel/code-frame': 7.29.0 + error-ex: 1.3.4 + json-parse-even-better-errors: 2.3.1 + lines-and-columns: 1.2.4 - emoji-regex@8.0.0: {} + parse-ms@4.0.0: {} - entities@4.5.0: {} + parseurl@1.3.3: {} - esbuild@0.19.12: - optionalDependencies: - '@esbuild/aix-ppc64': 0.19.12 - '@esbuild/android-arm': 0.19.12 - '@esbuild/android-arm64': 0.19.12 - '@esbuild/android-x64': 0.19.12 - '@esbuild/darwin-arm64': 0.19.12 - '@esbuild/darwin-x64': 0.19.12 - '@esbuild/freebsd-arm64': 0.19.12 - '@esbuild/freebsd-x64': 0.19.12 - '@esbuild/linux-arm': 0.19.12 - '@esbuild/linux-arm64': 0.19.12 - '@esbuild/linux-ia32': 0.19.12 - '@esbuild/linux-loong64': 0.19.12 - '@esbuild/linux-mips64el': 0.19.12 - '@esbuild/linux-ppc64': 0.19.12 - '@esbuild/linux-riscv64': 0.19.12 - '@esbuild/linux-s390x': 0.19.12 - '@esbuild/linux-x64': 0.19.12 - '@esbuild/netbsd-x64': 0.19.12 - '@esbuild/openbsd-x64': 0.19.12 - '@esbuild/sunos-x64': 0.19.12 - '@esbuild/win32-arm64': 0.19.12 - '@esbuild/win32-ia32': 0.19.12 - '@esbuild/win32-x64': 0.19.12 - - esbuild@0.23.1: - optionalDependencies: - '@esbuild/aix-ppc64': 0.23.1 - '@esbuild/android-arm': 0.23.1 - '@esbuild/android-arm64': 0.23.1 - '@esbuild/android-x64': 0.23.1 - '@esbuild/darwin-arm64': 0.23.1 - '@esbuild/darwin-x64': 0.23.1 - '@esbuild/freebsd-arm64': 0.23.1 - '@esbuild/freebsd-x64': 0.23.1 - '@esbuild/linux-arm': 0.23.1 - '@esbuild/linux-arm64': 0.23.1 - '@esbuild/linux-ia32': 0.23.1 - '@esbuild/linux-loong64': 0.23.1 - '@esbuild/linux-mips64el': 0.23.1 - '@esbuild/linux-ppc64': 0.23.1 - '@esbuild/linux-riscv64': 0.23.1 - '@esbuild/linux-s390x': 0.23.1 - '@esbuild/linux-x64': 0.23.1 - '@esbuild/netbsd-x64': 0.23.1 - '@esbuild/openbsd-arm64': 0.23.1 - '@esbuild/openbsd-x64': 0.23.1 - '@esbuild/sunos-x64': 0.23.1 - '@esbuild/win32-arm64': 0.23.1 - '@esbuild/win32-ia32': 0.23.1 - '@esbuild/win32-x64': 0.23.1 + path-exists@4.0.0: {} - escalade@3.2.0: {} + path-is-absolute@1.0.1: {} - escape-string-regexp@1.0.5: {} + path-key@3.1.1: {} - estree-walker@2.0.2: {} + path-parse@1.0.7: {} - fast-glob@3.3.2: + path-scurry@2.0.2: dependencies: - '@nodelib/fs.stat': 2.0.5 - '@nodelib/fs.walk': 1.2.8 - glob-parent: 5.1.2 - merge2: 1.4.1 - micromatch: 4.0.8 + lru-cache: 11.3.5 + minipass: 7.1.3 + + path-type@6.0.0: {} + + pend@1.2.0: {} + + picocolors@1.1.1: {} + + picomatch@4.0.4: {} + + pify@4.0.1: {} - fastq@1.17.1: + pixelmatch@5.3.0: dependencies: - reusify: 1.0.4 + pngjs: 6.0.0 - fill-range@7.1.1: + plur@6.0.0: dependencies: - to-regex-range: 5.0.1 + irregular-plurals: 4.2.0 - follow-redirects@1.15.9(debug@4.3.7): - optionalDependencies: - debug: 4.3.7 + pngjs@6.0.0: {} - form-data@4.0.1: - dependencies: - asynckit: 0.4.0 - combined-stream: 1.0.8 - mime-types: 2.1.35 + pngjs@7.0.0: {} - fraction.js@4.3.7: {} + presentable-error@0.0.1: {} - fs.realpath@1.0.0: {} + prettier@1.19.1: {} - fsevents@2.3.3: - optional: true + prettier@2.8.8: {} - function-bind@1.1.2: {} + pretty-ms@9.3.0: + dependencies: + parse-ms: 4.0.0 - gensync@1.0.0-beta.2: {} + process-nextick-args@2.0.1: {} - get-caller-file@2.0.5: {} + progress@2.0.3: {} - glob-parent@5.1.2: + proxy-agent@6.5.0: dependencies: - is-glob: 4.0.3 + agent-base: 7.1.4 + debug: 4.4.3 + http-proxy-agent: 7.0.2 + https-proxy-agent: 7.0.6 + lru-cache: 7.18.3 + pac-proxy-agent: 7.2.0 + proxy-from-env: 1.1.0 + socks-proxy-agent: 8.0.5 + transitivePeerDependencies: + - supports-color + + proxy-from-env@1.1.0: {} - glob@8.1.0: + pump@3.0.3: dependencies: - fs.realpath: 1.0.0 - inflight: 1.0.6 - inherits: 2.0.4 - minimatch: 5.1.6 + end-of-stream: 1.4.5 once: 1.4.0 - globals@11.12.0: {} + puppeteer-core@24.42.0: + dependencies: + '@puppeteer/browsers': 2.13.0 + chromium-bidi: 14.0.0(devtools-protocol@0.0.1595872) + debug: 4.4.3 + devtools-protocol: 0.0.1595872 + typed-query-selector: 2.12.1 + webdriver-bidi-protocol: 0.4.1 + ws: 8.17.1 + transitivePeerDependencies: + - bare-abort-controller + - bare-buffer + - bufferutil + - react-native-b4a + - supports-color + - utf-8-validate - globby@13.2.2: + puppeteer@24.42.0: dependencies: - dir-glob: 3.0.1 - fast-glob: 3.3.2 - ignore: 5.3.2 - merge2: 1.4.1 - slash: 4.0.0 + '@puppeteer/browsers': 2.13.0 + chromium-bidi: 14.0.0(devtools-protocol@0.0.1595872) + cosmiconfig: 9.0.0 + devtools-protocol: 0.0.1595872 + puppeteer-core: 24.42.0 + typed-query-selector: 2.12.1 + transitivePeerDependencies: + - bare-abort-controller + - bare-buffer + - bufferutil + - react-native-b4a + - supports-color + - typescript + - utf-8-validate - has-flag@3.0.0: {} + queue-microtask@1.2.3: {} - hasown@2.0.2: - dependencies: - function-bind: 1.1.2 + quick-lru@4.0.1: {} - hookable@5.5.3: {} + quick-lru@5.1.1: {} - ignore@5.3.2: {} + range-parser@1.2.1: {} - import-in-the-middle@1.15.0: + read-pkg-up@7.0.1: dependencies: - acorn: 8.15.0 - acorn-import-attributes: 1.9.5(acorn@8.15.0) - cjs-module-lexer: 1.4.3 - module-details-from-path: 1.0.4 + find-up: 4.1.0 + read-pkg: 5.2.0 + type-fest: 0.8.1 - inflight@1.0.6: + read-pkg@5.2.0: dependencies: - once: 1.4.0 - wrappy: 1.0.2 + '@types/normalize-package-data': 2.4.4 + normalize-package-data: 2.5.0 + parse-json: 5.2.0 + type-fest: 0.6.0 - inherits@2.0.4: {} + readable-stream@1.0.34: + dependencies: + core-util-is: 1.0.3 + inherits: 2.0.4 + isarray: 0.0.1 + string_decoder: 0.10.31 - is-core-module@2.15.1: + readable-stream@2.3.8: dependencies: - hasown: 2.0.2 + core-util-is: 1.0.3 + inherits: 2.0.4 + isarray: 1.0.0 + process-nextick-args: 2.0.1 + safe-buffer: 5.1.2 + string_decoder: 1.1.1 + util-deprecate: 1.0.2 - is-extglob@2.1.1: {} + readdirp@3.6.0: + dependencies: + picomatch: 4.0.4 + optional: true - is-fullwidth-code-point@3.0.0: {} + rechoir@0.6.2: + dependencies: + resolve: 1.22.12 - is-glob@4.0.3: + redent@3.0.0: dependencies: - is-extglob: 2.1.1 + indent-string: 4.0.0 + strip-indent: 3.0.0 - is-module@1.0.0: {} + regenerate-unicode-properties@10.2.2: + dependencies: + regenerate: 1.4.2 - is-number@7.0.0: {} + regenerate@1.4.2: {} - is-reference@1.2.1: + regexpu-core@6.4.0: dependencies: - '@types/estree': 1.0.6 + regenerate: 1.4.2 + regenerate-unicode-properties: 10.2.2 + regjsgen: 0.8.0 + regjsparser: 0.13.1 + unicode-match-property-ecmascript: 2.0.0 + unicode-match-property-value-ecmascript: 2.2.1 - jiti@1.21.6: {} + regjsgen@0.8.0: {} - jiti@2.0.0: {} + regjsparser@0.13.1: + dependencies: + jsesc: 3.1.0 - js-tokens@4.0.0: {} + require-directory@2.1.1: {} - jsesc@2.5.2: {} + require-from-string@2.0.2: {} - json5@2.2.3: {} + require-main-filename@2.0.0: {} - lilconfig@3.1.2: {} + resolve-alpn@1.2.1: {} - lodash.camelcase@4.3.0: {} + resolve-cwd@3.0.0: + dependencies: + resolve-from: 5.0.0 - lodash.memoize@4.1.2: {} + resolve-from@4.0.0: {} - lodash.uniq@4.5.0: {} + resolve-from@5.0.0: {} - long@5.3.2: {} + resolve@1.22.12: + dependencies: + es-errors: 1.3.0 + is-core-module: 2.16.1 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 - lru-cache@5.1.1: + responselike@2.0.1: dependencies: - yallist: 3.1.1 + lowercase-keys: 2.0.0 + + reusify@1.1.0: {} - magic-string@0.30.11: + rimraf@3.0.2: dependencies: - '@jridgewell/sourcemap-codec': 1.5.0 + glob: 7.2.3 - mdn-data@2.0.28: {} + run-parallel@1.2.0: + dependencies: + queue-microtask: 1.2.3 - mdn-data@2.0.30: {} + safe-buffer@5.1.2: {} - merge2@1.4.1: {} + semver@5.7.2: {} - micromatch@4.0.8: - dependencies: - braces: 3.0.3 - picomatch: 2.3.1 + semver@6.3.1: {} - mime-db@1.52.0: {} + semver@7.7.3: {} - mime-types@2.1.35: - dependencies: - mime-db: 1.52.0 + semver@7.7.4: {} - minimatch@5.1.6: + send@1.2.1: dependencies: - brace-expansion: 2.0.1 + debug: 4.4.3 + encodeurl: 2.0.0 + escape-html: 1.0.3 + etag: 1.8.1 + fresh: 2.0.0 + http-errors: 2.0.1 + mime-types: 3.0.2 + ms: 2.1.3 + on-finished: 2.4.1 + range-parser: 1.2.1 + statuses: 2.0.2 + transitivePeerDependencies: + - supports-color - mkdist@1.5.9(typescript@5.6.2): + serialize-error@7.0.1: dependencies: - autoprefixer: 10.4.20(postcss@8.4.47) - citty: 0.1.6 - cssnano: 7.0.6(postcss@8.4.47) - defu: 6.1.4 - esbuild: 0.23.1 - fast-glob: 3.3.2 - jiti: 1.21.6 - mlly: 1.7.1 - pathe: 1.1.2 - pkg-types: 1.2.0 - postcss: 8.4.47 - postcss-nested: 6.2.0(postcss@8.4.47) - semver: 7.6.3 - optionalDependencies: - typescript: 5.6.2 + type-fest: 0.13.1 - mlly@1.7.1: + serve-static@2.2.1: dependencies: - acorn: 8.12.1 - pathe: 1.1.2 - pkg-types: 1.2.0 - ufo: 1.5.4 - - module-details-from-path@1.0.4: {} - - mri@1.2.0: {} - - ms@2.1.3: {} + encodeurl: 2.0.0 + escape-html: 1.0.3 + parseurl: 1.3.3 + send: 1.2.1 + transitivePeerDependencies: + - supports-color - nanoid@3.3.7: {} + set-blocking@2.0.0: {} - node-gyp-build@3.9.0: {} + setprototypeof@1.2.0: {} - node-releases@2.0.18: {} + shebang-command@2.0.0: + dependencies: + shebang-regex: 3.0.0 - normalize-range@0.1.2: {} + shebang-regex@3.0.0: {} - nth-check@2.1.1: + shelljs@0.8.5: dependencies: - boolbase: 1.0.0 + glob: 7.2.3 + interpret: 1.4.0 + rechoir: 0.6.2 - once@1.4.0: - dependencies: - wrappy: 1.0.2 + signal-exit@4.1.0: {} - p-limit@3.1.0: + simple-git@3.36.0: dependencies: - yocto-queue: 0.1.0 + '@kwsites/file-exists': 1.1.1 + '@kwsites/promise-deferred': 1.1.1 + '@simple-git/args-pathspec': 1.0.3 + '@simple-git/argv-parser': 1.1.1 + debug: 4.4.3 + transitivePeerDependencies: + - supports-color - path-parse@1.0.7: {} + slash@2.0.0: {} - path-type@4.0.0: {} + slash@5.1.0: {} - pathe@1.1.2: {} + slice-ansi@4.0.0: + dependencies: + ansi-styles: 4.3.0 + astral-regex: 2.0.0 + is-fullwidth-code-point: 3.0.0 - picocolors@1.1.0: {} + slice-ansi@9.0.0: + dependencies: + ansi-styles: 6.2.3 + is-fullwidth-code-point: 5.1.0 - picomatch@2.3.1: {} + smart-buffer@4.2.0: {} - pkg-types@1.2.0: + socks-proxy-agent@8.0.5: dependencies: - confbox: 0.1.7 - mlly: 1.7.1 - pathe: 1.1.2 + agent-base: 7.1.4 + debug: 4.4.3 + socks: 2.8.7 + transitivePeerDependencies: + - supports-color - postcss-calc@10.0.2(postcss@8.4.47): + socks@2.8.7: dependencies: - postcss: 8.4.47 - postcss-selector-parser: 6.1.2 - postcss-value-parser: 4.2.0 + ip-address: 10.1.0 + smart-buffer: 4.2.0 - postcss-colormin@7.0.2(postcss@8.4.47): - dependencies: - browserslist: 4.24.0 - caniuse-api: 3.0.0 - colord: 2.9.3 - postcss: 8.4.47 - postcss-value-parser: 4.2.0 + source-map@0.6.1: + optional: true - postcss-convert-values@7.0.4(postcss@8.4.47): + spdx-correct@3.2.0: dependencies: - browserslist: 4.24.0 - postcss: 8.4.47 - postcss-value-parser: 4.2.0 + spdx-expression-parse: 3.0.1 + spdx-license-ids: 3.0.22 - postcss-discard-comments@7.0.3(postcss@8.4.47): - dependencies: - postcss: 8.4.47 - postcss-selector-parser: 6.1.2 + spdx-exceptions@2.5.0: {} - postcss-discard-duplicates@7.0.1(postcss@8.4.47): + spdx-expression-parse@3.0.1: dependencies: - postcss: 8.4.47 + spdx-exceptions: 2.5.0 + spdx-license-ids: 3.0.22 - postcss-discard-empty@7.0.0(postcss@8.4.47): - dependencies: - postcss: 8.4.47 + spdx-license-ids@3.0.22: {} - postcss-discard-overridden@7.0.0(postcss@8.4.47): - dependencies: - postcss: 8.4.47 + sprintf-js@1.0.3: {} - postcss-merge-longhand@7.0.4(postcss@8.4.47): + stack-utils@2.0.6: dependencies: - postcss: 8.4.47 - postcss-value-parser: 4.2.0 - stylehacks: 7.0.4(postcss@8.4.47) + escape-string-regexp: 2.0.0 - postcss-merge-rules@7.0.4(postcss@8.4.47): - dependencies: - browserslist: 4.24.0 - caniuse-api: 3.0.0 - cssnano-utils: 5.0.0(postcss@8.4.47) - postcss: 8.4.47 - postcss-selector-parser: 6.1.2 + statuses@2.0.2: {} - postcss-minify-font-values@7.0.0(postcss@8.4.47): + streamx@2.23.0: dependencies: - postcss: 8.4.47 - postcss-value-parser: 4.2.0 + events-universal: 1.0.1 + fast-fifo: 1.3.2 + text-decoder: 1.2.3 + transitivePeerDependencies: + - bare-abort-controller + - react-native-b4a - postcss-minify-gradients@7.0.0(postcss@8.4.47): + string-width@4.2.3: dependencies: - colord: 2.9.3 - cssnano-utils: 5.0.0(postcss@8.4.47) - postcss: 8.4.47 - postcss-value-parser: 4.2.0 + emoji-regex: 8.0.0 + is-fullwidth-code-point: 3.0.0 + strip-ansi: 6.0.1 - postcss-minify-params@7.0.2(postcss@8.4.47): + string-width@7.2.0: dependencies: - browserslist: 4.24.0 - cssnano-utils: 5.0.0(postcss@8.4.47) - postcss: 8.4.47 - postcss-value-parser: 4.2.0 + emoji-regex: 10.6.0 + get-east-asian-width: 1.4.0 + strip-ansi: 7.1.2 - postcss-minify-selectors@7.0.4(postcss@8.4.47): + string-width@8.2.1: dependencies: - cssesc: 3.0.0 - postcss: 8.4.47 - postcss-selector-parser: 6.1.2 + get-east-asian-width: 1.5.0 + strip-ansi: 7.1.2 - postcss-nested@6.2.0(postcss@8.4.47): - dependencies: - postcss: 8.4.47 - postcss-selector-parser: 6.1.2 + string_decoder@0.10.31: {} - postcss-normalize-charset@7.0.0(postcss@8.4.47): + string_decoder@1.1.1: dependencies: - postcss: 8.4.47 + safe-buffer: 5.1.2 - postcss-normalize-display-values@7.0.0(postcss@8.4.47): + strip-ansi@6.0.1: dependencies: - postcss: 8.4.47 - postcss-value-parser: 4.2.0 + ansi-regex: 5.0.1 - postcss-normalize-positions@7.0.0(postcss@8.4.47): + strip-ansi@7.1.2: dependencies: - postcss: 8.4.47 - postcss-value-parser: 4.2.0 + ansi-regex: 5.0.1 - postcss-normalize-repeat-style@7.0.0(postcss@8.4.47): + strip-indent@3.0.0: dependencies: - postcss: 8.4.47 - postcss-value-parser: 4.2.0 + min-indent: 1.0.1 - postcss-normalize-string@7.0.0(postcss@8.4.47): + supertap@3.0.1: dependencies: - postcss: 8.4.47 - postcss-value-parser: 4.2.0 + indent-string: 5.0.0 + js-yaml: 3.14.2 + serialize-error: 7.0.1 + strip-ansi: 7.1.2 - postcss-normalize-timing-functions@7.0.0(postcss@8.4.47): + supports-color@5.5.0: dependencies: - postcss: 8.4.47 - postcss-value-parser: 4.2.0 + has-flag: 3.0.0 - postcss-normalize-unicode@7.0.2(postcss@8.4.47): + supports-color@7.2.0: dependencies: - browserslist: 4.24.0 - postcss: 8.4.47 - postcss-value-parser: 4.2.0 + has-flag: 4.0.0 - postcss-normalize-url@7.0.0(postcss@8.4.47): - dependencies: - postcss: 8.4.47 - postcss-value-parser: 4.2.0 + supports-preserve-symlinks-flag@1.0.0: {} - postcss-normalize-whitespace@7.0.0(postcss@8.4.47): + table@6.9.0: dependencies: - postcss: 8.4.47 - postcss-value-parser: 4.2.0 + ajv: 8.20.0 + lodash.truncate: 4.4.2 + slice-ansi: 4.0.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 - postcss-ordered-values@7.0.1(postcss@8.4.47): + tar-fs@3.1.2: dependencies: - cssnano-utils: 5.0.0(postcss@8.4.47) - postcss: 8.4.47 - postcss-value-parser: 4.2.0 + pump: 3.0.3 + tar-stream: 3.1.7 + optionalDependencies: + bare-fs: 4.5.2 + bare-path: 3.0.0 + transitivePeerDependencies: + - bare-abort-controller + - bare-buffer + - react-native-b4a - postcss-reduce-initial@7.0.2(postcss@8.4.47): + tar-stream@3.1.7: dependencies: - browserslist: 4.24.0 - caniuse-api: 3.0.0 - postcss: 8.4.47 + b4a: 1.7.3 + fast-fifo: 1.3.2 + streamx: 2.23.0 + transitivePeerDependencies: + - bare-abort-controller + - react-native-b4a - postcss-reduce-transforms@7.0.0(postcss@8.4.47): + tar@7.5.13: dependencies: - postcss: 8.4.47 - postcss-value-parser: 4.2.0 + '@isaacs/fs-minipass': 4.0.1 + chownr: 3.0.0 + minipass: 7.1.2 + minizlib: 3.1.0 + yallist: 5.0.0 - postcss-selector-parser@6.1.2: - dependencies: - cssesc: 3.0.0 - util-deprecate: 1.0.2 + temp-dir@3.0.0: {} - postcss-svgo@7.0.1(postcss@8.4.47): + text-decoder@1.2.3: dependencies: - postcss: 8.4.47 - postcss-value-parser: 4.2.0 - svgo: 3.3.2 + b4a: 1.7.3 + transitivePeerDependencies: + - react-native-b4a - postcss-unique-selectors@7.0.3(postcss@8.4.47): + through2@2.0.5: dependencies: - postcss: 8.4.47 - postcss-selector-parser: 6.1.2 + readable-stream: 2.3.8 + xtend: 4.0.2 - postcss-value-parser@4.2.0: {} + time-zone@1.0.0: {} - postcss@8.4.47: + to-regex-range@5.0.1: dependencies: - nanoid: 3.3.7 - picocolors: 1.1.0 - source-map-js: 1.2.1 + is-number: 7.0.0 - pprof-format@2.1.0: {} + toidentifier@1.0.1: {} - pretty-bytes@6.1.1: {} + tr46@0.0.3: {} - protobufjs@7.5.4: - dependencies: - '@protobufjs/aspromise': 1.1.2 - '@protobufjs/base64': 1.1.2 - '@protobufjs/codegen': 2.0.4 - '@protobufjs/eventemitter': 1.1.0 - '@protobufjs/fetch': 1.1.0 - '@protobufjs/float': 1.0.2 - '@protobufjs/inquire': 1.1.0 - '@protobufjs/path': 1.1.2 - '@protobufjs/pool': 1.1.0 - '@protobufjs/utf8': 1.1.0 - '@types/node': 22.5.5 - long: 5.3.2 + trim-newlines@3.0.1: {} - proxy-from-env@1.1.0: {} + tslib@2.8.1: {} - queue-microtask@1.2.3: {} + type-fest@0.13.1: {} - regenerator-runtime@0.13.11: {} + type-fest@0.18.1: {} - require-directory@2.1.1: {} + type-fest@0.6.0: {} - require-in-the-middle@7.5.2: - dependencies: - debug: 4.3.7 - module-details-from-path: 1.0.4 - resolve: 1.22.8 - transitivePeerDependencies: - - supports-color + type-fest@0.8.1: {} - resolve@1.22.8: - dependencies: - is-core-module: 2.15.1 - path-parse: 1.0.7 - supports-preserve-symlinks-flag: 1.0.0 + typed-query-selector@2.12.1: {} - reusify@1.0.4: {} + typescript-compiler@1.4.1-2: {} - rollup-plugin-dts@6.1.1(rollup@3.29.5)(typescript@5.6.2): - dependencies: - magic-string: 0.30.11 - rollup: 3.29.5 - typescript: 5.6.2 - optionalDependencies: - '@babel/code-frame': 7.24.7 + typescript@4.4.4: {} - rollup@3.29.5: - optionalDependencies: - fsevents: 2.3.3 + undici-types@7.16.0: {} - run-parallel@1.2.0: + unicode-canonical-property-names-ecmascript@2.0.1: {} + + unicode-match-property-ecmascript@2.0.0: dependencies: - queue-microtask: 1.2.3 + unicode-canonical-property-names-ecmascript: 2.0.1 + unicode-property-aliases-ecmascript: 2.2.0 - scule@1.3.0: {} + unicode-match-property-value-ecmascript@2.2.1: {} - semver@6.3.1: {} + unicode-property-aliases-ecmascript@2.2.0: {} - semver@7.6.3: {} + unicorn-magic@0.3.0: {} - shimmer@1.2.1: {} + unicorn-magic@0.4.0: {} - slash@4.0.0: {} + universal-user-agent@6.0.1: {} - source-map-js@1.2.1: {} + universal-user-agent@7.0.3: {} - source-map@0.7.4: {} + universalify@0.1.2: {} - string-width@4.2.3: - dependencies: - emoji-regex: 8.0.0 - is-fullwidth-code-point: 3.0.0 - strip-ansi: 6.0.1 + untildify@4.0.0: {} - strip-ansi@6.0.1: + update-browserslist-db@1.2.3(browserslist@4.28.2): dependencies: - ansi-regex: 5.0.1 + browserslist: 4.28.2 + escalade: 3.2.0 + picocolors: 1.1.1 - stylehacks@7.0.4(postcss@8.4.47): - dependencies: - browserslist: 4.24.0 - postcss: 8.4.47 - postcss-selector-parser: 6.1.2 + util-deprecate@1.0.2: {} - supports-color@5.5.0: + validate-npm-package-license@3.0.4: dependencies: - has-flag: 3.0.0 + spdx-correct: 3.2.0 + spdx-expression-parse: 3.0.1 - supports-preserve-symlinks-flag@1.0.0: {} + webdriver-bidi-protocol@0.4.1: {} - svgo@3.3.2: - dependencies: - '@trysound/sax': 0.2.0 - commander: 7.2.0 - css-select: 5.1.0 - css-tree: 2.3.1 - css-what: 6.1.0 - csso: 5.0.5 - picocolors: 1.1.0 + webidl-conversions@3.0.1: {} - to-fast-properties@2.0.0: {} + well-known-symbols@2.0.0: {} - to-regex-range@5.0.1: + whatwg-url@5.0.0: dependencies: - is-number: 7.0.0 - - tslib@2.7.0: {} - - typescript@5.6.2: {} - - ufo@1.5.4: {} - - unbuild@2.0.0(typescript@5.6.2): - dependencies: - '@rollup/plugin-alias': 5.1.1(rollup@3.29.5) - '@rollup/plugin-commonjs': 25.0.8(rollup@3.29.5) - '@rollup/plugin-json': 6.1.0(rollup@3.29.5) - '@rollup/plugin-node-resolve': 15.3.0(rollup@3.29.5) - '@rollup/plugin-replace': 5.0.7(rollup@3.29.5) - '@rollup/pluginutils': 5.1.2(rollup@3.29.5) - chalk: 5.3.0 - citty: 0.1.6 - consola: 3.2.3 - defu: 6.1.4 - esbuild: 0.19.12 - globby: 13.2.2 - hookable: 5.5.3 - jiti: 1.21.6 - magic-string: 0.30.11 - mkdist: 1.5.9(typescript@5.6.2) - mlly: 1.7.1 - pathe: 1.1.2 - pkg-types: 1.2.0 - pretty-bytes: 6.1.1 - rollup: 3.29.5 - rollup-plugin-dts: 6.1.1(rollup@3.29.5)(typescript@5.6.2) - scule: 1.3.0 - untyped: 1.5.0 - optionalDependencies: - typescript: 5.6.2 - transitivePeerDependencies: - - sass - - supports-color - - vue-tsc + tr46: 0.0.3 + webidl-conversions: 3.0.1 - undici-types@6.19.8: {} + which-module@2.0.1: {} - untyped@1.5.0: + which@2.0.2: dependencies: - '@babel/core': 7.25.2 - '@babel/standalone': 7.25.6 - '@babel/types': 7.25.6 - defu: 6.1.4 - jiti: 2.0.0 - mri: 1.2.0 - scule: 1.3.0 - transitivePeerDependencies: - - supports-color + isexe: 2.0.0 - update-browserslist-db@1.1.1(browserslist@4.24.0): + wrap-ansi@6.2.0: dependencies: - browserslist: 4.24.0 - escalade: 3.2.0 - picocolors: 1.1.0 - - util-deprecate@1.0.2: {} + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 wrap-ansi@7.0.0: dependencies: @@ -3071,16 +5133,65 @@ snapshots: string-width: 4.2.3 strip-ansi: 6.0.1 + wrap-ansi@9.0.2: + dependencies: + ansi-styles: 6.2.3 + string-width: 7.2.0 + strip-ansi: 7.1.2 + wrappy@1.0.2: {} + write-file-atomic@7.0.1: + dependencies: + signal-exit: 4.1.0 + + ws@8.17.1: {} + x-img-diff-js@0.3.5: {} + xmlbuilder2@4.0.3: + dependencies: + '@oozcitak/dom': 2.0.2 + '@oozcitak/infra': 2.0.2 + '@oozcitak/util': 10.0.0 + js-yaml: 4.1.1 + + xtend@4.0.2: {} + y18n@5.0.8: {} yallist@3.1.1: {} + yallist@4.0.0: {} + + yallist@5.0.0: {} + yargs-parser@21.1.1: {} + yargs@15.4.1: + dependencies: + cliui: 6.0.0 + decamelize: 1.2.0 + find-up: 4.1.0 + get-caller-file: 2.0.5 + require-directory: 2.1.1 + require-main-filename: 2.0.0 + set-blocking: 2.0.0 + string-width: 4.2.3 + which-module: 2.0.1 + y18n: 5.0.8 + yargs-parser: 21.1.1 + + yargs@16.2.0: + dependencies: + cliui: 7.0.4 + escalade: 3.2.0 + get-caller-file: 2.0.5 + require-directory: 2.1.1 + string-width: 4.2.3 + y18n: 5.0.8 + yargs-parser: 21.1.1 + yargs@17.7.2: dependencies: cliui: 8.0.1 @@ -3091,4 +5202,18 @@ snapshots: y18n: 5.0.8 yargs-parser: 21.1.1 - yocto-queue@0.1.0: {} + yargs@18.0.0: + dependencies: + cliui: 9.0.1 + escalade: 3.2.0 + get-caller-file: 2.0.5 + string-width: 7.2.0 + y18n: 5.0.8 + yargs-parser: 21.1.1 + + yauzl@2.10.0: + dependencies: + buffer-crc32: 0.2.13 + fd-slicer: 1.1.0 + + zod@3.25.76: {} diff --git a/reg.json b/reg.json new file mode 100644 index 00000000..8218047e --- /dev/null +++ b/reg.json @@ -0,0 +1 @@ +{"failedItems":["sample.png"],"newItems":[],"deletedItems":[],"passedItems":[],"expectedItems":["sample.png"],"actualItems":["sample.png"],"diffItems":["sample.png"],"actualDir":"./sample/actual","expectedDir":"./sample/expected","diffDir":"./sample/diff"} \ No newline at end of file diff --git a/reg.wasm b/reg.wasm deleted file mode 100755 index 120c97df..00000000 Binary files a/reg.wasm and /dev/null differ diff --git a/report/diff/sample.jpg b/report/diff/sample.jpg new file mode 100644 index 00000000..c4ce99f6 Binary files /dev/null and b/report/diff/sample.jpg differ diff --git a/report/index.html b/report/index.html new file mode 100644 index 00000000..ee587d60 --- /dev/null +++ b/report/index.html @@ -0,0 +1,30 @@ + + + + +
+
+ + + diff --git a/sample/actual/sample0.png b/report/sample/actual/sample.png similarity index 100% rename from sample/actual/sample0.png rename to report/sample/actual/sample.png diff --git a/sample/diff/sample0.png b/report/sample/diff/sample.png similarity index 100% rename from sample/diff/sample0.png rename to report/sample/diff/sample.png diff --git a/sample/expected/sample0.png b/report/sample/expected/sample.png similarity index 100% rename from sample/expected/sample0.png rename to report/sample/expected/sample.png diff --git a/report/worker.js b/report/worker.js new file mode 100644 index 00000000..2da96833 --- /dev/null +++ b/report/worker.js @@ -0,0 +1,2 @@ +self.wasmUrl = '/assets/cv-wasm_browser.wasm'; +importScripts('/static/worker.js', '/assets/cv-wasm_browser.js'); diff --git a/sample/actual/sample1.png b/resource/actual/sample(cal).png similarity index 100% rename from sample/actual/sample1.png rename to resource/actual/sample(cal).png diff --git a/resource/expected/sample(cal).png b/resource/expected/sample(cal).png new file mode 100644 index 00000000..32fd2836 Binary files /dev/null and b/resource/expected/sample(cal).png differ diff --git a/resource/reg.json b/resource/reg.json new file mode 100644 index 00000000..a40fddfb --- /dev/null +++ b/resource/reg.json @@ -0,0 +1 @@ +{"failedItems":["sample.png"],"newItems":[],"deletedItems":[],"passedItems":[],"expectedItems":["sample.png"],"actualItems":["sample.png"],"diffItems":["sample.png"],"actualDir":"./actual","expectedDir":"./expected","diffDir":"./diff"} \ No newline at end of file diff --git a/rust-toolchain.toml b/rust-toolchain.toml deleted file mode 100644 index 35804249..00000000 --- a/rust-toolchain.toml +++ /dev/null @@ -1,3 +0,0 @@ -[toolchain] -channel = "nightly-2025-01-01" -targets = ["wasm32-wasip1-threads"] \ No newline at end of file diff --git a/sample/expected/sample1.png b/sample/actual/sample.png similarity index 100% rename from sample/expected/sample1.png rename to sample/actual/sample.png diff --git a/sample/detector.wasm b/sample/detector.wasm new file mode 100644 index 00000000..2e0ad444 Binary files /dev/null and b/sample/detector.wasm differ diff --git a/sample/diff/sample.png b/sample/diff/sample.png new file mode 100644 index 00000000..186267ac Binary files /dev/null and b/sample/diff/sample.png differ diff --git a/sample/diff/sample0.webp b/sample/diff/sample0.webp deleted file mode 100644 index 4113697e..00000000 Binary files a/sample/diff/sample0.webp and /dev/null differ diff --git a/sample/expected/sample.png b/sample/expected/sample.png new file mode 100644 index 00000000..32fd2836 Binary files /dev/null and b/sample/expected/sample.png differ diff --git a/sample/reg.json b/sample/reg.json new file mode 100644 index 00000000..97ec4287 --- /dev/null +++ b/sample/reg.json @@ -0,0 +1,12 @@ +{ + "failedItems": ["sample.png"], + "newItems":[], + "deletedItems":[], + "passedItems":[], + "expectedItems":["sample.png"], + "actualItems":["sample.png"], + "diffItems":["sample.png"], + "actualDir":"./actual", + "expectedDir":"./expected", + "diffDir":"./diff" +} \ No newline at end of file diff --git a/sample/worker.js b/sample/worker.js new file mode 100644 index 00000000..8784aa16 --- /dev/null +++ b/sample/worker.js @@ -0,0 +1,1575 @@ +self.wasmUrl = './detector.wasm'; + +(function() { + "use strict"; + function isArray(value) { + return !Array.isArray ? getTag(value) === "[object Array]" : Array.isArray(value); + } + const INFINITY = 1 / 0; + function baseToString(value) { + if (typeof value == "string") { + return value; + } + let result = value + ""; + return result == "0" && 1 / value == -INFINITY ? "-0" : result; + } + function toString(value) { + return value == null ? "" : baseToString(value); + } + function isString(value) { + return typeof value === "string"; + } + function isNumber(value) { + return typeof value === "number"; + } + function isBoolean(value) { + return value === true || value === false || isObjectLike(value) && getTag(value) == "[object Boolean]"; + } + function isObject(value) { + return typeof value === "object"; + } + function isObjectLike(value) { + return isObject(value) && value !== null; + } + function isDefined(value) { + return value !== void 0 && value !== null; + } + function isBlank(value) { + return !value.trim().length; + } + function getTag(value) { + return value == null ? value === void 0 ? "[object Undefined]" : "[object Null]" : Object.prototype.toString.call(value); + } + const EXTENDED_SEARCH_UNAVAILABLE = "Extended search is not available"; + const INCORRECT_INDEX_TYPE = "Incorrect 'index' type"; + const LOGICAL_SEARCH_INVALID_QUERY_FOR_KEY = (key) => `Invalid value for key ${key}`; + const PATTERN_LENGTH_TOO_LARGE = (max) => `Pattern length exceeds max of ${max}.`; + const MISSING_KEY_PROPERTY = (name2) => `Missing ${name2} property in key`; + const INVALID_KEY_WEIGHT_VALUE = (key) => `Property 'weight' in key '${key}' must be a positive integer`; + const hasOwn = Object.prototype.hasOwnProperty; + class KeyStore { + constructor(keys) { + this._keys = []; + this._keyMap = {}; + let totalWeight = 0; + keys.forEach((key) => { + let obj = createKey(key); + this._keys.push(obj); + this._keyMap[obj.id] = obj; + totalWeight += obj.weight; + }); + this._keys.forEach((key) => { + key.weight /= totalWeight; + }); + } + get(keyId) { + return this._keyMap[keyId]; + } + keys() { + return this._keys; + } + toJSON() { + return JSON.stringify(this._keys); + } + } + function createKey(key) { + let path = null; + let id = null; + let src = null; + let weight = 1; + let getFn = null; + if (isString(key) || isArray(key)) { + src = key; + path = createKeyPath(key); + id = createKeyId(key); + } else { + if (!hasOwn.call(key, "name")) { + throw new Error(MISSING_KEY_PROPERTY("name")); + } + const name2 = key.name; + src = name2; + if (hasOwn.call(key, "weight")) { + weight = key.weight; + if (weight <= 0) { + throw new Error(INVALID_KEY_WEIGHT_VALUE(name2)); + } + } + path = createKeyPath(name2); + id = createKeyId(name2); + getFn = key.getFn; + } + return { path, id, weight, src, getFn }; + } + function createKeyPath(key) { + return isArray(key) ? key : key.split("."); + } + function createKeyId(key) { + return isArray(key) ? key.join(".") : key; + } + function get(obj, path) { + let list = []; + let arr = false; + const deepGet = (obj2, path2, index) => { + if (!isDefined(obj2)) { + return; + } + if (!path2[index]) { + list.push(obj2); + } else { + let key = path2[index]; + const value = obj2[key]; + if (!isDefined(value)) { + return; + } + if (index === path2.length - 1 && (isString(value) || isNumber(value) || isBoolean(value))) { + list.push(toString(value)); + } else if (isArray(value)) { + arr = true; + for (let i = 0, len = value.length; i < len; i += 1) { + deepGet(value[i], path2, index + 1); + } + } else if (path2.length) { + deepGet(value, path2, index + 1); + } + } + }; + deepGet(obj, isString(path) ? path.split(".") : path, 0); + return arr ? list : list[0]; + } + const MatchOptions = { + // Whether the matches should be included in the result set. When `true`, each record in the result + // set will include the indices of the matched characters. + // These can consequently be used for highlighting purposes. + includeMatches: false, + // When `true`, the matching function will continue to the end of a search pattern even if + // a perfect match has already been located in the string. + findAllMatches: false, + // Minimum number of characters that must be matched before a result is considered a match + minMatchCharLength: 1 + }; + const BasicOptions = { + // When `true`, the algorithm continues searching to the end of the input even if a perfect + // match is found before the end of the same input. + isCaseSensitive: false, + // When true, the matching function will continue to the end of a search pattern even if + includeScore: false, + // List of properties that will be searched. This also supports nested properties. + keys: [], + // Whether to sort the result list, by score + shouldSort: true, + // Default sort function: sort by ascending score, ascending index + sortFn: (a, b) => a.score === b.score ? a.idx < b.idx ? -1 : 1 : a.score < b.score ? -1 : 1 + }; + const FuzzyOptions = { + // Approximately where in the text is the pattern expected to be found? + location: 0, + // At what point does the match algorithm give up. A threshold of '0.0' requires a perfect match + // (of both letters and location), a threshold of '1.0' would match anything. + threshold: 0.6, + // Determines how close the match must be to the fuzzy location (specified above). + // An exact letter match which is 'distance' characters away from the fuzzy location + // would score as a complete mismatch. A distance of '0' requires the match be at + // the exact location specified, a threshold of '1000' would require a perfect match + // to be within 800 characters of the fuzzy location to be found using a 0.8 threshold. + distance: 100 + }; + const AdvancedOptions = { + // When `true`, it enables the use of unix-like search commands + useExtendedSearch: false, + // The get function to use when fetching an object's properties. + // The default will search nested paths *ie foo.bar.baz* + getFn: get, + // When `true`, search will ignore `location` and `distance`, so it won't matter + // where in the string the pattern appears. + // More info: https://fusejs.io/concepts/scoring-theory.html#fuzziness-score + ignoreLocation: false, + // When `true`, the calculation for the relevance score (used for sorting) will + // ignore the field-length norm. + // More info: https://fusejs.io/concepts/scoring-theory.html#field-length-norm + ignoreFieldNorm: false, + // The weight to determine how much field length norm effects scoring. + fieldNormWeight: 1 + }; + var Config = { + ...BasicOptions, + ...MatchOptions, + ...FuzzyOptions, + ...AdvancedOptions + }; + const SPACE = /[^ ]+/g; + function norm(weight = 1, mantissa = 3) { + const cache = /* @__PURE__ */ new Map(); + const m = Math.pow(10, mantissa); + return { + get(value) { + const numTokens = value.match(SPACE).length; + if (cache.has(numTokens)) { + return cache.get(numTokens); + } + const norm2 = 1 / Math.pow(numTokens, 0.5 * weight); + const n = parseFloat(Math.round(norm2 * m) / m); + cache.set(numTokens, n); + return n; + }, + clear() { + cache.clear(); + } + }; + } + class FuseIndex { + constructor({ + getFn = Config.getFn, + fieldNormWeight = Config.fieldNormWeight + } = {}) { + this.norm = norm(fieldNormWeight, 3); + this.getFn = getFn; + this.isCreated = false; + this.setIndexRecords(); + } + setSources(docs = []) { + this.docs = docs; + } + setIndexRecords(records = []) { + this.records = records; + } + setKeys(keys = []) { + this.keys = keys; + this._keysMap = {}; + keys.forEach((key, idx) => { + this._keysMap[key.id] = idx; + }); + } + create() { + if (this.isCreated || !this.docs.length) { + return; + } + this.isCreated = true; + if (isString(this.docs[0])) { + this.docs.forEach((doc, docIndex) => { + this._addString(doc, docIndex); + }); + } else { + this.docs.forEach((doc, docIndex) => { + this._addObject(doc, docIndex); + }); + } + this.norm.clear(); + } + // Adds a doc to the end of the index + add(doc) { + const idx = this.size(); + if (isString(doc)) { + this._addString(doc, idx); + } else { + this._addObject(doc, idx); + } + } + // Removes the doc at the specified index of the index + removeAt(idx) { + this.records.splice(idx, 1); + for (let i = idx, len = this.size(); i < len; i += 1) { + this.records[i].i -= 1; + } + } + getValueForItemAtKeyId(item, keyId) { + return item[this._keysMap[keyId]]; + } + size() { + return this.records.length; + } + _addString(doc, docIndex) { + if (!isDefined(doc) || isBlank(doc)) { + return; + } + let record = { + v: doc, + i: docIndex, + n: this.norm.get(doc) + }; + this.records.push(record); + } + _addObject(doc, docIndex) { + let record = { i: docIndex, $: {} }; + this.keys.forEach((key, keyIndex) => { + let value = key.getFn ? key.getFn(doc) : this.getFn(doc, key.path); + if (!isDefined(value)) { + return; + } + if (isArray(value)) { + let subRecords = []; + const stack = [{ nestedArrIndex: -1, value }]; + while (stack.length) { + const { nestedArrIndex, value: value2 } = stack.pop(); + if (!isDefined(value2)) { + continue; + } + if (isString(value2) && !isBlank(value2)) { + let subRecord = { + v: value2, + i: nestedArrIndex, + n: this.norm.get(value2) + }; + subRecords.push(subRecord); + } else if (isArray(value2)) { + value2.forEach((item, k) => { + stack.push({ + nestedArrIndex: k, + value: item + }); + }); + } else + ; + } + record.$[keyIndex] = subRecords; + } else if (isString(value) && !isBlank(value)) { + let subRecord = { + v: value, + n: this.norm.get(value) + }; + record.$[keyIndex] = subRecord; + } + }); + this.records.push(record); + } + toJSON() { + return { + keys: this.keys, + records: this.records + }; + } + } + function createIndex(keys, docs, { getFn = Config.getFn, fieldNormWeight = Config.fieldNormWeight } = {}) { + const myIndex = new FuseIndex({ getFn, fieldNormWeight }); + myIndex.setKeys(keys.map(createKey)); + myIndex.setSources(docs); + myIndex.create(); + return myIndex; + } + function parseIndex(data, { getFn = Config.getFn, fieldNormWeight = Config.fieldNormWeight } = {}) { + const { keys, records } = data; + const myIndex = new FuseIndex({ getFn, fieldNormWeight }); + myIndex.setKeys(keys); + myIndex.setIndexRecords(records); + return myIndex; + } + function computeScore$1(pattern, { + errors = 0, + currentLocation = 0, + expectedLocation = 0, + distance = Config.distance, + ignoreLocation = Config.ignoreLocation + } = {}) { + const accuracy = errors / pattern.length; + if (ignoreLocation) { + return accuracy; + } + const proximity = Math.abs(expectedLocation - currentLocation); + if (!distance) { + return proximity ? 1 : accuracy; + } + return accuracy + proximity / distance; + } + function convertMaskToIndices(matchmask = [], minMatchCharLength = Config.minMatchCharLength) { + let indices = []; + let start = -1; + let end = -1; + let i = 0; + for (let len = matchmask.length; i < len; i += 1) { + let match = matchmask[i]; + if (match && start === -1) { + start = i; + } else if (!match && start !== -1) { + end = i - 1; + if (end - start + 1 >= minMatchCharLength) { + indices.push([start, end]); + } + start = -1; + } + } + if (matchmask[i - 1] && i - start >= minMatchCharLength) { + indices.push([start, i - 1]); + } + return indices; + } + const MAX_BITS = 32; + function search(text, pattern, patternAlphabet, { + location = Config.location, + distance = Config.distance, + threshold = Config.threshold, + findAllMatches = Config.findAllMatches, + minMatchCharLength = Config.minMatchCharLength, + includeMatches = Config.includeMatches, + ignoreLocation = Config.ignoreLocation + } = {}) { + if (pattern.length > MAX_BITS) { + throw new Error(PATTERN_LENGTH_TOO_LARGE(MAX_BITS)); + } + const patternLen = pattern.length; + const textLen = text.length; + const expectedLocation = Math.max(0, Math.min(location, textLen)); + let currentThreshold = threshold; + let bestLocation = expectedLocation; + const computeMatches = minMatchCharLength > 1 || includeMatches; + const matchMask = computeMatches ? Array(textLen) : []; + let index; + while ((index = text.indexOf(pattern, bestLocation)) > -1) { + let score = computeScore$1(pattern, { + currentLocation: index, + expectedLocation, + distance, + ignoreLocation + }); + currentThreshold = Math.min(score, currentThreshold); + bestLocation = index + patternLen; + if (computeMatches) { + let i = 0; + while (i < patternLen) { + matchMask[index + i] = 1; + i += 1; + } + } + } + bestLocation = -1; + let lastBitArr = []; + let finalScore = 1; + let binMax = patternLen + textLen; + const mask = 1 << patternLen - 1; + for (let i = 0; i < patternLen; i += 1) { + let binMin = 0; + let binMid = binMax; + while (binMin < binMid) { + const score2 = computeScore$1(pattern, { + errors: i, + currentLocation: expectedLocation + binMid, + expectedLocation, + distance, + ignoreLocation + }); + if (score2 <= currentThreshold) { + binMin = binMid; + } else { + binMax = binMid; + } + binMid = Math.floor((binMax - binMin) / 2 + binMin); + } + binMax = binMid; + let start = Math.max(1, expectedLocation - binMid + 1); + let finish = findAllMatches ? textLen : Math.min(expectedLocation + binMid, textLen) + patternLen; + let bitArr = Array(finish + 2); + bitArr[finish + 1] = (1 << i) - 1; + for (let j = finish; j >= start; j -= 1) { + let currentLocation = j - 1; + let charMatch = patternAlphabet[text.charAt(currentLocation)]; + if (computeMatches) { + matchMask[currentLocation] = +!!charMatch; + } + bitArr[j] = (bitArr[j + 1] << 1 | 1) & charMatch; + if (i) { + bitArr[j] |= (lastBitArr[j + 1] | lastBitArr[j]) << 1 | 1 | lastBitArr[j + 1]; + } + if (bitArr[j] & mask) { + finalScore = computeScore$1(pattern, { + errors: i, + currentLocation, + expectedLocation, + distance, + ignoreLocation + }); + if (finalScore <= currentThreshold) { + currentThreshold = finalScore; + bestLocation = currentLocation; + if (bestLocation <= expectedLocation) { + break; + } + start = Math.max(1, 2 * expectedLocation - bestLocation); + } + } + } + const score = computeScore$1(pattern, { + errors: i + 1, + currentLocation: expectedLocation, + expectedLocation, + distance, + ignoreLocation + }); + if (score > currentThreshold) { + break; + } + lastBitArr = bitArr; + } + const result = { + isMatch: bestLocation >= 0, + // Count exact matches (those with a score of 0) to be "almost" exact + score: Math.max(1e-3, finalScore) + }; + if (computeMatches) { + const indices = convertMaskToIndices(matchMask, minMatchCharLength); + if (!indices.length) { + result.isMatch = false; + } else if (includeMatches) { + result.indices = indices; + } + } + return result; + } + function createPatternAlphabet(pattern) { + let mask = {}; + for (let i = 0, len = pattern.length; i < len; i += 1) { + const char = pattern.charAt(i); + mask[char] = (mask[char] || 0) | 1 << len - i - 1; + } + return mask; + } + class BitapSearch { + constructor(pattern, { + location = Config.location, + threshold = Config.threshold, + distance = Config.distance, + includeMatches = Config.includeMatches, + findAllMatches = Config.findAllMatches, + minMatchCharLength = Config.minMatchCharLength, + isCaseSensitive = Config.isCaseSensitive, + ignoreLocation = Config.ignoreLocation + } = {}) { + this.options = { + location, + threshold, + distance, + includeMatches, + findAllMatches, + minMatchCharLength, + isCaseSensitive, + ignoreLocation + }; + this.pattern = isCaseSensitive ? pattern : pattern.toLowerCase(); + this.chunks = []; + if (!this.pattern.length) { + return; + } + const addChunk = (pattern2, startIndex) => { + this.chunks.push({ + pattern: pattern2, + alphabet: createPatternAlphabet(pattern2), + startIndex + }); + }; + const len = this.pattern.length; + if (len > MAX_BITS) { + let i = 0; + const remainder = len % MAX_BITS; + const end = len - remainder; + while (i < end) { + addChunk(this.pattern.substr(i, MAX_BITS), i); + i += MAX_BITS; + } + if (remainder) { + const startIndex = len - MAX_BITS; + addChunk(this.pattern.substr(startIndex), startIndex); + } + } else { + addChunk(this.pattern, 0); + } + } + searchIn(text) { + const { isCaseSensitive, includeMatches } = this.options; + if (!isCaseSensitive) { + text = text.toLowerCase(); + } + if (this.pattern === text) { + let result2 = { + isMatch: true, + score: 0 + }; + if (includeMatches) { + result2.indices = [[0, text.length - 1]]; + } + return result2; + } + const { + location, + distance, + threshold, + findAllMatches, + minMatchCharLength, + ignoreLocation + } = this.options; + let allIndices = []; + let totalScore = 0; + let hasMatches = false; + this.chunks.forEach(({ pattern, alphabet, startIndex }) => { + const { isMatch, score, indices } = search(text, pattern, alphabet, { + location: location + startIndex, + distance, + threshold, + findAllMatches, + minMatchCharLength, + includeMatches, + ignoreLocation + }); + if (isMatch) { + hasMatches = true; + } + totalScore += score; + if (isMatch && indices) { + allIndices = [...allIndices, ...indices]; + } + }); + let result = { + isMatch: hasMatches, + score: hasMatches ? totalScore / this.chunks.length : 1 + }; + if (hasMatches && includeMatches) { + result.indices = allIndices; + } + return result; + } + } + class BaseMatch { + constructor(pattern) { + this.pattern = pattern; + } + static isMultiMatch(pattern) { + return getMatch(pattern, this.multiRegex); + } + static isSingleMatch(pattern) { + return getMatch(pattern, this.singleRegex); + } + search() { + } + } + function getMatch(pattern, exp) { + const matches = pattern.match(exp); + return matches ? matches[1] : null; + } + class ExactMatch extends BaseMatch { + constructor(pattern) { + super(pattern); + } + static get type() { + return "exact"; + } + static get multiRegex() { + return /^="(.*)"$/; + } + static get singleRegex() { + return /^=(.*)$/; + } + search(text) { + const isMatch = text === this.pattern; + return { + isMatch, + score: isMatch ? 0 : 1, + indices: [0, this.pattern.length - 1] + }; + } + } + class InverseExactMatch extends BaseMatch { + constructor(pattern) { + super(pattern); + } + static get type() { + return "inverse-exact"; + } + static get multiRegex() { + return /^!"(.*)"$/; + } + static get singleRegex() { + return /^!(.*)$/; + } + search(text) { + const index = text.indexOf(this.pattern); + const isMatch = index === -1; + return { + isMatch, + score: isMatch ? 0 : 1, + indices: [0, text.length - 1] + }; + } + } + class PrefixExactMatch extends BaseMatch { + constructor(pattern) { + super(pattern); + } + static get type() { + return "prefix-exact"; + } + static get multiRegex() { + return /^\^"(.*)"$/; + } + static get singleRegex() { + return /^\^(.*)$/; + } + search(text) { + const isMatch = text.startsWith(this.pattern); + return { + isMatch, + score: isMatch ? 0 : 1, + indices: [0, this.pattern.length - 1] + }; + } + } + class InversePrefixExactMatch extends BaseMatch { + constructor(pattern) { + super(pattern); + } + static get type() { + return "inverse-prefix-exact"; + } + static get multiRegex() { + return /^!\^"(.*)"$/; + } + static get singleRegex() { + return /^!\^(.*)$/; + } + search(text) { + const isMatch = !text.startsWith(this.pattern); + return { + isMatch, + score: isMatch ? 0 : 1, + indices: [0, text.length - 1] + }; + } + } + class SuffixExactMatch extends BaseMatch { + constructor(pattern) { + super(pattern); + } + static get type() { + return "suffix-exact"; + } + static get multiRegex() { + return /^"(.*)"\$$/; + } + static get singleRegex() { + return /^(.*)\$$/; + } + search(text) { + const isMatch = text.endsWith(this.pattern); + return { + isMatch, + score: isMatch ? 0 : 1, + indices: [text.length - this.pattern.length, text.length - 1] + }; + } + } + class InverseSuffixExactMatch extends BaseMatch { + constructor(pattern) { + super(pattern); + } + static get type() { + return "inverse-suffix-exact"; + } + static get multiRegex() { + return /^!"(.*)"\$$/; + } + static get singleRegex() { + return /^!(.*)\$$/; + } + search(text) { + const isMatch = !text.endsWith(this.pattern); + return { + isMatch, + score: isMatch ? 0 : 1, + indices: [0, text.length - 1] + }; + } + } + class FuzzyMatch extends BaseMatch { + constructor(pattern, { + location = Config.location, + threshold = Config.threshold, + distance = Config.distance, + includeMatches = Config.includeMatches, + findAllMatches = Config.findAllMatches, + minMatchCharLength = Config.minMatchCharLength, + isCaseSensitive = Config.isCaseSensitive, + ignoreLocation = Config.ignoreLocation + } = {}) { + super(pattern); + this._bitapSearch = new BitapSearch(pattern, { + location, + threshold, + distance, + includeMatches, + findAllMatches, + minMatchCharLength, + isCaseSensitive, + ignoreLocation + }); + } + static get type() { + return "fuzzy"; + } + static get multiRegex() { + return /^"(.*)"$/; + } + static get singleRegex() { + return /^(.*)$/; + } + search(text) { + return this._bitapSearch.searchIn(text); + } + } + class IncludeMatch extends BaseMatch { + constructor(pattern) { + super(pattern); + } + static get type() { + return "include"; + } + static get multiRegex() { + return /^'"(.*)"$/; + } + static get singleRegex() { + return /^'(.*)$/; + } + search(text) { + let location = 0; + let index; + const indices = []; + const patternLen = this.pattern.length; + while ((index = text.indexOf(this.pattern, location)) > -1) { + location = index + patternLen; + indices.push([index, location - 1]); + } + const isMatch = !!indices.length; + return { + isMatch, + score: isMatch ? 0 : 1, + indices + }; + } + } + const searchers = [ + ExactMatch, + IncludeMatch, + PrefixExactMatch, + InversePrefixExactMatch, + InverseSuffixExactMatch, + SuffixExactMatch, + InverseExactMatch, + FuzzyMatch + ]; + const searchersLen = searchers.length; + const SPACE_RE = / +(?=(?:[^\"]*\"[^\"]*\")*[^\"]*$)/; + const OR_TOKEN = "|"; + function parseQuery(pattern, options = {}) { + return pattern.split(OR_TOKEN).map((item) => { + let query = item.trim().split(SPACE_RE).filter((item2) => item2 && !!item2.trim()); + let results = []; + for (let i = 0, len = query.length; i < len; i += 1) { + const queryItem = query[i]; + let found = false; + let idx = -1; + while (!found && ++idx < searchersLen) { + const searcher = searchers[idx]; + let token = searcher.isMultiMatch(queryItem); + if (token) { + results.push(new searcher(token, options)); + found = true; + } + } + if (found) { + continue; + } + idx = -1; + while (++idx < searchersLen) { + const searcher = searchers[idx]; + let token = searcher.isSingleMatch(queryItem); + if (token) { + results.push(new searcher(token, options)); + break; + } + } + } + return results; + }); + } + const MultiMatchSet = /* @__PURE__ */ new Set([FuzzyMatch.type, IncludeMatch.type]); + class ExtendedSearch { + constructor(pattern, { + isCaseSensitive = Config.isCaseSensitive, + includeMatches = Config.includeMatches, + minMatchCharLength = Config.minMatchCharLength, + ignoreLocation = Config.ignoreLocation, + findAllMatches = Config.findAllMatches, + location = Config.location, + threshold = Config.threshold, + distance = Config.distance + } = {}) { + this.query = null; + this.options = { + isCaseSensitive, + includeMatches, + minMatchCharLength, + findAllMatches, + ignoreLocation, + location, + threshold, + distance + }; + this.pattern = isCaseSensitive ? pattern : pattern.toLowerCase(); + this.query = parseQuery(this.pattern, this.options); + } + static condition(_, options) { + return options.useExtendedSearch; + } + searchIn(text) { + const query = this.query; + if (!query) { + return { + isMatch: false, + score: 1 + }; + } + const { includeMatches, isCaseSensitive } = this.options; + text = isCaseSensitive ? text : text.toLowerCase(); + let numMatches = 0; + let allIndices = []; + let totalScore = 0; + for (let i = 0, qLen = query.length; i < qLen; i += 1) { + const searchers2 = query[i]; + allIndices.length = 0; + numMatches = 0; + for (let j = 0, pLen = searchers2.length; j < pLen; j += 1) { + const searcher = searchers2[j]; + const { isMatch, indices, score } = searcher.search(text); + if (isMatch) { + numMatches += 1; + totalScore += score; + if (includeMatches) { + const type = searcher.constructor.type; + if (MultiMatchSet.has(type)) { + allIndices = [...allIndices, ...indices]; + } else { + allIndices.push(indices); + } + } + } else { + totalScore = 0; + numMatches = 0; + allIndices.length = 0; + break; + } + } + if (numMatches) { + let result = { + isMatch: true, + score: totalScore / numMatches + }; + if (includeMatches) { + result.indices = allIndices; + } + return result; + } + } + return { + isMatch: false, + score: 1 + }; + } + } + const registeredSearchers = []; + function register(...args) { + registeredSearchers.push(...args); + } + function createSearcher(pattern, options) { + for (let i = 0, len = registeredSearchers.length; i < len; i += 1) { + let searcherClass = registeredSearchers[i]; + if (searcherClass.condition(pattern, options)) { + return new searcherClass(pattern, options); + } + } + return new BitapSearch(pattern, options); + } + const LogicalOperator = { + AND: "$and", + OR: "$or" + }; + const KeyType = { + PATH: "$path", + PATTERN: "$val" + }; + const isExpression = (query) => !!(query[LogicalOperator.AND] || query[LogicalOperator.OR]); + const isPath = (query) => !!query[KeyType.PATH]; + const isLeaf = (query) => !isArray(query) && isObject(query) && !isExpression(query); + const convertToExplicit = (query) => ({ + [LogicalOperator.AND]: Object.keys(query).map((key) => ({ + [key]: query[key] + })) + }); + function parse(query, options, { auto = true } = {}) { + const next = (query2) => { + let keys = Object.keys(query2); + const isQueryPath = isPath(query2); + if (!isQueryPath && keys.length > 1 && !isExpression(query2)) { + return next(convertToExplicit(query2)); + } + if (isLeaf(query2)) { + const key = isQueryPath ? query2[KeyType.PATH] : keys[0]; + const pattern = isQueryPath ? query2[KeyType.PATTERN] : query2[key]; + if (!isString(pattern)) { + throw new Error(LOGICAL_SEARCH_INVALID_QUERY_FOR_KEY(key)); + } + const obj = { + keyId: createKeyId(key), + pattern + }; + if (auto) { + obj.searcher = createSearcher(pattern, options); + } + return obj; + } + let node = { + children: [], + operator: keys[0] + }; + keys.forEach((key) => { + const value = query2[key]; + if (isArray(value)) { + value.forEach((item) => { + node.children.push(next(item)); + }); + } + }); + return node; + }; + if (!isExpression(query)) { + query = convertToExplicit(query); + } + return next(query); + } + function computeScore(results, { ignoreFieldNorm = Config.ignoreFieldNorm }) { + results.forEach((result) => { + let totalScore = 1; + result.matches.forEach(({ key, norm: norm2, score }) => { + const weight = key ? key.weight : null; + totalScore *= Math.pow( + score === 0 && weight ? Number.EPSILON : score, + (weight || 1) * (ignoreFieldNorm ? 1 : norm2) + ); + }); + result.score = totalScore; + }); + } + function transformMatches(result, data) { + const matches = result.matches; + data.matches = []; + if (!isDefined(matches)) { + return; + } + matches.forEach((match) => { + if (!isDefined(match.indices) || !match.indices.length) { + return; + } + const { indices, value } = match; + let obj = { + indices, + value + }; + if (match.key) { + obj.key = match.key.src; + } + if (match.idx > -1) { + obj.refIndex = match.idx; + } + data.matches.push(obj); + }); + } + function transformScore(result, data) { + data.score = result.score; + } + function format(results, docs, { + includeMatches = Config.includeMatches, + includeScore = Config.includeScore + } = {}) { + const transformers = []; + if (includeMatches) + transformers.push(transformMatches); + if (includeScore) + transformers.push(transformScore); + return results.map((result) => { + const { idx } = result; + const data = { + item: docs[idx], + refIndex: idx + }; + if (transformers.length) { + transformers.forEach((transformer) => { + transformer(result, data); + }); + } + return data; + }); + } + class Fuse { + constructor(docs, options = {}, index) { + this.options = { ...Config, ...options }; + if (this.options.useExtendedSearch && false) { + throw new Error(EXTENDED_SEARCH_UNAVAILABLE); + } + this._keyStore = new KeyStore(this.options.keys); + this.setCollection(docs, index); + } + setCollection(docs, index) { + this._docs = docs; + if (index && !(index instanceof FuseIndex)) { + throw new Error(INCORRECT_INDEX_TYPE); + } + this._myIndex = index || createIndex(this.options.keys, this._docs, { + getFn: this.options.getFn, + fieldNormWeight: this.options.fieldNormWeight + }); + } + add(doc) { + if (!isDefined(doc)) { + return; + } + this._docs.push(doc); + this._myIndex.add(doc); + } + remove(predicate = () => false) { + const results = []; + for (let i = 0, len = this._docs.length; i < len; i += 1) { + const doc = this._docs[i]; + if (predicate(doc, i)) { + this.removeAt(i); + i -= 1; + len -= 1; + results.push(doc); + } + } + return results; + } + removeAt(idx) { + this._docs.splice(idx, 1); + this._myIndex.removeAt(idx); + } + getIndex() { + return this._myIndex; + } + search(query, { limit = -1 } = {}) { + const { + includeMatches, + includeScore, + shouldSort, + sortFn, + ignoreFieldNorm + } = this.options; + let results = isString(query) ? isString(this._docs[0]) ? this._searchStringList(query) : this._searchObjectList(query) : this._searchLogical(query); + computeScore(results, { ignoreFieldNorm }); + if (shouldSort) { + results.sort(sortFn); + } + if (isNumber(limit) && limit > -1) { + results = results.slice(0, limit); + } + return format(results, this._docs, { + includeMatches, + includeScore + }); + } + _searchStringList(query) { + const searcher = createSearcher(query, this.options); + const { records } = this._myIndex; + const results = []; + records.forEach(({ v: text, i: idx, n: norm2 }) => { + if (!isDefined(text)) { + return; + } + const { isMatch, score, indices } = searcher.searchIn(text); + if (isMatch) { + results.push({ + item: text, + idx, + matches: [{ score, value: text, norm: norm2, indices }] + }); + } + }); + return results; + } + _searchLogical(query) { + const expression = parse(query, this.options); + const evaluate = (node, item, idx) => { + if (!node.children) { + const { keyId, searcher } = node; + const matches = this._findMatches({ + key: this._keyStore.get(keyId), + value: this._myIndex.getValueForItemAtKeyId(item, keyId), + searcher + }); + if (matches && matches.length) { + return [ + { + idx, + item, + matches + } + ]; + } + return []; + } + const res = []; + for (let i = 0, len = node.children.length; i < len; i += 1) { + const child = node.children[i]; + const result = evaluate(child, item, idx); + if (result.length) { + res.push(...result); + } else if (node.operator === LogicalOperator.AND) { + return []; + } + } + return res; + }; + const records = this._myIndex.records; + const resultMap = {}; + const results = []; + records.forEach(({ $: item, i: idx }) => { + if (isDefined(item)) { + let expResults = evaluate(expression, item, idx); + if (expResults.length) { + if (!resultMap[idx]) { + resultMap[idx] = { idx, item, matches: [] }; + results.push(resultMap[idx]); + } + expResults.forEach(({ matches }) => { + resultMap[idx].matches.push(...matches); + }); + } + } + }); + return results; + } + _searchObjectList(query) { + const searcher = createSearcher(query, this.options); + const { keys, records } = this._myIndex; + const results = []; + records.forEach(({ $: item, i: idx }) => { + if (!isDefined(item)) { + return; + } + let matches = []; + keys.forEach((key, keyIndex) => { + matches.push( + ...this._findMatches({ + key, + value: item[keyIndex], + searcher + }) + ); + }); + if (matches.length) { + results.push({ + idx, + item, + matches + }); + } + }); + return results; + } + _findMatches({ key, value, searcher }) { + if (!isDefined(value)) { + return []; + } + let matches = []; + if (isArray(value)) { + value.forEach(({ v: text, i: idx, n: norm2 }) => { + if (!isDefined(text)) { + return; + } + const { isMatch, score, indices } = searcher.searchIn(text); + if (isMatch) { + matches.push({ + score, + key, + value: text, + idx, + norm: norm2, + indices + }); + } + }); + } else { + const { v: text, n: norm2 } = value; + const { isMatch, score, indices } = searcher.searchIn(text); + if (isMatch) { + matches.push({ score, key, value: text, norm: norm2, indices }); + } + } + return matches; + } + } + Fuse.version = "7.0.0"; + Fuse.createIndex = createIndex; + Fuse.parseIndex = parseIndex; + Fuse.config = Config; + { + Fuse.parseQuery = parse; + } + { + register(ExtendedSearch); + } + const name = "x-img-diff-js"; + const version = "0.3.5"; + const main = "src/index.js"; + const description = "compare 2 images considering into translation"; + const scripts = { + build: "docker-compose run --rm emcc && npm run build:demo", + test: "node test/test_node.js", + "build:demo": "cp -rf build demo", + start: "cd demo; http-server -p 8000", + "gen:postjs": "babel binding-gen/post.js > bindings/post.js", + deploy: "npm run build:demo && gh-pages -d demo" + }; + const repository = { + type: "git", + url: "git+https://github.com/reg-viz/x-img-diff-js.git" + }; + const author = "Quramy"; + const license = "MIT"; + const bugs = { + url: "https://github.com/reg-viz/x-img-diff-js/issues" + }; + const homepage = "https://github.com/reg-viz/x-img-diff-js#readme"; + const devDependencies = { + "babel-cli": "^6.26.0", + "babel-core": "^6.26.0", + "babel-preset-es2015": "^6.24.1", + "gh-pages": "^1.0.0", + "http-server": "^0.10.0", + pngjs: "^3.3.0" + }; + const packageJson = { + name, + version, + main, + description, + scripts, + repository, + author, + license, + bugs, + homepage, + devDependencies + }; + function instantiateCachedURL(dbVersion, url, importObject) { + const dbName = "wasm-cache"; + const storeName = "wasm-cache"; + function openDatabase() { + return new Promise((resolve, reject) => { + const request = indexedDB.open(dbName, dbVersion); + request.onerror = reject.bind(null, "Error opening wasm cache database"); + request.onsuccess = () => { + resolve(request.result); + }; + request.onupgradeneeded = (event) => { + const db = request.result; + if (db.objectStoreNames.contains(storeName)) { + console.log(`Clearing out version ${event.oldVersion} wasm cache`); + db.deleteObjectStore(storeName); + } + console.log(`Creating version ${event.newVersion} wasm cache`); + db.createObjectStore(storeName); + }; + }); + } + function lookupInDatabase(db) { + return new Promise((resolve, reject) => { + const store = db.transaction([storeName]).objectStore(storeName); + const request = store.get(url); + request.onerror = reject.bind(null, `Error getting wasm module ${url}`); + request.onsuccess = () => { + if (request.result) { + resolve(request.result); + } else { + reject(`Module ${url} was not found in wasm cache`); + } + }; + }); + } + function storeInDatabase(db, module) { + const store = db.transaction([storeName], "readwrite").objectStore(storeName); + try { + const request = store.put(module, url); + request.onerror = (err) => { + console.log(`Failed to store in wasm cache: ${err}`); + }; + request.onsuccess = () => { + console.log(`Successfully stored ${url} in wasm cache`); + }; + } catch (e) { + console.warn("An error was thrown... in storing wasm cache..."); + console.warn(e); + } + } + async function fetchAndInstantiate() { + const response = await fetch(url); + const buffer = await response.arrayBuffer(); + return await WebAssembly.instantiate(buffer, importObject); + } + return openDatabase().then( + (db) => { + return lookupInDatabase(db).then( + (module) => { + console.log(`Found ${url} in wasm cache`); + return WebAssembly.instantiate(module, importObject); + }, + (errMsg) => { + console.log(errMsg); + return fetchAndInstantiate().then((results) => { + setTimeout(() => storeInDatabase(db, results.module), 0); + return results.instance; + }); + } + ); + }, + (errMsg) => { + console.log(errMsg); + return fetchAndInstantiate().then((results) => results.instance); + } + ); + } + class ModuleClass { + constructor({ init, version: version2, wasmUrl }) { + this._init = init; + this._version = version2; + this._wasmUrl = wasmUrl; + } + locateFile(baseName) { + return self.location.pathname.replace(/\[^\/]*$/, "/") + baseName; + } + instantiateWasm(imports, callback) { + instantiateCachedURL(this._version, this._wasmUrl, imports).then( + (instance) => callback(instance) + ); + return {}; + } + onInit(callback) { + this._init = callback; + } + onRuntimeInitialized() { + if (this._init) { + return this._init(this); + } + } + } + var WorkerEventType = /* @__PURE__ */ ((WorkerEventType2) => { + WorkerEventType2["INIT_CALC"] = "init"; + WorkerEventType2["REQUEST_CALC"] = "req_calc"; + WorkerEventType2["RESULT_CALC"] = "res_calc"; + WorkerEventType2["INIT_FILTER"] = "init_filter"; + WorkerEventType2["REQUEST_FILTER"] = "req_filter"; + WorkerEventType2["RESULT_FILTER"] = "res_filter"; + return WorkerEventType2; + })(WorkerEventType || {}); + const ximgdiffVersionString = packageJson.version; + const _self = self; + function version2number(version2) { + const [, major, minor, patch] = version2.match(/^(\d*)\.(\d*)\.(\d*)/); + return +major * 1e4 + +minor * 100 + +patch; + } + let loaded = false; + let lastCalcData = null; + const cachedEntity = { + new: [], + passed: [], + failed: [], + deleted: [] + }; + const calc = ({ + payload: { raw, img1, img2, actualSrc, expectedSrc, seq } + }) => { + const diffResult = _self.Module.detectDiff(_self.Module, img1, img2, {}); + _self.postMessage({ + type: WorkerEventType.RESULT_CALC, + payload: { + seq, + raw, + actualSrc, + expectedSrc, + result: { + ...diffResult, + images: [ + { width: img1.width, height: img1.height }, + { width: img2.width, height: img2.height } + ] + } + } + }); + }; + const filter = ({ + payload: { input } + }) => { + if (!input) { + return _self.postMessage({ + type: WorkerEventType.RESULT_FILTER, + payload: { + newItems: cachedEntity.new, + passedItems: cachedEntity.passed, + failedItems: cachedEntity.failed, + deletedItems: cachedEntity.deleted + } + }); + } + const search2 = (entities) => { + const fuse = new Fuse(entities, { + shouldSort: false, + isCaseSensitive: false, + findAllMatches: true, + location: 0, + distance: 100, + minMatchCharLength: 1, + threshold: 0.2, + keys: ["name"] + }); + return fuse.search(input).map(({ item }) => item); + }; + _self.postMessage({ + type: WorkerEventType.RESULT_FILTER, + payload: { + newItems: search2(cachedEntity.new), + passedItems: search2(cachedEntity.passed), + failedItems: search2(cachedEntity.failed), + deletedItems: search2(cachedEntity.deleted) + } + }); + }; + _self.Module = new ModuleClass({ + version: version2number(ximgdiffVersionString), + wasmUrl: _self.wasmUrl, + init: () => { + loaded = true; + if (lastCalcData != null) { + calc(lastCalcData); + } + _self.postMessage({ type: WorkerEventType.INIT_CALC }); + } + }); + _self.addEventListener("message", ({ data }) => { + console.log("Received: ", data); + switch (data.type) { + case WorkerEventType.REQUEST_CALC: + if (loaded) { + calc(data); + } else { + lastCalcData = data; + } + break; + case WorkerEventType.INIT_FILTER: + cachedEntity.new = data.payload.newItems; + cachedEntity.passed = data.payload.passedItems; + cachedEntity.failed = data.payload.failedItems; + cachedEntity.deleted = data.payload.deletedItems; + break; + case WorkerEventType.REQUEST_FILTER: + filter(data); + break; + } + }); +})(); + +var Module;if(!Module)Module=(typeof cv!=="undefined"?cv:null)||{};var moduleOverrides={};for(var key in Module){if(Module.hasOwnProperty(key)){moduleOverrides[key]=Module[key]}}var ENVIRONMENT_IS_WEB=false;var ENVIRONMENT_IS_WORKER=false;var ENVIRONMENT_IS_NODE=false;var ENVIRONMENT_IS_SHELL=false;if(Module["ENVIRONMENT"]){if(Module["ENVIRONMENT"]==="WEB"){ENVIRONMENT_IS_WEB=true}else if(Module["ENVIRONMENT"]==="WORKER"){ENVIRONMENT_IS_WORKER=true}else if(Module["ENVIRONMENT"]==="NODE"){ENVIRONMENT_IS_NODE=true}else if(Module["ENVIRONMENT"]==="SHELL"){ENVIRONMENT_IS_SHELL=true}else{throw new Error("The provided Module['ENVIRONMENT'] value is not valid. It must be one of: WEB|WORKER|NODE|SHELL.")}}else{ENVIRONMENT_IS_WEB=typeof window==="object";ENVIRONMENT_IS_WORKER=typeof importScripts==="function";ENVIRONMENT_IS_NODE=typeof process==="object"&&typeof require==="function"&&!ENVIRONMENT_IS_WEB&&!ENVIRONMENT_IS_WORKER;ENVIRONMENT_IS_SHELL=!ENVIRONMENT_IS_WEB&&!ENVIRONMENT_IS_NODE&&!ENVIRONMENT_IS_WORKER}if(ENVIRONMENT_IS_NODE){if(!Module["print"])Module["print"]=console.log;if(!Module["printErr"])Module["printErr"]=console.warn;var nodeFS;var nodePath;Module["read"]=function shell_read(filename,binary){if(!nodeFS)nodeFS=require("fs");if(!nodePath)nodePath=require("path");filename=nodePath["normalize"](filename);var ret=nodeFS["readFileSync"](filename);return binary?ret:ret.toString()};Module["readBinary"]=function readBinary(filename){var ret=Module["read"](filename,true);if(!ret.buffer){ret=new Uint8Array(ret)}assert(ret.buffer);return ret};Module["load"]=function load(f){globalEval(read(f))};if(!Module["thisProgram"]){if(process["argv"].length>1){Module["thisProgram"]=process["argv"][1].replace(/\\/g,"/")}else{Module["thisProgram"]="unknown-program"}}Module["arguments"]=process["argv"].slice(2);if(typeof module!=="undefined"){module["exports"]=Module}process["on"]("uncaughtException",(function(ex){if(!(ex instanceof ExitStatus)){throw ex}}));Module["inspect"]=(function(){return"[Emscripten Module object]"})}else if(ENVIRONMENT_IS_SHELL){if(!Module["print"])Module["print"]=print;if(typeof printErr!="undefined")Module["printErr"]=printErr;if(typeof read!="undefined"){Module["read"]=read}else{Module["read"]=function shell_read(){throw"no read() available"}}Module["readBinary"]=function readBinary(f){if(typeof readbuffer==="function"){return new Uint8Array(readbuffer(f))}var data=read(f,"binary");assert(typeof data==="object");return data};if(typeof scriptArgs!="undefined"){Module["arguments"]=scriptArgs}else if(typeof arguments!="undefined"){Module["arguments"]=arguments}if(typeof quit==="function"){Module["quit"]=(function(status,toThrow){quit(status)})}}else if(ENVIRONMENT_IS_WEB||ENVIRONMENT_IS_WORKER){Module["read"]=function shell_read(url){var xhr=new XMLHttpRequest;xhr.open("GET",url,false);xhr.send(null);return xhr.responseText};if(ENVIRONMENT_IS_WORKER){Module["readBinary"]=function readBinary(url){var xhr=new XMLHttpRequest;xhr.open("GET",url,false);xhr.responseType="arraybuffer";xhr.send(null);return new Uint8Array(xhr.response)}}Module["readAsync"]=function readAsync(url,onload,onerror){var xhr=new XMLHttpRequest;xhr.open("GET",url,true);xhr.responseType="arraybuffer";xhr.onload=function xhr_onload(){if(xhr.status==200||xhr.status==0&&xhr.response){onload(xhr.response)}else{onerror()}};xhr.onerror=onerror;xhr.send(null)};if(typeof arguments!="undefined"){Module["arguments"]=arguments}if(typeof console!=="undefined"){if(!Module["print"])Module["print"]=function shell_print(x){console.log(x)};if(!Module["printErr"])Module["printErr"]=function shell_printErr(x){console.warn(x)}}else{var TRY_USE_DUMP=false;if(!Module["print"])Module["print"]=TRY_USE_DUMP&&typeof dump!=="undefined"?(function(x){dump(x)}):(function(x){})}if(ENVIRONMENT_IS_WORKER){Module["load"]=importScripts}if(typeof Module["setWindowTitle"]==="undefined"){Module["setWindowTitle"]=(function(title){document.title=title})}}else{throw"Unknown runtime environment. Where are we?"}function globalEval(x){eval.call(null,x)}if(!Module["load"]&&Module["read"]){Module["load"]=function load(f){globalEval(Module["read"](f))}}if(!Module["print"]){Module["print"]=(function(){})}if(!Module["printErr"]){Module["printErr"]=Module["print"]}if(!Module["arguments"]){Module["arguments"]=[]}if(!Module["thisProgram"]){Module["thisProgram"]="./this.program"}if(!Module["quit"]){Module["quit"]=(function(status,toThrow){throw toThrow})}Module.print=Module["print"];Module.printErr=Module["printErr"];Module["preRun"]=[];Module["postRun"]=[];for(var key in moduleOverrides){if(moduleOverrides.hasOwnProperty(key)){Module[key]=moduleOverrides[key]}}moduleOverrides=undefined;var Runtime={setTempRet0:(function(value){tempRet0=value;return value}),getTempRet0:(function(){return tempRet0}),stackSave:(function(){return STACKTOP}),stackRestore:(function(stackTop){STACKTOP=stackTop}),getNativeTypeSize:(function(type){switch(type){case"i1":case"i8":return 1;case"i16":return 2;case"i32":return 4;case"i64":return 8;case"float":return 4;case"double":return 8;default:{if(type[type.length-1]==="*"){return Runtime.QUANTUM_SIZE}else if(type[0]==="i"){var bits=parseInt(type.substr(1));assert(bits%8===0);return bits/8}else{return 0}}}}),getNativeFieldSize:(function(type){return Math.max(Runtime.getNativeTypeSize(type),Runtime.QUANTUM_SIZE)}),STACK_ALIGN:16,prepVararg:(function(ptr,type){if(type==="double"||type==="i64"){if(ptr&7){assert((ptr&7)===4);ptr+=4}}else{assert((ptr&3)===0)}return ptr}),getAlignSize:(function(type,size,vararg){if(!vararg&&(type=="i64"||type=="double"))return 8;if(!type)return Math.min(size,8);return Math.min(size||(type?Runtime.getNativeFieldSize(type):0),Runtime.QUANTUM_SIZE)}),dynCall:(function(sig,ptr,args){if(args&&args.length){return Module["dynCall_"+sig].apply(null,[ptr].concat(args))}else{return Module["dynCall_"+sig].call(null,ptr)}}),functionPointers:[],addFunction:(function(func){for(var i=0;i>2];var end=(ret+size+15|0)&-16;HEAP32[DYNAMICTOP_PTR>>2]=end;if(end>=TOTAL_MEMORY){var success=enlargeMemory();if(!success){HEAP32[DYNAMICTOP_PTR>>2]=ret;return 0}}return ret}),alignMemory:(function(size,quantum){var ret=size=Math.ceil(size/(quantum?quantum:16))*(quantum?quantum:16);return ret}),makeBigInt:(function(low,high,unsigned){var ret=unsigned?+(low>>>0)+ +(high>>>0)*4294967296:+(low>>>0)+ +(high|0)*4294967296;return ret}),GLOBAL_BASE:1024,QUANTUM_SIZE:4,__dummy__:0};Module["Runtime"]=Runtime;var ABORT=0;var EXITSTATUS=0;function assert(condition,text){if(!condition){abort("Assertion failed: "+text)}}function getCFunc(ident){var func=Module["_"+ident];if(!func){try{func=eval("_"+ident)}catch(e){}}assert(func,"Cannot call unknown function "+ident+" (perhaps LLVM optimizations or closure removed it?)");return func}var cwrap,ccall;((function(){var JSfuncs={"stackSave":(function(){Runtime.stackSave()}),"stackRestore":(function(){Runtime.stackRestore()}),"arrayToC":(function(arr){var ret=Runtime.stackAlloc(arr.length);writeArrayToMemory(arr,ret);return ret}),"stringToC":(function(str){var ret=0;if(str!==null&&str!==undefined&&str!==0){var len=(str.length<<2)+1;ret=Runtime.stackAlloc(len);stringToUTF8(str,ret,len)}return ret})};var toC={"string":JSfuncs["stringToC"],"array":JSfuncs["arrayToC"]};ccall=function ccallFunc(ident,returnType,argTypes,args,opts){var func=getCFunc(ident);var cArgs=[];var stack=0;if(args){for(var i=0;i>0]=value;break;case"i8":HEAP8[ptr>>0]=value;break;case"i16":HEAP16[ptr>>1]=value;break;case"i32":HEAP32[ptr>>2]=value;break;case"i64":tempI64=[value>>>0,(tempDouble=value,+Math_abs(tempDouble)>=1?tempDouble>0?(Math_min(+Math_floor(tempDouble/4294967296),4294967295)|0)>>>0:~~+Math_ceil((tempDouble- +(~~tempDouble>>>0))/4294967296)>>>0:0)],HEAP32[ptr>>2]=tempI64[0],HEAP32[ptr+4>>2]=tempI64[1];break;case"float":HEAPF32[ptr>>2]=value;break;case"double":HEAPF64[ptr>>3]=value;break;default:abort("invalid type for setValue: "+type)}}Module["setValue"]=setValue;function getValue(ptr,type,noSafe){type=type||"i8";if(type.charAt(type.length-1)==="*")type="i32";switch(type){case"i1":return HEAP8[ptr>>0];case"i8":return HEAP8[ptr>>0];case"i16":return HEAP16[ptr>>1];case"i32":return HEAP32[ptr>>2];case"i64":return HEAP32[ptr>>2];case"float":return HEAPF32[ptr>>2];case"double":return HEAPF64[ptr>>3];default:abort("invalid type for setValue: "+type)}return null}Module["getValue"]=getValue;var ALLOC_NORMAL=0;var ALLOC_STACK=1;var ALLOC_STATIC=2;var ALLOC_DYNAMIC=3;var ALLOC_NONE=4;Module["ALLOC_NORMAL"]=ALLOC_NORMAL;Module["ALLOC_STACK"]=ALLOC_STACK;Module["ALLOC_STATIC"]=ALLOC_STATIC;Module["ALLOC_DYNAMIC"]=ALLOC_DYNAMIC;Module["ALLOC_NONE"]=ALLOC_NONE;function allocate(slab,types,allocator,ptr){var zeroinit,size;if(typeof slab==="number"){zeroinit=true;size=slab}else{zeroinit=false;size=slab.length}var singleType=typeof types==="string"?types:null;var ret;if(allocator==ALLOC_NONE){ret=ptr}else{ret=[typeof _malloc==="function"?_malloc:Runtime.staticAlloc,Runtime.stackAlloc,Runtime.staticAlloc,Runtime.dynamicAlloc][allocator===undefined?ALLOC_STATIC:allocator](Math.max(size,singleType?1:types.length))}if(zeroinit){var ptr=ret,stop;assert((ret&3)==0);stop=ret+(size&~3);for(;ptr>2]=0}stop=ret+size;while(ptr>0]=0}return ret}if(singleType==="i8"){if(slab.subarray||slab.slice){HEAPU8.set(slab,ret)}else{HEAPU8.set(new Uint8Array(slab),ret)}return ret}var i=0,type,typeSize,previousType;while(i>0];hasUtf|=t;if(t==0&&!length)break;i++;if(length&&i==length)break}if(!length)length=i;var ret="";if(hasUtf<128){var MAX_CHUNK=1024;var curr;while(length>0){curr=String.fromCharCode.apply(String,HEAPU8.subarray(ptr,ptr+Math.min(length,MAX_CHUNK)));ret=ret?ret+curr:curr;ptr+=MAX_CHUNK;length-=MAX_CHUNK}return ret}return Module["UTF8ToString"](ptr)}Module["Pointer_stringify"]=Pointer_stringify;function AsciiToString(ptr){var str="";while(1){var ch=HEAP8[ptr++>>0];if(!ch)return str;str+=String.fromCharCode(ch)}}Module["AsciiToString"]=AsciiToString;function stringToAscii(str,outPtr){return writeAsciiToMemory(str,outPtr,false)}Module["stringToAscii"]=stringToAscii;var UTF8Decoder=typeof TextDecoder!=="undefined"?new TextDecoder("utf8"):undefined;function UTF8ArrayToString(u8Array,idx){var endPtr=idx;while(u8Array[endPtr])++endPtr;if(endPtr-idx>16&&u8Array.subarray&&UTF8Decoder){return UTF8Decoder.decode(u8Array.subarray(idx,endPtr))}else{var u0,u1,u2,u3,u4,u5;var str="";while(1){u0=u8Array[idx++];if(!u0)return str;if(!(u0&128)){str+=String.fromCharCode(u0);continue}u1=u8Array[idx++]&63;if((u0&224)==192){str+=String.fromCharCode((u0&31)<<6|u1);continue}u2=u8Array[idx++]&63;if((u0&240)==224){u0=(u0&15)<<12|u1<<6|u2}else{u3=u8Array[idx++]&63;if((u0&248)==240){u0=(u0&7)<<18|u1<<12|u2<<6|u3}else{u4=u8Array[idx++]&63;if((u0&252)==248){u0=(u0&3)<<24|u1<<18|u2<<12|u3<<6|u4}else{u5=u8Array[idx++]&63;u0=(u0&1)<<30|u1<<24|u2<<18|u3<<12|u4<<6|u5}}}if(u0<65536){str+=String.fromCharCode(u0)}else{var ch=u0-65536;str+=String.fromCharCode(55296|ch>>10,56320|ch&1023)}}}}Module["UTF8ArrayToString"]=UTF8ArrayToString;function UTF8ToString(ptr){return UTF8ArrayToString(HEAPU8,ptr)}Module["UTF8ToString"]=UTF8ToString;function stringToUTF8Array(str,outU8Array,outIdx,maxBytesToWrite){if(!(maxBytesToWrite>0))return 0;var startIdx=outIdx;var endIdx=outIdx+maxBytesToWrite-1;for(var i=0;i=55296&&u<=57343)u=65536+((u&1023)<<10)|str.charCodeAt(++i)&1023;if(u<=127){if(outIdx>=endIdx)break;outU8Array[outIdx++]=u}else if(u<=2047){if(outIdx+1>=endIdx)break;outU8Array[outIdx++]=192|u>>6;outU8Array[outIdx++]=128|u&63}else if(u<=65535){if(outIdx+2>=endIdx)break;outU8Array[outIdx++]=224|u>>12;outU8Array[outIdx++]=128|u>>6&63;outU8Array[outIdx++]=128|u&63}else if(u<=2097151){if(outIdx+3>=endIdx)break;outU8Array[outIdx++]=240|u>>18;outU8Array[outIdx++]=128|u>>12&63;outU8Array[outIdx++]=128|u>>6&63;outU8Array[outIdx++]=128|u&63}else if(u<=67108863){if(outIdx+4>=endIdx)break;outU8Array[outIdx++]=248|u>>24;outU8Array[outIdx++]=128|u>>18&63;outU8Array[outIdx++]=128|u>>12&63;outU8Array[outIdx++]=128|u>>6&63;outU8Array[outIdx++]=128|u&63}else{if(outIdx+5>=endIdx)break;outU8Array[outIdx++]=252|u>>30;outU8Array[outIdx++]=128|u>>24&63;outU8Array[outIdx++]=128|u>>18&63;outU8Array[outIdx++]=128|u>>12&63;outU8Array[outIdx++]=128|u>>6&63;outU8Array[outIdx++]=128|u&63}}outU8Array[outIdx]=0;return outIdx-startIdx}Module["stringToUTF8Array"]=stringToUTF8Array;function stringToUTF8(str,outPtr,maxBytesToWrite){return stringToUTF8Array(str,HEAPU8,outPtr,maxBytesToWrite)}Module["stringToUTF8"]=stringToUTF8;function lengthBytesUTF8(str){var len=0;for(var i=0;i=55296&&u<=57343)u=65536+((u&1023)<<10)|str.charCodeAt(++i)&1023;if(u<=127){++len}else if(u<=2047){len+=2}else if(u<=65535){len+=3}else if(u<=2097151){len+=4}else if(u<=67108863){len+=5}else{len+=6}}return len}Module["lengthBytesUTF8"]=lengthBytesUTF8;var UTF16Decoder=typeof TextDecoder!=="undefined"?new TextDecoder("utf-16le"):undefined;function demangle(func){var __cxa_demangle_func=Module["___cxa_demangle"]||Module["__cxa_demangle"];if(__cxa_demangle_func){try{var s=func.substr(1);var len=lengthBytesUTF8(s)+1;var buf=_malloc(len);stringToUTF8(s,buf,len);var status=_malloc(4);var ret=__cxa_demangle_func(buf,0,0,status);if(getValue(status,"i32")===0&&ret){return Pointer_stringify(ret)}}catch(e){}finally{if(buf)_free(buf);if(status)_free(status);if(ret)_free(ret)}return func}Runtime.warnOnce("warning: build with -s DEMANGLE_SUPPORT=1 to link in libcxxabi demangling");return func}function demangleAll(text){var regex=/__Z[\w\d_]+/g;return text.replace(regex,(function(x){var y=demangle(x);return x===y?x:x+" ["+y+"]"}))}function jsStackTrace(){var err=new Error;if(!err.stack){try{throw new Error(0)}catch(e){err=e}if(!err.stack){return"(no stack trace available)"}}return err.stack.toString()}function stackTrace(){var js=jsStackTrace();if(Module["extraStackTrace"])js+="\n"+Module["extraStackTrace"]();return demangleAll(js)}Module["stackTrace"]=stackTrace;var WASM_PAGE_SIZE=65536;var ASMJS_PAGE_SIZE=16777216;var MIN_TOTAL_MEMORY=16777216;function alignUp(x,multiple){if(x%multiple>0){x+=multiple-x%multiple}return x}var HEAP,buffer,HEAP8,HEAPU8,HEAP16,HEAPU16,HEAP32,HEAPU32,HEAPF32,HEAPF64;function updateGlobalBuffer(buf){Module["buffer"]=buffer=buf}function updateGlobalBufferViews(){Module["HEAP8"]=HEAP8=new Int8Array(buffer);Module["HEAP16"]=HEAP16=new Int16Array(buffer);Module["HEAP32"]=HEAP32=new Int32Array(buffer);Module["HEAPU8"]=HEAPU8=new Uint8Array(buffer);Module["HEAPU16"]=HEAPU16=new Uint16Array(buffer);Module["HEAPU32"]=HEAPU32=new Uint32Array(buffer);Module["HEAPF32"]=HEAPF32=new Float32Array(buffer);Module["HEAPF64"]=HEAPF64=new Float64Array(buffer)}var STATIC_BASE,STATICTOP,staticSealed;var STACK_BASE,STACKTOP,STACK_MAX;var DYNAMIC_BASE,DYNAMICTOP_PTR;STATIC_BASE=STATICTOP=STACK_BASE=STACKTOP=STACK_MAX=DYNAMIC_BASE=DYNAMICTOP_PTR=0;staticSealed=false;function abortOnCannotGrowMemory(){abort("Cannot enlarge memory arrays. Either (1) compile with -s TOTAL_MEMORY=X with X higher than the current value "+TOTAL_MEMORY+", (2) compile with -s ALLOW_MEMORY_GROWTH=1 which allows increasing the size at runtime, or (3) if you want malloc to return NULL (0) instead of this abort, compile with -s ABORTING_MALLOC=0 ")}if(!Module["reallocBuffer"])Module["reallocBuffer"]=(function(size){var ret;try{if(ArrayBuffer.transfer){ret=ArrayBuffer.transfer(buffer,size)}else{var oldHEAP8=HEAP8;ret=new ArrayBuffer(size);var temp=new Int8Array(ret);temp.set(oldHEAP8)}}catch(e){return false}var success=_emscripten_replace_memory(ret);if(!success)return false;return ret});function enlargeMemory(){var PAGE_MULTIPLE=Module["usingWasm"]?WASM_PAGE_SIZE:ASMJS_PAGE_SIZE;var LIMIT=2147483648-PAGE_MULTIPLE;if(HEAP32[DYNAMICTOP_PTR>>2]>LIMIT){return false}var OLD_TOTAL_MEMORY=TOTAL_MEMORY;TOTAL_MEMORY=Math.max(TOTAL_MEMORY,MIN_TOTAL_MEMORY);while(TOTAL_MEMORY>2]){if(TOTAL_MEMORY<=536870912){TOTAL_MEMORY=alignUp(2*TOTAL_MEMORY,PAGE_MULTIPLE)}else{TOTAL_MEMORY=Math.min(alignUp((3*TOTAL_MEMORY+2147483648)/4,PAGE_MULTIPLE),LIMIT)}}var replacement=Module["reallocBuffer"](TOTAL_MEMORY);if(!replacement||replacement.byteLength!=TOTAL_MEMORY){TOTAL_MEMORY=OLD_TOTAL_MEMORY;return false}updateGlobalBuffer(replacement);updateGlobalBufferViews();return true}var byteLength;try{byteLength=Function.prototype.call.bind(Object.getOwnPropertyDescriptor(ArrayBuffer.prototype,"byteLength").get);byteLength(new ArrayBuffer(4))}catch(e){byteLength=(function(buffer){return buffer.byteLength})}var TOTAL_STACK=Module["TOTAL_STACK"]||5242880;var TOTAL_MEMORY=Module["TOTAL_MEMORY"]||134217728;if(TOTAL_MEMORY0){var callback=callbacks.shift();if(typeof callback=="function"){callback();continue}var func=callback.func;if(typeof func==="number"){if(callback.arg===undefined){Module["dynCall_v"](func)}else{Module["dynCall_vi"](func,callback.arg)}}else{func(callback.arg===undefined?null:callback.arg)}}}var __ATPRERUN__=[];var __ATINIT__=[];var __ATMAIN__=[];var __ATEXIT__=[];var __ATPOSTRUN__=[];var runtimeInitialized=false;var runtimeExited=false;function preRun(){if(Module["preRun"]){if(typeof Module["preRun"]=="function")Module["preRun"]=[Module["preRun"]];while(Module["preRun"].length){addOnPreRun(Module["preRun"].shift())}}callRuntimeCallbacks(__ATPRERUN__)}function ensureInitRuntime(){if(runtimeInitialized)return;runtimeInitialized=true;callRuntimeCallbacks(__ATINIT__)}function preMain(){callRuntimeCallbacks(__ATMAIN__)}function exitRuntime(){callRuntimeCallbacks(__ATEXIT__);runtimeExited=true}function postRun(){if(Module["postRun"]){if(typeof Module["postRun"]=="function")Module["postRun"]=[Module["postRun"]];while(Module["postRun"].length){addOnPostRun(Module["postRun"].shift())}}callRuntimeCallbacks(__ATPOSTRUN__)}function addOnPreRun(cb){__ATPRERUN__.unshift(cb)}Module["addOnPreRun"]=addOnPreRun;function addOnInit(cb){__ATINIT__.unshift(cb)}Module["addOnInit"]=addOnInit;function addOnPreMain(cb){__ATMAIN__.unshift(cb)}Module["addOnPreMain"]=addOnPreMain;function addOnExit(cb){__ATEXIT__.unshift(cb)}Module["addOnExit"]=addOnExit;function addOnPostRun(cb){__ATPOSTRUN__.unshift(cb)}Module["addOnPostRun"]=addOnPostRun;function intArrayFromString(stringy,dontAddNull,length){var len=length>0?length:lengthBytesUTF8(stringy)+1;var u8array=new Array(len);var numBytesWritten=stringToUTF8Array(stringy,u8array,0,u8array.length);if(dontAddNull)u8array.length=numBytesWritten;return u8array}Module["intArrayFromString"]=intArrayFromString;function intArrayToString(array){var ret=[];for(var i=0;i255){chr&=255}ret.push(String.fromCharCode(chr))}return ret.join("")}Module["intArrayToString"]=intArrayToString;function writeStringToMemory(string,buffer,dontAddNull){Runtime.warnOnce("writeStringToMemory is deprecated and should not be called! Use stringToUTF8() instead!");var lastChar,end;if(dontAddNull){end=buffer+lengthBytesUTF8(string);lastChar=HEAP8[end]}stringToUTF8(string,buffer,Infinity);if(dontAddNull)HEAP8[end]=lastChar}Module["writeStringToMemory"]=writeStringToMemory;function writeArrayToMemory(array,buffer){HEAP8.set(array,buffer)}Module["writeArrayToMemory"]=writeArrayToMemory;function writeAsciiToMemory(str,buffer,dontAddNull){for(var i=0;i>0]=str.charCodeAt(i)}if(!dontAddNull)HEAP8[buffer>>0]=0}Module["writeAsciiToMemory"]=writeAsciiToMemory;if(!Math["imul"]||Math["imul"](4294967295,5)!==-5)Math["imul"]=function imul(a,b){var ah=a>>>16;var al=a&65535;var bh=b>>>16;var bl=b&65535;return al*bl+(ah*bl+al*bh<<16)|0};Math.imul=Math["imul"];if(!Math["fround"]){var froundBuffer=new Float32Array(1);Math["fround"]=(function(x){froundBuffer[0]=x;return froundBuffer[0]})}Math.fround=Math["fround"];if(!Math["clz32"])Math["clz32"]=(function(x){x=x>>>0;for(var i=0;i<32;i++){if(x&1<<31-i)return i}return 32});Math.clz32=Math["clz32"];if(!Math["trunc"])Math["trunc"]=(function(x){return x<0?Math.ceil(x):Math.floor(x)});Math.trunc=Math["trunc"];var Math_abs=Math.abs;var Math_cos=Math.cos;var Math_sin=Math.sin;var Math_tan=Math.tan;var Math_acos=Math.acos;var Math_asin=Math.asin;var Math_atan=Math.atan;var Math_atan2=Math.atan2;var Math_exp=Math.exp;var Math_log=Math.log;var Math_sqrt=Math.sqrt;var Math_ceil=Math.ceil;var Math_floor=Math.floor;var Math_pow=Math.pow;var Math_imul=Math.imul;var Math_fround=Math.fround;var Math_round=Math.round;var Math_min=Math.min;var Math_clz32=Math.clz32;var Math_trunc=Math.trunc;var runDependencies=0;var runDependencyWatcher=null;var dependenciesFulfilled=null;function getUniqueRunDependency(id){return id}function addRunDependency(id){runDependencies++;if(Module["monitorRunDependencies"]){Module["monitorRunDependencies"](runDependencies)}}Module["addRunDependency"]=addRunDependency;function removeRunDependency(id){runDependencies--;if(Module["monitorRunDependencies"]){Module["monitorRunDependencies"](runDependencies)}if(runDependencies==0){if(runDependencyWatcher!==null){clearInterval(runDependencyWatcher);runDependencyWatcher=null}if(dependenciesFulfilled){var callback=dependenciesFulfilled;dependenciesFulfilled=null;callback()}}}Module["removeRunDependency"]=removeRunDependency;Module["preloadedImages"]={};Module["preloadedAudios"]={};var memoryInitializer=null;function integrateWasmJS(Module){var method=Module["wasmJSMethod"]||"native-wasm";Module["wasmJSMethod"]=method;var wasmTextFile=Module["wasmTextFile"]||"cv-wasm_browser.wast";var wasmBinaryFile=Module["wasmBinaryFile"]||"cv-wasm_browser.wasm";var asmjsCodeFile=Module["asmjsCodeFile"]||"cv-wasm_browser.temp.asm.js";if(typeof Module["locateFile"]==="function"){wasmTextFile=Module["locateFile"](wasmTextFile);wasmBinaryFile=Module["locateFile"](wasmBinaryFile);asmjsCodeFile=Module["locateFile"](asmjsCodeFile)}var wasmPageSize=64*1024;var asm2wasmImports={"f64-rem":(function(x,y){return x%y}),"f64-to-int":(function(x){return x|0}),"i32s-div":(function(x,y){return(x|0)/(y|0)|0}),"i32u-div":(function(x,y){return(x>>>0)/(y>>>0)>>>0}),"i32s-rem":(function(x,y){return(x|0)%(y|0)|0}),"i32u-rem":(function(x,y){return(x>>>0)%(y>>>0)>>>0}),"debugger":(function(){debugger})};var info={"global":null,"env":null,"asm2wasm":asm2wasmImports,"parent":Module};var exports=null;function lookupImport(mod,base){var lookup=info;if(mod.indexOf(".")<0){lookup=(lookup||{})[mod]}else{var parts=mod.split(".");lookup=(lookup||{})[parts[0]];lookup=(lookup||{})[parts[1]]}if(base){lookup=(lookup||{})[base]}if(lookup===undefined){abort("bad lookupImport to ("+mod+")."+base)}return lookup}function mergeMemory(newBuffer){var oldBuffer=Module["buffer"];if(newBuffer.byteLength=0||Module["wasmJSMethod"].indexOf("interpret-asm2wasm")>=0?"cv-wasm_browser.js.mem":null;var STATIC_BUMP=671600;Module["STATIC_BASE"]=STATIC_BASE;Module["STATIC_BUMP"]=STATIC_BUMP;var tempDoublePtr=STATICTOP;STATICTOP+=16;var emval_symbols={};function embind_init_charCodes(){var codes=new Array(256);for(var i=0;i<256;++i){codes[i]=String.fromCharCode(i)}embind_charCodes=codes}var embind_charCodes=undefined;function readLatin1String(ptr){var ret="";var c=ptr;while(HEAPU8[c]){ret+=embind_charCodes[HEAPU8[c++]]}return ret}function getStringOrSymbol(address){var symbol=emval_symbols[address];if(symbol===undefined){return readLatin1String(address)}else{return symbol}}var emval_free_list=[];var emval_handle_array=[{},{value:undefined},{value:null},{value:true},{value:false}];function count_emval_handles(){var count=0;for(var i=5;i0);info.refcount--;if(info.refcount===0&&!info.rethrown){if(info.destructor){Module["dynCall_vi"](info.destructor,ptr)}delete EXCEPTIONS.infos[ptr];___cxa_free_exception(ptr)}}),clearRef:(function(ptr){if(!ptr)return;var info=EXCEPTIONS.infos[ptr];info.refcount=0})};function ___resumeException(ptr){if(!EXCEPTIONS.last){EXCEPTIONS.last=ptr}throw ptr+" - Exception catching is disabled, this exception cannot be caught. Compile with -s DISABLE_EXCEPTION_CATCHING=0 or DISABLE_EXCEPTION_CATCHING=2 to catch."}function ___cxa_find_matching_catch(){var thrown=EXCEPTIONS.last;if(!thrown){return(Runtime.setTempRet0(0),0)|0}var info=EXCEPTIONS.infos[thrown];var throwntype=info.type;if(!throwntype){return(Runtime.setTempRet0(0),thrown)|0}var typeArray=Array.prototype.slice.call(arguments);var pointer=Module["___cxa_is_pointer_type"](throwntype);if(!___cxa_find_matching_catch.buffer)___cxa_find_matching_catch.buffer=_malloc(4);HEAP32[___cxa_find_matching_catch.buffer>>2]=thrown;thrown=___cxa_find_matching_catch.buffer;for(var i=0;i>2];info.adjusted=thrown;return(Runtime.setTempRet0(typeArray[i]),thrown)|0}}thrown=HEAP32[thrown>>2];return(Runtime.setTempRet0(throwntype),thrown)|0}function ___cxa_throw(ptr,type,destructor){EXCEPTIONS.infos[ptr]={ptr:ptr,adjusted:ptr,type:type,destructor:destructor,refcount:0,caught:false,rethrown:false};EXCEPTIONS.last=ptr;if(!("uncaught_exception"in __ZSt18uncaught_exceptionv)){__ZSt18uncaught_exceptionv.uncaught_exception=1}else{__ZSt18uncaught_exceptionv.uncaught_exception++}throw ptr+" - Exception catching is disabled, this exception cannot be caught. Compile with -s DISABLE_EXCEPTION_CATCHING=0 or DISABLE_EXCEPTION_CATCHING=2 to catch."}function getShiftFromSize(size){switch(size){case 1:return 0;case 2:return 1;case 4:return 2;case 8:return 3;default:throw new TypeError("Unknown type size: "+size)}}var awaitingDependencies={};var registeredTypes={};var typeDependencies={};var char_0=48;var char_9=57;function makeLegalFunctionName(name){if(undefined===name){return"_unknown"}name=name.replace(/[^a-zA-Z0-9_]/g,"$");var f=name.charCodeAt(0);if(f>=char_0&&f<=char_9){return"_"+name}else{return name}}function createNamedFunction(name,body){name=makeLegalFunctionName(name);return(new Function("body","return function "+name+"() {\n"+' "use strict";'+" return body.apply(this, arguments);\n"+"};\n"))(body)}function extendError(baseErrorType,errorName){var errorClass=createNamedFunction(errorName,(function(message){this.name=errorName;this.message=message;var stack=(new Error(message)).stack;if(stack!==undefined){this.stack=this.toString()+"\n"+stack.replace(/^Error(:[^\n]*)?\n/,"")}}));errorClass.prototype=Object.create(baseErrorType.prototype);errorClass.prototype.constructor=errorClass;errorClass.prototype.toString=(function(){if(this.message===undefined){return this.name}else{return this.name+": "+this.message}});return errorClass}var BindingError=undefined;function throwBindingError(message){throw new BindingError(message)}var InternalError=undefined;function throwInternalError(message){throw new InternalError(message)}function whenDependentTypesAreResolved(myTypes,dependentTypes,getTypeConverters){myTypes.forEach((function(type){typeDependencies[type]=dependentTypes}));function onComplete(typeConverters){var myTypeConverters=getTypeConverters(typeConverters);if(myTypeConverters.length!==myTypes.length){throwInternalError("Mismatched type converter count")}for(var i=0;i>shift])}),destructorFunction:null})}function simpleReadValueFromPointer(pointer){return this["fromWireType"](HEAPU32[pointer>>2])}function __embind_register_std_string(rawType,name){name=readLatin1String(name);registerType(rawType,{name:name,"fromWireType":(function(value){var length=HEAPU32[value>>2];var a=new Array(length);for(var i=0;i>2]=length;for(var i=0;i255){_free(ptr);throwBindingError("String has UTF-16 code units that do not fit in 8 bits")}HEAPU8[ptr+4+i]=charCode}if(destructors!==null){destructors.push(_free,ptr)}return ptr}),"argPackAdvance":8,"readValueFromPointer":simpleReadValueFromPointer,destructorFunction:(function(ptr){_free(ptr)})})}function _embind_repr(v){if(v===null){return"null"}var t=typeof v;if(t==="object"||t==="array"||t==="function"){return v.toString()}else{return""+v}}function integerReadValueFromPointer(name,shift,signed){switch(shift){case 0:return signed?function readS8FromPointer(pointer){return HEAP8[pointer]}:function readU8FromPointer(pointer){return HEAPU8[pointer]};case 1:return signed?function readS16FromPointer(pointer){return HEAP16[pointer>>1]}:function readU16FromPointer(pointer){return HEAPU16[pointer>>1]};case 2:return signed?function readS32FromPointer(pointer){return HEAP32[pointer>>2]}:function readU32FromPointer(pointer){return HEAPU32[pointer>>2]};default:throw new TypeError("Unknown integer type: "+name)}}function __embind_register_integer(primitiveType,name,size,minRange,maxRange){name=readLatin1String(name);if(maxRange===-1){maxRange=4294967295}var shift=getShiftFromSize(size);var fromWireType=(function(value){return value});if(minRange===0){var bitshift=32-8*size;fromWireType=(function(value){return value<>>bitshift})}var isUnsignedType=name.indexOf("unsigned")!=-1;registerType(primitiveType,{name:name,"fromWireType":fromWireType,"toWireType":(function(destructors,value){if(typeof value!=="number"&&typeof value!=="boolean"){throw new TypeError('Cannot convert "'+_embind_repr(value)+'" to '+this.name)}if(valuemaxRange){throw new TypeError('Passing a number "'+_embind_repr(value)+'" from JS side to C/C++ side to an argument of type "'+name+'", which is outside the valid range ['+minRange+", "+maxRange+"]!")}return isUnsignedType?value>>>0:value|0}),"argPackAdvance":8,"readValueFromPointer":integerReadValueFromPointer(name,shift,minRange!==0),destructorFunction:null})}function _pthread_mutex_init(){}function __emval_decref(handle){if(handle>4&&0===--emval_handle_array[handle].refcount){emval_handle_array[handle]=undefined;emval_free_list.push(handle)}}var PTHREAD_SPECIFIC={};var PTHREAD_SPECIFIC_NEXT_KEY=1;var ERRNO_CODES={EPERM:1,ENOENT:2,ESRCH:3,EINTR:4,EIO:5,ENXIO:6,E2BIG:7,ENOEXEC:8,EBADF:9,ECHILD:10,EAGAIN:11,EWOULDBLOCK:11,ENOMEM:12,EACCES:13,EFAULT:14,ENOTBLK:15,EBUSY:16,EEXIST:17,EXDEV:18,ENODEV:19,ENOTDIR:20,EISDIR:21,EINVAL:22,ENFILE:23,EMFILE:24,ENOTTY:25,ETXTBSY:26,EFBIG:27,ENOSPC:28,ESPIPE:29,EROFS:30,EMLINK:31,EPIPE:32,EDOM:33,ERANGE:34,ENOMSG:42,EIDRM:43,ECHRNG:44,EL2NSYNC:45,EL3HLT:46,EL3RST:47,ELNRNG:48,EUNATCH:49,ENOCSI:50,EL2HLT:51,EDEADLK:35,ENOLCK:37,EBADE:52,EBADR:53,EXFULL:54,ENOANO:55,EBADRQC:56,EBADSLT:57,EDEADLOCK:35,EBFONT:59,ENOSTR:60,ENODATA:61,ETIME:62,ENOSR:63,ENONET:64,ENOPKG:65,EREMOTE:66,ENOLINK:67,EADV:68,ESRMNT:69,ECOMM:70,EPROTO:71,EMULTIHOP:72,EDOTDOT:73,EBADMSG:74,ENOTUNIQ:76,EBADFD:77,EREMCHG:78,ELIBACC:79,ELIBBAD:80,ELIBSCN:81,ELIBMAX:82,ELIBEXEC:83,ENOSYS:38,ENOTEMPTY:39,ENAMETOOLONG:36,ELOOP:40,EOPNOTSUPP:95,EPFNOSUPPORT:96,ECONNRESET:104,ENOBUFS:105,EAFNOSUPPORT:97,EPROTOTYPE:91,ENOTSOCK:88,ENOPROTOOPT:92,ESHUTDOWN:108,ECONNREFUSED:111,EADDRINUSE:98,ECONNABORTED:103,ENETUNREACH:101,ENETDOWN:100,ETIMEDOUT:110,EHOSTDOWN:112,EHOSTUNREACH:113,EINPROGRESS:115,EALREADY:114,EDESTADDRREQ:89,EMSGSIZE:90,EPROTONOSUPPORT:93,ESOCKTNOSUPPORT:94,EADDRNOTAVAIL:99,ENETRESET:102,EISCONN:106,ENOTCONN:107,ETOOMANYREFS:109,EUSERS:87,EDQUOT:122,ESTALE:116,ENOTSUP:95,ENOMEDIUM:123,EILSEQ:84,EOVERFLOW:75,ECANCELED:125,ENOTRECOVERABLE:131,EOWNERDEAD:130,ESTRPIPE:86};function _pthread_key_create(key,destructor){if(key==0){return ERRNO_CODES.EINVAL}HEAP32[key>>2]=PTHREAD_SPECIFIC_NEXT_KEY;PTHREAD_SPECIFIC[PTHREAD_SPECIFIC_NEXT_KEY]=0;PTHREAD_SPECIFIC_NEXT_KEY++;return 0}function getTypeName(type){var ptr=___getTypeName(type);var rv=readLatin1String(ptr);_free(ptr);return rv}function requireRegisteredType(rawType,humanName){var impl=registeredTypes[rawType];if(undefined===impl){throwBindingError(humanName+" has unknown type "+getTypeName(rawType))}return impl}function __emval_take_value(type,argv){type=requireRegisteredType(type,"_emval_take_value");var v=type["readValueFromPointer"](argv);return __emval_register(v)}var _llvm_pow_f32=Math_pow;var ERRNO_MESSAGES={0:"Success",1:"Not super-user",2:"No such file or directory",3:"No such process",4:"Interrupted system call",5:"I/O error",6:"No such device or address",7:"Arg list too long",8:"Exec format error",9:"Bad file number",10:"No children",11:"No more processes",12:"Not enough core",13:"Permission denied",14:"Bad address",15:"Block device required",16:"Mount device busy",17:"File exists",18:"Cross-device link",19:"No such device",20:"Not a directory",21:"Is a directory",22:"Invalid argument",23:"Too many open files in system",24:"Too many open files",25:"Not a typewriter",26:"Text file busy",27:"File too large",28:"No space left on device",29:"Illegal seek",30:"Read only file system",31:"Too many links",32:"Broken pipe",33:"Math arg out of domain of func",34:"Math result not representable",35:"File locking deadlock error",36:"File or path name too long",37:"No record locks available",38:"Function not implemented",39:"Directory not empty",40:"Too many symbolic links",42:"No message of desired type",43:"Identifier removed",44:"Channel number out of range",45:"Level 2 not synchronized",46:"Level 3 halted",47:"Level 3 reset",48:"Link number out of range",49:"Protocol driver not attached",50:"No CSI structure available",51:"Level 2 halted",52:"Invalid exchange",53:"Invalid request descriptor",54:"Exchange full",55:"No anode",56:"Invalid request code",57:"Invalid slot",59:"Bad font file fmt",60:"Device not a stream",61:"No data (for no delay io)",62:"Timer expired",63:"Out of streams resources",64:"Machine is not on the network",65:"Package not installed",66:"The object is remote",67:"The link has been severed",68:"Advertise error",69:"Srmount error",70:"Communication error on send",71:"Protocol error",72:"Multihop attempted",73:"Cross mount point (not really error)",74:"Trying to read unreadable message",75:"Value too large for defined data type",76:"Given log. name not unique",77:"f.d. invalid for this operation",78:"Remote address changed",79:"Can access a needed shared lib",80:"Accessing a corrupted shared lib",81:".lib section in a.out corrupted",82:"Attempting to link in too many libs",83:"Attempting to exec a shared library",84:"Illegal byte sequence",86:"Streams pipe error",87:"Too many users",88:"Socket operation on non-socket",89:"Destination address required",90:"Message too long",91:"Protocol wrong type for socket",92:"Protocol not available",93:"Unknown protocol",94:"Socket type not supported",95:"Not supported",96:"Protocol family not supported",97:"Address family not supported by protocol family",98:"Address already in use",99:"Address not available",100:"Network interface is not configured",101:"Network is unreachable",102:"Connection reset by network",103:"Connection aborted",104:"Connection reset by peer",105:"No buffer space available",106:"Socket is already connected",107:"Socket is not connected",108:"Can't send after socket shutdown",109:"Too many references",110:"Connection timed out",111:"Connection refused",112:"Host is down",113:"Host is unreachable",114:"Socket already connected",115:"Connection already in progress",116:"Stale file handle",122:"Quota exceeded",123:"No medium (in tape drive)",125:"Operation canceled",130:"Previous owner died",131:"State not recoverable"};function ___setErrNo(value){if(Module["___errno_location"])HEAP32[Module["___errno_location"]()>>2]=value;return value}var PATH={splitPath:(function(filename){var splitPathRe=/^(\/?|)([\s\S]*?)((?:\.{1,2}|[^\/]+?|)(\.[^.\/]*|))(?:[\/]*)$/;return splitPathRe.exec(filename).slice(1)}),normalizeArray:(function(parts,allowAboveRoot){var up=0;for(var i=parts.length-1;i>=0;i--){var last=parts[i];if(last==="."){parts.splice(i,1)}else if(last===".."){parts.splice(i,1);up++}else if(up){parts.splice(i,1);up--}}if(allowAboveRoot){for(;up;up--){parts.unshift("..")}}return parts}),normalize:(function(path){var isAbsolute=path.charAt(0)==="/",trailingSlash=path.substr(-1)==="/";path=PATH.normalizeArray(path.split("/").filter((function(p){return!!p})),!isAbsolute).join("/");if(!path&&!isAbsolute){path="."}if(path&&trailingSlash){path+="/"}return(isAbsolute?"/":"")+path}),dirname:(function(path){var result=PATH.splitPath(path),root=result[0],dir=result[1];if(!root&&!dir){return"."}if(dir){dir=dir.substr(0,dir.length-1)}return root+dir}),basename:(function(path){if(path==="/")return"/";var lastSlash=path.lastIndexOf("/");if(lastSlash===-1)return path;return path.substr(lastSlash+1)}),extname:(function(path){return PATH.splitPath(path)[3]}),join:(function(){var paths=Array.prototype.slice.call(arguments,0);return PATH.normalize(paths.join("/"))}),join2:(function(l,r){return PATH.normalize(l+"/"+r)}),resolve:(function(){var resolvedPath="",resolvedAbsolute=false;for(var i=arguments.length-1;i>=-1&&!resolvedAbsolute;i--){var path=i>=0?arguments[i]:FS.cwd();if(typeof path!=="string"){throw new TypeError("Arguments to path.resolve must be strings")}else if(!path){return""}resolvedPath=path+"/"+resolvedPath;resolvedAbsolute=path.charAt(0)==="/"}resolvedPath=PATH.normalizeArray(resolvedPath.split("/").filter((function(p){return!!p})),!resolvedAbsolute).join("/");return(resolvedAbsolute?"/":"")+resolvedPath||"."}),relative:(function(from,to){from=PATH.resolve(from).substr(1);to=PATH.resolve(to).substr(1);function trim(arr){var start=0;for(;start=0;end--){if(arr[end]!=="")break}if(start>end)return[];return arr.slice(start,end-start+1)}var fromParts=trim(from.split("/"));var toParts=trim(to.split("/"));var length=Math.min(fromParts.length,toParts.length);var samePartsLength=length;for(var i=0;i0){result=buf.slice(0,bytesRead).toString("utf-8")}else{result=null}}else if(typeof window!="undefined"&&typeof window.prompt=="function"){result=window.prompt("Input: ");if(result!==null){result+="\n"}}else if(typeof readline=="function"){result=readline();if(result!==null){result+="\n"}}if(!result){return null}tty.input=intArrayFromString(result,true)}return tty.input.shift()}),put_char:(function(tty,val){if(val===null||val===10){Module["print"](UTF8ArrayToString(tty.output,0));tty.output=[]}else{if(val!=0)tty.output.push(val)}}),flush:(function(tty){if(tty.output&&tty.output.length>0){Module["print"](UTF8ArrayToString(tty.output,0));tty.output=[]}})},default_tty1_ops:{put_char:(function(tty,val){if(val===null||val===10){Module["printErr"](UTF8ArrayToString(tty.output,0));tty.output=[]}else{if(val!=0)tty.output.push(val)}}),flush:(function(tty){if(tty.output&&tty.output.length>0){Module["printErr"](UTF8ArrayToString(tty.output,0));tty.output=[]}})}};var MEMFS={ops_table:null,mount:(function(mount){return MEMFS.createNode(null,"/",16384|511,0)}),createNode:(function(parent,name,mode,dev){if(FS.isBlkdev(mode)||FS.isFIFO(mode)){throw new FS.ErrnoError(ERRNO_CODES.EPERM)}if(!MEMFS.ops_table){MEMFS.ops_table={dir:{node:{getattr:MEMFS.node_ops.getattr,setattr:MEMFS.node_ops.setattr,lookup:MEMFS.node_ops.lookup,mknod:MEMFS.node_ops.mknod,rename:MEMFS.node_ops.rename,unlink:MEMFS.node_ops.unlink,rmdir:MEMFS.node_ops.rmdir,readdir:MEMFS.node_ops.readdir,symlink:MEMFS.node_ops.symlink},stream:{llseek:MEMFS.stream_ops.llseek}},file:{node:{getattr:MEMFS.node_ops.getattr,setattr:MEMFS.node_ops.setattr},stream:{llseek:MEMFS.stream_ops.llseek,read:MEMFS.stream_ops.read,write:MEMFS.stream_ops.write,allocate:MEMFS.stream_ops.allocate,mmap:MEMFS.stream_ops.mmap,msync:MEMFS.stream_ops.msync}},link:{node:{getattr:MEMFS.node_ops.getattr,setattr:MEMFS.node_ops.setattr,readlink:MEMFS.node_ops.readlink},stream:{}},chrdev:{node:{getattr:MEMFS.node_ops.getattr,setattr:MEMFS.node_ops.setattr},stream:FS.chrdev_stream_ops}}}var node=FS.createNode(parent,name,mode,dev);if(FS.isDir(node.mode)){node.node_ops=MEMFS.ops_table.dir.node;node.stream_ops=MEMFS.ops_table.dir.stream;node.contents={}}else if(FS.isFile(node.mode)){node.node_ops=MEMFS.ops_table.file.node;node.stream_ops=MEMFS.ops_table.file.stream;node.usedBytes=0;node.contents=null}else if(FS.isLink(node.mode)){node.node_ops=MEMFS.ops_table.link.node;node.stream_ops=MEMFS.ops_table.link.stream}else if(FS.isChrdev(node.mode)){node.node_ops=MEMFS.ops_table.chrdev.node;node.stream_ops=MEMFS.ops_table.chrdev.stream}node.timestamp=Date.now();if(parent){parent.contents[name]=node}return node}),getFileDataAsRegularArray:(function(node){if(node.contents&&node.contents.subarray){var arr=[];for(var i=0;inode.contents.length){node.contents=MEMFS.getFileDataAsRegularArray(node);node.usedBytes=node.contents.length}if(!node.contents||node.contents.subarray){var prevCapacity=node.contents?node.contents.length:0;if(prevCapacity>=newCapacity)return;var CAPACITY_DOUBLING_MAX=1024*1024;newCapacity=Math.max(newCapacity,prevCapacity*(prevCapacity0)node.contents.set(oldContents.subarray(0,node.usedBytes),0);return}if(!node.contents&&newCapacity>0)node.contents=[];while(node.contents.lengthnewSize)node.contents.length=newSize;else while(node.contents.length=stream.node.usedBytes)return 0;var size=Math.min(stream.node.usedBytes-position,length);assert(size>=0);if(size>8&&contents.subarray){buffer.set(contents.subarray(position,position+size),offset)}else{for(var i=0;i0||position+lengthe2.timestamp){create.push(key);total++}}));var remove=[];Object.keys(dst.entries).forEach((function(key){var e=dst.entries[key];var e2=src.entries[key];if(!e2){remove.push(key);total++}}));if(!total){return callback(null)}var completed=0;var db=src.type==="remote"?src.db:dst.db;var transaction=db.transaction([IDBFS.DB_STORE_NAME],"readwrite");var store=transaction.objectStore(IDBFS.DB_STORE_NAME);function done(err){if(err){if(!done.errored){done.errored=true;return callback(err)}return}if(++completed>=total){return callback(null)}}transaction.onerror=(function(e){done(this.error);e.preventDefault()});create.sort().forEach((function(path){if(dst.type==="local"){IDBFS.loadRemoteEntry(store,path,(function(err,entry){if(err)return done(err);IDBFS.storeLocalEntry(path,entry,done)}))}else{IDBFS.loadLocalEntry(path,(function(err,entry){if(err)return done(err);IDBFS.storeRemoteEntry(store,path,entry,done)}))}}));remove.sort().reverse().forEach((function(path){if(dst.type==="local"){IDBFS.removeLocalEntry(path,done)}else{IDBFS.removeRemoteEntry(store,path,done)}}))})};var NODEFS={isWindows:false,staticInit:(function(){NODEFS.isWindows=!!process.platform.match(/^win/)}),mount:(function(mount){assert(ENVIRONMENT_IS_NODE);return NODEFS.createNode(null,"/",NODEFS.getMode(mount.opts.root),0)}),createNode:(function(parent,name,mode,dev){if(!FS.isDir(mode)&&!FS.isFile(mode)&&!FS.isLink(mode)){throw new FS.ErrnoError(ERRNO_CODES.EINVAL)}var node=FS.createNode(parent,name,mode);node.node_ops=NODEFS.node_ops;node.stream_ops=NODEFS.stream_ops;return node}),getMode:(function(path){var stat;try{stat=fs.lstatSync(path);if(NODEFS.isWindows){stat.mode=stat.mode|(stat.mode&146)>>1}}catch(e){if(!e.code)throw e;throw new FS.ErrnoError(ERRNO_CODES[e.code])}return stat.mode}),realPath:(function(node){var parts=[];while(node.parent!==node){parts.push(node.name);node=node.parent}parts.push(node.mount.opts.root);parts.reverse();return PATH.join.apply(null,parts)}),flagsToPermissionStringMap:{0:"r",1:"r+",2:"r+",64:"r",65:"r+",66:"r+",129:"rx+",193:"rx+",514:"w+",577:"w",578:"w+",705:"wx",706:"wx+",1024:"a",1025:"a",1026:"a+",1089:"a",1090:"a+",1153:"ax",1154:"ax+",1217:"ax",1218:"ax+",4096:"rs",4098:"rs+"},flagsToPermissionString:(function(flags){flags&=~2097152;flags&=~2048;flags&=~32768;flags&=~524288;if(flags in NODEFS.flagsToPermissionStringMap){return NODEFS.flagsToPermissionStringMap[flags]}else{throw new FS.ErrnoError(ERRNO_CODES.EINVAL)}}),node_ops:{getattr:(function(node){var path=NODEFS.realPath(node);var stat;try{stat=fs.lstatSync(path)}catch(e){if(!e.code)throw e;throw new FS.ErrnoError(ERRNO_CODES[e.code])}if(NODEFS.isWindows&&!stat.blksize){stat.blksize=4096}if(NODEFS.isWindows&&!stat.blocks){stat.blocks=(stat.size+stat.blksize-1)/stat.blksize|0}return{dev:stat.dev,ino:stat.ino,mode:stat.mode,nlink:stat.nlink,uid:stat.uid,gid:stat.gid,rdev:stat.rdev,size:stat.size,atime:stat.atime,mtime:stat.mtime,ctime:stat.ctime,blksize:stat.blksize,blocks:stat.blocks}}),setattr:(function(node,attr){var path=NODEFS.realPath(node);try{if(attr.mode!==undefined){fs.chmodSync(path,attr.mode);node.mode=attr.mode}if(attr.timestamp!==undefined){var date=new Date(attr.timestamp);fs.utimesSync(path,date,date)}if(attr.size!==undefined){fs.truncateSync(path,attr.size)}}catch(e){if(!e.code)throw e;throw new FS.ErrnoError(ERRNO_CODES[e.code])}}),lookup:(function(parent,name){var path=PATH.join2(NODEFS.realPath(parent),name);var mode=NODEFS.getMode(path);return NODEFS.createNode(parent,name,mode)}),mknod:(function(parent,name,mode,dev){var node=NODEFS.createNode(parent,name,mode,dev);var path=NODEFS.realPath(node);try{if(FS.isDir(node.mode)){fs.mkdirSync(path,node.mode)}else{fs.writeFileSync(path,"",{mode:node.mode})}}catch(e){if(!e.code)throw e;throw new FS.ErrnoError(ERRNO_CODES[e.code])}return node}),rename:(function(oldNode,newDir,newName){var oldPath=NODEFS.realPath(oldNode);var newPath=PATH.join2(NODEFS.realPath(newDir),newName);try{fs.renameSync(oldPath,newPath)}catch(e){if(!e.code)throw e;throw new FS.ErrnoError(ERRNO_CODES[e.code])}}),unlink:(function(parent,name){var path=PATH.join2(NODEFS.realPath(parent),name);try{fs.unlinkSync(path)}catch(e){if(!e.code)throw e;throw new FS.ErrnoError(ERRNO_CODES[e.code])}}),rmdir:(function(parent,name){var path=PATH.join2(NODEFS.realPath(parent),name);try{fs.rmdirSync(path)}catch(e){if(!e.code)throw e;throw new FS.ErrnoError(ERRNO_CODES[e.code])}}),readdir:(function(node){var path=NODEFS.realPath(node);try{return fs.readdirSync(path)}catch(e){if(!e.code)throw e;throw new FS.ErrnoError(ERRNO_CODES[e.code])}}),symlink:(function(parent,newName,oldPath){var newPath=PATH.join2(NODEFS.realPath(parent),newName);try{fs.symlinkSync(oldPath,newPath)}catch(e){if(!e.code)throw e;throw new FS.ErrnoError(ERRNO_CODES[e.code])}}),readlink:(function(node){var path=NODEFS.realPath(node);try{path=fs.readlinkSync(path);path=NODEJS_PATH.relative(NODEJS_PATH.resolve(node.mount.opts.root),path);return path}catch(e){if(!e.code)throw e;throw new FS.ErrnoError(ERRNO_CODES[e.code])}})},stream_ops:{open:(function(stream){var path=NODEFS.realPath(stream.node);try{if(FS.isFile(stream.node.mode)){stream.nfd=fs.openSync(path,NODEFS.flagsToPermissionString(stream.flags))}}catch(e){if(!e.code)throw e;throw new FS.ErrnoError(ERRNO_CODES[e.code])}}),close:(function(stream){try{if(FS.isFile(stream.node.mode)&&stream.nfd){fs.closeSync(stream.nfd)}}catch(e){if(!e.code)throw e;throw new FS.ErrnoError(ERRNO_CODES[e.code])}}),read:(function(stream,buffer,offset,length,position){if(length===0)return 0;var nbuffer=new Buffer(length);var res;try{res=fs.readSync(stream.nfd,nbuffer,0,length,position)}catch(e){throw new FS.ErrnoError(ERRNO_CODES[e.code])}if(res>0){for(var i=0;i=stream.node.size)return 0;var chunk=stream.node.contents.slice(position,position+length);var ab=WORKERFS.reader.readAsArrayBuffer(chunk);buffer.set(new Uint8Array(ab),offset);return chunk.size}),write:(function(stream,buffer,offset,length,position){throw new FS.ErrnoError(ERRNO_CODES.EIO)}),llseek:(function(stream,offset,whence){var position=offset;if(whence===1){position+=stream.position}else if(whence===2){if(FS.isFile(stream.node.mode)){position+=stream.node.size}}if(position<0){throw new FS.ErrnoError(ERRNO_CODES.EINVAL)}return position})}};STATICTOP+=16;STATICTOP+=16;STATICTOP+=16;var FS={root:null,mounts:[],devices:[null],streams:[],nextInode:1,nameTable:null,currentPath:"/",initialized:false,ignorePermissions:true,trackingDelegate:{},tracking:{openFlags:{READ:1,WRITE:2}},ErrnoError:null,genericErrors:{},filesystems:null,syncFSRequests:0,handleFSError:(function(e){if(!(e instanceof FS.ErrnoError))throw e+" : "+stackTrace();return ___setErrNo(e.errno)}),lookupPath:(function(path,opts){path=PATH.resolve(FS.cwd(),path);opts=opts||{};if(!path)return{path:"",node:null};var defaults={follow_mount:true,recurse_count:0};for(var key in defaults){if(opts[key]===undefined){opts[key]=defaults[key]}}if(opts.recurse_count>8){throw new FS.ErrnoError(ERRNO_CODES.ELOOP)}var parts=PATH.normalizeArray(path.split("/").filter((function(p){return!!p})),false);var current=FS.root;var current_path="/";for(var i=0;i40){throw new FS.ErrnoError(ERRNO_CODES.ELOOP)}}}}return{path:current_path,node:current}}),getPath:(function(node){var path;while(true){if(FS.isRoot(node)){var mount=node.mount.mountpoint;if(!path)return mount;return mount[mount.length-1]!=="/"?mount+"/"+path:mount+path}path=path?node.name+"/"+path:node.name;node=node.parent}}),hashName:(function(parentid,name){var hash=0;for(var i=0;i>>0)%FS.nameTable.length}),hashAddNode:(function(node){var hash=FS.hashName(node.parent.id,node.name);node.name_next=FS.nameTable[hash];FS.nameTable[hash]=node}),hashRemoveNode:(function(node){var hash=FS.hashName(node.parent.id,node.name);if(FS.nameTable[hash]===node){FS.nameTable[hash]=node.name_next}else{var current=FS.nameTable[hash];while(current){if(current.name_next===node){current.name_next=node.name_next;break}current=current.name_next}}}),lookupNode:(function(parent,name){var err=FS.mayLookup(parent);if(err){throw new FS.ErrnoError(err,parent)}var hash=FS.hashName(parent.id,name);for(var node=FS.nameTable[hash];node;node=node.name_next){var nodeName=node.name;if(node.parent.id===parent.id&&nodeName===name){return node}}return FS.lookup(parent,name)}),createNode:(function(parent,name,mode,rdev){if(!FS.FSNode){FS.FSNode=(function(parent,name,mode,rdev){if(!parent){parent=this}this.parent=parent;this.mount=parent.mount;this.mounted=null;this.id=FS.nextInode++;this.name=name;this.mode=mode;this.node_ops={};this.stream_ops={};this.rdev=rdev});FS.FSNode.prototype={};var readMode=292|73;var writeMode=146;Object.defineProperties(FS.FSNode.prototype,{read:{get:(function(){return(this.mode&readMode)===readMode}),set:(function(val){val?this.mode|=readMode:this.mode&=~readMode})},write:{get:(function(){return(this.mode&writeMode)===writeMode}),set:(function(val){val?this.mode|=writeMode:this.mode&=~writeMode})},isFolder:{get:(function(){return FS.isDir(this.mode)})},isDevice:{get:(function(){return FS.isChrdev(this.mode)})}})}var node=new FS.FSNode(parent,name,mode,rdev);FS.hashAddNode(node);return node}),destroyNode:(function(node){FS.hashRemoveNode(node)}),isRoot:(function(node){return node===node.parent}),isMountpoint:(function(node){return!!node.mounted}),isFile:(function(mode){return(mode&61440)===32768}),isDir:(function(mode){return(mode&61440)===16384}),isLink:(function(mode){return(mode&61440)===40960}),isChrdev:(function(mode){return(mode&61440)===8192}),isBlkdev:(function(mode){return(mode&61440)===24576}),isFIFO:(function(mode){return(mode&61440)===4096}),isSocket:(function(mode){return(mode&49152)===49152}),flagModes:{"r":0,"rs":1052672,"r+":2,"w":577,"wx":705,"xw":705,"w+":578,"wx+":706,"xw+":706,"a":1089,"ax":1217,"xa":1217,"a+":1090,"ax+":1218,"xa+":1218},modeStringToFlags:(function(str){var flags=FS.flagModes[str];if(typeof flags==="undefined"){throw new Error("Unknown file open mode: "+str)}return flags}),flagsToPermissionString:(function(flag){var perms=["r","w","rw"][flag&3];if(flag&512){perms+="w"}return perms}),nodePermissions:(function(node,perms){if(FS.ignorePermissions){return 0}if(perms.indexOf("r")!==-1&&!(node.mode&292)){return ERRNO_CODES.EACCES}else if(perms.indexOf("w")!==-1&&!(node.mode&146)){return ERRNO_CODES.EACCES}else if(perms.indexOf("x")!==-1&&!(node.mode&73)){return ERRNO_CODES.EACCES}return 0}),mayLookup:(function(dir){var err=FS.nodePermissions(dir,"x");if(err)return err;if(!dir.node_ops.lookup)return ERRNO_CODES.EACCES;return 0}),mayCreate:(function(dir,name){try{var node=FS.lookupNode(dir,name);return ERRNO_CODES.EEXIST}catch(e){}return FS.nodePermissions(dir,"wx")}),mayDelete:(function(dir,name,isdir){var node;try{node=FS.lookupNode(dir,name)}catch(e){return e.errno}var err=FS.nodePermissions(dir,"wx");if(err){return err}if(isdir){if(!FS.isDir(node.mode)){return ERRNO_CODES.ENOTDIR}if(FS.isRoot(node)||FS.getPath(node)===FS.cwd()){return ERRNO_CODES.EBUSY}}else{if(FS.isDir(node.mode)){return ERRNO_CODES.EISDIR}}return 0}),mayOpen:(function(node,flags){if(!node){return ERRNO_CODES.ENOENT}if(FS.isLink(node.mode)){return ERRNO_CODES.ELOOP}else if(FS.isDir(node.mode)){if(FS.flagsToPermissionString(flags)!=="r"||flags&512){return ERRNO_CODES.EISDIR}}return FS.nodePermissions(node,FS.flagsToPermissionString(flags))}),MAX_OPEN_FDS:4096,nextfd:(function(fd_start,fd_end){fd_start=fd_start||0;fd_end=fd_end||FS.MAX_OPEN_FDS;for(var fd=fd_start;fd<=fd_end;fd++){if(!FS.streams[fd]){return fd}}throw new FS.ErrnoError(ERRNO_CODES.EMFILE)}),getStream:(function(fd){return FS.streams[fd]}),createStream:(function(stream,fd_start,fd_end){if(!FS.FSStream){FS.FSStream=(function(){});FS.FSStream.prototype={};Object.defineProperties(FS.FSStream.prototype,{object:{get:(function(){return this.node}),set:(function(val){this.node=val})},isRead:{get:(function(){return(this.flags&2097155)!==1})},isWrite:{get:(function(){return(this.flags&2097155)!==0})},isAppend:{get:(function(){return this.flags&1024})}})}var newStream=new FS.FSStream;for(var p in stream){newStream[p]=stream[p]}stream=newStream;var fd=FS.nextfd(fd_start,fd_end);stream.fd=fd;FS.streams[fd]=stream;return stream}),closeStream:(function(fd){FS.streams[fd]=null}),chrdev_stream_ops:{open:(function(stream){var device=FS.getDevice(stream.node.rdev);stream.stream_ops=device.stream_ops;if(stream.stream_ops.open){stream.stream_ops.open(stream)}}),llseek:(function(){throw new FS.ErrnoError(ERRNO_CODES.ESPIPE)})},major:(function(dev){return dev>>8}),minor:(function(dev){return dev&255}),makedev:(function(ma,mi){return ma<<8|mi}),registerDevice:(function(dev,ops){FS.devices[dev]={stream_ops:ops}}),getDevice:(function(dev){return FS.devices[dev]}),getMounts:(function(mount){var mounts=[];var check=[mount];while(check.length){var m=check.pop();mounts.push(m);check.push.apply(check,m.mounts)}return mounts}),syncfs:(function(populate,callback){if(typeof populate==="function"){callback=populate;populate=false}FS.syncFSRequests++;if(FS.syncFSRequests>1){console.log("warning: "+FS.syncFSRequests+" FS.syncfs operations in flight at once, probably just doing extra work")}var mounts=FS.getMounts(FS.root.mount);var completed=0;function doCallback(err){assert(FS.syncFSRequests>0);FS.syncFSRequests--;return callback(err)}function done(err){if(err){if(!done.errored){done.errored=true;return doCallback(err)}return}if(++completed>=mounts.length){doCallback(null)}}mounts.forEach((function(mount){if(!mount.type.syncfs){return done(null)}mount.type.syncfs(mount,populate,done)}))}),mount:(function(type,opts,mountpoint){var root=mountpoint==="/";var pseudo=!mountpoint;var node;if(root&&FS.root){throw new FS.ErrnoError(ERRNO_CODES.EBUSY)}else if(!root&&!pseudo){var lookup=FS.lookupPath(mountpoint,{follow_mount:false});mountpoint=lookup.path;node=lookup.node;if(FS.isMountpoint(node)){throw new FS.ErrnoError(ERRNO_CODES.EBUSY)}if(!FS.isDir(node.mode)){throw new FS.ErrnoError(ERRNO_CODES.ENOTDIR)}}var mount={type:type,opts:opts,mountpoint:mountpoint,mounts:[]};var mountRoot=type.mount(mount);mountRoot.mount=mount;mount.root=mountRoot;if(root){FS.root=mountRoot}else if(node){node.mounted=mount;if(node.mount){node.mount.mounts.push(mount)}}return mountRoot}),unmount:(function(mountpoint){var lookup=FS.lookupPath(mountpoint,{follow_mount:false});if(!FS.isMountpoint(lookup.node)){throw new FS.ErrnoError(ERRNO_CODES.EINVAL)}var node=lookup.node;var mount=node.mounted;var mounts=FS.getMounts(mount);Object.keys(FS.nameTable).forEach((function(hash){var current=FS.nameTable[hash];while(current){var next=current.name_next;if(mounts.indexOf(current.mount)!==-1){FS.destroyNode(current)}current=next}}));node.mounted=null;var idx=node.mount.mounts.indexOf(mount);assert(idx!==-1);node.mount.mounts.splice(idx,1)}),lookup:(function(parent,name){return parent.node_ops.lookup(parent,name)}),mknod:(function(path,mode,dev){var lookup=FS.lookupPath(path,{parent:true});var parent=lookup.node;var name=PATH.basename(path);if(!name||name==="."||name===".."){throw new FS.ErrnoError(ERRNO_CODES.EINVAL)}var err=FS.mayCreate(parent,name);if(err){throw new FS.ErrnoError(err)}if(!parent.node_ops.mknod){throw new FS.ErrnoError(ERRNO_CODES.EPERM)}return parent.node_ops.mknod(parent,name,mode,dev)}),create:(function(path,mode){mode=mode!==undefined?mode:438;mode&=4095;mode|=32768;return FS.mknod(path,mode,0)}),mkdir:(function(path,mode){mode=mode!==undefined?mode:511;mode&=511|512;mode|=16384;return FS.mknod(path,mode,0)}),mkdirTree:(function(path,mode){var dirs=path.split("/");var d="";for(var i=0;ithis.length-1||idx<0){return undefined}var chunkOffset=idx%this.chunkSize;var chunkNum=idx/this.chunkSize|0;return this.getter(chunkNum)[chunkOffset]};LazyUint8Array.prototype.setDataGetter=function LazyUint8Array_setDataGetter(getter){this.getter=getter};LazyUint8Array.prototype.cacheLength=function LazyUint8Array_cacheLength(){var xhr=new XMLHttpRequest;xhr.open("HEAD",url,false);xhr.send(null);if(!(xhr.status>=200&&xhr.status<300||xhr.status===304))throw new Error("Couldn't load "+url+". Status: "+xhr.status);var datalength=Number(xhr.getResponseHeader("Content-length"));var header;var hasByteServing=(header=xhr.getResponseHeader("Accept-Ranges"))&&header==="bytes";var usesGzip=(header=xhr.getResponseHeader("Content-Encoding"))&&header==="gzip";var chunkSize=1024*1024;if(!hasByteServing)chunkSize=datalength;var doXHR=(function(from,to){if(from>to)throw new Error("invalid range ("+from+", "+to+") or no bytes requested!");if(to>datalength-1)throw new Error("only "+datalength+" bytes available! programmer error!");var xhr=new XMLHttpRequest;xhr.open("GET",url,false);if(datalength!==chunkSize)xhr.setRequestHeader("Range","bytes="+from+"-"+to);if(typeof Uint8Array!="undefined")xhr.responseType="arraybuffer";if(xhr.overrideMimeType){xhr.overrideMimeType("text/plain; charset=x-user-defined")}xhr.send(null);if(!(xhr.status>=200&&xhr.status<300||xhr.status===304))throw new Error("Couldn't load "+url+". Status: "+xhr.status);if(xhr.response!==undefined){return new Uint8Array(xhr.response||[])}else{return intArrayFromString(xhr.responseText||"",true)}});var lazyArray=this;lazyArray.setDataGetter((function(chunkNum){var start=chunkNum*chunkSize;var end=(chunkNum+1)*chunkSize-1;end=Math.min(end,datalength-1);if(typeof lazyArray.chunks[chunkNum]==="undefined"){lazyArray.chunks[chunkNum]=doXHR(start,end)}if(typeof lazyArray.chunks[chunkNum]==="undefined")throw new Error("doXHR failed!");return lazyArray.chunks[chunkNum]}));if(usesGzip||!datalength){chunkSize=datalength=1;datalength=this.getter(0).length;chunkSize=datalength;console.log("LazyFiles on gzip forces download of the whole file when length is accessed")}this._length=datalength;this._chunkSize=chunkSize;this.lengthKnown=true};if(typeof XMLHttpRequest!=="undefined"){if(!ENVIRONMENT_IS_WORKER)throw"Cannot do synchronous binary XHRs outside webworkers in modern browsers. Use --embed-file or --preload-file in emcc";var lazyArray=new LazyUint8Array;Object.defineProperties(lazyArray,{length:{get:(function(){if(!this.lengthKnown){this.cacheLength()}return this._length})},chunkSize:{get:(function(){if(!this.lengthKnown){this.cacheLength()}return this._chunkSize})}});var properties={isDevice:false,contents:lazyArray}}else{var properties={isDevice:false,url:url}}var node=FS.createFile(parent,name,properties,canRead,canWrite);if(properties.contents){node.contents=properties.contents}else if(properties.url){node.contents=null;node.url=properties.url}Object.defineProperties(node,{usedBytes:{get:(function(){return this.contents.length})}});var stream_ops={};var keys=Object.keys(node.stream_ops);keys.forEach((function(key){var fn=node.stream_ops[key];stream_ops[key]=function forceLoadLazyFile(){if(!FS.forceLoadFile(node)){throw new FS.ErrnoError(ERRNO_CODES.EIO)}return fn.apply(null,arguments)}}));stream_ops.read=function stream_ops_read(stream,buffer,offset,length,position){if(!FS.forceLoadFile(node)){throw new FS.ErrnoError(ERRNO_CODES.EIO)}var contents=stream.node.contents;if(position>=contents.length)return 0;var size=Math.min(contents.length-position,length);assert(size>=0);if(contents.slice){for(var i=0;i>2]=stat.dev;HEAP32[buf+4>>2]=0;HEAP32[buf+8>>2]=stat.ino;HEAP32[buf+12>>2]=stat.mode;HEAP32[buf+16>>2]=stat.nlink;HEAP32[buf+20>>2]=stat.uid;HEAP32[buf+24>>2]=stat.gid;HEAP32[buf+28>>2]=stat.rdev;HEAP32[buf+32>>2]=0;HEAP32[buf+36>>2]=stat.size;HEAP32[buf+40>>2]=4096;HEAP32[buf+44>>2]=stat.blocks;HEAP32[buf+48>>2]=stat.atime.getTime()/1e3|0;HEAP32[buf+52>>2]=0;HEAP32[buf+56>>2]=stat.mtime.getTime()/1e3|0;HEAP32[buf+60>>2]=0;HEAP32[buf+64>>2]=stat.ctime.getTime()/1e3|0;HEAP32[buf+68>>2]=0;HEAP32[buf+72>>2]=stat.ino;return 0}),doMsync:(function(addr,stream,len,flags){var buffer=new Uint8Array(HEAPU8.subarray(addr,addr+len));FS.msync(stream,buffer,0,len,flags)}),doMkdir:(function(path,mode){path=PATH.normalize(path);if(path[path.length-1]==="/")path=path.substr(0,path.length-1);FS.mkdir(path,mode,0);return 0}),doMknod:(function(path,mode,dev){switch(mode&61440){case 32768:case 8192:case 24576:case 4096:case 49152:break;default:return-ERRNO_CODES.EINVAL}FS.mknod(path,mode,dev);return 0}),doReadlink:(function(path,buf,bufsize){if(bufsize<=0)return-ERRNO_CODES.EINVAL;var ret=FS.readlink(path);var len=Math.min(bufsize,lengthBytesUTF8(ret));var endChar=HEAP8[buf+len];stringToUTF8(ret,buf,bufsize+1);HEAP8[buf+len]=endChar;return len}),doAccess:(function(path,amode){if(amode&~7){return-ERRNO_CODES.EINVAL}var node;var lookup=FS.lookupPath(path,{follow:true});node=lookup.node;var perms="";if(amode&4)perms+="r";if(amode&2)perms+="w";if(amode&1)perms+="x";if(perms&&FS.nodePermissions(node,perms)){return-ERRNO_CODES.EACCES}return 0}),doDup:(function(path,flags,suggestFD){var suggest=FS.getStream(suggestFD);if(suggest)FS.close(suggest);return FS.open(path,flags,0,suggestFD,suggestFD).fd}),doReadv:(function(stream,iov,iovcnt,offset){var ret=0;for(var i=0;i>2];var len=HEAP32[iov+(i*8+4)>>2];var curr=FS.read(stream,HEAP8,ptr,len,offset);if(curr<0)return-1;ret+=curr;if(curr>2];var len=HEAP32[iov+(i*8+4)>>2];var curr=FS.write(stream,HEAP8,ptr,len,offset);if(curr<0)return-1;ret+=curr}return ret}),varargs:0,get:(function(varargs){SYSCALLS.varargs+=4;var ret=HEAP32[SYSCALLS.varargs-4>>2];return ret}),getStr:(function(){var ret=Pointer_stringify(SYSCALLS.get());return ret}),getStreamFromFD:(function(){var stream=FS.getStream(SYSCALLS.get());if(!stream)throw new FS.ErrnoError(ERRNO_CODES.EBADF);return stream}),getSocketFromFD:(function(){var socket=SOCKFS.getSocket(SYSCALLS.get());if(!socket)throw new FS.ErrnoError(ERRNO_CODES.EBADF);return socket}),getSocketAddress:(function(allowNull){var addrp=SYSCALLS.get(),addrlen=SYSCALLS.get();if(allowNull&&addrp===0)return null;var info=__read_sockaddr(addrp,addrlen);if(info.errno)throw new FS.ErrnoError(info.errno);info.addr=DNS.lookup_addr(info.addr)||info.addr;return info}),get64:(function(){var low=SYSCALLS.get(),high=SYSCALLS.get();if(low>=0)assert(high===0);else assert(high===-1);return low}),getZero:(function(){assert(SYSCALLS.get()===0)})};function ___syscall91(which,varargs){SYSCALLS.varargs=varargs;try{var addr=SYSCALLS.get(),len=SYSCALLS.get();var info=SYSCALLS.mappings[addr];if(!info)return 0;if(len===info.len){var stream=FS.getStream(info.fd);SYSCALLS.doMsync(addr,stream,len,info.flags);FS.munmap(stream);SYSCALLS.mappings[addr]=null;if(info.allocated){_free(info.malloc)}}return 0}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function _pthread_mutexattr_destroy(){}function _gzopen(){Module["printErr"]("missing function: gzopen");abort(-1)}var tupleRegistrations={};function requireFunction(signature,rawFunction){signature=readLatin1String(signature);function makeDynCaller(dynCall){var args=[];for(var i=1;i0?", ":"")+argsListWired}var returns=argTypes[0].name!=="void";invokerFnBody+=(returns?"var rv = ":"")+"invoker(fn"+(argsListWired.length>0?", ":"")+argsListWired+");\n";if(needsDestructorStack){invokerFnBody+="runDestructors(destructors);\n"}else{for(var i=isClassMethodFunc?1:2;i>2)+i])}return array}var UnboundTypeError=undefined;function throwUnboundTypeError(message,types){var unboundTypes=[];var seen={};function visit(type){if(seen[type]){return}if(registeredTypes[type]){return}if(typeDependencies[type]){typeDependencies[type].forEach(visit);return}unboundTypes.push(type);seen[type]=true}types.forEach(visit);throw new UnboundTypeError(message+": "+unboundTypes.map(getTypeName).join([", "]))}function __embind_register_class_class_function(rawClassType,methodName,argCount,rawArgTypesAddr,invokerSignature,rawInvoker,fn){var rawArgTypes=heap32VectorToArray(argCount,rawArgTypesAddr);methodName=readLatin1String(methodName);rawInvoker=requireFunction(invokerSignature,rawInvoker);whenDependentTypesAreResolved([],[rawClassType],(function(classType){classType=classType[0];var humanName=classType.name+"."+methodName;function unboundTypesHandler(){throwUnboundTypeError("Cannot call "+humanName+" due to unbound types",rawArgTypes)}var proto=classType.registeredClass.constructor;if(undefined===proto[methodName]){unboundTypesHandler.argCount=argCount-1;proto[methodName]=unboundTypesHandler}else{ensureOverloadTable(proto,methodName,humanName);proto[methodName].overloadTable[argCount-1]=unboundTypesHandler}whenDependentTypesAreResolved([],rawArgTypes,(function(argTypes){var invokerArgsArray=[argTypes[0],null].concat(argTypes.slice(1));var func=craftInvokerFunction(humanName,invokerArgsArray,null,rawInvoker,fn);if(undefined===proto[methodName].overloadTable){func.argCount=argCount-1;proto[methodName]=func}else{proto[methodName].overloadTable[argCount-1]=func}return[]}));return[]}))}var _environ=STATICTOP;STATICTOP+=16;function ___buildEnvironment(env){var MAX_ENV_VALUES=64;var TOTAL_ENV_SIZE=1024;var poolPtr;var envPtr;if(!___buildEnvironment.called){___buildEnvironment.called=true;ENV["USER"]=ENV["LOGNAME"]="web_user";ENV["PATH"]="/";ENV["PWD"]="/";ENV["HOME"]="/home/web_user";ENV["LANG"]="C";ENV["_"]=Module["thisProgram"];poolPtr=allocate(TOTAL_ENV_SIZE,"i8",ALLOC_STATIC);envPtr=allocate(MAX_ENV_VALUES*4,"i8*",ALLOC_STATIC);HEAP32[envPtr>>2]=poolPtr;HEAP32[_environ>>2]=envPtr}else{envPtr=HEAP32[_environ>>2];poolPtr=HEAP32[envPtr>>2]}var strings=[];var totalSize=0;for(var key in env){if(typeof env[key]==="string"){var line=key+"="+env[key];strings.push(line);totalSize+=line.length}}if(totalSize>TOTAL_ENV_SIZE){throw new Error("Environment size exceeded TOTAL_ENV_SIZE!")}var ptrSize=4;for(var i=0;i>2]=poolPtr;poolPtr+=line.length+1}HEAP32[envPtr+strings.length*ptrSize>>2]=0}var ENV={};function _getenv(name){if(name===0)return 0;name=Pointer_stringify(name);if(!ENV.hasOwnProperty(name))return 0;if(_getenv.ret)_free(_getenv.ret);_getenv.ret=allocate(intArrayFromString(ENV[name]),"i8",ALLOC_NORMAL);return _getenv.ret}function __isLeapYear(year){return year%4===0&&(year%100!==0||year%400===0)}function __arraySum(array,index){var sum=0;for(var i=0;i<=index;sum+=array[i++]);return sum}var __MONTH_DAYS_LEAP=[31,29,31,30,31,30,31,31,30,31,30,31];var __MONTH_DAYS_REGULAR=[31,28,31,30,31,30,31,31,30,31,30,31];function __addDays(date,days){var newDate=new Date(date.getTime());while(days>0){var leap=__isLeapYear(newDate.getFullYear());var currentMonth=newDate.getMonth();var daysInCurrentMonth=(leap?__MONTH_DAYS_LEAP:__MONTH_DAYS_REGULAR)[currentMonth];if(days>daysInCurrentMonth-newDate.getDate()){days-=daysInCurrentMonth-newDate.getDate()+1;newDate.setDate(1);if(currentMonth<11){newDate.setMonth(currentMonth+1)}else{newDate.setMonth(0);newDate.setFullYear(newDate.getFullYear()+1)}}else{newDate.setDate(newDate.getDate()+days);return newDate}}return newDate}function _strftime(s,maxsize,format,tm){var tm_zone=HEAP32[tm+40>>2];var date={tm_sec:HEAP32[tm>>2],tm_min:HEAP32[tm+4>>2],tm_hour:HEAP32[tm+8>>2],tm_mday:HEAP32[tm+12>>2],tm_mon:HEAP32[tm+16>>2],tm_year:HEAP32[tm+20>>2],tm_wday:HEAP32[tm+24>>2],tm_yday:HEAP32[tm+28>>2],tm_isdst:HEAP32[tm+32>>2],tm_gmtoff:HEAP32[tm+36>>2],tm_zone:tm_zone?Pointer_stringify(tm_zone):""};var pattern=Pointer_stringify(format);var EXPANSION_RULES_1={"%c":"%a %b %d %H:%M:%S %Y","%D":"%m/%d/%y","%F":"%Y-%m-%d","%h":"%b","%r":"%I:%M:%S %p","%R":"%H:%M","%T":"%H:%M:%S","%x":"%m/%d/%y","%X":"%H:%M:%S"};for(var rule in EXPANSION_RULES_1){pattern=pattern.replace(new RegExp(rule,"g"),EXPANSION_RULES_1[rule])}var WEEKDAYS=["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"];var MONTHS=["January","February","March","April","May","June","July","August","September","October","November","December"];function leadingSomething(value,digits,character){var str=typeof value==="number"?value.toString():value||"";while(str.length0?1:0}var compare;if((compare=sgn(date1.getFullYear()-date2.getFullYear()))===0){if((compare=sgn(date1.getMonth()-date2.getMonth()))===0){compare=sgn(date1.getDate()-date2.getDate())}}return compare}function getFirstWeekStartDate(janFourth){switch(janFourth.getDay()){case 0:return new Date(janFourth.getFullYear()-1,11,29);case 1:return janFourth;case 2:return new Date(janFourth.getFullYear(),0,3);case 3:return new Date(janFourth.getFullYear(),0,2);case 4:return new Date(janFourth.getFullYear(),0,1);case 5:return new Date(janFourth.getFullYear()-1,11,31);case 6:return new Date(janFourth.getFullYear()-1,11,30)}}function getWeekBasedYear(date){var thisDate=__addDays(new Date(date.tm_year+1900,0,1),date.tm_yday);var janFourthThisYear=new Date(thisDate.getFullYear(),0,4);var janFourthNextYear=new Date(thisDate.getFullYear()+1,0,4);var firstWeekStartThisYear=getFirstWeekStartDate(janFourthThisYear);var firstWeekStartNextYear=getFirstWeekStartDate(janFourthNextYear);if(compareByDay(firstWeekStartThisYear,thisDate)<=0){if(compareByDay(firstWeekStartNextYear,thisDate)<=0){return thisDate.getFullYear()+1}else{return thisDate.getFullYear()}}else{return thisDate.getFullYear()-1}}var EXPANSION_RULES_2={"%a":(function(date){return WEEKDAYS[date.tm_wday].substring(0,3)}),"%A":(function(date){return WEEKDAYS[date.tm_wday]}),"%b":(function(date){return MONTHS[date.tm_mon].substring(0,3)}),"%B":(function(date){return MONTHS[date.tm_mon]}),"%C":(function(date){var year=date.tm_year+1900;return leadingNulls(year/100|0,2)}),"%d":(function(date){return leadingNulls(date.tm_mday,2)}),"%e":(function(date){return leadingSomething(date.tm_mday,2," ")}),"%g":(function(date){return getWeekBasedYear(date).toString().substring(2)}),"%G":(function(date){return getWeekBasedYear(date)}),"%H":(function(date){return leadingNulls(date.tm_hour,2)}),"%I":(function(date){var twelveHour=date.tm_hour;if(twelveHour==0)twelveHour=12;else if(twelveHour>12)twelveHour-=12;return leadingNulls(twelveHour,2)}),"%j":(function(date){return leadingNulls(date.tm_mday+__arraySum(__isLeapYear(date.tm_year+1900)?__MONTH_DAYS_LEAP:__MONTH_DAYS_REGULAR,date.tm_mon-1),3)}),"%m":(function(date){return leadingNulls(date.tm_mon+1,2)}),"%M":(function(date){return leadingNulls(date.tm_min,2)}),"%n":(function(){return"\n"}),"%p":(function(date){if(date.tm_hour>=0&&date.tm_hour<12){return"AM"}else{return"PM"}}),"%S":(function(date){return leadingNulls(date.tm_sec,2)}),"%t":(function(){return"\t"}),"%u":(function(date){var day=new Date(date.tm_year+1900,date.tm_mon+1,date.tm_mday,0,0,0,0);return day.getDay()||7}),"%U":(function(date){var janFirst=new Date(date.tm_year+1900,0,1);var firstSunday=janFirst.getDay()===0?janFirst:__addDays(janFirst,7-janFirst.getDay());var endDate=new Date(date.tm_year+1900,date.tm_mon,date.tm_mday);if(compareByDay(firstSunday,endDate)<0){var februaryFirstUntilEndMonth=__arraySum(__isLeapYear(endDate.getFullYear())?__MONTH_DAYS_LEAP:__MONTH_DAYS_REGULAR,endDate.getMonth()-1)-31;var firstSundayUntilEndJanuary=31-firstSunday.getDate();var days=firstSundayUntilEndJanuary+februaryFirstUntilEndMonth+endDate.getDate();return leadingNulls(Math.ceil(days/7),2)}return compareByDay(firstSunday,janFirst)===0?"01":"00"}),"%V":(function(date){var janFourthThisYear=new Date(date.tm_year+1900,0,4);var janFourthNextYear=new Date(date.tm_year+1901,0,4);var firstWeekStartThisYear=getFirstWeekStartDate(janFourthThisYear);var firstWeekStartNextYear=getFirstWeekStartDate(janFourthNextYear);var endDate=__addDays(new Date(date.tm_year+1900,0,1),date.tm_yday);if(compareByDay(endDate,firstWeekStartThisYear)<0){return"53"}if(compareByDay(firstWeekStartNextYear,endDate)<=0){return"01"}var daysDifference;if(firstWeekStartThisYear.getFullYear()=0;off=Math.abs(off)/60;off=off/60*100+off%60;return(ahead?"+":"-")+String("0000"+off).slice(-4)}),"%Z":(function(date){return date.tm_zone}),"%%":(function(){return"%"})};for(var rule in EXPANSION_RULES_2){if(pattern.indexOf(rule)>=0){pattern=pattern.replace(new RegExp(rule,"g"),EXPANSION_RULES_2[rule](date))}}var bytes=intArrayFromString(pattern,false);if(bytes.length>maxsize){return 0}writeArrayToMemory(bytes,s);return bytes.length-1}function _strftime_l(s,maxsize,format,tm){return _strftime(s,maxsize,format,tm)}function ___map_file(pathname,size){___setErrNo(ERRNO_CODES.EPERM);return-1}function __emval_run_destructors(handle){var destructors=emval_handle_array[handle].value;runDestructors(destructors);__emval_decref(handle)}function _emscripten_memcpy_big(dest,src,num){HEAPU8.set(HEAPU8.subarray(src,src+num),dest);return dest}function __embind_finalize_value_array(rawTupleType){var reg=tupleRegistrations[rawTupleType];delete tupleRegistrations[rawTupleType];var elements=reg.elements;var elementsLength=elements.length;var elementTypes=elements.map((function(elt){return elt.getterReturnType})).concat(elements.map((function(elt){return elt.setterArgumentType})));var rawConstructor=reg.rawConstructor;var rawDestructor=reg.rawDestructor;whenDependentTypesAreResolved([rawTupleType],elementTypes,(function(elementTypes){elements.forEach((function(elt,i){var getterReturnType=elementTypes[i];var getter=elt.getter;var getterContext=elt.getterContext;var setterArgumentType=elementTypes[i+elementsLength];var setter=elt.setter;var setterContext=elt.setterContext;elt.read=(function(ptr){return getterReturnType["fromWireType"](getter(getterContext,ptr))});elt.write=(function(ptr,o){var destructors=[];setter(setterContext,ptr,setterArgumentType["toWireType"](destructors,o));runDestructors(destructors)})}));return[{name:reg.name,"fromWireType":(function(ptr){var rv=new Array(elementsLength);for(var i=0;i>2]=0;return 0};case 21520:{if(!stream.tty)return-ERRNO_CODES.ENOTTY;return-ERRNO_CODES.EINVAL};case 21531:{var argp=SYSCALLS.get();return FS.ioctl(stream,op,argp)};case 21523:{if(!stream.tty)return-ERRNO_CODES.ENOTTY;return 0};default:abort("bad ioctl syscall "+op)}}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function _pthread_cond_wait(){return 0}function __embind_register_memory_view(rawType,dataTypeIndex,name){var typeMapping=[Int8Array,Uint8Array,Int16Array,Uint16Array,Int32Array,Uint32Array,Float32Array,Float64Array];var TA=typeMapping[dataTypeIndex];function decodeMemoryView(handle){handle=handle>>2;var heap=HEAPU32;var size=heap[handle];var data=heap[handle+1];return new TA(heap["buffer"],data,size)}name=readLatin1String(name);registerType(rawType,{name:name,"fromWireType":decodeMemoryView,"argPackAdvance":8,"readValueFromPointer":decodeMemoryView},{ignoreDuplicateRegistrations:true})}var _llvm_pow_f64=Math_pow;function requireHandle(handle){if(!handle){throwBindingError("Cannot use deleted val. handle = "+handle)}return emval_handle_array[handle].value}function __emval_as(handle,returnType,destructorsRef){handle=requireHandle(handle);returnType=requireRegisteredType(returnType,"emval::as");var destructors=[];var rd=__emval_register(destructors);HEAP32[destructorsRef>>2]=rd;return returnType["toWireType"](destructors,handle)}function _gzgets(){Module["printErr"]("missing function: gzgets");abort(-1)}function __emval_incref(handle){if(handle>4){emval_handle_array[handle].refcount+=1}}function _gzputs(){Module["printErr"]("missing function: gzputs");abort(-1)}function __embind_register_void(rawType,name){name=readLatin1String(name);registerType(rawType,{isVoid:true,name:name,"argPackAdvance":0,"fromWireType":(function(){return undefined}),"toWireType":(function(destructors,o){return undefined})})}function _pthread_mutexattr_settype(){}function _abort(){Module["abort"]()}function upcastPointer(ptr,ptrClass,desiredClass){while(ptrClass!==desiredClass){if(!ptrClass.upcast){throwBindingError("Expected null or instance of "+desiredClass.name+", got an instance of "+ptrClass.name)}ptr=ptrClass.upcast(ptr);ptrClass=ptrClass.baseClass}return ptr}function validateThis(this_,classType,humanName){if(!(this_ instanceof Object)){throwBindingError(humanName+' with invalid "this": '+this_)}if(!(this_ instanceof classType.registeredClass.constructor)){throwBindingError(humanName+' incompatible with "this" of type '+this_.constructor.name)}if(!this_.$$.ptr){throwBindingError("cannot call emscripten binding method "+humanName+" on deleted object")}return upcastPointer(this_.$$.ptr,this_.$$.ptrType.registeredClass,classType.registeredClass)}function __embind_register_class_property(classType,fieldName,getterReturnType,getterSignature,getter,getterContext,setterArgumentType,setterSignature,setter,setterContext){fieldName=readLatin1String(fieldName);getter=requireFunction(getterSignature,getter);whenDependentTypesAreResolved([],[classType],(function(classType){classType=classType[0];var humanName=classType.name+"."+fieldName;var desc={get:(function(){throwUnboundTypeError("Cannot access "+humanName+" due to unbound types",[getterReturnType,setterArgumentType])}),enumerable:true,configurable:true};if(setter){desc.set=(function(){throwUnboundTypeError("Cannot access "+humanName+" due to unbound types",[getterReturnType,setterArgumentType])})}else{desc.set=(function(v){throwBindingError(humanName+" is a read-only property")})}Object.defineProperty(classType.registeredClass.instancePrototype,fieldName,desc);whenDependentTypesAreResolved([],setter?[getterReturnType,setterArgumentType]:[getterReturnType],(function(types){var getterReturnType=types[0];var desc={get:(function(){var ptr=validateThis(this,classType,humanName+" getter");return getterReturnType["fromWireType"](getter(getterContext,ptr))}),enumerable:true};if(setter){setter=requireFunction(setterSignature,setter);var setterArgumentType=types[1];desc.set=(function(v){var ptr=validateThis(this,classType,humanName+" setter");var destructors=[];setter(setterContext,ptr,setterArgumentType["toWireType"](destructors,v));runDestructors(destructors)})}Object.defineProperty(classType.registeredClass.instancePrototype,fieldName,desc);return[]}));return[]}))}function _pthread_once(ptr,func){if(!_pthread_once.seen)_pthread_once.seen={};if(ptr in _pthread_once.seen)return;Module["dynCall_v"](func);_pthread_once.seen[ptr]=1}function ClassHandle_isAliasOf(other){if(!(this instanceof ClassHandle)){return false}if(!(other instanceof ClassHandle)){return false}var leftClass=this.$$.ptrType.registeredClass;var left=this.$$.ptr;var rightClass=other.$$.ptrType.registeredClass;var right=other.$$.ptr;while(leftClass.baseClass){left=leftClass.upcast(left);leftClass=leftClass.baseClass}while(rightClass.baseClass){right=rightClass.upcast(right);rightClass=rightClass.baseClass}return leftClass===rightClass&&left===right}function shallowCopyInternalPointer(o){return{count:o.count,deleteScheduled:o.deleteScheduled,preservePointerOnDelete:o.preservePointerOnDelete,ptr:o.ptr,ptrType:o.ptrType,smartPtr:o.smartPtr,smartPtrType:o.smartPtrType}}function throwInstanceAlreadyDeleted(obj){function getInstanceTypeName(handle){return handle.$$.ptrType.registeredClass.name}throwBindingError(getInstanceTypeName(obj)+" instance already deleted")}function ClassHandle_clone(){if(!this.$$.ptr){throwInstanceAlreadyDeleted(this)}if(this.$$.preservePointerOnDelete){this.$$.count.value+=1;return this}else{var clone=Object.create(Object.getPrototypeOf(this),{$$:{value:shallowCopyInternalPointer(this.$$)}});clone.$$.count.value+=1;clone.$$.deleteScheduled=false;return clone}}function runDestructor(handle){var $$=handle.$$;if($$.smartPtr){$$.smartPtrType.rawDestructor($$.smartPtr)}else{$$.ptrType.registeredClass.rawDestructor($$.ptr)}}function ClassHandle_delete(){if(!this.$$.ptr){throwInstanceAlreadyDeleted(this)}if(this.$$.deleteScheduled&&!this.$$.preservePointerOnDelete){throwBindingError("Object already scheduled for deletion")}this.$$.count.value-=1;var toDelete=0===this.$$.count.value;if(toDelete){runDestructor(this)}if(!this.$$.preservePointerOnDelete){this.$$.smartPtr=undefined;this.$$.ptr=undefined}}function ClassHandle_isDeleted(){return!this.$$.ptr}var delayFunction=undefined;var deletionQueue=[];function flushPendingDeletes(){while(deletionQueue.length){var obj=deletionQueue.pop();obj.$$.deleteScheduled=false;obj["delete"]()}}function ClassHandle_deleteLater(){if(!this.$$.ptr){throwInstanceAlreadyDeleted(this)}if(this.$$.deleteScheduled&&!this.$$.preservePointerOnDelete){throwBindingError("Object already scheduled for deletion")}deletionQueue.push(this);if(deletionQueue.length===1&&delayFunction){delayFunction(flushPendingDeletes)}this.$$.deleteScheduled=true;return this}function init_ClassHandle(){ClassHandle.prototype["isAliasOf"]=ClassHandle_isAliasOf;ClassHandle.prototype["clone"]=ClassHandle_clone;ClassHandle.prototype["delete"]=ClassHandle_delete;ClassHandle.prototype["isDeleted"]=ClassHandle_isDeleted;ClassHandle.prototype["deleteLater"]=ClassHandle_deleteLater}function ClassHandle(){}var registeredPointers={};function exposePublicSymbol(name,value,numArguments){if(Module.hasOwnProperty(name)){if(undefined===numArguments||undefined!==Module[name].overloadTable&&undefined!==Module[name].overloadTable[numArguments]){throwBindingError("Cannot register public name '"+name+"' twice")}ensureOverloadTable(Module,name,name);if(Module.hasOwnProperty(numArguments)){throwBindingError("Cannot register multiple overloads of a function with the same number of arguments ("+numArguments+")!")}Module[name].overloadTable[numArguments]=value}else{Module[name]=value;if(undefined!==numArguments){Module[name].numArguments=numArguments}}}function RegisteredClass(name,constructor,instancePrototype,rawDestructor,baseClass,getActualType,upcast,downcast){this.name=name;this.constructor=constructor;this.instancePrototype=instancePrototype;this.rawDestructor=rawDestructor;this.baseClass=baseClass;this.getActualType=getActualType;this.upcast=upcast;this.downcast=downcast;this.pureVirtualFunctions=[]}function constNoSmartPtrRawPointerToWireType(destructors,handle){if(handle===null){if(this.isReference){throwBindingError("null is not a valid "+this.name)}return 0}if(!handle.$$){throwBindingError('Cannot pass "'+_embind_repr(handle)+'" as a '+this.name)}if(!handle.$$.ptr){throwBindingError("Cannot pass deleted object as a pointer of type "+this.name)}var handleClass=handle.$$.ptrType.registeredClass;var ptr=upcastPointer(handle.$$.ptr,handleClass,this.registeredClass);return ptr}function genericPointerToWireType(destructors,handle){if(handle===null){if(this.isReference){throwBindingError("null is not a valid "+this.name)}if(this.isSmartPointer){var ptr=this.rawConstructor();if(destructors!==null){destructors.push(this.rawDestructor,ptr)}return ptr}else{return 0}}if(!handle.$$){throwBindingError('Cannot pass "'+_embind_repr(handle)+'" as a '+this.name)}if(!handle.$$.ptr){throwBindingError("Cannot pass deleted object as a pointer of type "+this.name)}if(!this.isConst&&handle.$$.ptrType.isConst){throwBindingError("Cannot convert argument of type "+(handle.$$.smartPtrType?handle.$$.smartPtrType.name:handle.$$.ptrType.name)+" to parameter type "+this.name)}var handleClass=handle.$$.ptrType.registeredClass;var ptr=upcastPointer(handle.$$.ptr,handleClass,this.registeredClass);if(this.isSmartPointer){if(undefined===handle.$$.smartPtr){throwBindingError("Passing raw pointer to smart pointer is illegal")}switch(this.sharingPolicy){case 0:if(handle.$$.smartPtrType===this){ptr=handle.$$.smartPtr}else{throwBindingError("Cannot convert argument of type "+(handle.$$.smartPtrType?handle.$$.smartPtrType.name:handle.$$.ptrType.name)+" to parameter type "+this.name)}break;case 1:ptr=handle.$$.smartPtr;break;case 2:if(handle.$$.smartPtrType===this){ptr=handle.$$.smartPtr}else{var clonedHandle=handle["clone"]();ptr=this.rawShare(ptr,__emval_register((function(){clonedHandle["delete"]()})));if(destructors!==null){destructors.push(this.rawDestructor,ptr)}}break;default:throwBindingError("Unsupporting sharing policy")}}return ptr}function nonConstNoSmartPtrRawPointerToWireType(destructors,handle){if(handle===null){if(this.isReference){throwBindingError("null is not a valid "+this.name)}return 0}if(!handle.$$){throwBindingError('Cannot pass "'+_embind_repr(handle)+'" as a '+this.name)}if(!handle.$$.ptr){throwBindingError("Cannot pass deleted object as a pointer of type "+this.name)}if(handle.$$.ptrType.isConst){throwBindingError("Cannot convert argument of type "+handle.$$.ptrType.name+" to parameter type "+this.name)}var handleClass=handle.$$.ptrType.registeredClass;var ptr=upcastPointer(handle.$$.ptr,handleClass,this.registeredClass);return ptr}function RegisteredPointer_getPointee(ptr){if(this.rawGetPointee){ptr=this.rawGetPointee(ptr)}return ptr}function RegisteredPointer_destructor(ptr){if(this.rawDestructor){this.rawDestructor(ptr)}}function RegisteredPointer_deleteObject(handle){if(handle!==null){handle["delete"]()}}function downcastPointer(ptr,ptrClass,desiredClass){if(ptrClass===desiredClass){return ptr}if(undefined===desiredClass.baseClass){return null}var rv=downcastPointer(ptr,ptrClass,desiredClass.baseClass);if(rv===null){return null}return desiredClass.downcast(rv)}function getInheritedInstanceCount(){return Object.keys(registeredInstances).length}function getLiveInheritedInstances(){var rv=[];for(var k in registeredInstances){if(registeredInstances.hasOwnProperty(k)){rv.push(registeredInstances[k])}}return rv}function setDelayFunction(fn){delayFunction=fn;if(deletionQueue.length&&delayFunction){delayFunction(flushPendingDeletes)}}function init_embind(){Module["getInheritedInstanceCount"]=getInheritedInstanceCount;Module["getLiveInheritedInstances"]=getLiveInheritedInstances;Module["flushPendingDeletes"]=flushPendingDeletes;Module["setDelayFunction"]=setDelayFunction}var registeredInstances={};function getBasestPointer(class_,ptr){if(ptr===undefined){throwBindingError("ptr should not be undefined")}while(class_.baseClass){ptr=class_.upcast(ptr);class_=class_.baseClass}return ptr}function getInheritedInstance(class_,ptr){ptr=getBasestPointer(class_,ptr);return registeredInstances[ptr]}function makeClassHandle(prototype,record){if(!record.ptrType||!record.ptr){throwInternalError("makeClassHandle requires ptr and ptrType")}var hasSmartPtrType=!!record.smartPtrType;var hasSmartPtr=!!record.smartPtr;if(hasSmartPtrType!==hasSmartPtr){throwInternalError("Both smartPtrType and smartPtr must be specified")}record.count={value:1};return Object.create(prototype,{$$:{value:record}})}function RegisteredPointer_fromWireType(ptr){var rawPointer=this.getPointee(ptr);if(!rawPointer){this.destructor(ptr);return null}var registeredInstance=getInheritedInstance(this.registeredClass,rawPointer);if(undefined!==registeredInstance){if(0===registeredInstance.$$.count.value){registeredInstance.$$.ptr=rawPointer;registeredInstance.$$.smartPtr=ptr;return registeredInstance["clone"]()}else{var rv=registeredInstance["clone"]();this.destructor(ptr);return rv}}function makeDefaultHandle(){if(this.isSmartPointer){return makeClassHandle(this.registeredClass.instancePrototype,{ptrType:this.pointeeType,ptr:rawPointer,smartPtrType:this,smartPtr:ptr})}else{return makeClassHandle(this.registeredClass.instancePrototype,{ptrType:this,ptr:ptr})}}var actualType=this.registeredClass.getActualType(rawPointer);var registeredPointerRecord=registeredPointers[actualType];if(!registeredPointerRecord){return makeDefaultHandle.call(this)}var toType;if(this.isConst){toType=registeredPointerRecord.constPointerType}else{toType=registeredPointerRecord.pointerType}var dp=downcastPointer(rawPointer,this.registeredClass,toType.registeredClass);if(dp===null){return makeDefaultHandle.call(this)}if(this.isSmartPointer){return makeClassHandle(toType.registeredClass.instancePrototype,{ptrType:toType,ptr:dp,smartPtrType:this,smartPtr:ptr})}else{return makeClassHandle(toType.registeredClass.instancePrototype,{ptrType:toType,ptr:dp})}}function init_RegisteredPointer(){RegisteredPointer.prototype.getPointee=RegisteredPointer_getPointee;RegisteredPointer.prototype.destructor=RegisteredPointer_destructor;RegisteredPointer.prototype["argPackAdvance"]=8;RegisteredPointer.prototype["readValueFromPointer"]=simpleReadValueFromPointer;RegisteredPointer.prototype["deleteObject"]=RegisteredPointer_deleteObject;RegisteredPointer.prototype["fromWireType"]=RegisteredPointer_fromWireType}function RegisteredPointer(name,registeredClass,isReference,isConst,isSmartPointer,pointeeType,sharingPolicy,rawGetPointee,rawConstructor,rawShare,rawDestructor){this.name=name;this.registeredClass=registeredClass;this.isReference=isReference;this.isConst=isConst;this.isSmartPointer=isSmartPointer;this.pointeeType=pointeeType;this.sharingPolicy=sharingPolicy;this.rawGetPointee=rawGetPointee;this.rawConstructor=rawConstructor;this.rawShare=rawShare;this.rawDestructor=rawDestructor;if(!isSmartPointer&®isteredClass.baseClass===undefined){if(isConst){this["toWireType"]=constNoSmartPtrRawPointerToWireType;this.destructorFunction=null}else{this["toWireType"]=nonConstNoSmartPtrRawPointerToWireType;this.destructorFunction=null}}else{this["toWireType"]=genericPointerToWireType}}function replacePublicSymbol(name,value,numArguments){if(!Module.hasOwnProperty(name)){throwInternalError("Replacing nonexistant public symbol")}if(undefined!==Module[name].overloadTable&&undefined!==numArguments){Module[name].overloadTable[numArguments]=value}else{Module[name]=value;Module[name].argCount=numArguments}}function __embind_register_class(rawType,rawPointerType,rawConstPointerType,baseClassRawType,getActualTypeSignature,getActualType,upcastSignature,upcast,downcastSignature,downcast,name,destructorSignature,rawDestructor){name=readLatin1String(name);getActualType=requireFunction(getActualTypeSignature,getActualType);if(upcast){upcast=requireFunction(upcastSignature,upcast)}if(downcast){downcast=requireFunction(downcastSignature,downcast)}rawDestructor=requireFunction(destructorSignature,rawDestructor);var legalFunctionName=makeLegalFunctionName(name);exposePublicSymbol(legalFunctionName,(function(){throwUnboundTypeError("Cannot construct "+name+" due to unbound types",[baseClassRawType])}));whenDependentTypesAreResolved([rawType,rawPointerType,rawConstPointerType],baseClassRawType?[baseClassRawType]:[],(function(base){base=base[0];var baseClass;var basePrototype;if(baseClassRawType){baseClass=base.registeredClass;basePrototype=baseClass.instancePrototype}else{basePrototype=ClassHandle.prototype}var constructor=createNamedFunction(legalFunctionName,(function(){if(Object.getPrototypeOf(this)!==instancePrototype){throw new BindingError("Use 'new' to construct "+name)}if(undefined===registeredClass.constructor_body){throw new BindingError(name+" has no accessible constructor")}var body=registeredClass.constructor_body[arguments.length];if(undefined===body){throw new BindingError("Tried to invoke ctor of "+name+" with invalid number of parameters ("+arguments.length+") - expected ("+Object.keys(registeredClass.constructor_body).toString()+") parameters instead!")}return body.apply(this,arguments)}));var instancePrototype=Object.create(basePrototype,{constructor:{value:constructor}});constructor.prototype=instancePrototype;var registeredClass=new RegisteredClass(name,constructor,instancePrototype,rawDestructor,baseClass,getActualType,upcast,downcast);var referenceConverter=new RegisteredPointer(name,registeredClass,true,false,false);var pointerConverter=new RegisteredPointer(name+"*",registeredClass,false,false,false);var constPointerConverter=new RegisteredPointer(name+" const*",registeredClass,false,true,false);registeredPointers[rawType]={pointerType:pointerConverter,constPointerType:constPointerConverter};replacePublicSymbol(legalFunctionName,constructor);return[referenceConverter,pointerConverter,constPointerConverter]}))}function ___lock(){}function ___unlock(){}function _pthread_mutexattr_init(){}function _pthread_getspecific(key){return PTHREAD_SPECIFIC[key]||0}function __embind_register_enum_value(rawEnumType,name,enumValue){var enumType=requireRegisteredType(rawEnumType,"enum");name=readLatin1String(name);var Enum=enumType.constructor;var Value=Object.create(enumType.constructor.prototype,{value:{value:enumValue},constructor:{value:createNamedFunction(enumType.name+"_"+name,(function(){}))}});Enum.values[enumValue]=Value;Enum[name]=Value}function __emval_get_property(handle,key){handle=requireHandle(handle);key=requireHandle(key);return __emval_register(handle[key])}function __embind_register_emval(rawType,name){name=readLatin1String(name);registerType(rawType,{name:name,"fromWireType":(function(handle){var rv=emval_handle_array[handle].value;__emval_decref(handle);return rv}),"toWireType":(function(destructors,value){return __emval_register(value)}),"argPackAdvance":8,"readValueFromPointer":simpleReadValueFromPointer,destructorFunction:null})}function _pthread_setspecific(key,value){if(!(key in PTHREAD_SPECIFIC)){return ERRNO_CODES.EINVAL}PTHREAD_SPECIFIC[key]=value;return 0}function ___cxa_allocate_exception(size){return _malloc(size)}function ___cxa_pure_virtual(){ABORT=true;throw"Pure virtual function called!"}function _gzeof(){Module["printErr"]("missing function: gzeof");abort(-1)}function floatReadValueFromPointer(name,shift){switch(shift){case 2:return(function(pointer){return this["fromWireType"](HEAPF32[pointer>>2])});case 3:return(function(pointer){return this["fromWireType"](HEAPF64[pointer>>3])});default:throw new TypeError("Unknown float type: "+name)}}function __embind_register_float(rawType,name,size){var shift=getShiftFromSize(size);name=readLatin1String(name);registerType(rawType,{name:name,"fromWireType":(function(value){return value}),"toWireType":(function(destructors,value){if(typeof value!=="number"&&typeof value!=="boolean"){throw new TypeError('Cannot convert "'+_embind_repr(value)+'" to '+this.name)}return value}),"argPackAdvance":8,"readValueFromPointer":floatReadValueFromPointer(name,shift),destructorFunction:null})}function __embind_register_function(name,argCount,rawArgTypesAddr,signature,rawInvoker,fn){var argTypes=heap32VectorToArray(argCount,rawArgTypesAddr);name=readLatin1String(name);rawInvoker=requireFunction(signature,rawInvoker);exposePublicSymbol(name,(function(){throwUnboundTypeError("Cannot call "+name+" due to unbound types",argTypes)}),argCount-1);whenDependentTypesAreResolved([],argTypes,(function(argTypes){var invokerArgsArray=[argTypes[0],null].concat(argTypes.slice(1));replacePublicSymbol(name,craftInvokerFunction(name,invokerArgsArray,null,rawInvoker,fn),argCount-1);return[]}))}function __embind_register_constant(name,type,value){name=readLatin1String(name);whenDependentTypesAreResolved([],[type],(function(type){type=type[0];Module[name]=type["fromWireType"](value);return[]}))}function ___cxa_begin_catch(ptr){var info=EXCEPTIONS.infos[ptr];if(info&&!info.caught){info.caught=true;__ZSt18uncaught_exceptionv.uncaught_exception--}if(info)info.rethrown=false;EXCEPTIONS.caught.push(ptr);EXCEPTIONS.addRef(EXCEPTIONS.deAdjust(ptr));return ptr}function ___syscall5(which,varargs){SYSCALLS.varargs=varargs;try{var pathname=SYSCALLS.getStr(),flags=SYSCALLS.get(),mode=SYSCALLS.get();var stream=FS.open(pathname,flags,mode);return stream.fd}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function ___syscall140(which,varargs){SYSCALLS.varargs=varargs;try{var stream=SYSCALLS.getStreamFromFD(),offset_high=SYSCALLS.get(),offset_low=SYSCALLS.get(),result=SYSCALLS.get(),whence=SYSCALLS.get();var offset=offset_low;FS.llseek(stream,offset,whence);HEAP32[result>>2]=stream.position;if(stream.getdents&&offset===0&&whence===0)stream.getdents=null;return 0}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function ___syscall6(which,varargs){SYSCALLS.varargs=varargs;try{var stream=SYSCALLS.getStreamFromFD();FS.close(stream);return 0}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function __embind_register_std_wstring(rawType,charSize,name){name=readLatin1String(name);var getHeap,shift;if(charSize===2){getHeap=(function(){return HEAPU16});shift=1}else if(charSize===4){getHeap=(function(){return HEAPU32});shift=2}registerType(rawType,{name:name,"fromWireType":(function(value){var HEAP=getHeap();var length=HEAPU32[value>>2];var a=new Array(length);var start=value+4>>shift;for(var i=0;i>2]=length;var start=ptr+4>>shift;for(var i=0;i>1])});case 2:return(function(pointer){var heap=signed?HEAP32:HEAPU32;return this["fromWireType"](heap[pointer>>2])});default:throw new TypeError("Unknown integer type: "+name)}}function __embind_register_enum(rawType,name,size,isSigned){var shift=getShiftFromSize(size);name=readLatin1String(name);function ctor(){}ctor.values={};registerType(rawType,{name:name,constructor:ctor,"fromWireType":(function(c){return this.constructor.values[c]}),"toWireType":(function(destructors,c){return c.value}),"argPackAdvance":8,"readValueFromPointer":enumReadValueFromPointer(name,shift,isSigned),destructorFunction:null});exposePublicSymbol(name,ctor)}function _llvm_exp2_f32(x){return Math.pow(2,x)}function __embind_register_class_constructor(rawClassType,argCount,rawArgTypesAddr,invokerSignature,invoker,rawConstructor){var rawArgTypes=heap32VectorToArray(argCount,rawArgTypesAddr);invoker=requireFunction(invokerSignature,invoker);whenDependentTypesAreResolved([],[rawClassType],(function(classType){classType=classType[0];var humanName="constructor "+classType.name;if(undefined===classType.registeredClass.constructor_body){classType.registeredClass.constructor_body=[]}if(undefined!==classType.registeredClass.constructor_body[argCount-1]){throw new BindingError("Cannot register multiple constructors with identical number of parameters ("+(argCount-1)+") for class '"+classType.name+"'! Overload resolution is currently only performed using the parameter count, not actual type info!")}classType.registeredClass.constructor_body[argCount-1]=function unboundTypeHandler(){throwUnboundTypeError("Cannot construct "+classType.name+" due to unbound types",rawArgTypes)};whenDependentTypesAreResolved([],rawArgTypes,(function(argTypes){classType.registeredClass.constructor_body[argCount-1]=function constructor_body(){if(arguments.length!==argCount-1){throwBindingError(humanName+" called with "+arguments.length+" arguments, expected "+(argCount-1))}var destructors=[];var args=new Array(argCount);args[0]=rawConstructor;for(var i=1;i>1]=2;return 0};case 13:case 14:case 13:case 14:return 0;case 16:case 8:return-ERRNO_CODES.EINVAL;case 9:___setErrNo(ERRNO_CODES.EINVAL);return-1;default:{return-ERRNO_CODES.EINVAL}}}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function ___syscall145(which,varargs){SYSCALLS.varargs=varargs;try{var stream=SYSCALLS.getStreamFromFD(),iov=SYSCALLS.get(),iovcnt=SYSCALLS.get();return SYSCALLS.doReadv(stream,iov,iovcnt)}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}embind_init_charCodes();init_emval();BindingError=Module["BindingError"]=extendError(Error,"BindingError");InternalError=Module["InternalError"]=extendError(Error,"InternalError");FS.staticInit();__ATINIT__.unshift((function(){if(!Module["noFSInit"]&&!FS.init.initialized)FS.init()}));__ATMAIN__.push((function(){FS.ignorePermissions=false}));__ATEXIT__.push((function(){FS.quit()}));Module["FS_createFolder"]=FS.createFolder;Module["FS_createPath"]=FS.createPath;Module["FS_createDataFile"]=FS.createDataFile;Module["FS_createPreloadedFile"]=FS.createPreloadedFile;Module["FS_createLazyFile"]=FS.createLazyFile;Module["FS_createLink"]=FS.createLink;Module["FS_createDevice"]=FS.createDevice;Module["FS_unlink"]=FS.unlink;__ATINIT__.unshift((function(){TTY.init()}));__ATEXIT__.push((function(){TTY.shutdown()}));if(ENVIRONMENT_IS_NODE){var fs=require("fs");var NODEJS_PATH=require("path");NODEFS.staticInit()}UnboundTypeError=Module["UnboundTypeError"]=extendError(Error,"UnboundTypeError");___buildEnvironment(ENV);init_ClassHandle();init_RegisteredPointer();init_embind();DYNAMICTOP_PTR=allocate(1,"i32",ALLOC_STATIC);STACK_BASE=STACKTOP=Runtime.alignMemory(STATICTOP);STACK_MAX=STACK_BASE+TOTAL_STACK;DYNAMIC_BASE=Runtime.alignMemory(STACK_MAX);HEAP32[DYNAMICTOP_PTR>>2]=DYNAMIC_BASE;staticSealed=true;Module["wasmTableSize"]=2300;Module["wasmMaxTableSize"]=2300;function invoke_iiiiiiii(index,a1,a2,a3,a4,a5,a6,a7){try{return Module["dynCall_iiiiiiii"](index,a1,a2,a3,a4,a5,a6,a7)}catch(e){if(typeof e!=="number"&&e!=="longjmp")throw e;Module["setThrew"](1,0)}}function invoke_iiiiiid(index,a1,a2,a3,a4,a5,a6){try{return Module["dynCall_iiiiiid"](index,a1,a2,a3,a4,a5,a6)}catch(e){if(typeof e!=="number"&&e!=="longjmp")throw e;Module["setThrew"](1,0)}}function invoke_vid(index,a1,a2){try{Module["dynCall_vid"](index,a1,a2)}catch(e){if(typeof e!=="number"&&e!=="longjmp")throw e;Module["setThrew"](1,0)}}function invoke_viiiii(index,a1,a2,a3,a4,a5){try{Module["dynCall_viiiii"](index,a1,a2,a3,a4,a5)}catch(e){if(typeof e!=="number"&&e!=="longjmp")throw e;Module["setThrew"](1,0)}}function invoke_vi(index,a1){try{Module["dynCall_vi"](index,a1)}catch(e){if(typeof e!=="number"&&e!=="longjmp")throw e;Module["setThrew"](1,0)}}function invoke_vii(index,a1,a2){try{Module["dynCall_vii"](index,a1,a2)}catch(e){if(typeof e!=="number"&&e!=="longjmp")throw e;Module["setThrew"](1,0)}}function invoke_iiiiiii(index,a1,a2,a3,a4,a5,a6){try{return Module["dynCall_iiiiiii"](index,a1,a2,a3,a4,a5,a6)}catch(e){if(typeof e!=="number"&&e!=="longjmp")throw e;Module["setThrew"](1,0)}}function invoke_ii(index,a1){try{return Module["dynCall_ii"](index,a1)}catch(e){if(typeof e!=="number"&&e!=="longjmp")throw e;Module["setThrew"](1,0)}}function invoke_viijii(index,a1,a2,a3,a4,a5,a6){try{Module["dynCall_viijii"](index,a1,a2,a3,a4,a5,a6)}catch(e){if(typeof e!=="number"&&e!=="longjmp")throw e;Module["setThrew"](1,0)}}function invoke_iidddd(index,a1,a2,a3,a4,a5){try{return Module["dynCall_iidddd"](index,a1,a2,a3,a4,a5)}catch(e){if(typeof e!=="number"&&e!=="longjmp")throw e;Module["setThrew"](1,0)}}function invoke_viiiiiiiddi(index,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10){try{Module["dynCall_viiiiiiiddi"](index,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10)}catch(e){if(typeof e!=="number"&&e!=="longjmp")throw e;Module["setThrew"](1,0)}}function invoke_iidd(index,a1,a2,a3){try{return Module["dynCall_iidd"](index,a1,a2,a3)}catch(e){if(typeof e!=="number"&&e!=="longjmp")throw e;Module["setThrew"](1,0)}}function invoke_viidi(index,a1,a2,a3,a4){try{Module["dynCall_viidi"](index,a1,a2,a3,a4)}catch(e){if(typeof e!=="number"&&e!=="longjmp")throw e;Module["setThrew"](1,0)}}function invoke_iiiid(index,a1,a2,a3,a4){try{return Module["dynCall_iiiid"](index,a1,a2,a3,a4)}catch(e){if(typeof e!=="number"&&e!=="longjmp")throw e;Module["setThrew"](1,0)}}function invoke_viiiiiiiiiiddi(index,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13){try{Module["dynCall_viiiiiiiiiiddi"](index,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13)}catch(e){if(typeof e!=="number"&&e!=="longjmp")throw e;Module["setThrew"](1,0)}}function invoke_viiidd(index,a1,a2,a3,a4,a5){try{Module["dynCall_viiidd"](index,a1,a2,a3,a4,a5)}catch(e){if(typeof e!=="number"&&e!=="longjmp")throw e;Module["setThrew"](1,0)}}function invoke_vidii(index,a1,a2,a3,a4){try{Module["dynCall_vidii"](index,a1,a2,a3,a4)}catch(e){if(typeof e!=="number"&&e!=="longjmp")throw e;Module["setThrew"](1,0)}}function invoke_iiiii(index,a1,a2,a3,a4){try{return Module["dynCall_iiiii"](index,a1,a2,a3,a4)}catch(e){if(typeof e!=="number"&&e!=="longjmp")throw e;Module["setThrew"](1,0)}}function invoke_di(index,a1){try{return Module["dynCall_di"](index,a1)}catch(e){if(typeof e!=="number"&&e!=="longjmp")throw e;Module["setThrew"](1,0)}}function invoke_viiiiiiiiiii(index,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11){try{Module["dynCall_viiiiiiiiiii"](index,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11)}catch(e){if(typeof e!=="number"&&e!=="longjmp")throw e;Module["setThrew"](1,0)}}function invoke_iiii(index,a1,a2,a3){try{return Module["dynCall_iiii"](index,a1,a2,a3)}catch(e){if(typeof e!=="number"&&e!=="longjmp")throw e;Module["setThrew"](1,0)}}function invoke_viiif(index,a1,a2,a3,a4){try{Module["dynCall_viiif"](index,a1,a2,a3,a4)}catch(e){if(typeof e!=="number"&&e!=="longjmp")throw e;Module["setThrew"](1,0)}}function invoke_viiiiiiii(index,a1,a2,a3,a4,a5,a6,a7,a8){try{Module["dynCall_viiiiiiii"](index,a1,a2,a3,a4,a5,a6,a7,a8)}catch(e){if(typeof e!=="number"&&e!=="longjmp")throw e;Module["setThrew"](1,0)}}function invoke_fii(index,a1,a2){try{return Module["dynCall_fii"](index,a1,a2)}catch(e){if(typeof e!=="number"&&e!=="longjmp")throw e;Module["setThrew"](1,0)}}function invoke_diiii(index,a1,a2,a3,a4){try{return Module["dynCall_diiii"](index,a1,a2,a3,a4)}catch(e){if(typeof e!=="number"&&e!=="longjmp")throw e;Module["setThrew"](1,0)}}function invoke_viid(index,a1,a2,a3){try{Module["dynCall_viid"](index,a1,a2,a3)}catch(e){if(typeof e!=="number"&&e!=="longjmp")throw e;Module["setThrew"](1,0)}}function invoke_fiii(index,a1,a2,a3){try{return Module["dynCall_fiii"](index,a1,a2,a3)}catch(e){if(typeof e!=="number"&&e!=="longjmp")throw e;Module["setThrew"](1,0)}}function invoke_diiiii(index,a1,a2,a3,a4,a5){try{return Module["dynCall_diiiii"](index,a1,a2,a3,a4,a5)}catch(e){if(typeof e!=="number"&&e!=="longjmp")throw e;Module["setThrew"](1,0)}}function invoke_viiifii(index,a1,a2,a3,a4,a5,a6){try{Module["dynCall_viiifii"](index,a1,a2,a3,a4,a5,a6)}catch(e){if(typeof e!=="number"&&e!=="longjmp")throw e;Module["setThrew"](1,0)}}function invoke_viiiidd(index,a1,a2,a3,a4,a5,a6){try{Module["dynCall_viiiidd"](index,a1,a2,a3,a4,a5,a6)}catch(e){if(typeof e!=="number"&&e!=="longjmp")throw e;Module["setThrew"](1,0)}}function invoke_iid(index,a1,a2){try{return Module["dynCall_iid"](index,a1,a2)}catch(e){if(typeof e!=="number"&&e!=="longjmp")throw e;Module["setThrew"](1,0)}}function invoke_viiiiiii(index,a1,a2,a3,a4,a5,a6,a7){try{Module["dynCall_viiiiiii"](index,a1,a2,a3,a4,a5,a6,a7)}catch(e){if(typeof e!=="number"&&e!=="longjmp")throw e;Module["setThrew"](1,0)}}function invoke_iiddd(index,a1,a2,a3,a4){try{return Module["dynCall_iiddd"](index,a1,a2,a3,a4)}catch(e){if(typeof e!=="number"&&e!=="longjmp")throw e;Module["setThrew"](1,0)}}function invoke_viiiiiiiii(index,a1,a2,a3,a4,a5,a6,a7,a8,a9){try{Module["dynCall_viiiiiiiii"](index,a1,a2,a3,a4,a5,a6,a7,a8,a9)}catch(e){if(typeof e!=="number"&&e!=="longjmp")throw e;Module["setThrew"](1,0)}}function invoke_viiiiiiiiii(index,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10){try{Module["dynCall_viiiiiiiiii"](index,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10)}catch(e){if(typeof e!=="number"&&e!=="longjmp")throw e;Module["setThrew"](1,0)}}function invoke_iii(index,a1,a2){try{return Module["dynCall_iii"](index,a1,a2)}catch(e){if(typeof e!=="number"&&e!=="longjmp")throw e;Module["setThrew"](1,0)}}function invoke_diii(index,a1,a2,a3){try{return Module["dynCall_diii"](index,a1,a2,a3)}catch(e){if(typeof e!=="number"&&e!=="longjmp")throw e;Module["setThrew"](1,0)}}function invoke_viiiiii(index,a1,a2,a3,a4,a5,a6){try{Module["dynCall_viiiiii"](index,a1,a2,a3,a4,a5,a6)}catch(e){if(typeof e!=="number"&&e!=="longjmp")throw e;Module["setThrew"](1,0)}}function invoke_dii(index,a1,a2){try{return Module["dynCall_dii"](index,a1,a2)}catch(e){if(typeof e!=="number"&&e!=="longjmp")throw e;Module["setThrew"](1,0)}}function invoke_viiiid(index,a1,a2,a3,a4,a5){try{Module["dynCall_viiiid"](index,a1,a2,a3,a4,a5)}catch(e){if(typeof e!=="number"&&e!=="longjmp")throw e;Module["setThrew"](1,0)}}function invoke_fiiiii(index,a1,a2,a3,a4,a5){try{return Module["dynCall_fiiiii"](index,a1,a2,a3,a4,a5)}catch(e){if(typeof e!=="number"&&e!=="longjmp")throw e;Module["setThrew"](1,0)}}function invoke_i(index){try{return Module["dynCall_i"](index)}catch(e){if(typeof e!=="number"&&e!=="longjmp")throw e;Module["setThrew"](1,0)}}function invoke_fiiii(index,a1,a2,a3,a4){try{return Module["dynCall_fiiii"](index,a1,a2,a3,a4)}catch(e){if(typeof e!=="number"&&e!=="longjmp")throw e;Module["setThrew"](1,0)}}function invoke_iiiiii(index,a1,a2,a3,a4,a5){try{return Module["dynCall_iiiiii"](index,a1,a2,a3,a4,a5)}catch(e){if(typeof e!=="number"&&e!=="longjmp")throw e;Module["setThrew"](1,0)}}function invoke_viiid(index,a1,a2,a3,a4){try{Module["dynCall_viiid"](index,a1,a2,a3,a4)}catch(e){if(typeof e!=="number"&&e!=="longjmp")throw e;Module["setThrew"](1,0)}}function invoke_iiiiij(index,a1,a2,a3,a4,a5,a6){try{return Module["dynCall_iiiiij"](index,a1,a2,a3,a4,a5,a6)}catch(e){if(typeof e!=="number"&&e!=="longjmp")throw e;Module["setThrew"](1,0)}}function invoke_viii(index,a1,a2,a3){try{Module["dynCall_viii"](index,a1,a2,a3)}catch(e){if(typeof e!=="number"&&e!=="longjmp")throw e;Module["setThrew"](1,0)}}function invoke_v(index){try{Module["dynCall_v"](index)}catch(e){if(typeof e!=="number"&&e!=="longjmp")throw e;Module["setThrew"](1,0)}}function invoke_iiiiiiiii(index,a1,a2,a3,a4,a5,a6,a7,a8){try{return Module["dynCall_iiiiiiiii"](index,a1,a2,a3,a4,a5,a6,a7,a8)}catch(e){if(typeof e!=="number"&&e!=="longjmp")throw e;Module["setThrew"](1,0)}}function invoke_viif(index,a1,a2,a3){try{Module["dynCall_viif"](index,a1,a2,a3)}catch(e){if(typeof e!=="number"&&e!=="longjmp")throw e;Module["setThrew"](1,0)}}function invoke_viiii(index,a1,a2,a3,a4){try{Module["dynCall_viiii"](index,a1,a2,a3,a4)}catch(e){if(typeof e!=="number"&&e!=="longjmp")throw e;Module["setThrew"](1,0)}}function invoke_iiiiid(index,a1,a2,a3,a4,a5){try{return Module["dynCall_iiiiid"](index,a1,a2,a3,a4,a5)}catch(e){if(typeof e!=="number"&&e!=="longjmp")throw e;Module["setThrew"](1,0)}}function invoke_iiiif(index,a1,a2,a3,a4){try{return Module["dynCall_iiiif"](index,a1,a2,a3,a4)}catch(e){if(typeof e!=="number"&&e!=="longjmp")throw e;Module["setThrew"](1,0)}}Module.asmGlobalArg={"Math":Math,"Int8Array":Int8Array,"Int16Array":Int16Array,"Int32Array":Int32Array,"Uint8Array":Uint8Array,"Uint16Array":Uint16Array,"Uint32Array":Uint32Array,"Float32Array":Float32Array,"Float64Array":Float64Array,"NaN":NaN,"Infinity":Infinity,"byteLength":byteLength};Module.asmLibraryArg={"abort":abort,"assert":assert,"enlargeMemory":enlargeMemory,"getTotalMemory":getTotalMemory,"abortOnCannotGrowMemory":abortOnCannotGrowMemory,"invoke_iiiiiiii":invoke_iiiiiiii,"invoke_iiiiiid":invoke_iiiiiid,"invoke_vid":invoke_vid,"invoke_viiiii":invoke_viiiii,"invoke_vi":invoke_vi,"invoke_vii":invoke_vii,"invoke_iiiiiii":invoke_iiiiiii,"invoke_ii":invoke_ii,"invoke_viijii":invoke_viijii,"invoke_iidddd":invoke_iidddd,"invoke_viiiiiiiddi":invoke_viiiiiiiddi,"invoke_iidd":invoke_iidd,"invoke_viidi":invoke_viidi,"invoke_iiiid":invoke_iiiid,"invoke_viiiiiiiiiiddi":invoke_viiiiiiiiiiddi,"invoke_viiidd":invoke_viiidd,"invoke_vidii":invoke_vidii,"invoke_iiiii":invoke_iiiii,"invoke_di":invoke_di,"invoke_viiiiiiiiiii":invoke_viiiiiiiiiii,"invoke_iiii":invoke_iiii,"invoke_viiif":invoke_viiif,"invoke_viiiiiiii":invoke_viiiiiiii,"invoke_fii":invoke_fii,"invoke_diiii":invoke_diiii,"invoke_viid":invoke_viid,"invoke_fiii":invoke_fiii,"invoke_diiiii":invoke_diiiii,"invoke_viiifii":invoke_viiifii,"invoke_viiiidd":invoke_viiiidd,"invoke_iid":invoke_iid,"invoke_viiiiiii":invoke_viiiiiii,"invoke_iiddd":invoke_iiddd,"invoke_viiiiiiiii":invoke_viiiiiiiii,"invoke_viiiiiiiiii":invoke_viiiiiiiiii,"invoke_iii":invoke_iii,"invoke_diii":invoke_diii,"invoke_viiiiii":invoke_viiiiii,"invoke_dii":invoke_dii,"invoke_viiiid":invoke_viiiid,"invoke_fiiiii":invoke_fiiiii,"invoke_i":invoke_i,"invoke_fiiii":invoke_fiiii,"invoke_iiiiii":invoke_iiiiii,"invoke_viiid":invoke_viiid,"invoke_iiiiij":invoke_iiiiij,"invoke_viii":invoke_viii,"invoke_v":invoke_v,"invoke_iiiiiiiii":invoke_iiiiiiiii,"invoke_viif":invoke_viif,"invoke_viiii":invoke_viiii,"invoke_iiiiid":invoke_iiiiid,"invoke_iiiif":invoke_iiiif,"___syscall221":___syscall221,"floatReadValueFromPointer":floatReadValueFromPointer,"simpleReadValueFromPointer":simpleReadValueFromPointer,"throwInternalError":throwInternalError,"get_first_emval":get_first_emval,"whenDependentTypesAreResolved":whenDependentTypesAreResolved,"getLiveInheritedInstances":getLiveInheritedInstances,"__ZSt18uncaught_exceptionv":__ZSt18uncaught_exceptionv,"ClassHandle":ClassHandle,"getShiftFromSize":getShiftFromSize,"__emval_get_property":__emval_get_property,"__addDays":__addDays,"ClassHandle_clone":ClassHandle_clone,"___cxa_begin_catch":___cxa_begin_catch,"_emscripten_memcpy_big":_emscripten_memcpy_big,"runDestructor":runDestructor,"throwInstanceAlreadyDeleted":throwInstanceAlreadyDeleted,"__embind_register_std_string":__embind_register_std_string,"init_RegisteredPointer":init_RegisteredPointer,"getStringOrSymbol":getStringOrSymbol,"_gzeof":_gzeof,"flushPendingDeletes":flushPendingDeletes,"_pthread_mutexattr_settype":_pthread_mutexattr_settype,"_gzopen":_gzopen,"__isLeapYear":__isLeapYear,"__embind_register_class_constructor":__embind_register_class_constructor,"_gzputs":_gzputs,"__embind_finalize_value_array":__embind_finalize_value_array,"init_ClassHandle":init_ClassHandle,"__embind_register_constant":__embind_register_constant,"___syscall140":___syscall140,"constNoSmartPtrRawPointerToWireType":constNoSmartPtrRawPointerToWireType,"___syscall145":___syscall145,"___syscall146":___syscall146,"_gzgets":_gzgets,"requireHandle":requireHandle,"__embind_register_value_array_element":__embind_register_value_array_element,"___cxa_find_matching_catch":___cxa_find_matching_catch,"embind_init_charCodes":embind_init_charCodes,"__emval_as":__emval_as,"___setErrNo":___setErrNo,"__embind_register_class_class_function":__embind_register_class_class_function,"_llvm_pow_f32":_llvm_pow_f32,"__embind_register_bool":__embind_register_bool,"___resumeException":___resumeException,"createNamedFunction":createNamedFunction,"validateThis":validateThis,"__embind_register_emval":__embind_register_emval,"___buildEnvironment":___buildEnvironment,"__emval_decref":__emval_decref,"_pthread_once":_pthread_once,"init_embind":init_embind,"___syscall91":___syscall91,"heap32VectorToArray":heap32VectorToArray,"__emval_run_destructors":__emval_run_destructors,"ClassHandle_delete":ClassHandle_delete,"RegisteredPointer_destructor":RegisteredPointer_destructor,"_llvm_exp2_f32":_llvm_exp2_f32,"___syscall6":___syscall6,"___syscall5":___syscall5,"ensureOverloadTable":ensureOverloadTable,"new_":new_,"downcastPointer":downcastPointer,"replacePublicSymbol":replacePublicSymbol,"__embind_register_class":__embind_register_class,"_llvm_pow_f64":_llvm_pow_f64,"ClassHandle_deleteLater":ClassHandle_deleteLater,"___syscall54":___syscall54,"RegisteredPointer_deleteObject":RegisteredPointer_deleteObject,"ClassHandle_isDeleted":ClassHandle_isDeleted,"__embind_register_integer":__embind_register_integer,"___cxa_allocate_exception":___cxa_allocate_exception,"__emval_take_value":__emval_take_value,"enumReadValueFromPointer":enumReadValueFromPointer,"_embind_repr":_embind_repr,"_strftime":_strftime,"__embind_register_class_function":__embind_register_class_function,"throwUnboundTypeError":throwUnboundTypeError,"_pthread_mutex_destroy":_pthread_mutex_destroy,"_getenv":_getenv,"runDestructors":runDestructors,"requireRegisteredType":requireRegisteredType,"makeLegalFunctionName":makeLegalFunctionName,"_pthread_key_create":_pthread_key_create,"upcastPointer":upcastPointer,"init_emval":init_emval,"shallowCopyInternalPointer":shallowCopyInternalPointer,"nonConstNoSmartPtrRawPointerToWireType":nonConstNoSmartPtrRawPointerToWireType,"__embind_register_value_array":__embind_register_value_array,"_abort":_abort,"throwBindingError":throwBindingError,"getTypeName":getTypeName,"__embind_register_class_property":__embind_register_class_property,"exposePublicSymbol":exposePublicSymbol,"RegisteredPointer_fromWireType":RegisteredPointer_fromWireType,"___cxa_pure_virtual":___cxa_pure_virtual,"_pthread_getspecific":_pthread_getspecific,"_pthread_cond_wait":_pthread_cond_wait,"___lock":___lock,"RegisteredClass":RegisteredClass,"__embind_register_memory_view":__embind_register_memory_view,"getInheritedInstance":getInheritedInstance,"setDelayFunction":setDelayFunction,"___gxx_personality_v0":___gxx_personality_v0,"extendError":extendError,"__embind_register_void":__embind_register_void,"__embind_register_function":__embind_register_function,"_pthread_mutexattr_destroy":_pthread_mutexattr_destroy,"_strftime_l":_strftime_l,"RegisteredPointer_getPointee":RegisteredPointer_getPointee,"__emval_register":__emval_register,"__embind_register_std_wstring":__embind_register_std_wstring,"ClassHandle_isAliasOf":ClassHandle_isAliasOf,"_gzclose":_gzclose,"__emval_incref":__emval_incref,"RegisteredPointer":RegisteredPointer,"__arraySum":__arraySum,"readLatin1String":readLatin1String,"craftInvokerFunction":craftInvokerFunction,"getBasestPointer":getBasestPointer,"getInheritedInstanceCount":getInheritedInstanceCount,"__embind_register_float":__embind_register_float,"integerReadValueFromPointer":integerReadValueFromPointer,"___unlock":___unlock,"__embind_register_enum_value":__embind_register_enum_value,"_pthread_mutexattr_init":_pthread_mutexattr_init,"_pthread_setspecific":_pthread_setspecific,"genericPointerToWireType":genericPointerToWireType,"registerType":registerType,"___cxa_throw":___cxa_throw,"_gzrewind":_gzrewind,"__embind_register_enum":__embind_register_enum,"__emval_new_cstring":__emval_new_cstring,"count_emval_handles":count_emval_handles,"requireFunction":requireFunction,"makeClassHandle":makeClassHandle,"_pthread_mutex_init":_pthread_mutex_init,"___map_file":___map_file,"DYNAMICTOP_PTR":DYNAMICTOP_PTR,"tempDoublePtr":tempDoublePtr,"ABORT":ABORT,"STACKTOP":STACKTOP,"STACK_MAX":STACK_MAX};var asm=Module["asm"](Module.asmGlobalArg,Module.asmLibraryArg,buffer);Module["asm"]=asm;var _roundf=Module["_roundf"]=(function(){return Module["asm"]["_roundf"].apply(null,arguments)});var __GLOBAL__sub_I_system_cpp=Module["__GLOBAL__sub_I_system_cpp"]=(function(){return Module["asm"]["__GLOBAL__sub_I_system_cpp"].apply(null,arguments)});var __GLOBAL__sub_I_umatrix_cpp=Module["__GLOBAL__sub_I_umatrix_cpp"]=(function(){return Module["asm"]["__GLOBAL__sub_I_umatrix_cpp"].apply(null,arguments)});var stackSave=Module["stackSave"]=(function(){return Module["asm"]["stackSave"].apply(null,arguments)});var ___cxx_global_var_init_362=Module["___cxx_global_var_init_362"]=(function(){return Module["asm"]["___cxx_global_var_init_362"].apply(null,arguments)});var ___cxx_global_var_init_361=Module["___cxx_global_var_init_361"]=(function(){return Module["asm"]["___cxx_global_var_init_361"].apply(null,arguments)});var ___cxx_global_var_init_360=Module["___cxx_global_var_init_360"]=(function(){return Module["asm"]["___cxx_global_var_init_360"].apply(null,arguments)});var __GLOBAL__sub_I_persistence_cpp=Module["__GLOBAL__sub_I_persistence_cpp"]=(function(){return Module["asm"]["__GLOBAL__sub_I_persistence_cpp"].apply(null,arguments)});var ___cxa_is_pointer_type=Module["___cxa_is_pointer_type"]=(function(){return Module["asm"]["___cxa_is_pointer_type"].apply(null,arguments)});var stackRestore=Module["stackRestore"]=(function(){return Module["asm"]["stackRestore"].apply(null,arguments)});var _memset=Module["_memset"]=(function(){return Module["asm"]["_memset"].apply(null,arguments)});var _sbrk=Module["_sbrk"]=(function(){return Module["asm"]["_sbrk"].apply(null,arguments)});var __GLOBAL__sub_I_imgwarp_cpp=Module["__GLOBAL__sub_I_imgwarp_cpp"]=(function(){return Module["asm"]["__GLOBAL__sub_I_imgwarp_cpp"].apply(null,arguments)});var _memcpy=Module["_memcpy"]=(function(){return Module["asm"]["_memcpy"].apply(null,arguments)});var _llvm_bswap_i32=Module["_llvm_bswap_i32"]=(function(){return Module["asm"]["_llvm_bswap_i32"].apply(null,arguments)});var stackAlloc=Module["stackAlloc"]=(function(){return Module["asm"]["stackAlloc"].apply(null,arguments)});var getTempRet0=Module["getTempRet0"]=(function(){return Module["asm"]["getTempRet0"].apply(null,arguments)});var __GLOBAL__sub_I_bind_cpp=Module["__GLOBAL__sub_I_bind_cpp"]=(function(){return Module["asm"]["__GLOBAL__sub_I_bind_cpp"].apply(null,arguments)});var setTempRet0=Module["setTempRet0"]=(function(){return Module["asm"]["setTempRet0"].apply(null,arguments)});var ___cxx_global_var_init_354=Module["___cxx_global_var_init_354"]=(function(){return Module["asm"]["___cxx_global_var_init_354"].apply(null,arguments)});var _pthread_mutex_unlock=Module["_pthread_mutex_unlock"]=(function(){return Module["asm"]["_pthread_mutex_unlock"].apply(null,arguments)});var __GLOBAL__I_000101=Module["__GLOBAL__I_000101"]=(function(){return Module["asm"]["__GLOBAL__I_000101"].apply(null,arguments)});var _emscripten_get_global_libc=Module["_emscripten_get_global_libc"]=(function(){return Module["asm"]["_emscripten_get_global_libc"].apply(null,arguments)});var ___cxx_global_var_init_359=Module["___cxx_global_var_init_359"]=(function(){return Module["asm"]["___cxx_global_var_init_359"].apply(null,arguments)});var ___getTypeName=Module["___getTypeName"]=(function(){return Module["asm"]["___getTypeName"].apply(null,arguments)});var __GLOBAL__sub_I_iostream_cpp=Module["__GLOBAL__sub_I_iostream_cpp"]=(function(){return Module["asm"]["__GLOBAL__sub_I_iostream_cpp"].apply(null,arguments)});var _pthread_cond_broadcast=Module["_pthread_cond_broadcast"]=(function(){return Module["asm"]["_pthread_cond_broadcast"].apply(null,arguments)});var ___cxx_global_var_init_356=Module["___cxx_global_var_init_356"]=(function(){return Module["asm"]["___cxx_global_var_init_356"].apply(null,arguments)});var ___cxx_global_var_init_357=Module["___cxx_global_var_init_357"]=(function(){return Module["asm"]["___cxx_global_var_init_357"].apply(null,arguments)});var ___errno_location=Module["___errno_location"]=(function(){return Module["asm"]["___errno_location"].apply(null,arguments)});var ___cxx_global_var_init_355=Module["___cxx_global_var_init_355"]=(function(){return Module["asm"]["___cxx_global_var_init_355"].apply(null,arguments)});var ___cxa_can_catch=Module["___cxa_can_catch"]=(function(){return Module["asm"]["___cxa_can_catch"].apply(null,arguments)});var _free=Module["_free"]=(function(){return Module["asm"]["_free"].apply(null,arguments)});var runPostSets=Module["runPostSets"]=(function(){return Module["asm"]["runPostSets"].apply(null,arguments)});var setThrew=Module["setThrew"]=(function(){return Module["asm"]["setThrew"].apply(null,arguments)});var establishStackSpace=Module["establishStackSpace"]=(function(){return Module["asm"]["establishStackSpace"].apply(null,arguments)});var _memmove=Module["_memmove"]=(function(){return Module["asm"]["_memmove"].apply(null,arguments)});var __GLOBAL__sub_I_bindings_cpp=Module["__GLOBAL__sub_I_bindings_cpp"]=(function(){return Module["asm"]["__GLOBAL__sub_I_bindings_cpp"].apply(null,arguments)});var ___cxx_global_var_init_358=Module["___cxx_global_var_init_358"]=(function(){return Module["asm"]["___cxx_global_var_init_358"].apply(null,arguments)});var _malloc=Module["_malloc"]=(function(){return Module["asm"]["_malloc"].apply(null,arguments)});var __GLOBAL__sub_I_histogram_cpp=Module["__GLOBAL__sub_I_histogram_cpp"]=(function(){return Module["asm"]["__GLOBAL__sub_I_histogram_cpp"].apply(null,arguments)});var _pthread_mutex_lock=Module["_pthread_mutex_lock"]=(function(){return Module["asm"]["_pthread_mutex_lock"].apply(null,arguments)});var _emscripten_replace_memory=Module["_emscripten_replace_memory"]=(function(){return Module["asm"]["_emscripten_replace_memory"].apply(null,arguments)});var dynCall_iiiiiiii=Module["dynCall_iiiiiiii"]=(function(){return Module["asm"]["dynCall_iiiiiiii"].apply(null,arguments)});var dynCall_iiiiiid=Module["dynCall_iiiiiid"]=(function(){return Module["asm"]["dynCall_iiiiiid"].apply(null,arguments)});var dynCall_vid=Module["dynCall_vid"]=(function(){return Module["asm"]["dynCall_vid"].apply(null,arguments)});var dynCall_viiiii=Module["dynCall_viiiii"]=(function(){return Module["asm"]["dynCall_viiiii"].apply(null,arguments)});var dynCall_vi=Module["dynCall_vi"]=(function(){return Module["asm"]["dynCall_vi"].apply(null,arguments)});var dynCall_vii=Module["dynCall_vii"]=(function(){return Module["asm"]["dynCall_vii"].apply(null,arguments)});var dynCall_iiiiiii=Module["dynCall_iiiiiii"]=(function(){return Module["asm"]["dynCall_iiiiiii"].apply(null,arguments)});var dynCall_ii=Module["dynCall_ii"]=(function(){return Module["asm"]["dynCall_ii"].apply(null,arguments)});var dynCall_viijii=Module["dynCall_viijii"]=(function(){return Module["asm"]["dynCall_viijii"].apply(null,arguments)});var dynCall_iidddd=Module["dynCall_iidddd"]=(function(){return Module["asm"]["dynCall_iidddd"].apply(null,arguments)});var dynCall_viiiiiiiddi=Module["dynCall_viiiiiiiddi"]=(function(){return Module["asm"]["dynCall_viiiiiiiddi"].apply(null,arguments)});var dynCall_iidd=Module["dynCall_iidd"]=(function(){return Module["asm"]["dynCall_iidd"].apply(null,arguments)});var dynCall_viidi=Module["dynCall_viidi"]=(function(){return Module["asm"]["dynCall_viidi"].apply(null,arguments)});var dynCall_iiiid=Module["dynCall_iiiid"]=(function(){return Module["asm"]["dynCall_iiiid"].apply(null,arguments)});var dynCall_viiiiiiiiiiddi=Module["dynCall_viiiiiiiiiiddi"]=(function(){return Module["asm"]["dynCall_viiiiiiiiiiddi"].apply(null,arguments)});var dynCall_viiidd=Module["dynCall_viiidd"]=(function(){return Module["asm"]["dynCall_viiidd"].apply(null,arguments)});var dynCall_vidii=Module["dynCall_vidii"]=(function(){return Module["asm"]["dynCall_vidii"].apply(null,arguments)});var dynCall_iiiii=Module["dynCall_iiiii"]=(function(){return Module["asm"]["dynCall_iiiii"].apply(null,arguments)});var dynCall_di=Module["dynCall_di"]=(function(){return Module["asm"]["dynCall_di"].apply(null,arguments)});var dynCall_viiiiiiiiiii=Module["dynCall_viiiiiiiiiii"]=(function(){return Module["asm"]["dynCall_viiiiiiiiiii"].apply(null,arguments)});var dynCall_iiii=Module["dynCall_iiii"]=(function(){return Module["asm"]["dynCall_iiii"].apply(null,arguments)});var dynCall_viiif=Module["dynCall_viiif"]=(function(){return Module["asm"]["dynCall_viiif"].apply(null,arguments)});var dynCall_viiiiiiii=Module["dynCall_viiiiiiii"]=(function(){return Module["asm"]["dynCall_viiiiiiii"].apply(null,arguments)});var dynCall_fii=Module["dynCall_fii"]=(function(){return Module["asm"]["dynCall_fii"].apply(null,arguments)});var dynCall_diiii=Module["dynCall_diiii"]=(function(){return Module["asm"]["dynCall_diiii"].apply(null,arguments)});var dynCall_viid=Module["dynCall_viid"]=(function(){return Module["asm"]["dynCall_viid"].apply(null,arguments)});var dynCall_fiii=Module["dynCall_fiii"]=(function(){return Module["asm"]["dynCall_fiii"].apply(null,arguments)});var dynCall_diiiii=Module["dynCall_diiiii"]=(function(){return Module["asm"]["dynCall_diiiii"].apply(null,arguments)});var dynCall_viiifii=Module["dynCall_viiifii"]=(function(){return Module["asm"]["dynCall_viiifii"].apply(null,arguments)});var dynCall_viiiidd=Module["dynCall_viiiidd"]=(function(){return Module["asm"]["dynCall_viiiidd"].apply(null,arguments)});var dynCall_iid=Module["dynCall_iid"]=(function(){return Module["asm"]["dynCall_iid"].apply(null,arguments)});var dynCall_viiiiiii=Module["dynCall_viiiiiii"]=(function(){return Module["asm"]["dynCall_viiiiiii"].apply(null,arguments)});var dynCall_iiddd=Module["dynCall_iiddd"]=(function(){return Module["asm"]["dynCall_iiddd"].apply(null,arguments)});var dynCall_viiiiiiiii=Module["dynCall_viiiiiiiii"]=(function(){return Module["asm"]["dynCall_viiiiiiiii"].apply(null,arguments)});var dynCall_viiiiiiiiii=Module["dynCall_viiiiiiiiii"]=(function(){return Module["asm"]["dynCall_viiiiiiiiii"].apply(null,arguments)});var dynCall_iii=Module["dynCall_iii"]=(function(){return Module["asm"]["dynCall_iii"].apply(null,arguments)});var dynCall_diii=Module["dynCall_diii"]=(function(){return Module["asm"]["dynCall_diii"].apply(null,arguments)});var dynCall_viiiiii=Module["dynCall_viiiiii"]=(function(){return Module["asm"]["dynCall_viiiiii"].apply(null,arguments)});var dynCall_dii=Module["dynCall_dii"]=(function(){return Module["asm"]["dynCall_dii"].apply(null,arguments)});var dynCall_viiiid=Module["dynCall_viiiid"]=(function(){return Module["asm"]["dynCall_viiiid"].apply(null,arguments)});var dynCall_fiiiii=Module["dynCall_fiiiii"]=(function(){return Module["asm"]["dynCall_fiiiii"].apply(null,arguments)});var dynCall_i=Module["dynCall_i"]=(function(){return Module["asm"]["dynCall_i"].apply(null,arguments)});var dynCall_fiiii=Module["dynCall_fiiii"]=(function(){return Module["asm"]["dynCall_fiiii"].apply(null,arguments)});var dynCall_iiiiii=Module["dynCall_iiiiii"]=(function(){return Module["asm"]["dynCall_iiiiii"].apply(null,arguments)});var dynCall_viiid=Module["dynCall_viiid"]=(function(){return Module["asm"]["dynCall_viiid"].apply(null,arguments)});var dynCall_iiiiij=Module["dynCall_iiiiij"]=(function(){return Module["asm"]["dynCall_iiiiij"].apply(null,arguments)});var dynCall_viii=Module["dynCall_viii"]=(function(){return Module["asm"]["dynCall_viii"].apply(null,arguments)});var dynCall_v=Module["dynCall_v"]=(function(){return Module["asm"]["dynCall_v"].apply(null,arguments)});var dynCall_iiiiiiiii=Module["dynCall_iiiiiiiii"]=(function(){return Module["asm"]["dynCall_iiiiiiiii"].apply(null,arguments)});var dynCall_viif=Module["dynCall_viif"]=(function(){return Module["asm"]["dynCall_viif"].apply(null,arguments)});var dynCall_viiii=Module["dynCall_viiii"]=(function(){return Module["asm"]["dynCall_viiii"].apply(null,arguments)});var dynCall_iiiiid=Module["dynCall_iiiiid"]=(function(){return Module["asm"]["dynCall_iiiiid"].apply(null,arguments)});var dynCall_iiiif=Module["dynCall_iiiif"]=(function(){return Module["asm"]["dynCall_iiiif"].apply(null,arguments)});Runtime.stackAlloc=Module["stackAlloc"];Runtime.stackSave=Module["stackSave"];Runtime.stackRestore=Module["stackRestore"];Runtime.establishStackSpace=Module["establishStackSpace"];Runtime.setTempRet0=Module["setTempRet0"];Runtime.getTempRet0=Module["getTempRet0"];Module["asm"]=asm;if(memoryInitializer){if(typeof Module["locateFile"]==="function"){memoryInitializer=Module["locateFile"](memoryInitializer)}else if(Module["memoryInitializerPrefixURL"]){memoryInitializer=Module["memoryInitializerPrefixURL"]+memoryInitializer}if(ENVIRONMENT_IS_NODE||ENVIRONMENT_IS_SHELL){var data=Module["readBinary"](memoryInitializer);HEAPU8.set(data,Runtime.GLOBAL_BASE)}else{addRunDependency("memory initializer");var applyMemoryInitializer=(function(data){if(data.byteLength)data=new Uint8Array(data);HEAPU8.set(data,Runtime.GLOBAL_BASE);if(Module["memoryInitializerRequest"])delete Module["memoryInitializerRequest"].response;removeRunDependency("memory initializer")});function doBrowserLoad(){Module["readAsync"](memoryInitializer,applyMemoryInitializer,(function(){throw"could not load memory initializer "+memoryInitializer}))}if(Module["memoryInitializerRequest"]){function useRequest(){var request=Module["memoryInitializerRequest"];if(request.status!==200&&request.status!==0){console.warn("a problem seems to have happened with Module.memoryInitializerRequest, status: "+request.status+", retrying "+memoryInitializer);doBrowserLoad();return}applyMemoryInitializer(request.response)}if(Module["memoryInitializerRequest"].response){setTimeout(useRequest,0)}else{Module["memoryInitializerRequest"].addEventListener("load",useRequest)}}else{doBrowserLoad()}}}function ExitStatus(status){this.name="ExitStatus";this.message="Program terminated with exit("+status+")";this.status=status}ExitStatus.prototype=new Error;ExitStatus.prototype.constructor=ExitStatus;var initialStackTop;var preloadStartTime=null;var calledMain=false;dependenciesFulfilled=function runCaller(){if(!Module["calledRun"])run();if(!Module["calledRun"])dependenciesFulfilled=runCaller};Module["callMain"]=Module.callMain=function callMain(args){args=args||[];ensureInitRuntime();var argc=args.length+1;function pad(){for(var i=0;i<4-1;i++){argv.push(0)}}var argv=[allocate(intArrayFromString(Module["thisProgram"]),"i8",ALLOC_NORMAL)];pad();for(var i=0;i0){return}preRun();if(runDependencies>0)return;if(Module["calledRun"])return;function doRun(){if(Module["calledRun"])return;Module["calledRun"]=true;if(ABORT)return;ensureInitRuntime();preMain();if(Module["onRuntimeInitialized"])Module["onRuntimeInitialized"]();if(Module["_main"]&&shouldRunNow)Module["callMain"](args);postRun()}if(Module["setStatus"]){Module["setStatus"]("Running...");setTimeout((function(){setTimeout((function(){Module["setStatus"]("")}),1);doRun()}),1)}else{doRun()}}Module["run"]=Module.run=run;function exit(status,implicit){if(implicit&&Module["noExitRuntime"]){return}if(Module["noExitRuntime"]){}else{ABORT=true;EXITSTATUS=status;STACKTOP=initialStackTop;exitRuntime();if(Module["onExit"])Module["onExit"](status)}if(ENVIRONMENT_IS_NODE){process["exit"](status)}Module["quit"](status,new ExitStatus(status))}Module["exit"]=Module.exit=exit;var abortDecorators=[];function abort(what){if(Module["onAbort"]){Module["onAbort"](what)}if(what!==undefined){Module.print(what);Module.printErr(what);what=JSON.stringify(what)}else{what=""}ABORT=true;EXITSTATUS=1;var extra="\nIf this abort() is unexpected, build with -s ASSERTIONS=1 which can give more information.";var output="abort("+what+") at "+stackTrace()+extra;if(abortDecorators){abortDecorators.forEach((function(decorator){output=decorator(output,what)}))}throw output}Module["abort"]=Module.abort=abort;if(Module["preInit"]){if(typeof Module["preInit"]=="function")Module["preInit"]=[Module["preInit"]];while(Module["preInit"].length>0){Module["preInit"].pop()()}}var shouldRunNow=true;if(Module["noInitialRun"]){shouldRunNow=false}Module["noExitRuntime"]=true;run();"use strict";((function(){function r2r(rect){return{x:rect.x,y:rect.y,width:rect.width,height:rect.height}}function convertRvector(rvec){var ret=[];for(var i=0;i&2 - echo "wasi-sdk pre-built assets only ship for macOS and Linux on x86_64/arm64." >&2 - exit 1 - ;; -esac - -WASI_SDK_DIR="wasi-sdk-${WASI_VERSION_FULL}-${WASI_SDK_ARCH}" -WASI_SDK_PATH="${PROJECT_ROOT}/${WASI_SDK_DIR}" - -# Download wasi-sdk if missing. ~80 MB; cached under PROJECT_ROOT and -# gitignored via .gitignore (`wasi-sdk-*`). -if [ ! -d "$WASI_SDK_PATH" ]; then - echo "Downloading wasi-sdk ${WASI_VERSION_FULL} for ${WASI_SDK_ARCH}..." - curl -fLO "https://github.com/WebAssembly/wasi-sdk/releases/download/wasi-sdk-${WASI_VERSION}/wasi-sdk-${WASI_VERSION_FULL}-${WASI_SDK_ARCH}.tar.gz" - tar xf "wasi-sdk-${WASI_VERSION_FULL}-${WASI_SDK_ARCH}.tar.gz" - rm "wasi-sdk-${WASI_VERSION_FULL}-${WASI_SDK_ARCH}.tar.gz" -fi - -echo "Using wasi-sdk at: $WASI_SDK_PATH" - -# Make sure the rustup target is installed for whichever toolchain the -# project pins (rust-toolchain.toml). Cheap if already added. -if command -v rustup >/dev/null 2>&1; then - rustup target add wasm32-wasip1-threads >/dev/null -fi - -# wasi-sdk's clang + sysroot — required because some transitive crates -# pull in a bundled C library that needs a working WASI libc. -export CC="${WASI_SDK_PATH}/bin/clang" -export CXX="${WASI_SDK_PATH}/bin/clang++" -export CFLAGS="--sysroot=${WASI_SDK_PATH}/share/wasi-sysroot" - -echo "Building for wasm32-wasip1-threads..." -cargo build --release --target=wasm32-wasip1-threads - -# Place reg.wasm at the repo root — `build.config.ts` picks it up from -# here and stages it into `dist/shared/reg.wasm` during `pnpm build`. -echo "Copying wasm to ./reg.wasm..." -cp target/wasm32-wasip1-threads/release/reg_cli.wasm reg.wasm - -echo "Build complete!" -ls -la reg.wasm diff --git a/scripts/release.sh b/scripts/release.sh deleted file mode 100755 index ae7debd0..00000000 --- a/scripts/release.sh +++ /dev/null @@ -1,64 +0,0 @@ -#!/bin/bash -# One-shot publish-prep: from a clean checkout, produce a tarball that's -# ready for `npm publish`. Used both for local verification and for any -# CI job that wants to gate on a successful pack. -# -# What it runs (in order): -# 1. scripts/build-ui.sh → report/ui/dist/{report.js,style.css} -# (consumed by reg_core via -# include_str! at compile time) -# 2. scripts/build-wasm.sh → ./reg.wasm (wasi-sdk + cargo) -# 3. pnpm install --frozen-lockfile → node_modules -# 4. pnpm build → dist/ (unbuild + reg.wasm staging) -# 5. npm pack [--dry-run] → tarball -# -# Usage: -# scripts/release.sh # builds + dry-run pack -# scripts/release.sh --pack # builds + writes the .tgz -# REPORT_UI_TAG=v0.5.0 scripts/release.sh # override the UI version -# -# Env vars: -# REPORT_UI_TAG default v0.3.0 (passed to build-ui.sh) -# SKIP_UI=1 skip the UI build (assumes report/ui/dist/ already exists) -# SKIP_WASM=1 skip the wasm rebuild (assumes ./reg.wasm already exists) -set -euo pipefail - -SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)" -PROJECT_ROOT="$(dirname "$SCRIPT_DIR")" -cd "$PROJECT_ROOT" - -REPORT_UI_TAG="${REPORT_UI_TAG:-v0.3.0}" -PACK_MODE="--dry-run" -if [ "${1:-}" = "--pack" ]; then - PACK_MODE="" -fi - -echo "==> [1/5] report-ui ${REPORT_UI_TAG}" -if [ "${SKIP_UI:-0}" = "1" ]; then - echo " (skipped — SKIP_UI=1)" -else - sh "$SCRIPT_DIR/build-ui.sh" "$REPORT_UI_TAG" -fi - -echo "==> [2/5] wasm bundle (wasi-sdk + cargo build --release)" -if [ "${SKIP_WASM:-0}" = "1" ]; then - echo " (skipped — SKIP_WASM=1)" -else - bash "$SCRIPT_DIR/build-wasm.sh" -fi - -echo "==> [3/5] pnpm install" -pnpm install --frozen-lockfile - -echo "==> [4/5] pnpm build (dist + bundled reg.wasm)" -pnpm build - -echo "==> [5/5] npm pack ${PACK_MODE}" -# Run pack from the repo root (the published package). -npm pack ${PACK_MODE} - -echo -echo "Release prep complete." -if [ -z "$PACK_MODE" ]; then - ls -la *.tgz -fi diff --git a/src/cli.js b/src/cli.js new file mode 100644 index 00000000..8ae54b5f --- /dev/null +++ b/src/cli.js @@ -0,0 +1,224 @@ +#!/usr/bin/env node + +/* @flow */ + +import { Spinner } from 'cli-spinner'; +import meow from 'meow'; +import path from 'path'; +import compare from './'; +import log from './log'; +import fs from 'fs'; + +// import notifier from './notifier'; +import { BALLOT_X, CHECK_MARK, GREEK_CROSS, MINUS } from './icon'; +import createReport from './report'; + +const spinner = new Spinner(); +spinner.setSpinnerString(18); + +const cli = meow( + ` + Usage + $ reg-cli /path/to/actual-dir /path/to/expected-dir /path/to/diff-dir + Options + -U, --update Update expected images.(Copy \`actual images\` to \`expected images\`). + -J, --json Specified json report path. If omitted ./reg.json. + -I, --ignoreChange If true, error will not be thrown when image change detected. + -E, --extendedErrors If true, also added/deleted images will throw an error. If omitted false. + -R, --report Output html report to specified directory. + --junit Output junit report to specified file. + -P, --urlPrefix Add prefix to all image src. + -M, --matchingThreshold Matching threshold, ranges from 0 to 1. Smaller values make the comparison more sensitive. 0 by default. + -T, --thresholdRate Rate threshold for detecting change. When the difference ratio of the image is larger than the set rate detects the change. + -S, --thresholdPixel Pixel threshold for detecting change. When the difference pixel of the image is larger than the set pixel detects the change. This value takes precedence over \`thresholdRate\`. + -C, --concurrency How many processes launches in parallel. If omitted 4. + -A, --enableAntialias. Enable antialias. If omitted false. + -X, --additionalDetection. Enable additional difference detection(highly experimental). Select "none" or "client" (default: "none"). + -F, --from Generate report from json. Please specify json file. If set, only report will be output without comparing images. + -D, --customDiffMessage Pass custom massage that will logged to the terminal when there is a diff. + Examples + $ reg-cli /path/to/actual-dir /path/to/expected-dir /path/to/diff-dir -U -D ./reg.json +`, + { + flags: { + update: { + type: 'boolean', + alias: 'U', + }, + json: { + type: 'string', + alias: 'J', + default: './reg.json', + }, + ignoreChange: { + type: 'boolean', + alias: 'I', + }, + extendedErrors: { + type: 'boolean', + alias: 'E', + default: false, + }, + report: { + type: 'string', + alias: 'R', + }, + junit: { + type: 'string', + }, + urlPrefix: { + type: 'string', + alias: 'P', + }, + matchingThreshold: { + type: 'number', + alias: 'M', + default: 0, + }, + thresholdRate: { + type: 'number', + alias: 'T', + }, + thresholdPixel: { + type: 'number', + alias: 'S', + }, + concurrency: { + type: 'number', + alias: 'C', + default: 4, + }, + enableAntialias: { + type: 'boolean', + alias: 'A', + default: false, + }, + additionalDetection: { + type: 'string', + alias: 'X', + default: 'none', + }, + from: { + type: 'string', + alias: 'F', + }, + customDiffMessage: { + type: 'string', + alias: 'D', + }, + }, + }, +); +if (!cli.flags.from) { + if (!process.argv[2] || !process.argv[3] || !process.argv[4]) { + log.fail('please specify actual, expected and diff images directory.'); + log.fail('e.g.: $ reg-cli /path/to/actual-dir /path/to/expected-dir /path/to/diff-dir'); + process.exit(1); + } +} + +const json = cli.flags.json ? cli.flags.json.toString() : './reg.json'; // default output path + +const urlPrefix = typeof cli.flags.urlPrefix === 'string' ? cli.flags.urlPrefix : './'; + +const report = typeof cli.flags.report === 'string' ? cli.flags.report : !!cli.flags.report ? './report.html' : ''; +const junitReport = typeof cli.flags.junit === 'string' ? cli.flags.junit : !!cli.flags.junit ? './junit.xml' : ''; +const actualDir = process.argv[2]; +const expectedDir = process.argv[3]; +const diffDir = process.argv[4]; +const update = !!cli.flags.update; +const extendedErrors = !!cli.flags.extendedErrors; +const ignoreChange = !!cli.flags.ignoreChange; +const enableClientAdditionalDetection = cli.flags.additionalDetection === 'client'; +const from = String(cli.flags.from || ''); +const customDiffMessage = String( + cli.flags.customDiffMessage || `\nInspect your code changes, re-run with \`-U\` to update them. `, +); + +// If from option specified, generate report from json and exit. +if (from) { + let json = ''; + try { + json = fs.readFileSync(from, { encoding: 'utf8' }); + } catch (e) { + log.fail('Failed to read specify json.'); + log.fail(e); + process.exit(1); + } + + try { + const params = JSON.parse(json); + createReport({ + ...params, + json: json || './reg.json', + report: report || './report.html', + junitReport: junitReport || '', + extendedErrors, + urlPrefix: urlPrefix || '', + enableClientAdditionalDetection, + fromJSON: true, + }); + process.exit(0); + } catch (e) { + log.fail('Failed to parse json. Please specify valid json.'); + log.fail(e); + process.exit(1); + } +} + +const observer = compare({ + actualDir, + expectedDir, + diffDir, + update, + report, + junitReport, + extendedErrors, + json, + urlPrefix, + matchingThreshold: Number(cli.flags.matchingThreshold || 0), + thresholdRate: Number(cli.flags.thresholdRate), + thresholdPixel: Number(cli.flags.thresholdPixel), + concurrency: Number(cli.flags.concurrency || 4), + enableAntialias: !!cli.flags.enableAntialias, + enableClientAdditionalDetection, +}); + +observer.once('start', () => spinner.start()); + +observer.on('compare', params => { + spinner.stop(true); + const file = path.join(`${actualDir}`, `${params.path}`); + switch (params.type) { + case 'delete': + return log.warn(`${MINUS} delete ${file}`); + case 'new': + return log.info(`${GREEK_CROSS} append ${file}`); + case 'pass': + return log.success(`${CHECK_MARK} pass ${file}`); + case 'fail': + return log.fail(`${BALLOT_X} change ${file}`); + } + spinner.start(); +}); + +observer.once('update', () => log.success(`✨ your expected images are updated ✨`)); + +observer.once('complete', ({ failedItems, deletedItems, newItems, passedItems }) => { + spinner.stop(true); + log.info('\n'); + if (failedItems.length) log.fail(`${BALLOT_X} ${failedItems.length} file(s) changed.`); + if (deletedItems.length) log.warn(`${MINUS} ${deletedItems.length} file(s) deleted.`); + if (newItems.length) log.info(`${GREEK_CROSS} ${newItems.length} file(s) appended.`); + if (passedItems.length) log.success(`${CHECK_MARK} ${passedItems.length} file(s) passed.`); + if (!update && (failedItems.length > 0 || (extendedErrors && (newItems.length > 0 || deletedItems.length > 0)))) { + log.fail(customDiffMessage); + if (!ignoreChange) process.exit(1); + } + return process.exit(0); +}); + +observer.once('error', error => { + log.fail(error); + process.exit(1); +}); diff --git a/src/cli.ts b/src/cli.ts deleted file mode 100644 index 866ec742..00000000 --- a/src/cli.ts +++ /dev/null @@ -1,275 +0,0 @@ -#!/usr/bin/env node -// -// CLI wrapper around the Wasm `run()` entry point. -// -// Goal: match the surface of classic reg-cli (`src/cli.js`) closely enough -// that users migrating from `reg-cli` to `@bokuweb/reg-cli-wasm` do not have -// to change their CI invocation. Specifically this handles: -// -// - POSIX short-flag aliases (-R, -J, -M, -T, -S, -C, -A, -I, -E, -U, -D) -// - Non-zero exit code on pixel diff (`process.exitCode = 1`) -// - Per-file progress log + summary line -// - `-U / --update` baseline refresh -// - `-I / --ignoreChange` overrides the non-zero exit code -// - `-E / --extendedErrors` escalates new/deleted counts to failure -// - `-D / --customDiffMessage` custom trailer line -// -// Still handled in the Wasm (Rust) side via clap short aliases: -// -// -R/--report, -J/--json, -M/--matchingThreshold, -T/--thresholdRate, -// -S/--thresholdPixel, -P/--urlPrefix, -C/--concurrency, -A/--enableAntialias, -// --diffFormat, --junit, -F/--from, -X/--additionalDetection -// -// reg.json and junit.xml are now written on the Rust/Wasm side so that they -// land inside the WASI sandbox's preopened directory and so the non-wasm -// `cargo run` CLI produces identical artefacts. -// -import { parseArgs } from 'node:util'; -import { copyFile, mkdir } from 'node:fs/promises'; -import { createRequire } from 'node:module'; -import { dirname, join } from 'node:path'; -import { run, dir as distDir, type CompareOutput } from './'; -import { writeXimgdiffAssets } from './ximgdiff'; - -const HELP = ` - Usage - $ reg-cli /path/to/actual-dir /path/to/expected-dir /path/to/diff-dir - Options - -U, --update Update expected images (copy actual → expected). - -R, --report Output html report to specified path. - -J, --json Output json report to specified path (default ./reg.json). - -I, --ignoreChange Exit 0 even when image changes are detected. - -E, --extendedErrors Also treat added/deleted images as failures. - -F, --from Render HTML report from an existing reg.json (no diff). - -X, --additionalDetection "none" | "client" — enable browser-side second-pass detection. - -P, --urlPrefix Prefix for image src in html report. - -M, --matchingThreshold YIQ threshold (0-1). Default 0. - -T, --thresholdRate Ratio of pixels that may differ before failing. - -S, --thresholdPixel Absolute pixel count that may differ before failing. - -C, --concurrency Parallel worker count. Default 4. - -A, --enableAntialias Count anti-aliased pixels as different. - -D, --customDiffMessage Trailing message printed on diff. - --junit Path to write a JUnit XML test report. - --diffFormat webp (default) | png -`; - -if (process.argv.includes('-h') || process.argv.includes('--help')) { - process.stdout.write(HELP); - process.exit(0); -} -if (process.argv.includes('--version')) { - // Read from the package.json next to dist/. reg-suit and downstream - // tooling probe `reg-cli --version` to decide which compat shim to use, - // so this needs to report a real semver. - try { - const requireShim = createRequire(import.meta.url); - const pkg = requireShim('../package.json') as { version?: string }; - process.stdout.write(`${pkg.version ?? 'unknown'}\n`); - } catch { - process.stdout.write('unknown\n'); - } - process.exit(0); -} - -let parsed; -try { - parsed = parseArgs({ - args: process.argv.slice(2), - options: { - update: { type: 'boolean', short: 'U' }, - json: { type: 'string', short: 'J' }, - ignoreChange: { type: 'boolean', short: 'I' }, - extendedErrors: { type: 'boolean', short: 'E' }, - report: { type: 'string', short: 'R' }, - urlPrefix: { type: 'string', short: 'P' }, - matchingThreshold: { type: 'string', short: 'M' }, - thresholdRate: { type: 'string', short: 'T' }, - thresholdPixel: { type: 'string', short: 'S' }, - concurrency: { type: 'string', short: 'C' }, - enableAntialias: { type: 'boolean', short: 'A' }, - customDiffMessage: { type: 'string', short: 'D' }, - diffFormat: { type: 'string' }, - junit: { type: 'string' }, - from: { type: 'string', short: 'F' }, - additionalDetection: { type: 'string', short: 'X' }, - }, - allowPositionals: true, - }); -} catch (err) { - process.stderr.write(`reg-cli: ${(err as Error).message}\n`); - process.stderr.write(HELP); - process.exit(1); -} - -const { values, positionals } = parsed; -const [actualDir, expectedDir, diffDir] = positionals; -const fromPath = typeof values.from === 'string' ? values.from : undefined; - -// `-F/--from` re-renders HTML from an existing reg.json and does not need -// the positional dirs; classic reg-cli accepts that mode without them. -if (!fromPath && (!actualDir || !expectedDir || !diffDir)) { - process.stderr.write('reg-cli: please specify actual, expected and diff directories.\n'); - process.stderr.write(HELP); - process.exit(1); -} - -// CLI-only semantics (not forwarded to Wasm). -const update = !!values.update; -const ignoreChange = !!values.ignoreChange; -const extendedErrors = !!values.extendedErrors; -// Default to matching classic reg-cli: diff images are written as PNG, -// `./reg.json` is always persisted to disk (in `run()` on the Rust side). -const diffFormat = typeof values.diffFormat === 'string' ? values.diffFormat : 'png'; -const jsonPath = typeof values.json === 'string' ? values.json : './reg.json'; -const customDiffMessage = - typeof values.customDiffMessage === 'string' - ? values.customDiffMessage - : `\nInspect your code changes, re-run with \`-U\` to update them. `; - -// Forward to Wasm: only flags that Rust/clap understands. -const wasmArgv: string[] = ['--']; -if (actualDir) wasmArgv.push(actualDir); -if (expectedDir) wasmArgv.push(expectedDir); -if (diffDir) wasmArgv.push(diffDir); -const pushFlag = (name: string, v: unknown): void => { - if (v == null || v === false) return; - if (v === true) wasmArgv.push(`--${name}`); - else wasmArgv.push(`--${name}`, String(v)); -}; -pushFlag('report', values.report); -pushFlag('json', jsonPath); -pushFlag('junit', values.junit); -// `-E` is both a CLI exit-code knob (handled in JS below) AND input to the -// junit XML generator on the Rust side — forward it so the XML matches -// classic reg-cli's extendedErrors behaviour. -pushFlag('extendedErrors', values.extendedErrors); -pushFlag('from', fromPath); -pushFlag('additionalDetection', values.additionalDetection); -pushFlag('matchingThreshold', values.matchingThreshold); -pushFlag('thresholdRate', values.thresholdRate); -pushFlag('thresholdPixel', values.thresholdPixel); -pushFlag('urlPrefix', values.urlPrefix); -pushFlag('concurrency', values.concurrency); -pushFlag('enableAntialias', values.enableAntialias); -pushFlag('diffFormat', diffFormat); - -const CHECK = '\u2714'; // ✔ -const CROSS = '\u2718'; // ✘ -const PLUS = '\u271A'; // ✚ -const MINUS = '\u2212'; // − - -// `--from` mode doesn't require a positional actualDir; fall back to just the -// path when we have no prefix to join. -const formatPath = (p: string) => (actualDir ? join(actualDir, p) : p); - -const emitter = run(wasmArgv); - -emitter.once('complete', async (data: CompareOutput) => { - const failed = data.failedItems ?? []; - const passed = data.passedItems ?? []; - const added = data.newItems ?? []; - const deleted = data.deletedItems ?? []; - - // NOTE: reg.json and junit.xml are written by the Rust/Wasm side (see - // `reg_core::run` + `reg_core::run_from_json`). Doing it there keeps the - // files inside the WASI sandbox's preopened root and avoids a duplicate - // serialize/write from JS. - - // `-X client` emits worker.js + detector.wasm next to the HTML report so - // the browser's second-pass pixel detector can actually load. We do it in - // JS (not Rust) because the x-img-diff-js wasm binary lives in node_modules - // and shouldn't be linked into the Wasm bundle. - if (values.additionalDetection === 'client' && typeof values.report === 'string') { - try { - await writeXimgdiffAssets({ - reportPath: values.report, - urlPrefix: typeof values.urlPrefix === 'string' ? values.urlPrefix : '', - distDir: distDir(), - }); - } catch (e) { - process.stderr.write(`reg-cli: failed to write ximgdiff assets — ${(e as Error).message}\n`); - process.exitCode = 1; - } - } - - // Per-file lines (ordering roughly follows classic reg-cli). - for (const img of passed) process.stdout.write(`${CHECK} pass ${formatPath(img)}\n`); - for (const img of added) process.stdout.write(`${PLUS} append ${formatPath(img)}\n`); - for (const img of deleted) process.stdout.write(`${MINUS} delete ${formatPath(img)}\n`); - for (const img of failed) process.stdout.write(`${CROSS} change ${formatPath(img)}\n`); - - // Summary lines. - process.stdout.write('\n'); - if (failed.length) process.stdout.write(`${CROSS} ${failed.length} file(s) changed.\n`); - if (deleted.length) process.stdout.write(`${MINUS} ${deleted.length} file(s) deleted.\n`); - if (added.length) process.stdout.write(`${PLUS} ${added.length} file(s) appended.\n`); - if (passed.length) process.stdout.write(`${CHECK} ${passed.length} file(s) passed.\n`); - - if (update) { - if (!actualDir || !expectedDir) { - process.stderr.write(`reg-cli: --update requires actual/expected dirs (incompatible with --from).\n`); - process.exitCode = 1; - return; - } - try { - await updateExpected(actualDir, expectedDir, { - newItems: added, - failedItems: failed, - deletedItems: deleted, - }); - process.stdout.write('\u2728 your expected images are updated \u2728\n'); - } catch (e) { - process.stderr.write(`reg-cli: failed to update expected — ${(e as Error).message}\n`); - process.exitCode = 1; - } - return; - } - - const hasFailure = - failed.length > 0 || (extendedErrors && (added.length > 0 || deleted.length > 0)); - - if (hasFailure) { - process.stdout.write(`${customDiffMessage}\n`); - if (!ignoreChange) process.exitCode = 1; - } -}); - -emitter.once('error', (err: Error) => { - process.stderr.write(`reg-cli: ${err?.message ?? String(err)}\n`); - process.exitCode = 1; -}); - -// Match classic reg-cli's `-U` semantics (src/index.js:134-146): -// -// 1. rm from expected: deletedItems ∪ failedItems — first so stale -// baselines don't linger and so overwrites are clean. -// 2. copy actual→expected: newItems ∪ failedItems — only the images the -// user actually wanted to refresh; passed items are untouched. -// -// This differs from a naive `copy every actualItem` (what we shipped -// pre-phase-F) in two ways that matter for reg-suit workflows: -// - deleted baselines are actually pruned -// - unchanged images aren't needlessly rewritten (preserves mtime, keeps -// git status clean) -async function updateExpected( - actualDir: string, - expectedDir: string, - items: { - newItems: string[]; - failedItems: string[]; - deletedItems: string[]; - }, -): Promise { - const { rm } = await import('node:fs/promises'); - const toRemove = [...items.deletedItems, ...items.failedItems]; - for (const img of toRemove) { - await rm(join(expectedDir, img), { force: true }); - } - const toCopy = [...items.newItems, ...items.failedItems]; - for (const img of toCopy) { - const src = join(actualDir, img); - const dst = join(expectedDir, img); - await mkdir(dirname(dst), { recursive: true }); - await copyFile(src, dst); - } -} diff --git a/src/diff.js b/src/diff.js new file mode 100644 index 00000000..1ea16605 --- /dev/null +++ b/src/diff.js @@ -0,0 +1,78 @@ +/* @flow */ + +import { imgDiff } from 'img-diff-js'; // $FlowIgnore +import md5File from 'md5-file'; // $FlowIgnore +import path from 'path'; + +export type DiffCreatorParams = { + actualDir: string; + expectedDir: string; + diffDir: string; + image: string; + matchingThreshold: number, + thresholdRate?: number, + thresholdPixel?: number, + enableAntialias: boolean; +} + +export type DiffResult = { + image: string; + passed: boolean; +} + +const getMD5 = (file) => new Promise((resolve, reject) => { + md5File(file, (err, hash) => { + if (err) reject(err); + resolve(hash); + }) +}); + +const isPassed = ({ width, height, diffCount, thresholdPixel, thresholdRate }: { + width: number, + height: number, + diffCount: number, + thresholdPixel?: number, + thresholdRate?: number +}) => { + if (typeof thresholdPixel === "number") { + return diffCount <= thresholdPixel; + } else if (typeof thresholdRate === "number") { + const totalPixel = width * height; + const ratio = diffCount / totalPixel; + return ratio <= thresholdRate; + } + return diffCount === 0; +}; + +const createDiff = ({ + actualDir, expectedDir, diffDir, image, matchingThreshold, thresholdRate, thresholdPixel, enableAntialias +}: DiffCreatorParams) => { + return Promise.all([ + getMD5(path.join(actualDir, image)), + getMD5(path.join(expectedDir, image)), + ]).then(([actualHash, expectedHash]) => { + if (actualHash === expectedHash) { + if (!process || !process.send) return; + return process.send({ passed: true, image }); + } + const diffImage = image.replace(/\.[^\.]+$/, ".png"); + return imgDiff({ + actualFilename: path.join(actualDir, image), + expectedFilename: path.join(expectedDir, image), + diffFilename: path.join(diffDir, diffImage), + options: { + threshold: matchingThreshold, + includeAA: !enableAntialias, + }, + }) + .then(({ width, height, diffCount }) => { + const passed = isPassed({ width, height, diffCount, thresholdPixel, thresholdRate }); + if (!process || !process.send) return; + process.send({ passed, image }); + }) + }) +}; + +process.on('message', (data) => { + createDiff(data); +}); diff --git a/src/entry.ts b/src/entry.ts deleted file mode 100644 index f595eabf..00000000 --- a/src/entry.ts +++ /dev/null @@ -1,183 +0,0 @@ -import fs from 'node:fs'; -import { WASI, type IFs } from '@tybys/wasm-util'; -import { env } from 'node:process'; -import { parentPort, workerData } from 'node:worker_threads'; -import { computeWasiSandbox, readWasm } from './utils'; -import { createPrintErrHook } from './progress'; -import { type RustTraceData, type WorkerSpan } from './tracing'; - -// Check if tracing is enabled via environment variable -const isTracingEnabled = (): boolean => { - return env.OTEL_ENABLED === 'true' || env.JAEGER_ENABLED === 'true'; -}; - -// Collect timing spans on the worker side to be sent back with 'complete'. -const workerSpans: WorkerSpan[] = []; -const tSpan = async ( - name: string, - fn: () => Promise | T, - attributes?: WorkerSpan['attributes'], -): Promise => { - if (!isTracingEnabled()) return fn(); - const start_ms = Date.now(); - const result = await fn(); - workerSpans.push({ - name, - start_ms, - end_ms: Date.now(), - attributes, - worker_label: 'entry', - }); - return result; -}; - -export type CompareOutput = { - failedItems: string[]; - newItems: string[]; - deletedItems: string[]; - passedItems: string[]; - expectedItems: string[]; - actualItems: string[]; - diffItems: string[]; - actualDir: string; - expectedDir: string; - diffDir: string; -}; - -// Build the narrowest WASI sandbox this run needs. See `computeWasiSandbox` -// in utils.ts for the policy. -const sandbox = computeWasiSandbox(workerData.argv); - -// Live `compare` events: Rust emits tagged stderr lines as each image -// finishes diffing (or is detected as new/deleted). Forward them to the -// main process so `EventEmitter#emit('compare', …)` can fire live instead -// of batched-post-complete. -const printErr = createPrintErrHook((ev) => { - parentPort?.postMessage({ cmd: 'compare-event', event: ev }); -}); - -const wasi = new WASI({ - version: 'preview1', - args: workerData.argv, - env: sandbox.env, - returnOnExit: true, - preopens: sandbox.preopens, - fs: fs as IFs, - printErr, -}); - -const imports = wasi.getImportObject(); -const file = readWasm(); - -/** - * Read a string from WASM memory using WasmOutput structure - */ -const readWasmString = ( - exports: any, - memory: WebAssembly.Memory, - outputPtr: number, -): string => { - const view = new DataView(memory.buffer, outputPtr); - const len = view.getUint32(0, true); - const bufPtr = view.getUint32(4, true); - const stringData = new Uint8Array(memory.buffer, bufPtr, len); - const decoder = new TextDecoder('utf-8'); - const str = decoder.decode(stringData); - exports.free_wasm_output(outputPtr); - return str; -}; - -(async () => { - try { - const entry_start_ms = Date.now(); - - const wasm = await tSpan( - 'entry.wasm_compile', - async () => WebAssembly.compile(await file), - ); - - const opts = { initial: 256, maximum: 16384, shared: true }; - const memory = new WebAssembly.Memory(opts); - - let instance = await tSpan('entry.wasm_instantiate', async () => - WebAssembly.instantiate(wasm, { - ...imports, - wasi: { - 'thread-spawn': (startArg: number) => { - const threadIdBuffer = new SharedArrayBuffer(4); - const id = new Int32Array(threadIdBuffer); - Atomics.store(id, 0, -1); - parentPort?.postMessage({ - cmd: 'thread-spawn', - startArg, - threadId: id, - memory, - }); - Atomics.wait(id, 0, -1); - const tid = Atomics.load(id, 0); - return tid; - }, - }, - env: { memory }, - }), - ); - - const exports = instance.exports as any; - - await tSpan('entry.wasi_start', async () => { - wasi.start(instance); - }); - - // Initialize tracing in WASM if enabled - if (isTracingEnabled() && typeof exports.init_tracing === 'function') { - await tSpan('entry.init_tracing_rust', async () => { - exports.init_tracing(); - }); - } - - // Run the main WASM function - const m = await tSpan('entry.wasm_main', async () => exports.wasm_main()); - const reportString = await tSpan('entry.read_report_string', async () => - readWasmString(exports, memory, m), - ); - const report = JSON.parse(reportString); - - // Get trace data from WASM if tracing is enabled - let traceData: RustTraceData | null = null; - if (isTracingEnabled() && typeof exports.get_trace_data === 'function') { - await tSpan('entry.collect_rust_traces', async () => { - const tracePtr = exports.get_trace_data(); - const traceJson = readWasmString(exports, memory, tracePtr); - try { - traceData = JSON.parse(traceJson) as RustTraceData; - } catch (e) { - console.error('[Tracing] Failed to parse trace data:', e); - } - - if (typeof exports.clear_trace_data === 'function') { - exports.clear_trace_data(); - } - }); - } - - // Overall span for this main worker - if (isTracingEnabled()) { - workerSpans.push({ - name: 'entry.worker_total', - start_ms: entry_start_ms, - end_ms: Date.now(), - worker_label: 'entry', - }); - } - - parentPort?.postMessage({ - cmd: 'complete', - data: report, - traceData, - workerSpans, - }); - } catch (e) { - throw e; - } -})(); - diff --git a/src/icon.js b/src/icon.js new file mode 100644 index 00000000..da8746d2 --- /dev/null +++ b/src/icon.js @@ -0,0 +1,6 @@ +export const BALLOT_X = '\u2718'; +export const CHECK_MARK = '\u2714'; +export const TEARDROP = '\u274B'; +export const MULTIPLICATION_X = '\u2716'; +export const GREEK_CROSS = '\u271A'; +export const MINUS = '\u2212'; \ No newline at end of file diff --git a/src/image-finder.js b/src/image-finder.js new file mode 100644 index 00000000..40ce2000 --- /dev/null +++ b/src/image-finder.js @@ -0,0 +1,27 @@ +/* @flow */ + +import glob from 'glob'; // $FlowIgnore +import path from 'path'; + +const difference = (arrA, arrB) => arrA.filter(a => !arrB.includes(a)); + +const IMAGE_FILES = '/**/*.+(tiff|jpeg|jpg|gif|png|bmp)'; + +export const findImages = (expectedDir: string, actualDir: string) => { + const expectedImages = glob + .sync(`${expectedDir}${IMAGE_FILES}`) + .map(p => path.relative(expectedDir, p)) + .map(p => (p[0] === path.sep ? p.slice(1) : p)); + const actualImages = glob + .sync(`${actualDir}${IMAGE_FILES}`) + .map(p => path.relative(actualDir, p)) + .map(p => (p[0] === path.sep ? p.slice(1) : p)); + const deletedImages = difference(expectedImages, actualImages); + const newImages = difference(actualImages, expectedImages); + return { + expectedImages, + actualImages, + deletedImages, + newImages, + }; +}; diff --git a/src/index.js b/src/index.js new file mode 100644 index 00000000..de950dc9 --- /dev/null +++ b/src/index.js @@ -0,0 +1,229 @@ +/* @flow */ + +import glob from 'glob'; // $FlowIgnore +import mkdirp from 'make-dir'; // $FlowIgnore +import { deleteAsync } from 'del'; // $FlowIgnore +import fs from 'fs'; +import path from 'path'; +import { range } from 'lodash'; +import log from './log'; +import createReport from './report'; +// $FlowIgnore +import bluebird from 'bluebird'; +import EventEmitter from 'events'; +import ProcessAdaptor from './process-adaptor'; +import type { DiffCreatorParams } from './diff'; +import { findImages } from './image-finder'; + +type CompareResult = { + passed: boolean, + image: string, +}; + +type RegParams = { + actualDir: string, + expectedDir: string, + diffDir: string, + report?: string, + junitReport?: string, + json?: string, + update?: boolean, + extendedErrors?: boolean, + urlPrefix?: string, + matchingThreshold?: number, + threshold?: number, // alias to thresholdRate. + thresholdRate?: number, + thresholdPixel?: number, + concurrency?: number, + enableAntialias?: boolean, + enableClientAdditionalDetection?: boolean, +}; + +const copyImages = (actualImages, { expectedDir, actualDir }) => { + return Promise.all( + actualImages.map( + image => + new Promise((resolve, reject) => { + try { + mkdirp.sync(path.dirname(path.join(expectedDir, image))); + const writeStream = fs.createWriteStream(path.join(expectedDir, image)); + fs.createReadStream(path.join(actualDir, image)).pipe(writeStream); + writeStream.on('finish', err => { + if (err) reject(err); + resolve(); + }); + } catch (err) { + reject(err); + } + }), + ), + ); +}; + +const compareImages = ( + emitter, + { + expectedImages, + actualImages, + dirs, + matchingThreshold, + thresholdPixel, + thresholdRate, + concurrency, + enableAntialias, + }, +): Promise => { + const images = actualImages.filter(actualImage => expectedImages.includes(actualImage)); + concurrency = images.length < 20 ? 1 : concurrency || 4; + const processes = range(concurrency).map(() => new ProcessAdaptor(emitter)); + return bluebird + .map( + images, + image => { + const p = processes.find(p => !p.isRunning()); + if (p) { + return p.run({ + ...dirs, + image, + matchingThreshold, + thresholdRate, + thresholdPixel, + enableAntialias, + }); + } + }, + { concurrency }, + ) + .then(result => { + processes.forEach(p => p.close()); + return result; + }) + .filter(r => !!r); +}; + +const cleanupExpectedDir = (expectedDir, changedFiles) => { + const paths = changedFiles.map(image => { + const directories = expectedDir.split("\\"); + return escapeGlob(path.posix.join(...directories, image)); + }); + // force: true needed to allow deleting outside working directory + return deleteAsync(paths, { force: true }); +}; + +const escapeGlob = fileName => { + return fileName + .replace(/(\*)/g, '[$1]') + .replace(/(\*)/g, '[$1]') + .replace(/(\?)/g, '[$1]') + .replace(/(\[)/g, '[$1]') + .replace(/(\])/g, '[$1]') + .replace(/(\{)/g, '[$1]') + .replace(/(\})/g, '[$1]') + .replace(/(\))/g, '[$1]') + .replace(/(\()/g, '[$1]') + .replace(/(\!)/g, '[$1]'); +}; + +const aggregate = result => { + const passed = result.filter(r => r.passed).map(r => r.image); + const failed = result.filter(r => !r.passed).map(r => r.image); + const diffItems = failed.map(image => image.replace(/\.[^\.]+$/, '.png')); + return { passed, failed, diffItems }; +}; + +const updateExpected = ({ actualDir, expectedDir, diffDir, deletedImages, newImages, diffItems }) => { + return cleanupExpectedDir(expectedDir, [...deletedImages, ...diffItems]) + .then(() => + copyImages([...newImages, ...diffItems], { + actualDir, + expectedDir, + diffDir, + }), + ) + .then(() => { + log.success(`\nAll images are updated. `); + }); +}; + +module.exports = (params: RegParams) => { + const { + actualDir, + expectedDir, + diffDir, + json, + concurrency = 4, + update, + report, + junitReport, + extendedErrors, + urlPrefix, + threshold, + matchingThreshold = 0, + thresholdRate, + thresholdPixel, + enableAntialias, + enableClientAdditionalDetection, + } = params; + const dirs = { actualDir, expectedDir, diffDir }; + const emitter = new EventEmitter(); + + const { expectedImages, actualImages, deletedImages, newImages } = findImages(expectedDir, actualDir); + + mkdirp.sync(expectedDir); + mkdirp.sync(diffDir); + + setImmediate(() => emitter.emit('start')); + compareImages(emitter, { + expectedImages, + actualImages, + dirs, + matchingThreshold, + thresholdRate: thresholdRate || threshold, + thresholdPixel, + concurrency, + enableAntialias: !!enableAntialias, + }) + .then(result => aggregate(result)) + .then(({ passed, failed, diffItems }) => { + return createReport({ + passedItems: passed, + failedItems: failed, + newItems: newImages, + deletedItems: deletedImages, + expectedItems: update ? actualImages : expectedImages, + actualItems: actualImages, + diffItems, + json: json || './reg.json', + actualDir, + expectedDir, + diffDir, + report: report || '', + junitReport: junitReport || '', + extendedErrors: !!extendedErrors, + urlPrefix: urlPrefix || '', + enableClientAdditionalDetection: !!enableClientAdditionalDetection, + }); + }) + .then(result => { + deletedImages.forEach(image => emitter.emit('compare', { type: 'delete', path: image })); + newImages.forEach(image => emitter.emit('compare', { type: 'new', path: image })); + if (update) { + return updateExpected({ + actualDir, + expectedDir, + diffDir, + deletedImages, + newImages, + diffItems: result.diffItems, + }).then(() => { + emitter.emit('update'); + return result; + }); + } + return result; + }) + .then(result => emitter.emit('complete', result)) + .catch(err => emitter.emit('error', err)); + + return emitter; +}; diff --git a/src/index.ts b/src/index.ts deleted file mode 100644 index d4e660a5..00000000 --- a/src/index.ts +++ /dev/null @@ -1,371 +0,0 @@ -import EventEmitter from 'node:events'; -import { Worker } from 'node:worker_threads'; -import { isCJS, resolveExtention } from './utils'; -import { join, dirname } from 'node:path'; -import { fileURLToPath } from 'url'; -import { - initTracing, - shutdownTracing, - processRustTraceData, - processWorkerSpans, - isTracingEnabled, - startRootSpan, - endRootSpan, - type RustTraceData, - type WorkerSpan, -} from './tracing'; - -export const dir = (): string => { - const dir = isCJS ? __dirname : dirname(fileURLToPath(import.meta.url)); - return dir; -}; - -// Record a span in the main process' WorkerSpan format for later conversion. -const mainSpans: WorkerSpan[] = []; -const recordMainSpan = (name: string, start_ms: number, attributes?: WorkerSpan['attributes']) => { - if (!isTracingEnabled()) return; - mainSpans.push({ name, start_ms, end_ms: Date.now(), attributes, worker_label: 'main' }); -}; - -export const run = (argv: string[]): EventEmitter => { - const run_start_ms = Date.now(); - - // Initialize tracing if enabled (may be ~tens of ms on first run). - const t_init = Date.now(); - if (isTracingEnabled()) { - initTracing(); - recordMainSpan('main.init_tracing', t_init); - } - - // Start root span for the entire operation - const traceContext = isTracingEnabled() ? startRootSpan('reg-cli') : null; - - const emitter = new EventEmitter(); - - // Classic reg-cli fires a 'start' event on the next tick of the run so - // subscribers (e.g. spinners) can latch on. Mirror that behaviour. - setImmediate(() => emitter.emit('start')); - - const t_new_entry = Date.now(); - const worker = new Worker(join(dir(), `./entry.${resolveExtention()}`), { workerData: { argv } }); - recordMainSpan('main.new_entry_worker', t_new_entry); - - let nextTid = 1; - const workers = [worker]; - const threadWorkerSpans: WorkerSpan[] = []; - - const spawn = (startArg: number, threadId: Int32Array, memory: WebAssembly.Memory) => { - const t_new_worker = Date.now(); - const worker = new Worker(join(dir(), `./worker.${resolveExtention()}`), { workerData: { argv } }); - const tid = nextTid++; - recordMainSpan('main.new_thread_worker', t_new_worker, { tid }); - - workers.push(worker); - - worker.on('message', (msg) => { - const { cmd } = msg; - if (cmd === 'loaded') { - if (typeof worker.unref === 'function') { - worker.unref(); - } - } else if (cmd === 'thread-spawn') { - spawn(msg.startArg, msg.threadId, msg.memory); - } else if (cmd === 'worker-spans') { - if (Array.isArray(msg.workerSpans)) { - threadWorkerSpans.push(...msg.workerSpans); - } - } else if (cmd === 'compare-event') { - // Rayon thread workers forward tagged progress lines here. - if (msg.event) emitter.emit('compare', msg.event); - } - }); - - worker.on('error', (e: Error) => { - workers.forEach((w) => w.terminate()); - // Forward as an `error` event on the parent emitter so callers can - // `emitter.on('error', ...)` instead of wrapping in a global handler. - // (Parity with classic reg-cli's EventEmitter surface.) - emitter.emit('error', e); - }); - - if (threadId) { - Atomics.store(threadId, 0, tid); - Atomics.notify(threadId, 0); - } - worker.postMessage({ startArg, tid, memory }); - return tid; - }; - - worker.on('message', async ({ cmd, startArg, threadId, memory, data, traceData, workerSpans, event }) => { - if (cmd === 'compare-event') { - // The main entry worker (`entry.ts`) forwards events from any - // non-threaded progress (e.g. `find_images` emitting new/delete - // up front). Rayon thread workers' events are handled in `spawn()`. - if (event) emitter.emit('compare', event); - return; - } - if (cmd === 'complete') { - const t_post_complete = Date.now(); - - // Process JS worker spans (entry.ts + thread workers) - if (isTracingEnabled()) { - if (Array.isArray(workerSpans)) { - processWorkerSpans(workerSpans as WorkerSpan[], 'entry'); - } - if (threadWorkerSpans.length) { - processWorkerSpans(threadWorkerSpans, 'thread'); - } - // Process trace data from Rust/WASM if available - if (traceData) { - processRustTraceData(traceData as RustTraceData); - } - // Record wall-clock around processing - recordMainSpan('main.process_trace_and_spans', t_post_complete); - // Also record total time - mainSpans.push({ - name: 'main.run_total', - start_ms: run_start_ms, - end_ms: Date.now(), - worker_label: 'main', - }); - processWorkerSpans(mainSpans, 'main'); - // End root span after processing spans - endRootSpan(true); - // Wait for traces to be exported before shutting down - await shutdownTracing(); - } - - workers.forEach((w) => w.terminate()); - - // Per-file `compare` events now fire live from Rust's diff loop via - // the `progress.ts` stderr event channel (see `createPrintErrHook`), - // matching classic reg-cli's `ProcessAdaptor` behaviour. No need to - // replay them here. - - // Emit complete and ensure we don't exit before traces are sent - emitter.emit('complete', data); - return; // Prevent further processing - } - - if (cmd === 'loaded') { - if (typeof worker.unref === 'function') { - worker.unref(); - } - return; - } - - if (cmd === 'thread-spawn') { - spawn(startArg, threadId, memory); - } - }); - - worker.on('error', (err: Error) => { - if (traceContext) { - endRootSpan(false); - } - workers.forEach((w) => w.terminate()); - emitter.emit('error', err); - }); - - return emitter; -}; - -export type CompareInput = { - actualDir: string, - expectedDir: string, - diffDir: string, - report?: string, - junitReport?: string, - json?: string, - /** Re-render HTML from an existing reg.json (classic `-F/--from`). */ - from?: string, - /** "none" (default) | "client" — enable the report's browser-side - * second-pass detector (classic `-X/--additionalDetection`). */ - additionalDetection?: 'none' | 'client', - update?: boolean, - extendedErrors?: boolean, - /** Classic reg-cli's `-I/--ignoreChange` — governs the CLI's exit code - * only. Accepted and silently dropped by `compare()` for drop-in - * compat with reg-suit's `processor.ts:107`. */ - ignoreChange?: boolean, - urlPrefix?: string, - matchingThreshold?: number, - threshold?: number, // alias to thresholdRate. - thresholdRate?: number, - thresholdPixel?: number, - concurrency?: number, - enableAntialias?: boolean, - enableClientAdditionalDetection?: boolean, - /** Classic reg-cli's CLI-side x-img-diff extra detection pass. The - * Wasm pipeline's diff already includes the equivalent classification, - * so this is a no-op but accepted for drop-in compat with reg-suit's - * `processor.ts:114`. */ - enableCliAdditionalDetection?: boolean, -}; - -export type CompareOutput = { - failedItems: string[], - newItems: string[], - deletedItems: string[], - passedItems: string[], - expectedItems: string[], - actualItems: string[], - diffItems: string[], - actualDir: string, - expectedDir: string, - diffDir: string, -}; - -/** Flags that `compare()` handles itself in JS; they are NOT forwarded to - * the Wasm binary. `extendedErrors` WAS here but now also feeds the - * Rust-side junit generator, so it's forwarded below via KEY_REMAP. - * - * `ignoreChange` and `enableCliAdditionalDetection` are stripped because - * reg-suit unconditionally passes them (see - * reg-viz/reg-suit `packages/reg-suit-core/src/processor.ts` `compare({…})`) - * and the Rust clap layer doesn't recognise them — forwarding would abort - * the binary with "unexpected argument". Semantically both are no-ops at - * the library-event layer: - * - `ignoreChange` only governs classic reg-cli's process exit code; - * the EventEmitter surface never needed it. - * - `enableCliAdditionalDetection` was classic's flag for running an - * extra CLI-side x-img-diff pass; the Wasm port's diff pipeline - * already produces the final pass/fail classification, so toggling - * it changes nothing. (The *client*-side variant is handled via - * `additionalDetection: 'client'` / the legacy - * `enableClientAdditionalDetection: true` alias further down.) */ -const CLI_ONLY_KEYS = new Set([ - 'update', - 'ignoreChange', - 'enableCliAdditionalDetection', -]); - -/** Library option names that must be forwarded to the Wasm binary under a - * different flag name (Rust uses `--junit`, callers pass `junitReport`). */ -const KEY_REMAP: Record = { - junitReport: 'junit', -}; - -export const compare = (input: CompareInput): EventEmitter => { - const { actualDir, expectedDir, diffDir, threshold, update, ...rest } = input; - - // Default `diffFormat` to png so the JSON/HTML report refers to `*.png` - // files — matching classic reg-cli's output and letting downstream - // tooling (reg-notify-* / reg-suit) keep working. - if ((rest as Record).diffFormat == null) { - (rest as Record).diffFormat = 'png'; - } - - // Default `json` to './reg.json' so callers that don't care still get - // the persisted report. - if (rest.json == null) { - rest.json = './reg.json'; - } - - // Translate `threshold` → `thresholdRate` (classic's alias). - if (threshold != null && rest.thresholdRate == null) { - rest.thresholdRate = threshold; - } - - // Translate the historical boolean `enableClientAdditionalDetection` to the - // new `additionalDetection: "client"` form that the Rust CLI understands. - const restAny = rest as Record; - if (restAny.enableClientAdditionalDetection && restAny.additionalDetection == null) { - restAny.additionalDetection = 'client'; - } - delete restAny.enableClientAdditionalDetection; - - // Strip CLI-only entries before forwarding. - for (const k of CLI_ONLY_KEYS) { - delete (rest as Record)[k]; - } - - const args = [ - '--', - actualDir, - expectedDir, - diffDir, - ...Object.entries(rest).flatMap(([k, v]) => { - if (v == null || v === '') return []; - const flag = KEY_REMAP[k] ?? k; - return [`--${flag}`, String(v)]; - }), - ]; - const inner = run(args); - - // reg.json + junit.xml are written by the Rust/Wasm side. We only handle - // the side-effecting bits here that need host fs access beyond the WASI - // preopen: `update` (cross-dir copy) and the `-X client` worker/wasm - // assets (classic puts them next to the HTML report). - const outer = new EventEmitter(); - inner.on('start', () => outer.emit('start')); - inner.on('compare', (p) => outer.emit('compare', p)); - inner.on('error', (e) => outer.emit('error', e)); - inner.on('complete', async (data: CompareOutput) => { - try { - if (restAny.additionalDetection === 'client' && typeof input.report === 'string') { - // Lazy-load so the ximgdiff helper (pulls in x-img-diff-js + fs - // reads of the worker_pre.js/report-worker.js shared assets) isn't - // in `compare()`'s hot path for users who never enable `-X client`. - const { writeXimgdiffAssets } = await import('./ximgdiff'); - await writeXimgdiffAssets({ - reportPath: input.report, - urlPrefix: typeof input.urlPrefix === 'string' ? input.urlPrefix : '', - // `dir()` returns the published `dist/` directory regardless of - // which chunk unbuild places this call into, because `dir()` is - // defined in a module that always inlines into the entry. - distDir: dir(), - }); - } - if (update) { - await updateExpected(actualDir, expectedDir, { - newItems: data.newItems ?? [], - failedItems: data.failedItems ?? [], - deletedItems: data.deletedItems ?? [], - }); - outer.emit('update'); - } - } catch (e) { - outer.emit('error', e); - return; - } - outer.emit('complete', data); - }); - - return outer; -}; - -export async function writeRegJson(path: string, data: CompareOutput): Promise { - const { writeFile, mkdir } = await import('node:fs/promises'); - const { dirname } = await import('node:path'); - await mkdir(dirname(path), { recursive: true }); - await writeFile(path, JSON.stringify(data, null, 2) + '\n', 'utf8'); -} - -// Match classic reg-cli's `-U` semantics (see src/index.js:134-146 and the -// same function in cli.ts for context): prune deleted+failed baselines from -// `expectedDir`, then copy new+failed from `actualDir`. Passed items are -// left alone so their mtime and git status don't churn. -async function updateExpected( - actualDir: string, - expectedDir: string, - items: { - newItems: string[]; - failedItems: string[]; - deletedItems: string[]; - }, -): Promise { - const { mkdir, copyFile, rm } = await import('node:fs/promises'); - const { dirname, join } = await import('node:path'); - const toRemove = [...items.deletedItems, ...items.failedItems]; - for (const img of toRemove) { - await rm(join(expectedDir, img), { force: true }); - } - const toCopy = [...items.newItems, ...items.failedItems]; - for (const img of toCopy) { - const src = join(actualDir, img); - const dst = join(expectedDir, img); - await mkdir(dirname(dst), { recursive: true }); - await copyFile(src, dst); - } -} diff --git a/src/log.js b/src/log.js new file mode 100644 index 00000000..07a6d83c --- /dev/null +++ b/src/log.js @@ -0,0 +1,18 @@ +/* @flow */ + +const chalk = require('chalk'); + +export default { + info(text: string) { + console.log(chalk.cyan(text)); + }, + warn(text: string) { + console.log(chalk.gray(text)); + }, + success(text: string) { + console.log(chalk.green(text)); + }, + fail(text: string) { + console.log(chalk.red(text)); + }, +}; diff --git a/src/process-adaptor.js b/src/process-adaptor.js new file mode 100644 index 00000000..fbf982b1 --- /dev/null +++ b/src/process-adaptor.js @@ -0,0 +1,43 @@ +/* @flow */ + +import { fork } from 'child_process'; // $FlowIgnore +import path from 'path'; +import type EventEmitter from 'events'; +import type { DiffCreatorParams, DiffResult } from './diff'; + +export default class ProcessAdaptor { + + _isRunning: boolean; + _process: child_process$ChildProcess; + _emitter: EventEmitter; + + constructor(emitter: EventEmitter) { + this._process = fork(path.resolve(__dirname, './diff.js')); + this._isRunning = false; + this._emitter = emitter; + } + + isRunning() { + return this._isRunning; + } + + run(params: DiffCreatorParams): Promise { + return new Promise((resolve, reject) => { + this._isRunning = true; + if (!this._process || !this._process.send) resolve(); + this._process.send(params); + this._process.once('message', (result) => { + this._isRunning = false; + this._emitter.emit('compare', { + type: result.passed ? 'pass' : 'fail', path: result.image, + }); + resolve(result); + }); + }); + } + + close() { + if (!this._process || !this._process.kill) return; + this._process.kill(); + } +} diff --git a/src/progress.ts b/src/progress.ts deleted file mode 100644 index 4b9099e8..00000000 --- a/src/progress.ts +++ /dev/null @@ -1,47 +0,0 @@ -// Parse live `compare` progress events out of the Wasm's stderr stream. -// -// `crates/reg_core/src/lib.rs` emits one line per event while the diff -// loop runs: -// -// __REG_CLI_EVT__\t{"type":"pass|fail|new|delete","path":"..."}\n -// -// The WASI host (entry.ts + worker.ts) installs `printErr` via -// `@tybys/wasm-util`; this module owns the parsing + forwarding logic so -// both hosts stay in sync on the wire format. Non-event stderr lines pass -// through unchanged to `console.error`, so real error output still -// reaches the user. - -const MARKER = '__REG_CLI_EVT__\t'; - -export type CompareEventKind = 'pass' | 'fail' | 'new' | 'delete'; -export type CompareEvent = { type: CompareEventKind; path: string }; - -/** - * Build a WASI `printErr` hook that forwards progress events to `onEvent` - * and everything else to `fallback` (defaults to `console.error`). - * - * `@tybys/wasm-util`'s `StandardOutput.write` already buffers until a - * newline and invokes the callback with one stripped line per call (see - * `node_modules/@tybys/wasm-util/dist/wasm-util.esm-bundler.js` line - * ~749-779). So we can treat each invocation as a single complete line. - */ -export const createPrintErrHook = ( - onEvent: (ev: CompareEvent) => void, - fallback: (s: string) => void = (s) => console.error(s), -): ((s: string) => void) => { - return (line: string) => { - if (line.startsWith(MARKER)) { - const json = line.slice(MARKER.length); - try { - const ev = JSON.parse(json) as CompareEvent; - if (ev && typeof ev.type === 'string' && typeof ev.path === 'string') { - onEvent(ev); - return; - } - } catch { - // Malformed — fall through so the user at least sees the line. - } - } - fallback(line); - }; -}; diff --git a/src/proxy.js b/src/proxy.js deleted file mode 100644 index bd8a7d67..00000000 --- a/src/proxy.js +++ /dev/null @@ -1,79 +0,0 @@ -// compiled from: https://github.com/toyobayashi/emnapi/blob/main/packages/wasi-threads/src/proxy.ts - -'use strict'; -Object.defineProperty(exports, '__esModule', { value: true }); -exports.createInstanceProxy = exports.kIsProxy = void 0; -exports.kIsProxy = Symbol('kIsProxy'); -/** @public */ -function createInstanceProxy(instance, memory) { - if (instance[exports.kIsProxy]) return instance; - // https://github.com/nodejs/help/issues/4102 - var originalExports = instance.exports; - var createHandler = function(target) { - var handlers = [ - 'apply', - 'construct', - 'defineProperty', - 'deleteProperty', - 'get', - 'getOwnPropertyDescriptor', - 'getPrototypeOf', - 'has', - 'isExtensible', - 'ownKeys', - 'preventExtensions', - 'set', - 'setPrototypeOf', - ]; - var handler = {}; - var _loop_1 = function(i) { - var name_1 = handlers[i]; - handler[name_1] = function() { - var args = Array.prototype.slice.call(arguments, 1); - args.unshift(target); - return Reflect[name_1].apply(Reflect, args); - }; - }; - for (var i = 0; i < handlers.length; i++) { - _loop_1(i); - } - return handler; - }; - var handler = createHandler(originalExports); - var _initialize = function() {}; - var _start = function() { - return 0; - }; - handler.get = function(_target, p, receiver) { - var _a; - if (p === 'memory') { - return (_a = typeof memory === 'function' ? memory() : memory) !== null && _a !== void 0 - ? _a - : Reflect.get(originalExports, p, receiver); - } - if (p === '_initialize') { - return p in originalExports ? _initialize : undefined; - } - if (p === '_start') { - return p in originalExports ? _start : undefined; - } - return Reflect.get(originalExports, p, receiver); - }; - handler.has = function(_target, p) { - if (p === 'memory') return true; - return Reflect.has(originalExports, p); - }; - var exportsProxy = new Proxy(Object.create(null), handler); - return new Proxy(instance, { - get: function(target, p, receiver) { - if (p === 'exports') { - return exportsProxy; - } - if (p === exports.kIsProxy) { - return true; - } - return Reflect.get(target, p, receiver); - }, - }); -} -exports.createInstanceProxy = createInstanceProxy; diff --git a/src/proxy.ts b/src/proxy.ts deleted file mode 100644 index 2f4c5ea2..00000000 --- a/src/proxy.ts +++ /dev/null @@ -1,91 +0,0 @@ -// compiled from: https://github.com/toyobayashi/emnapi/blob/main/packages/wasi-threads/src/proxy.ts -// MIT License -// -// Copyright (c) 2021-present Toyobayashi -// -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to deal -// in the Software without restriction, including without limitation the rights -// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in all -// copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -// SOFTWARE. -export const kIsProxy = Symbol('kIsProxy') - -export const createInstanceProxy = ( - instance: WebAssembly.Instance, - memory?: WebAssembly.Memory | (() => WebAssembly.Memory) -): WebAssembly.Instance => { - if ((instance as any)[kIsProxy]) return instance - - // https://github.com/nodejs/help/issues/4102 - const originalExports = instance.exports - const createHandler = function (target: WebAssembly.Exports): ProxyHandler { - const handlers = [ - 'apply', - 'construct', - 'defineProperty', - 'deleteProperty', - 'get', - 'getOwnPropertyDescriptor', - 'getPrototypeOf', - 'has', - 'isExtensible', - 'ownKeys', - 'preventExtensions', - 'set', - 'setPrototypeOf' - ] - const handler: ProxyHandler = {} - for (let i = 0; i < handlers.length; i++) { - const name = handlers[i] as keyof ProxyHandler - handler[name] = function () { - const args = Array.prototype.slice.call(arguments, 1) - args.unshift(target) - return (Reflect[name] as any).apply(Reflect, args) - } - } - return handler - } - const handler = createHandler(originalExports) - const _initialize = (): void => {} - const _start = (): number => 0 - handler.get = function (_target, p, receiver) { - if (p === 'memory') { - return (typeof memory === 'function' ? memory() : memory) ?? Reflect.get(originalExports, p, receiver) - } - if (p === '_initialize') { - return p in originalExports ? _initialize : undefined - } - if (p === '_start') { - return p in originalExports ? _start : undefined - } - return Reflect.get(originalExports, p, receiver) - } - handler.has = function (_target, p) { - if (p === 'memory') return true - return Reflect.has(originalExports, p) - } - const exportsProxy = new Proxy(Object.create(null), handler) - return new Proxy(instance, { - get (target, p, receiver) { - if (p === 'exports') { - return exportsProxy - } - if (p === kIsProxy) { - return true - } - return Reflect.get(target, p, receiver) - } - }) -} \ No newline at end of file diff --git a/src/report.js b/src/report.js new file mode 100644 index 00000000..07c369cc --- /dev/null +++ b/src/report.js @@ -0,0 +1,177 @@ +/* @flow */ + +// $FlowIgnore +import Mustache from 'mustache'; +import * as detectDiff from 'x-img-diff-js'; +import fs from 'fs'; +import mkdirp from 'make-dir'; // $FlowIgnore +import path from 'path'; +// $FlowIgnore +import * as xmlBuilder from 'xmlbuilder2'; + +export type ReportParams = { + passedItems: string[], + failedItems: string[], + newItems: string[], + deletedItems: string[], + expectedItems: string[], + actualItems: string[], + diffItems: string[], + json: string, + actualDir: string, + expectedDir: string, + diffDir: string, + report: string, + junitReport: string, + extendedErrors: boolean, + urlPrefix: string, + enableClientAdditionalDetection: boolean, + fromJSON?: boolean, +}; + +const loadFaviconAsDataURL = type => { + const fname = path.resolve(__dirname, `../report/assets/favicon_${type}.png`); + const buffer = fs.readFileSync(fname); + return 'data:image/png;base64,' + buffer.toString('base64'); +}; + +const encodeFilePath = filePath => { + return filePath + .split(path.sep) + .map(p => encodeURIComponent(p)) + .join(path.sep); +}; + +const createJSONReport = params => { + return { + failedItems: params.failedItems, + newItems: params.newItems, + deletedItems: params.deletedItems, + passedItems: params.passedItems, + expectedItems: params.expectedItems, + actualItems: params.actualItems, + diffItems: params.diffItems, + actualDir: `${params.urlPrefix}${path.relative(path.dirname(params.json), params.actualDir)}`, + expectedDir: `${params.urlPrefix}${path.relative(path.dirname(params.json), params.expectedDir)}`, + diffDir: `${params.urlPrefix}${path.relative(path.dirname(params.json), params.diffDir)}`, + }; +}; + +const createHTMLReport = params => { + const file = path.join(__dirname, '../template/template.html'); + const js = fs.readFileSync(path.join(__dirname, '../report/ui/dist/report.js')); + const css = fs.readFileSync(path.join(__dirname, '../report/ui/dist/style.css')); + const template = fs.readFileSync(file); + const json = { + type: params.failedItems.length === 0 ? 'success' : 'danger', + hasNew: params.newItems.length > 0, + newItems: params.newItems.map(item => ({ raw: item, encoded: encodeFilePath(item) })), + hasDeleted: params.deletedItems.length > 0, + deletedItems: params.deletedItems.map(item => ({ raw: item, encoded: encodeFilePath(item) })), + hasPassed: params.passedItems.length > 0, + passedItems: params.passedItems.map(item => ({ raw: item, encoded: encodeFilePath(item) })), + hasFailed: params.failedItems.length > 0, + failedItems: params.failedItems.map(item => ({ raw: item, encoded: encodeFilePath(item) })), + actualDir: params.fromJSON + ? params.actualDir + : `${params.urlPrefix}${path.relative(path.dirname(params.report), params.actualDir)}`, + expectedDir: params.fromJSON + ? params.expectedDir + : `${params.urlPrefix}${path.relative(path.dirname(params.report), params.expectedDir)}`, + diffDir: params.fromJSON + ? params.diffDir + : `${params.urlPrefix}${path.relative(path.dirname(params.report), params.diffDir)}`, + ximgdiffConfig: { + enabled: params.enableClientAdditionalDetection, + workerUrl: `${params.urlPrefix}worker.js`, + }, + }; + const faviconType = json.hasFailed || json.hasNew || json.hasDeleted ? 'failure' : 'success'; + const view = { + js, + css, + report: JSON.stringify(json), + faviconData: loadFaviconAsDataURL(faviconType), + }; + return Mustache.render(template.toString(), view); +}; + +const createJunitReport = params => { + const failedTests = params.failedItems.length + params.newItems.length + params.deletedItems.length; + const numberOfTests = failedTests + params.passedItems.length; + const doc = xmlBuilder.create({ version: '1.0' }); + const testsuitesElement = doc.ele('testsuites', { + name: 'reg-cli tests', + tests: numberOfTests, + failures: failedTests, + }); + const testsuiteElement = testsuitesElement.ele('testsuite', { + name: 'reg-cli', + tests: numberOfTests, + failures: failedTests, + }); + params.failedItems.forEach(item => { + addFailedJunitTestElement(testsuiteElement, item, 'failed'); + }); + params.newItems.forEach(item => { + if (params.extendedErrors) { + addFailedJunitTestElement(testsuiteElement, item, 'newItem'); + } else { + addPassedJunitTestElement(testsuiteElement, item); + } + }); + params.deletedItems.forEach(item => { + if (params.extendedErrors) { + addFailedJunitTestElement(testsuiteElement, item, 'deletedItem'); + } else { + addPassedJunitTestElement(testsuiteElement, item); + } + }); + params.passedItems.forEach(item => { + addPassedJunitTestElement(testsuiteElement, item); + }); + return doc.end({ prettyPrint: true }); +}; + +function addPassedJunitTestElement(testsuiteElement, item: string) { + testsuiteElement.ele('testcase', { name: item }); +} + +function addFailedJunitTestElement(testsuiteElement, item: string, reason: string) { + testsuiteElement.ele('testcase', { name: item }).ele('failure', { message: reason }); +} + +function createXimdiffWorker(params: ReportParams) { + const file = path.join(__dirname, '../template/worker_pre.js'); + const moduleJs = fs.readFileSync(path.join(__dirname, '../report/ui/dist/worker.js'), 'utf8'); + const wasmLoaderJs = fs.readFileSync(detectDiff.getBrowserJsPath(), 'utf8'); + const template = fs.readFileSync(file); + const ximgdiffWasmUrl = `${params.urlPrefix}detector.wasm`; + return Mustache.render(template.toString(), { ximgdiffWasmUrl }) + '\n' + moduleJs + '\n' + wasmLoaderJs; +} + +export default (params: ReportParams) => { + if (!!params.report) { + const html = createHTMLReport(params); + mkdirp.sync(path.dirname(params.report)); + fs.writeFileSync(params.report, html); + if (!!params.enableClientAdditionalDetection) { + const workerjs = createXimdiffWorker(params); + fs.writeFileSync(path.resolve(path.dirname(params.report), 'worker.js'), workerjs); + const wasmBuf = fs.readFileSync(detectDiff.getBrowserWasmPath()); + fs.writeFileSync(path.resolve(path.dirname(params.report), 'detector.wasm'), wasmBuf); + } + } + if (!!params.junitReport) { + const junitXml = createJunitReport(params); + mkdirp.sync(path.dirname(params.junitReport)); + fs.writeFileSync(params.junitReport, junitXml); + } + + const json = createJSONReport(params); + if (!params.fromJSON) { + mkdirp.sync(path.dirname(params.json)); + fs.writeFileSync(params.json, JSON.stringify(json)); + } + return json; +}; diff --git a/src/tracing.ts b/src/tracing.ts deleted file mode 100644 index 0629eb7a..00000000 --- a/src/tracing.ts +++ /dev/null @@ -1,412 +0,0 @@ -/** - * OpenTelemetry tracing utilities for reg-cli - * - * This module receives trace data from the Rust/WASM side and converts it - * to OpenTelemetry spans that can be exported to Jaeger or other backends. - */ - -import { NodeSDK } from '@opentelemetry/sdk-node'; -import { OTLPTraceExporter } from '@opentelemetry/exporter-trace-otlp-http'; -import { trace, SpanStatusCode, context, ROOT_CONTEXT, type Span, type Context } from '@opentelemetry/api'; -import { Resource } from '@opentelemetry/resources'; -import { ATTR_SERVICE_NAME, ATTR_SERVICE_VERSION } from '@opentelemetry/semantic-conventions'; - -let sdk: NodeSDK | null = null; -let isInitialized = false; - -// Store current root span context for propagation to Rust -let currentRootSpan: Span | null = null; -let currentRootContext: Context | null = null; - -/** - * Span data structure from Rust side - */ -export interface RustSpanData { - span_id: string; - parent_span_id: string | null; - name: string; - start_time_ms: number; - end_time_ms: number; - duration_ms: number; - level: string; - target: string; - attributes: Record; - status: string; - error_message: string | null; -} - -/** - * Trace data structure from Rust side - */ -export interface RustTraceData { - service_name: string; - trace_id: string | null; - js_parent_span_id: string | null; - spans: RustSpanData[]; -} - -/** - * Trace context to pass to Rust side - */ -export interface TraceContext { - traceId: string; - spanId: string; -} - -/** - * Check if tracing is enabled via environment variable - */ -export const isTracingEnabled = (): boolean => { - return process.env.OTEL_ENABLED === 'true' || process.env.JAEGER_ENABLED === 'true'; -}; - -/** - * Initialize OpenTelemetry SDK - */ -export const initTracing = (): void => { - if (!isTracingEnabled()) { - return; - } - - if (isInitialized) { - return; - } - - const otlpEndpoint = process.env.OTEL_EXPORTER_OTLP_ENDPOINT || 'http://localhost:4318/v1/traces'; - - const otlpExporter = new OTLPTraceExporter({ - url: otlpEndpoint, - }); - - sdk = new NodeSDK({ - resource: new Resource({ - [ATTR_SERVICE_NAME]: 'reg-cli', - [ATTR_SERVICE_VERSION]: '0.18.10', - }), - traceExporter: otlpExporter, - instrumentations: [], - }); - - sdk.start(); - isInitialized = true; - - if (process.env.OTEL_DEBUG === 'true') { - console.log('[Tracing] OpenTelemetry initialized'); - console.log(`[Tracing] OTLP endpoint: ${otlpEndpoint}`); - } -}; - -/** - * Shutdown OpenTelemetry SDK gracefully - */ -export const shutdownTracing = async (): Promise => { - if (!sdk || !isInitialized) { - return; - } - - if (process.env.OTEL_DEBUG === 'true') { - console.log('[Tracing] Starting SDK shutdown...'); - } - - try { - // Force flush before shutdown to ensure all spans are exported. - // (previously there was an extra 2000ms sleep here that was dominating - // wall-clock for small workloads — removed after bench confirmed it was - // unnecessary once sdk.shutdown() awaits export completion.) - await sdk.shutdown(); - } catch (err) { - console.error('[Tracing] Error during shutdown:', err); - } - - isInitialized = false; - sdk = null; - - if (process.env.OTEL_DEBUG === 'true') { - console.log('[Tracing] OpenTelemetry SDK shut down'); - } -}; - -/** - * Get the tracer instance - */ -const getTracer = () => { - return trace.getTracer('reg-cli-wasm', '0.18.10'); -}; - -/** - * Start a root span and return context info to pass to Rust - */ -export const startRootSpan = (name: string): TraceContext | null => { - if (!isTracingEnabled() || !isInitialized) { - return null; - } - - const tracer = getTracer(); - currentRootSpan = tracer.startSpan(name); - currentRootContext = trace.setSpan(ROOT_CONTEXT, currentRootSpan); - - // Get the span context to pass to Rust - const spanContext = currentRootSpan.spanContext(); - - if (process.env.OTEL_DEBUG === 'true') { - console.log(`[Tracing] Started root span: ${name}`); - console.log(`[Tracing] Trace ID: ${spanContext.traceId}`); - console.log(`[Tracing] Span ID: ${spanContext.spanId}`); - } - - return { - traceId: spanContext.traceId, - spanId: spanContext.spanId, - }; -}; - -/** - * End the current root span - */ -export const endRootSpan = (success: boolean = true): void => { - if (currentRootSpan) { - if (success) { - currentRootSpan.setStatus({ code: SpanStatusCode.OK }); - } else { - currentRootSpan.setStatus({ code: SpanStatusCode.ERROR }); - } - currentRootSpan.end(); - - if (process.env.OTEL_DEBUG === 'true') { - console.log('[Tracing] Ended root span'); - } - - currentRootSpan = null; - currentRootContext = null; - } -}; - -/** - * Topologically sort spans so parents are always processed before children - */ -const topologicalSortSpans = (spans: RustSpanData[]): RustSpanData[] => { - const spanMap = new Map(); - const childrenMap = new Map(); - const rootSpans: string[] = []; - - // Build maps - for (const span of spans) { - spanMap.set(span.span_id, span); - if (!span.parent_span_id) { - rootSpans.push(span.span_id); - } else { - const children = childrenMap.get(span.parent_span_id) || []; - children.push(span.span_id); - childrenMap.set(span.parent_span_id, children); - } - } - - if (process.env.OTEL_DEBUG === 'true') { - console.log(`[Tracing] Total spans: ${spans.length}, Unique IDs in spanMap: ${spanMap.size}`); - console.log(`[Tracing] Root spans: ${rootSpans.join(', ')}`); - console.log(`[Tracing] All spans:`); - for (const span of spans) { - console.log(` ${span.span_id}: ${span.name} (parent: ${span.parent_span_id || 'none'})`); - } - console.log(`[Tracing] Parent->Children map:`); - for (const [parent, children] of childrenMap.entries()) { - console.log(` ${parent} -> ${children.join(', ')}`); - } - } - - // BFS traversal from roots - const result: RustSpanData[] = []; - const queue = [...rootSpans]; - const visited = new Set(); - - while (queue.length > 0) { - const spanId = queue.shift()!; - if (visited.has(spanId)) continue; - visited.add(spanId); - - const span = spanMap.get(spanId); - if (span) { - result.push(span); - const children = childrenMap.get(spanId) || []; - queue.push(...children); - } - } - - // Add any orphaned spans (parent not in the span list) - for (const span of spans) { - if (!visited.has(span.span_id)) { - if (process.env.OTEL_DEBUG === 'true') { - console.log(`[Tracing] Orphan span: ${span.name} (id: ${span.span_id}, parent: ${span.parent_span_id})`); - } - result.push(span); - } - } - - return result; -}; - -/** - * Convert Rust trace data to OpenTelemetry spans - * - * Since Rust spans have already ended by the time we receive them, - * we reconstruct them with their recorded timestamps. - */ -export const processRustTraceData = (traceData: RustTraceData): void => { - if (!isTracingEnabled() || !isInitialized) { - return; - } - - const tracer = getTracer(); - - if (process.env.OTEL_DEBUG === 'true') { - console.log(`[Tracing] Processing ${traceData.spans.length} spans from Rust`); - console.log(`[Tracing] JS parent context available: ${currentRootContext !== null}`); - } - - // Topologically sort spans so parents are processed before children - const sortedSpans = topologicalSortSpans(traceData.spans); - - // Map to store span contexts by their IDs for parent-child linking - const spanContextMap = new Map(); - - for (const rustSpan of sortedSpans) { - // Convert milliseconds to nanoseconds for OpenTelemetry - const startTimeNs = rustSpan.start_time_ms * 1_000_000; - const endTimeNs = rustSpan.end_time_ms * 1_000_000; - - // Determine parent context - let parentContext: Context; - let parentInfo: string; - - if (rustSpan.parent_span_id && spanContextMap.has(rustSpan.parent_span_id)) { - // Has a Rust parent span that was already processed - parentContext = spanContextMap.get(rustSpan.parent_span_id)!; - parentInfo = `rust parent: ${rustSpan.parent_span_id}`; - } else if (!rustSpan.parent_span_id && currentRootContext) { - // Root-level Rust span - attach to JS root span - parentContext = currentRootContext; - parentInfo = `js parent: ${currentRootSpan?.spanContext().spanId}`; - } else { - // No parent available (orphan or parent not found) - parentContext = currentRootContext || ROOT_CONTEXT; - parentInfo = rustSpan.parent_span_id - ? `orphan (parent ${rustSpan.parent_span_id} not found)` - : 'root (no js context)'; - } - - // Start span with parent context - const span = tracer.startSpan( - rustSpan.name, - { - startTime: [Math.floor(startTimeNs / 1_000_000_000), startTimeNs % 1_000_000_000], - }, - parentContext, - ); - - // Set attributes - span.setAttribute('rust.target', rustSpan.target); - span.setAttribute('rust.level', rustSpan.level); - span.setAttribute('rust.span_id', rustSpan.span_id); - span.setAttribute('duration_ms', rustSpan.duration_ms); - - for (const [key, value] of Object.entries(rustSpan.attributes)) { - span.setAttribute(`rust.${key}`, value); - } - - // Set status - if (rustSpan.status === 'error') { - span.setStatus({ - code: SpanStatusCode.ERROR, - message: rustSpan.error_message || 'Unknown error', - }); - } else { - span.setStatus({ code: SpanStatusCode.OK }); - } - - // End span with recorded end time - span.end([Math.floor(endTimeNs / 1_000_000_000), endTimeNs % 1_000_000_000]); - - // Store context for child spans - const ctx = trace.setSpan(parentContext, span); - spanContextMap.set(rustSpan.span_id, ctx); - - if (process.env.OTEL_DEBUG === 'true') { - console.log(`[Tracing] Created span: ${rustSpan.name} (${rustSpan.duration_ms}ms) [${parentInfo}] start=${rustSpan.start_time_ms}, end=${rustSpan.end_time_ms}`); - } - } -}; - -/** - * Timing event collected inside a worker thread and shipped back to the main - * thread via postMessage. Converted to an OpenTelemetry span on receipt. - */ -export interface WorkerSpan { - name: string; - start_ms: number; // epoch millis (Date.now()-style) - end_ms: number; - attributes?: Record; - worker_label?: string; // "main" | "thread-1" | ... -} - -/** - * Convert worker-side timing events to OpenTelemetry spans attached under the - * current root span. Used to surface JS-bridge costs (Worker creation, wasm - * compile / instantiate, message round-trips) that Rust-side tracing cannot see. - */ -export const processWorkerSpans = ( - spans: WorkerSpan[], - workerLabel: string, -): void => { - if (!isTracingEnabled() || !isInitialized || !spans?.length) return; - - const tracer = getTracer(); - const parentCtx = currentRootContext ?? ROOT_CONTEXT; - - for (const s of spans) { - const startNs = s.start_ms * 1_000_000; - const endNs = s.end_ms * 1_000_000; - const span = tracer.startSpan( - s.name, - { - startTime: [Math.floor(startNs / 1e9), startNs % 1e9], - }, - parentCtx, - ); - span.setAttribute('worker', s.worker_label ?? workerLabel); - span.setAttribute('duration_ms', s.end_ms - s.start_ms); - if (s.attributes) { - for (const [k, v] of Object.entries(s.attributes)) { - span.setAttribute(k, v as string | number | boolean); - } - } - span.end([Math.floor(endNs / 1e9), endNs % 1e9]); - } -}; - -/** - * Create a wrapper span for the entire reg-cli operation - */ -export const createRootSpan = async (name: string, fn: () => Promise): Promise => { - if (!isTracingEnabled() || !isInitialized) { - return fn(); - } - - const tracer = getTracer(); - return tracer.startActiveSpan(name, async (span) => { - try { - const result = await fn(); - span.setStatus({ code: SpanStatusCode.OK }); - return result; - } catch (err) { - span.setStatus({ - code: SpanStatusCode.ERROR, - message: err instanceof Error ? err.message : 'Unknown error', - }); - span.recordException(err as Error); - throw err; - } finally { - span.end(); - } - }); -}; - diff --git a/src/utils.ts b/src/utils.ts deleted file mode 100644 index 100a0b0c..00000000 --- a/src/utils.ts +++ /dev/null @@ -1,165 +0,0 @@ -import path from 'path'; -import { fileURLToPath } from 'url'; -import { readFile } from 'node:fs/promises'; -import { dirname, join, resolve as pathResolve } from 'node:path'; -import { env as procEnv, cwd as procCwd } from 'node:process'; - -export const isCJS = typeof __dirname !== 'undefined'; - -export const readWasm = () => { - const dir = isCJS ? __dirname : path.dirname(fileURLToPath(import.meta.url)); - const file = readFile(join(dir, './reg.wasm')); - return file; -}; - -export const resolveExtention = (): string => { - return isCJS ? 'cjs' : 'mjs'; -}; - -/** - * Host environment variables intentionally forwarded into the Wasm sandbox. - * Everything else (shell secrets, CI credentials, AWS_*, NPM_TOKEN, ...) is - * filtered out. - */ -const FORWARDED_ENV = [ - 'OTEL_ENABLED', - 'JAEGER_ENABLED', - 'OTEL_DEBUG', - 'OTEL_EXPORTER_OTLP_ENDPOINT', - 'OTEL_EXPORTER_OTLP_PROTOCOL', - 'OTEL_SERVICE_NAME', - 'OTEL_TRACES_EXPORTER', - 'OTEL_RESOURCE_ATTRIBUTES', -] as const; - -/** - * Longest directory path that every input in `paths` lives under. Treats - * each path as a sequence of "/"-separated segments; absolute-vs-relative - * mixes fall back to '.'. - */ -const commonAncestor = (paths: string[]): string => { - const defined = paths.filter(Boolean); - if (defined.length === 0) return '.'; - if (defined.length === 1) return defined[0]; - // If absolute and relative are mixed we can't compute a meaningful common - // ancestor without risking opening "/". Bail to CWD. - const isAbs = (p: string) => p.startsWith('/'); - const anyAbs = defined.some(isAbs); - const allAbs = defined.every(isAbs); - if (anyAbs && !allAbs) return '.'; - const split = defined.map((p) => p.split('/').filter(Boolean)); - const shortest = Math.min(...split.map((s) => s.length)); - const common: string[] = []; - for (let i = 0; i < shortest; i++) { - const seg = split[0][i]; - if (split.every((s) => s[i] === seg)) common.push(seg); - else break; - } - if (common.length === 0) return allAbs ? '/' : '.'; - return (allAbs ? '/' : '') + common.join('/'); -}; - -export type WasiSandbox = { - /** Directories mapped into the Wasm sandbox. Everything else is invisible. */ - preopens: Record; - /** Allowlist-filtered environment variables. */ - env: Record; -}; - -/** - * Compute the minimum-capability WASI sandbox for a given reg-cli invocation: - * - * - preopen only the smallest ancestor directory that covers every path - * this run touches (actualDir, expectedDir, diffDir, and the parents - * of --report / --json) - * - forward only an allowlisted subset of host env into Wasm - * - * Before this, entry.ts / worker.ts did `preopens: { './': './' }` which - * exposed the entire cwd (and therefore `.npmrc`, `.env`, `node_modules`, - * etc.) to whatever runs inside Wasm. Narrowing matters because reg-cli - * deliberately ingests untrusted images from CI and image decoders - * (libpng, libwebp, libjpeg) have a long history of RCE-class CVEs. - * - * Why a single common-ancestor and not one preopen per directory: - * On the `wasm32-wasip1-threads` target, Rust's libstd only enumerates - * the first preopen returned by WASI (`fd_prestat_get(3)` is queried but - * `fd_prestat_get(4)` is never issued). Until that's fixed upstream, - * registering one preopen per dir effectively hides every dir but the - * first. Picking the narrowest *single* ancestor that still contains - * every touched path gives us a real-world win without tripping the bug. - * - * Caveats (follow-ups, not in this PR): - * - Symlinks and FIFOs inside the preopened directory are still resolved - * by the host, so an attacker who can plant files under `./diff/` could - * still exfiltrate via an evil symlink pointing outside the sandbox. - * Addressing this needs host-side WASI changes. - * - `@tybys/wasm-util`'s WASI still runs on top of Node's `fs` with full - * privilege (`fs: fs as IFs`); we only constrain *what paths Wasm is - * allowed to name*, not what the host fs underneath could do. - * - One-preopen-per-dir limitation above. - */ -export const computeWasiSandbox = (argv: string[]): WasiSandbox => { - // run() in index.ts wraps argv with a leading "--" sentinel before passing - // it through WASI. Strip that so we see the user's original args. - const args = argv[0] === '--' ? argv.slice(1) : argv; - - // Positional args (up to 3) = actualDir, expectedDir, diffDir. - const positional: string[] = []; - for (let i = 0; i < args.length && positional.length < 3; i++) { - if (args[i].startsWith('--')) break; - positional.push(args[i]); - } - - const flagValue = (name: string): string | undefined => { - const i = args.indexOf(name); - return i >= 0 && i + 1 < args.length ? args[i + 1] : undefined; - }; - - const dirs: string[] = []; - for (const p of positional) if (p) dirs.push(p); - const report = flagValue('--report'); - const json = flagValue('--json'); - const junit = flagValue('--junit'); - const from = flagValue('--from') ?? flagValue('-F'); - if (report) dirs.push(dirname(report) || '.'); - if (json) dirs.push(dirname(json) || '.'); - if (junit) dirs.push(dirname(junit) || '.'); - // `-F/--from` reads an existing reg.json, so its parent dir must be in the - // sandbox even when no positional dirs are supplied. - if (from) dirs.push(dirname(from) || '.'); - - // Collapse every requested directory into a single shared ancestor. - // - // We originally tried to register 3-5 individual preopens (actual / expected - // / diff / report / json). Problem: `wasm32-wasip1-threads` libstd's - // preopen-enumeration appears to stop enumerating after fd 3 (only the - // first preopen is actually visible to the Rust side), so only one preopen - // becomes usable per run. Until that is fixed upstream, fall back to the - // narrowest *single* directory that contains every path this run touches. - // - // That's still a large improvement over `{'./': './'}`: on a typical - // invocation (`reg-cli /actual /expected /diff ...`) the - // preopen becomes `` rather than the entire CWD. - const preopenRoot = commonAncestor(dirs) || '.'; - const mapWasm = (p: string): string => - p === '.' || p === './' || p.startsWith('/') || p.startsWith('./') - ? p - : `./${p}`; - const preopens: Record = { - [mapWasm(preopenRoot)]: preopenRoot, - }; - - // Fallback: if argv doesn't carry any dirs (--help, --version), let the - // binary still render to stderr by preopening the current directory. - if (!preopenRoot || preopenRoot === '.' || preopenRoot === './') { - preopens['./'] = './'; - } - - const env: Record = {}; - for (const k of FORWARDED_ENV) { - const v = procEnv[k]; - if (v !== undefined) env[k] = v; - } - - return { preopens, env }; -}; diff --git a/src/worker.ts b/src/worker.ts deleted file mode 100644 index 98a8bfdc..00000000 --- a/src/worker.ts +++ /dev/null @@ -1,112 +0,0 @@ -import { parentPort, workerData } from 'node:worker_threads'; -import fs from 'node:fs'; -import { WASI, type IFs } from '@tybys/wasm-util'; -import { argv, env } from 'node:process'; -import { computeWasiSandbox, readWasm, resolveExtention } from './utils'; -// https://github.com/toyobayashi/emnapi/blob/5ab92c706c7cd4a0a30759e58f26eedfb0ded591/packages/wasi-threads/src/wasi-threads.ts#L288-L335 -import { createInstanceProxy } from './proxy'; -import { createPrintErrHook } from './progress'; -import { type WorkerSpan } from './tracing'; - -const isTracingEnabled = (): boolean => - env.OTEL_ENABLED === 'true' || env.JAEGER_ENABLED === 'true'; - -// Each rayon worker thread (Node Worker) has its own WASI instance and fd -// table, so we must narrow its sandbox too — not just the main entry one. -const sandbox = computeWasiSandbox(workerData.argv); - -// Live `compare` events from rayon worker threads: Rust's `eprintln!` -// inside the per-image par_iter closure runs on whichever thread worker -// is executing that slice. Each worker has its own WASI instance, so each -// needs its own `printErr` hook to forward progress to the parent. -const printErr = createPrintErrHook((ev) => { - parentPort?.postMessage({ cmd: 'compare-event', event: ev }); -}); - -// Per-handler buffer. Sent to parent on completion. -const wasi = new WASI({ - version: 'preview1', - args: workerData.argv, - env: sandbox.env, - returnOnExit: true, - preopens: sandbox.preopens, - fs: fs as IFs, - printErr, -}); - -const imports = wasi.getImportObject(); -const file = readWasm(); - -const handler = async ({ startArg, tid, memory }: { startArg: number, tid: number, memory: WebAssembly.Memory }) => { - const workerSpans: WorkerSpan[] = []; - const workerLabel = `thread-${tid}`; - const handler_start_ms = Date.now(); - - const tSpan = async ( - name: string, - fn: () => Promise | T, - attributes?: WorkerSpan['attributes'], - ): Promise => { - if (!isTracingEnabled()) return fn(); - const start_ms = Date.now(); - const r = await fn(); - workerSpans.push({ - name, - start_ms, - end_ms: Date.now(), - attributes, - worker_label: workerLabel, - }); - return r; - }; - - try { - const wasm = await tSpan('worker.wasm_compile', async () => - WebAssembly.compile(await file), - ); - - let instance = await tSpan('worker.wasm_instantiate', async () => - WebAssembly.instantiate(wasm, { - ...imports, - wasi: { - 'thread-spawn': (startArg: number) => { - const threadIdBuffer = new SharedArrayBuffer(4); - const id = new Int32Array(threadIdBuffer); - Atomics.store(id, 0, -1); - parentPort?.postMessage({ cmd: 'thread-spawn', startArg, threadId: id, memory }); - Atomics.wait(id, 0, -1); - const tid = Atomics.load(id, 0); - return tid; - }, - }, - env: { memory }, - }), - ); - - instance = createInstanceProxy(instance, memory); - - await tSpan('worker.wasi_start', async () => { - wasi.start(instance); - }); - - await tSpan('worker.wasi_thread_start', async () => { - // @ts-expect-error wasi_thread_start not defined - instance.exports.wasi_thread_start(tid, startArg); - }, { tid }); - - if (isTracingEnabled()) { - workerSpans.push({ - name: 'worker.thread_total', - start_ms: handler_start_ms, - end_ms: Date.now(), - worker_label: workerLabel, - attributes: { tid }, - }); - parentPort?.postMessage({ cmd: 'worker-spans', workerSpans }); - } - } catch (e) { - throw e; - } -}; - -parentPort?.addListener('message', handler); diff --git a/src/ximgdiff.ts b/src/ximgdiff.ts deleted file mode 100644 index b5762975..00000000 --- a/src/ximgdiff.ts +++ /dev/null @@ -1,87 +0,0 @@ -// Emits the browser-side assets classic reg-cli's `-X, --additionalDetection -// client` mode relies on: -// -// /worker.js — mustache-rendered worker_pre.js + the -// report-ui worker + the x-img-diff-js -// wasm loader, concatenated in that order -// /detector.wasm — the x-img-diff-js wasm binary itself, -// renamed from cv-wasm_browser.wasm -// -// The HTML report's ximgdiffConfig.workerUrl points at `./worker.js`, so if -// this pair isn't next to the report the browser will 404 the worker and -// the "client" detection pass silently becomes a no-op. -// -// Classic's src/report.js does this inline; we keep it factored out so both -// the CLI wrapper (`cli.ts`) and the library entry point (`compare()` in -// `index.ts`) can emit the same bytes. - -import { createRequire } from 'node:module'; -import { dirname, join } from 'node:path'; -import { mkdir, readFile, writeFile } from 'node:fs/promises'; - -// CommonJS fallback for `require.resolve` — unbuild emits both cjs + mjs -// variants and the library can be loaded from either. -const requireShim = createRequire(import.meta.url); - -// Minimal mustache `{{&name}}` replacement — the template only uses that -// single non-escaped substitution, so a full mustache dep isn't warranted. -const renderWorkerPre = (template: string, wasmUrl: string): string => - template.replace(/\{\{&\s*ximgdiffWasmUrl\s*\}\}/g, wasmUrl); - -export type XimgdiffOptions = { - /** Absolute or cwd-relative path to the report HTML. Assets land next to it. */ - reportPath: string; - /** Same prefix the HTML report received (default ''). */ - urlPrefix?: string; - /** - * Directory that contains the staged `shared/worker_pre.js` and - * `shared/report-worker.js` assets (produced by the unbuild hook in - * `build.config.ts`). Callers pass the published `dist/` directory so - * that unbuild's chunk splitting — which moves this helper off to - * `dist/chunks/ximgdiff.mjs` — doesn't break path resolution. - */ - distDir: string; -}; - -/** - * Concatenate worker_pre.js + report-ui worker + x-img-diff-js loader and - * write the result + the wasm binary next to the HTML report. Safe to call - * whether or not the report dir already exists. - */ -export const writeXimgdiffAssets = async ( - opts: XimgdiffOptions, -): Promise => { - const outDir = dirname(opts.reportPath); - const urlPrefix = opts.urlPrefix ?? ''; - const wasmUrl = `${urlPrefix}detector.wasm`; - - // Resolve the wasm binary via x-img-diff-js's node API — matches - // classic's `detectDiff.getBrowserWasmPath()` behaviour and keeps us - // honest about the version pin. - const xImgDiff: { - getBrowserWasmPath: () => string; - getBrowserJsPath: () => string; - } = requireShim('x-img-diff-js'); - - const sharedDir = join(opts.distDir, 'shared'); - const [workerPreTpl, reportWorkerJs, wasmLoaderJs, wasmBuf] = - await Promise.all([ - readFile(join(sharedDir, 'worker_pre.js'), 'utf8'), - readFile(join(sharedDir, 'report-worker.js'), 'utf8'), - readFile(xImgDiff.getBrowserJsPath(), 'utf8'), - readFile(xImgDiff.getBrowserWasmPath()), - ]); - - const workerJs = - renderWorkerPre(workerPreTpl, wasmUrl) + - '\n' + - reportWorkerJs + - '\n' + - wasmLoaderJs; - - await mkdir(outDir, { recursive: true }); - await Promise.all([ - writeFile(join(outDir, 'worker.js'), workerJs, 'utf8'), - writeFile(join(outDir, 'detector.wasm'), wasmBuf), - ]); -}; diff --git a/test/cli.test.mjs b/test/cli.test.mjs index b09f4d53..5adf62da 100644 --- a/test/cli.test.mjs +++ b/test/cli.test.mjs @@ -1,782 +1,684 @@ -// End-to-end tests for the Wasm reg-cli wrapper. -// -// These spawn the built CLI the same way a user or CI pipeline would, then -// inspect the on-disk artefacts (reg.json / junit.xml / report.html). The -// goal is twofold: -// -// 1. Catch regressions in the JS→Wasm plumbing (flag forwarding, WASI -// sandbox preopens, EventEmitter surface, exit codes). -// 2. Pin **byte-for-byte compatibility** with classic reg-cli's JUnit XML -// and reg.json schemas so that downstream tooling (reg-suit, -// reg-notify-*, CI JUnit parsers) keeps working when users migrate. -// -// Paths throughout are relative to the repo root (which is used as `cwd` -// when spawning the CLI). Real users invoke reg-cli this way in CI too, and -// it avoids a known limitation where absolute paths don't round-trip -// cleanly through `glob` inside the WASI sandbox. -// -// Run with: `node --test js/test/cli.test.mjs` - -import { test } from 'node:test'; -import assert from 'node:assert/strict'; -import { spawn } from 'node:child_process'; -import { mkdir, readFile, rm, cp, stat } from 'node:fs/promises'; -import { dirname, join, relative } from 'node:path'; -import { fileURLToPath } from 'node:url'; - -const HERE = dirname(fileURLToPath(import.meta.url)); -const REPO = join(HERE, '..'); -const CLI = join(REPO, 'dist', 'cli.mjs'); -const SAMPLE_REL = 'sample'; // repo-relative -// Unique scratch dir per test, rooted under the repo so the WASI preopen -// computed from positional dirs comfortably covers it. -const TMP_ROOT_ABS = join(REPO, 'test', '__workspace__'); -const TMP_ROOT_REL = relative(REPO, TMP_ROOT_ABS); // 'test/__workspace__' - -let runId = 0; -// Returns { abs, rel } for a fresh scratch dir. -const scratch = async () => { - const tag = `t${process.pid}-${++runId}-${Math.random().toString(36).slice(2, 8)}`; - const abs = join(TMP_ROOT_ABS, tag); - await mkdir(abs, { recursive: true }); - return { abs, rel: join(TMP_ROOT_REL, tag) }; +import test from 'ava'; +import fs from 'fs'; +import copyfiles from 'copyfiles'; +import rimraf from 'rimraf'; +// $FlowIgnore +import spawn from 'cross-spawn'; + +const IMAGE_FILES = '/**/*.+(tiff|jpeg|jpg|gif|png|bmp)'; +const WORKSPACE = 'test/__workspace__'; +const RESOURCE = 'resource'; +const SAMPLE_IMAGE = 'sample(cal).png'; +const SAMPLE_DIFF_IMAGE = 'sample(cal).png'; + +const replaceReportPath = report => { + Object.keys(report).forEach(key => { + report[key] = + typeof report[key] === 'string' ? report[key].replace(/\\/g, '/') : report[key].map(r => r.replace(/\\/g, '/')); + }); + return report; }; -const runCli = (args, opts = {}) => - new Promise((resolve, reject) => { - const p = spawn(process.execPath, [CLI, ...args], { - cwd: opts.cwd ?? REPO, - env: { ...process.env, ...opts.env }, +test.beforeEach(async t => { + await new Promise(resolve => copyfiles([`${RESOURCE}${IMAGE_FILES}`, WORKSPACE], resolve)); + await new Promise(resolve => copyfiles([`${RESOURCE}/reg.json`, WORKSPACE], resolve)); +}); + +test.serial('should display default diff message', async t => { + const stdout = await new Promise(async resolve => { + const chunks = []; + rimraf(`${WORKSPACE}/resource/expected`, () => { + const p = spawn('./dist/cli.js', [ + `${WORKSPACE}/resource/actual`, + `${WORKSPACE}/resource/expected`, + `${WORKSPACE}/diff`, + '-E', + ]); + p.stdout.on('data', chunk => { + chunks.push(Buffer.from(chunk)); + }); + p.on('close', () => { + resolve(Buffer.concat(chunks).toString('utf8')); + }); }); - const out = []; - const err = []; - p.stdout.on('data', (d) => out.push(d)); - p.stderr.on('data', (d) => err.push(d)); - p.on('error', reject); - p.on('close', (code) => - resolve({ - code, - stdout: Buffer.concat(out).toString('utf8'), - stderr: Buffer.concat(err).toString('utf8'), - }), - ); }); + t.true(stdout.indexOf('Inspect your code changes, re-run with `-U` to update them') !== -1); +}); -test.before(async () => { - await mkdir(TMP_ROOT_ABS, { recursive: true }); - // Guard: dist must exist. We never rebuild from here — that belongs to CI. - await stat(CLI).catch(() => { - throw new Error( - `Built CLI not found at ${CLI}. Run 'pnpm --filter ./js build' first.`, - ); +test.serial('should display custom diff message', async t => { + const stdout = await new Promise(async resolve => { + const chunks = []; + rimraf(`${WORKSPACE}/resource/expected`, () => { + const p = spawn('./dist/cli.js', [ + `${WORKSPACE}/resource/actual`, + `${WORKSPACE}/resource/expected`, + `${WORKSPACE}/diff`, + '-E', + '-D Custom diff message', + ]); + p.stdout.on('data', chunk => { + chunks.push(Buffer.from(chunk)); + }); + p.on('close', () => { + resolve(Buffer.concat(chunks).toString('utf8')); + }); + }); }); + t.true(stdout.indexOf('Custom diff message') !== -1); }); -test.after(async () => { - await rm(TMP_ROOT_ABS, { recursive: true, force: true }); +test.serial('should display error message when passing only 1 argument', async t => { + const stdout = await new Promise(resolve => { + const p = spawn('./dist/cli.js', ['./sample/actual']); + p.stdout.on('data', data => resolve(data)); + p.stderr.on('data', data => console.error(data)); + }); + t.true(stdout.indexOf('please specify actual, expected and diff images directory') !== -1); +}); + +test.serial('should display error message when passing only 2 argument', async t => { + const stdout = await new Promise(resolve => { + const p = spawn('./dist/cli.js', ['./sample/actual', './sample/expected']); + p.stdout.on('data', data => resolve(data)); + p.stderr.on('data', data => console.error(data)); + }); + t.true(stdout.indexOf('please specify actual, expected and diff images directory') !== -1); }); -// --------------------------------------------------------------------------- -// Basic exit-code semantics -// --------------------------------------------------------------------------- - -test('exit 1 when images differ and no -I', async () => { - const d = await scratch(); - const { code } = await runCli([ - `${SAMPLE_REL}/actual`, - `${SAMPLE_REL}/expected`, - `${d.rel}/diff`, - ]); - assert.equal(code, 1); +test.serial('should generate image diff with exit code 1', async t => { + const code = await new Promise(resolve => { + const p = spawn('./dist/cli.js', [ + `${WORKSPACE}/resource/actual`, + `${WORKSPACE}/resource/expected`, + `${WORKSPACE}/diff`, + ]); + p.on('close', code => resolve(code)); + }); + t.true(code === 1); + try { + fs.readFileSync(`${WORKSPACE}/diff/${SAMPLE_DIFF_IMAGE}`); + t.pass(); + } catch (e) { + console.log(e); + t.fail(); + } }); -test('exit 0 when -I is set despite differences', async () => { - const d = await scratch(); - const { code } = await runCli([ - `${SAMPLE_REL}/actual`, - `${SAMPLE_REL}/expected`, - `${d.rel}/diff`, - '-I', - ]); - assert.equal(code, 0); +test.serial('should exit process without error when ignore change option set', async t => { + const code = await new Promise(resolve => { + const p = spawn('./dist/cli.js', [ + `${WORKSPACE}/resource/actual`, + `${WORKSPACE}/resource/expected`, + `${WORKSPACE}/diff`, + '-I', + ]); + p.on('close', code => resolve(code)); + p.stderr.on('data', data => console.error(data)); + p.on('error', e => { + t.fail(); + console.error(e); + }); + }); + t.true(code === 0); }); -test('exit 1 when -E and only a new image exists', async () => { - const d = await scratch(); - const actualRel = `${d.rel}/actual`; - const expectedRel = `${d.rel}/expected`; - await mkdir(join(REPO, actualRel), { recursive: true }); - await mkdir(join(REPO, expectedRel), { recursive: true }); - await cp( - join(REPO, SAMPLE_REL, 'actual/sample0.png'), - join(REPO, actualRel, 'sample0.png'), - ); - // No file in expected → sample0 appears as "new". - const { code } = await runCli([actualRel, expectedRel, `${d.rel}/diff`, '-E']); - assert.equal(code, 1); +test.serial('should exit with code 1 when extended error option set and file added', async t => { + const code = await new Promise(async resolve => { + rimraf(`${WORKSPACE}/resource/expected`, () => { + const p = spawn('./dist/cli.js', [ + `${WORKSPACE}/resource/actual`, + `${WORKSPACE}/resource/expected`, + `${WORKSPACE}/diff`, + '-E', + ]); + p.on('close', code => resolve(code)); + p.stderr.on('data', data => console.error(data)); + }); + }); + t.true(code === 1); }); -test('missing positional dirs prints error and exits non-zero', async () => { - const { code, stderr } = await runCli(['only-one-dir']); - assert.notEqual(code, 0); - assert.match(stderr, /actual.*expected.*diff/i); +test.serial('should exit with code 1 when extended error option set and file deleted', async t => { + const code = await new Promise(async resolve => { + rimraf(`${WORKSPACE}/resource/actual`, () => { + const p = spawn('./dist/cli.js', [ + `${WORKSPACE}/resource/actual`, + `${WORKSPACE}/resource/expected`, + `${WORKSPACE}/diff`, + '-E', + ]); + p.on('close', code => resolve(code)); + p.stderr.on('data', data => console.error(data)); + }); + }); + t.true(code === 1); }); -// --------------------------------------------------------------------------- -// reg.json schema compat -// --------------------------------------------------------------------------- - -test('reg.json schema matches classic shape (failed case)', async () => { - const d = await scratch(); - const jsonRel = `${d.rel}/reg.json`; - await runCli([ - `${SAMPLE_REL}/actual`, - `${SAMPLE_REL}/expected`, - `${d.rel}/diff`, - '-J', - jsonRel, - '-I', - ]); - const report = JSON.parse(await readFile(join(REPO, jsonRel), 'utf8')); - // Keys classic reg-cli guarantees (see src/report.js). - for (const k of [ - 'actualItems', - 'expectedItems', - 'diffItems', - 'failedItems', - 'newItems', - 'deletedItems', - 'passedItems', - 'actualDir', - 'expectedDir', - 'diffDir', - ]) { - assert.ok(k in report, `missing key ${k} in reg.json`); +test.serial('should generate report json to `./reg.json` when not specified dist path', async t => { + await new Promise(resolve => { + const p = spawn('./dist/cli.js', [ + `${WORKSPACE}/resource/actual`, + `${WORKSPACE}/resource/expected`, + `${WORKSPACE}/diff`, + ]); + p.on('close', code => resolve(code)); + p.stderr.on('data', data => console.error(data)); + }); + try { + fs.readFileSync(`./reg.json`); + t.pass(); + } catch (e) { + t.fail(); } - assert.deepEqual(report.failedItems, ['sample0.png']); - assert.deepEqual(report.passedItems, ['sample1.png']); - assert.deepEqual(report.newItems, []); - assert.deepEqual(report.deletedItems, []); }); -// --------------------------------------------------------------------------- -// JUnit XML byte-for-byte compat with classic reg-cli -// --------------------------------------------------------------------------- - -test('junit XML matches classic format (single failure)', async () => { - const d = await scratch(); - const junitRel = `${d.rel}/junit.xml`; - await runCli([ - `${SAMPLE_REL}/actual`, - `${SAMPLE_REL}/expected`, - `${d.rel}/diff`, - '--junit', - junitRel, - '-I', - ]); - const xml = await readFile(join(REPO, junitRel), 'utf8'); - assert.equal( - xml, - ` - - - - - - - -`, - ); +test.serial('should generate report json to `${WORKSPACE}/dist/reg.json` when dist path specified', async t => { + await new Promise(resolve => { + const p = spawn('./dist/cli.js', [ + `${WORKSPACE}/resource/actual`, + `${WORKSPACE}/resource/expected`, + `${WORKSPACE}/diff`, + `-J`, + `${WORKSPACE}/dist/reg.json`, + ]); + p.on('close', code => resolve(code)); + p.stderr.on('data', data => console.error(data)); + }); + + try { + fs.readFileSync(`${WORKSPACE}/dist/reg.json`); + t.pass(); + } catch (e) { + t.fail(); + } }); -test('junit XML: new/deleted without -E are passed testcases', async () => { - const d = await scratch(); - const actualRel = `${d.rel}/actual`; - const expectedRel = `${d.rel}/expected`; - await mkdir(join(REPO, actualRel), { recursive: true }); - await mkdir(join(REPO, expectedRel), { recursive: true }); - await cp( - join(REPO, SAMPLE_REL, 'actual/sample1.png'), - join(REPO, actualRel, 'added.png'), - ); - await cp( - join(REPO, SAMPLE_REL, 'expected/sample1.png'), - join(REPO, expectedRel, 'gone.png'), - ); - const junitRel = `${d.rel}/junit.xml`; - await runCli([actualRel, expectedRel, `${d.rel}/diff`, '--junit', junitRel]); - const xml = await readFile(join(REPO, junitRel), 'utf8'); - assert.equal( - xml, - ` - - - - - -`, - ); +test.serial('should generate report html to `${WORKSPACE}/dist/report.html` when `-R` option enabled', async t => { + await new Promise(resolve => { + const p = spawn('./dist/cli.js', [ + `${WORKSPACE}/resource/actual`, + `${WORKSPACE}/resource/expected`, + `${WORKSPACE}/diff`, + `-R`, + `${WORKSPACE}/dist/report.html`, + ]); + p.on('close', code => resolve(code)); + p.stderr.on('data', data => console.error(data)); + }); + + try { + fs.readFileSync(`${WORKSPACE}/dist/report.html`); + t.pass(); + } catch (e) { + console.error(e); + t.fail(); + } }); -test('junit XML: new/deleted with -E become entries', async () => { - const d = await scratch(); - const actualRel = `${d.rel}/actual`; - const expectedRel = `${d.rel}/expected`; - await mkdir(join(REPO, actualRel), { recursive: true }); - await mkdir(join(REPO, expectedRel), { recursive: true }); - await cp( - join(REPO, SAMPLE_REL, 'actual/sample1.png'), - join(REPO, actualRel, 'added.png'), - ); - await cp( - join(REPO, SAMPLE_REL, 'expected/sample1.png'), - join(REPO, expectedRel, 'gone.png'), - ); - const junitRel = `${d.rel}/junit.xml`; - await runCli([ - actualRel, - expectedRel, - `${d.rel}/diff`, - '-E', - '-I', - '--junit', - junitRel, - ]); - const xml = await readFile(join(REPO, junitRel), 'utf8'); - assert.equal( - xml, - ` - - - - - - - +test.serial('should generate junit report xml to `${WORKSPACE}/dist/report.xml` when `--junit` option enabled', async t => { + await new Promise(resolve => { + const p = spawn('./dist/cli.js', [ + `${WORKSPACE}/resource/actual`, + `${WORKSPACE}/resource/expected`, + `${WORKSPACE}/diff`, + `--junit`, + `${WORKSPACE}/dist/report.xml`, + ]); + p.on('close', code => resolve(code)); + p.stderr.on('data', data => console.error(data)); + }); + + try { + let report = fs.readFileSync(`${WORKSPACE}/dist/report.xml`); + t.is(report.toString(), + ` + + + + -`, - ); +`); + t.pass(); + } catch (e) { + console.error(e); + t.fail(); + } }); -// --------------------------------------------------------------------------- -// Report / -X client / -F from -// --------------------------------------------------------------------------- - -test('-R writes an HTML report file', async () => { - const d = await scratch(); - const reportRel = `${d.rel}/report.html`; - await runCli([ - `${SAMPLE_REL}/actual`, - `${SAMPLE_REL}/expected`, - `${d.rel}/diff`, - '-R', - reportRel, - '-I', - ]); - const html = await readFile(join(REPO, reportRel), 'utf8'); - assert.ok(html.length > 1000); - // ximgdiffConfig.enabled defaults to false. - assert.match(html, /ximgdiffConfig[^}]*enabled["\\]+:false/); -}); +test.serial( + 'should generate worker js and wasm files under `${WORKSPACE}/dist` when `-R -X` option enabled', + async t => { + await new Promise(resolve => { + const p = spawn('./dist/cli.js', [ + `${WORKSPACE}/resource/actual`, + `${WORKSPACE}/resource/expected`, + `${WORKSPACE}/diff`, + `-R`, + `${WORKSPACE}/dist/report.html`, + `-X`, + 'client', + ]); + p.on('close', code => resolve(code)); + p.stderr.on('data', data => console.error(data)); + }); -test('-X client flips ximgdiffConfig.enabled in the HTML report', async () => { - const d = await scratch(); - const reportRel = `${d.rel}/report.html`; - await runCli([ - `${SAMPLE_REL}/actual`, - `${SAMPLE_REL}/expected`, - `${d.rel}/diff`, - '-R', - reportRel, - '-X', - 'client', - '-I', - ]); - const html = await readFile(join(REPO, reportRel), 'utf8'); - assert.match(html, /ximgdiffConfig[^}]*enabled["\\]+:true/); + try { + t.truthy(fs.existsSync(`${WORKSPACE}/dist/worker.js`)); + t.truthy(fs.existsSync(`${WORKSPACE}/dist/detector.wasm`)); + } catch (e) { + console.error(e); + t.fail(); + } + }, +); + +test.serial('should generate fail report', async t => { + await new Promise(resolve => { + const p = spawn('./dist/cli.js', [ + `${WORKSPACE}/resource/actual`, + `${WORKSPACE}/resource/expected`, + `${WORKSPACE}/diff`, + ]); + p.on('close', code => resolve(code)); + p.stderr.on('data', data => console.error(data)); + }); + + try { + const report = replaceReportPath(JSON.parse(fs.readFileSync(`./reg.json`, 'utf8'))); + const expected = { + actualItems: [`${SAMPLE_IMAGE}`], + expectedItems: [`${SAMPLE_IMAGE}`], + diffItems: [`${SAMPLE_DIFF_IMAGE}`], + failedItems: [`${SAMPLE_IMAGE}`], + newItems: [], + deletedItems: [], + passedItems: [], + actualDir: `./${WORKSPACE}/resource/actual`, + expectedDir: `./${WORKSPACE}/resource/expected`, + diffDir: `./${WORKSPACE}/diff`, + }; + t.deepEqual(report, expected); + } catch (e) { + t.fail(); + } }); -test('-F regenerates HTML + junit from an existing reg.json without diffing', async () => { - const d = await scratch(); - const jsonRel = `${d.rel}/reg.json`; - - // Step 1: run a normal comparison to get a reg.json. - await runCli([ - `${SAMPLE_REL}/actual`, - `${SAMPLE_REL}/expected`, - `${d.rel}/diff`, - '-J', - jsonRel, - '-I', - ]); - const jsonBefore = await readFile(join(REPO, jsonRel), 'utf8'); - - // Step 2: wipe diff dir, run -F mode. It must NOT re-create any diff image. - await rm(join(REPO, d.rel, 'diff'), { recursive: true, force: true }); - const reportRel = `${d.rel}/from.html`; - const junitRel = `${d.rel}/from.xml`; - const { code } = await runCli([ - '-F', - jsonRel, - '-R', - reportRel, - '--junit', - junitRel, - '-I', - ]); - - assert.equal(code, 0); - assert.ok((await stat(join(REPO, reportRel))).size > 1000); - assert.ok((await stat(join(REPO, junitRel))).size > 0); - // -F shouldn't mutate the source reg.json… - assert.equal(await readFile(join(REPO, jsonRel), 'utf8'), jsonBefore); - // …and shouldn't have re-created diff/. - await assert.rejects(() => stat(join(REPO, d.rel, 'diff'))); +test.serial('should generate fail report with -T 0.00', async t => { + await new Promise(resolve => { + const p = spawn('./dist/cli.js', [ + `${WORKSPACE}/resource/actual`, + `${WORKSPACE}/resource/expected`, + `${WORKSPACE}/diff`, + `-T`, + '0.00', + ]); + p.on('close', code => resolve(code)); + p.stderr.on('data', data => console.error(data)); + }); + + try { + const report = replaceReportPath(JSON.parse(fs.readFileSync(`./reg.json`, 'utf8'))); + const expected = { + actualItems: [`${SAMPLE_IMAGE}`], + expectedItems: [`${SAMPLE_IMAGE}`], + diffItems: [`${SAMPLE_DIFF_IMAGE}`], + failedItems: [`${SAMPLE_IMAGE}`], + newItems: [], + deletedItems: [], + passedItems: [], + actualDir: `./${WORKSPACE}/resource/actual`, + expectedDir: `./${WORKSPACE}/resource/expected`, + diffDir: `./${WORKSPACE}/diff`, + }; + t.deepEqual(report, expected); + } catch (e) { + t.fail(); + } }); -// --------------------------------------------------------------------------- -// CLI stdout formatting (per-file + summary lines) -// --------------------------------------------------------------------------- - -test('stdout shows per-file status lines and summary', async () => { - const d = await scratch(); - const { stdout } = await runCli([ - `${SAMPLE_REL}/actual`, - `${SAMPLE_REL}/expected`, - `${d.rel}/diff`, - '-I', - ]); - assert.match(stdout, /change\s+.*sample0\.png/); - assert.match(stdout, /pass\s+.*sample1\.png/); - assert.match(stdout, /1 file\(s\) changed/); - assert.match(stdout, /1 file\(s\) passed/); +test.serial('should not generate fail report with -T 1.00', async t => { + await new Promise(resolve => { + const p = spawn('./dist/cli.js', [ + `${WORKSPACE}/resource/actual`, + `${WORKSPACE}/resource/expected`, + `${WORKSPACE}/diff`, + `-T`, + '1.00', + ]); + p.on('close', code => resolve(code)); + p.stderr.on('data', data => console.error(data)); + }); + + try { + const report = replaceReportPath(JSON.parse(fs.readFileSync(`./reg.json`, 'utf8'))); + const expected = { + actualItems: [`${SAMPLE_IMAGE}`], + expectedItems: [`${SAMPLE_IMAGE}`], + diffItems: [], + failedItems: [], + newItems: [], + deletedItems: [], + passedItems: [`${SAMPLE_IMAGE}`], + actualDir: `./${WORKSPACE}/resource/actual`, + expectedDir: `./${WORKSPACE}/resource/expected`, + diffDir: `./${WORKSPACE}/diff`, + }; + t.deepEqual(report, expected); + } catch (e) { + t.fail(); + } }); -test('-D custom diff message shows up on failure', async () => { - const d = await scratch(); - const { stdout } = await runCli([ - `${SAMPLE_REL}/actual`, - `${SAMPLE_REL}/expected`, - `${d.rel}/diff`, - '-D', - 'custom-trailer-msg', - '-I', - ]); - assert.ok(stdout.includes('custom-trailer-msg')); +test.serial('should generate fail report with -S 0', async t => { + await new Promise(resolve => { + const p = spawn('./dist/cli.js', [ + `${WORKSPACE}/resource/actual`, + `${WORKSPACE}/resource/expected`, + `${WORKSPACE}/diff`, + `-S`, + '0', + ]); + p.on('close', code => resolve(code)); + p.stderr.on('data', data => console.error(data)); + }); + + try { + const report = replaceReportPath(JSON.parse(fs.readFileSync(`./reg.json`, 'utf8'))); + const expected = { + actualItems: [`${SAMPLE_IMAGE}`], + expectedItems: [`${SAMPLE_IMAGE}`], + diffItems: [`${SAMPLE_DIFF_IMAGE}`], + failedItems: [`${SAMPLE_IMAGE}`], + newItems: [], + deletedItems: [], + passedItems: [], + actualDir: `./${WORKSPACE}/resource/actual`, + expectedDir: `./${WORKSPACE}/resource/expected`, + diffDir: `./${WORKSPACE}/diff`, + }; + t.deepEqual(report, expected); + } catch (e) { + t.fail(); + } }); -// --------------------------------------------------------------------------- -// Phase-F: --version / favicon / -X client assets / -U semantics -// --------------------------------------------------------------------------- +test.serial('should not generate fail report with -S 10000000', async t => { + await new Promise(resolve => { + const p = spawn('./dist/cli.js', [ + `${WORKSPACE}/resource/actual`, + `${WORKSPACE}/resource/expected`, + `${WORKSPACE}/diff`, + `-S`, + '100000000', + ]); + p.on('close', code => resolve(code)); + p.stderr.on('data', data => console.error(data)); + }); -test('--version prints the package.json version', async () => { - const { code, stdout } = await runCli(['--version']); - assert.equal(code, 0); - // Must look like semver-ish (at least digits + dot), not the classic - // "reg-cli-wasm" placeholder. - assert.match(stdout.trim(), /^\d+\.\d+\.\d+/); + try { + const report = replaceReportPath(JSON.parse(fs.readFileSync(`./reg.json`, 'utf8'))); + const expected = { + actualItems: [`${SAMPLE_IMAGE}`], + expectedItems: [`${SAMPLE_IMAGE}`], + diffItems: [], + failedItems: [], + newItems: [], + deletedItems: [], + passedItems: [`${SAMPLE_IMAGE}`], + actualDir: `./${WORKSPACE}/resource/actual`, + expectedDir: `./${WORKSPACE}/resource/expected`, + diffDir: `./${WORKSPACE}/diff`, + }; + t.deepEqual(report, expected); + } catch (e) { + t.fail(); + } }); -test('HTML report embeds a favicon data URL', async () => { - const d = await scratch(); - const reportRel = `${d.rel}/report.html`; - await runCli([ - `${SAMPLE_REL}/actual`, - `${SAMPLE_REL}/expected`, - `${d.rel}/diff`, - '-R', - reportRel, - '-I', - ]); - const html = await readFile(join(REPO, reportRel), 'utf8'); - // `` — check - // the placeholder was replaced with real PNG bytes. - assert.match( - html, - / { + let code = await new Promise(resolve => { + const p = spawn('./dist/cli.js', [ + `${WORKSPACE}/resource/actual`, + `${WORKSPACE}/resource/expected`, + `${WORKSPACE}/diff`, + '-U', + ]); + p.on('close', code => resolve(code)); + // p.stdout.on('data', data => console.log(data.toString())); + p.stderr.on('data', data => console.error(data)); + }); + t.true(code === 0); + const report = replaceReportPath(JSON.parse(fs.readFileSync(`./reg.json`, 'utf8'))); + const expected = { + actualItems: [`${SAMPLE_IMAGE}`], + expectedItems: [`${SAMPLE_IMAGE}`], + diffItems: [`${SAMPLE_DIFF_IMAGE}`], + failedItems: [`${SAMPLE_IMAGE}`], + newItems: [], + deletedItems: [], + passedItems: [], + actualDir: `./${WORKSPACE}/resource/actual`, + expectedDir: `./${WORKSPACE}/resource/expected`, + diffDir: `./${WORKSPACE}/diff`, + }; + t.deepEqual(report, expected); }); -test('-X client emits worker.js + detector.wasm next to report', async () => { - const d = await scratch(); - const reportRel = `${d.rel}/report.html`; - await runCli([ - `${SAMPLE_REL}/actual`, - `${SAMPLE_REL}/expected`, - `${d.rel}/diff`, - '-R', - reportRel, - '-X', - 'client', - '-I', - ]); - const reportDir = dirname(join(REPO, reportRel)); - // Classic reg-cli test asserts on the *existence* of these files - // (test/cli.test.mjs:250-275). Match that at minimum; also sanity-check - // sizes so we catch an empty-write regression. - const workerStat = await stat(join(reportDir, 'worker.js')); - const wasmStat = await stat(join(reportDir, 'detector.wasm')); - assert.ok(workerStat.size > 10_000, 'worker.js should contain the concatenated bundle'); - assert.ok(wasmStat.size > 100_000, 'detector.wasm should be the x-img-diff wasm'); +test.serial('should delete from /expected when they are missing from /actual with `-U` option', async t => { + const code = await new Promise(resolve => { + rimraf(`${WORKSPACE}/resource/actual/${SAMPLE_IMAGE}`, () => { + const p = spawn('./dist/cli.js', [ + `${WORKSPACE}/resource/actual`, + `${WORKSPACE}/resource/expected`, + `${WORKSPACE}/diff`, + '-U', + ]); + p.on('close', code => resolve(code)); + // p.stdout.on('data', data => console.log(data.toString())); + p.stderr.on('data', data => console.error(data)); + }); + }); + t.true(code === 0); + const report = replaceReportPath(JSON.parse(fs.readFileSync(`./reg.json`, 'utf8'))); + const expected = { + actualItems: [], + expectedItems: [], + diffItems: [], + failedItems: [], + newItems: [], + deletedItems: [`${SAMPLE_IMAGE}`], + passedItems: [], + actualDir: `./${WORKSPACE}/resource/actual`, + expectedDir: `./${WORKSPACE}/resource/expected`, + diffDir: `./${WORKSPACE}/diff`, + }; + t.deepEqual(report, expected); + const wasDeleted = !fs.existsSync(`${WORKSPACE}/resource/expected/${SAMPLE_IMAGE}`); + t.true(wasDeleted, `File ${SAMPLE_IMAGE} was not deleted from /expected`); }); -// --------------------------------------------------------------------------- -// Phase-H regression test: multi-segment preopen + sandboxed intermediate -// directories -// --------------------------------------------------------------------------- -// -// The bug being guarded here: `computeWasiSandbox` registers ONE preopen -// covering the common ancestor of every touched dir. When that ancestor is -// deep (e.g. `./packages/app/screenshots`), the filesystem walker inside -// `reg_core::find_images` must not try to open intermediate dirs like `.` -// or `packages/` (they're OUTSIDE the sandbox and return EBADF). Earlier -// reg_core used `glob::glob`, which walks from cwd and trips on those -// intermediate opendirs, silently returning ZERO matches — reg.json ends -// up empty, exit code 0, HTML "success". CI goes green while no images -// were actually compared. -// -// The fix in phase-H replaced `glob::glob` with a direct recursive -// `std::fs::read_dir(actual_dir)` walker that starts AT the sandboxed -// root instead of traversing to it. This test uses a deliberately deep -// scratch path to make sure we never regress to the broken glob walker. -// -// If this test ever fires, images were silently dropped. Don't mark it -// as flaky — go read `walk_images` in `crates/reg_core/src/lib.rs` and -// make sure it's still being called instead of falling back to -// pattern-based globbing. -test('multi-segment positional dirs still discover images', async () => { - // Scratch path with ≥3 segments so the preopen ends up multi-segment - // (the other tests use `.libtest-*` at the repo root which is already - // single-segment and wouldn't exercise the previously-broken path). - const leaf = `.phase-h-deep/${process.pid}-${++runId}/nested/level`; - const actualRel = `${leaf}/actual`; - const expectedRel = `${leaf}/expected`; - const diffRel = `${leaf}/diff`; - const jsonRel = `${leaf}/reg.json`; - await mkdir(join(REPO, actualRel), { recursive: true }); - await mkdir(join(REPO, expectedRel), { recursive: true }); - await cp( - join(REPO, SAMPLE_REL, 'actual/sample0.png'), - join(REPO, actualRel, 'sample0.png'), - ); - await cp( - join(REPO, SAMPLE_REL, 'expected/sample0.png'), - join(REPO, expectedRel, 'sample0.png'), - ); +test.serial('should generate success report', async t => { + const stdout = await new Promise(resolve => { + const p = spawn('./dist/cli.js', [ + `${WORKSPACE}/resource/expected`, + `${WORKSPACE}/resource/expected`, + `${WORKSPACE}/diff`, + ]); + p.on('close', code => resolve(code)); + p.stderr.on('data', data => console.error(data)); + }); try { - await runCli([actualRel, expectedRel, diffRel, '-J', jsonRel, '-I']); - const report = JSON.parse(await readFile(join(REPO, jsonRel), 'utf8')); - // The critical assertion: images ARE discovered despite the deep path. - // If this ever goes back to `[]`, someone reintroduced a walker that - // opens intermediate dirs outside the WASI preopen. - assert.deepEqual(report.actualItems, ['sample0.png']); - assert.deepEqual(report.expectedItems, ['sample0.png']); - } finally { - await rm(join(REPO, '.phase-h-deep'), { recursive: true, force: true }); + const report = replaceReportPath(JSON.parse(fs.readFileSync(`./reg.json`, 'utf8'))); + const expected = { + actualItems: [`${SAMPLE_IMAGE}`], + expectedItems: [`${SAMPLE_IMAGE}`], + diffItems: [], + failedItems: [], + newItems: [], + deletedItems: [], + passedItems: [`${SAMPLE_IMAGE}`], + actualDir: `./${WORKSPACE}/resource/expected`, + expectedDir: `./${WORKSPACE}/resource/expected`, + diffDir: `./${WORKSPACE}/diff`, + }; + t.deepEqual(report, expected); + } catch (e) { + t.fail(); } }); -test('multi-segment positional dirs: nested subdirs still discover images', async () => { - // Extra guard: images under a SUBDIRECTORY of actual_dir (not just top - // level). The walker must recurse correctly, and the returned paths - // must be relative to actual_dir (`sub/a.png`, not an absolute path). - const leaf = `.phase-h-subdir/${process.pid}-${++runId}/nested`; - const actualRel = `${leaf}/actual`; - const expectedRel = `${leaf}/expected`; - await mkdir(join(REPO, actualRel, 'sub'), { recursive: true }); - await mkdir(join(REPO, expectedRel, 'sub'), { recursive: true }); - await cp( - join(REPO, SAMPLE_REL, 'actual/sample0.png'), - join(REPO, actualRel, 'sub/a.png'), - ); - await cp( - join(REPO, SAMPLE_REL, 'expected/sample0.png'), - join(REPO, expectedRel, 'sub/a.png'), - ); +test.serial('should generate newItem report', async t => { + const stdout = await new Promise(async resolve => { + rimraf(`${WORKSPACE}/resource/expected`, () => { + const p = spawn('./dist/cli.js', [ + `${WORKSPACE}/resource/actual`, + `${WORKSPACE}/resource/expected`, + `${WORKSPACE}/diff`, + ]); + p.on('close', code => resolve(code)); + p.stderr.on('data', data => console.error(data)); + }); + }); try { - await runCli([ - actualRel, - expectedRel, - `${leaf}/diff`, - '-J', - `${leaf}/reg.json`, - '-I', - ]); - const report = JSON.parse(await readFile(join(REPO, leaf, 'reg.json'), 'utf8')); - // Path should be actual_dir-relative with forward slashes. - assert.deepEqual(report.actualItems, ['sub/a.png']); - } finally { - await rm(join(REPO, '.phase-h-subdir'), { recursive: true, force: true }); + const report = replaceReportPath(JSON.parse(fs.readFileSync(`./reg.json`, 'utf8'))); + const expected = { + actualItems: [`${SAMPLE_IMAGE}`], + expectedItems: [], + diffItems: [], + failedItems: [], + newItems: [`${SAMPLE_IMAGE}`], + deletedItems: [], + passedItems: [], + actualDir: `./${WORKSPACE}/resource/actual`, + expectedDir: `./${WORKSPACE}/resource/expected`, + diffDir: `./${WORKSPACE}/diff`, + }; + t.deepEqual(report, expected); + } catch (e) { + t.fail(); } }); -test('-U prunes deleted baselines and keeps passed files untouched', async () => { - // Seed a scenario: expected has stale.png (not in actual) → deleted. - // actual has sample0.png differing from expected → failed/changed. - // expected has sample1.png identical to actual → passed. - const d = await scratch(); - const actualRel = `${d.rel}/actual`; - const expectedRel = `${d.rel}/expected`; - await mkdir(join(REPO, actualRel), { recursive: true }); - await mkdir(join(REPO, expectedRel), { recursive: true }); - - await cp( - join(REPO, SAMPLE_REL, 'actual/sample0.png'), - join(REPO, actualRel, 'sample0.png'), - ); - await cp( - join(REPO, SAMPLE_REL, 'actual/sample1.png'), - join(REPO, actualRel, 'sample1.png'), - ); - await cp( - join(REPO, SAMPLE_REL, 'expected/sample0.png'), - join(REPO, expectedRel, 'sample0.png'), - ); - await cp( - join(REPO, SAMPLE_REL, 'actual/sample1.png'), - join(REPO, expectedRel, 'sample1.png'), - ); - // Stale baseline only in expected → should be removed by -U. - await cp( - join(REPO, SAMPLE_REL, 'actual/sample0.png'), - join(REPO, expectedRel, 'stale.png'), - ); - // Capture pre-update mtime for the passed file so we can assert we - // didn't needlessly rewrite it. - const passedBefore = await stat(join(REPO, expectedRel, 'sample1.png')); - - const { code } = await runCli([ - actualRel, - expectedRel, - `${d.rel}/diff`, - '-U', - ]); - assert.equal(code, 0); - - // stale.png: pruned. - await assert.rejects(() => stat(join(REPO, expectedRel, 'stale.png'))); - - // sample0.png: overwritten with actual/sample0.png — bytes now match. - const a0 = await readFile(join(REPO, actualRel, 'sample0.png')); - const e0 = await readFile(join(REPO, expectedRel, 'sample0.png')); - assert.equal(Buffer.compare(a0, e0), 0); - - // sample1.png (passed): bytes unchanged AND mtime unchanged. - const passedAfter = await stat(join(REPO, expectedRel, 'sample1.png')); - assert.equal( - passedAfter.mtimeMs, - passedBefore.mtimeMs, - 'passed file should not be rewritten by -U', - ); -}); +test.serial('should generate deletedItem report', async t => { + const stdout = await new Promise(async resolve => { + rimraf(`${WORKSPACE}/resource/actual`, () => { + const p = spawn('./dist/cli.js', [ + `${WORKSPACE}/resource/actual`, + `${WORKSPACE}/resource/expected`, + `${WORKSPACE}/diff`, + ]); + p.on('close', code => resolve(code)); + p.stderr.on('data', data => console.error(data)); + }); + }); -// --------------------------------------------------------------------------- -// Threshold-rate / threshold-pixel boundary parity with classic reg-cli -// (mirrors `test/cli.test.mjs` "fail with -T 0.00", "pass with -T 1.00", -// "fail with -S 0", "pass with -S 10000000" on the JS branch). -// --------------------------------------------------------------------------- - -test('-T 0.00 (strict thresholdRate) fails on any pixel difference', async () => { - const d = await scratch(); - const { code } = await runCli([ - `${SAMPLE_REL}/actual`, - `${SAMPLE_REL}/expected`, - `${d.rel}/diff`, - '-T', - '0.00', - ]); - assert.equal(code, 1); + try { + const report = replaceReportPath(JSON.parse(fs.readFileSync(`./reg.json`, 'utf8'))); + const expected = { + actualItems: [], + expectedItems: [`${SAMPLE_IMAGE}`], + diffItems: [], + failedItems: [], + newItems: [], + deletedItems: [`${SAMPLE_IMAGE}`], + passedItems: [], + actualDir: `./${WORKSPACE}/resource/actual`, + expectedDir: `./${WORKSPACE}/resource/expected`, + diffDir: `./${WORKSPACE}/diff`, + }; + t.deepEqual(report, expected); + } catch (e) { + t.fail(); + } }); -test('-T 1.00 (lax thresholdRate) accepts everything', async () => { - const d = await scratch(); - const { code } = await runCli([ - `${SAMPLE_REL}/actual`, - `${SAMPLE_REL}/expected`, - `${d.rel}/diff`, - '-T', - '1.00', - ]); - assert.equal(code, 0); -}); +test.serial('should generate report from json', async t => { + await new Promise((resolve, reject) => { + const p = spawn('./dist/cli.js', [`-F`, `${WORKSPACE}/resource/reg.json`, `-R`, `./from-json.html`]); + p.on('close', code => resolve(code)); + p.stderr.on('data', data => reject(data)); + }); -test('-S 0 (strict thresholdPixel) fails on any pixel difference', async () => { - const d = await scratch(); - const { code } = await runCli([ - `${SAMPLE_REL}/actual`, - `${SAMPLE_REL}/expected`, - `${d.rel}/diff`, - '-S', - '0', - ]); - assert.equal(code, 1); + try { + const report = fs.readFileSync(`./from-json.html`); + t.true(!!report); + } catch (e) { + console.log(e); + t.fail(); + } }); -test('-S 10000000 (lax thresholdPixel) accepts everything', async () => { - const d = await scratch(); - const { code } = await runCli([ - `${SAMPLE_REL}/actual`, - `${SAMPLE_REL}/expected`, - `${d.rel}/diff`, - '-S', - '10000000', - ]); - assert.equal(code, 0); -}); -// --------------------------------------------------------------------------- -// Identical / disjoint directory shapes (parity gaps from the JS branch's -// "success report", "new item report", "deleted item report" tests). -// --------------------------------------------------------------------------- - -test('identical dirs → passedItems populated, failedItems empty, exit 0', async () => { - const d = await scratch(); - const actualRel = `${d.rel}/actual`; - const expectedRel = `${d.rel}/expected`; - await mkdir(join(REPO, actualRel), { recursive: true }); - await mkdir(join(REPO, expectedRel), { recursive: true }); - // Same bytes on both sides → guaranteed pass. - await cp( - join(REPO, SAMPLE_REL, 'actual/sample0.png'), - join(REPO, actualRel, 'sample0.png'), - ); - await cp( - join(REPO, SAMPLE_REL, 'actual/sample0.png'), - join(REPO, expectedRel, 'sample0.png'), - ); - - const jsonRel = `${d.rel}/reg.json`; - const { code } = await runCli([ - actualRel, - expectedRel, - `${d.rel}/diff`, - '-J', - jsonRel, - ]); - assert.equal(code, 0); - const report = JSON.parse(await readFile(join(REPO, jsonRel), 'utf8')); - assert.deepEqual(report.failedItems, []); - assert.deepEqual(report.newItems, []); - assert.deepEqual(report.deletedItems, []); - assert.deepEqual(report.passedItems, ['sample0.png']); -}); +test.serial('should generate Junit report from json', async t => { + await new Promise((resolve, reject) => { + const p = spawn('./dist/cli.js', [`-F`, `${WORKSPACE}/resource/reg.json`, '--junit','./from-json.xml']); + p.on('close', code => resolve(code)); + p.stderr.on('data', data => reject(data)); + }); -test('actual empty → all expected items appear in deletedItems', async () => { - const d = await scratch(); - const actualRel = `${d.rel}/actual`; - const expectedRel = `${d.rel}/expected`; - await mkdir(join(REPO, actualRel), { recursive: true }); - await mkdir(join(REPO, expectedRel), { recursive: true }); - await cp( - join(REPO, SAMPLE_REL, 'actual/sample0.png'), - join(REPO, expectedRel, 'sample0.png'), - ); - - const jsonRel = `${d.rel}/reg.json`; - await runCli([actualRel, expectedRel, `${d.rel}/diff`, '-J', jsonRel, '-I']); - const report = JSON.parse(await readFile(join(REPO, jsonRel), 'utf8')); - assert.deepEqual(report.deletedItems, ['sample0.png']); - assert.deepEqual(report.newItems, []); + try { + const report = fs.readFileSync(`./from-json.xml`); + t.true(!!report); + t.is(report.toString(), + ` + + + + + + +`); + } catch (e) { + console.log(e); + t.fail(); + } }); -// --------------------------------------------------------------------------- -// Edge cases the JS branch never had: corrupt / non-image inputs. -// Backed by reg_core's per-image failure tolerance (see -// `crates/reg_core/src/lib.rs::per_image_failure_tests`). -// --------------------------------------------------------------------------- - -test('corrupt PNG → failedItems entry, run continues for siblings, exit 1', async () => { - const d = await scratch(); - const actualRel = `${d.rel}/actual`; - const expectedRel = `${d.rel}/expected`; - await mkdir(join(REPO, actualRel), { recursive: true }); - await mkdir(join(REPO, expectedRel), { recursive: true }); - - // One valid pair (will pass)… - await cp( - join(REPO, SAMPLE_REL, 'actual/sample0.png'), - join(REPO, actualRel, 'good.png'), - ); - await cp( - join(REPO, SAMPLE_REL, 'actual/sample0.png'), - join(REPO, expectedRel, 'good.png'), - ); - // …plus a corrupt pair the decoder will reject. - await import('node:fs/promises').then(({ writeFile }) => - Promise.all([ - writeFile(join(REPO, actualRel, 'bad.png'), 'not a png AAA'), - writeFile(join(REPO, expectedRel, 'bad.png'), 'not a png BBB'), - ]), - ); - - const jsonRel = `${d.rel}/reg.json`; - const { code, stderr } = await runCli([ - actualRel, - expectedRel, - `${d.rel}/diff`, - '-J', - jsonRel, - ]); - assert.equal(code, 1, `expected exit 1 due to bad.png; stderr: ${stderr}`); - const report = JSON.parse(await readFile(join(REPO, jsonRel), 'utf8')); - assert.ok( - report.failedItems.includes('bad.png'), - `bad.png should be in failedItems; got ${JSON.stringify(report.failedItems)}`, - ); - assert.ok( - report.passedItems.includes('good.png'), - `good.png should still pass; got ${JSON.stringify(report.passedItems)}`, - ); - assert.match( - stderr, - /bad\.png/, - 'stderr should name the failing file so users can find it', - ); -}); +test.serial('perf', async t => { + const copy = (s, d, done) => { + const r = fs.createReadStream(s); + const w = fs.createWriteStream(d); + r.pipe(w); + w.on('close', ex => { + done(); + }); + }; + for (let i = 0; i < 100; i++) { + await Promise.all([ + new Promise(resolve => + copy(`${WORKSPACE}/resource/actual/sample(cal).png`, `${WORKSPACE}/resource/actual/sample${i}.png`, resolve), + ), + new Promise(resolve => + copy( + `${WORKSPACE}/resource/expected/sample(cal).png`, + `${WORKSPACE}/resource/expected/sample${i}.png`, + resolve, + ), + ), + ]); + } -test('non-image files in actual/expected dirs are silently skipped', async () => { - const d = await scratch(); - const actualRel = `${d.rel}/actual`; - const expectedRel = `${d.rel}/expected`; - await mkdir(join(REPO, actualRel), { recursive: true }); - await mkdir(join(REPO, expectedRel), { recursive: true }); - await cp( - join(REPO, SAMPLE_REL, 'actual/sample0.png'), - join(REPO, actualRel, 'sample0.png'), - ); - await cp( - join(REPO, SAMPLE_REL, 'actual/sample0.png'), - join(REPO, expectedRel, 'sample0.png'), - ); - await import('node:fs/promises').then(({ writeFile }) => - Promise.all([ - writeFile(join(REPO, actualRel, 'README.md'), '# notes\n'), - writeFile(join(REPO, expectedRel, 'data.json'), '{}'), - ]), - ); - - const jsonRel = `${d.rel}/reg.json`; - const { code } = await runCli([ - actualRel, - expectedRel, - `${d.rel}/diff`, - '-J', - jsonRel, - ]); - assert.equal(code, 0); - const report = JSON.parse(await readFile(join(REPO, jsonRel), 'utf8')); - for (const bucket of [ - report.passedItems, - report.failedItems, - report.newItems, - report.deletedItems, - ]) { - assert.ok( - bucket.every((n) => !n.endsWith('.md') && !n.endsWith('.json')), - `non-image leaked into bucket: ${JSON.stringify(bucket)}`, + console.time('100images'); + await new Promise(resolve => { + const p = spawn( + './dist/cli.js', + [`${WORKSPACE}/resource/actual`, `${WORKSPACE}/resource/expected`, `${WORKSPACE}/diff`], + { cwd: process.cwd() }, ); - } + p.on('close', code => resolve(code)); + // p.stdout.on('data', data => console.log(data)); + p.stderr.on('data', data => { + console.error(data.toString()); + }); + }); + console.timeEnd('100images'); + t.pass(); +}); + +test.afterEach.always(async t => { + await new Promise(done => rimraf(`${WORKSPACE}${IMAGE_FILES}`, done)); + await new Promise(done => rimraf(`./reg.json`, done)); }); diff --git a/test/helpers/get-instance.js b/test/helpers/get-instance.js new file mode 100644 index 00000000..75ec1918 --- /dev/null +++ b/test/helpers/get-instance.js @@ -0,0 +1,6 @@ +import Vue from 'vue'; + +export function getInstance(Component, propsData) { + const Constructor = Vue.extend(Component) + return new Constructor({ propsData: propsData }).$mount() +} diff --git a/test/library.test.mjs b/test/library.test.mjs deleted file mode 100644 index 78d7fe54..00000000 --- a/test/library.test.mjs +++ /dev/null @@ -1,469 +0,0 @@ -// Library-level tests for the `compare()` API exported from the Wasm -// reg-cli package. -// -// Classic reg-cli exposes an `EventEmitter` with `start` / `compare` / -// `complete` / `update` / `error` events. The Wasm wrapper must honour the -// same surface so downstream consumers (reg-suit et al.) don't regress. -// -// Run with: `node --test js/test/library.test.mjs` - -import { test } from 'node:test'; -import assert from 'node:assert/strict'; -import { mkdir, readFile, rm, cp, stat } from 'node:fs/promises'; -import { dirname, join } from 'node:path'; -import { fileURLToPath } from 'node:url'; - -const HERE = dirname(fileURLToPath(import.meta.url)); -const REPO = join(HERE, '..'); -const DIST = join(REPO, 'dist', 'index.mjs'); -const SAMPLE_REL = 'sample'; -// Per-test scratch dirs are created directly at the repo root as -// `.libtest-/…`. This matters because `computeWasiSandbox` collapses -// every positional dir + report/json parent into a single common ancestor -// preopen — and in tests where everything lives inside one scratch dir -// (update-mode, new/deleted scenarios) the common ancestor BECOMES that -// scratch dir itself. `wasm32-wasip1-threads` libstd only honours the first -// path segment of a preopen name (pre-existing prestat-enumeration bug), so -// a multi-segment ancestor like `js/test/__workspace__/tXXX` silently drops -// file lookups. Keeping the scratch dir one-segment-deep at the repo root -// avoids that trap. - -// The library must be loaded with CWD at the repo root so its internal -// `join(dir(), './entry.mjs')` resolves the built worker next to it, and so -// that the relative paths we pass as `actualDir` / `expectedDir` resolve -// identically on both sides of the JS/Wasm boundary. -const origCwd = process.cwd(); - -let lib; -let runId = 0; -const scratchDirs = new Set(); -const scratch = async () => { - const rel = `.libtest-${process.pid}-${++runId}-${Math.random().toString(36).slice(2, 8)}`; - const abs = join(REPO, rel); - await mkdir(abs, { recursive: true }); - scratchDirs.add(abs); - return { abs, rel }; -}; - -test.before(async () => { - await stat(DIST).catch(() => { - throw new Error(`Build artefacts missing at ${DIST}. Run 'pnpm --filter ./js build' first.`); - }); - process.chdir(REPO); - lib = await import(DIST); -}); - -test.after(async () => { - for (const d of scratchDirs) await rm(d, { recursive: true, force: true }); - process.chdir(origCwd); -}); - -const waitForComplete = (emitter) => - new Promise((resolve, reject) => { - let startEmitted = false; - const compareEvents = []; - emitter.on('start', () => (startEmitted = true)); - emitter.on('compare', (p) => compareEvents.push(p)); - emitter.on('error', reject); - emitter.on('complete', (data) => - resolve({ data, startEmitted, compareEvents }), - ); - }); - -// --------------------------------------------------------------------------- -// EventEmitter surface -// --------------------------------------------------------------------------- - -test('compare() emits compare events LIVE, before complete', async () => { - // Live per-file events ("pass"/"fail"/"new"/"delete") are wired via the - // `__REG_CLI_EVT__` stderr channel (see `js/progress.ts`). This catches - // regressions if the channel breaks or if we accidentally go back to - // the pre-phase-G batched post-complete emission. - const d = await scratch(); - const emitter = lib.compare({ - actualDir: `${SAMPLE_REL}/actual`, - expectedDir: `${SAMPLE_REL}/expected`, - diffDir: `${d.rel}/diff`, - json: `${d.rel}/reg.json`, - }); - const received = []; - let completeSeen = false; - emitter.on('compare', (e) => { - received.push({ ...e, afterComplete: completeSeen }); - }); - emitter.on('complete', () => { - completeSeen = true; - }); - await waitForComplete(emitter); - - // Every compare event should have fired BEFORE complete. - assert.ok( - received.every((e) => e.afterComplete === false), - `expected all compare events before complete; got ${JSON.stringify(received)}`, - ); - // And we should have one event per classified image in the fixture. - const kinds = received.map((e) => e.type).sort(); - assert.deepEqual(kinds, ['fail', 'pass']); -}); - -test('compare() fires start → compare(x N) → complete in order', async () => { - const d = await scratch(); - const emitter = lib.compare({ - actualDir: `${SAMPLE_REL}/actual`, - expectedDir: `${SAMPLE_REL}/expected`, - diffDir: `${d.rel}/diff`, - json: `${d.rel}/reg.json`, - }); - const { data, startEmitted, compareEvents } = await waitForComplete(emitter); - - assert.equal(startEmitted, true, "expected 'start' event before 'complete'"); - - // We expect one 'compare' event per classified file (pass / fail / new / - // delete). With the sample fixture: one pass, one fail. - const kinds = compareEvents.map((e) => e.type).sort(); - assert.deepEqual(kinds, ['fail', 'pass']); - assert.ok(compareEvents.every((e) => typeof e.path === 'string')); - - // Complete payload uses the classic CompareOutput shape. - for (const k of [ - 'failedItems', - 'passedItems', - 'newItems', - 'deletedItems', - 'actualItems', - 'expectedItems', - 'diffItems', - 'actualDir', - 'expectedDir', - 'diffDir', - ]) { - assert.ok(k in data, `CompareOutput.${k} missing`); - } - assert.deepEqual(data.failedItems, ['sample0.png']); - assert.deepEqual(data.passedItems, ['sample1.png']); -}); - -// --------------------------------------------------------------------------- -// junit + json written by Rust via `compare()` -// --------------------------------------------------------------------------- - -test('compare({ junitReport }) writes junit XML matching classic', async () => { - const d = await scratch(); - const junitRel = `${d.rel}/junit.xml`; - const emitter = lib.compare({ - actualDir: `${SAMPLE_REL}/actual`, - expectedDir: `${SAMPLE_REL}/expected`, - diffDir: `${d.rel}/diff`, - json: `${d.rel}/reg.json`, - junitReport: junitRel, - }); - await waitForComplete(emitter); - const xml = await readFile(join(REPO, junitRel), 'utf8'); - // Exact byte compat — same bytes classic reg-cli would produce. - assert.equal( - xml, - ` - - - - - - - -`, - ); -}); - -test('compare() writes reg.json with classic-shaped keys', async () => { - const d = await scratch(); - const jsonRel = `${d.rel}/reg.json`; - const emitter = lib.compare({ - actualDir: `${SAMPLE_REL}/actual`, - expectedDir: `${SAMPLE_REL}/expected`, - diffDir: `${d.rel}/diff`, - json: jsonRel, - }); - await waitForComplete(emitter); - const report = JSON.parse(await readFile(join(REPO, jsonRel), 'utf8')); - for (const k of [ - 'actualItems', - 'expectedItems', - 'diffItems', - 'failedItems', - 'newItems', - 'deletedItems', - 'passedItems', - 'actualDir', - 'expectedDir', - 'diffDir', - ]) { - assert.ok(k in report, `reg.json missing key ${k}`); - } -}); - -// --------------------------------------------------------------------------- -// update: true copies actual → expected (JS-side fs) -// --------------------------------------------------------------------------- - -test('compare({ update: true }) copies actualDir → expectedDir and fires "update"', async () => { - const d = await scratch(); - const actualRel = `${d.rel}/actual`; - const expectedRel = `${d.rel}/expected`; - await mkdir(join(REPO, actualRel), { recursive: true }); - await mkdir(join(REPO, expectedRel), { recursive: true }); - // Seed one differing pair: copy both sample0 variants so actual ≠ expected. - await cp( - join(REPO, SAMPLE_REL, 'actual/sample0.png'), - join(REPO, actualRel, 'sample0.png'), - ); - await cp( - join(REPO, SAMPLE_REL, 'expected/sample0.png'), - join(REPO, expectedRel, 'sample0.png'), - ); - - const emitter = lib.compare({ - actualDir: actualRel, - expectedDir: expectedRel, - diffDir: `${d.rel}/diff`, - json: `${d.rel}/reg.json`, - update: true, - }); - - const updateEmitted = new Promise((resolve) => - emitter.once('update', () => resolve(true)), - ); - await waitForComplete(emitter); - assert.equal(await updateEmitted, true); - - // expected/sample0.png should now be byte-identical to actual/sample0.png. - const a = await readFile(join(REPO, actualRel, 'sample0.png')); - const e = await readFile(join(REPO, expectedRel, 'sample0.png')); - assert.equal(Buffer.compare(a, e), 0); -}); - -test('compare({ update: true }) prunes deleted baselines (classic -U semantics)', async () => { - const d = await scratch(); - const actualRel = `${d.rel}/actual`; - const expectedRel = `${d.rel}/expected`; - await mkdir(join(REPO, actualRel), { recursive: true }); - await mkdir(join(REPO, expectedRel), { recursive: true }); - // One file in both that match (passed). Plus a stale-only-in-expected - // baseline that -U should remove. - await cp( - join(REPO, SAMPLE_REL, 'actual/sample1.png'), - join(REPO, actualRel, 'sample1.png'), - ); - await cp( - join(REPO, SAMPLE_REL, 'actual/sample1.png'), - join(REPO, expectedRel, 'sample1.png'), - ); - await cp( - join(REPO, SAMPLE_REL, 'actual/sample0.png'), - join(REPO, expectedRel, 'stale.png'), - ); - - const emitter = lib.compare({ - actualDir: actualRel, - expectedDir: expectedRel, - diffDir: `${d.rel}/diff`, - json: `${d.rel}/reg.json`, - update: true, - }); - await waitForComplete(emitter); - - // stale.png pruned. - await assert.rejects(() => - stat(join(REPO, expectedRel, 'stale.png')), - ); - // sample1.png still present. - await stat(join(REPO, expectedRel, 'sample1.png')); -}); - -// --------------------------------------------------------------------------- -// additionalDetection: 'client' flips ximgdiffConfig in HTML -// --------------------------------------------------------------------------- - -test("compare({ additionalDetection: 'client' }) enables ximgdiffConfig", async () => { - const d = await scratch(); - const reportRel = `${d.rel}/report.html`; - const emitter = lib.compare({ - actualDir: `${SAMPLE_REL}/actual`, - expectedDir: `${SAMPLE_REL}/expected`, - diffDir: `${d.rel}/diff`, - json: `${d.rel}/reg.json`, - report: reportRel, - additionalDetection: 'client', - }); - await waitForComplete(emitter); - const html = await readFile(join(REPO, reportRel), 'utf8'); - assert.match(html, /ximgdiffConfig[^}]*enabled["\\]+:true/); -}); - -// --------------------------------------------------------------------------- -// Legacy `enableClientAdditionalDetection: true` alias is translated -// --------------------------------------------------------------------------- - -test('enableClientAdditionalDetection: true is translated to additionalDetection=client', async () => { - const d = await scratch(); - const reportRel = `${d.rel}/report.html`; - const emitter = lib.compare({ - actualDir: `${SAMPLE_REL}/actual`, - expectedDir: `${SAMPLE_REL}/expected`, - diffDir: `${d.rel}/diff`, - json: `${d.rel}/reg.json`, - report: reportRel, - enableClientAdditionalDetection: true, - }); - await waitForComplete(emitter); - const html = await readFile(join(REPO, reportRel), 'utf8'); - assert.match(html, /ximgdiffConfig[^}]*enabled["\\]+:true/); -}); - -// --------------------------------------------------------------------------- -// Phase-I: reg-suit drop-in compatibility -// --------------------------------------------------------------------------- -// -// reg-suit's `packages/reg-suit-core/src/processor.ts` invokes `compare(…)` -// with a specific option bag every time. Historically we didn't strip -// `ignoreChange` or `enableCliAdditionalDetection` from the library surface -// before forwarding args to the Wasm binary, so Rust clap would abort with -// "unexpected argument" the moment reg-suit tried to invoke us. This test -// mirrors reg-suit's exact call shape so that regression is caught at the -// library level. -// -// If this test fails, check whether someone removed a key from -// `CLI_ONLY_KEYS` in `js/index.ts` — those are the keys reg-suit passes -// unconditionally but our Rust CLI doesn't understand. -test('reg-suit compat: compare() accepts reg-suit-shaped options without aborting', async () => { - const d = await scratch(); - const emitter = lib.compare({ - actualDir: `${SAMPLE_REL}/actual`, - expectedDir: `${SAMPLE_REL}/expected`, - diffDir: `${d.rel}/diff`, - json: `${d.rel}/reg.json`, - report: `${d.rel}/report.html`, - // Verbatim from `reg-suit-core/processor.ts:105-116`: - update: false, - ignoreChange: true, - urlPrefix: '', - threshold: undefined, - thresholdPixel: undefined, - thresholdRate: undefined, - matchingThreshold: 0, - enableAntialias: undefined, - enableCliAdditionalDetection: true, // ximgdiff.invocationType === 'cli' - enableClientAdditionalDetection: true, // ximgdiff.invocationType !== 'none' - concurrency: 4, - }); - // The original bug: this would never fire — `error` would fire first with - // a clap "unexpected argument" abort. Now we strip those keys in - // `CLI_ONLY_KEYS` and `compare()` completes cleanly. - const { data } = await waitForComplete(emitter); - assert.deepEqual(data.failedItems, ['sample0.png']); - assert.deepEqual(data.passedItems, ['sample1.png']); -}); - -// --------------------------------------------------------------------------- -// reg-suit drop-in: full processor.ts surface -// (https://github.com/reg-viz/reg-suit/blob/5c09c8e/packages/reg-suit-core/src/processor.ts#L18) -// -// Pin every key reg-suit's `processor.ts` actually passes, every event it -// subscribes to, and every CompareOutput field it accesses. If wasm -// reg-cli ever stops being a drop-in, this test fires first. -// --------------------------------------------------------------------------- - -test('reg-suit drop-in: every event + CompareOutput field consumed by processor.ts is honoured', async () => { - const d = await scratch(); - const emitter = lib.compare({ - actualDir: `${SAMPLE_REL}/actual`, - expectedDir: `${SAMPLE_REL}/expected`, - diffDir: `${d.rel}/diff`, - json: `${d.rel}/reg.json`, - report: `${d.rel}/report.html`, - update: false, - ignoreChange: true, - urlPrefix: '', - threshold: 0, - thresholdPixel: 0, - thresholdRate: 0, - matchingThreshold: 0, - enableAntialias: false, - enableCliAdditionalDetection: true, - enableClientAdditionalDetection: false, - concurrency: 4, - }); - - let errorFired = false; - emitter.on('error', () => (errorFired = true)); - - const { data, startEmitted, compareEvents } = await waitForComplete(emitter); - - // Events processor.ts listens for: 'start', 'compare', 'complete', 'error'. - assert.equal(startEmitted, true, "'start' event must fire (processor logs spinner from it)"); - assert.equal(errorFired, false, "'error' must NOT fire when inputs are clean"); - assert.ok(compareEvents.length > 0, "'compare' events must fire per file"); - for (const ev of compareEvents) { - assert.equal(typeof ev.type, 'string', "compare event missing string `type`"); - assert.equal(typeof ev.path, 'string', "compare event missing string `path`"); - } - - // CompareOutput keys processor.ts reads (see processor.ts lines ~132-137). - for (const k of ['failedItems', 'newItems', 'deletedItems', 'passedItems']) { - assert.ok(Array.isArray(data[k]), `data.${k} must be an array, got ${typeof data[k]}`); - } -}); - -// --------------------------------------------------------------------------- -// Per-image failure tolerance at the library level (mirror of -// crates/reg_core/src/lib.rs::per_image_failure_tests::corrupt_png_…). -// -// reg-suit calls compare() and expects `complete` to fire with a normal -// CompareOutput even when individual files are unreadable — it surfaces -// those via `failedItems`. If we regress to firing `error` on the first -// bad PNG, the whole pipeline aborts. -// --------------------------------------------------------------------------- - -test('compare() does NOT fire `error` when a single image fails to decode', async () => { - const d = await scratch(); - const actualRel = `${d.rel}/actual`; - const expectedRel = `${d.rel}/expected`; - await mkdir(join(REPO, actualRel), { recursive: true }); - await mkdir(join(REPO, expectedRel), { recursive: true }); - - const { writeFile } = await import('node:fs/promises'); - // One valid pair so the run produces normal events too. - await cp( - join(REPO, SAMPLE_REL, 'actual/sample0.png'), - join(REPO, actualRel, 'good.png'), - ); - await cp( - join(REPO, SAMPLE_REL, 'actual/sample0.png'), - join(REPO, expectedRel, 'good.png'), - ); - // …and a corrupt pair the decoder will reject (different bytes so the - // diff lib doesn't byte-eq fast-path). - await writeFile(join(REPO, actualRel, 'bad.png'), 'not a png AAA'); - await writeFile(join(REPO, expectedRel, 'bad.png'), 'not a png BBB'); - - const emitter = lib.compare({ - actualDir: actualRel, - expectedDir: expectedRel, - diffDir: `${d.rel}/diff`, - json: `${d.rel}/reg.json`, - }); - - const { data, compareEvents } = await waitForComplete(emitter); - assert.ok( - data.failedItems.includes('bad.png'), - `bad.png must be in failedItems, got ${JSON.stringify(data.failedItems)}`, - ); - assert.ok( - data.passedItems.includes('good.png'), - `good.png must still pass; got ${JSON.stringify(data.passedItems)}`, - ); - // We also got a 'fail' compare-event for bad.png so live spinners update. - assert.ok( - compareEvents.some((e) => e.path === 'bad.png' && e.type === 'fail'), - `expected a fail compare-event for bad.png; got ${JSON.stringify(compareEvents)}`, - ); -}); diff --git a/test/screenshot.js b/test/screenshot.js new file mode 100644 index 00000000..2830d15d --- /dev/null +++ b/test/screenshot.js @@ -0,0 +1,40 @@ +const path = require('path'); +const finalhandler = require('finalhandler'); +const http = require('http'); +const serveStatic = require('serve-static'); + +const root = path.resolve(__dirname, '..'); +const serve = serveStatic(`${root}/sample`, { index: ['index.html'] }); + +const server = http.createServer((req, res) => { + serve(req, res, finalhandler(req, res)); +}); + +server.listen(3000); + +const mkdirp = require('make-dir'); + +const puppeteer = require('puppeteer'); + +mkdirp.sync(`${root}/screenshot/actual`); + +(async () => { + const browser = await puppeteer.launch({ + headless: true, + args: ['--no-sandbox', '--disable-setuid-sandbox'], + }); + const page = await browser.newPage(); + await page.setViewport({ + width: 1200, + height: 800, + }); + + await page.goto('http://localhost:3000', { waitUntil: 'domcontentloaded' }); + + await page.screenshot({ + path: `${root}/screenshot/actual/index.png`, + }); + + await page.close(); + process.exit(0); +})(); diff --git a/tsconfig.json b/tsconfig.json deleted file mode 100644 index e08af88f..00000000 --- a/tsconfig.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "compilerOptions": { - "target": "ESNext", - "module": "Preserve", - "moduleResolution": "Bundler", - "resolveJsonModule": true, - "esModuleInterop": false, - "allowSyntheticDefaultImports": true, - "skipLibCheck": true, - "allowJs": true, - "checkJs": true, - "strict": true, - "verbatimModuleSyntax": true, - "isolatedModules": true, - "forceConsistentCasingInFileNames": true, - "allowImportingTsExtensions": true, - "noImplicitOverride": true, - "noEmit": true - }, - "include": ["./src/**/*.ts"] - } \ No newline at end of file