diff --git a/.github/workflows/benchmarks.yml b/.github/workflows/benchmarks.yml index 46df463d83..64481e276d 100644 --- a/.github/workflows/benchmarks.yml +++ b/.github/workflows/benchmarks.yml @@ -33,5 +33,21 @@ jobs: run: | pnpm build + - name: Download rapidsnark (1c137) + run: | + mkdir -p ~/rapidsnark/build + wget -qO ~/rapidsnark/build/prover https://maci-devops-zkeys.s3.ap-northeast-2.amazonaws.com/rapidsnark-linux-amd64-1c137 + chmod +x ~/rapidsnark/build/prover + + - name: Download circom Binary v2.1.6 + run: | + wget -qO ${{ github.workspace }}/circom https://github.com/iden3/circom/releases/download/v2.1.6/circom-linux-amd64 + chmod +x ${{ github.workspace }}/circom + sudo mv ${{ github.workspace }}/circom /bin/circom + + - name: Download zkeys + run: | + pnpm download:test-zkeys + - name: Benchmarks run: pnpm benchmarks diff --git a/circuits/ts/proofs.ts b/circuits/ts/proofs.ts index 78e6a64eb5..2a1a6887e1 100644 --- a/circuits/ts/proofs.ts +++ b/circuits/ts/proofs.ts @@ -51,6 +51,10 @@ export const genProof = async ({ } const { proof, publicSignals } = await groth16.fullProve(inputs, wasmPath, zkeyPath); + + // ensure we clean up all threads spawned by snarkjs + await cleanThreads(); + return { proof, publicSignals }; } diff --git a/cli/package.json b/cli/package.json index c4cc021e29..37cc849f22 100644 --- a/cli/package.json +++ b/cli/package.json @@ -13,6 +13,7 @@ ], "scripts": { "watch": "tsc --watch", + "benchmarks": "ts-node tests/benchmarks/benchmarks.ts", "build": "tsc -p tsconfig.build.json", "postbuild": "cp package.json ./build && mkdir -p ./zkeys", "types": "tsc -p tsconfig.json --noEmit", diff --git a/cli/tests/e2e/e2e.test.ts b/cli/tests/e2e/e2e.test.ts index de9c6dfd59..d659e3f999 100644 --- a/cli/tests/e2e/e2e.test.ts +++ b/cli/tests/e2e/e2e.test.ts @@ -315,7 +315,7 @@ describe("e2e tests", function test() { }); }); - describe("5 signups, 1 message", () => { + describe("9 signups, 1 message", () => { after(() => { cleanVanilla(); }); diff --git a/integrationTests/package.json b/integrationTests/package.json index 892e6eb9a7..724e8db3f8 100644 --- a/integrationTests/package.json +++ b/integrationTests/package.json @@ -11,6 +11,7 @@ "scripts": { "watch": "tsc --watch", "build": "tsc", + "benchmarks": "ts-node ts/__benchmarks__/benchmarks.ts", "types": "tsc -p tsconfig.json --noEmit", "test": "ts-mocha --exit ./ts/__tests__/**.test.ts", "test:integration": "NODE_OPTIONS=--max-old-space-size=4096 ts-mocha --exit ./ts/__tests__/integration.test.ts", @@ -22,13 +23,15 @@ "@types/chai-as-promised": "^7.1.8", "@types/mocha": "^10.0.6", "@types/node": "^20.11.5", + "benny": "^3.7.1", "chai": "^4.3.10", "chai-as-promised": "^7.1.1", "hardhat": "^2.19.2", "hardhat-artifactor": "^0.2.0", "hardhat-contract-sizer": "^2.0.3", "mocha": "^10.2.0", - "ts-mocha": "^10.0.0" + "ts-mocha": "^10.0.0", + "ts-node": "^10.9.1" }, "dependencies": { "@nomicfoundation/hardhat-toolbox": "^4.0.0", diff --git a/integrationTests/ts/__benchmarks__/benchmarks.ts b/integrationTests/ts/__benchmarks__/benchmarks.ts new file mode 100644 index 0000000000..4ef5dcde12 --- /dev/null +++ b/integrationTests/ts/__benchmarks__/benchmarks.ts @@ -0,0 +1,367 @@ +import benny from "benny"; +import { genProof } from "maci-circuits"; +import { CircuitInputs, MaciState } from "maci-core"; +import { Keypair, PCommand } from "maci-domainobjs"; + +import { homedir } from "os"; +import path from "path"; + +import { STATE_TREE_DEPTH, duration, maxValues, treeDepths, voiceCreditBalance } from "../__tests__/utils/constants"; + +const NAME = "proof generation"; + +// eslint-disable-next-line @typescript-eslint/require-await +export default async function rune2e(): Promise { + const coordinatorKeypair = new Keypair(); + + const messageBatchSize = 5; + + const users = new Array(5).fill(new Keypair()); + + benny.suite( + NAME, + + benny.add(`wasm genProof - 5 signups, 5 messages`, async () => { + const maciState = new MaciState(STATE_TREE_DEPTH); + const pollId = maciState.deployPoll( + BigInt(duration), + maxValues, + treeDepths, + messageBatchSize, + coordinatorKeypair, + ); + const poll = maciState.polls.get(pollId); + + // signup 5 users + // eslint-disable-next-line @typescript-eslint/prefer-for-of + for (let i = 0; i < users.length; i += 1) { + const keypair = users[i]; + maciState.signUp(keypair.pubKey, voiceCreditBalance, BigInt(Date.now())); + // First command (valid) + const command = new PCommand( + BigInt(i) + 1n, + keypair.pubKey, + 5n, // voteOptionIndex, + 7n, // vote weight + 2n, // nonce + pollId, + ); + + const signature = command.sign(keypair.privKey); + + const ecdhKeypair = new Keypair(); + const sharedKey = Keypair.genEcdhSharedKey(ecdhKeypair.privKey, coordinatorKeypair.pubKey); + const message = command.encrypt(signature, sharedKey); + poll?.publishMessage(message, ecdhKeypair.pubKey); + } + + while (poll?.hasUnprocessedMessages()) { + const pmInputs = poll.processMessages(pollId) as unknown as CircuitInputs; + + // eslint-disable-next-line no-await-in-loop + await genProof({ + inputs: pmInputs, + useWasm: true, + wasmPath: path.resolve( + __dirname, + "../../../cli/zkeys/ProcessMessages_10-2-1-2_test/ProcessMessages_10-2-1-2_test_js/ProcessMessages_10-2-1-2_test.wasm", + ), + zkeyPath: path.resolve( + __dirname, + "../../../cli/zkeys/ProcessMessages_10-2-1-2_test/ProcessMessages_10-2-1-2_test.0.zkey", + ), + }); + } + }), + + benny.add(`rapidsnark genProof - 5 signups, 5 messages`, async () => { + const maciState = new MaciState(STATE_TREE_DEPTH); + const pollId = maciState.deployPoll( + BigInt(duration), + maxValues, + treeDepths, + messageBatchSize, + coordinatorKeypair, + ); + const poll = maciState.polls.get(pollId); + + // signup 5 users and submit 5 messages + // eslint-disable-next-line @typescript-eslint/prefer-for-of + for (let i = 0; i < users.length; i += 1) { + const keypair = users[i]; + maciState.signUp(keypair.pubKey, voiceCreditBalance, BigInt(Date.now())); + + // First command (valid) + const command = new PCommand( + BigInt(i) + 1n, + keypair.pubKey, + 5n, // voteOptionIndex, + 7n, // vote weight + 2n, // nonce + pollId, + ); + + const signature = command.sign(keypair.privKey); + + const ecdhKeypair = new Keypair(); + const sharedKey = Keypair.genEcdhSharedKey(ecdhKeypair.privKey, coordinatorKeypair.pubKey); + const message = command.encrypt(signature, sharedKey); + poll?.publishMessage(message, ecdhKeypair.pubKey); + } + + while (poll?.hasUnprocessedMessages()) { + const pmInputs = poll.processMessages(pollId) as unknown as CircuitInputs; + + // eslint-disable-next-line no-await-in-loop + await genProof({ + inputs: pmInputs, + useWasm: true, + rapidsnarkExePath: `${homedir()}/rapidsnark/build/prover`, + witnessExePath: path.resolve( + __dirname, + "../../../cli/zkeys/ProcessMessages_10-2-1-2_test/ProcessMessages_10-2-1-2_test_cpp/ProcessMessages_10-2-1-2_test", + ), + zkeyPath: path.resolve( + __dirname, + "../../../cli/zkeys/ProcessMessages_10-2-1-2_test/ProcessMessages_10-2-1-2_test.0.zkey", + ), + }); + } + }), + + benny.add(`wasm genProof - 5 signups, 1 message`, async () => { + const maciState = new MaciState(STATE_TREE_DEPTH); + const pollId = maciState.deployPoll( + BigInt(duration), + maxValues, + treeDepths, + messageBatchSize, + coordinatorKeypair, + ); + + const poll = maciState.polls.get(pollId); + + // signup 5 users + // eslint-disable-next-line @typescript-eslint/prefer-for-of + for (let i = 0; i < users.length; i += 1) { + const keypair = users[i]; + maciState.signUp(keypair.pubKey, voiceCreditBalance, BigInt(Date.now())); + } + + const keypair = users[0]; + // First command (valid) + const command = new PCommand( + 1n, // BigInt(1), + keypair.pubKey, + 5n, // voteOptionIndex, + 7n, // vote weight + 2n, // nonce + pollId, + ); + + const signature = command.sign(keypair.privKey); + + const ecdhKeypair = new Keypair(); + const sharedKey = Keypair.genEcdhSharedKey(ecdhKeypair.privKey, coordinatorKeypair.pubKey); + const message = command.encrypt(signature, sharedKey); + poll?.publishMessage(message, ecdhKeypair.pubKey); + + while (poll?.hasUnprocessedMessages()) { + const pmInputs = poll.processMessages(pollId) as unknown as CircuitInputs; + + // eslint-disable-next-line no-await-in-loop + await genProof({ + inputs: pmInputs, + useWasm: true, + wasmPath: path.resolve( + __dirname, + "../../../cli/zkeys/ProcessMessages_10-2-1-2_test/ProcessMessages_10-2-1-2_test_js/ProcessMessages_10-2-1-2_test.wasm", + ), + zkeyPath: path.resolve( + __dirname, + "../../../cli/zkeys/ProcessMessages_10-2-1-2_test/ProcessMessages_10-2-1-2_test.0.zkey", + ), + }); + } + }), + + benny.add(`rapidnsark genProof - 5 signups, 1 message`, async () => { + const maciState = new MaciState(STATE_TREE_DEPTH); + const pollId = maciState.deployPoll( + BigInt(duration), + maxValues, + treeDepths, + messageBatchSize, + coordinatorKeypair, + ); + + const poll = maciState.polls.get(pollId); + + // signup 5 users + // eslint-disable-next-line @typescript-eslint/prefer-for-of + for (let i = 0; i < users.length; i += 1) { + const keypair = users[i]; + maciState.signUp(keypair.pubKey, voiceCreditBalance, BigInt(Date.now())); + } + + const keypair = users[0]; + // First command (valid) + const command = new PCommand( + 1n, // BigInt(1), + keypair.pubKey, + 5n, // voteOptionIndex, + 7n, // vote weight + 2n, // nonce + pollId, + ); + + const signature = command.sign(keypair.privKey); + + const ecdhKeypair = new Keypair(); + const sharedKey = Keypair.genEcdhSharedKey(ecdhKeypair.privKey, coordinatorKeypair.pubKey); + const message = command.encrypt(signature, sharedKey); + poll?.publishMessage(message, ecdhKeypair.pubKey); + + while (poll?.hasUnprocessedMessages()) { + const pmInputs = poll.processMessages(pollId) as unknown as CircuitInputs; + + // eslint-disable-next-line no-await-in-loop + await genProof({ + inputs: pmInputs, + useWasm: true, + rapidsnarkExePath: `${homedir()}/rapidsnark/build/prover`, + witnessExePath: path.resolve( + __dirname, + "../../../cli/zkeys/ProcessMessages_10-2-1-2_test/ProcessMessages_10-2-1-2_test_cpp/ProcessMessages_10-2-1-2_test", + ), + zkeyPath: path.resolve( + __dirname, + "../../../cli/zkeys/ProcessMessages_10-2-1-2_test/ProcessMessages_10-2-1-2_test.0.zkey", + ), + }); + } + }), + + benny.add(`wasm genProof - 1 signups, 5 messages`, async () => { + const maciState = new MaciState(STATE_TREE_DEPTH); + const pollId = maciState.deployPoll( + BigInt(duration), + maxValues, + treeDepths, + messageBatchSize, + coordinatorKeypair, + ); + + const poll = maciState.polls.get(pollId); + + maciState.signUp(users[0].pubKey, voiceCreditBalance, BigInt(Date.now())); + + // submit 5 messages + // eslint-disable-next-line @typescript-eslint/prefer-for-of + for (let i = 0; i < users.length; i += 1) { + const keypair = users[i]; + // First command (valid) + const command = new PCommand( + BigInt(i) + 1n, + keypair.pubKey, + 5n, // voteOptionIndex, + 7n, // vote weight + 2n, // nonce + pollId, + ); + + const signature = command.sign(keypair.privKey); + + const ecdhKeypair = new Keypair(); + const sharedKey = Keypair.genEcdhSharedKey(ecdhKeypair.privKey, coordinatorKeypair.pubKey); + const message = command.encrypt(signature, sharedKey); + poll?.publishMessage(message, ecdhKeypair.pubKey); + + while (poll?.hasUnprocessedMessages()) { + const pmInputs = poll.processMessages(pollId) as unknown as CircuitInputs; + + // eslint-disable-next-line no-await-in-loop + await genProof({ + inputs: pmInputs, + useWasm: true, + wasmPath: path.resolve( + __dirname, + "../../../cli/zkeys/ProcessMessages_10-2-1-2_test/ProcessMessages_10-2-1-2_test_js/ProcessMessages_10-2-1-2_test.wasm", + ), + zkeyPath: path.resolve( + __dirname, + "../../../cli/zkeys/ProcessMessages_10-2-1-2_test/ProcessMessages_10-2-1-2_test.0.zkey", + ), + }); + } + } + }), + + benny.add(`rapidnsark genProof - 1 signups, 5 messages`, async () => { + const maciState = new MaciState(STATE_TREE_DEPTH); + const pollId = maciState.deployPoll( + BigInt(duration), + maxValues, + treeDepths, + messageBatchSize, + coordinatorKeypair, + ); + + const poll = maciState.polls.get(pollId); + + maciState.signUp(users[0].pubKey, voiceCreditBalance, BigInt(Date.now())); + + // submit 5 messages + // eslint-disable-next-line @typescript-eslint/prefer-for-of + for (let i = 0; i < users.length; i += 1) { + const keypair = users[i]; + // First command (valid) + const command = new PCommand( + BigInt(i) + 1n, + keypair.pubKey, + 5n, // voteOptionIndex, + 7n, // vote weight + 2n, // nonce + pollId, + ); + + const signature = command.sign(keypair.privKey); + + const ecdhKeypair = new Keypair(); + const sharedKey = Keypair.genEcdhSharedKey(ecdhKeypair.privKey, coordinatorKeypair.pubKey); + const message = command.encrypt(signature, sharedKey); + poll?.publishMessage(message, ecdhKeypair.pubKey); + + while (poll?.hasUnprocessedMessages()) { + const pmInputs = poll.processMessages(pollId) as unknown as CircuitInputs; + + // eslint-disable-next-line no-await-in-loop + await genProof({ + inputs: pmInputs, + useWasm: true, + rapidsnarkExePath: `${homedir()}/rapidsnark/build/prover`, + witnessExePath: path.resolve( + __dirname, + "../../../cli/zkeys/ProcessMessages_10-2-1-2_test/ProcessMessages_10-2-1-2_test_cpp/ProcessMessages_10-2-1-2_test", + ), + zkeyPath: path.resolve( + __dirname, + "../../../cli/zkeys/ProcessMessages_10-2-1-2_test/ProcessMessages_10-2-1-2_test.0.zkey", + ), + }); + } + } + }), + + benny.cycle(), + benny.complete(), + + benny.save({ folder: "ts/__benchmarks__/results", file: NAME, version: "1.0.0", details: true }), + benny.save({ folder: "ts/__benchmarks__/results", file: NAME, format: "chart.html", details: true }), + benny.save({ folder: "ts/__benchmarks__/results", file: NAME, format: "table.html", details: true }), + ); +} + +(async () => { + await rune2e(); +})(); diff --git a/integrationTests/ts/__tests__/utils/constants.ts b/integrationTests/ts/__tests__/utils/constants.ts index 7ce585f9fb..f3ab674985 100644 --- a/integrationTests/ts/__tests__/utils/constants.ts +++ b/integrationTests/ts/__tests__/utils/constants.ts @@ -42,3 +42,16 @@ export const INT_STATE_TREE_DEPTH = 1; export const MSG_TREE_DEPTH = 2; export const VOTE_OPTION_TREE_DEPTH = 2; export const MSG_BATCH_DEPTH = 1; + +export const voiceCreditBalance = 100n; +export const maxValues = { + maxUsers: 25, + maxMessages: 25, + maxVoteOptions: 25, +}; +export const treeDepths = { + intStateTreeDepth: 2, + messageTreeDepth: 2, + messageTreeSubDepth: 1, + voteOptionTreeDepth: 2, +}; diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index eb0d0eac07..9f54d35dd0 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -16,10 +16,10 @@ importers: version: 18.5.0 '@typescript-eslint/eslint-plugin': specifier: ^6.19.0 - version: 6.19.0(@typescript-eslint/parser@6.19.0)(eslint@8.56.0)(typescript@5.3.3) + version: 6.19.1(@typescript-eslint/parser@6.19.1)(eslint@8.56.0)(typescript@5.3.3) '@typescript-eslint/parser': specifier: ^6.19.0 - version: 6.19.0(eslint@8.56.0)(typescript@5.3.3) + version: 6.19.1(eslint@8.56.0)(typescript@5.3.3) conventional-changelog-conventionalcommits: specifier: ^7.0.2 version: 7.0.2 @@ -37,10 +37,10 @@ importers: version: 9.1.0(eslint@8.56.0) eslint-import-resolver-typescript: specifier: ^3.6.1 - version: 3.6.1(@typescript-eslint/parser@6.19.0)(eslint-plugin-import@2.29.1)(eslint@8.56.0) + version: 3.6.1(@typescript-eslint/parser@6.19.1)(eslint-plugin-import@2.29.1)(eslint@8.56.0) eslint-plugin-import: specifier: ^2.29.1 - version: 2.29.1(@typescript-eslint/parser@6.19.0)(eslint-import-resolver-typescript@3.6.1)(eslint@8.56.0) + version: 2.29.1(@typescript-eslint/parser@6.19.1)(eslint-import-resolver-typescript@3.6.1)(eslint@8.56.0) eslint-plugin-json: specifier: ^3.1.0 version: 3.1.0 @@ -58,7 +58,7 @@ importers: version: 4.6.0(eslint@8.56.0) eslint-plugin-unused-imports: specifier: ^3.0.0 - version: 3.0.0(@typescript-eslint/eslint-plugin@6.19.0)(eslint@8.56.0) + version: 3.0.0(@typescript-eslint/eslint-plugin@6.19.1)(eslint@8.56.0) husky: specifier: ^8.0.0 version: 8.0.3 @@ -438,6 +438,9 @@ importers: '@types/node': specifier: ^20.11.5 version: 20.11.5 + benny: + specifier: ^3.7.1 + version: 3.7.1 chai: specifier: ^4.3.10 version: 4.4.0 @@ -459,6 +462,9 @@ importers: ts-mocha: specifier: ^10.0.0 version: 10.0.0(mocha@10.2.0) + ts-node: + specifier: ^10.9.1 + version: 10.9.2(@types/node@20.11.5)(typescript@5.3.3) website: dependencies: @@ -2053,16 +2059,6 @@ packages: conventional-changelog-conventionalcommits: 7.0.2 dev: true - /@commitlint/config-validator@18.4.4: - resolution: {integrity: sha512-/QI8KIg/h7O0Eus36fPcEcO3QPBcdXuGfZeCF5m15k0EB2bcU8s6pHNTNEa6xz9PrAefHCL+yzRJj7w20T6Mow==} - engines: {node: '>=v18'} - requiresBuild: true - dependencies: - '@commitlint/types': 18.4.4 - ajv: 8.12.0 - dev: true - optional: true - /@commitlint/config-validator@18.5.0: resolution: {integrity: sha512-mDAA6WQPjh9Ida8ACdInDylBQcqeUD2gBHE+dQu+B3OIHiWiSSrq4F2+wg3nDU9EzfcQSwPwYL+QbMmiW5SmLA==} engines: {node: '>=v18'} @@ -2115,28 +2111,6 @@ packages: '@commitlint/types': 18.4.4 dev: true - /@commitlint/load@18.4.4(@types/node@20.11.5)(typescript@5.3.3): - resolution: {integrity: sha512-RaDIa9qwOw2xRJ3Jr2DBXd14rmnHJIX2XdZF4kmoF1rgsg/+7cvrExLSUNAkQUNimyjCn1b/bKX2Omm+GdY0XQ==} - engines: {node: '>=v18'} - requiresBuild: true - dependencies: - '@commitlint/config-validator': 18.4.4 - '@commitlint/execute-rule': 18.4.4 - '@commitlint/resolve-extends': 18.4.4 - '@commitlint/types': 18.4.4 - chalk: 4.1.2 - cosmiconfig: 8.3.6(typescript@5.3.3) - cosmiconfig-typescript-loader: 5.0.0(@types/node@20.11.5)(cosmiconfig@8.3.6)(typescript@5.3.3) - lodash.isplainobject: 4.0.6 - lodash.merge: 4.6.2 - lodash.uniq: 4.5.0 - resolve-from: 5.0.0 - transitivePeerDependencies: - - '@types/node' - - typescript - dev: true - optional: true - /@commitlint/load@18.5.0(@types/node@20.11.5)(typescript@5.3.3): resolution: {integrity: sha512-vpyGgk7rzbFsU01NVwPNC/WetHFP0EwSYnQ1R833SJFHkEo+cWvqoVlw/VoZwBMoI6sF5/lwEdKzFDr1DHJ6+A==} engines: {node: '>=v18'} @@ -2181,20 +2155,6 @@ packages: minimist: 1.2.8 dev: true - /@commitlint/resolve-extends@18.4.4: - resolution: {integrity: sha512-RRpIHSbRnFvmGifVk21Gqazf1QF/yeP+Kkg/e3PlkegcOKd/FGOXp/Kx9cvSO2K7ucSn4GD/oBvgasFoy+NCAw==} - engines: {node: '>=v18'} - requiresBuild: true - dependencies: - '@commitlint/config-validator': 18.4.4 - '@commitlint/types': 18.4.4 - import-fresh: 3.3.0 - lodash.mergewith: 4.6.2 - resolve-from: 5.0.0 - resolve-global: 1.0.0 - dev: true - optional: true - /@commitlint/resolve-extends@18.5.0: resolution: {integrity: sha512-OxCYOMnlkOEEIkwTaRiFjHyuWBq962WBZQVHfMHej8tr3d+SfjznvqZhPmW8/SuqtfmGEiJPGWUNOxgwH+O0MA==} engines: {node: '>=v18'} @@ -5468,8 +5428,8 @@ packages: '@types/yargs-parser': 21.0.3 dev: false - /@typescript-eslint/eslint-plugin@6.19.0(@typescript-eslint/parser@6.19.0)(eslint@8.56.0)(typescript@5.3.3): - resolution: {integrity: sha512-DUCUkQNklCQYnrBSSikjVChdc84/vMPDQSgJTHBZ64G9bA9w0Crc0rd2diujKbTdp6w2J47qkeHQLoi0rpLCdg==} + /@typescript-eslint/eslint-plugin@6.19.1(@typescript-eslint/parser@6.19.1)(eslint@8.56.0)(typescript@5.3.3): + resolution: {integrity: sha512-roQScUGFruWod9CEyoV5KlCYrubC/fvG8/1zXuT0WTcxX87GnMMmnksMwSg99lo1xiKrBzw2icsJPMAw1OtKxg==} engines: {node: ^16.0.0 || >=18.0.0} peerDependencies: '@typescript-eslint/parser': ^6.0.0 || ^6.0.0-alpha @@ -5480,11 +5440,11 @@ packages: optional: true dependencies: '@eslint-community/regexpp': 4.10.0 - '@typescript-eslint/parser': 6.19.0(eslint@8.56.0)(typescript@5.3.3) - '@typescript-eslint/scope-manager': 6.19.0 - '@typescript-eslint/type-utils': 6.19.0(eslint@8.56.0)(typescript@5.3.3) - '@typescript-eslint/utils': 6.19.0(eslint@8.56.0)(typescript@5.3.3) - '@typescript-eslint/visitor-keys': 6.19.0 + '@typescript-eslint/parser': 6.19.1(eslint@8.56.0)(typescript@5.3.3) + '@typescript-eslint/scope-manager': 6.19.1 + '@typescript-eslint/type-utils': 6.19.1(eslint@8.56.0)(typescript@5.3.3) + '@typescript-eslint/utils': 6.19.1(eslint@8.56.0)(typescript@5.3.3) + '@typescript-eslint/visitor-keys': 6.19.1 debug: 4.3.4(supports-color@8.1.1) eslint: 8.56.0 graphemer: 1.4.0 @@ -5497,8 +5457,8 @@ packages: - supports-color dev: true - /@typescript-eslint/parser@6.19.0(eslint@8.56.0)(typescript@5.3.3): - resolution: {integrity: sha512-1DyBLG5SH7PYCd00QlroiW60YJ4rWMuUGa/JBV0iZuqi4l4IK3twKPq5ZkEebmGqRjXWVgsUzfd3+nZveewgow==} + /@typescript-eslint/parser@6.19.1(eslint@8.56.0)(typescript@5.3.3): + resolution: {integrity: sha512-WEfX22ziAh6pRE9jnbkkLGp/4RhTpffr2ZK5bJ18M8mIfA8A+k97U9ZyaXCEJRlmMHh7R9MJZWXp/r73DzINVQ==} engines: {node: ^16.0.0 || >=18.0.0} peerDependencies: eslint: ^7.0.0 || ^8.0.0 @@ -5507,10 +5467,10 @@ packages: typescript: optional: true dependencies: - '@typescript-eslint/scope-manager': 6.19.0 - '@typescript-eslint/types': 6.19.0 - '@typescript-eslint/typescript-estree': 6.19.0(typescript@5.3.3) - '@typescript-eslint/visitor-keys': 6.19.0 + '@typescript-eslint/scope-manager': 6.19.1 + '@typescript-eslint/types': 6.19.1 + '@typescript-eslint/typescript-estree': 6.19.1(typescript@5.3.3) + '@typescript-eslint/visitor-keys': 6.19.1 debug: 4.3.4(supports-color@8.1.1) eslint: 8.56.0 typescript: 5.3.3 @@ -5518,16 +5478,16 @@ packages: - supports-color dev: true - /@typescript-eslint/scope-manager@6.19.0: - resolution: {integrity: sha512-dO1XMhV2ehBI6QN8Ufi7I10wmUovmLU0Oru3n5LVlM2JuzB4M+dVphCPLkVpKvGij2j/pHBWuJ9piuXx+BhzxQ==} + /@typescript-eslint/scope-manager@6.19.1: + resolution: {integrity: sha512-4CdXYjKf6/6aKNMSly/BP4iCSOpvMmqtDzRtqFyyAae3z5kkqEjKndR5vDHL8rSuMIIWP8u4Mw4VxLyxZW6D5w==} engines: {node: ^16.0.0 || >=18.0.0} dependencies: - '@typescript-eslint/types': 6.19.0 - '@typescript-eslint/visitor-keys': 6.19.0 + '@typescript-eslint/types': 6.19.1 + '@typescript-eslint/visitor-keys': 6.19.1 dev: true - /@typescript-eslint/type-utils@6.19.0(eslint@8.56.0)(typescript@5.3.3): - resolution: {integrity: sha512-mcvS6WSWbjiSxKCwBcXtOM5pRkPQ6kcDds/juxcy/727IQr3xMEcwr/YLHW2A2+Fp5ql6khjbKBzOyjuPqGi/w==} + /@typescript-eslint/type-utils@6.19.1(eslint@8.56.0)(typescript@5.3.3): + resolution: {integrity: sha512-0vdyld3ecfxJuddDjACUvlAeYNrHP/pDeQk2pWBR2ESeEzQhg52DF53AbI9QCBkYE23lgkhLCZNkHn2hEXXYIg==} engines: {node: ^16.0.0 || >=18.0.0} peerDependencies: eslint: ^7.0.0 || ^8.0.0 @@ -5536,8 +5496,8 @@ packages: typescript: optional: true dependencies: - '@typescript-eslint/typescript-estree': 6.19.0(typescript@5.3.3) - '@typescript-eslint/utils': 6.19.0(eslint@8.56.0)(typescript@5.3.3) + '@typescript-eslint/typescript-estree': 6.19.1(typescript@5.3.3) + '@typescript-eslint/utils': 6.19.1(eslint@8.56.0)(typescript@5.3.3) debug: 4.3.4(supports-color@8.1.1) eslint: 8.56.0 ts-api-utils: 1.0.3(typescript@5.3.3) @@ -5546,13 +5506,13 @@ packages: - supports-color dev: true - /@typescript-eslint/types@6.19.0: - resolution: {integrity: sha512-lFviGV/vYhOy3m8BJ/nAKoAyNhInTdXpftonhWle66XHAtT1ouBlkjL496b5H5hb8dWXHwtypTqgtb/DEa+j5A==} + /@typescript-eslint/types@6.19.1: + resolution: {integrity: sha512-6+bk6FEtBhvfYvpHsDgAL3uo4BfvnTnoge5LrrCj2eJN8g3IJdLTD4B/jK3Q6vo4Ql/Hoip9I8aB6fF+6RfDqg==} engines: {node: ^16.0.0 || >=18.0.0} dev: true - /@typescript-eslint/typescript-estree@6.19.0(typescript@5.3.3): - resolution: {integrity: sha512-o/zefXIbbLBZ8YJ51NlkSAt2BamrK6XOmuxSR3hynMIzzyMY33KuJ9vuMdFSXW+H0tVvdF9qBPTHA91HDb4BIQ==} + /@typescript-eslint/typescript-estree@6.19.1(typescript@5.3.3): + resolution: {integrity: sha512-aFdAxuhzBFRWhy+H20nYu19+Km+gFfwNO4TEqyszkMcgBDYQjmPJ61erHxuT2ESJXhlhrO7I5EFIlZ+qGR8oVA==} engines: {node: ^16.0.0 || >=18.0.0} peerDependencies: typescript: '*' @@ -5560,8 +5520,8 @@ packages: typescript: optional: true dependencies: - '@typescript-eslint/types': 6.19.0 - '@typescript-eslint/visitor-keys': 6.19.0 + '@typescript-eslint/types': 6.19.1 + '@typescript-eslint/visitor-keys': 6.19.1 debug: 4.3.4(supports-color@8.1.1) globby: 11.1.0 is-glob: 4.0.3 @@ -5573,8 +5533,8 @@ packages: - supports-color dev: true - /@typescript-eslint/utils@6.19.0(eslint@8.56.0)(typescript@5.3.3): - resolution: {integrity: sha512-QR41YXySiuN++/dC9UArYOg4X86OAYP83OWTewpVx5ct1IZhjjgTLocj7QNxGhWoTqknsgpl7L+hGygCO+sdYw==} + /@typescript-eslint/utils@6.19.1(eslint@8.56.0)(typescript@5.3.3): + resolution: {integrity: sha512-JvjfEZuP5WoMqwh9SPAPDSHSg9FBHHGhjPugSRxu5jMfjvBpq5/sGTD+9M9aQ5sh6iJ8AY/Kk/oUYVEMAPwi7w==} engines: {node: ^16.0.0 || >=18.0.0} peerDependencies: eslint: ^7.0.0 || ^8.0.0 @@ -5582,9 +5542,9 @@ packages: '@eslint-community/eslint-utils': 4.4.0(eslint@8.56.0) '@types/json-schema': 7.0.15 '@types/semver': 7.5.6 - '@typescript-eslint/scope-manager': 6.19.0 - '@typescript-eslint/types': 6.19.0 - '@typescript-eslint/typescript-estree': 6.19.0(typescript@5.3.3) + '@typescript-eslint/scope-manager': 6.19.1 + '@typescript-eslint/types': 6.19.1 + '@typescript-eslint/typescript-estree': 6.19.1(typescript@5.3.3) eslint: 8.56.0 semver: 7.5.4 transitivePeerDependencies: @@ -5592,11 +5552,11 @@ packages: - typescript dev: true - /@typescript-eslint/visitor-keys@6.19.0: - resolution: {integrity: sha512-hZaUCORLgubBvtGpp1JEFEazcuEdfxta9j4iUwdSAr7mEsYYAp3EAUyCZk3VEEqGj6W+AV4uWyrDGtrlawAsgQ==} + /@typescript-eslint/visitor-keys@6.19.1: + resolution: {integrity: sha512-gkdtIO+xSO/SmI0W68DBg4u1KElmIUo3vXzgHyGPs6cxgB0sa3TlptRAAE0hUY1hM6FcDKEv7aIwiTGm76cXfQ==} engines: {node: ^16.0.0 || >=18.0.0} dependencies: - '@typescript-eslint/types': 6.19.0 + '@typescript-eslint/types': 6.19.1 eslint-visitor-keys: 3.4.3 dev: true @@ -7816,7 +7776,7 @@ packages: longest: 2.0.1 word-wrap: 1.2.5 optionalDependencies: - '@commitlint/load': 18.4.4(@types/node@20.11.5)(typescript@5.3.3) + '@commitlint/load': 18.5.0(@types/node@20.11.5)(typescript@5.3.3) transitivePeerDependencies: - '@types/node' - typescript @@ -8469,7 +8429,7 @@ packages: dependencies: confusing-browser-globals: 1.0.11 eslint: 8.56.0 - eslint-plugin-import: 2.29.1(@typescript-eslint/parser@6.19.0)(eslint-import-resolver-typescript@3.6.1)(eslint@8.56.0) + eslint-plugin-import: 2.29.1(@typescript-eslint/parser@6.19.1)(eslint-import-resolver-typescript@3.6.1)(eslint@8.56.0) object.assign: 4.1.5 object.entries: 1.1.7 semver: 6.3.1 @@ -8487,7 +8447,7 @@ packages: dependencies: eslint: 8.56.0 eslint-config-airbnb-base: 15.0.0(eslint-plugin-import@2.29.1)(eslint@8.56.0) - eslint-plugin-import: 2.29.1(@typescript-eslint/parser@6.19.0)(eslint-import-resolver-typescript@3.6.1)(eslint@8.56.0) + eslint-plugin-import: 2.29.1(@typescript-eslint/parser@6.19.1)(eslint-import-resolver-typescript@3.6.1)(eslint@8.56.0) eslint-plugin-jsx-a11y: 6.8.0(eslint@8.56.0) eslint-plugin-react: 7.33.2(eslint@8.56.0) eslint-plugin-react-hooks: 4.6.0(eslint@8.56.0) @@ -8514,7 +8474,7 @@ packages: - supports-color dev: true - /eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@6.19.0)(eslint-plugin-import@2.29.1)(eslint@8.56.0): + /eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@6.19.1)(eslint-plugin-import@2.29.1)(eslint@8.56.0): resolution: {integrity: sha512-xgdptdoi5W3niYeuQxKmzVDTATvLYqhpwmykwsh7f6HIOStGWEIL9iqZgQDF9u9OEzrRwR8no5q2VT+bjAujTg==} engines: {node: ^14.18.0 || >=16.0.0} peerDependencies: @@ -8524,8 +8484,8 @@ packages: debug: 4.3.4(supports-color@8.1.1) enhanced-resolve: 5.15.0 eslint: 8.56.0 - eslint-module-utils: 2.8.0(@typescript-eslint/parser@6.19.0)(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1)(eslint@8.56.0) - eslint-plugin-import: 2.29.1(@typescript-eslint/parser@6.19.0)(eslint-import-resolver-typescript@3.6.1)(eslint@8.56.0) + eslint-module-utils: 2.8.0(@typescript-eslint/parser@6.19.1)(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1)(eslint@8.56.0) + eslint-plugin-import: 2.29.1(@typescript-eslint/parser@6.19.1)(eslint-import-resolver-typescript@3.6.1)(eslint@8.56.0) fast-glob: 3.3.2 get-tsconfig: 4.7.2 is-core-module: 2.13.1 @@ -8537,7 +8497,7 @@ packages: - supports-color dev: true - /eslint-module-utils@2.8.0(@typescript-eslint/parser@6.19.0)(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1)(eslint@8.56.0): + /eslint-module-utils@2.8.0(@typescript-eslint/parser@6.19.1)(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1)(eslint@8.56.0): resolution: {integrity: sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw==} engines: {node: '>=4'} peerDependencies: @@ -8558,16 +8518,16 @@ packages: eslint-import-resolver-webpack: optional: true dependencies: - '@typescript-eslint/parser': 6.19.0(eslint@8.56.0)(typescript@5.3.3) + '@typescript-eslint/parser': 6.19.1(eslint@8.56.0)(typescript@5.3.3) debug: 3.2.7 eslint: 8.56.0 eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-typescript: 3.6.1(@typescript-eslint/parser@6.19.0)(eslint-plugin-import@2.29.1)(eslint@8.56.0) + eslint-import-resolver-typescript: 3.6.1(@typescript-eslint/parser@6.19.1)(eslint-plugin-import@2.29.1)(eslint@8.56.0) transitivePeerDependencies: - supports-color dev: true - /eslint-plugin-import@2.29.1(@typescript-eslint/parser@6.19.0)(eslint-import-resolver-typescript@3.6.1)(eslint@8.56.0): + /eslint-plugin-import@2.29.1(@typescript-eslint/parser@6.19.1)(eslint-import-resolver-typescript@3.6.1)(eslint@8.56.0): resolution: {integrity: sha512-BbPC0cuExzhiMo4Ff1BTVwHpjjv28C5R+btTOGaCRC7UEz801up0JadwkeSk5Ued6TG34uaczuVuH6qyy5YUxw==} engines: {node: '>=4'} peerDependencies: @@ -8577,7 +8537,7 @@ packages: '@typescript-eslint/parser': optional: true dependencies: - '@typescript-eslint/parser': 6.19.0(eslint@8.56.0)(typescript@5.3.3) + '@typescript-eslint/parser': 6.19.1(eslint@8.56.0)(typescript@5.3.3) array-includes: 3.1.7 array.prototype.findlastindex: 1.2.3 array.prototype.flat: 1.3.2 @@ -8586,7 +8546,7 @@ packages: doctrine: 2.1.0 eslint: 8.56.0 eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.8.0(@typescript-eslint/parser@6.19.0)(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1)(eslint@8.56.0) + eslint-module-utils: 2.8.0(@typescript-eslint/parser@6.19.1)(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1)(eslint@8.56.0) hasown: 2.0.0 is-core-module: 2.13.1 is-glob: 4.0.3 @@ -8690,7 +8650,7 @@ packages: string.prototype.matchall: 4.0.10 dev: true - /eslint-plugin-unused-imports@3.0.0(@typescript-eslint/eslint-plugin@6.19.0)(eslint@8.56.0): + /eslint-plugin-unused-imports@3.0.0(@typescript-eslint/eslint-plugin@6.19.1)(eslint@8.56.0): resolution: {integrity: sha512-sduiswLJfZHeeBJ+MQaG+xYzSWdRXoSw61DpU13mzWumCkR0ufD0HmO4kdNokjrkluMHpj/7PJeN35pgbhW3kw==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: @@ -8700,7 +8660,7 @@ packages: '@typescript-eslint/eslint-plugin': optional: true dependencies: - '@typescript-eslint/eslint-plugin': 6.19.0(@typescript-eslint/parser@6.19.0)(eslint@8.56.0)(typescript@5.3.3) + '@typescript-eslint/eslint-plugin': 6.19.1(@typescript-eslint/parser@6.19.1)(eslint@8.56.0)(typescript@5.3.3) eslint: 8.56.0 eslint-rule-composer: 0.3.0 dev: true @@ -9043,6 +9003,7 @@ packages: dependencies: is-hex-prefixed: 1.0.0 strip-hex-prefix: 1.0.0 + bundledDependencies: false /eval@0.1.8: resolution: {integrity: sha512-EzV94NYKoO09GLXGjXj9JIlXijVck4ONSr5wiCWDvhsvj5jxSrzTmRU/9C1DyB6uToszLs8aifA6NQ7lEQdvFw==} @@ -9074,9 +9035,9 @@ packages: engines: {node: '>=10'} dependencies: cross-spawn: 7.0.3 - get-stream: 6.0.1 + get-stream: 6.0.0 human-signals: 2.1.0 - is-stream: 2.0.1 + is-stream: 2.0.0 merge-stream: 2.0.0 npm-run-path: 4.0.1 onetime: 5.1.2 @@ -18114,6 +18075,7 @@ packages: /yargs-parser@20.2.9: resolution: {integrity: sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==} engines: {node: '>=10'} + dev: true /yargs-parser@21.1.1: resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} @@ -18156,7 +18118,7 @@ packages: require-directory: 2.1.1 string-width: 4.2.3 y18n: 5.0.8 - yargs-parser: 20.2.9 + yargs-parser: 20.2.4 /yargs@17.7.2: resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==}