feat: adding rollup bundler and a minimal groth16 prover interface (#32)

Because the SDK is meant to run both in web and nodejs I focused
bundling for those two targets. I chose Rollup.js as a bundler because
it is commonly used for bundling libraries and achives a decent tradeoff
between speed and flexibility.

The nodejs bundle will have the artifacts embedded in the package, while
the web bundle will need to have the artifacts being hosted at
/artifacts/{artifact_name}. The API for the circuits has an async
initializer that abstracts away the platform and loads the binaries.
Once initialized, the `circuits` object is used to initialize the
`ZkOps` class that uses the loaded binaries under the hood.

Observation: ~~currently, to build the bundle, the scripts assume you
have all the circuits artifacts at `src/circuits/artifacts`. The PR was
getting too big so I'll relax that assumption later.~~
EDIT: Build will now succeed without the artifacts because building them
in the ci/cd was way out of scope. I provided a script to install the
artifacts to the bundle build for local testing.

Usage example:

```typescript
import { ZkOps, circuits } from "@privacy-pool-core/sdk";

; (async () => {

    await circuits.downloadArtifacts("latest");
    const zkOps = new ZkOps(circuits);
    const input = {
        value: "1",
        label: BigInt("0"),
        nullifier: BigInt("123"),
        secret: BigInt("456"),
    };

    let r = await zkOps.proveCommitment(input);
    console.log(r)

})()
```
This commit is contained in:
bezze
2025-01-23 05:14:21 -03:00
committed by GitHub
parent 432ed66fdd
commit 7e2881573b
31 changed files with 1443 additions and 145 deletions

12
eslint.config.js Normal file
View File

@@ -0,0 +1,12 @@
import globals from "globals";
import pluginJs from "@eslint/js";
import tseslint from "typescript-eslint";
/** @type {import('eslint').Linter.Config[]} */
export default [
{files: ["**/*.{js,mjs,cjs,ts}"]},
{languageOptions: { globals: {...globals.browser, ...globals.node} }},
pluginJs.configs.recommended,
...tseslint.configs.recommended,
];

View File

@@ -14,8 +14,11 @@
"circomspect": "circomspect -L ../../node_modules/circomlib/circuits/comparators.circom -L ../../node_modules/circomlib/circuits/mux1.circom -L ../../node_modules/circomlib/circuits/poseidon.circom ./circuits/*",
"info:withdraw": "npx circomkit info withdraw",
"info:commitment": "npx circomkit info commitment",
"setup:withdraw": "npx circomkit setup withdraw",
"setup:commitment": "npx circomkit setup commitment",
"setup:ptau": "npx circomkit ptau withdraw",
"setup:all": "yarn setup:ptau && yarn setup:withdraw && yarn setup:merkle && yarn setup:commitment",
"setup:withdraw": "npx circomkit setup withdraw ptau/powersOfTau28_hez_final_16.ptau",
"setup:commitment": "npx circomkit setup commitment ptau/powersOfTau28_hez_final_16.ptau",
"setup:merkle": "npx circomkit setup merkleTree ptau/powersOfTau28_hez_final_16.ptau",
"prove:withdraw": "npx circomkit prove withdraw default",
"prove:commitment": "npx circomkit prove commitment default",
"verify:withdraw": "npx circomkit verify withdraw default",

View File

@@ -54,3 +54,6 @@ contracts/cache
# Coverage
lcov.info
# rollup
.rollup.cache

View File

@@ -0,0 +1,3 @@
import { fs } from "memfs";
const promises = fs.promises;
export default promises;

View File

@@ -0,0 +1,109 @@
import path from "path";
import commonjs from "@rollup/plugin-commonjs";
import { nodeResolve } from "@rollup/plugin-node-resolve";
import typescript from "@rollup/plugin-typescript";
import json from "@rollup/plugin-json";
import inject from "@rollup/plugin-inject";
import { dts } from "rollup-plugin-dts";
const rootOutDir = "dist"
const outDirNode = path.join(rootOutDir, "node");
const outDirBrowser = path.join(rootOutDir, "esm");
const typescriptConfig = {
tsconfig: path.resolve(`./tsconfig.build.json`),
exclude: ["**/*spec.ts"],
outputToFilesystem: false,
}
export default [
{
input: "src/index.ts",
output: [
{
dir: outDirBrowser,
format: "esm",
sourcemap: true,
entryFileNames: "[name].mjs"
},
],
plugins: [
nodeResolve({
exportConditions: ["umd"],
browser: true,
preferBuiltins: true,
}),
commonjs({ requireReturnsDefault: "auto" }),
json(),
typescript({
...typescriptConfig,
declaration: false,
noEmit: true,
}),
],
},
{
input: "src/index.ts",
output: [
{
dir: outDirNode,
format: "esm",
sourcemap: true,
entryFileNames: "[name].mjs"
},
],
plugins: [
nodeResolve({
exportConditions: ["node"],
browser: false,
preferBuiltins: true,
}),
commonjs({ requireReturnsDefault: "auto" }),
inject({
__filename: path.resolve("src/filename.helper.js"),
__dirname: path.resolve("src/dirname.helper.js")
}),
json(),
typescript({
...typescriptConfig,
declaration: false,
noEmit: true,
}),
],
},
{
input: "src/index.ts",
output: [
{
dir: path.join(rootOutDir, "types"),
sourcemap: true,
},
],
plugins: [
nodeResolve({
exportConditions: ["node"],
browser: false,
preferBuiltins: true,
}),
commonjs({ requireReturnsDefault: "auto" }),
json(),
typescript({
...typescriptConfig,
declaration: true,
declarationDir: path.join(rootOutDir, "types"),
emitDeclarationOnly: true,
}),
],
},
{
input: path.join(rootOutDir, "types", "src", "index.d.ts"),
output: [{ file: path.join(rootOutDir, "index.d.mts"), format: "esm" }],
plugins: [dts()],
}
];

View File

@@ -7,20 +7,42 @@
"license": "MIT",
"author": "Wonderland",
"type": "module",
"main": "./dist/src/index.js",
"types": "./dist/src/index.d.ts",
"main": "./dist/node/index.mjs",
"module": "./dist/esm/index.mjs",
"browser": "./dist/esm/index.mjs",
"types": {
"import": "./dist/index.d.mts"
},
"exports": {
"node": {
"types": "./dist/index.d.mts",
"default": "./dist/node/index.mjs"
},
"import": {
"types": "./dist/index.d.mts",
"default": "./dist/esm/index.mjs"
},
"browser": {
"types": "./dist/index.d.mts",
"default": "./dist/esm/index.mjs"
}
},
"directories": {
"src": "src"
},
"files": [
"dist/*",
"src",
"package.json",
"!**/*.tsbuildinfo"
],
"scripts": {
"build": "tsc -p tsconfig.build.json",
"circuits:setup": "cd ../circuits/ && yarn install && yarn compile && yarn setup:all",
"circuits:copy": "sh ./scripts/copy_circuits.sh",
"build": "yarn clean && rollup -c ./configs/rollup.config.mjs",
"build:bundle": "yarn clean && rollup -c ./configs/rollup.config.mjs && yarn circuits:setup && yarn circuits:copy",
"check-types": "tsc --noEmit -p ./tsconfig.json",
"clean": "rm -rf dist",
"clean": "rm -rf dist .rollup.cache tsconfig.build.tsbuildinfo",
"format": "prettier --check \"{src,test}/**/*.{js,ts,json}\"",
"format:fix": "prettier --write \"{src,test}/**/*.{js,ts,json}\"",
"lint": "eslint \"{src,test}/**/*.{js,ts,json}\"",
@@ -33,20 +55,35 @@
},
"devDependencies": {
"@commitlint/config-conventional": "19.4.1",
"@eslint/js": "9.18.0",
"@ianvs/prettier-plugin-sort-imports": "4.3.1",
"@rollup/plugin-alias": "5.1.1",
"@rollup/plugin-commonjs": "28.0.2",
"@rollup/plugin-inject": "5.0.5",
"@rollup/plugin-json": "6.1.0",
"@rollup/plugin-node-resolve": "16.0.0",
"@rollup/plugin-typescript": "12.1.2",
"@rollup/plugin-wasm": "6.2.2",
"@types/node": "20.3.1",
"@types/snarkjs": "0.7.9",
"@typescript-eslint/eslint-plugin": "7.18.0",
"@typescript-eslint/parser": "7.18.0",
"@vitest/coverage-v8": "2.0.5",
"commitlint": "19.4.1",
"eslint": "8.56.0",
"eslint": "9.18.0",
"eslint-config-prettier": "9.1.0",
"eslint-plugin-prettier": "5.2.1",
"globals": "15.14.0",
"husky": "9.1.5",
"lint-staged": "15.2.10",
"memfs": "4.17.0",
"prettier": "3.3.3",
"rollup": "4.30.1",
"rollup-plugin-dts": "6.1.1",
"snarkjs": "0.7.5",
"sort-package-json": "2.10.1",
"typescript": "5.5.4",
"typescript-eslint": "8.20.0",
"vitest": "2.0.5"
}
}

View File

@@ -0,0 +1,13 @@
#!/bin/sh
CIRCUITS=("merkleTree" "commitment" "withdraw")
BUILD_DIR="../circuits/build"
DEST_DIR="./dist/node/artifacts"
mkdir -p "$DEST_DIR"
for circuit in "${CIRCUITS[@]}"
do
cp "$BUILD_DIR/$circuit/groth16_pkey.zkey" "$DEST_DIR/${circuit}.zkey"
cp "$BUILD_DIR/$circuit/groth16_vkey.json" "$DEST_DIR/${circuit}.vkey"
cp "$BUILD_DIR/$circuit/${circuit}_js/${circuit}.wasm" "$DEST_DIR/"
done

View File

