diff --git a/contracts/package.json b/contracts/package.json index 70673fe2c..c144291f6 100644 --- a/contracts/package.json +++ b/contracts/package.json @@ -41,6 +41,7 @@ "@types/node": "^16", "@typescript-eslint/eslint-plugin": "^5.53.0", "@typescript-eslint/parser": "^5.53.0", + "aws-sdk": "^2.1331.0", "chai": "^4.3.6", "chai-ethers": "^0.0.1", "dotenv": "^16.0.3", @@ -66,7 +67,8 @@ "solidity-coverage": "^0.8.2", "ts-node": "^10.8.0", "typechain": "^8.1.1", - "typescript": "^4.6.4" + "typescript": "^4.6.4", + "uuid": "^9.0.0" }, "dependencies": { "@kleros/vea-contracts": "^0.1.12" diff --git a/contracts/scripts/policyUpdate.ts b/contracts/scripts/policyUpdate.ts new file mode 100644 index 000000000..004ae3f14 --- /dev/null +++ b/contracts/scripts/policyUpdate.ts @@ -0,0 +1,105 @@ +import { deployments, getNamedAccounts, getChainId, ethers } from "hardhat"; +import { PolicyRegistry } from "../typechain-types"; +import fs from "fs"; +import AWS from "aws-sdk"; +import { v4 as uuidv4 } from "uuid"; + +const s3 = new AWS.S3({ + endpoint: "https://s3.filebase.com", + region: "us-east-1", + signatureVersion: "v4", + accessKeyId: process.env.FILEBASE_ACCESS_KEY, + secretAccessKey: process.env.FILEBASE_SECRET_KEY, +}); +enum HomeChains { + ARBITRUM_ONE = 42161, + ARBITRUM_RINKEBY = 421611, + ARBITRUM_GOERLI = 421613, + HARDHAT = 31337, +} +async function main(filePath: string) { + let courtsV1; + fs.readFile(filePath, "utf8", (err, jsonString) => { + if (err) { + console.log("File read failed:", err); + return; + } + courtsV1 = JSON.parse(jsonString); + }); + + // fallback to hardhat node signers on local network + // const governor = (await getNamedAccounts()).governor ?? (await ethers.getSigners())[0].address; + const governor = (await ethers.getSigners())[0]; + const chainId = Number(await getChainId()); + if (!HomeChains[chainId]) { + console.error(`Aborting: script is not compatible with ${chainId}`); + return; + } else { + console.log("deploying to %s with deployer %s", HomeChains[chainId], governor); + } + const policyRegistryDeployment = await deployments.get("PolicyRegistry"); + const policyRegistry = (await ethers.getContractAt( + "PolicyRegistry", + policyRegistryDeployment.address + )) as PolicyRegistry; + for (const courtObject of courtsV1) { + const courtV2 = courtObject.court + 1; + const filename = courtObject.name.replace(" ", "-").concat(".json"); + const data = { name: courtObject.name, description: courtObject.description, summary: courtObject.summary }; + const response = await uploadDataToIPFS(data, filename); + console.log(response); + + if (response && response.statusCode === 200) { + try { + console.log(courtV2, courtObject.name); + const responseData = await JSON.parse(response.body); + const ipfsPath = "/ipfs/" + responseData.message.Metadata.cid; + await policyRegistry.connect(governor).setPolicy(courtV2, courtObject.name, ipfsPath); + } catch (error) { + console.log(error); + } + } + } +} + +const uploadDataToIPFS = async (data, filename) => { + try { + const params = { + Bucket: process.env.FILEBASE_BUCKET_NAME, + Key: generateS3Path() + filename, + ContentType: "application/json", + Body: Buffer.from(JSON.stringify(data)), + }; + const request = await s3.upload(params).promise(); + + const head_params = { + Bucket: process.env.FILEBASE_BUCKET_NAME, + Key: request.key, + }; + const head = await s3.headObject(head_params).promise(); + + return { + statusCode: 200, + body: JSON.stringify({ message: head }), + }; + } catch (error) { + console.log(error); + + return { + statusCode: 500, + body: JSON.stringify({ message: error }), + }; + } +}; +const generateS3Path = (): string => { + const currentDate = new Date(); + const formattedDate = currentDate.toISOString().slice(0, 10).replace(/-/g, "/"); + const id = uuidv4(); + return `${formattedDate}/${id}/`; +}; +main("./config/policies.v1.mainnet.json") + .then(() => process.exit(0)) + .catch((error) => { + console.error(error); + process.exit(1); + }); diff --git a/web/netlify/functions/uploadToIPFS.ts b/web/netlify/functions/uploadToIPFS.ts index dba1562fb..66621ac08 100644 --- a/web/netlify/functions/uploadToIPFS.ts +++ b/web/netlify/functions/uploadToIPFS.ts @@ -1,31 +1,152 @@ -import { Handler } from "@netlify/functions"; -import fetch from "node-fetch"; - -const ESTUARI_API_KEY = process.env["ESTUARY_API_KEY"]; -const ESTUARI_URL = process.env["ESTUARY_GATEWAY"]; - -export const handler: Handler = async (event, context) => { - context.callbackWaitsForEmptyEventLoop = false; - if (event.body) { - const newHeaders = event.headers; - delete newHeaders.host; - const response = await fetch(ESTUARI_URL, { - method: "POST", - headers: { - Authorization: `Bearer ${ESTUARI_API_KEY}`, - ...newHeaders, - }, - body: Buffer.from(event.body, "base64"), - }); +import { Handler, HandlerEvent } from "@netlify/functions"; +import AWS from "aws-sdk"; +import { v4 as uuidv4 } from "uuid"; +import amqp from "amqplib"; +import busboy from "busboy"; + +const envVariables = { + accessKey: process.env.FILEBASE_ACCESS_KEY, + secretKey: process.env.FILEBASE_SECRET_KEY, + bucketName: process.env.FILEBASE_BUCKET_NAME, + rabbitMQURL: process.env.RABBITMQ_URL, +}; - const parsedResponse = await response.json(); +const s3 = new AWS.S3({ + endpoint: "https://s3.filebase.com", + region: "us-east-1", + signatureVersion: "v4", + accessKeyId: envVariables.accessKey, + secretAccessKey: envVariables.secretKey, +}); + +export const handler: Handler = async function (event) { + if (!validEnvVariables()) { + return { + statusCode: 500, + body: JSON.stringify({ message: "Env variables missing" }), + }; + } + if (!event.body) { return { - statusCode: response.status, - body: JSON.stringify(parsedResponse), + statusCode: 500, + body: JSON.stringify({ message: "Invalid body format" }), }; } + + const file = parseMultiPartData(event.body, event.headers); + const s3Key = await uploadToS3(file["name"], file["parts"]); + const cid = await getCID(s3Key); + console.log(cid); + await rabbitMQUpload(cid); + return { - statusCode: 500, - body: JSON.stringify({ message: "Invalid body format" }), + statusCode: 200, + body: JSON.stringify({ message: cid }), }; }; + +interface IFile { + name: string; + parts: Buffer[]; +} + +const parseMultiPartData = ( + body: string, + headers: HandlerEvent["headers"] +): IFile => { + const file: IFile = { + name: "", + parts: [], + }; + + const bb = busboy({ headers }); + + bb.on("file", (_, filestream, metadata) => { + file.name = metadata.filename; + filestream.on("data", (data) => { + file.parts.push(data); + }); + }); + + bb.write(Buffer.from(body, "base64")); + + return file; +}; + +const validEnvVariables = (): boolean => { + return Object.values(envVariables).reduce( + (acc, current) => acc && typeof current !== "undefined", + true + ); +}; + +interface IUploadedPart { + ETag: string; + PartNumber: number; +} + +const uploadToS3 = async (name: string, parts: Buffer[]) => { + const multipartInfo: AWS.S3.CreateMultipartUploadRequest = { + Bucket: envVariables.bucketName!, + Key: generateS3Path() + name, + }; + const uploadID = await s3 + .createMultipartUpload(multipartInfo) + .promise() + .then((result) => result.UploadId); + const uploadedParts: IUploadedPart[] = []; + for (const [i, part] of parts.entries()) { + const partNumber = i + 1; + const partInfo: AWS.S3.UploadPartRequest = { + ...multipartInfo, + UploadId: uploadID!, + Body: part, + PartNumber: partNumber, + }; + const test = await s3.uploadPart(partInfo).promise(); + uploadedParts.push({ + ETag: test.ETag!, + PartNumber: partNumber, + }); + } + const completeMultipartUploadParams: AWS.S3.CompleteMultipartUploadRequest = { + ...multipartInfo, + MultipartUpload: { + Parts: uploadedParts, + }, + UploadId: uploadID!, + }; + await s3.completeMultipartUpload(completeMultipartUploadParams).promise(); + + return multipartInfo.Key; +}; + +const getCID = async (key: string) => { + const headParams: AWS.S3.HeadObjectRequest = { + Bucket: envVariables.bucketName!, + Key: key, + }; + const head = await s3.headObject(headParams).promise(); + + return head.Metadata?.cid; +}; + +const generateS3Path = (): string => { + const currentDate = new Date(); + const formattedDate = currentDate + .toISOString() + .slice(0, 10) + .replace(/-/g, "/"); + const id = uuidv4(); + return `${formattedDate}/${id}/`; +}; + +const rabbitMQUpload = async (cid: any) => { + const conn = await amqp.connect(envVariables.rabbitMQURL!); + const channel = await conn.createChannel(); + const exchange = "filebase"; + await channel.assertExchange(exchange, "fanout", { durable: true }); + channel.publish(exchange, "", Buffer.from(cid)); + await channel.close(); + await conn.close(); +}; diff --git a/web/package.json b/web/package.json index 05283dabd..171da49ba 100644 --- a/web/package.json +++ b/web/package.json @@ -35,9 +35,13 @@ "@netlify/functions": "^1.4.0", "@parcel/transformer-svg-react": "~2.7.0", "@parcel/watcher": "~2.0.0", + "@types/amqplib": "^0.10.1", + "@types/busboy": "^1.5.0", "@types/react": "^18.0.25", "@types/react-dom": "^18.0.9", + "@types/react-modal": "^3.13.1", "@types/styled-components": "^5.1.26", + "@types/uuid": "^9.0.1", "@typescript-eslint/eslint-plugin": "^5.53.0", "@typescript-eslint/parser": "^5.53.0", "@typescript-eslint/utils": "^5.53.0", @@ -62,10 +66,11 @@ "@kleros/ui-components-library": "^1.9.2", "@sentry/react": "^7.37.2", "@sentry/tracing": "^7.37.2", - "@types/react-modal": "^3.13.1", "@web3-react/core": "^6.1.9", "@web3-react/injected-connector": "^6.0.7", "@web3-react/types": "^6.0.7", + "amqplib": "^0.10.3", + "busboy": "^1.6.0", "chart.js": "^3.9.1", "chartjs-adapter-moment": "^1.0.0", "core-js": "^3.21.1", diff --git a/web/src/pages/Cases/CaseDetails/Evidence/SubmitEvidenceModal.tsx b/web/src/pages/Cases/CaseDetails/Evidence/SubmitEvidenceModal.tsx index 64b22a583..e67e1d61a 100644 --- a/web/src/pages/Cases/CaseDetails/Evidence/SubmitEvidenceModal.tsx +++ b/web/src/pages/Cases/CaseDetails/Evidence/SubmitEvidenceModal.tsx @@ -43,7 +43,7 @@ const SubmitEvidenceModal: React.FC<{ .then(async (res) => { const response = await res.json(); if (res.status === 200) { - const cid = "/ipfs/" + response["cid"]; + const cid = "/ipfs/" + response["message"]; await wrapWithToast( disputeKit.submitEvidence(evidenceGroup, cid) ).then(() => { diff --git a/web/src/utils/uploadFormDataToIPFS.ts b/web/src/utils/uploadFormDataToIPFS.ts index 9432bfa26..2ad294650 100644 --- a/web/src/utils/uploadFormDataToIPFS.ts +++ b/web/src/utils/uploadFormDataToIPFS.ts @@ -15,7 +15,7 @@ export function uploadFormDataToIPFS(formData: FormData): Promise { }).then(async (response) => response.status === 200 ? resolve(response) - : reject({ message: (await response.json()).error.reason }) + : reject({ message: (await response.json()).message }) ) ), { diff --git a/yarn.lock b/yarn.lock index 84ce08a48..6178686e1 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5,6 +5,17 @@ __metadata: version: 6 cacheKey: 8 +"@acuminous/bitsyntax@npm:^0.1.2": + version: 0.1.2 + resolution: "@acuminous/bitsyntax@npm:0.1.2" + dependencies: + buffer-more-ints: ~1.0.0 + debug: ^4.3.4 + safe-buffer: ~5.1.2 + checksum: d2f9f30dfc8ddb10673e4780fa997fbe43fe3b6cd996b9930803d1b3c5db42fd964f9dab225f9e1cc06a2a22832b5a04e37076f2d283365768c7bd9718642db4 + languageName: node + linkType: hard + "@ampproject/remapping@npm:^2.1.0": version: 2.2.0 resolution: "@ampproject/remapping@npm:2.2.0" @@ -3683,6 +3694,7 @@ __metadata: "@types/node": ^16 "@typescript-eslint/eslint-plugin": ^5.53.0 "@typescript-eslint/parser": ^5.53.0 + aws-sdk: ^2.1331.0 chai: ^4.3.6 chai-ethers: ^0.0.1 dotenv: ^16.0.3 @@ -3709,6 +3721,7 @@ __metadata: ts-node: ^10.8.0 typechain: ^8.1.1 typescript: ^4.6.4 + uuid: ^9.0.0 languageName: unknown linkType: soft @@ -3735,16 +3748,21 @@ __metadata: "@parcel/watcher": ~2.0.0 "@sentry/react": ^7.37.2 "@sentry/tracing": ^7.37.2 + "@types/amqplib": ^0.10.1 + "@types/busboy": ^1.5.0 "@types/react": ^18.0.25 "@types/react-dom": ^18.0.9 "@types/react-modal": ^3.13.1 "@types/styled-components": ^5.1.26 + "@types/uuid": ^9.0.1 "@typescript-eslint/eslint-plugin": ^5.53.0 "@typescript-eslint/parser": ^5.53.0 "@typescript-eslint/utils": ^5.53.0 "@web3-react/core": ^6.1.9 "@web3-react/injected-connector": ^6.0.7 "@web3-react/types": ^6.0.7 + amqplib: ^0.10.3 + busboy: ^1.6.0 chart.js: ^3.9.1 chartjs-adapter-moment: ^1.0.0 core-js: ^3.21.1 @@ -6067,6 +6085,15 @@ __metadata: languageName: node linkType: hard +"@types/amqplib@npm:^0.10.1": + version: 0.10.1 + resolution: "@types/amqplib@npm:0.10.1" + dependencies: + "@types/node": "*" + checksum: 9f7dd964d15df82f73c26e84f028a5fe91ee96878e34625cf09d0153079007d3d506fcf9d327463227e6e30a357e0220bfb0848fb40c121ccd795154004d3733 + languageName: node + linkType: hard + "@types/async-eventemitter@npm:^0.2.1": version: 0.2.1 resolution: "@types/async-eventemitter@npm:0.2.1" @@ -6152,6 +6179,15 @@ __metadata: languageName: node linkType: hard +"@types/busboy@npm:^1.5.0": + version: 1.5.0 + resolution: "@types/busboy@npm:1.5.0" + dependencies: + "@types/node": "*" + checksum: ffa7bf25c0395f6927526b7d97e70cd2df789e4ca0d231e41855fb08542fa236891ce457d83cc50cac6e5cef6be092ab80597070dcf1413f736462690a23e987 + languageName: node + linkType: hard + "@types/cacheable-request@npm:^6.0.1": version: 6.0.3 resolution: "@types/cacheable-request@npm:6.0.3" @@ -6806,6 +6842,13 @@ __metadata: languageName: node linkType: hard +"@types/uuid@npm:^9.0.1": + version: 9.0.1 + resolution: "@types/uuid@npm:9.0.1" + checksum: c472b8a77cbeded4bc529220b8611afa39bd64677f507838f8083d8aac8033b1f88cb9ddaa2f8589e0dcd2317291d0f6e1379f82d5ceebd6f74f3b4825288e00 + languageName: node + linkType: hard + "@types/web3@npm:1.0.19": version: 1.0.19 resolution: "@types/web3@npm:1.0.19" @@ -7909,6 +7952,18 @@ __metadata: languageName: node linkType: hard +"amqplib@npm:^0.10.3": + version: 0.10.3 + resolution: "amqplib@npm:0.10.3" + dependencies: + "@acuminous/bitsyntax": ^0.1.2 + buffer-more-ints: ~1.0.0 + readable-stream: 1.x >=1.1.9 + url-parse: ~1.5.10 + checksum: 999f0fae748fd29d4d4ec1067c389ecb8cb03f9c060f854a4cab757e911e9690da643419553b0291ec45693996a959b87ec87ae7e72268b818be0e284e60da7a + languageName: node + linkType: hard + "ansi-colors@npm:3.2.3": version: 3.2.3 resolution: "ansi-colors@npm:3.2.3" @@ -8540,6 +8595,24 @@ __metadata: languageName: node linkType: hard +"aws-sdk@npm:^2.1331.0": + version: 2.1397.0 + resolution: "aws-sdk@npm:2.1397.0" + dependencies: + buffer: 4.9.2 + events: 1.1.1 + ieee754: 1.1.13 + jmespath: 0.16.0 + querystring: 0.2.0 + sax: 1.2.1 + url: 0.10.3 + util: ^0.12.4 + uuid: 8.0.0 + xml2js: 0.5.0 + checksum: 52d9e57198c4506c6e36d821039a2257c0e935e65c2ee40899156cbdc7c96e4449ae2b4693a74e7d0560466c5db672724a374428eddf80859dc6ebd080f53205 + languageName: node + linkType: hard + "aws-sign2@npm:~0.7.0": version: 0.7.0 resolution: "aws-sign2@npm:0.7.0" @@ -9494,7 +9567,7 @@ __metadata: languageName: node linkType: hard -"base64-js@npm:^1.3.1": +"base64-js@npm:^1.0.2, base64-js@npm:^1.3.1": version: 1.5.1 resolution: "base64-js@npm:1.5.1" checksum: 669632eb3745404c2f822a18fc3a0122d2f9a7a13f7fb8b5823ee19d1d2ff9ee5b52c53367176ea4ad093c332fd5ab4bd0ebae5a8e27917a4105a4cfc86b1005 @@ -10015,6 +10088,13 @@ __metadata: languageName: node linkType: hard +"buffer-more-ints@npm:~1.0.0": + version: 1.0.0 + resolution: "buffer-more-ints@npm:1.0.0" + checksum: f6e88dade08a6d36f32d5f3ece141583a4f61d6c36970b16f4699bd00cfe95d4015525c2a741cf46eb918acfd61cac95683fb995189fd65c13b14949c90bfe75 + languageName: node + linkType: hard + "buffer-to-arraybuffer@npm:^0.0.5": version: 0.0.5 resolution: "buffer-to-arraybuffer@npm:0.0.5" @@ -10038,6 +10118,17 @@ __metadata: languageName: node linkType: hard +"buffer@npm:4.9.2": + version: 4.9.2 + resolution: "buffer@npm:4.9.2" + dependencies: + base64-js: ^1.0.2 + ieee754: ^1.1.4 + isarray: ^1.0.0 + checksum: 8801bc1ba08539f3be70eee307a8b9db3d40f6afbfd3cf623ab7ef41dffff1d0a31de0addbe1e66e0ca5f7193eeb667bfb1ecad3647f8f1b0750de07c13295c3 + languageName: node + linkType: hard + "buffer@npm:^5.0.5, buffer@npm:^5.2.1, buffer@npm:^5.4.2, buffer@npm:^5.4.3, buffer@npm:^5.5.0, buffer@npm:^5.6.0": version: 5.7.1 resolution: "buffer@npm:5.7.1" @@ -14802,6 +14893,13 @@ __metadata: languageName: node linkType: hard +"events@npm:1.1.1": + version: 1.1.1 + resolution: "events@npm:1.1.1" + checksum: 40431eb005cc4c57861b93d44c2981a49e7feb99df84cf551baed299ceea4444edf7744733f6a6667e942af687359b1f4a87ec1ec4f21d5127dac48a782039b9 + languageName: node + linkType: hard + "events@npm:^3.0.0, events@npm:^3.2.0": version: 3.3.0 resolution: "events@npm:3.3.0" @@ -17451,7 +17549,14 @@ __metadata: languageName: node linkType: hard -"ieee754@npm:^1.1.13, ieee754@npm:^1.2.1": +"ieee754@npm:1.1.13": + version: 1.1.13 + resolution: "ieee754@npm:1.1.13" + checksum: 102df1ba662e316e6160f7ce29c7c7fa3e04f2014c288336c5a9ff40bbcc2a27d209fa2a81ebfb33f28b1941021343d30e9ad8ee85a2d61f79f5936c35edc33d + languageName: node + linkType: hard + +"ieee754@npm:^1.1.13, ieee754@npm:^1.1.4, ieee754@npm:^1.2.1": version: 1.2.1 resolution: "ieee754@npm:1.2.1" checksum: 5144c0c9815e54ada181d80a0b810221a253562422e7c6c3a60b1901154184f49326ec239d618c416c1c5945a2e197107aee8d986a3dd836b53dffefd99b5e7e @@ -18184,6 +18289,15 @@ __metadata: languageName: node linkType: hard +"is-generator-function@npm:^1.0.7": + version: 1.0.10 + resolution: "is-generator-function@npm:1.0.10" + dependencies: + has-tostringtag: ^1.0.0 + checksum: d54644e7dbaccef15ceb1e5d91d680eb5068c9ee9f9eb0a9e04173eb5542c9b51b5ab52c5537f5703e48d5fddfd376817c1ca07a84a407b7115b769d4bdde72b + languageName: node + linkType: hard + "is-glob@npm:4.0.3, is-glob@npm:^4.0.0, is-glob@npm:^4.0.1, is-glob@npm:^4.0.3, is-glob@npm:~4.0.1": version: 4.0.3 resolution: "is-glob@npm:4.0.3" @@ -18514,7 +18628,7 @@ __metadata: languageName: node linkType: hard -"is-typed-array@npm:^1.1.10, is-typed-array@npm:^1.1.9": +"is-typed-array@npm:^1.1.10, is-typed-array@npm:^1.1.3, is-typed-array@npm:^1.1.9": version: 1.1.10 resolution: "is-typed-array@npm:1.1.10" dependencies: @@ -18622,7 +18736,7 @@ __metadata: languageName: node linkType: hard -"isarray@npm:1.0.0, isarray@npm:~1.0.0": +"isarray@npm:1.0.0, isarray@npm:^1.0.0, isarray@npm:~1.0.0": version: 1.0.0 resolution: "isarray@npm:1.0.0" checksum: f032df8e02dce8ec565cf2eb605ea939bdccea528dbcf565cdf92bfa2da9110461159d86a537388ef1acef8815a330642d7885b29010e8f7eac967c9993b65ab @@ -19404,6 +19518,13 @@ __metadata: languageName: node linkType: hard +"jmespath@npm:0.16.0": + version: 0.16.0 + resolution: "jmespath@npm:0.16.0" + checksum: 2d602493a1e4addfd1350ac8c9d54b1b03ed09e305fd863bab84a4ee1f52868cf939dd1a08c5cdea29ce9ba8f86875ebb458b6ed45dab3e1c3f2694503fb2fd9 + languageName: node + linkType: hard + "js-cookie@npm:^2.2.1": version: 2.2.1 resolution: "js-cookie@npm:2.2.1" @@ -25942,18 +26063,7 @@ __metadata: languageName: node linkType: hard -"readable-stream@npm:2 || 3, readable-stream@npm:3, readable-stream@npm:^3.0.0, readable-stream@npm:^3.0.1, readable-stream@npm:^3.0.2, readable-stream@npm:^3.0.6, readable-stream@npm:^3.1.1, readable-stream@npm:^3.4.0, readable-stream@npm:^3.6.0": - version: 3.6.0 - resolution: "readable-stream@npm:3.6.0" - dependencies: - inherits: ^2.0.3 - string_decoder: ^1.1.1 - util-deprecate: ^1.0.1 - checksum: d4ea81502d3799439bb955a3a5d1d808592cf3133350ed352aeaa499647858b27b1c4013984900238b0873ec8d0d8defce72469fb7a83e61d53f5ad61cb80dc8 - languageName: node - linkType: hard - -"readable-stream@npm:^1.0.33": +"readable-stream@npm:1.x >=1.1.9, readable-stream@npm:^1.0.33": version: 1.1.14 resolution: "readable-stream@npm:1.1.14" dependencies: @@ -25965,6 +26075,17 @@ __metadata: languageName: node linkType: hard +"readable-stream@npm:2 || 3, readable-stream@npm:3, readable-stream@npm:^3.0.0, readable-stream@npm:^3.0.1, readable-stream@npm:^3.0.2, readable-stream@npm:^3.0.6, readable-stream@npm:^3.1.1, readable-stream@npm:^3.4.0, readable-stream@npm:^3.6.0": + version: 3.6.0 + resolution: "readable-stream@npm:3.6.0" + dependencies: + inherits: ^2.0.3 + string_decoder: ^1.1.1 + util-deprecate: ^1.0.1 + checksum: d4ea81502d3799439bb955a3a5d1d808592cf3133350ed352aeaa499647858b27b1c4013984900238b0873ec8d0d8defce72469fb7a83e61d53f5ad61cb80dc8 + languageName: node + linkType: hard + "readable-stream@npm:^2.0.0, readable-stream@npm:^2.0.1, readable-stream@npm:^2.0.5, readable-stream@npm:^2.2.2, readable-stream@npm:^2.2.8, readable-stream@npm:^2.2.9, readable-stream@npm:^2.3.0, readable-stream@npm:^2.3.5, readable-stream@npm:^2.3.6, readable-stream@npm:~2.3.6": version: 2.3.7 resolution: "readable-stream@npm:2.3.7" @@ -26851,7 +26972,7 @@ __metadata: languageName: node linkType: hard -"safe-buffer@npm:5.1.2, safe-buffer@npm:~5.1.0, safe-buffer@npm:~5.1.1": +"safe-buffer@npm:5.1.2, safe-buffer@npm:~5.1.0, safe-buffer@npm:~5.1.1, safe-buffer@npm:~5.1.2": version: 5.1.2 resolution: "safe-buffer@npm:5.1.2" checksum: f2f1f7943ca44a594893a852894055cf619c1fbcb611237fc39e461ae751187e7baf4dc391a72125e0ac4fb2d8c5c0b3c71529622e6a58f46b960211e704903c @@ -26955,7 +27076,14 @@ __metadata: languageName: node linkType: hard -"sax@npm:~1.2.4": +"sax@npm:1.2.1": + version: 1.2.1 + resolution: "sax@npm:1.2.1" + checksum: 8dca7d5e1cd7d612f98ac50bdf0b9f63fbc964b85f0c4e2eb271f8b9b47fd3bf344c4d6a592e69ecf726d1485ca62cd8a52e603bbc332d18a66af25a9a1045ad + languageName: node + linkType: hard + +"sax@npm:>=0.6.0, sax@npm:~1.2.4": version: 1.2.4 resolution: "sax@npm:1.2.4" checksum: d3df7d32b897a2c2f28e941f732c71ba90e27c24f62ee918bd4d9a8cfb3553f2f81e5493c7f0be94a11c1911b643a9108f231dd6f60df3fa9586b5d2e3e9e1fe @@ -30247,7 +30375,7 @@ __metadata: languageName: node linkType: hard -"url-parse@npm:^1.5.3": +"url-parse@npm:^1.5.3, url-parse@npm:~1.5.10": version: 1.5.10 resolution: "url-parse@npm:1.5.10" dependencies: @@ -30264,6 +30392,16 @@ __metadata: languageName: node linkType: hard +"url@npm:0.10.3": + version: 0.10.3 + resolution: "url@npm:0.10.3" + dependencies: + punycode: 1.3.2 + querystring: 0.2.0 + checksum: 7b83ddb106c27bf9bde8629ccbe8d26e9db789c8cda5aa7db72ca2c6f9b8a88a5adf206f3e10db78e6e2d042b327c45db34c7010c1bf0d9908936a17a2b57d05 + languageName: node + linkType: hard + "url@npm:^0.11.0": version: 0.11.0 resolution: "url@npm:0.11.0" @@ -30350,6 +30488,19 @@ __metadata: languageName: node linkType: hard +"util@npm:^0.12.4": + version: 0.12.5 + resolution: "util@npm:0.12.5" + dependencies: + inherits: ^2.0.3 + is-arguments: ^1.0.4 + is-generator-function: ^1.0.7 + is-typed-array: ^1.1.3 + which-typed-array: ^1.1.2 + checksum: 705e51f0de5b446f4edec10739752ac25856541e0254ea1e7e45e5b9f9b0cb105bc4bd415736a6210edc68245a7f903bf085ffb08dd7deb8a0e847f60538a38a + languageName: node + linkType: hard + "utila@npm:~0.4": version: 0.4.0 resolution: "utila@npm:0.4.0" @@ -30387,6 +30538,15 @@ __metadata: languageName: node linkType: hard +"uuid@npm:8.0.0": + version: 8.0.0 + resolution: "uuid@npm:8.0.0" + bin: + uuid: dist/bin/uuid + checksum: 56d4e23aa7ac26fa2db6bd1778db34cb8c9f5a10df1770a27167874bf6705fc8f14a4ac414af58a0d96c7653b2bd4848510b29d1c2ef8c91ccb17429c1872b5e + languageName: node + linkType: hard + "uuid@npm:^3.3.2": version: 3.4.0 resolution: "uuid@npm:3.4.0" @@ -30405,6 +30565,15 @@ __metadata: languageName: node linkType: hard +"uuid@npm:^9.0.0": + version: 9.0.0 + resolution: "uuid@npm:9.0.0" + bin: + uuid: dist/bin/uuid + checksum: 8dd2c83c43ddc7e1c71e36b60aea40030a6505139af6bee0f382ebcd1a56f6cd3028f7f06ffb07f8cf6ced320b76aea275284b224b002b289f89fe89c389b028 + languageName: node + linkType: hard + "uvu@npm:^0.5.0": version: 0.5.6 resolution: "uvu@npm:0.5.6" @@ -31337,7 +31506,7 @@ __metadata: languageName: node linkType: hard -"which-typed-array@npm:^1.1.9": +"which-typed-array@npm:^1.1.2, which-typed-array@npm:^1.1.9": version: 1.1.9 resolution: "which-typed-array@npm:1.1.9" dependencies: @@ -31856,6 +32025,23 @@ __metadata: languageName: node linkType: hard +"xml2js@npm:0.5.0": + version: 0.5.0 + resolution: "xml2js@npm:0.5.0" + dependencies: + sax: ">=0.6.0" + xmlbuilder: ~11.0.0 + checksum: 1aa71d62e5bc2d89138e3929b9ea46459157727759cbc62ef99484b778641c0cd21fb637696c052d901a22f82d092a3e740a16b4ce218e81ac59b933535124ea + languageName: node + linkType: hard + +"xmlbuilder@npm:~11.0.0": + version: 11.0.1 + resolution: "xmlbuilder@npm:11.0.1" + checksum: 7152695e16f1a9976658215abab27e55d08b1b97bca901d58b048d2b6e106b5af31efccbdecf9b07af37c8377d8e7e821b494af10b3a68b0ff4ae60331b415b0 + languageName: node + linkType: hard + "xmlchars@npm:^2.2.0": version: 2.2.0 resolution: "xmlchars@npm:2.2.0"