diff --git a/benchmark/.gitignore b/benchmark/.gitignore index 2cc25226..61561495 100644 --- a/benchmark/.gitignore +++ b/benchmark/.gitignore @@ -1,2 +1,2 @@ build -file-sizes.json \ No newline at end of file +file-sizes.json diff --git a/benchmark/__tests__/results-store.js b/benchmark/__tests__/results-store.js new file mode 100644 index 00000000..3dec9085 --- /dev/null +++ b/benchmark/__tests__/results-store.js @@ -0,0 +1,60 @@ +import fs from "fs"; +import path from "path"; + +const resultsFilePath = path.resolve("temp-all-test-results.json"); + +/** + * Reads existing test results from a JSON file if it exists. + * + * This function checks if the file specified by `resultsFilePath` exists. + * If the file is found, it reads the file's content and parses it as JSON. + * If the file does not exist, it returns an empty object. + * + * @returns {Object} The parsed JSON object from the file, or an empty object if the file does not exist. + */ +function readExistingResults() { + if (fs.existsSync(resultsFilePath)) { + try { + const fileContent = fs.readFileSync(resultsFilePath, "utf-8"); + return JSON.parse(fileContent); + } catch (error) { + console.error("Failed to read or parse results file:", error); + return {}; + } + } + return {}; +} + +/** + * Function to add test results to the report if the GENERATE_REPORT environment variable is set to "true" + * @param {string} testName - The name of the test. + * @param {Object} result - The test result object. + */ +export function addTestResults(testName, result) { + // Check if we need to generate a report + if (process.env.GENERATE_REPORT === "true") { + // Create a temporary object for the new test results + const tempResults = { + [testName]: result, + }; + + // Read existing results from the file + const existingResults = readExistingResults(); + + // Combine existing results with new test results + const combinedResults = { + ...existingResults, + ...tempResults, + }; + + try { + // Write the combined results to the file + fs.writeFileSync( + resultsFilePath, + JSON.stringify(combinedResults, null, 2) + ); + } catch (error) { + console.error("Failed to write results to file:", error); + } + } +} diff --git a/benchmark/__tests__/test-deploy-contract.ava.js b/benchmark/__tests__/test-deploy-contract.ava.js index 7f4d89e8..ae9d1309 100644 --- a/benchmark/__tests__/test-deploy-contract.ava.js +++ b/benchmark/__tests__/test-deploy-contract.ava.js @@ -1,11 +1,7 @@ import { Worker } from "near-workspaces"; import test from "ava"; -import { - formatGas, - gasBreakdown, - logGasBreakdown, - logGasDetail, -} from "./util.js"; +import { generateGasObject, logTestResults } from "./util.js"; +import { addTestResults } from "./results-store.js"; test.before(async (t) => { // Init the worker and start a Sandbox server @@ -47,8 +43,9 @@ test("JS promise batch deploy contract and call", async (t) => { let r = await bob.callRaw(callerContract, "deploy_contract", "", { gas: "300 Tgas", }); - // console.log(JSON.stringify(r, null, 2)); + let deployed = callerContract.getSubAccount("a"); + t.deepEqual(JSON.parse(Buffer.from(r.result.status.SuccessValue, "base64")), { currentAccountId: deployed.accountId, signerAccountId: bob.accountId, @@ -56,42 +53,11 @@ test("JS promise batch deploy contract and call", async (t) => { input: "abc", }); - t.log( - "Gas used to convert transaction to receipt: ", - formatGas(r.result.transaction_outcome.outcome.gas_burnt) - ); - t.log( - "Gas used to execute the receipt (actual contract call): ", - formatGas(r.result.receipts_outcome[0].outcome.gas_burnt) - ); - let map = gasBreakdown(r.result.receipts_outcome[0].outcome); - logGasBreakdown(map, t); - t.log( - "Gas used to execute the cross contract call: ", - formatGas(r.result.receipts_outcome[1].outcome.gas_burnt) - ); - map = gasBreakdown(r.result.receipts_outcome[1].outcome); - logGasBreakdown(map, t); - t.log( - "Gas used to refund unused gas for cross contract call: ", - formatGas(r.result.receipts_outcome[2].outcome.gas_burnt) - ); - t.log( - "Gas used to refund unused gas: ", - // TODO: fix after near-workspaces is updated - formatGas(r.result.receipts_outcome[3]?.outcome.gas_burnt || 0) - ); - t.log( - "Total gas used: ", - formatGas( - r.result.transaction_outcome.outcome.gas_burnt + - r.result.receipts_outcome[0].outcome.gas_burnt + - r.result.receipts_outcome[1].outcome.gas_burnt + - r.result.receipts_outcome[2].outcome.gas_burnt + - // TODO: fix after near-workspaces is updated - (r.result.receipts_outcome[3]?.outcome.gas_burnt || 0) - ) - ); + logTestResults(r); + + const gasObject = generateGasObject(r); + + addTestResults("JS_promise_batch_deploy_contract_and_call", gasObject); }); test("RS promise batch deploy contract and call", async (t) => { @@ -100,8 +66,9 @@ test("RS promise batch deploy contract and call", async (t) => { let r = await bob.callRaw(callerContractRs, "deploy_contract", "", { gas: "300 Tgas", }); - // console.log(JSON.stringify(r, null, 2)); + let deployed = callerContractRs.getSubAccount("a"); + t.deepEqual(JSON.parse(Buffer.from(r.result.status.SuccessValue, "base64")), { currentAccountId: deployed.accountId, signerAccountId: bob.accountId, @@ -109,40 +76,9 @@ test("RS promise batch deploy contract and call", async (t) => { input: "abc", }); - t.log( - "Gas used to convert transaction to receipt: ", - formatGas(r.result.transaction_outcome.outcome.gas_burnt) - ); - t.log( - "Gas used to execute the receipt (actual contract call): ", - formatGas(r.result.receipts_outcome[0].outcome.gas_burnt) - ); - let map = gasBreakdown(r.result.receipts_outcome[0].outcome); - logGasBreakdown(map, t); - t.log( - "Gas used to execute the cross contract call: ", - formatGas(r.result.receipts_outcome[1].outcome.gas_burnt) - ); - map = gasBreakdown(r.result.receipts_outcome[1].outcome); - logGasBreakdown(map, t); - t.log( - "Gas used to refund unused gas for cross contract call: ", - formatGas(r.result.receipts_outcome[2].outcome.gas_burnt) - ); - t.log( - "Gas used to refund unused gas: ", - // TODO: fix after near-workspaces is updated - formatGas(r.result.receipts_outcome[3]?.outcome.gas_burnt || 0) - ); - t.log( - "Total gas used: ", - formatGas( - r.result.transaction_outcome.outcome.gas_burnt + - r.result.receipts_outcome[0].outcome.gas_burnt + - r.result.receipts_outcome[1].outcome.gas_burnt + - r.result.receipts_outcome[2].outcome.gas_burnt + - // TODO: fix after near-workspaces is updated - (r.result.receipts_outcome[3]?.outcome.gas_burnt || 0) - ) - ); + logTestResults(r); + + const gasObject = generateGasObject(r); + + addTestResults("RS_promise_batch_deploy_contract_and_call", gasObject); }); diff --git a/benchmark/__tests__/test-expensive-calc.ava.js b/benchmark/__tests__/test-expensive-calc.ava.js index 5743227f..d3cfc96e 100644 --- a/benchmark/__tests__/test-expensive-calc.ava.js +++ b/benchmark/__tests__/test-expensive-calc.ava.js @@ -1,12 +1,13 @@ import { Worker } from "near-workspaces"; import test from "ava"; -import { logGasDetail } from "./util.js"; +import { generateGasObject, logTestResults } from "./util.js"; +import { addTestResults } from "./results-store.js"; test.before(async (t) => { // Init the worker and start a Sandbox server const worker = await Worker.init(); - // Prepare sandbox for tests, create accounts, deploy contracts, etx. + // Prepare sandbox for tests, create accounts, deploy contracts, etc. const root = worker.rootAccount; // Deploy the test contract. @@ -35,14 +36,25 @@ test("JS expensive contract, iterate 100 times", async (t) => { let r = await bob.callRaw(expensiveContract, "expensive", { n: 100 }); t.is(r.result.status.SuccessValue, "LTUw"); - logGasDetail(r, t); + + logTestResults(r); + + const gasObject = generateGasObject(r, true); + + addTestResults("JS_expensive_contract_100_times", gasObject); }); test("RS expensive contract. iterate 100 times", async (t) => { const { bob, expensiveContractRs } = t.context.accounts; let r = await bob.callRaw(expensiveContractRs, "expensive", { n: 100 }); + t.is(r.result.status.SuccessValue, "LTUw"); - logGasDetail(r, t); + + logTestResults(r); + + const gasObject = generateGasObject(r, true); + + addTestResults("RS_expensive_contract_100_times", gasObject); }); test("JS expensive contract, iterate 10000 times", async (t) => { @@ -55,14 +67,25 @@ test("JS expensive contract, iterate 10000 times", async (t) => { ); t.is(r.result.status.SuccessValue, "LTUwMDA="); - logGasDetail(r, t); + + logTestResults(r); + + const gasObject = generateGasObject(r, true); + + addTestResults("JS_expensive_contract_10000_times", gasObject); }); test("RS expensive contract. iterate 10000 times", async (t) => { const { bob, expensiveContractRs } = t.context.accounts; let r = await bob.callRaw(expensiveContractRs, "expensive", { n: 10000 }); + t.is(r.result.status.SuccessValue, "LTUwMDA="); - logGasDetail(r, t); + + logTestResults(r); + + const gasObject = generateGasObject(r, true); + + addTestResults("RS_expensive_contract_10000_times", gasObject); }); test("JS expensive contract, iterate 20000 times", async (t) => { @@ -75,12 +98,23 @@ test("JS expensive contract, iterate 20000 times", async (t) => { ); t.is(r.result.status.SuccessValue, "LTEwMDAw"); - logGasDetail(r, t); + + logTestResults(r); + + const gasObject = generateGasObject(r, true); + + addTestResults("JS_expensive_contract_20000_times", gasObject); }); test("RS expensive contract. iterate 20000 times", async (t) => { const { bob, expensiveContractRs } = t.context.accounts; let r = await bob.callRaw(expensiveContractRs, "expensive", { n: 20000 }); + t.is(r.result.status.SuccessValue, "LTEwMDAw"); - logGasDetail(r, t); + + logTestResults(r); + + const gasObject = generateGasObject(r, true); + + addTestResults("RS_expensive_contract_20000_times", gasObject); }); diff --git a/benchmark/__tests__/test-highlevel-collection.ava.js b/benchmark/__tests__/test-highlevel-collection.ava.js index 70c74d3e..3f1db9e1 100644 --- a/benchmark/__tests__/test-highlevel-collection.ava.js +++ b/benchmark/__tests__/test-highlevel-collection.ava.js @@ -1,6 +1,7 @@ import { Worker } from "near-workspaces"; import test from "ava"; -import { logGasDetail } from "./util.js"; +import { generateGasObject, logTestResults } from "./util.js"; +import { addTestResults } from "./results-store.js"; test.before(async (t) => { // Init the worker and start a Sandbox server @@ -50,7 +51,11 @@ test("JS highlevel collection contract", async (t) => { }); t.is(r.result.status.SuccessValue, ""); - logGasDetail(r, t); + logTestResults(r); + + const gasObject = generateGasObject(r, true); + + addTestResults("JS_highlevel_collection_contract", gasObject); }); test("RS highlevel collection contract", async (t) => { @@ -68,5 +73,9 @@ test("RS highlevel collection contract", async (t) => { value: "d".repeat(100), }); t.is(r.result.status.SuccessValue, ""); - logGasDetail(r, t); + logTestResults(r); + + const gasObject = generateGasObject(r, true); + + addTestResults("RS_highlevel_collection_contract", gasObject); }); diff --git a/benchmark/__tests__/test-highlevel-minimal.ava.js b/benchmark/__tests__/test-highlevel-minimal.ava.js index 474dd5d0..06712193 100644 --- a/benchmark/__tests__/test-highlevel-minimal.ava.js +++ b/benchmark/__tests__/test-highlevel-minimal.ava.js @@ -1,6 +1,7 @@ import { Worker } from "near-workspaces"; import test from "ava"; -import { logGasDetail } from "./util.js"; +import { generateGasObject, logTestResults } from "./util.js"; +import { addTestResults } from "./results-store.js"; test.before(async (t) => { // Init the worker and start a Sandbox server @@ -39,7 +40,11 @@ test("JS highlevel minimal contract", async (t) => { let r = await bob.callRaw(highlevelContract, "empty", ""); t.is(r.result.status.SuccessValue, ""); - logGasDetail(r, t); + logTestResults(r); + + const gasObject = generateGasObject(r, true); + + addTestResults("JS_highlevel_minimal_contract", gasObject); }); test("RS highlevel minimal contract", async (t) => { @@ -47,5 +52,9 @@ test("RS highlevel minimal contract", async (t) => { let r = await bob.callRaw(highlevelContractRs, "empty", ""); t.is(r.result.status.SuccessValue, ""); - logGasDetail(r, t); + logTestResults(r); + + const gasObject = generateGasObject(r, true); + + addTestResults("RS_highlevel_minimal_contract", gasObject); }); diff --git a/benchmark/__tests__/test-lowlevel-api.ava.js b/benchmark/__tests__/test-lowlevel-api.ava.js index aeffa40e..7f58fa46 100644 --- a/benchmark/__tests__/test-lowlevel-api.ava.js +++ b/benchmark/__tests__/test-lowlevel-api.ava.js @@ -1,6 +1,7 @@ import { Worker } from "near-workspaces"; import test from "ava"; -import { logGasDetail } from "./util.js"; +import { generateGasObject, logTestResults } from "./util.js"; +import { addTestResults } from "./results-store.js"; test.before(async (t) => { // Init the worker and start a Sandbox server @@ -35,7 +36,11 @@ test("JS lowlevel API contract", async (t) => { let r = await bob.callRaw(lowlevelContract, "lowlevel_storage_write", ""); t.is(r.result.status.SuccessValue, ""); - logGasDetail(r, t); + logTestResults(r); + + const gasObject = generateGasObject(r, true); + + addTestResults("JS_lowlevel_API_contract", gasObject); }); test("RS lowlevel API contract", async (t) => { @@ -43,7 +48,11 @@ test("RS lowlevel API contract", async (t) => { let r = await bob.callRaw(lowlevelContractRs, "lowlevel_storage_write", ""); t.is(r.result.status.SuccessValue, ""); - logGasDetail(r, t); + logTestResults(r); + + const gasObject = generateGasObject(r, true); + + addTestResults("RS_lowlevel_API_contract", gasObject); }); test("JS lowlevel API contract, call many", async (t) => { @@ -55,5 +64,5 @@ test("JS lowlevel API contract, call many", async (t) => { ); t.is(r.result.status.SuccessValue, ""); - logGasDetail(r, t); + logTestResults(r); }); diff --git a/benchmark/__tests__/test-lowlevel-minimal.ava.js b/benchmark/__tests__/test-lowlevel-minimal.ava.js index 3549bfa0..d533a187 100644 --- a/benchmark/__tests__/test-lowlevel-minimal.ava.js +++ b/benchmark/__tests__/test-lowlevel-minimal.ava.js @@ -1,6 +1,7 @@ import { Worker } from "near-workspaces"; import test from "ava"; -import { logGasDetail } from "./util.js"; +import { generateGasObject, logTestResults } from "./util.js"; +import { addTestResults } from "./results-store.js"; test.before(async (t) => { // Init the worker and start a Sandbox server @@ -35,13 +36,21 @@ test("JS lowlevel minimal contract", async (t) => { let r = await bob.callRaw(lowlevelContract, "empty", ""); t.is(r.result.status.SuccessValue, ""); - logGasDetail(r, t); + logTestResults(r); + + const gasObject = generateGasObject(r, true); + + addTestResults("JS_lowlevel_minimal_contract", gasObject); }); test("RS lowlevel minimal contract", async (t) => { const { bob, lowlevelContractRs } = t.context.accounts; let r = await bob.callRaw(lowlevelContractRs, "empty", ""); - + t.is(r.result.status.SuccessValue, ""); - logGasDetail(r, t); + logTestResults(r); + + const gasObject = generateGasObject(r, true); + + addTestResults("RS_lowlevel_minimal_contract", gasObject); }); diff --git a/benchmark/__tests__/util.js b/benchmark/__tests__/util.js index e91d8ea6..8daf64f1 100644 --- a/benchmark/__tests__/util.js +++ b/benchmark/__tests__/util.js @@ -1,68 +1,391 @@ -// Functions consumed by the benchmark contracts tests +import json2md from "json2md"; +import fs from "fs/promises"; export function formatGas(gas) { - if (gas < 10 ** 12) { - let tGas = gas / 10 ** 12; - let roundTGas = Math.round(tGas * 100000) / 100000; - return roundTGas + "T"; - } let tGas = gas / 10 ** 12; - let roundTGas = Math.round(tGas * 100) / 100; + let roundTGas = + gas < 10 ** 12 + ? Math.round(tGas * 100000) / 100000 + : Math.round(tGas * 100) / 100; return roundTGas + "T"; } export function gasBreakdown(outcome) { - return new Map( - outcome.metadata.gas_profile.map((g) => { - return [g.cost, Number(g.gas_used)]; - }) + return outcome.metadata.gas_profile.reduce((acc, g) => { + acc[g.cost] = formatGas(Number(g.gas_used)); + return acc; + }, {}); +} + +/** + * Converts gas breakdown object to table rows. + * + * @param {Object} gasObject - The object containing gas breakdown data. + * @returns {Array} An array of objects representing table rows. + */ +function convertGasBreakdownToRows(gasObject) { + const breakdownEntries = Object.entries(gasObject.gasBreakdownForReceipt); + const breakdownRows = breakdownEntries.map(([key, value]) => ({ + Description: key, + GasUsed: value, + })); + + return [ + { + Description: "Gas Used to Convert Transaction to Receipt", + GasUsed: gasObject.gasUsedToConvertTransactionToReceipt, + }, + { + Description: "Gas Used to Execute Receipt", + GasUsed: gasObject.gasUsedToExecuteReceipt, + }, + ...breakdownRows, + { + Description: "Gas Used to Refund Unused Gas", + GasUsed: gasObject.gasUsedToRefundUnusedGas, + }, + { Description: "Total Gas Used", GasUsed: gasObject.totalGasUsed }, + ]; +} + +/** + * Formats the data into a Markdown table and logs it. + * + * @param {Array} data - The data to be formatted into a table. + */ +function logMarkdownTable(data) { + const maxDescriptionLength = Math.max( + ...data.map((row) => row.Description.length) ); + + const descriptionWidth = maxDescriptionLength + 4; + const gasWidth = 15; // Increased width for better formatting + + const header = `| ${"Description".padEnd( + descriptionWidth + )} | ${"Gas Used".padEnd(gasWidth)} |`; + const separator = `|${"-".repeat(descriptionWidth + 2)}|${"-".repeat( + gasWidth + 2 + )}|`; + + const rows = data + .map((row) => { + return `| ${row.Description.padEnd( + descriptionWidth + )} | ${row.GasUsed.padEnd(gasWidth)} |`; + }) + .join(`\n${separator}\n`); + + console.log(""); + console.log(separator); + console.log(header); + console.log(separator); + console.log(rows); + console.log(separator); } -export function logGasBreakdown(map, t) { - map.forEach((v, k) => { - t.log(" ", k, ": ", formatGas(v)); - }); +/** + * Logs the gas usage breakdown from test results in a table format. + * + * This function determines whether the test results are minimal or full based on + * the number of receipts outcomes. It then generates a gas usage object using the + * appropriate flag, converts this object into a table-friendly format, and logs + * the data in a well-formatted table. + * + * @param {Object} testResults - The test results object containing gas usage metrics. + */ +export function logTestResults(testResults) { + const isMinimal = testResults.result.receipts_outcome.length === 2; + const gasObject = generateGasObject(testResults, isMinimal); + const data = convertGasBreakdownToRows(gasObject); + logMarkdownTable(data); } -export function logGasDetail(r, t) { - t.log( - "Gas used to convert transaction to receipt: ", - formatGas(r.result.transaction_outcome.outcome.gas_burnt) +/** + * Generates a gas usage breakdown object from a test result. + * + * @param {Object} testResult - The result of a test execution, which includes transaction and receipt outcomes. + * @param {boolean} [isMinimal=false] - If true, includes only minimal gas usage data; otherwise, includes additional cross-contract call and refund data. + * @returns {Object} An object containing formatted gas usage values, including: + * - gasUsedToConvertTransactionToReceipt: Gas used to convert the transaction to a receipt. + * - gasUsedToExecuteReceipt: Gas used to execute the receipt. + * - gasBreakdownForReceipt: Formatted gas breakdown results for the receipt. + * - gasUsedToExecuteCrossContractCall: Gas used to execute any cross-contract calls (if not minimal). + * - gasUsedToRefundUnusedGasForCrossContractCall: Gas used to refund unused gas for cross-contract calls (if not minimal). + * - gasUsedToRefundUnusedGas: Gas used to refund any unused gas (if not minimal). + * - totalGasUsed: Total gas used including all relevant transactions and receipts. + */ +export function generateGasObject(testResult, isMinimal = false) { + // Initialize gas breakdown + const gasBreakdownForReceipt = gasBreakdown( + testResult.result.receipts_outcome[0].outcome ); - t.log( - "Gas used to execute the receipt (actual contract call): ", - formatGas(r.result.receipts_outcome[0].outcome.gas_burnt) + + // Common values + const gasUsedToConvertTransactionToReceipt = formatGas( + testResult.result.transaction_outcome.outcome.gas_burnt ); - let map = gasBreakdown(r.result.receipts_outcome[0].outcome); - logGasBreakdown(map, t); - t.log( - "Gas used to refund unused gas: ", - // TODO: fix after near-workspaces is updated - formatGas(r.result.receipts_outcome[1]?.outcome.gas_burnt || 0) + + const gasUsedToExecuteReceipt = formatGas( + testResult.result.receipts_outcome[0].outcome.gas_burnt ); - t.log( - "Total gas used: ", - formatGas( - r.result.transaction_outcome.outcome.gas_burnt + - r.result.receipts_outcome[0].outcome.gas_burnt + - // TODO: fix after near-workspaces is updated - (r.result.receipts_outcome[1]?.outcome.gas_burnt || 0) - ) + + // Initialize optional values + let gasUsedToExecuteCrossContractCall = undefined; + let gasUsedToRefundUnusedGasForCrossContractCall = undefined; + + let gasUsedToRefundUnusedGas = formatGas( + testResult.result.receipts_outcome[1]?.outcome.gas_burnt ?? 0 + ); + + // If not minimal, set additional values + if (!isMinimal) { + gasUsedToExecuteCrossContractCall = formatGas( + testResult.result.receipts_outcome[1]?.outcome.gas_burnt ?? 0 + ); + gasUsedToRefundUnusedGasForCrossContractCall = formatGas( + testResult.result.receipts_outcome[2]?.outcome.gas_burnt ?? 0 + ); + gasUsedToRefundUnusedGas = formatGas( + testResult.result.receipts_outcome[3]?.outcome.gas_burnt ?? 0 + ); + } + + // Calculate total gas used + const totalGasUsed = formatGas( + testResult.result.transaction_outcome.outcome.gas_burnt + + testResult.result.receipts_outcome[0].outcome.gas_burnt + + (isMinimal + ? testResult.result.receipts_outcome[1]?.outcome.gas_burnt ?? 0 + : (testResult.result.receipts_outcome[1]?.outcome.gas_burnt ?? 0) + + (testResult.result.receipts_outcome[2]?.outcome.gas_burnt ?? 0) + + (testResult.result.receipts_outcome[3]?.outcome.gas_burnt ?? 0)) + ); + + return { + gasUsedToConvertTransactionToReceipt, + gasUsedToExecuteReceipt, + gasBreakdownForReceipt, + gasUsedToExecuteCrossContractCall, + gasUsedToRefundUnusedGasForCrossContractCall, + gasUsedToRefundUnusedGas, + totalGasUsed, + }; +} + +/** + * Retrieves an existing row with the specified description from the rows array, + * or initializes a new row if none exists. + * + * @param {Array>} rows - The array of rows where each row is an array of values. + * @param {string} description - The description for the row. + * @param {string} defaultValue - The default value to initialize the row with. + * @returns {Array} - The row array for the given description. + */ +function getOrCreateRow(rows, description, defaultValue) { + let row = rows.find((r) => r[0] === description); + if (!row) { + row = [description, defaultValue, ""]; + rows.push(row); + } + return row; +} + +/** + * Updates the value at a specific index in a row with the given description. + * If the row does not exist, it will be created using getOrCreateRow. + * + * @param {Array>} rows - The array of rows where each row is an array of values. + * @param {string} description - The description for the row to update. + * @param {number} valueIndex - The index in the row where the value should be set. + * @param {string} value - The value to set in the row. + */ +function updateRow(rows, description, valueIndex, value) { + const row = getOrCreateRow(rows, description, ""); + row[valueIndex] = value; +} + +/** + * Converts JSON data into a Markdown table with a title and writes it to a .md file. + * + * @param {string} title - The title for the Markdown document (H1). + * @param {Array} data - The JSON data to be converted into a Markdown table. + * @param {string} fileName - The name of the Markdown file to be created. + * @returns {Promise} - A promise that resolves when the file is written. + */ +export async function jsonToMarkdown(title, data, fileName) { + const sortedJsonData = sortJsonData(data); + + if (typeof sortedJsonData !== "object" || sortedJsonData === null) { + throw new Error("Expected sortedJsonData to be an object."); + } + + const markdownSections = Object.entries(sortedJsonData).map( + ([name, details]) => { + const headers = ["Metric", "Rust", "JS"]; + const rows = []; + + // Gas details for Rust + const gasDetails = { + "Convert transaction to receipt": + details.gasUsedToConvertTransactionToReceipt, + "Execute the receipt (actual contract call)": + details.gasUsedToExecuteReceipt, + }; + + Object.entries(gasDetails).forEach(([description, value]) => { + if (value) { + updateRow(rows, description, 1, value); + } + }); + + // Breakdown metrics for Rust + const breakdown = details.gasBreakdownForReceipt ?? details; + Object.entries(breakdown).forEach(([metric, value]) => { + updateRow(rows, metric, 1, value); + }); + + // Find JS entry and update rows with JS values + const jsEntry = Object.entries(sortedJsonData).find( + ([key]) => key.startsWith("JS") && key.includes(name.split("_")[1]) + ); + + if (jsEntry) { + const [, jsDetails] = jsEntry; + + const jsBreakdown = jsDetails.gasBreakdownForReceipt ?? jsDetails; + Object.entries(jsBreakdown).forEach(([metric, value]) => { + updateRow(rows, metric, 2, value); + }); + + // Update specific gas used values for JS + updateRow( + rows, + "Convert transaction to receipt", + 2, + jsDetails.gasUsedToConvertTransactionToReceipt + ); + updateRow( + rows, + "Execute the receipt (actual contract call)", + 2, + jsDetails.gasUsedToExecuteReceipt + ); + } + + // Add remaining metrics + rows.push( + [ + "Gas used to refund unused gas", + details.gasUsedToRefundUnusedGas, + jsEntry ? jsEntry[1].gasUsedToRefundUnusedGas : "", + ], + [ + "Total gas used", + details.totalGasUsed, + jsEntry ? jsEntry[1].totalGasUsed : "", + ] + ); + + const filteredRows = rows.filter(([_, rustValue, jsValue]) => { + return rustValue && jsValue; + }); + + return { + h3: name, + table: { + headers, + rows: filteredRows, + }, + }; + } ); + + const markdown = json2md([ + { h1: title }, + ...filterMarkdownSections(markdownSections), + ]); + + try { + await fs.writeFile(`${fileName}.md`, markdown); + } catch (error) { + console.error(`Failed to write the file: ${error.message}`); + throw error; + } + + return markdown; } +/** + * Sorts JSON data according to a predefined order and converts it into an object. + * + * @param {Object} data - The JSON data to be sorted. + * @returns {Object} - The sorted JSON data as an object with ordered properties. + */ +function sortJsonData(data) { + const order = [ + "RS_lowlevel_API_contract", + "JS_lowlevel_API_contract", + "RS_lowlevel_minimal_contract", + "JS_lowlevel_minimal_contract", + "RS_highlevel_collection_contract", + "JS_highlevel_collection_contract", + "RS_highlevel_minimal_contract", + "JS_highlevel_minimal_contract", + "RS_promise_batch_deploy_contract_and_call", + "JS_promise_batch_deploy_contract_and_call", + "RS_expensive_contract_100_times", + "JS_expensive_contract_100_times", + "RS_expensive_contract_10000_times", + "JS_expensive_contract_10000_times", + "RS_expensive_contract_20000_times", + "JS_expensive_contract_20000_times", + ]; + + const sortedData = order.reduce((acc, key) => { + if (data[key]) { + acc[key] = data[key]; + } + return acc; + }, {}); + + return sortedData; +} + +/** + * Filters the markdownSections containing redundant data before including them in the markdown file. + * + * @param {Array} sections - The array of markdown sections data. + * @returns {Array} - The filtered markdown sections data. + */ +function filterMarkdownSections(sections) { + const rsBaseNames = new Set(); + const filteredSections = []; -export function logTotalGas(prefix = '', r, t) { + sections.forEach((section) => { + const baseName = section.h3.replace(/^RS_/, "").replace(/^JS_/, ""); + + if (section.h3.startsWith("RS_")) { + rsBaseNames.add(baseName); + filteredSections.push({ ...section, h3: baseName }); + } else if (section.h3.startsWith("JS_") && !rsBaseNames.has(baseName)) { + filteredSections.push({ ...section, h3: baseName }); + } + }); + + return filteredSections; +} + +export function logTotalGas(prefix = "", r, t) { t.log( - prefix + ' - Total gas used: ', + prefix + " - Total gas used: ", formatGas( r.result.transaction_outcome.outcome.gas_burnt + - r.result.receipts_outcome[0].outcome.gas_burnt + - (r.result.receipts_outcome[1]?.outcome.gas_burnt || 0) + r.result.receipts_outcome[0].outcome.gas_burnt + + (r.result.receipts_outcome[1]?.outcome.gas_burnt || 0) ) ); } export function randomInt(max) { return Math.floor(Math.random() * max); -} \ No newline at end of file +} diff --git a/benchmark/package.json b/benchmark/package.json index 1ed0f72d..ddd2ed4e 100644 --- a/benchmark/package.json +++ b/benchmark/package.json @@ -18,23 +18,27 @@ "build:unordered-set": "near-sdk-js build src/unordered-set.js build/unordered-set.wasm", "build:vector": "near-sdk-js build src/vector.js build/vector.wasm", "test": "ava", + "test:with-report": "GENERATE_REPORT=true ava && node src/generate-report.js", "test:lowlevel-minimal": "ava __tests__/test-lowlevel-minimal.ava.js", "test:highlevel-minimal": "ava __tests__/test-highlevel-minimal.ava.js", "test:lowlevel-api": "ava __tests__/test-lowlevel-api.ava.js", "test:highlevel-collection": "ava __tests__/test-highlevel-collection.ava.js", "test:expensive-calc": "ava __tests__/test-expensive-calc.ava.js", "test:deploy-contract": "ava __tests__/test-deploy-contract.ava.js", - "test:collections": "ava __tests__/test-collections-performance.ava.js" + "test:collections": "ava __tests__/test-collections-performance.ava.js", + "calculate-file-sizes": "WORKING_DIR=$(pwd) pnpm --filter shared-scripts run calculate-file-sizes" }, "author": "Near Inc ", "license": "Apache-2.0", "devDependencies": { "ava": "4.3.3", "near-workspaces": "4.0.0", - "npm-run-all": "4.1.5" + "npm-run-all": "4.1.5", + "json2md": "2.0.1" }, "dependencies": { - "typescript": "4.7.4", - "near-sdk-js": "workspace:*" + "near-sdk-js": "workspace:*", + "typescript": "4.7.4" } } + diff --git a/benchmark/src/generate-report.js b/benchmark/src/generate-report.js new file mode 100644 index 00000000..6adc922e --- /dev/null +++ b/benchmark/src/generate-report.js @@ -0,0 +1,33 @@ +import path from "path"; +import fs from "fs/promises"; +import { fileURLToPath } from "url"; +import { jsonToMarkdown } from "../__tests__/util.js"; + +const __filename = fileURLToPath(import.meta.url); +const __dirname = path.dirname(__filename); + +const jsonFilePath = path.resolve( + __dirname, + "..", + "temp-all-test-results.json" +); + +async function generateReport() { + try { + const jsonData = JSON.parse(await fs.readFile(jsonFilePath, "utf-8")); + + await jsonToMarkdown( + "Tests Gas Consumption Comparison", + jsonData, + "TESTS-GAS-CONSUMPTION-COMPARISON" + ); + + await fs.unlink(jsonFilePath); + console.log("Report generated and JSON file deleted successfully."); + } catch (error) { + console.error("Error generating report:", error); + process.exit(1); + } +} + +generateReport(); diff --git a/examples/.gitignore b/examples/.gitignore index 4c17fe91..d24d084d 100644 --- a/examples/.gitignore +++ b/examples/.gitignore @@ -1,3 +1,3 @@ build node_modules -file-sizes.json \ No newline at end of file +file-sizes.json diff --git a/examples/package.json b/examples/package.json index f3e82252..336138c2 100644 --- a/examples/package.json +++ b/examples/package.json @@ -60,7 +60,8 @@ "test:status-message-serialize-err": "ava __tests__/test-status-message-serialize-err.ava.js", "test:status-message-deserialize-err": "ava __tests__/test-status-message-deserialize-err.ava.js", "test:status-deserialize-class": "ava __tests__/test-status-deserialize-class.ava.js", - "test:basic-updates": "ava __tests__/test-basic-updates.ava.js" + "test:basic-updates": "ava __tests__/test-basic-updates.ava.js", + "calculate-file-sizes": "WORKING_DIR=$(pwd) pnpm --filter shared-scripts run calculate-file-sizes" }, "author": "Near Inc ", "license": "Apache-2.0", @@ -68,13 +69,15 @@ "lodash-es": "4.17.21", "near-contract-standards": "workspace:*", "near-sdk-js": "workspace:*", - "typescript": "4.7.4", - "borsh": "1.0.0" + "borsh": "1.0.0", + "typescript": "4.7.4" }, "devDependencies": { "@types/lodash-es": "4.17.12", "ava": "4.3.3", "near-workspaces": "4.0.0", - "npm-run-all": "4.1.5" + "npm-run-all": "4.1.5", + "typescript": "4.7.4" } } + diff --git a/packages/near-contract-standards/.gitignore b/packages/near-contract-standards/.gitignore index 4c17fe91..d24d084d 100644 --- a/packages/near-contract-standards/.gitignore +++ b/packages/near-contract-standards/.gitignore @@ -1,3 +1,3 @@ build node_modules -file-sizes.json \ No newline at end of file +file-sizes.json diff --git a/packages/shared-scripts/package.json b/packages/shared-scripts/package.json new file mode 100644 index 00000000..beb71543 --- /dev/null +++ b/packages/shared-scripts/package.json @@ -0,0 +1,12 @@ +{ + "name": "shared-scripts", + "version": "1.0.0", + "description": "Package for shared scripts between the repos", + "type": "module", + "scripts": { + "calculate-file-sizes": "node src/calculate-file-sizes.js" + }, + "devDependencies": { + "json2md": "2.0.1" + } +} diff --git a/packages/shared-scripts/src/calculate-file-sizes.js b/packages/shared-scripts/src/calculate-file-sizes.js new file mode 100644 index 00000000..4964461f --- /dev/null +++ b/packages/shared-scripts/src/calculate-file-sizes.js @@ -0,0 +1,158 @@ +import fs from "fs/promises"; +import path from "path"; +import json2md from "json2md"; + +// Get directory and flags from command line arguments +const args = process.argv.slice(2); +const relativeDir = args[0]; + +const isBefore = args.includes("--before"); +const isAfter = args.includes("--after"); +const isHelp = args.includes("--help"); + +if (!relativeDir) { + console.log("Please provide a directory path as an argument."); + process.exit(1); +} + +if (!isBefore && !isAfter) { + console.log("Please specify either --before or --after flag."); + process.exit(1); +} + +if (isBefore && isAfter) { + console.log("Please specify either --before or --after, not both."); + process.exit(1); +} + +if (isHelp) { + console.log(`Usage: node script.js <${relativeDir}> [--before|--after]`); + process.exit(0); +} + +// Get the working directory from the environment variable +const scriptDir = process.env.WORKING_DIR ?? process.cwd(); + +const dir = path.resolve(scriptDir, relativeDir); +const jsonFilePath = path.join(scriptDir, "file-sizes.json"); + +const calculateFileSizes = async () => { + try { + // Check if the directory exists + await fs.access(dir); + + const files = await fs.readdir(dir); + + let fileSizes = { beforeOptimization: {}, afterOptimization: {} }; + + // Check if the JSON file already exists and load data + try { + const data = await fs.readFile(jsonFilePath, "utf-8"); + fileSizes = JSON.parse(data); + } catch { + // If file doesn't exist, initialize fileSizes as default + } + + // If the --after flag is used, ensure beforeOptimization data exists + if (isAfter && Object.keys(fileSizes.beforeOptimization).length === 0) { + console.log( + "No data found before optimization. Please run the script with --before first." + ); + process.exit(1); + } + + // Filter .wasm files and calculate sizes + const wasmFiles = files.filter((file) => path.extname(file) === ".wasm"); + + // Wait for all file size calculations to complete + await Promise.all( + wasmFiles.map(async (file) => { + const filePath = path.join(dir, file); + const stats = await fs.stat(filePath); + + const fileSizeInKB = (stats.size / 1024).toFixed(2); + + // Add file size to the appropriate section + if (isBefore) { + fileSizes.beforeOptimization[file] = `${fileSizeInKB} KB`; + } else if (isAfter) { + fileSizes.afterOptimization[file] = `${fileSizeInKB} KB`; + } + }) + ); + + // Write the result to the JSON file + await fs.writeFile(jsonFilePath, JSON.stringify(fileSizes, null, 2)); + + console.log(`File sizes saved to ${jsonFilePath}`); + + const updatedData = await fs.readFile(jsonFilePath, "utf-8"); + + const updatedFileSizes = JSON.parse(updatedData); + + if ( + Object.keys(updatedFileSizes.beforeOptimization).length && + Object.keys(updatedFileSizes.afterOptimization).length + ) { + // Generate Markdown file + try { + await generateMarkdown(scriptDir, fileSizes); + } catch (err) { + console.error(`Error generating Markdown: ${err.message}`); + } + } + } catch (err) { + console.error(`Error: ${err.message}`); + } +}; + +// Function to generate the Markdown file +const generateMarkdown = async (outputDir, data) => { + const folderName = path.basename(outputDir).toUpperCase(); + + const mdContent = { + h1: `NEAR-SDK-JS ${folderName}`, + h3: "WASM File Size Comparison Before and After Optimization", + table: { + headers: ["File Name", "Before Opt (KB)", "After Opt (KB)", "% Diff"], + rows: Object.keys(data.beforeOptimization).map((file) => { + const beforeSize = data.beforeOptimization[file] || "N/A"; + const afterSize = data.afterOptimization[file] || "N/A"; + return [ + file, + beforeSize, + afterSize, + afterSize !== "N/A" + ? calculatePercentageDifference(beforeSize, afterSize) + : "N/A", + ]; + }), + }, + }; + + // Convert JSON to markdown + const markdown = json2md(mdContent); + + // Write markdown to a file + const filePath = path.join(outputDir, "WASM-FILE-SIZE-COMPARISON.md"); + await fs.writeFile(filePath, markdown); + + console.log(`Markdown file has been saved to ${filePath}`); + await fs.unlink(path.join(outputDir, "file-sizes.json")); +}; + +// Function to calculate percentage difference +const calculatePercentageDifference = (beforeSize, afterSize) => { + const beforeSizeNum = parseFloat(beforeSize); + const afterSizeNum = parseFloat(afterSize); + + if (isNaN(beforeSizeNum) || isNaN(afterSizeNum)) { + return "N/A"; + } + + return ( + (((beforeSizeNum - afterSizeNum) / beforeSizeNum) * 100).toFixed(2) + "%" + ); +}; + +calculateFileSizes(); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 8cd0f7f4..26128e0c 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -30,6 +30,9 @@ importers: ava: specifier: 4.3.3 version: 4.3.3 + json2md: + specifier: 2.0.1 + version: 2.0.1 near-workspaces: specifier: 4.0.0 version: 4.0.0 @@ -187,6 +190,12 @@ importers: specifier: 2.8.8 version: 2.8.8 + packages/shared-scripts: + devDependencies: + json2md: + specifier: 2.0.1 + version: 2.0.1 + tests: dependencies: near-sdk-js: @@ -212,98 +221,98 @@ packages: resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} engines: {node: '>=6.0.0'} - '@babel/code-frame@7.24.7': - resolution: {integrity: sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA==} + '@babel/code-frame@7.25.7': + resolution: {integrity: sha512-0xZJFNE5XMpENsgfHYTw8FbX4kv53mFLn2i3XPoq69LyhYSCBJtitaHx9QnsVTrsogI4Z3+HtEfZ2/GFPOtf5g==} engines: {node: '>=6.9.0'} - '@babel/compat-data@7.25.2': - resolution: {integrity: sha512-bYcppcpKBvX4znYaPEeFau03bp89ShqNMLs+rmdptMw+heSZh9+z84d2YG+K7cYLbWwzdjtDoW/uqZmPjulClQ==} + '@babel/compat-data@7.25.7': + resolution: {integrity: sha512-9ickoLz+hcXCeh7jrcin+/SLWm+GkxE2kTvoYyp38p4WkdFXfQJxDFGWp/YHjiKLPx06z2A7W8XKuqbReXDzsw==} engines: {node: '>=6.9.0'} '@babel/core@7.23.5': resolution: {integrity: sha512-Cwc2XjUrG4ilcfOw4wBAK+enbdgwAcAJCfGUItPBKR7Mjw4aEfAFYrLxeRp4jWgtNIKn3n2AlBOfwwafl+42/g==} engines: {node: '>=6.9.0'} - '@babel/generator@7.25.0': - resolution: {integrity: sha512-3LEEcj3PVW8pW2R1SR1M89g/qrYk/m/mB/tLqn7dn4sbBUQyTqnlod+II2U4dqiGtUmkcnAmkMDralTFZttRiw==} + '@babel/generator@7.25.7': + resolution: {integrity: sha512-5Dqpl5fyV9pIAD62yK9P7fcA768uVPUyrQmqpqstHWgMma4feF1x/oFysBCVZLY5wJ2GkMUCdsNDnGZrPoR6rA==} engines: {node: '>=6.9.0'} - '@babel/helper-annotate-as-pure@7.24.7': - resolution: {integrity: sha512-BaDeOonYvhdKw+JoMVkAixAAJzG2jVPIwWoKBPdYuY9b452e2rPuI9QPYh3KpofZ3pW2akOmwZLOiOsHMiqRAg==} + '@babel/helper-annotate-as-pure@7.25.7': + resolution: {integrity: sha512-4xwU8StnqnlIhhioZf1tqnVWeQ9pvH/ujS8hRfw/WOza+/a+1qv69BWNy+oY231maTCWgKWhfBU7kDpsds6zAA==} engines: {node: '>=6.9.0'} - '@babel/helper-compilation-targets@7.25.2': - resolution: {integrity: sha512-U2U5LsSaZ7TAt3cfaymQ8WHh0pxvdHoEk6HVpaexxixjyEquMh0L0YNJNM6CTGKMXV1iksi0iZkGw4AcFkPaaw==} + '@babel/helper-compilation-targets@7.25.7': + resolution: {integrity: sha512-DniTEax0sv6isaw6qSQSfV4gVRNtw2rte8HHM45t9ZR0xILaufBRNkpMifCRiAPyvL4ACD6v0gfCwCmtOQaV4A==} engines: {node: '>=6.9.0'} - '@babel/helper-create-class-features-plugin@7.25.0': - resolution: {integrity: sha512-GYM6BxeQsETc9mnct+nIIpf63SAyzvyYN7UB/IlTyd+MBg06afFGp0mIeUqGyWgS2mxad6vqbMrHVlaL3m70sQ==} + '@babel/helper-create-class-features-plugin@7.25.7': + resolution: {integrity: sha512-bD4WQhbkx80mAyj/WCm4ZHcF4rDxkoLFO6ph8/5/mQ3z4vAzltQXAmbc7GvVJx5H+lk5Mi5EmbTeox5nMGCsbw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 - '@babel/helper-member-expression-to-functions@7.24.8': - resolution: {integrity: sha512-LABppdt+Lp/RlBxqrh4qgf1oEH/WxdzQNDJIu5gC/W1GyvPVrOBiItmmM8wan2fm4oYqFuFfkXmlGpLQhPY8CA==} + '@babel/helper-member-expression-to-functions@7.25.7': + resolution: {integrity: sha512-O31Ssjd5K6lPbTX9AAYpSKrZmLeagt9uwschJd+Ixo6QiRyfpvgtVQp8qrDR9UNFjZ8+DO34ZkdrN+BnPXemeA==} engines: {node: '>=6.9.0'} - '@babel/helper-module-imports@7.24.7': - resolution: {integrity: sha512-8AyH3C+74cgCVVXow/myrynrAGv+nTVg5vKu2nZph9x7RcRwzmh0VFallJuFTZ9mx6u4eSdXZfcOzSqTUm0HCA==} + '@babel/helper-module-imports@7.25.7': + resolution: {integrity: sha512-o0xCgpNmRohmnoWKQ0Ij8IdddjyBFE4T2kagL/x6M3+4zUgc+4qTOUBoNe4XxDskt1HPKO007ZPiMgLDq2s7Kw==} engines: {node: '>=6.9.0'} - '@babel/helper-module-transforms@7.25.2': - resolution: {integrity: sha512-BjyRAbix6j/wv83ftcVJmBt72QtHI56C7JXZoG2xATiLpmoC7dpd8WnkikExHDVPpi/3qCmO6WY1EaXOluiecQ==} + '@babel/helper-module-transforms@7.25.7': + resolution: {integrity: sha512-k/6f8dKG3yDz/qCwSM+RKovjMix563SLxQFo0UhRNo239SP6n9u5/eLtKD6EAjwta2JHJ49CsD8pms2HdNiMMQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 - '@babel/helper-optimise-call-expression@7.24.7': - resolution: {integrity: sha512-jKiTsW2xmWwxT1ixIdfXUZp+P5yURx2suzLZr5Hi64rURpDYdMW0pv+Uf17EYk2Rd428Lx4tLsnjGJzYKDM/6A==} + '@babel/helper-optimise-call-expression@7.25.7': + resolution: {integrity: sha512-VAwcwuYhv/AT+Vfr28c9y6SHzTan1ryqrydSTFGjU0uDJHw3uZ+PduI8plCLkRsDnqK2DMEDmwrOQRsK/Ykjng==} engines: {node: '>=6.9.0'} - '@babel/helper-plugin-utils@7.24.8': - resolution: {integrity: sha512-FFWx5142D8h2Mgr/iPVGH5G7w6jDn4jUSpZTyDnQO0Yn7Ks2Kuz6Pci8H6MPCoUJegd/UZQ3tAvfLCxQSnWWwg==} + '@babel/helper-plugin-utils@7.25.7': + resolution: {integrity: sha512-eaPZai0PiqCi09pPs3pAFfl/zYgGaE6IdXtYvmf0qlcDTd3WCtO7JWCcRd64e0EQrcYgiHibEZnOGsSY4QSgaw==} engines: {node: '>=6.9.0'} - '@babel/helper-replace-supers@7.25.0': - resolution: {integrity: sha512-q688zIvQVYtZu+i2PsdIu/uWGRpfxzr5WESsfpShfZECkO+d2o+WROWezCi/Q6kJ0tfPa5+pUGUlfx2HhrA3Bg==} + '@babel/helper-replace-supers@7.25.7': + resolution: {integrity: sha512-iy8JhqlUW9PtZkd4pHM96v6BdJ66Ba9yWSE4z0W4TvSZwLBPkyDsiIU3ENe4SmrzRBs76F7rQXTy1lYC49n6Lw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 - '@babel/helper-simple-access@7.24.7': - resolution: {integrity: sha512-zBAIvbCMh5Ts+b86r/CjU+4XGYIs+R1j951gxI3KmmxBMhCg4oQMsv6ZXQ64XOm/cvzfU1FmoCyt6+owc5QMYg==} + '@babel/helper-simple-access@7.25.7': + resolution: {integrity: sha512-FPGAkJmyoChQeM+ruBGIDyrT2tKfZJO8NcxdC+CWNJi7N8/rZpSxK7yvBJ5O/nF1gfu5KzN7VKG3YVSLFfRSxQ==} engines: {node: '>=6.9.0'} - '@babel/helper-skip-transparent-expression-wrappers@7.24.7': - resolution: {integrity: sha512-IO+DLT3LQUElMbpzlatRASEyQtfhSE0+m465v++3jyyXeBTBUjtVZg28/gHeV5mrTJqvEKhKroBGAvhW+qPHiQ==} + '@babel/helper-skip-transparent-expression-wrappers@7.25.7': + resolution: {integrity: sha512-pPbNbchZBkPMD50K0p3JGcFMNLVUCuU/ABybm/PGNj4JiHrpmNyqqCphBk4i19xXtNV0JhldQJJtbSW5aUvbyA==} engines: {node: '>=6.9.0'} '@babel/helper-split-export-declaration@7.24.7': resolution: {integrity: sha512-oy5V7pD+UvfkEATUKvIjvIAH/xCzfsFVw7ygW2SI6NClZzquT+mwdTfgfdbUiceh6iQO0CHtCPsyze/MZ2YbAA==} engines: {node: '>=6.9.0'} - '@babel/helper-string-parser@7.24.8': - resolution: {integrity: sha512-pO9KhhRcuUyGnJWwyEgnRJTSIZHiT+vMD0kPeD+so0l7mxkMT19g3pjY9GTnHySck/hDzq+dtW/4VgnMkippsQ==} + '@babel/helper-string-parser@7.25.7': + resolution: {integrity: sha512-CbkjYdsJNHFk8uqpEkpCvRs3YRp9tY6FmFY7wLMSYuGYkrdUi7r2lc4/wqsvlHoMznX3WJ9IP8giGPq68T/Y6g==} engines: {node: '>=6.9.0'} - '@babel/helper-validator-identifier@7.24.7': - resolution: {integrity: sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==} + '@babel/helper-validator-identifier@7.25.7': + resolution: {integrity: sha512-AM6TzwYqGChO45oiuPqwL2t20/HdMC1rTPAesnBCgPCSF1x3oN9MVUwQV2iyz4xqWrctwK5RNC8LV22kaQCNYg==} engines: {node: '>=6.9.0'} - '@babel/helper-validator-option@7.24.8': - resolution: {integrity: sha512-xb8t9tD1MHLungh/AIoWYN+gVHaB9kwlu8gffXGSt3FFEIT7RjS+xWbc2vUD1UTZdIpKj/ab3rdqJ7ufngyi2Q==} + '@babel/helper-validator-option@7.25.7': + resolution: {integrity: sha512-ytbPLsm+GjArDYXJ8Ydr1c/KJuutjF2besPNbIZnZ6MKUxi/uTA22t2ymmA4WFjZFpjiAMO0xuuJPqK2nvDVfQ==} engines: {node: '>=6.9.0'} - '@babel/helpers@7.25.0': - resolution: {integrity: sha512-MjgLZ42aCm0oGjJj8CtSM3DB8NOOf8h2l7DCTePJs29u+v7yO/RBX9nShlKMgFnRks/Q4tBAe7Hxnov9VkGwLw==} + '@babel/helpers@7.25.7': + resolution: {integrity: sha512-Sv6pASx7Esm38KQpF/U/OXLwPPrdGHNKoeblRxgZRLXnAtnkEe4ptJPDtAZM7fBLadbc1Q07kQpSiGQ0Jg6tRA==} engines: {node: '>=6.9.0'} - '@babel/highlight@7.24.7': - resolution: {integrity: sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw==} + '@babel/highlight@7.25.7': + resolution: {integrity: sha512-iYyACpW3iW8Fw+ZybQK+drQre+ns/tKpXbNESfrhNnPLIklLbXr7MYJ6gPEd0iETGLOK+SxMjVvKb/ffmk+FEw==} engines: {node: '>=6.9.0'} - '@babel/parser@7.25.3': - resolution: {integrity: sha512-iLTJKDbJ4hMvFPgQwwsVoxtHyWpKKPBrxkANrSYewDPaPpT5py5yeVkgPIJ7XYXhndxJpaA3PyALSXQ7u8e/Dw==} + '@babel/parser@7.25.7': + resolution: {integrity: sha512-aZn7ETtQsjjGG5HruveUK06cU3Hljuhd9Iojm4M8WWv3wLE6OkE5PWbDUkItmMgegmccaITudyuW5RPYrYlgWw==} engines: {node: '>=6.0.0'} hasBin: true @@ -313,32 +322,32 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-syntax-decorators@7.24.7': - resolution: {integrity: sha512-Ui4uLJJrRV1lb38zg1yYTmRKmiZLiftDEvZN2iq3kd9kUFU+PttmzTbAFC2ucRk/XJmtek6G23gPsuZbhrT8fQ==} + '@babel/plugin-syntax-decorators@7.25.7': + resolution: {integrity: sha512-oXduHo642ZhstLVYTe2z2GSJIruU0c/W3/Ghr6A5yGMsVrvdnxO1z+3pbTcT7f3/Clnt+1z8D/w1r1f1SHaCHw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-syntax-jsx@7.24.7': - resolution: {integrity: sha512-6ddciUPe/mpMnOKv/U+RSd2vvVy+Yw/JfBB0ZHYjEZt9NLHmCUylNYlsbqCCS1Bffjlb0fCwC9Vqz+sBz6PsiQ==} + '@babel/plugin-syntax-jsx@7.25.7': + resolution: {integrity: sha512-ruZOnKO+ajVL/MVx+PwNBPOkrnXTXoWMtte1MBpegfCArhqOe3Bj52avVj1huLLxNKYKXYaSxZ2F+woK1ekXfw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-syntax-typescript@7.24.7': - resolution: {integrity: sha512-c/+fVeJBB0FeKsFvwytYiUD+LBvhHjGSI0g446PRGdSVGZLRNArBUno2PETbAly3tpiNAQR5XaZ+JslxkotsbA==} + '@babel/plugin-syntax-typescript@7.25.7': + resolution: {integrity: sha512-rR+5FDjpCHqqZN2bzZm18bVYGaejGq5ZkpVCJLXor/+zlSrSoc4KWcHI0URVWjl/68Dyr1uwZUz/1njycEAv9g==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-modules-commonjs@7.24.8': - resolution: {integrity: sha512-WHsk9H8XxRs3JXKWFiqtQebdh9b/pTk4EgueygFzYlTKAg0Ud985mSevdNjdXdFBATSKVJGQXP1tv6aGbssLKA==} + '@babel/plugin-transform-modules-commonjs@7.25.7': + resolution: {integrity: sha512-L9Gcahi0kKFYXvweO6n0wc3ZG1ChpSFdgG+eV1WYZ3/dGbJK7vvk91FgGgak8YwRgrCuihF8tE/Xg07EkL5COg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-typescript@7.25.2': - resolution: {integrity: sha512-lBwRvjSmqiMYe/pS0+1gggjJleUJi7NzjvQ1Fkqtt69hBa/0t1YuW/MLQMAPixfwaQOHUXsd6jeU3Z+vdGv3+A==} + '@babel/plugin-transform-typescript@7.25.7': + resolution: {integrity: sha512-VKlgy2vBzj8AmEzunocMun2fF06bsSWV+FvVXohtL6FGve/+L217qhHxRTVGHEDO/YR8IANcjzgJsd04J8ge5Q==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -349,20 +358,20 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/template@7.25.0': - resolution: {integrity: sha512-aOOgh1/5XzKvg1jvVz7AVrx2piJ2XBi227DHmbY6y+bM9H2FlN+IfecYu4Xl0cNiiVejlsCri89LUsbj8vJD9Q==} + '@babel/template@7.25.7': + resolution: {integrity: sha512-wRwtAgI3bAS+JGU2upWNL9lSlDcRCqD05BZ1n3X2ONLH1WilFP6O1otQjeMK/1g0pvYcXC7b/qVUB1keofjtZA==} engines: {node: '>=6.9.0'} - '@babel/traverse@7.25.3': - resolution: {integrity: sha512-HefgyP1x754oGCsKmV5reSmtV7IXj/kpaE1XYY+D9G5PvKKoFfSbiS4M77MdjuwlZKDIKFCffq9rPU+H/s3ZdQ==} + '@babel/traverse@7.25.7': + resolution: {integrity: sha512-jatJPT1Zjqvh/1FyJs6qAHL+Dzb7sTb+xr7Q+gM1b+1oBsMsQQ4FkVKb6dFlJvLlVssqkRzV05Jzervt9yhnzg==} engines: {node: '>=6.9.0'} '@babel/types@7.23.5': resolution: {integrity: sha512-ON5kSOJwVO6xXVRTvOI0eOnWe7VdUcIpsovGo9U/Br4Ie4UVFQTboO2cYnDhAGU6Fp+UxSiT+pMft0SMHfuq6w==} engines: {node: '>=6.9.0'} - '@babel/types@7.25.2': - resolution: {integrity: sha512-YTnYtra7W9e6/oAZEHj0bJehPRUlLH9/fbpT5LfB0NhQXyALCRkRs3zH9v07IYhkgpqX6Z78FnuccZr/l4Fs4Q==} + '@babel/types@7.25.7': + resolution: {integrity: sha512-vwIVdXG+j+FOpkwqHRcBgHLYNL7XMkufrlaFvL9o6Ai9sJn9+PdyIL5qa0XzTZw084c+u9LOls53eoZWP/W5WQ==} engines: {node: '>=6.9.0'} '@cspotcode/source-map-support@0.8.1': @@ -375,8 +384,8 @@ packages: peerDependencies: eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 - '@eslint-community/regexpp@4.11.0': - resolution: {integrity: sha512-G/M/tIiMrTAxEWRfLfQJMmGNX28IxBg4PBz8XqQhqUHLFI6TL2htpIB1iQCj144V5ee/JaKyT9/WZ0MGZWfA7A==} + '@eslint-community/regexpp@4.11.1': + resolution: {integrity: sha512-m4DVN9ZqskZoLU5GlWZadwDnYo3vAEydiUayB9widCl9ffWx2IvPnp6n3on5rJmziJSw9Bv+Z3ChDVdMwXCY8Q==} engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} '@eslint/eslintrc@2.1.4': @@ -579,11 +588,11 @@ packages: '@types/lodash-es@4.17.12': resolution: {integrity: sha512-0NgftHUcV4v34VhXm8QBSftKVXtbkBG3ViCjs6+eJ5a6y6Mi/jiFGPc1sC7QK+9BFhWrURE3EOggmWaSxL9OzQ==} - '@types/lodash@4.17.7': - resolution: {integrity: sha512-8wTvZawATi/lsmNu10/j2hk1KEP0IvjubqPE3cu1Xz7xfXXt5oCq3SNUz4fMIP4XGF9Ky+Ue2tBA3hcS7LSBlA==} + '@types/lodash@4.17.10': + resolution: {integrity: sha512-YpS0zzoduEhuOWjAotS6A5AVCva7X4lVlYLF0FYHAY9sdraBfnatttHItlWeZdGhuEkf+OzMNg2ZYAx8t+52uQ==} - '@types/node@16.18.105': - resolution: {integrity: sha512-w2d0Z9yMk07uH3+Cx0N8lqFyi3yjXZxlbYappPj+AsOlT02OyxyiuNoNHdGt6EuiSm8Wtgp2YV7vWg+GMFrvFA==} + '@types/node@16.18.113': + resolution: {integrity: sha512-4jHxcEzSXpF1cBNxogs5FVbVSFSKo50sFCn7Xg7vmjJTbWFWgeuHW3QnoINlfmfG++MFR/q97RZE5RQXKeT+jg==} '@types/node@17.0.45': resolution: {integrity: sha512-w+tIMs3rq2afQdsPJlODhoUEKzFP1ayaoyl1CcnwtIlsVe7K7bA1NGm4s3PraqTLlXnbIN84zuBlxBWo1u9BLw==} @@ -670,8 +679,8 @@ packages: peerDependencies: acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 - acorn-walk@8.3.3: - resolution: {integrity: sha512-MxXdReSRhGO7VlFe1bRG/oI7/mdLV9B9JJT0N8vZOhF7gFRR5l3M8W9G8JxmKV+JC5mGqJ0QvqfSOLsCPa4nUw==} + acorn-walk@8.3.4: + resolution: {integrity: sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==} engines: {node: '>=0.4.0'} acorn@8.12.1: @@ -705,8 +714,8 @@ packages: resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} engines: {node: '>=8'} - ansi-regex@6.0.1: - resolution: {integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==} + ansi-regex@6.1.0: + resolution: {integrity: sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==} engines: {node: '>=12'} ansi-sequence-parser@1.1.1: @@ -821,8 +830,8 @@ packages: resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} engines: {node: '>=8'} - browserslist@4.23.3: - resolution: {integrity: sha512-btwCFJVjI4YWDNfau8RhZ+B1Q/VLoUITrm3RlP6y1tYGWIOa+InuYiRGXUBXo8nA1qKmHMyLB/iVQg5TT4eFoA==} + browserslist@4.24.0: + resolution: {integrity: sha512-Rmb62sR1Zpjql25eSanFGEhAxcFwfA1K0GuQcLoaJBAcENegrQut3hYdhXFF1obQfiDyqIW/cLM5HSJ/9k884A==} engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true @@ -856,8 +865,8 @@ packages: resolution: {integrity: sha512-kfzR4zzQtAE9PC7CzZsjl3aBNbXWuXiSeOCdLcPpBfGW8YuCqQHcRPFDbr/BPVmd3EEPVpuFzLyuT/cUhPr4OQ==} engines: {node: '>=12.20'} - caniuse-lite@1.0.30001651: - resolution: {integrity: sha512-9Cf+Xv1jJNe1xPZLGuUXLNkE1BoDkqRqYyFJ9TDYSqhduqA4hu4oR9HluGoWYQC/aj8WHjsGVV+bwkh0+tegRg==} + caniuse-lite@1.0.30001667: + resolution: {integrity: sha512-7LTwJjcRkzKFmtqGsibMeuXmvFDfZq/nzIjnmgCGzKKRVzjD72selLDK1oPF/Oxzmt4fNcPvTDvGqSDG4tCALw==} cbor@8.1.0: resolution: {integrity: sha512-DwGjNW9omn6EwP70aXsn7FQJx5kO12tX0bZkaTjzdVFM6/7nhA4t0EENocKGx6D2Bch9PE2KzCUf5SceBdeijg==} @@ -991,8 +1000,8 @@ packages: resolution: {integrity: sha512-uqCUKXE5q1PNBXjPqvwhwJf9SwMoAHBgWJ6DcrnS5o+W2JOiIILl0JEdVD8SGujrNS02GGxgwAg2PN2zONgtjg==} engines: {node: '>=6'} - debug@4.3.6: - resolution: {integrity: sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg==} + debug@4.3.7: + resolution: {integrity: sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==} engines: {node: '>=6.0'} peerDependencies: supports-color: '*' @@ -1054,8 +1063,8 @@ packages: eastasianwidth@0.2.0: resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} - electron-to-chromium@1.5.8: - resolution: {integrity: sha512-4Nx0gP2tPNBLTrFxBMHpkQbtn2hidPVr/+/FTtcCiBYTucqc70zRyVZiOLj17Ui3wTO7SQ1/N+hkHYzJjBzt6A==} + electron-to-chromium@1.5.33: + resolution: {integrity: sha512-+cYTcFB1QqD4j4LegwLfpCNxifb6dDFUAwk6RsLusCwIaZI6or2f+q8rs5tTB2YC53HhOlIbEaqHMAAC8IOIwA==} emittery@0.11.0: resolution: {integrity: sha512-S/7tzL6v5i+4iJd627Nhv9cLFIo5weAIlGccqJFpnBoDB8U1TF2k5tez4J/QNuxyyhWuFqHg1L84Kd3m7iXg6g==} @@ -1097,8 +1106,8 @@ packages: resolution: {integrity: sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==} engines: {node: '>= 0.4'} - escalade@3.1.2: - resolution: {integrity: sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==} + escalade@3.2.0: + resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} engines: {node: '>=6'} escape-string-regexp@1.0.5: @@ -1391,6 +1400,9 @@ packages: resolution: {integrity: sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg==} engines: {node: '>=12'} + indento@1.1.13: + resolution: {integrity: sha512-YZWk3mreBEM7sBPddsiQnW9Z8SGg/gNpFfscJq00HCDS7pxcQWWWMSVKJU7YkTRyDu1Zv2s8zaK8gQWKmCXHlg==} + inflight@1.0.6: resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. @@ -1435,8 +1447,8 @@ packages: resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} engines: {node: '>= 0.4'} - is-core-module@2.15.0: - resolution: {integrity: sha512-Dd+Lb2/zvk9SKy1TGCt1wFJFo/MWBPMX5x7KcvLajWTGuomczdQX61PvY5yK6SVACwpoexWo81IfFyoKY2QnTA==} + is-core-module@2.15.1: + resolution: {integrity: sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ==} engines: {node: '>= 0.4'} is-data-view@1.0.1: @@ -1550,9 +1562,9 @@ packages: resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} hasBin: true - jsesc@2.5.2: - resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==} - engines: {node: '>=4'} + jsesc@3.0.2: + resolution: {integrity: sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==} + engines: {node: '>=6'} hasBin: true json-buffer@3.0.1: @@ -1573,6 +1585,9 @@ packages: json-stable-stringify-without-jsonify@1.0.1: resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} + json2md@2.0.1: + resolution: {integrity: sha512-VbwmZ83qmUfKBS2pUOHlzNKEZFPBeJSbzEok3trMYyboZUgdHNn1XZfc1uT8UZs1GHCrmRUBXCfqw4YmmQuOhw==} + json5@2.2.3: resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} engines: {node: '>=6'} @@ -1668,8 +1683,8 @@ packages: resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} engines: {node: '>= 8'} - micromatch@4.0.7: - resolution: {integrity: sha512-LPP/3KorzCwBxfeUuZmaR6bG2kdeHSbe0P2tY3FLRU4vYrjYz5hI4QZwV0njUx3jeuKe67YukQ1LSPZBKDqO/Q==} + micromatch@4.0.8: + resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} engines: {node: '>=8.6'} mimic-fn@4.0.0: @@ -1712,9 +1727,6 @@ packages: engines: {node: '>=10'} hasBin: true - ms@2.1.2: - resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} - ms@2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} @@ -1913,8 +1925,8 @@ packages: resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} engines: {node: '>=8'} - picocolors@1.0.1: - resolution: {integrity: sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==} + picocolors@1.1.0: + resolution: {integrity: sha512-TQ92mBOW0l3LeMeyLV6mzy/kWr8lkd/hp3mTg7wYK7zJhuBStmGMBG0BdeDZS/dZx1IukaX6Bk11zcln25o1Aw==} picomatch@2.3.1: resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} @@ -1965,8 +1977,8 @@ packages: proper-lockfile@4.1.2: resolution: {integrity: sha512-TjNPblN4BwAWMXU8s9AEz4JmQxnD1NNL7bNOY/AKUzyamc379FWASUhc/K1pL2noVb+XmZKLL68cjzLsiOAMaA==} - pump@3.0.0: - resolution: {integrity: sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==} + pump@3.0.2: + resolution: {integrity: sha512-tUPXtzlGM8FE3P0ZL6DVs/3P58k9nk8/jZeQCurTJylQA8qFYzHFfhBJkuqyE0FifOsQ0uKWekiZ5g8wtr28cw==} punycode@2.3.1: resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} @@ -1994,8 +2006,8 @@ packages: resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} engines: {node: '>=8.10.0'} - regexp.prototype.flags@1.5.2: - resolution: {integrity: sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==} + regexp.prototype.flags@1.5.3: + resolution: {integrity: sha512-vqlC04+RQoFalODCbCumG2xIOvapzVMHwsyIGM/SIE8fRhFFsXeH8/QQ+s0T0kDAhKc4k30s73/0ydkHQz6HlQ==} engines: {node: '>= 0.4'} require-directory@2.1.1: @@ -2070,8 +2082,8 @@ packages: resolution: {integrity: sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==} engines: {node: '>= 0.4'} - safe-stable-stringify@2.4.3: - resolution: {integrity: sha512-e2bDA2WJT0wxseVd4lsDP4+3ONX6HpMXQa1ZhFQ7SU+GjvORCmShbCMltrtIDfkYhVHrOcPtj+KhmDBdPdZD1g==} + safe-stable-stringify@2.5.0: + resolution: {integrity: sha512-b3rppTKm9T+PsVCBEOUR46GWI7fdOs00VKZ1+9c1EWDaDMvjQc6tUwuFyIprgGgTcWoVHSKrU8H31ZHA2e0RHA==} engines: {node: '>=10'} semver@5.7.2: @@ -2164,8 +2176,8 @@ packages: spdx-expression-parse@3.0.1: resolution: {integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==} - spdx-license-ids@3.0.18: - resolution: {integrity: sha512-xxRs31BqRYHwiMzudOrpSiHtZ8i/GeionCBDSilhYRj+9gIcI8wCZTlXZKu9vZIVqViP3dcp9qE5G6AlIaD+TQ==} + spdx-license-ids@3.0.20: + resolution: {integrity: sha512-jg25NiDV/1fLtSgEgyvVyDunvaNHbuwF9lfNV17gSmPFAlYzdfNBlLtLzXTevwkPj7DhGbmN9VnmJIgLnhvaBw==} sprintf-js@1.0.3: resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} @@ -2373,8 +2385,8 @@ packages: resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} engines: {node: '>= 10.0.0'} - update-browserslist-db@1.1.0: - resolution: {integrity: sha512-EdRAaAyk2cUE1wOf2DkEhzxqOQvFOoRJFNS6NeyJ01Gp2beMRpBAINjM2iDXE3KCuKhwnvHIQCJm6ThL2Z+HzQ==} + update-browserslist-db@1.1.1: + resolution: {integrity: sha512-R8UzCaa9Az+38REPiJ1tXlImTJXlVfgHZsglwBD/k6nj76ctsH1E3q4doGrukiLQd3sGQYu56r5+lo5r94l29A==} hasBin: true peerDependencies: browserslist: '>= 4.21.0' @@ -2472,229 +2484,229 @@ snapshots: '@jridgewell/gen-mapping': 0.3.5 '@jridgewell/trace-mapping': 0.3.25 - '@babel/code-frame@7.24.7': + '@babel/code-frame@7.25.7': dependencies: - '@babel/highlight': 7.24.7 - picocolors: 1.0.1 + '@babel/highlight': 7.25.7 + picocolors: 1.1.0 - '@babel/compat-data@7.25.2': {} + '@babel/compat-data@7.25.7': {} '@babel/core@7.23.5': dependencies: '@ampproject/remapping': 2.3.0 - '@babel/code-frame': 7.24.7 - '@babel/generator': 7.25.0 - '@babel/helper-compilation-targets': 7.25.2 - '@babel/helper-module-transforms': 7.25.2(@babel/core@7.23.5) - '@babel/helpers': 7.25.0 - '@babel/parser': 7.25.3 - '@babel/template': 7.25.0 - '@babel/traverse': 7.25.3 + '@babel/code-frame': 7.25.7 + '@babel/generator': 7.25.7 + '@babel/helper-compilation-targets': 7.25.7 + '@babel/helper-module-transforms': 7.25.7(@babel/core@7.23.5) + '@babel/helpers': 7.25.7 + '@babel/parser': 7.25.7 + '@babel/template': 7.25.7 + '@babel/traverse': 7.25.7 '@babel/types': 7.23.5 convert-source-map: 2.0.0 - debug: 4.3.6 + debug: 4.3.7 gensync: 1.0.0-beta.2 json5: 2.2.3 semver: 6.3.1 transitivePeerDependencies: - supports-color - '@babel/generator@7.25.0': + '@babel/generator@7.25.7': dependencies: - '@babel/types': 7.25.2 + '@babel/types': 7.25.7 '@jridgewell/gen-mapping': 0.3.5 '@jridgewell/trace-mapping': 0.3.25 - jsesc: 2.5.2 + jsesc: 3.0.2 - '@babel/helper-annotate-as-pure@7.24.7': + '@babel/helper-annotate-as-pure@7.25.7': dependencies: - '@babel/types': 7.25.2 + '@babel/types': 7.25.7 - '@babel/helper-compilation-targets@7.25.2': + '@babel/helper-compilation-targets@7.25.7': dependencies: - '@babel/compat-data': 7.25.2 - '@babel/helper-validator-option': 7.24.8 - browserslist: 4.23.3 + '@babel/compat-data': 7.25.7 + '@babel/helper-validator-option': 7.25.7 + browserslist: 4.24.0 lru-cache: 5.1.1 semver: 6.3.1 - '@babel/helper-create-class-features-plugin@7.25.0(@babel/core@7.23.5)': + '@babel/helper-create-class-features-plugin@7.25.7(@babel/core@7.23.5)': dependencies: '@babel/core': 7.23.5 - '@babel/helper-annotate-as-pure': 7.24.7 - '@babel/helper-member-expression-to-functions': 7.24.8 - '@babel/helper-optimise-call-expression': 7.24.7 - '@babel/helper-replace-supers': 7.25.0(@babel/core@7.23.5) - '@babel/helper-skip-transparent-expression-wrappers': 7.24.7 - '@babel/traverse': 7.25.3 + '@babel/helper-annotate-as-pure': 7.25.7 + '@babel/helper-member-expression-to-functions': 7.25.7 + '@babel/helper-optimise-call-expression': 7.25.7 + '@babel/helper-replace-supers': 7.25.7(@babel/core@7.23.5) + '@babel/helper-skip-transparent-expression-wrappers': 7.25.7 + '@babel/traverse': 7.25.7 semver: 6.3.1 transitivePeerDependencies: - supports-color - '@babel/helper-member-expression-to-functions@7.24.8': + '@babel/helper-member-expression-to-functions@7.25.7': dependencies: - '@babel/traverse': 7.25.3 - '@babel/types': 7.25.2 + '@babel/traverse': 7.25.7 + '@babel/types': 7.25.7 transitivePeerDependencies: - supports-color - '@babel/helper-module-imports@7.24.7': + '@babel/helper-module-imports@7.25.7': dependencies: - '@babel/traverse': 7.25.3 - '@babel/types': 7.25.2 + '@babel/traverse': 7.25.7 + '@babel/types': 7.25.7 transitivePeerDependencies: - supports-color - '@babel/helper-module-transforms@7.25.2(@babel/core@7.23.5)': + '@babel/helper-module-transforms@7.25.7(@babel/core@7.23.5)': dependencies: '@babel/core': 7.23.5 - '@babel/helper-module-imports': 7.24.7 - '@babel/helper-simple-access': 7.24.7 - '@babel/helper-validator-identifier': 7.24.7 - '@babel/traverse': 7.25.3 + '@babel/helper-module-imports': 7.25.7 + '@babel/helper-simple-access': 7.25.7 + '@babel/helper-validator-identifier': 7.25.7 + '@babel/traverse': 7.25.7 transitivePeerDependencies: - supports-color - '@babel/helper-optimise-call-expression@7.24.7': + '@babel/helper-optimise-call-expression@7.25.7': dependencies: - '@babel/types': 7.25.2 + '@babel/types': 7.25.7 - '@babel/helper-plugin-utils@7.24.8': {} + '@babel/helper-plugin-utils@7.25.7': {} - '@babel/helper-replace-supers@7.25.0(@babel/core@7.23.5)': + '@babel/helper-replace-supers@7.25.7(@babel/core@7.23.5)': dependencies: '@babel/core': 7.23.5 - '@babel/helper-member-expression-to-functions': 7.24.8 - '@babel/helper-optimise-call-expression': 7.24.7 - '@babel/traverse': 7.25.3 + '@babel/helper-member-expression-to-functions': 7.25.7 + '@babel/helper-optimise-call-expression': 7.25.7 + '@babel/traverse': 7.25.7 transitivePeerDependencies: - supports-color - '@babel/helper-simple-access@7.24.7': + '@babel/helper-simple-access@7.25.7': dependencies: - '@babel/traverse': 7.25.3 - '@babel/types': 7.25.2 + '@babel/traverse': 7.25.7 + '@babel/types': 7.25.7 transitivePeerDependencies: - supports-color - '@babel/helper-skip-transparent-expression-wrappers@7.24.7': + '@babel/helper-skip-transparent-expression-wrappers@7.25.7': dependencies: - '@babel/traverse': 7.25.3 - '@babel/types': 7.25.2 + '@babel/traverse': 7.25.7 + '@babel/types': 7.25.7 transitivePeerDependencies: - supports-color '@babel/helper-split-export-declaration@7.24.7': dependencies: - '@babel/types': 7.25.2 + '@babel/types': 7.25.7 - '@babel/helper-string-parser@7.24.8': {} + '@babel/helper-string-parser@7.25.7': {} - '@babel/helper-validator-identifier@7.24.7': {} + '@babel/helper-validator-identifier@7.25.7': {} - '@babel/helper-validator-option@7.24.8': {} + '@babel/helper-validator-option@7.25.7': {} - '@babel/helpers@7.25.0': + '@babel/helpers@7.25.7': dependencies: - '@babel/template': 7.25.0 - '@babel/types': 7.25.2 + '@babel/template': 7.25.7 + '@babel/types': 7.25.7 - '@babel/highlight@7.24.7': + '@babel/highlight@7.25.7': dependencies: - '@babel/helper-validator-identifier': 7.24.7 + '@babel/helper-validator-identifier': 7.25.7 chalk: 2.4.2 js-tokens: 4.0.0 - picocolors: 1.0.1 + picocolors: 1.1.0 - '@babel/parser@7.25.3': + '@babel/parser@7.25.7': dependencies: - '@babel/types': 7.25.2 + '@babel/types': 7.25.7 '@babel/plugin-proposal-decorators@7.23.5(@babel/core@7.23.5)': dependencies: '@babel/core': 7.23.5 - '@babel/helper-create-class-features-plugin': 7.25.0(@babel/core@7.23.5) - '@babel/helper-plugin-utils': 7.24.8 - '@babel/helper-replace-supers': 7.25.0(@babel/core@7.23.5) + '@babel/helper-create-class-features-plugin': 7.25.7(@babel/core@7.23.5) + '@babel/helper-plugin-utils': 7.25.7 + '@babel/helper-replace-supers': 7.25.7(@babel/core@7.23.5) '@babel/helper-split-export-declaration': 7.24.7 - '@babel/plugin-syntax-decorators': 7.24.7(@babel/core@7.23.5) + '@babel/plugin-syntax-decorators': 7.25.7(@babel/core@7.23.5) transitivePeerDependencies: - supports-color - '@babel/plugin-syntax-decorators@7.24.7(@babel/core@7.23.5)': + '@babel/plugin-syntax-decorators@7.25.7(@babel/core@7.23.5)': dependencies: '@babel/core': 7.23.5 - '@babel/helper-plugin-utils': 7.24.8 + '@babel/helper-plugin-utils': 7.25.7 - '@babel/plugin-syntax-jsx@7.24.7(@babel/core@7.23.5)': + '@babel/plugin-syntax-jsx@7.25.7(@babel/core@7.23.5)': dependencies: '@babel/core': 7.23.5 - '@babel/helper-plugin-utils': 7.24.8 + '@babel/helper-plugin-utils': 7.25.7 - '@babel/plugin-syntax-typescript@7.24.7(@babel/core@7.23.5)': + '@babel/plugin-syntax-typescript@7.25.7(@babel/core@7.23.5)': dependencies: '@babel/core': 7.23.5 - '@babel/helper-plugin-utils': 7.24.8 + '@babel/helper-plugin-utils': 7.25.7 - '@babel/plugin-transform-modules-commonjs@7.24.8(@babel/core@7.23.5)': + '@babel/plugin-transform-modules-commonjs@7.25.7(@babel/core@7.23.5)': dependencies: '@babel/core': 7.23.5 - '@babel/helper-module-transforms': 7.25.2(@babel/core@7.23.5) - '@babel/helper-plugin-utils': 7.24.8 - '@babel/helper-simple-access': 7.24.7 + '@babel/helper-module-transforms': 7.25.7(@babel/core@7.23.5) + '@babel/helper-plugin-utils': 7.25.7 + '@babel/helper-simple-access': 7.25.7 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-typescript@7.25.2(@babel/core@7.23.5)': + '@babel/plugin-transform-typescript@7.25.7(@babel/core@7.23.5)': dependencies: '@babel/core': 7.23.5 - '@babel/helper-annotate-as-pure': 7.24.7 - '@babel/helper-create-class-features-plugin': 7.25.0(@babel/core@7.23.5) - '@babel/helper-plugin-utils': 7.24.8 - '@babel/helper-skip-transparent-expression-wrappers': 7.24.7 - '@babel/plugin-syntax-typescript': 7.24.7(@babel/core@7.23.5) + '@babel/helper-annotate-as-pure': 7.25.7 + '@babel/helper-create-class-features-plugin': 7.25.7(@babel/core@7.23.5) + '@babel/helper-plugin-utils': 7.25.7 + '@babel/helper-skip-transparent-expression-wrappers': 7.25.7 + '@babel/plugin-syntax-typescript': 7.25.7(@babel/core@7.23.5) transitivePeerDependencies: - supports-color '@babel/preset-typescript@7.23.3(@babel/core@7.23.5)': dependencies: '@babel/core': 7.23.5 - '@babel/helper-plugin-utils': 7.24.8 - '@babel/helper-validator-option': 7.24.8 - '@babel/plugin-syntax-jsx': 7.24.7(@babel/core@7.23.5) - '@babel/plugin-transform-modules-commonjs': 7.24.8(@babel/core@7.23.5) - '@babel/plugin-transform-typescript': 7.25.2(@babel/core@7.23.5) + '@babel/helper-plugin-utils': 7.25.7 + '@babel/helper-validator-option': 7.25.7 + '@babel/plugin-syntax-jsx': 7.25.7(@babel/core@7.23.5) + '@babel/plugin-transform-modules-commonjs': 7.25.7(@babel/core@7.23.5) + '@babel/plugin-transform-typescript': 7.25.7(@babel/core@7.23.5) transitivePeerDependencies: - supports-color - '@babel/template@7.25.0': + '@babel/template@7.25.7': dependencies: - '@babel/code-frame': 7.24.7 - '@babel/parser': 7.25.3 - '@babel/types': 7.25.2 + '@babel/code-frame': 7.25.7 + '@babel/parser': 7.25.7 + '@babel/types': 7.25.7 - '@babel/traverse@7.25.3': + '@babel/traverse@7.25.7': dependencies: - '@babel/code-frame': 7.24.7 - '@babel/generator': 7.25.0 - '@babel/parser': 7.25.3 - '@babel/template': 7.25.0 - '@babel/types': 7.25.2 - debug: 4.3.6 + '@babel/code-frame': 7.25.7 + '@babel/generator': 7.25.7 + '@babel/parser': 7.25.7 + '@babel/template': 7.25.7 + '@babel/types': 7.25.7 + debug: 4.3.7 globals: 11.12.0 transitivePeerDependencies: - supports-color '@babel/types@7.23.5': dependencies: - '@babel/helper-string-parser': 7.24.8 - '@babel/helper-validator-identifier': 7.24.7 + '@babel/helper-string-parser': 7.25.7 + '@babel/helper-validator-identifier': 7.25.7 to-fast-properties: 2.0.0 - '@babel/types@7.25.2': + '@babel/types@7.25.7': dependencies: - '@babel/helper-string-parser': 7.24.8 - '@babel/helper-validator-identifier': 7.24.7 + '@babel/helper-string-parser': 7.25.7 + '@babel/helper-validator-identifier': 7.25.7 to-fast-properties: 2.0.0 '@cspotcode/source-map-support@0.8.1': @@ -2706,12 +2718,12 @@ snapshots: eslint: 8.54.0 eslint-visitor-keys: 3.4.3 - '@eslint-community/regexpp@4.11.0': {} + '@eslint-community/regexpp@4.11.1': {} '@eslint/eslintrc@2.1.4': dependencies: ajv: 6.12.6 - debug: 4.3.6 + debug: 4.3.7 espree: 9.6.1 globals: 13.24.0 ignore: 5.3.2 @@ -2727,7 +2739,7 @@ snapshots: '@humanwhocodes/config-array@0.11.14': dependencies: '@humanwhocodes/object-schema': 2.0.3 - debug: 4.3.6 + debug: 4.3.7 minimatch: 3.1.2 transitivePeerDependencies: - supports-color @@ -2878,7 +2890,7 @@ snapshots: '@rollup/plugin-babel@5.3.1(@babel/core@7.23.5)(@types/babel__core@7.20.5)(rollup@2.79.1)': dependencies: '@babel/core': 7.23.5 - '@babel/helper-module-imports': 7.24.7 + '@babel/helper-module-imports': 7.25.7 '@rollup/pluginutils': 3.1.0(rollup@2.79.1) rollup: 2.79.1 optionalDependencies: @@ -2948,7 +2960,7 @@ snapshots: '@types/babel__core@7.20.5': dependencies: - '@babel/parser': 7.25.3 + '@babel/parser': 7.25.7 '@babel/types': 7.23.5 '@types/babel__generator': 7.6.8 '@types/babel__template': 7.4.4 @@ -2960,7 +2972,7 @@ snapshots: '@types/babel__template@7.4.4': dependencies: - '@babel/parser': 7.25.3 + '@babel/parser': 7.25.7 '@babel/types': 7.23.5 '@types/babel__traverse@7.20.4': @@ -2993,11 +3005,11 @@ snapshots: '@types/lodash-es@4.17.12': dependencies: - '@types/lodash': 4.17.7 + '@types/lodash': 4.17.10 - '@types/lodash@4.17.7': {} + '@types/lodash@4.17.10': {} - '@types/node@16.18.105': {} + '@types/node@16.18.113': {} '@types/node@17.0.45': {} @@ -3021,12 +3033,12 @@ snapshots: '@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0(eslint@8.54.0)(typescript@4.7.4))(eslint@8.54.0)(typescript@4.7.4)': dependencies: - '@eslint-community/regexpp': 4.11.0 + '@eslint-community/regexpp': 4.11.1 '@typescript-eslint/parser': 5.62.0(eslint@8.54.0)(typescript@4.7.4) '@typescript-eslint/scope-manager': 5.62.0 '@typescript-eslint/type-utils': 5.62.0(eslint@8.54.0)(typescript@4.7.4) '@typescript-eslint/utils': 5.62.0(eslint@8.54.0)(typescript@4.7.4) - debug: 4.3.6 + debug: 4.3.7 eslint: 8.54.0 graphemer: 1.4.0 ignore: 5.3.2 @@ -3043,7 +3055,7 @@ snapshots: '@typescript-eslint/scope-manager': 5.62.0 '@typescript-eslint/types': 5.62.0 '@typescript-eslint/typescript-estree': 5.62.0(typescript@4.7.4) - debug: 4.3.6 + debug: 4.3.7 eslint: 8.54.0 optionalDependencies: typescript: 4.7.4 @@ -3059,7 +3071,7 @@ snapshots: dependencies: '@typescript-eslint/typescript-estree': 5.62.0(typescript@4.7.4) '@typescript-eslint/utils': 5.62.0(eslint@8.54.0)(typescript@4.7.4) - debug: 4.3.6 + debug: 4.3.7 eslint: 8.54.0 tsutils: 3.21.0(typescript@4.7.4) optionalDependencies: @@ -3073,7 +3085,7 @@ snapshots: dependencies: '@typescript-eslint/types': 5.62.0 '@typescript-eslint/visitor-keys': 5.62.0 - debug: 4.3.6 + debug: 4.3.7 globby: 11.1.0 is-glob: 4.0.3 semver: 7.6.3 @@ -3109,7 +3121,7 @@ snapshots: dependencies: acorn: 8.12.1 - acorn-walk@8.3.3: + acorn-walk@8.3.4: dependencies: acorn: 8.12.1 @@ -3145,7 +3157,7 @@ snapshots: ansi-regex@5.0.1: {} - ansi-regex@6.0.1: {} + ansi-regex@6.1.0: {} ansi-sequence-parser@1.1.1: {} @@ -3201,7 +3213,7 @@ snapshots: ava@4.3.3: dependencies: acorn: 8.12.1 - acorn-walk: 8.3.3 + acorn-walk: 8.3.4 ansi-styles: 6.2.1 arrgv: 1.0.2 arrify: 3.0.0 @@ -3218,7 +3230,7 @@ snapshots: common-path-prefix: 3.0.0 concordance: 5.0.4 currently-unhandled: 0.4.1 - debug: 4.3.6 + debug: 4.3.7 del: 6.1.1 emittery: 0.11.0 figures: 4.0.1 @@ -3291,12 +3303,12 @@ snapshots: dependencies: fill-range: 7.1.1 - browserslist@4.23.3: + browserslist@4.24.0: dependencies: - caniuse-lite: 1.0.30001651 - electron-to-chromium: 1.5.8 + caniuse-lite: 1.0.30001667 + electron-to-chromium: 1.5.33 node-releases: 2.0.18 - update-browserslist-db: 1.1.0(browserslist@4.23.3) + update-browserslist-db: 1.1.1(browserslist@4.24.0) bs58@4.0.0: dependencies: @@ -3332,7 +3344,7 @@ snapshots: callsites@4.2.0: {} - caniuse-lite@1.0.30001651: {} + caniuse-lite@1.0.30001667: {} cbor@8.1.0: dependencies: @@ -3477,9 +3489,9 @@ snapshots: dependencies: time-zone: 1.0.0 - debug@4.3.6: + debug@4.3.7: dependencies: - ms: 2.1.2 + ms: 2.1.3 decode-uri-component@0.2.2: {} @@ -3532,7 +3544,7 @@ snapshots: eastasianwidth@0.2.0: {} - electron-to-chromium@1.5.8: {} + electron-to-chromium@1.5.33: {} emittery@0.11.0: {} @@ -3584,7 +3596,7 @@ snapshots: object-inspect: 1.13.2 object-keys: 1.1.1 object.assign: 4.1.5 - regexp.prototype.flags: 1.5.2 + regexp.prototype.flags: 1.5.3 safe-array-concat: 1.1.2 safe-regex-test: 1.0.3 string.prototype.trim: 1.2.9 @@ -3619,7 +3631,7 @@ snapshots: is-date-object: 1.0.5 is-symbol: 1.0.4 - escalade@3.1.2: {} + escalade@3.2.0: {} escape-string-regexp@1.0.5: {} @@ -3648,7 +3660,7 @@ snapshots: eslint@8.54.0: dependencies: '@eslint-community/eslint-utils': 4.4.0(eslint@8.54.0) - '@eslint-community/regexpp': 4.11.0 + '@eslint-community/regexpp': 4.11.1 '@eslint/eslintrc': 2.1.4 '@eslint/js': 8.54.0 '@humanwhocodes/config-array': 0.11.14 @@ -3658,7 +3670,7 @@ snapshots: ajv: 6.12.6 chalk: 4.1.2 cross-spawn: 7.0.3 - debug: 4.3.6 + debug: 4.3.7 doctrine: 3.0.0 escape-string-regexp: 4.0.0 eslint-scope: 7.2.2 @@ -3724,7 +3736,7 @@ snapshots: '@nodelib/fs.walk': 1.2.8 glob-parent: 5.1.2 merge2: 1.4.1 - micromatch: 4.0.7 + micromatch: 4.0.8 fast-json-stable-stringify@2.1.0: {} @@ -3817,7 +3829,7 @@ snapshots: get-stream@5.2.0: dependencies: - pump: 3.0.0 + pump: 3.0.2 get-symbol-description@1.0.2: dependencies: @@ -3946,6 +3958,8 @@ snapshots: indent-string@5.0.0: {} + indento@1.1.13: {} + inflight@1.0.6: dependencies: once: 1.4.0 @@ -3989,7 +4003,7 @@ snapshots: is-callable@1.2.7: {} - is-core-module@2.15.0: + is-core-module@2.15.1: dependencies: hasown: 2.0.2 @@ -4081,7 +4095,7 @@ snapshots: dependencies: argparse: 2.0.1 - jsesc@2.5.2: {} + jsesc@3.0.2: {} json-buffer@3.0.1: {} @@ -4095,6 +4109,10 @@ snapshots: json-stable-stringify-without-jsonify@1.0.1: {} + json2md@2.0.1: + dependencies: + indento: 1.1.13 + json5@2.2.3: {} jsonc-parser@3.3.1: {} @@ -4181,7 +4199,7 @@ snapshots: merge2@1.4.1: {} - micromatch@4.0.7: + micromatch@4.0.8: dependencies: braces: 3.0.3 picomatch: 2.3.1 @@ -4217,8 +4235,6 @@ snapshots: mkdirp@1.0.4: {} - ms@2.1.2: {} - ms@2.1.3: {} mustache@4.0.0: {} @@ -4264,11 +4280,11 @@ snapshots: near-typescript-json-schema@0.55.0: dependencies: '@types/json-schema': 7.0.15 - '@types/node': 16.18.105 + '@types/node': 16.18.113 glob: 7.2.3 path-equal: 1.2.5 - safe-stable-stringify: 2.4.3 - ts-node: 10.9.2(@types/node@16.18.105)(typescript@4.7.4) + safe-stable-stringify: 2.5.0 + ts-node: 10.9.2(@types/node@16.18.113)(typescript@4.7.4) typescript: 4.7.4 yargs: 17.7.2 transitivePeerDependencies: @@ -4438,7 +4454,7 @@ snapshots: path-type@4.0.0: {} - picocolors@1.0.1: {} + picocolors@1.1.0: {} picomatch@2.3.1: {} @@ -4478,7 +4494,7 @@ snapshots: retry: 0.12.0 signal-exit: 3.0.7 - pump@3.0.0: + pump@3.0.2: dependencies: end-of-stream: 1.4.4 once: 1.4.0 @@ -4505,7 +4521,7 @@ snapshots: dependencies: picomatch: 2.3.1 - regexp.prototype.flags@1.5.2: + regexp.prototype.flags@1.5.3: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 @@ -4528,7 +4544,7 @@ snapshots: resolve@1.22.8: dependencies: - is-core-module: 2.15.0 + is-core-module: 2.15.1 path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 @@ -4575,7 +4591,7 @@ snapshots: es-errors: 1.3.0 is-regex: 1.1.4 - safe-stable-stringify@2.4.3: {} + safe-stable-stringify@2.5.0: {} semver@5.7.2: {} @@ -4660,16 +4676,16 @@ snapshots: spdx-correct@3.2.0: dependencies: spdx-expression-parse: 3.0.1 - spdx-license-ids: 3.0.18 + spdx-license-ids: 3.0.20 spdx-exceptions@2.5.0: {} spdx-expression-parse@3.0.1: dependencies: spdx-exceptions: 2.5.0 - spdx-license-ids: 3.0.18 + spdx-license-ids: 3.0.20 - spdx-license-ids@3.0.18: {} + spdx-license-ids@3.0.20: {} sprintf-js@1.0.3: {} @@ -4723,7 +4739,7 @@ snapshots: strip-ansi@7.1.0: dependencies: - ansi-regex: 6.0.1 + ansi-regex: 6.1.0 strip-bom@3.0.0: {} @@ -4778,16 +4794,16 @@ snapshots: '@ts-morph/common': 0.17.0 code-block-writer: 11.0.3 - ts-node@10.9.2(@types/node@16.18.105)(typescript@4.7.4): + ts-node@10.9.2(@types/node@16.18.113)(typescript@4.7.4): dependencies: '@cspotcode/source-map-support': 0.8.1 '@tsconfig/node10': 1.0.11 '@tsconfig/node12': 1.0.11 '@tsconfig/node14': 1.0.3 '@tsconfig/node16': 1.0.4 - '@types/node': 16.18.105 + '@types/node': 16.18.113 acorn: 8.12.1 - acorn-walk: 8.3.3 + acorn-walk: 8.3.4 arg: 4.1.3 create-require: 1.1.1 diff: 4.0.2 @@ -4889,11 +4905,11 @@ snapshots: universalify@2.0.1: {} - update-browserslist-db@1.1.0(browserslist@4.23.3): + update-browserslist-db@1.1.1(browserslist@4.24.0): dependencies: - browserslist: 4.23.3 - escalade: 3.1.2 - picocolors: 1.0.1 + browserslist: 4.24.0 + escalade: 3.2.0 + picocolors: 1.1.0 uri-js@4.4.1: dependencies: @@ -4969,7 +4985,7 @@ snapshots: yargs@17.7.2: dependencies: cliui: 8.0.1 - escalade: 3.1.2 + escalade: 3.2.0 get-caller-file: 2.0.5 require-directory: 2.1.1 string-width: 4.2.3 diff --git a/tests/.gitignore b/tests/.gitignore index c921997d..d6bbbea5 100644 --- a/tests/.gitignore +++ b/tests/.gitignore @@ -1,3 +1,3 @@ node_modules build -file-sizes.json \ No newline at end of file +file-sizes.json diff --git a/tests/package.json b/tests/package.json index f5b98efd..13874f76 100644 --- a/tests/package.json +++ b/tests/package.json @@ -56,7 +56,8 @@ "test:migrate": "ava __tests__/decorators/migrate.ava.js", "test:middlewares": "ava __tests__/test-middlewares.ava.js", "test:abi": "ava __tests__/abi/abi.ava.js", - "test:alt-bn128-api": "ava __tests__/test_alt_bn128_api.ava.js" + "test:alt-bn128-api": "ava __tests__/test_alt_bn128_api.ava.js", + "calculate-file-sizes": "WORKING_DIR=$(pwd) pnpm --filter shared-scripts run calculate-file-sizes" }, "author": "Near Inc ", "license": "Apache-2.0",