@@ -0,0 +1,213 @@
import { CircuitInitialization, FetchArtifact } from "../internal.js";
import {
Binaries,
CircuitArtifacts,
CircuitName,
CircuitNameString,
CircuitsInterface,
circuitToAsset,
Version,
VersionString,
} from "./circuits.interface.js";
/**
* Class representing circuit management and artifact handling.
* Implements the CircuitsInterface.
*/
export class Circuits implements CircuitsInterface {
/**
* Indicates whether the circuits have been initialized.
* @type {boolean}
* @protected
*/
protected initialized: boolean = false;
/**
* The version of the circuit artifacts being used.
* @type {VersionString}
* @protected
*/
protected version: VersionString = Version.Latest;
/**
* The binaries containing circuit artifacts such as wasm, vkey, and zkey files.
* @type {Binaries}
* @protected
*/
protected binaries!: Binaries;
/**
* The base URL for fetching circuit artifacts.
* @type {string}
* @protected
*/
protected baseUrl: string = import.meta.url;
/**
* Determines whether the environment is a browser.
* @returns {boolean} True if running in a browser environment, false otherwise.
* @protected
*/
_browser(): boolean {
return typeof window !== "undefined";
}
/**
* Initializes the circuit manager with binaries and a version.
* @param {Binaries} binaries - The binaries containing circuit artifacts.
* @param {VersionString} version - The version of the circuit artifacts.
* @protected
*/
protected _initialize(binaries: Binaries, version: VersionString) {
this.binaries = binaries;
this.version = version;
this.initialized = true;
}
/**
* Handles initialization of circuit artifacts, fetching them if necessary.
* @param {VersionString} [version=Version.latest] - The version of the circuit artifacts.
* @throws {CircuitInitialization} If an error occurs during initialization.
* @protected
* @async
*/
protected async _handleInitialization(
version: VersionString = Version.Latest,
) {
if (!this.initialized || this.binaries === undefined) {
try {
await this.initArtifacts(version);
} catch (e) {
if (e instanceof FetchArtifact) {
throw new CircuitInitialization(`${e.name}: ${e.message}`);
} else {
console.error(e);
throw new CircuitInitialization(`UnknownError: ${e}`);
}
}
}
}
/**
* Fetches a versioned artifact from a given path.
* @param {string} artifactPath - The path to the artifact.
* @param {VersionString} version - The version of the artifact.
* @returns {Promise<Uint8Array>} A promise that resolves to the artifact as a Uint8Array.
* @throws {FetchArtifact} If the artifact cannot be fetched.
* @protected
* @async
*/
async _fetchVersionedArtifact(artifactPath: string): Promise<Uint8Array> {
const artifactUrl = new URL(artifactPath, this.baseUrl);
if (this._browser()) {
const res = await fetch(artifactUrl);
if (res.status !== 200) {
throw new FetchArtifact(artifactUrl);
}
const aBuf = await res.arrayBuffer();
return new Uint8Array(aBuf);
} else {
try {
const fs = (await import("node:fs/promises")).default;
const buf = await fs.readFile(artifactUrl);
return new Uint8Array(buf);
} catch (error) {
console.error(error);
throw new FetchArtifact(artifactUrl);
}
}
}
/**
* Downloads and returns the circuit artifacts for a specific circuit.
* @param {CircuitNameString} circuitName - The name of the circuit.
* @returns {Promise<CircuitArtifacts>} A promise that resolves to the circuit artifacts.
* @protected
* @async
*/
async _downloadCircuitArtifacts(
circuitName: CircuitNameString,
): Promise<CircuitArtifacts> {
const assetName = circuitToAsset[circuitName];
const [wasm, vkey, zkey] = await Promise.all([
this._fetchVersionedArtifact(["artifacts", assetName.wasm].join("/")),
this._fetchVersionedArtifact(["artifacts", assetName.vkey].join("/")),
this._fetchVersionedArtifact(["artifacts", assetName.zkey].join("/")),
]);
return { wasm, vkey, zkey };
}
/**
* Downloads all circuit artifacts for the specified version.
* @param {VersionString} version - The version of the artifacts.
* @returns {Promise<Binaries>} A promise that resolves to the binaries containing all circuit artifacts.
* @async
*/
// prettier-ignore
async downloadArtifacts(version: VersionString): Promise<Binaries> { // eslint-disable-line @typescript-eslint/no-unused-vars
const [commitment, merkleTree, withdraw] = await Promise.all([
this._downloadCircuitArtifacts(CircuitName.Commitment),
this._downloadCircuitArtifacts(CircuitName.MerkleTree),
this._downloadCircuitArtifacts(CircuitName.Withdraw),
]);
return {
commitment,
merkleTree,
withdraw,
};
}
/**
* Initializes the circuit artifacts for the specified version.
* @param {VersionString} version - The version of the artifacts.
* @returns {Promise<void>} A promise that resolves when initialization is complete.
* @async
*/
async initArtifacts(version: VersionString): Promise<void> {
const binaries = await this.downloadArtifacts(version);
this._initialize(binaries, version);
}
/**
* Retrieves the verification key for a specified circuit.
* @param {CircuitNameString} circuitName - The name of the circuit.
* @param {VersionString} [version=Version.latest] - The version of the artifacts.
* @returns {Promise<Uint8Array>} A promise that resolves to the verification key.
* @async
*/
async getVerificationKey(
circuitName: CircuitNameString,
version: VersionString = Version.Latest,
): Promise<Uint8Array> {
await this._handleInitialization(version);
return this.binaries[circuitName]?.vkey;
}
/**
* Retrieves the proving key for a specified circuit.
* @param {CircuitNameString} circuitName - The name of the circuit.
* @param {VersionString} [version=Version.latest] - The version of the artifacts.
* @returns {Promise<Uint8Array>} A promise that resolves to the proving key.
* @async
*/
async getProvingKey(
circuitName: CircuitNameString,
version: VersionString = Version.Latest,
): Promise<Uint8Array> {
await this._handleInitialization(version);
return this.binaries[circuitName]?.zkey;
}
/**
* Retrieves the wasm file for a specified circuit.
* @param {CircuitNameString} circuitName - The name of the circuit.
* @param {VersionString} [version=Version.latest] - The version of the artifacts.
* @returns {Promise<Uint8Array>} A promise that resolves to the wasm file.
* @async
*/
async getWasm(
circuitName: CircuitNameString,
version: VersionString = Version.Latest,
): Promise<Uint8Array> {
await this._handleInitialization(version);
return this.binaries[circuitName]?.wasm;
}
}

View File

@@ -0,0 +1,162 @@
/**
* Enum representing available versions of circuit artifacts.
*/
export enum Version {
/**
* The latest version of the circuit artifacts.
*/
Latest = "latest",
}
/**
* Type representing a version string, which is a string literal derived from the Version enum.
*/
export type VersionString = `${Version}`;
/**
* Enum representing the names of available circuits.
*/
export enum CircuitName {
/**
* Circuit for commitments.
*/
Commitment = "commitment",
/**
* Circuit for Merkle tree operations.
*/
MerkleTree = "merkleTree",
/**
* Circuit for withdrawal operations.
*/
Withdraw = "withdraw",
}
/**
* Type representing a circuit name string, which is a string literal derived from the CircuitName enum.
*/
export type CircuitNameString = `${CircuitName}`;
/**
* Interface representing the artifacts associated with a circuit.
*/
export interface CircuitArtifacts {
/**
* The precompiled wasm file for the circuit.
* @type {Uint8Array}
*/
wasm: Uint8Array;
/**
* The verification key for the circuit.
* @type {Uint8Array}
*/
vkey: Uint8Array;
/**
* The proving key for the circuit.
* @type {Uint8Array}
*/
zkey: Uint8Array;
}
/**
* Type representing the mapping of circuit names to their respective asset file paths.
*/
export type Circ2Asset = {
[key in CircuitName]: {
/**
* The filename of the compiled wasm file.
*/
wasm: string;
/**
* The filename of the verification key file.
*/
vkey: string;
/**
* The filename of the proving key file.
*/
zkey: string;
};
};
/**
* Mapping of circuit names to their respective asset file paths.
* @const
*/
export const circuitToAsset: Circ2Asset = {
[CircuitName.Commitment]: {
wasm: "commitment.wasm",
vkey: "commitment.vkey",
zkey: "commitment.zkey",
},
[CircuitName.MerkleTree]: {
wasm: "merkleTree.wasm",
vkey: "merkleTree.vkey",
zkey: "merkleTree.zkey",
},
[CircuitName.Withdraw]: {
wasm: "withdraw.wasm",
vkey: "withdraw.vkey",
zkey: "withdraw.zkey",
},
} as const;
/**
* Type representing the mapping of circuit name strings to their associated circuit artifacts.
*/
export type Binaries = { [key in CircuitNameString]: CircuitArtifacts };
/**
* Interface defining the methods required for managing circuits and their artifacts.
*/
export interface CircuitsInterface {
/**
* Downloads all artifacts for the specified version of circuits.
* @param {VersionString} version - The version of the artifacts to download.
* @returns {Promise<Binaries>} A promise that resolves to the binaries containing all circuit artifacts.
* @async
*/
downloadArtifacts(version: VersionString): Promise<Binaries>;
/**
* Initializes the artifacts for the specified version of circuits.
* @param {VersionString} version - The version of the artifacts to initialize.
* @returns {Promise<void>} A promise that resolves when initialization is complete.
* @async
*/
initArtifacts(version: VersionString): Promise<void>;
/**
* Retrieves the verification key for a specified circuit.
* @param {CircuitNameString} circuitName - The name of the circuit.
* @param {VersionString} [version] - The version of the artifacts (defaults to the latest).
* @returns {Promise<Uint8Array>} A promise that resolves to the verification key.
* @async
*/
getVerificationKey(
circuitName: CircuitNameString,
version?: VersionString,
): Promise<Uint8Array>;
/**
* Retrieves the proving key for a specified circuit.
* @param {CircuitNameString} circuitName - The name of the circuit.
* @param {VersionString} [version] - The version of the artifacts (defaults to the latest).
* @returns {Promise<Uint8Array>} A promise that resolves to the proving key.
* @async
*/
getProvingKey(
circuitName: CircuitNameString,
version?: VersionString,
): Promise<Uint8Array>;
/**
* Retrieves the wasm file for a specified circuit.
* @param {CircuitNameString} circuitName - The name of the circuit.
* @param {VersionString} [version] - The version of the artifacts (defaults to the latest).
* @returns {Promise<Uint8Array>} A promise that resolves to the wasm file.
* @async
*/
getWasm(
circuitName: CircuitNameString,
version?: VersionString,
): Promise<Uint8Array>;
}

View File

@@ -0,0 +1,2 @@
export { Circuits } from "./circuits.impl.js";
export type { CircuitsInterface } from "./circuits.interface.js";

View File

@@ -0,0 +1,4 @@
import { dirname } from "path";
import __filename from "./filename.helper.js";
export default dirname(__filename);

View File

@@ -0,0 +1,6 @@
export class CircuitInitialization extends Error {
constructor(message: string) {
super(`There was an error initializing the circuits: ${message}`);
this.name = "CircuitInitialization";
}
}

View File

@@ -0,0 +1,7 @@
export class FetchArtifact extends Error {
constructor(artifact: URL) {
const message = `Encountered error while loading artifact at ${artifact.toString()}.\nIf web, make sure assets are hosted from /artifacts.\nIf Node, make sure the assets were bundled correctly at dist/node/artifacts/`;
super(message);
this.name = "FetchArtifact";
}
}

View File

@@ -1 +1,3 @@
export * from "./invalidRpcUrl.exception.js";
export * from "./fetchArtifacts.exception.js";
export * from "./circuitInitialization.exception.js";

View File

@@ -1,6 +1,6 @@
export class InvalidRpcUrl extends Error {
constructor(url: string) {
super(`${url} is invalid`);
this.name = "InvalidRpcUrl";
}
constructor(url: string) {
super(`${url} is invalid`);
this.name = "InvalidRpcUrl";
}
}

View File

@@ -3,3 +3,6 @@ export type { IBlockchainProvider, Address } from "./internal.js";
export { InvalidRpcUrl } from "./internal.js";
export { BlockchainProvider } from "./internal.js";
export { ZkOps } from "./zkops.js";
export { type CircuitsInterface, Circuits } from "./internal.js";

View File

@@ -0,0 +1,4 @@
import { fileURLToPath } from "url";
const __filename = fileURLToPath(import.meta.url);
export default __filename;

View File

@@ -2,3 +2,4 @@ export type { Address } from "viem";
export * from "./exceptions/index.js";
export * from "./interfaces/index.js";
export * from "./providers/index.js";
export * from "./circuits/index.js";

41
packages/sdk/src/zkops.ts Normal file
View File

@@ -0,0 +1,41 @@
import * as snarkjs from "snarkjs";
import { CircuitSignals, Groth16Proof, PublicSignals } from "snarkjs";
import {
CircuitName,
CircuitsInterface,
} from "./circuits/circuits.interface.js";
/**
* Class representing zero-knowledge operations.
*/
export class ZkOps {
/**
* The circuits interface providing access to circuit-related resources.
* @type {CircuitsInterface}
*/
circuits: CircuitsInterface;
/**
* Constructs a new instance of the ZkOps class.
* @param {CircuitsInterface} circuits - An interface for accessing circuit-related resources.
*/
constructor(circuits: CircuitsInterface) {
this.circuits = circuits;
}
/**
* Generates a zero-knowledge proof for a commitment circuit.
*
* @param {CircuitSignals} signals - The input signals for the circuit (e.g., commitment signals).
* @returns {Promise<{ proof: Groth16Proof; publicSignals: PublicSignals }>}
* A promise that resolves to an object containing the proof and public signals.
* @async
*/
async proveCommitment(
signals: CircuitSignals, // TODO: type commitment signals
): Promise<{ proof: Groth16Proof; publicSignals: PublicSignals }> {
const wasm = await this.circuits.getWasm(CircuitName.Commitment);
const zkey = await this.circuits.getProvingKey(CircuitName.Commitment);
return await snarkjs.groth16.fullProve(signals, wasm, zkey);
}
}

View File

@@ -0,0 +1,35 @@
import { vi } from "vitest";
import {
Binaries,
CircuitArtifacts,
VersionString,
} from "../../src/circuits/circuits.interface.js";
import { Circuits } from "../../src/circuits/index.js";
export const binariesMock: Binaries = {
withdraw: vi.fn() as any as CircuitArtifacts, // eslint-disable-line @typescript-eslint/no-explicit-any
merkleTree: vi.fn() as any as CircuitArtifacts, // eslint-disable-line @typescript-eslint/no-explicit-any
commitment: vi.fn() as any as CircuitArtifacts, // eslint-disable-line @typescript-eslint/no-explicit-any
};
export class CircuitsMock extends Circuits {
override _initialize(binaries: Binaries, version: VersionString) {
super._initialize(binaries, version);
}
override async _handleInitialization(version: VersionString) {
await super._handleInitialization(version);
}
get introspectInitialized(): boolean {
return this.initialized;
}
get introspectVersion(): string {
return this.version;
}
get introspectBinaries(): { [key: string]: CircuitArtifacts } {
return this.binaries;
}
}

View File

@@ -0,0 +1 @@
export { binariesMock, CircuitsMock } from "./circuits.mock.js";

View File

@@ -0,0 +1,53 @@
import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
import { Circuits } from "../../src/circuits/index.js";
import { FetchArtifact } from "../../src/internal.js";
import { CircuitsMock } from "../mocks/index.js";
class CircuitsMockBrowser extends CircuitsMock {
override _browser() {
return true;
}
override baseUrl: string = "http://0.0.0.0:8888";
}
describe("Circuits for browser", () => {
afterEach(() => {
vi.clearAllMocks();
});
let circuits: Circuits;
beforeEach(() => {
circuits = new CircuitsMockBrowser();
});
it("test server should 'pong' back", async () => {
expect(
await (await fetch("http://0.0.0.0:8888/ping")).text(),
).toStrictEqual("pong");
});
it("test server serves mock files", async () => {
const u8s = new Uint8Array([0, 1, 2, 3]);
expect(
await (
await fetch("http://0.0.0.0:8888/artifacts/withdraw.wasm")
).arrayBuffer(),
).toStrictEqual(u8s.buffer);
});
it("throws a FetchArtifact exception if artifact is not found at URI", async () => {
expect(async () => {
return await circuits._fetchVersionedArtifact(
"artifacts/artifact_not_here.wasm",
);
}).rejects.toThrowError(FetchArtifact);
});
it("loads artifact if correctly served", async () => {
expect(
circuits._fetchVersionedArtifact("artifacts/withdraw.wasm"),
).resolves.toBeInstanceOf(Uint8Array);
});
});

View File

@@ -0,0 +1,48 @@
import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
import { fs, vol } from "memfs";
import { Circuits } from "../../src/circuits/index.js";
import { FetchArtifact } from "../../src/internal.js";
import { CircuitsMock } from "../mocks/index.js";
vi.mock("node:fs/promises");
const ARTIFACT_DIR = "/dist/node/artifacts";
const WASM_PATH = `${ARTIFACT_DIR}/withdraw.wasm`;
class CircuitsMockNode extends CircuitsMock {
override baseUrl: string = `file://${ARTIFACT_DIR}`;
}
describe("Circuits for Node", () => {
let circuits: Circuits;
afterEach(() => {
vi.clearAllMocks();
});
beforeEach(() => {
vol.reset();
fs.mkdirSync(ARTIFACT_DIR, { recursive: true });
fs.writeFileSync(WASM_PATH, "somedata");
circuits = new CircuitsMockNode();
});
it("virtual file exists", () => {
expect(fs.existsSync(WASM_PATH)).toStrictEqual(true);
expect(fs.existsSync("non_existent_file")).toStrictEqual(false);
});
it("throws a FetchArtifact exception if artifact is not found in filesystem", async () => {
expect(async () => {
return await circuits._fetchVersionedArtifact(
"artifacts/artifact_not_here.wasm",
);
}).rejects.toThrowError(FetchArtifact);
});
it("loads artifact if it exists on filesystem", async () => {
expect(
circuits._fetchVersionedArtifact("artifacts/withdraw.wasm"),
).resolves.toBeInstanceOf(Uint8Array);
});
});

View File

@@ -0,0 +1,148 @@
import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
import { CircuitName } from "../../src/circuits/circuits.interface.js";
import { CircuitInitialization, FetchArtifact } from "../../src/internal.js";
import { CircuitsMock, binariesMock } from "../mocks/index.js";
describe("Circuits", () => {
afterEach(() => {
vi.clearAllMocks();
});
describe("Initialization", () => {
let circuits: CircuitsMock;
beforeEach(() => {
circuits = new CircuitsMock();
});
it("creates a new circuit handler, uninitialized", () => {
expect(circuits).toBeDefined();
expect(circuits.introspectVersion).toStrictEqual("latest");
expect(circuits.introspectInitialized).toStrictEqual(false);
expect(circuits.introspectBinaries).toStrictEqual(undefined);
});
});
describe("handles initialization correctly", () => {
let circuits: CircuitsMock;
const fetchArtifactError = new FetchArtifact(
new URL("http://test.com/artifact"),
);
beforeEach(() => {
circuits = new CircuitsMock();
});
it("downloads mock artifacts and initializes correctly", async () => {
const downloadArtifactsSpy = vi
.spyOn(circuits, "downloadArtifacts")
.mockResolvedValue(binariesMock);
const version = "latest";
await circuits.initArtifacts(version);
expect(circuits).toBeDefined();
expect(circuits.introspectVersion).toStrictEqual(version);
expect(circuits.introspectInitialized).toStrictEqual(true);
expect(circuits.introspectBinaries).toStrictEqual(binariesMock);
expect(downloadArtifactsSpy.mock.calls.length).toStrictEqual(1);
});
it("_initialize sets up 'binaries', 'version', 'initialized'", () => {
circuits._initialize(binariesMock, "latest");
expect(circuits.introspectVersion).toStrictEqual("latest");
expect(circuits.introspectInitialized).toStrictEqual(true);
expect(circuits.introspectBinaries).toStrictEqual(binariesMock);
});
it("_downloadCircuitArtifacts raises FetchArtifact if _fetchVersionedArtifact throws", () => {
const fetchVersionedSpy = vi
.spyOn(circuits, "_fetchVersionedArtifact")
.mockRejectedValue(fetchArtifactError);
expect(
async () =>
await circuits._downloadCircuitArtifacts(CircuitName.Withdraw),
).rejects.toThrowError(FetchArtifact);
expect(fetchVersionedSpy).toHaveBeenCalled();
});
it("downloadArtifacts raises FetchArtifact if _downloadCircuitArtifacts throws", () => {
const downloadCircuitArtifactsSpy = vi
.spyOn(circuits, "_downloadCircuitArtifacts")
.mockRejectedValue(fetchArtifactError);
expect(
async () => await circuits.downloadArtifacts("latest"),
).rejects.toThrowError(FetchArtifact);
expect(downloadCircuitArtifactsSpy).toHaveBeenCalled();
});
it("initArtifacts raises FetchArtifact", () => {
const downloadArtifactsSpy = vi
.spyOn(circuits, "downloadArtifacts")
.mockRejectedValue(fetchArtifactError);
expect(
async () => await circuits.initArtifacts("latest"),
).rejects.toThrowError(FetchArtifact);
expect(downloadArtifactsSpy).toHaveBeenCalled();
expect(downloadArtifactsSpy).toHaveBeenCalledOnce();
expect(downloadArtifactsSpy).toHaveBeenCalledWith("latest");
});
it("_handleInitialization raises CircuitInitialization error when something happens", () => {
vi.spyOn(circuits, "initArtifacts").mockRejectedValue(fetchArtifactError);
expect(
async () => await circuits._handleInitialization("latest"),
).rejects.toThrowError(CircuitInitialization);
vi.spyOn(circuits, "initArtifacts").mockRejectedValue(
new Error("DifferentError"),
);
expect(
async () => await circuits._handleInitialization("latest"),
).rejects.toThrowError(CircuitInitialization);
});
});
describe("artifact getters", () => {
let circuits: CircuitsMock;
beforeEach(() => {
circuits = new CircuitsMock();
vi.spyOn(circuits, "downloadArtifacts").mockResolvedValue(binariesMock);
});
it("returns wasm", async () => {
expect(await circuits.getWasm(CircuitName.Withdraw)).toStrictEqual(
binariesMock.withdraw.wasm,
);
expect(await circuits.getWasm(CircuitName.Commitment)).toStrictEqual(
binariesMock.commitment.wasm,
);
expect(await circuits.getWasm(CircuitName.MerkleTree)).toStrictEqual(
binariesMock.merkleTree.wasm,
);
});
it("returns proving key", async () => {
expect(await circuits.getProvingKey(CircuitName.Withdraw)).toStrictEqual(
binariesMock.withdraw.zkey,
);
expect(
await circuits.getProvingKey(CircuitName.Commitment),
).toStrictEqual(binariesMock.commitment.zkey);
expect(
await circuits.getProvingKey(CircuitName.MerkleTree),
).toStrictEqual(binariesMock.merkleTree.zkey);
});
it("returns verifying key", async () => {
expect(
await circuits.getVerificationKey(CircuitName.Withdraw),
).toStrictEqual(binariesMock.withdraw.vkey);
expect(
await circuits.getVerificationKey(CircuitName.Commitment),
).toStrictEqual(binariesMock.commitment.vkey);
expect(
await circuits.getVerificationKey(CircuitName.MerkleTree),
).toStrictEqual(binariesMock.merkleTree.vkey);
});
});
});

View File

@@ -0,0 +1,39 @@
import http from "node:http";
async function startServer(host: string, port: number): Promise<http.Server> {
return new Promise((resolve) => {
const server = http.createServer((req, res) => {
if (req.url === "/ping") {
res.writeHead(200, { "Content-Type": "text/plain" });
res.end("pong");
} else if (
req.url?.startsWith("/artifacts") &&
req.url === "/artifacts/withdraw.wasm"
) {
const data = new Uint8Array([0, 1, 2, 3]);
res.writeHead(200, { "Content-Type": "application/octet-stream" });
res.end(data);
} else {
res.writeHead(404, { "Content-Type": "text/plain" });
res.end("ErrorNotFound\n");
}
});
server.listen(port, host, () => resolve(server));
});
}
let teardownHappened = false;
let server: http.Server;
export async function setup() {
server = await startServer("0.0.0.0", 8888);
}
export async function teardown() {
if (teardownHappened) {
throw new Error("teardown called twice");
}
teardownHappened = true;
// tear it down here
server.close();
}

View File

@@ -0,0 +1,48 @@
import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
import { CircuitsMock, binariesMock } from "../mocks/index.js";
import { ZkOps } from "../../src/zkops.js";
import * as snarkjs from "snarkjs";
vi.mock("snarkjs");
describe("ZkOps", () => {
let circuits: CircuitsMock;
let zkOps: ZkOps;
beforeEach(() => {
circuits = new CircuitsMock();
zkOps = new ZkOps(circuits);
});
afterEach(() => {
vi.clearAllMocks();
});
describe("constructor", () => {
it("should set circuits", () => {
expect(zkOps.circuits).toStrictEqual(circuits);
});
});
describe("proveCommitment", () => {
it("should use Circuits binaries and delegate to snarkjs prover", async () => {
snarkjs.groth16.fullProve = vi.fn().mockResolvedValue("PROOF");
const signals = { signal_1: "1" };
const handleInitializationSpy = vi.spyOn(
circuits,
"_handleInitialization",
);
const downloadArtifactsSpy = vi
.spyOn(circuits, "downloadArtifacts")
.mockResolvedValue(binariesMock);
expect(await zkOps.proveCommitment(signals)).toStrictEqual("PROOF");
expect(downloadArtifactsSpy).toHaveBeenCalledOnce();
expect(downloadArtifactsSpy).toHaveBeenCalledWith("latest");
expect(handleInitializationSpy).toHaveBeenCalledTimes(2);
expect(snarkjs.groth16.fullProve).toHaveBeenCalledWith(
signals,
binariesMock.commitment.wasm,
binariesMock.commitment.zkey,
);
});
});
});

View File

@@ -1,8 +1,11 @@
/* Based on total-typescript no-dom library config */
/* https://github.com/total-typescript/tsconfig */
{
"extends": "./tsconfig.base.json",
"extends": "../../tsconfig.base.json",
"compilerOptions": {
/* Added DOM to be able perform some platform introspection runtime checks.
If more were needed we should consider multiple implementations or polyfills. */
"lib": ["es2022", "DOM"],
"incremental": true,
"noEmit": false
}

View File

@@ -1,5 +1,10 @@
{
"extends": "./tsconfig.base.json",
"extends": "../../tsconfig.base.json",
"include": ["**/*", ".*.js"],
"exclude": ["node_modules", "dist"]
"exclude": ["node_modules", "dist"],
"compilerOptions": {
/* Added DOM to be able perform some platform introspection runtime checks.
If more were needed we should consider multiple implementations or polyfills. */
"lib": ["es2022", "DOM"]
}
}

View File

@@ -12,6 +12,9 @@ export default defineConfig({
reporter: ["text", "json", "html"], // Coverage reporters
exclude: ["node_modules", "dist", "src/index.ts", ...configDefaults.exclude], // Files to exclude from coverage
},
globalSetup: [
'./test/unit/serve-artifacts.ts',
],
},
resolve: {
alias: {

View File

@@ -21,7 +21,6 @@
"module": "NodeNext",
"sourceMap": true,
/* If your code doesn't run in the DOM: */
"lib": ["es2022"],
"outDir": "./dist"
"lib": ["es2022"]
}
}

549
yarn.lock
View File

@@ -25,7 +25,7 @@
"@jridgewell/gen-mapping" "^0.3.5"
"@jridgewell/trace-mapping" "^0.3.24"
"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.25.9", "@babel/code-frame@^7.26.0", "@babel/code-frame@^7.26.2":
"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.24.2", "@babel/code-frame@^7.25.9", "@babel/code-frame@^7.26.0", "@babel/code-frame@^7.26.2":
version "7.26.2"
resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.26.2.tgz#4b5fab97d33338eff916235055f0ebc21e573a85"
integrity sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==
@@ -478,49 +478,87 @@
dependencies:
eslint-visitor-keys "^3.4.3"
"@eslint-community/regexpp@^4.10.0", "@eslint-community/regexpp@^4.6.1":
"@eslint-community/regexpp@^4.10.0", "@eslint-community/regexpp@^4.12.1":
version "4.12.1"
resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.12.1.tgz#cfc6cffe39df390a3841cde2abccf92eaa7ae0e0"
integrity sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==
"@eslint/eslintrc@^2.1.4":
version "2.1.4"
resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-2.1.4.tgz#388a269f0f25c1b6adc317b5a2c55714894c70ad"
integrity sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==
"@eslint/config-array@^0.19.0":
version "0.19.1"
resolved "https://registry.yarnpkg.com/@eslint/config-array/-/config-array-0.19.1.tgz#734aaea2c40be22bbb1f2a9dac687c57a6a4c984"
integrity sha512-fo6Mtm5mWyKjA/Chy1BYTdn5mGJoDNjC7C64ug20ADsRDGrA85bN3uK3MaKbeRkRuuIEAR5N33Jr1pbm411/PA==
dependencies:
"@eslint/object-schema" "^2.1.5"
debug "^4.3.1"
minimatch "^3.1.2"
"@eslint/core@^0.10.0":
version "0.10.0"
resolved "https://registry.yarnpkg.com/@eslint/core/-/core-0.10.0.tgz#23727063c21b335f752dbb3a16450f6f9cbc9091"
integrity sha512-gFHJ+xBOo4G3WRlR1e/3G8A6/KZAH6zcE/hkLRCZTi/B9avAG365QhFA8uOGzTMqgTghpn7/fSnscW++dpMSAw==
dependencies:
"@types/json-schema" "^7.0.15"
"@eslint/eslintrc@^3.2.0":
version "3.2.0"
resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-3.2.0.tgz#57470ac4e2e283a6bf76044d63281196e370542c"
integrity sha512-grOjVNN8P3hjJn/eIETF1wwd12DdnwFDoyceUJLYYdkpbwq3nLi+4fqrTAONx7XDALqlL220wC/RHSC/QTI/0w==
dependencies:
ajv "^6.12.4"
debug "^4.3.2"
espree "^9.6.0"
globals "^13.19.0"
espree "^10.0.1"
globals "^14.0.0"
ignore "^5.2.0"
import-fresh "^3.2.1"
js-yaml "^4.1.0"
minimatch "^3.1.2"
strip-json-comments "^3.1.1"
"@eslint/js@8.56.0":
version "8.56.0"
resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.56.0.tgz#ef20350fec605a7f7035a01764731b2de0f3782b"
integrity sha512-gMsVel9D7f2HLkBma9VbtzZRehRogVRfbr++f06nL2vnCGCNlzOD+/MUov/F4p8myyAHspEhVobgjpX64q5m6A==
"@eslint/js@9.18.0":
version "9.18.0"
resolved "https://registry.yarnpkg.com/@eslint/js/-/js-9.18.0.tgz#3356f85d18ed3627ab107790b53caf7e1e3d1e84"
integrity sha512-fK6L7rxcq6/z+AaQMtiFTkvbHkBLNlwyRxHpKawP0x3u9+NC6MQTnFW+AdpwC6gfHTW0051cokQgtTN2FqlxQA==
"@humanwhocodes/config-array@^0.11.13":
version "0.11.14"
resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.11.14.tgz#d78e481a039f7566ecc9660b4ea7fe6b1fec442b"
integrity sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==
"@eslint/object-schema@^2.1.5":
version "2.1.5"
resolved "https://registry.yarnpkg.com/@eslint/object-schema/-/object-schema-2.1.5.tgz#8670a8f6258a2be5b2c620ff314a1d984c23eb2e"
integrity sha512-o0bhxnL89h5Bae5T318nFoFzGy+YE5i/gGkoPAgkmTVdRKTiv3p8JHevPiPaMwoloKfEiiaHlawCqaZMqRm+XQ==
"@eslint/plugin-kit@^0.2.5":
version "0.2.5"
resolved "https://registry.yarnpkg.com/@eslint/plugin-kit/-/plugin-kit-0.2.5.tgz#ee07372035539e7847ef834e3f5e7b79f09e3a81"
integrity sha512-lB05FkqEdUg2AA0xEbUz0SnkXT1LcCTa438W4IWTUh4hdOnVbQyOJ81OrDXsJk/LSiJHubgGEFoR5EHq1NsH1A==
dependencies:
"@humanwhocodes/object-schema" "^2.0.2"
debug "^4.3.1"
minimatch "^3.0.5"
"@eslint/core" "^0.10.0"
levn "^0.4.1"
"@humanfs/core@^0.19.1":
version "0.19.1"
resolved "https://registry.yarnpkg.com/@humanfs/core/-/core-0.19.1.tgz#17c55ca7d426733fe3c561906b8173c336b40a77"
integrity sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==
"@humanfs/node@^0.16.6":
version "0.16.6"
resolved "https://registry.yarnpkg.com/@humanfs/node/-/node-0.16.6.tgz#ee2a10eaabd1131987bf0488fd9b820174cd765e"
integrity sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw==
dependencies:
"@humanfs/core" "^0.19.1"
"@humanwhocodes/retry" "^0.3.0"
"@humanwhocodes/module-importer@^1.0.1":
version "1.0.1"
resolved "https://registry.yarnpkg.com/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz#af5b2691a22b44be847b0ca81641c5fb6ad0172c"
integrity sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==
"@humanwhocodes/object-schema@^2.0.2":
version "2.0.3"
resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz#4a2868d75d6d6963e423bcf90b7fd1be343409d3"
integrity sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==
"@humanwhocodes/retry@^0.3.0":
version "0.3.1"
resolved "https://registry.yarnpkg.com/@humanwhocodes/retry/-/retry-0.3.1.tgz#c72a5c76a9fbaf3488e231b13dc52c0da7bab42a"
integrity sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==
"@humanwhocodes/retry@^0.4.1":
version "0.4.1"
resolved "https://registry.yarnpkg.com/@humanwhocodes/retry/-/retry-0.4.1.tgz#9a96ce501bc62df46c4031fbd970e3cc6b10f07b"
integrity sha512-c7hNEllBlenFTHBky65mhq8WD2kbN9Q6gk0bTk8lSBvc554jpXSkST1iePudpt7+A/AQvuHs9EMqjHDXMY1lrA==
"@ianvs/prettier-plugin-sort-imports@4.3.1":
version "4.3.1"
@@ -612,6 +650,26 @@
"@jridgewell/resolve-uri" "^3.1.0"
"@jridgewell/sourcemap-codec" "^1.4.14"
"@jsonjoy.com/base64@^1.1.1":
version "1.1.2"
resolved "https://registry.yarnpkg.com/@jsonjoy.com/base64/-/base64-1.1.2.tgz#cf8ea9dcb849b81c95f14fc0aaa151c6b54d2578"
integrity sha512-q6XAnWQDIMA3+FTiOYajoYqySkO+JSat0ytXGSuRdq9uXE7o92gzuQwQM14xaCRlBLGq3v5miDGC4vkVTn54xA==
"@jsonjoy.com/json-pack@^1.0.3":
version "1.1.1"
resolved "https://registry.yarnpkg.com/@jsonjoy.com/json-pack/-/json-pack-1.1.1.tgz#1f2db19ab1fd3304ccac259a1ef1dc6aff6df0ba"
integrity sha512-osjeBqMJ2lb/j/M8NCPjs1ylqWIcTRTycIhVB5pt6LgzgeRSb0YRZ7j9RfA8wIUrsr/medIuhVyonXRZWLyfdw==
dependencies:
"@jsonjoy.com/base64" "^1.1.1"
"@jsonjoy.com/util" "^1.1.2"
hyperdyperid "^1.2.0"
thingies "^1.20.0"
"@jsonjoy.com/util@^1.1.2", "@jsonjoy.com/util@^1.3.0":
version "1.5.0"
resolved "https://registry.yarnpkg.com/@jsonjoy.com/util/-/util-1.5.0.tgz#6008e35b9d9d8ee27bc4bfaa70c8cbf33a537b4c"
integrity sha512-ojoNsrIuPI9g6o8UxhraZQSyF2ByJanAY4cTFbc8Mf2AXEF4aQRGY1dJxyJpuyav8r9FGflEt/Ff3u5Nt6YMPA==
"@noble/curves@1.2.0":
version "1.2.0"
resolved "https://registry.yarnpkg.com/@noble/curves/-/curves-1.2.0.tgz#92d7e12e4e49b23105a2555c6984d41733d65c35"
@@ -678,7 +736,7 @@
resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b"
integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==
"@nodelib/fs.walk@^1.2.3", "@nodelib/fs.walk@^1.2.8":
"@nodelib/fs.walk@^1.2.3":
version "1.2.8"
resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a"
integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==
@@ -711,6 +769,75 @@
resolved "https://registry.yarnpkg.com/@pkgr/core/-/core-0.1.1.tgz#1ec17e2edbec25c8306d424ecfbf13c7de1aaa31"
integrity sha512-cq8o4cWH0ibXh9VGi5P20Tu9XF/0fFXl9EUinr9QfTM7a7p0oTA4iJRCQWppXR1Pg8dSM0UCItCkPwsk9qWWYA==
"@rollup/plugin-alias@5.1.1":
version "5.1.1"
resolved "https://registry.yarnpkg.com/@rollup/plugin-alias/-/plugin-alias-5.1.1.tgz#53601d88cda8b1577aa130b4a6e452283605bf26"
integrity sha512-PR9zDb+rOzkRb2VD+EuKB7UC41vU5DIwZ5qqCpk0KJudcWAyi8rvYOhS7+L5aZCspw1stTViLgN5v6FF1p5cgQ==
"@rollup/plugin-commonjs@28.0.2":
version "28.0.2"
resolved "https://registry.yarnpkg.com/@rollup/plugin-commonjs/-/plugin-commonjs-28.0.2.tgz#193d7a86470f112b56927c1d821ee45951a819ea"
integrity sha512-BEFI2EDqzl+vA1rl97IDRZ61AIwGH093d9nz8+dThxJNH8oSoB7MjWvPCX3dkaK1/RCJ/1v/R1XB15FuSs0fQw==
dependencies:
"@rollup/pluginutils" "^5.0.1"
commondir "^1.0.1"
estree-walker "^2.0.2"
fdir "^6.2.0"
is-reference "1.2.1"
magic-string "^0.30.3"
picomatch "^4.0.2"
"@rollup/plugin-inject@5.0.5":
version "5.0.5"
resolved "https://registry.yarnpkg.com/@rollup/plugin-inject/-/plugin-inject-5.0.5.tgz#616f3a73fe075765f91c5bec90176608bed277a3"
integrity sha512-2+DEJbNBoPROPkgTDNe8/1YXWcqxbN5DTjASVIOx8HS+pITXushyNiBV56RB08zuptzz8gT3YfkqriTBVycepg==
dependencies:
"@rollup/pluginutils" "^5.0.1"
estree-walker "^2.0.2"
magic-string "^0.30.3"
"@rollup/plugin-json@6.1.0":
version "6.1.0"
resolved "https://registry.yarnpkg.com/@rollup/plugin-json/-/plugin-json-6.1.0.tgz#fbe784e29682e9bb6dee28ea75a1a83702e7b805"
integrity sha512-EGI2te5ENk1coGeADSIwZ7G2Q8CJS2sF120T7jLw4xFw9n7wIOXHo+kIYRAoVpJAN+kmqZSoO3Fp4JtoNF4ReA==
dependencies:
"@rollup/pluginutils" "^5.1.0"
"@rollup/plugin-node-resolve@16.0.0":
version "16.0.0"
resolved "https://registry.yarnpkg.com/@rollup/plugin-node-resolve/-/plugin-node-resolve-16.0.0.tgz#b1a0594661f40d7b061d82136e847354ff85f211"
integrity sha512-0FPvAeVUT/zdWoO0jnb/V5BlBsUSNfkIOtFHzMO4H9MOklrmQFY6FduVHKucNb/aTFxvnGhj4MNj/T1oNdDfNg==
dependencies:
"@rollup/pluginutils" "^5.0.1"
"@types/resolve" "1.20.2"
deepmerge "^4.2.2"
is-module "^1.0.0"
resolve "^1.22.1"
"@rollup/plugin-typescript@12.1.2":
version "12.1.2"
resolved "https://registry.yarnpkg.com/@rollup/plugin-typescript/-/plugin-typescript-12.1.2.tgz#ebaeec2e7376faa889030ccd7cb485a649e63118"
integrity sha512-cdtSp154H5sv637uMr1a8OTWB0L1SWDSm1rDGiyfcGcvQ6cuTs4MDk2BVEBGysUWago4OJN4EQZqOTl/QY3Jgg==
dependencies:
"@rollup/pluginutils" "^5.1.0"
resolve "^1.22.1"
"@rollup/plugin-wasm@6.2.2":
version "6.2.2"
resolved "https://registry.yarnpkg.com/@rollup/plugin-wasm/-/plugin-wasm-6.2.2.tgz#ea75fd8cc5ddba1e30bdc22e07cdbaf8d6d160bf"
integrity sha512-gpC4R1G9Ni92ZIRTexqbhX7U+9estZrbhP+9SRb0DW9xpB9g7j34r+J2hqrcW/lRI7dJaU84MxZM0Rt82tqYPQ==
dependencies:
"@rollup/pluginutils" "^5.0.2"
"@rollup/pluginutils@^5.0.1", "@rollup/pluginutils@^5.0.2", "@rollup/pluginutils@^5.1.0":
version "5.1.4"
resolved "https://registry.yarnpkg.com/@rollup/pluginutils/-/pluginutils-5.1.4.tgz#bb94f1f9eaaac944da237767cdfee6c5b2262d4a"
integrity sha512-USm05zrsFxYLPdWWq+K3STlWiT/3ELn3RcV5hJMghpeAIhxfsUIg6mt12CBJBInWMV4VneoV7SfGv8xIwo2qNQ==
dependencies:
"@types/estree" "^1.0.0"
estree-walker "^2.0.2"
picomatch "^4.0.2"
"@rollup/rollup-android-arm-eabi@4.30.1":
version "4.30.1"
resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.30.1.tgz#14c737dc19603a096568044eadaa60395eefb809"
@@ -892,11 +1019,16 @@
dependencies:
"@types/node" "*"
"@types/estree@1.0.6", "@types/estree@^1.0.0":
"@types/estree@*", "@types/estree@1.0.6", "@types/estree@^1.0.0", "@types/estree@^1.0.6":
version "1.0.6"
resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.6.tgz#628effeeae2064a1b4e79f78e81d87b7e5fc7b50"
integrity sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==
"@types/json-schema@^7.0.15":
version "7.0.15"
resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.15.tgz#596a1747233694d50f6ad8a7869fcb6f56cf5841"
integrity sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==
"@types/mocha@^10.0.1":
version "10.0.10"
resolved "https://registry.yarnpkg.com/@types/mocha/-/mocha-10.0.10.tgz#91f62905e8d23cbd66225312f239454a23bebfa0"
@@ -921,6 +1053,16 @@
dependencies:
undici-types "~6.19.2"
"@types/resolve@1.20.2":
version "1.20.2"
resolved "https://registry.yarnpkg.com/@types/resolve/-/resolve-1.20.2.tgz#97d26e00cd4a0423b4af620abecf3e6f442b7975"
integrity sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q==
"@types/snarkjs@0.7.9":
version "0.7.9"
resolved "https://registry.yarnpkg.com/@types/snarkjs/-/snarkjs-0.7.9.tgz#7a3b99bd86009133a74dcb215a475382c772c37c"
integrity sha512-pb4Bq3GI2YQOQOG0dR/YuQs/mqcuL6k/vnz68LIPtpA2frrUL3twf69a3AUK9eUmNNeW0RIKkq6scDlC75Is+g==
"@typescript-eslint/eslint-plugin@7.18.0":
version "7.18.0"
resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.18.0.tgz#b16d3cf3ee76bf572fdf511e79c248bdec619ea3"
@@ -936,6 +1078,21 @@
natural-compare "^1.4.0"
ts-api-utils "^1.3.0"
"@typescript-eslint/eslint-plugin@8.20.0":
version "8.20.0"
resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.20.0.tgz#b47a398e0e551cb008c60190b804394e6852c863"
integrity sha512-naduuphVw5StFfqp4Gq4WhIBE2gN1GEmMUExpJYknZJdRnc+2gDzB8Z3+5+/Kv33hPQRDGzQO/0opHE72lZZ6A==
dependencies:
"@eslint-community/regexpp" "^4.10.0"
"@typescript-eslint/scope-manager" "8.20.0"
"@typescript-eslint/type-utils" "8.20.0"
"@typescript-eslint/utils" "8.20.0"
"@typescript-eslint/visitor-keys" "8.20.0"
graphemer "^1.4.0"
ignore "^5.3.1"
natural-compare "^1.4.0"
ts-api-utils "^2.0.0"
"@typescript-eslint/parser@7.18.0":
version "7.18.0"
resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-7.18.0.tgz#83928d0f1b7f4afa974098c64b5ce6f9051f96a0"
@@ -947,6 +1104,17 @@
"@typescript-eslint/visitor-keys" "7.18.0"
debug "^4.3.4"
"@typescript-eslint/parser@8.20.0":
version "8.20.0"
resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-8.20.0.tgz#5caf2230a37094dc0e671cf836b96dd39b587ced"
integrity sha512-gKXG7A5HMyjDIedBi6bUrDcun8GIjnI8qOwVLiY3rx6T/sHP/19XLJOnIq/FgQvWLHja5JN/LSE7eklNBr612g==
dependencies:
"@typescript-eslint/scope-manager" "8.20.0"
"@typescript-eslint/types" "8.20.0"
"@typescript-eslint/typescript-estree" "8.20.0"
"@typescript-eslint/visitor-keys" "8.20.0"
debug "^4.3.4"
"@typescript-eslint/scope-manager@7.18.0":
version "7.18.0"
resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-7.18.0.tgz#c928e7a9fc2c0b3ed92ab3112c614d6bd9951c83"
@@ -955,6 +1123,14 @@
"@typescript-eslint/types" "7.18.0"
"@typescript-eslint/visitor-keys" "7.18.0"
"@typescript-eslint/scope-manager@8.20.0":
version "8.20.0"
resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-8.20.0.tgz#aaf4198b509fb87a6527c02cfbfaf8901179e75c"
integrity sha512-J7+VkpeGzhOt3FeG1+SzhiMj9NzGD/M6KoGn9f4dbz3YzK9hvbhVTmLj/HiTp9DazIzJ8B4XcM80LrR9Dm1rJw==
dependencies:
"@typescript-eslint/types" "8.20.0"
"@typescript-eslint/visitor-keys" "8.20.0"
"@typescript-eslint/type-utils@7.18.0":
version "7.18.0"
resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-7.18.0.tgz#2165ffaee00b1fbbdd2d40aa85232dab6998f53b"
@@ -965,11 +1141,26 @@
debug "^4.3.4"
ts-api-utils "^1.3.0"
"@typescript-eslint/type-utils@8.20.0":
version "8.20.0"
resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-8.20.0.tgz#958171d86b213a3f32b5b16b91db267968a4ef19"
integrity sha512-bPC+j71GGvA7rVNAHAtOjbVXbLN5PkwqMvy1cwGeaxUoRQXVuKCebRoLzm+IPW/NtFFpstn1ummSIasD5t60GA==
dependencies:
"@typescript-eslint/typescript-estree" "8.20.0"
"@typescript-eslint/utils" "8.20.0"
debug "^4.3.4"
ts-api-utils "^2.0.0"
"@typescript-eslint/types@7.18.0":
version "7.18.0"
resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-7.18.0.tgz#b90a57ccdea71797ffffa0321e744f379ec838c9"
integrity sha512-iZqi+Ds1y4EDYUtlOOC+aUmxnE9xS/yCigkjA7XpTKV6nCBd3Hp/PRGGmdwnfkV2ThMyYldP1wRpm/id99spTQ==
"@typescript-eslint/types@8.20.0":
version "8.20.0"
resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-8.20.0.tgz#487de5314b5415dee075e95568b87a75a3e730cf"
integrity sha512-cqaMiY72CkP+2xZRrFt3ExRBu0WmVitN/rYPZErA80mHjHx/Svgp8yfbzkJmDoQ/whcytOPO9/IZXnOc+wigRA==
"@typescript-eslint/typescript-estree@7.18.0":
version "7.18.0"
resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-7.18.0.tgz#b5868d486c51ce8f312309ba79bdb9f331b37931"
@@ -984,6 +1175,20 @@
semver "^7.6.0"
ts-api-utils "^1.3.0"
"@typescript-eslint/typescript-estree@8.20.0":
version "8.20.0"
resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-8.20.0.tgz#658cea07b7e5981f19bce5cf1662cb70ad59f26b"
integrity sha512-Y7ncuy78bJqHI35NwzWol8E0X7XkRVS4K4P4TCyzWkOJih5NDvtoRDW4Ba9YJJoB2igm9yXDdYI/+fkiiAxPzA==
dependencies:
"@typescript-eslint/types" "8.20.0"
"@typescript-eslint/visitor-keys" "8.20.0"
debug "^4.3.4"
fast-glob "^3.3.2"
is-glob "^4.0.3"
minimatch "^9.0.4"
semver "^7.6.0"
ts-api-utils "^2.0.0"
"@typescript-eslint/utils@7.18.0":
version "7.18.0"
resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-7.18.0.tgz#bca01cde77f95fc6a8d5b0dbcbfb3d6ca4be451f"
@@ -994,6 +1199,16 @@
"@typescript-eslint/types" "7.18.0"
"@typescript-eslint/typescript-estree" "7.18.0"
"@typescript-eslint/utils@8.20.0":
version "8.20.0"
resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-8.20.0.tgz#53127ecd314b3b08836b4498b71cdb86f4ef3aa2"
integrity sha512-dq70RUw6UK9ei7vxc4KQtBRk7qkHZv447OUZ6RPQMQl71I3NZxQJX/f32Smr+iqWrB02pHKn2yAdHBb0KNrRMA==
dependencies:
"@eslint-community/eslint-utils" "^4.4.0"
"@typescript-eslint/scope-manager" "8.20.0"
"@typescript-eslint/types" "8.20.0"
"@typescript-eslint/typescript-estree" "8.20.0"
"@typescript-eslint/visitor-keys@7.18.0":
version "7.18.0"
resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-7.18.0.tgz#0564629b6124d67607378d0f0332a0495b25e7d7"
@@ -1002,10 +1217,13 @@
"@typescript-eslint/types" "7.18.0"
eslint-visitor-keys "^3.4.3"
"@ungap/structured-clone@^1.2.0":
version "1.2.1"
resolved "https://registry.yarnpkg.com/@ungap/structured-clone/-/structured-clone-1.2.1.tgz#28fa185f67daaf7b7a1a8c1d445132c5d979f8bd"
integrity sha512-fEzPV3hSkSMltkw152tJKNARhOupqbH96MZWyRjNaYZOMIzbrTeQDG+MTc6Mr2pgzFQzFxAfmhGDNP5QK++2ZA==
"@typescript-eslint/visitor-keys@8.20.0":
version "8.20.0"
resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-8.20.0.tgz#2df6e24bc69084b81f06aaaa48d198b10d382bed"
integrity sha512-v/BpkeeYAsPkKCkR8BDwcno0llhzWVqPOamQrAEMdpZav2Y9OVjd9dwJyBLJWwf335B5DmlifECIkZRJCaGaHA==
dependencies:
"@typescript-eslint/types" "8.20.0"
eslint-visitor-keys "^4.2.0"
"@vitest/coverage-v8@2.0.5":
version "2.0.5"
@@ -1177,7 +1395,7 @@ acorn-walk@^8.1.1:
dependencies:
acorn "^8.11.0"
acorn@^8.11.0, acorn@^8.4.1, acorn@^8.9.0:
acorn@^8.11.0, acorn@^8.14.0, acorn@^8.4.1:
version "8.14.0"
resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.14.0.tgz#063e2c70cac5fb4f6467f0b11152e04c682795b0"
integrity sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==
@@ -1666,6 +1884,11 @@ commitlint@19.4.1:
"@commitlint/cli" "^19.4.1"
"@commitlint/types" "^19.0.3"
commondir@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b"
integrity sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==
compare-func@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/compare-func/-/compare-func-2.0.0.tgz#fb65e75edbddfd2e568554e8b5b05fff7a51fcb3"
@@ -1740,7 +1963,7 @@ create-require@^1.1.0:
resolved "https://registry.yarnpkg.com/create-require/-/create-require-1.1.1.tgz#c1d7e8f1e5f6cfc9ff65f9cd352d37348756c333"
integrity sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==
cross-spawn@^7.0.0, cross-spawn@^7.0.2, cross-spawn@^7.0.3:
cross-spawn@^7.0.0, cross-spawn@^7.0.3, cross-spawn@^7.0.6:
version "7.0.6"
resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.6.tgz#8a58fe78f00dcd70c370451759dfbfaf03e8ee9f"
integrity sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==
@@ -1795,6 +2018,11 @@ deep-is@^0.1.3, deep-is@~0.1.3:
resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831"
integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==
deepmerge@^4.2.2:
version "4.3.1"
resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.3.1.tgz#44b5f2147cd3b00d4b56137685966f26fd25dd4a"
integrity sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==
define-data-property@^1.1.4:
version "1.1.4"
resolved "https://registry.yarnpkg.com/define-data-property/-/define-data-property-1.1.4.tgz#894dc141bb7d3060ae4366f6a0107e68fbe48c5e"
@@ -1841,13 +2069,6 @@ dir-glob@^3.0.1:
dependencies:
path-type "^4.0.0"
doctrine@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-3.0.0.tgz#addebead72a6574db783639dc87a121773973961"
integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==
dependencies:
esutils "^2.0.2"
dot-prop@^5.1.0:
version "5.3.0"
resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-5.3.0.tgz#90ccce708cd9cd82cc4dc8c3ddd9abdd55b20e88"
@@ -1994,71 +2215,72 @@ eslint-plugin-prettier@5.2.1:
prettier-linter-helpers "^1.0.0"
synckit "^0.9.1"
eslint-scope@^7.2.2:
version "7.2.2"
resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-7.2.2.tgz#deb4f92563390f32006894af62a22dba1c46423f"
integrity sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==
eslint-scope@^8.2.0:
version "8.2.0"
resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-8.2.0.tgz#377aa6f1cb5dc7592cfd0b7f892fd0cf352ce442"
integrity sha512-PHlWUfG6lvPc3yvP5A4PNyBL1W8fkDUccmI21JUu/+GKZBoH/W5u6usENXUrWFRsyoW5ACUjFGgAFQp5gUlb/A==
dependencies:
esrecurse "^4.3.0"
estraverse "^5.2.0"
eslint-visitor-keys@^3.4.1, eslint-visitor-keys@^3.4.3:
eslint-visitor-keys@^3.4.3:
version "3.4.3"
resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz#0cd72fe8550e3c2eae156a96a4dddcd1c8ac5800"
integrity sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==
eslint@8.56.0:
version "8.56.0"
resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.56.0.tgz#4957ce8da409dc0809f99ab07a1b94832ab74b15"
integrity sha512-Go19xM6T9puCOWntie1/P997aXxFsOi37JIHRWI514Hc6ZnaHGKY9xFhrU65RT6CcBEzZoGG1e6Nq+DT04ZtZQ==
eslint-visitor-keys@^4.2.0:
version "4.2.0"
resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz#687bacb2af884fcdda8a6e7d65c606f46a14cd45"
integrity sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==
eslint@9.18.0:
version "9.18.0"
resolved "https://registry.yarnpkg.com/eslint/-/eslint-9.18.0.tgz#c95b24de1183e865de19f607fda6518b54827850"
integrity sha512-+waTfRWQlSbpt3KWE+CjrPPYnbq9kfZIYUqapc0uBXyjTp8aYXZDsUH16m39Ryq3NjAVP4tjuF7KaukeqoCoaA==
dependencies:
"@eslint-community/eslint-utils" "^4.2.0"
"@eslint-community/regexpp" "^4.6.1"
"@eslint/eslintrc" "^2.1.4"
"@eslint/js" "8.56.0"
"@humanwhocodes/config-array" "^0.11.13"
"@eslint-community/regexpp" "^4.12.1"
"@eslint/config-array" "^0.19.0"
"@eslint/core" "^0.10.0"
"@eslint/eslintrc" "^3.2.0"
"@eslint/js" "9.18.0"
"@eslint/plugin-kit" "^0.2.5"
"@humanfs/node" "^0.16.6"
"@humanwhocodes/module-importer" "^1.0.1"
"@nodelib/fs.walk" "^1.2.8"
"@ungap/structured-clone" "^1.2.0"
"@humanwhocodes/retry" "^0.4.1"
"@types/estree" "^1.0.6"
"@types/json-schema" "^7.0.15"
ajv "^6.12.4"
chalk "^4.0.0"
cross-spawn "^7.0.2"
cross-spawn "^7.0.6"
debug "^4.3.2"
doctrine "^3.0.0"
escape-string-regexp "^4.0.0"
eslint-scope "^7.2.2"
eslint-visitor-keys "^3.4.3"
espree "^9.6.1"
esquery "^1.4.2"
eslint-scope "^8.2.0"
eslint-visitor-keys "^4.2.0"
espree "^10.3.0"
esquery "^1.5.0"
esutils "^2.0.2"
fast-deep-equal "^3.1.3"
file-entry-cache "^6.0.1"
file-entry-cache "^8.0.0"
find-up "^5.0.0"
glob-parent "^6.0.2"
globals "^13.19.0"
graphemer "^1.4.0"
ignore "^5.2.0"
imurmurhash "^0.1.4"
is-glob "^4.0.0"
is-path-inside "^3.0.3"
js-yaml "^4.1.0"
json-stable-stringify-without-jsonify "^1.0.1"
levn "^0.4.1"
lodash.merge "^4.6.2"
minimatch "^3.1.2"
natural-compare "^1.4.0"
optionator "^0.9.3"
strip-ansi "^6.0.1"
text-table "^0.2.0"
espree@^9.6.0, espree@^9.6.1:
version "9.6.1"
resolved "https://registry.yarnpkg.com/espree/-/espree-9.6.1.tgz#a2a17b8e434690a5432f2f8018ce71d331a48c6f"
integrity sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==
espree@^10.0.1, espree@^10.3.0:
version "10.3.0"
resolved "https://registry.yarnpkg.com/espree/-/espree-10.3.0.tgz#29267cf5b0cb98735b65e64ba07e0ed49d1eed8a"
integrity sha512-0QYC8b24HWY8zjRnDTL6RiHfDbAWn63qb4LMj1Z4b076A4une81+z03Kg7l7mn/48PUTqoLptSXez8oknU8Clg==
dependencies:
acorn "^8.9.0"
acorn "^8.14.0"
acorn-jsx "^5.3.2"
eslint-visitor-keys "^3.4.1"
eslint-visitor-keys "^4.2.0"
esprima@1.2.2:
version "1.2.2"
@@ -2070,7 +2292,7 @@ esprima@^4.0.1:
resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71"
integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==
esquery@^1.4.2:
esquery@^1.5.0:
version "1.6.0"
resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.6.0.tgz#91419234f804d852a82dceec3e16cdc22cf9dae7"
integrity sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==
@@ -2094,6 +2316,11 @@ estraverse@^5.1.0, estraverse@^5.2.0:
resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123"
integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==
estree-walker@^2.0.2:
version "2.0.2"
resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-2.0.2.tgz#52f010178c2a4c117a7757cfe942adb7d2da4cac"
integrity sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==
estree-walker@^3.0.3:
version "3.0.3"
resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-3.0.3.tgz#67c3e549ec402a487b4fc193d1953a524752340d"
@@ -2177,7 +2404,7 @@ fast-glob@3.3.2, fast-glob@^3.3.0:
merge2 "^1.3.0"
micromatch "^4.0.4"
fast-glob@^3.2.9:
fast-glob@^3.2.9, fast-glob@^3.3.2:
version "3.3.3"
resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.3.tgz#d06d585ce8dba90a16b0505c543c3ccfb3aeb818"
integrity sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==
@@ -2215,6 +2442,11 @@ fastq@^1.6.0:
dependencies:
reusify "^1.0.4"
fdir@^6.2.0:
version "6.4.2"
resolved "https://registry.yarnpkg.com/fdir/-/fdir-6.4.2.tgz#ddaa7ce1831b161bc3657bb99cb36e1622702689"
integrity sha512-KnhMXsKSPZlAhp7+IjUkRZKPb4fUyccpDrdFXbi4QL1qkmFh9kVY09Yox+n4MaOb3lHZ1Tv829C3oaaXoMYPDQ==
ffjavascript@0.2.56:
version "0.2.56"
resolved "https://registry.yarnpkg.com/ffjavascript/-/ffjavascript-0.2.56.tgz#3509f98fcbd3e44ea93cd23519071b76d6eae433"
@@ -2251,12 +2483,12 @@ ffjavascript@^0.2.48, ffjavascript@^0.2.56:
wasmcurves "0.2.2"
web-worker "1.2.0"
file-entry-cache@^6.0.1:
version "6.0.1"
resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-6.0.1.tgz#211b2dd9659cb0394b073e7323ac3c933d522027"
integrity sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==
file-entry-cache@^8.0.0:
version "8.0.0"
resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-8.0.0.tgz#7787bddcf1131bffb92636c69457bbc0edd6d81f"
integrity sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==
dependencies:
flat-cache "^3.0.4"
flat-cache "^4.0.0"
filelist@^1.0.4:
version "1.0.4"
@@ -2299,14 +2531,13 @@ findup-sync@^5.0.0:
micromatch "^4.0.4"
resolve-dir "^1.0.1"
flat-cache@^3.0.4:
version "3.2.0"
resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-3.2.0.tgz#2c0c2d5040c99b1632771a9d105725c0115363ee"
integrity sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==
flat-cache@^4.0.0:
version "4.0.1"
resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-4.0.1.tgz#0ece39fcb14ee012f4b0410bd33dd9c1f011127c"
integrity sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==
dependencies:
flatted "^3.2.9"
keyv "^4.5.3"
rimraf "^3.0.2"
keyv "^4.5.4"
flat@^5.0.2:
version "5.0.2"
@@ -2466,18 +2697,6 @@ glob@^10.4.1:
package-json-from-dist "^1.0.0"
path-scurry "^1.11.1"
glob@^7.1.3:
version "7.2.3"
resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b"
integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==
dependencies:
fs.realpath "^1.0.0"
inflight "^1.0.4"
inherits "2"
minimatch "^3.1.1"
once "^1.3.0"
path-is-absolute "^1.0.0"
glob@^8.0.3, glob@^8.1.0:
version "8.1.0"
resolved "https://registry.yarnpkg.com/glob/-/glob-8.1.0.tgz#d388f656593ef708ee3e34640fdfb99a9fd1c33e"
@@ -2516,17 +2735,20 @@ global-prefix@^1.0.1:
is-windows "^1.0.1"
which "^1.2.14"
globals@15.14.0:
version "15.14.0"
resolved "https://registry.yarnpkg.com/globals/-/globals-15.14.0.tgz#b8fd3a8941ff3b4d38f3319d433b61bbb482e73f"
integrity sha512-OkToC372DtlQeje9/zHIo5CT8lRP/FUgEOKBEhU4e0abL7J7CD24fD9ohiLN5hagG/kWCYj4K5oaxxtj2Z0Dig==
globals@^11.1.0:
version "11.12.0"
resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e"
integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==
globals@^13.19.0:
version "13.24.0"
resolved "https://registry.yarnpkg.com/globals/-/globals-13.24.0.tgz#8432a19d78ce0c1e833949c36adb345400bb1171"
integrity sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==
dependencies:
type-fest "^0.20.2"
globals@^14.0.0:
version "14.0.0"
resolved "https://registry.yarnpkg.com/globals/-/globals-14.0.0.tgz#898d7413c29babcf6bafe56fcadded858ada724e"
integrity sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==
globby@^11.1.0:
version "11.1.0"
@@ -2638,6 +2860,11 @@ husky@>=9:
resolved "https://registry.yarnpkg.com/husky/-/husky-9.1.7.tgz#d46a38035d101b46a70456a850ff4201344c0b2d"
integrity sha512-5gs5ytaNjBrh5Ow3zrvdUUY+0VxIuWVL4i9irt6friV+BqdCfmV11CQTWMiBYWHbXhco+J1kHfTOUkePhCDvMA==
hyperdyperid@^1.2.0:
version "1.2.0"
resolved "https://registry.yarnpkg.com/hyperdyperid/-/hyperdyperid-1.2.0.tgz#59668d323ada92228d2a869d3e474d5a33b69e6b"
integrity sha512-Y93lCzHYgGWdrJ66yIktxiaGULYc6oGiABxhcO5AufBeOyoIdZF7bIfLaOrbM0iGIOXQQgxxRrFEnb+Y6w1n4A==
ieee754@^1.2.1:
version "1.2.1"
resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352"
@@ -2714,6 +2941,13 @@ is-callable@^1.1.3:
resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.7.tgz#3bc2a85ea742d9e36205dcacdd72ca1fdc51b055"
integrity sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==
is-core-module@^2.16.0:
version "2.16.1"
resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.16.1.tgz#2a98801a849f43e2add644fbb6bc6229b19a4ef4"
integrity sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==
dependencies:
hasown "^2.0.2"
is-extglob@^2.1.1:
version "2.1.1"
resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2"
@@ -2750,6 +2984,11 @@ is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1:
dependencies:
is-extglob "^2.1.1"
is-module@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/is-module/-/is-module-1.0.0.tgz#3258fb69f78c14d5b815d664336b4cffb6441591"
integrity sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==
is-number@^7.0.0:
version "7.0.0"
resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b"
@@ -2760,11 +2999,6 @@ is-obj@^2.0.0:
resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-2.0.0.tgz#473fb05d973705e3fd9620545018ca8e22ef4982"
integrity sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==
is-path-inside@^3.0.3:
version "3.0.3"
resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-3.0.3.tgz#d231362e53a07ff2b0e0ea7fed049161ffd16283"
integrity sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==
is-plain-obj@^2.1.0:
version "2.1.0"
resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-2.1.0.tgz#45e42e37fccf1f40da8e5f76ee21515840c09287"
@@ -2775,6 +3009,13 @@ is-plain-obj@^4.1.0:
resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-4.1.0.tgz#d65025edec3657ce032fd7db63c97883eaed71f0"
integrity sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==
is-reference@1.2.1:
version "1.2.1"
resolved "https://registry.yarnpkg.com/is-reference/-/is-reference-1.2.1.tgz#8b2dac0b371f4bc994fdeaba9eb542d03002d0b7"
integrity sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ==
dependencies:
"@types/estree" "*"
is-stream@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-3.0.0.tgz#e6bfd7aa6bef69f4f472ce9bb681e3e57b4319ac"
@@ -2954,7 +3195,7 @@ jsonpath@^1.1.1:
static-eval "2.0.2"
underscore "1.12.1"
keyv@^4.5.3:
keyv@^4.5.4:
version "4.5.4"
resolved "https://registry.yarnpkg.com/keyv/-/keyv-4.5.4.tgz#a879a99e29452f942439f2a405e3af8b31d4de93"
integrity sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==
@@ -3191,7 +3432,7 @@ maci-domainobjs@^2.5.0:
dependencies:
maci-crypto "^2.5.0"
magic-string@^0.30.10:
magic-string@^0.30.10, magic-string@^0.30.3:
version "0.30.17"
resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.30.17.tgz#450a449673d2460e5bbcfba9a61916a1714c7453"
integrity sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==
@@ -3224,6 +3465,16 @@ math-intrinsics@^1.0.0:
resolved "https://registry.yarnpkg.com/math-intrinsics/-/math-intrinsics-1.0.0.tgz#4e04bf87c85aa51e90d078dac2252b4eb5260817"
integrity sha512-4MqMiKP90ybymYvsut0CH2g4XWbfLtmlCkXmtmdcDCxNB+mQcu1w/1+L/VD7vi/PSv7X2JYV7SCcR+jiPXnQtA==
memfs@4.17.0:
version "4.17.0"
resolved "https://registry.yarnpkg.com/memfs/-/memfs-4.17.0.tgz#a3c4b5490b9b1e7df5d433adc163e08208ce7ca2"
integrity sha512-4eirfZ7thblFmqFjywlTmuWVSvccHAJbn1r8qQLzmTO11qcqpohOjmY2mFce6x7x7WtskzRqApPD0hv+Oa74jg==
dependencies:
"@jsonjoy.com/json-pack" "^1.0.3"
"@jsonjoy.com/util" "^1.3.0"
tree-dump "^1.0.1"
tslib "^2.0.0"
memorystream@^0.3.1:
version "0.3.1"
resolved "https://registry.yarnpkg.com/memorystream/-/memorystream-0.3.1.tgz#86d7090b30ce455d63fbae12dda51a47ddcaf9b2"
@@ -3274,7 +3525,7 @@ mimic-function@^5.0.0:
resolved "https://registry.yarnpkg.com/mimic-function/-/mimic-function-5.0.1.tgz#acbe2b3349f99b9deaca7fb70e48b83e94e67076"
integrity sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==
minimatch@^3.0.5, minimatch@^3.1.1, minimatch@^3.1.2:
minimatch@^3.1.2:
version "3.1.2"
resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b"
integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==
@@ -3496,11 +3747,6 @@ path-exists@^5.0.0:
resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-5.0.0.tgz#a6aad9489200b21fab31e49cf09277e5116fb9e7"
integrity sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==
path-is-absolute@^1.0.0:
version "1.0.1"
resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f"
integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==
path-key@^3.1.0:
version "3.1.1"
resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375"
@@ -3511,6 +3757,11 @@ path-key@^4.0.0:
resolved "https://registry.yarnpkg.com/path-key/-/path-key-4.0.0.tgz#295588dc3aee64154f877adb9d780b81c554bf18"
integrity sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==
path-parse@^1.0.7:
version "1.0.7"
resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735"
integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==
path-scurry@^1.11.1:
version "1.11.1"
resolved "https://registry.yarnpkg.com/path-scurry/-/path-scurry-1.11.1.tgz#7960a668888594a0720b12a911d1a742ab9f11d2"
@@ -3549,6 +3800,11 @@ picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.3.1:
resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42"
integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==
picomatch@^4.0.2:
version "4.0.2"
resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-4.0.2.tgz#77c742931e8f3b8820946c76cd0c1f13730d1dab"
integrity sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==
pidtree@~0.6.0:
version "0.6.0"
resolved "https://registry.yarnpkg.com/pidtree/-/pidtree-0.6.0.tgz#90ad7b6d42d5841e69e0a2419ef38f8883aa057c"
@@ -3687,6 +3943,15 @@ resolve-from@^5.0.0:
resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-5.0.0.tgz#c35225843df8f776df21c57557bc087e9dfdfc69"
integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==
resolve@^1.22.1:
version "1.22.10"
resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.10.tgz#b663e83ffb09bbf2386944736baae803029b8b39"
integrity sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==
dependencies:
is-core-module "^2.16.0"
path-parse "^1.0.7"
supports-preserve-symlinks-flag "^1.0.0"
restore-cursor@^5.0.0:
version "5.1.0"
resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-5.1.0.tgz#0766d95699efacb14150993f55baf0953ea1ebe7"
@@ -3705,14 +3970,16 @@ rfdc@^1.4.1:
resolved "https://registry.yarnpkg.com/rfdc/-/rfdc-1.4.1.tgz#778f76c4fb731d93414e8f925fbecf64cce7f6ca"
integrity sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==
rimraf@^3.0.2:
version "3.0.2"
resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a"
integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==
rollup-plugin-dts@6.1.1:
version "6.1.1"
resolved "https://registry.yarnpkg.com/rollup-plugin-dts/-/rollup-plugin-dts-6.1.1.tgz#46b33f4d1d7f4e66f1171ced9b282ac11a15a254"
integrity sha512-aSHRcJ6KG2IHIioYlvAOcEq6U99sVtqDDKVhnwt70rW6tsz3tv5OSjEiWcgzfsHdLyGXZ/3b/7b/+Za3Y6r1XA==
dependencies:
glob "^7.1.3"
magic-string "^0.30.10"
optionalDependencies:
"@babel/code-frame" "^7.24.2"
rollup@^4.20.0:
rollup@4.30.1, rollup@^4.20.0:
version "4.30.1"
resolved "https://registry.yarnpkg.com/rollup/-/rollup-4.30.1.tgz#d5c3d066055259366cdc3eb6f1d051c5d6afaf74"
integrity sha512-mlJ4glW020fPuLi7DkM/lN97mYEZGWeqBnrljzN0gs7GLctqX3lNWxKQ7Gl712UAX+6fog/L3jh4gb7R6aVi3w==
@@ -3859,7 +4126,7 @@ snarkjs@0.5.0:
logplease "^1.2.15"
r1csfile "0.0.41"
snarkjs@^0.7.5:
snarkjs@0.7.5, snarkjs@^0.7.5:
version "0.7.5"
resolved "https://registry.yarnpkg.com/snarkjs/-/snarkjs-0.7.5.tgz#334d83b61468bdffbbf922b20734ca47be50b8ab"
integrity sha512-h+3c4rXZKLhLuHk4LHydZCk/h5GcNvk5GjVKRRkHmfb6Ntf8gHOA9zea3g656iclRuhqQ3iKDWFgiD9ypLrKiA==
@@ -4098,6 +4365,11 @@ supports-color@^8.1.1:
dependencies:
has-flag "^4.0.0"
supports-preserve-symlinks-flag@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09"
integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==
synckit@^0.9.1:
version "0.9.2"
resolved "https://registry.yarnpkg.com/synckit/-/synckit-0.9.2.tgz#a3a935eca7922d48b9e7d6c61822ee6c3ae4ec62"
@@ -4136,6 +4408,11 @@ text-table@^0.2.0:
resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4"
integrity sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==
thingies@^1.20.0:
version "1.21.0"
resolved "https://registry.yarnpkg.com/thingies/-/thingies-1.21.0.tgz#e80fbe58fd6fdaaab8fad9b67bd0a5c943c445c1"
integrity sha512-hsqsJsFMsV+aD4s3CWKk85ep/3I9XzYV/IXaSouJMYIoDlgyi11cBhsqYe9/geRfB0YIikBQg6raRaM+nIMP9g==
"through@>=2.2.7 <3":
version "2.3.8"
resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5"
@@ -4192,6 +4469,11 @@ to-regex-range@^5.0.1:
dependencies:
is-number "^7.0.0"
tree-dump@^1.0.1:
version "1.0.2"
resolved "https://registry.yarnpkg.com/tree-dump/-/tree-dump-1.0.2.tgz#c460d5921caeb197bde71d0e9a7b479848c5b8ac"
integrity sha512-dpev9ABuLWdEubk+cIaI9cHwRNNDjkBBLXTwI4UCUFdQ5xXKqNXoK4FEciw/vxf+NQ7Cb7sGUyeUtORvHIdRXQ==
tryer@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/tryer/-/tryer-1.0.1.tgz#f2c85406800b9b0f74c9f7465b81eaad241252f8"
@@ -4202,6 +4484,11 @@ ts-api-utils@^1.3.0:
resolved "https://registry.yarnpkg.com/ts-api-utils/-/ts-api-utils-1.4.3.tgz#bfc2215fe6528fecab2b0fba570a2e8a4263b064"
integrity sha512-i3eMG77UTMD0hZhgRS562pv83RC6ukSAC2GMNWc+9dieh/+jDM5u5YG+NHX6VNDRHQcHwmsTHctP9LhbC3WxVw==
ts-api-utils@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/ts-api-utils/-/ts-api-utils-2.0.0.tgz#b9d7d5f7ec9f736f4d0f09758b8607979044a900"
integrity sha512-xCt/TOAc+EOHS1XPnijD3/yzpH6qg2xppZO1YDqGoVsNXfQfzHpOdNuXwrwOU8u4ITXJyDCTyt8w5g1sZv9ynQ==
ts-node@^10.9.1:
version "10.9.2"
resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-10.9.2.tgz#70f021c9e185bccdca820e26dc413805c101c71f"
@@ -4226,7 +4513,7 @@ tslib@2.7.0:
resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.7.0.tgz#d9b40c5c40ab59e8738f297df3087bf1a2690c01"
integrity sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA==
tslib@^2.6.2:
tslib@^2.0.0, tslib@^2.6.2:
version "2.8.1"
resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.8.1.tgz#612efe4ed235d567e8aba5f2a5fab70280ade83f"
integrity sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==
@@ -4250,10 +4537,14 @@ type-detect@^4.0.0, type-detect@^4.1.0:
resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.1.0.tgz#deb2453e8f08dcae7ae98c626b13dddb0155906c"
integrity sha512-Acylog8/luQ8L7il+geoSxhEkazvkslg7PSNKOX59mbB9cOveP5aq9h74Y7YU8yDpJwetzQQrfIwtf4Wp4LKcw==
type-fest@^0.20.2:
version "0.20.2"
resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.20.2.tgz#1bf207f4b28f91583666cb5fbd327887301cd5f4"
integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==
typescript-eslint@8.20.0:
version "8.20.0"
resolved "https://registry.yarnpkg.com/typescript-eslint/-/typescript-eslint-8.20.0.tgz#76d4ea6a483fd49830a7e8baccaed10f76d1e57b"
integrity sha512-Kxz2QRFsgbWj6Xcftlw3Dd154b3cEPFqQC+qMZrMypSijPd4UanKKvoKDrJ4o8AIfZFKAF+7sMaEIR8mTElozA==
dependencies:
"@typescript-eslint/eslint-plugin" "8.20.0"
"@typescript-eslint/parser" "8.20.0"
"@typescript-eslint/utils" "8.20.0"
typescript@5.5.4:
version "5.5.4"