diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 3aa9ffa..352b852 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -2,7 +2,9 @@ name: CI on: pull_request: push: - branches: [main] + branches: + - minswap + jobs: build: runs-on: ubuntu-latest diff --git a/.github/workflows/pump-version.yml b/.github/workflows/pump-version.yml new file mode 100644 index 0000000..0f6918f --- /dev/null +++ b/.github/workflows/pump-version.yml @@ -0,0 +1,45 @@ +name: Bump Version on Merge + +on: + push: + branches: + - minswap + +jobs: + bump_version: + runs-on: ubuntu-latest + + steps: + - name: Checkout Code + uses: actions/checkout@v4 + + - uses: pnpm/action-setup@v3 + with: + version: 8 + + - name: Calculate Next Version + run: | + # Get the latest version from NPM + LATEST_VERSION=$(npm view @minswap/translucent version) + + # Calculate and append the next version directly into GITHUB_ENV in one line + echo "NEXT_VERSION=$(echo "$LATEST_VERSION" | awk -F'[-.]' '{print $1"."$2"."$3"-minswap."$5+1}')" >> "$GITHUB_ENV" + + - name: Authenticate with private NPM package + run: echo "//registry.npmjs.org/:_authToken=${{ secrets.NPM_TOKEN }}" > ~/.npmrc + + - name: Install Dependencies + run: | + cd packages/translucent + pnpm install + + - name: Configure Git + run: | + git config --global user.name "GitHub Actions" + git config --global user.email "actions@users.noreply.github.com" + + - name: Bump Version and Publish + run: | + ./scripts/pump-version.sh ${{ env.NEXT_VERSION }} + env: + NPM_TOKEN: ${{ secrets.NPM_TOKEN }} diff --git a/.gitignore b/.gitignore index efa7c9e..fae7e3c 100644 --- a/.gitignore +++ b/.gitignore @@ -10,4 +10,5 @@ uplc/target .env.* seed.txt package-lock.json -.vscode/ \ No newline at end of file +.vscode/ +packages/translucent/build \ No newline at end of file diff --git a/bun.lockb b/bun.lockb index 923271e..367f73a 100755 Binary files a/bun.lockb and b/bun.lockb differ diff --git a/packages/translucent-blueprint/cli.ts b/packages/translucent-blueprint/cli.ts deleted file mode 100644 index aeb87b7..0000000 --- a/packages/translucent-blueprint/cli.ts +++ /dev/null @@ -1,5 +0,0 @@ -import { parseBlueprint } from "."; - -const args = Bun.argv.slice(2); - -parseBlueprint(args[0], args[1]); diff --git a/packages/translucent-blueprint/index.ts b/packages/translucent-blueprint/index.ts deleted file mode 100644 index 9fb6c12..0000000 --- a/packages/translucent-blueprint/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "./src/blueprint"; diff --git a/packages/translucent-blueprint/package.json b/packages/translucent-blueprint/package.json deleted file mode 100644 index 0e7ed75..0000000 --- a/packages/translucent-blueprint/package.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "name": "translucent-blueprint", - "module": "index.ts", - "bin": { - "translucent-blueprint": "cli.ts" - }, - "type": "module", - "version": "0.0.1" -} diff --git a/packages/translucent-blueprint/src/blueprint.ts b/packages/translucent-blueprint/src/blueprint.ts deleted file mode 100644 index dd17b79..0000000 --- a/packages/translucent-blueprint/src/blueprint.ts +++ /dev/null @@ -1,278 +0,0 @@ -type Blueprint = { - preamble: { - title: string; - description: string; - version: string; - plutusVersion: string; - license: string; - }; - validators: { - title: string; - datum?: { - title: string; - schema: { - $ref: string; - }; - }; - redeemer: { - title: string; - schema: { - $ref: string; - }; - }; - parameters?: { - title: string; - schema: { - $ref: string; - }; - }[]; - compiledCode: string; - hash: string; - }[]; - definitions: Record< - string, - { - title: string; - schema: { - $ref: string; - }; - } - >; -}; - -export async function parseBlueprint(blueprint: string, plutusTs: string) { - const plutusJson: Blueprint = JSON.parse(await Bun.file(blueprint).text()); - - const plutusVersion = - "Plutus" + plutusJson.preamble.plutusVersion.toUpperCase(); - - const definitions = plutusJson.definitions; - - const imports = ` -import { applyParamsToScript, Data, Validator } from "../translucent/index.ts"`; - - const validators = plutusJson.validators.map((validator) => { - const title = validator.title; - const name = (() => { - const [a, b] = title.split("."); - return upperFirst(snakeToCamel(a)) + upperFirst(snakeToCamel(b)); - })(); - const datum = validator.datum; - const datumTitle = datum ? snakeToCamel(datum.title) : null; - const datumSchema = datum ? resolveSchema(datum.schema, definitions) : null; - - const redeemer = validator.redeemer; - const redeemerTitle = snakeToCamel(redeemer.title); - const redeemerSchema = resolveSchema(redeemer.schema, definitions); - - const params = validator.parameters || []; - const paramsSchema = { - dataType: "list", - items: params.map((param) => resolveSchema(param.schema, definitions)), - }; - const paramsArgs = params.map((param, index) => [ - snakeToCamel(param.title), - schemaToType(paramsSchema.items[index]), - ]); - - const script = validator.compiledCode; - - return `export interface ${name} { - new (${paramsArgs.map((param) => param.join(":")).join(",")}): Validator;${ - datum ? `\n${datumTitle}: ${schemaToType(datumSchema)};` : "" - } - ${redeemerTitle}: ${schemaToType(redeemerSchema)}; - }; - - export const ${name} = Object.assign( - function (${paramsArgs.map((param) => param.join(":")).join(",")}) {${ - paramsArgs.length > 0 - ? `return { type: "${plutusVersion}", script: applyParamsToScript("${script}", [${paramsArgs - .map((param) => param[0]) - .join(",")}], ${JSON.stringify(paramsSchema)} as any) };` - : `return {type: "${plutusVersion}", script: "${script}"};` - }}, - ${datum ? `{${datumTitle}: ${JSON.stringify(datumSchema)}},` : ""} - {${redeemerTitle}: ${JSON.stringify(redeemerSchema)}}, - ) as unknown as ${name};`; - }); - - const plutus = imports + "\n\n" + validators.join("\n\n"); - - await Bun.write(plutusTs, plutus); - - console.log( - "%cGenerated %cplutus.ts", - "color: green; font-weight: bold", - "font-weight: bold", - ); - - function resolveSchema(schema: any, definitions: any, refName?: string): any { - if (schema.items) { - if (schema.items instanceof Array) { - return { - ...schema, - items: schema.items.map((item: any) => - resolveSchema(item, definitions), - ), - }; - } else { - return { - ...schema, - items: resolveSchema(schema.items, definitions, refName), - }; - } - } else if (schema.anyOf) { - return { - ...schema, - anyOf: schema.anyOf.map((a: any) => ({ - ...a, - fields: a.fields.map((field: any) => ({ - ...resolveSchema(field, definitions, refName), - title: field.title ? snakeToCamel(field.title) : undefined, - })), - })), - }; - } else if (schema.keys && schema.values) { - return { - ...schema, - keys: resolveSchema(schema.keys, definitions, refName), - values: resolveSchema(schema.values, definitions, refName), - }; - } else { - if (schema["$ref"]) { - const refKey = schema["$ref"] - .replaceAll("~1", "/") - .split("#/definitions/")[1]; - - if (refKey === refName) { - return schema; - } else { - refName = refKey; - const resolved = resolveSchema( - definitions[refKey], - definitions, - refName, - ); - return resolved; - } - } else { - return schema; - } - } - } - - function schemaToType(schema: any): string { - if (!schema) throw new Error("Could not generate type."); - const shapeType = (schema.anyOf ? "enum" : "") || schema.dataType; - - switch (shapeType) { - case "integer": { - return "bigint"; - } - case "bytes": { - return "string"; - } - case "constructor": { - if (isVoid(schema)) { - return "undefined"; - } else { - return `{${schema.fields - .map( - (field: any) => - `${field.title || "wrapper"}:${schemaToType(field)}`, - ) - .join(";")}}`; - } - } - case "enum": { - // When enum has only one entry it's a single constructor/record object - if (schema.anyOf.length === 1) { - return schemaToType(schema.anyOf[0]); - } - if (isBoolean(schema)) { - return "boolean"; - } - if (isNullable(schema)) { - return `${schemaToType(schema.anyOf[0].fields[0])} | null`; - } - return schema.anyOf - .map((entry: any) => - entry.fields.length === 0 - ? `"${entry.title}"` - : `{${entry.title}: ${ - entry.fields[0].title - ? `{${entry.fields - .map((field: any) => - [field.title, schemaToType(field)].join(":"), - ) - .join(",")}}}` - : `[${entry.fields - .map((field: any) => schemaToType(field)) - .join(",")}]}` - }`, - ) - .join(" | "); - } - case "list": { - if (schema.items instanceof Array) { - return `[${schema.items - .map((item: any) => schemaToType(item)) - .join(",")}]`; - } else { - return `Array<${schemaToType(schema.items)}>`; - } - } - case "map": { - return `Map<${schemaToType(schema.keys)}, ${schemaToType( - schema.values, - )}>`; - } - case undefined: { - return "Data"; - } - } - throw new Error("Could not type cast data."); - } - - function isBoolean(shape: any): boolean { - return ( - shape.anyOf && - shape.anyOf[0]?.title === "False" && - shape.anyOf[1]?.title === "True" - ); - } - - function isVoid(shape: any): boolean { - return shape.index === 0 && shape.fields.length === 0; - } - - function isNullable(shape: any): boolean { - return ( - shape.anyOf && - shape.anyOf[0]?.title === "Some" && - shape.anyOf[1]?.title === "None" - ); - } - - function snakeToCamel(s: string): string { - const withUnderscore = s.charAt(0) === "_" ? s.charAt(0) : ""; - return ( - withUnderscore + - (withUnderscore ? s.slice(1) : s) - .toLowerCase() - .replace(/([-_][a-z])/g, (group) => - group.toUpperCase().replace("-", "").replace("_", ""), - ) - ); - } - - function upperFirst(s: string): string { - const withUnderscore = s.charAt(0) === "_" ? s.charAt(0) : ""; - return ( - withUnderscore + - s.charAt(withUnderscore ? 1 : 0).toUpperCase() + - s.slice((withUnderscore ? 1 : 0) + 1) - ); - } -} diff --git a/packages/translucent-blueprint/test/blueprint.test.ts b/packages/translucent-blueprint/test/blueprint.test.ts deleted file mode 100644 index 43f1990..0000000 --- a/packages/translucent-blueprint/test/blueprint.test.ts +++ /dev/null @@ -1,26 +0,0 @@ -import { parseBlueprint } from "../src/blueprint"; -import path from "path"; -import expectedResult from "./fixtures/plutus-vesting.ts.txt"; - -jest.spyOn(Bun, "write").mockImplementation((path, data) => { - return Promise.resolve(data.toString().length); -}); - -it("should successfully parse any plutus.json", async () => { - const TARGET_FILENAME = "plutus.ts"; - - const plutusLocation = path.join( - import.meta.dir, - "./fixtures/plutus-vesting.json", - ); - await parseBlueprint(plutusLocation, TARGET_FILENAME); - - const writeMock = Bun.write as jest.MockedFunction; - - expect(writeMock).toHaveBeenCalled(); - - const [writePath, writeData] = writeMock.mock.calls[0]; - - expect(writePath).toContain(TARGET_FILENAME); - expect(writeData).toEqual(expectedResult); -}); diff --git a/packages/translucent-blueprint/test/fixtures/plutus-vesting.json b/packages/translucent-blueprint/test/fixtures/plutus-vesting.json deleted file mode 100644 index cf16020..0000000 --- a/packages/translucent-blueprint/test/fixtures/plutus-vesting.json +++ /dev/null @@ -1,72 +0,0 @@ -{ - "preamble": { - "title": "aiken-lang/vesting", - "description": "Aiken contracts for project 'aiken-lang/vesting'", - "version": "0.0.0", - "plutusVersion": "v2", - "license": "Apache-2.0" - }, - "validators": [ - { - "title": "vesting.vesting", - "datum": { - "title": "datum", - "schema": { - "$ref": "#/definitions/vesting~1Datum" - } - }, - "redeemer": { - "title": "_redeemer", - "schema": { - "$ref": "#/definitions/Void" - } - }, - "compiledCode": "59020c01000032323232323232323232322223253330093232533300b3370e900100089919918008009129998088008a5013232533301000214a2266008008002602a00466e1d2002300f375460260026464646602666601e6600266016601a01090001bae3300b300d0074800930103d87a80004c0103d87980003301333300f332300100122533301400114a226464a6660260042660080080022940c060008cdc3a400460246ea8c058004cc04cccc03ccc004cc02cc0340212000375c66016601a00e900226103d87a80004c0103d87980003301333300f3322323253330133370e90010008991919b89005001375a603200260220042940c044004cc034c03ccc034c03c009200048000cc02cc034cc02cc034021200048038dd6998059806803a400098103d87a80004c0103d87980004bd7026103d87a80004c0103d87980004bd7011198019bac3300c300e00248040004c0040048894ccc04800852809919299980899b8f00200314a2266600a00a002006602c0066eb8c050008c0240085281804800998029803801240042930b1900219299980499b87480000044c8c8c8c8c8c94ccc048c05400852616375c602600260260046eb8c044004c044008dd6980780098038020b180380199800800a40004444666600e66e1c00400c0308cccc014014cdc000224004601c0020040044600a6ea80048c00cdd5000ab9a5573aaae7955cfaba05742ae881", - "hash": "9955364493da365b0e972b6bd28e20970b509a8f4d31016ee8976274" - } - ], - "definitions": { - "ByteArray": { - "dataType": "bytes" - }, - "Int": { - "dataType": "integer" - }, - "Void": { - "title": "Unit", - "description": "The nullary constructor.", - "anyOf": [ - { - "dataType": "constructor", - "index": 0, - "fields": [] - } - ] - }, - "vesting/Datum": { - "title": "Datum", - "anyOf": [ - { - "title": "Datum", - "dataType": "constructor", - "index": 0, - "fields": [ - { - "title": "lock_until", - "description": "POSIX time in second, e.g. 1672843961000", - "$ref": "#/definitions/Int" - }, - { - "title": "owner", - "$ref": "#/definitions/ByteArray" - }, - { - "title": "beneficiary", - "$ref": "#/definitions/ByteArray" - } - ] - } - ] - } - } -} diff --git a/packages/translucent-blueprint/test/fixtures/plutus-vesting.ts.txt b/packages/translucent-blueprint/test/fixtures/plutus-vesting.ts.txt deleted file mode 100644 index 6342fd4..0000000 --- a/packages/translucent-blueprint/test/fixtures/plutus-vesting.ts.txt +++ /dev/null @@ -1,14 +0,0 @@ - -import { applyParamsToScript, Data, Validator } from "../translucent/index.ts" - -export interface VestingVesting { - new (): Validator; -datum: {lockUntil:bigint;owner:string;beneficiary:string}; - _redeemer: undefined; - }; - - export const VestingVesting = Object.assign( - function () {return {type: "PlutusV2", script: "59020c01000032323232323232323232322223253330093232533300b3370e900100089919918008009129998088008a5013232533301000214a2266008008002602a00466e1d2002300f375460260026464646602666601e6600266016601a01090001bae3300b300d0074800930103d87a80004c0103d87980003301333300f332300100122533301400114a226464a6660260042660080080022940c060008cdc3a400460246ea8c058004cc04cccc03ccc004cc02cc0340212000375c66016601a00e900226103d87a80004c0103d87980003301333300f3322323253330133370e90010008991919b89005001375a603200260220042940c044004cc034c03ccc034c03c009200048000cc02cc034cc02cc034021200048038dd6998059806803a400098103d87a80004c0103d87980004bd7026103d87a80004c0103d87980004bd7011198019bac3300c300e00248040004c0040048894ccc04800852809919299980899b8f00200314a2266600a00a002006602c0066eb8c050008c0240085281804800998029803801240042930b1900219299980499b87480000044c8c8c8c8c8c94ccc048c05400852616375c602600260260046eb8c044004c044008dd6980780098038020b180380199800800a40004444666600e66e1c00400c0308cccc014014cdc000224004601c0020040044600a6ea80048c00cdd5000ab9a5573aaae7955cfaba05742ae881"};}, - {datum: {"title":"Datum","anyOf":[{"title":"Datum","dataType":"constructor","index":0,"fields":[{"dataType":"integer","title":"lockUntil"},{"dataType":"bytes","title":"owner"},{"dataType":"bytes","title":"beneficiary"}]}]}}, - {_redeemer: {"title":"Unit","description":"The nullary constructor.","anyOf":[{"dataType":"constructor","index":0,"fields":[]}]}}, - ) as unknown as VestingVesting; \ No newline at end of file diff --git a/packages/translucent/index.ts b/packages/translucent/index.ts index a1ca67a..7482d1f 100644 --- a/packages/translucent/index.ts +++ b/packages/translucent/index.ts @@ -1 +1 @@ -export * from "./src/mod.ts"; +export * from "./src/mod"; diff --git a/packages/translucent/package.json b/packages/translucent/package.json index b3eb9e0..3b1bca0 100644 --- a/packages/translucent/package.json +++ b/packages/translucent/package.json @@ -1,20 +1,29 @@ { - "name": "translucent-cardano", - "module": "index.ts", - "type": "module", - "version": "0.0.6", + "name": "@minswap/translucent", + "version": "0.0.6-minswap.15", "scripts": { - "build:wasm": "cd ./uplc && ./build.sh && rm pkg-node/.gitignore && rm pkg-web/.gitignore && cd .. && npm i" + "build": "rimraf build && rollup -c rollup.config.mjs" }, + "main": "./build/index.js", + "module": "./build/index.es.js", + "types": "./build/index.d.ts", + "files": [ + "build" + ], "devDependencies": { + "@cardano-ogmios/schema": "^6.0.0-rc6", + "@rollup/plugin-json": "^6.0.1", "@types/jest": "^29.5.5", "@types/sha256": "^0.2.2", + "@types/node": "^20.12.2", "bun-types": "latest", "eslint": "^8.50.0", "jest": "^29.7.0", "ts-jest": "^29.1.1", "typescript": "^5.3.3", - "@cardano-ogmios/schema": "^6.0.0-rc6" + "rimraf": "^5.0.5", + "prettier": "^3.1.1", + "fast-check": "^3.14.0" }, "dependencies": { "@dcspark/cardano-multiplatform-lib-browser": "^3.1.2", @@ -22,18 +31,11 @@ "@emurgo/cardano-message-signing-browser": "^1.0.1", "@emurgo/cardano-message-signing-nodejs": "^1.0.1", "@sinclair/typebox": "^0.31.28", - "fast-check": "^3.14.0", - "prettier": "^3.1.1", "sha256": "^0.2.0", "uplc-node": "^0.0.3", - "uplc-web": "^0.0.3" - }, - "browser": { - "@dcspark/cardano-multiplatform-lib-nodejs": "@dcspark/cardano-multiplatform-lib-browser", - "@emurgo/cardano-message-signing-nodejs": "@emurgo/cardano-message-signing-browser", - "uplc-node": "uplc-web" - }, - "peerDependencies": { - "typescript": "^5.0.0" + "uplc-web": "^0.0.3", + "rollup": "^4.5.0", + "rollup-plugin-dts": "^6.1.0", + "rollup-plugin-esbuild": "^6.1.0" } } diff --git a/packages/translucent/pnpm-lock.yaml b/packages/translucent/pnpm-lock.yaml new file mode 100644 index 0000000..d742809 --- /dev/null +++ b/packages/translucent/pnpm-lock.yaml @@ -0,0 +1,3454 @@ +lockfileVersion: '6.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +dependencies: + '@dcspark/cardano-multiplatform-lib-browser': + specifier: ^3.1.2 + version: 3.1.2 + '@dcspark/cardano-multiplatform-lib-nodejs': + specifier: ^3.1.2 + version: 3.1.2 + '@emurgo/cardano-message-signing-browser': + specifier: ^1.0.1 + version: 1.0.1 + '@emurgo/cardano-message-signing-nodejs': + specifier: ^1.0.1 + version: 1.0.1 + '@sinclair/typebox': + specifier: ^0.31.28 + version: 0.31.28 + rollup: + specifier: ^4.5.0 + version: 4.13.2 + rollup-plugin-dts: + specifier: ^6.1.0 + version: 6.1.0(rollup@4.13.2)(typescript@5.4.3) + rollup-plugin-esbuild: + specifier: ^6.1.0 + version: 6.1.1(esbuild@0.20.2)(rollup@4.13.2) + sha256: + specifier: ^0.2.0 + version: 0.2.0 + uplc-node: + specifier: ^0.0.3 + version: 0.0.3 + uplc-web: + specifier: ^0.0.3 + version: 0.0.3 + +devDependencies: + '@cardano-ogmios/schema': + specifier: ^6.0.0-rc6 + version: 6.2.0 + '@rollup/plugin-json': + specifier: ^6.0.1 + version: 6.1.0(rollup@4.13.2) + '@types/jest': + specifier: ^29.5.5 + version: 29.5.12 + '@types/node': + specifier: ^20.12.2 + version: 20.12.2 + '@types/sha256': + specifier: ^0.2.2 + version: 0.2.2 + bun-types: + specifier: latest + version: 1.0.36 + eslint: + specifier: ^8.50.0 + version: 8.57.0 + fast-check: + specifier: ^3.14.0 + version: 3.17.1 + jest: + specifier: ^29.7.0 + version: 29.7.0(@types/node@20.12.2) + prettier: + specifier: ^3.1.1 + version: 3.2.5 + rimraf: + specifier: ^5.0.5 + version: 5.0.5 + ts-jest: + specifier: ^29.1.1 + version: 29.1.2(@babel/core@7.24.3)(esbuild@0.20.2)(jest@29.7.0)(typescript@5.4.3) + typescript: + specifier: ^5.3.3 + version: 5.4.3 + +packages: + + /@aashutoshrathi/word-wrap@1.2.6: + resolution: {integrity: sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==} + engines: {node: '>=0.10.0'} + dev: true + + /@ampproject/remapping@2.3.0: + resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} + engines: {node: '>=6.0.0'} + dependencies: + '@jridgewell/gen-mapping': 0.3.5 + '@jridgewell/trace-mapping': 0.3.25 + dev: true + + /@babel/code-frame@7.24.2: + resolution: {integrity: sha512-y5+tLQyV8pg3fsiln67BVLD1P13Eg4lh5RW9mF0zUuvLrv9uIQ4MCL+CRT+FTsBlBjcIan6PGsLcBN0m3ClUyQ==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/highlight': 7.24.2 + picocolors: 1.0.0 + + /@babel/compat-data@7.24.1: + resolution: {integrity: sha512-Pc65opHDliVpRHuKfzI+gSA4zcgr65O4cl64fFJIWEEh8JoHIHh0Oez1Eo8Arz8zq/JhgKodQaxEwUPRtZylVA==} + engines: {node: '>=6.9.0'} + dev: true + + /@babel/core@7.24.3: + resolution: {integrity: sha512-5FcvN1JHw2sHJChotgx8Ek0lyuh4kCKelgMTTqhYJJtloNvUfpAFMeNQUtdlIaktwrSV9LtCdqwk48wL2wBacQ==} + engines: {node: '>=6.9.0'} + dependencies: + '@ampproject/remapping': 2.3.0 + '@babel/code-frame': 7.24.2 + '@babel/generator': 7.24.1 + '@babel/helper-compilation-targets': 7.23.6 + '@babel/helper-module-transforms': 7.23.3(@babel/core@7.24.3) + '@babel/helpers': 7.24.1 + '@babel/parser': 7.24.1 + '@babel/template': 7.24.0 + '@babel/traverse': 7.24.1 + '@babel/types': 7.24.0 + convert-source-map: 2.0.0 + debug: 4.3.4 + gensync: 1.0.0-beta.2 + json5: 2.2.3 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/generator@7.24.1: + resolution: {integrity: sha512-DfCRfZsBcrPEHUfuBMgbJ1Ut01Y/itOs+hY2nFLgqsqXd52/iSiVq5TITtUasIUgm+IIKdY2/1I7auiQOEeC9A==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.24.0 + '@jridgewell/gen-mapping': 0.3.5 + '@jridgewell/trace-mapping': 0.3.25 + jsesc: 2.5.2 + dev: true + + /@babel/helper-compilation-targets@7.23.6: + resolution: {integrity: sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/compat-data': 7.24.1 + '@babel/helper-validator-option': 7.23.5 + browserslist: 4.23.0 + lru-cache: 5.1.1 + semver: 6.3.1 + dev: true + + /@babel/helper-environment-visitor@7.22.20: + resolution: {integrity: sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==} + engines: {node: '>=6.9.0'} + dev: true + + /@babel/helper-function-name@7.23.0: + resolution: {integrity: sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/template': 7.24.0 + '@babel/types': 7.24.0 + dev: true + + /@babel/helper-hoist-variables@7.22.5: + resolution: {integrity: sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.24.0 + dev: true + + /@babel/helper-module-imports@7.24.3: + resolution: {integrity: sha512-viKb0F9f2s0BCS22QSF308z/+1YWKV/76mwt61NBzS5izMzDPwdq1pTrzf+Li3npBWX9KdQbkeCt1jSAM7lZqg==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.24.0 + dev: true + + /@babel/helper-module-transforms@7.23.3(@babel/core@7.24.3): + resolution: {integrity: sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.24.3 + '@babel/helper-environment-visitor': 7.22.20 + '@babel/helper-module-imports': 7.24.3 + '@babel/helper-simple-access': 7.22.5 + '@babel/helper-split-export-declaration': 7.22.6 + '@babel/helper-validator-identifier': 7.22.20 + dev: true + + /@babel/helper-plugin-utils@7.24.0: + resolution: {integrity: sha512-9cUznXMG0+FxRuJfvL82QlTqIzhVW9sL0KjMPHhAOOvpQGL8QtdxnBKILjBqxlHyliz0yCa1G903ZXI/FuHy2w==} + engines: {node: '>=6.9.0'} + dev: true + + /@babel/helper-simple-access@7.22.5: + resolution: {integrity: sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.24.0 + dev: true + + /@babel/helper-split-export-declaration@7.22.6: + resolution: {integrity: sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.24.0 + dev: true + + /@babel/helper-string-parser@7.24.1: + resolution: {integrity: sha512-2ofRCjnnA9y+wk8b9IAREroeUP02KHp431N2mhKniy2yKIDKpbrHv9eXwm8cBeWQYcJmzv5qKCu65P47eCF7CQ==} + engines: {node: '>=6.9.0'} + dev: true + + /@babel/helper-validator-identifier@7.22.20: + resolution: {integrity: sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==} + engines: {node: '>=6.9.0'} + + /@babel/helper-validator-option@7.23.5: + resolution: {integrity: sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw==} + engines: {node: '>=6.9.0'} + dev: true + + /@babel/helpers@7.24.1: + resolution: {integrity: sha512-BpU09QqEe6ZCHuIHFphEFgvNSrubve1FtyMton26ekZ85gRGi6LrTF7zArARp2YvyFxloeiRmtSCq5sjh1WqIg==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/template': 7.24.0 + '@babel/traverse': 7.24.1 + '@babel/types': 7.24.0 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/highlight@7.24.2: + resolution: {integrity: sha512-Yac1ao4flkTxTteCDZLEvdxg2fZfz1v8M4QpaGypq/WPDqg3ijHYbDfs+LG5hvzSoqaSZ9/Z9lKSP3CjZjv+pA==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-validator-identifier': 7.22.20 + chalk: 2.4.2 + js-tokens: 4.0.0 + picocolors: 1.0.0 + + /@babel/parser@7.24.1: + resolution: {integrity: sha512-Zo9c7N3xdOIQrNip7Lc9wvRPzlRtovHVE4lkz8WEDr7uYh/GMQhSiIgFxGIArRHYdJE5kxtZjAf8rT0xhdLCzg==} + engines: {node: '>=6.0.0'} + hasBin: true + dependencies: + '@babel/types': 7.24.0 + dev: true + + /@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.24.3): + resolution: {integrity: sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.3 + '@babel/helper-plugin-utils': 7.24.0 + dev: true + + /@babel/plugin-syntax-bigint@7.8.3(@babel/core@7.24.3): + resolution: {integrity: sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.3 + '@babel/helper-plugin-utils': 7.24.0 + dev: true + + /@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.24.3): + resolution: {integrity: sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.3 + '@babel/helper-plugin-utils': 7.24.0 + dev: true + + /@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.24.3): + resolution: {integrity: sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.3 + '@babel/helper-plugin-utils': 7.24.0 + dev: true + + /@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.24.3): + resolution: {integrity: sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.3 + '@babel/helper-plugin-utils': 7.24.0 + dev: true + + /@babel/plugin-syntax-jsx@7.24.1(@babel/core@7.24.3): + resolution: {integrity: sha512-2eCtxZXf+kbkMIsXS4poTvT4Yu5rXiRa+9xGVT56raghjmBTKMpFNc9R4IDiB4emao9eO22Ox7CxuJG7BgExqA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.3 + '@babel/helper-plugin-utils': 7.24.0 + dev: true + + /@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.24.3): + resolution: {integrity: sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.3 + '@babel/helper-plugin-utils': 7.24.0 + dev: true + + /@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.24.3): + resolution: {integrity: sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.3 + '@babel/helper-plugin-utils': 7.24.0 + dev: true + + /@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.24.3): + resolution: {integrity: sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.3 + '@babel/helper-plugin-utils': 7.24.0 + dev: true + + /@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.24.3): + resolution: {integrity: sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.3 + '@babel/helper-plugin-utils': 7.24.0 + dev: true + + /@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.24.3): + resolution: {integrity: sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.3 + '@babel/helper-plugin-utils': 7.24.0 + dev: true + + /@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.24.3): + resolution: {integrity: sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.3 + '@babel/helper-plugin-utils': 7.24.0 + dev: true + + /@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.24.3): + resolution: {integrity: sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.3 + '@babel/helper-plugin-utils': 7.24.0 + dev: true + + /@babel/plugin-syntax-typescript@7.24.1(@babel/core@7.24.3): + resolution: {integrity: sha512-Yhnmvy5HZEnHUty6i++gcfH1/l68AHnItFHnaCv6hn9dNh0hQvvQJsxpi4BMBFN5DLeHBuucT/0DgzXif/OyRw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.3 + '@babel/helper-plugin-utils': 7.24.0 + dev: true + + /@babel/template@7.24.0: + resolution: {integrity: sha512-Bkf2q8lMB0AFpX0NFEqSbx1OkTHf0f+0j82mkw+ZpzBnkk7e9Ql0891vlfgi+kHwOk8tQjiQHpqh4LaSa0fKEA==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/code-frame': 7.24.2 + '@babel/parser': 7.24.1 + '@babel/types': 7.24.0 + dev: true + + /@babel/traverse@7.24.1: + resolution: {integrity: sha512-xuU6o9m68KeqZbQuDt2TcKSxUw/mrsvavlEqQ1leZ/B+C9tk6E4sRWy97WaXgvq5E+nU3cXMxv3WKOCanVMCmQ==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/code-frame': 7.24.2 + '@babel/generator': 7.24.1 + '@babel/helper-environment-visitor': 7.22.20 + '@babel/helper-function-name': 7.23.0 + '@babel/helper-hoist-variables': 7.22.5 + '@babel/helper-split-export-declaration': 7.22.6 + '@babel/parser': 7.24.1 + '@babel/types': 7.24.0 + debug: 4.3.4 + globals: 11.12.0 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/types@7.24.0: + resolution: {integrity: sha512-+j7a5c253RfKh8iABBhywc8NSfP5LURe7Uh4qpsh6jc+aLJguvmIUBdjSdEMQv2bENrCR5MfRdjGo7vzS/ob7w==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-string-parser': 7.24.1 + '@babel/helper-validator-identifier': 7.22.20 + to-fast-properties: 2.0.0 + dev: true + + /@bcoe/v8-coverage@0.2.3: + resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==} + dev: true + + /@cardano-ogmios/schema@6.2.0: + resolution: {integrity: sha512-pXvYFWolwgNPU8tXM5B3CRNmxBYg7b3wj1qaa4VXkteZmg0/pfC0UxxZWXQql2mark4KaiAJHx5AjFgza2x0Rw==} + engines: {node: '>=14'} + dev: true + + /@dcspark/cardano-multiplatform-lib-browser@3.1.2: + resolution: {integrity: sha512-BDIF33nqEKAGn72+ESD1fLgnWCZJbPWnVKHr0cy7Al2zhvM30rGsajcJNHLPh2XXZQh1H35fBiHHR2uUyZRRpw==} + dev: false + + /@dcspark/cardano-multiplatform-lib-nodejs@3.1.2: + resolution: {integrity: sha512-bfFI7ljC8El+yj4kG2G7GXcoHHhWJyJKonJ64H3Kcbns4+tHOTy525d1q/u4+hG+G42JPw4Zj5CFIBLv5GLMxg==} + dev: false + + /@emurgo/cardano-message-signing-browser@1.0.1: + resolution: {integrity: sha512-yC4Ymq44WR0bXO1wzxCoyc2W/RD1KSAla0oYhin7IYoVkp2raGp8wt7QNF4pDdNnTcejn5fyPyYY9dL4666H1w==} + dev: false + + /@emurgo/cardano-message-signing-nodejs@1.0.1: + resolution: {integrity: sha512-PoKh1tQnJX18f8iEr8Jk1KXxKCn9eqaSslMI1pyOJvYRJhQVDLCh0+9YReufjp0oFJIY1ShcrR+4/WnECVZUKQ==} + dev: false + + /@esbuild/aix-ppc64@0.20.2: + resolution: {integrity: sha512-D+EBOJHXdNZcLJRBkhENNG8Wji2kgc9AZ9KiPr1JuZjsNtyHzrsfLRrY0tk2H2aoFu6RANO1y1iPPUCDYWkb5g==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [aix] + requiresBuild: true + optional: true + + /@esbuild/android-arm64@0.20.2: + resolution: {integrity: sha512-mRzjLacRtl/tWU0SvD8lUEwb61yP9cqQo6noDZP/O8VkwafSYwZ4yWy24kan8jE/IMERpYncRt2dw438LP3Xmg==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] + requiresBuild: true + optional: true + + /@esbuild/android-arm@0.20.2: + resolution: {integrity: sha512-t98Ra6pw2VaDhqNWO2Oph2LXbz/EJcnLmKLGBJwEwXX/JAN83Fym1rU8l0JUWK6HkIbWONCSSatf4sf2NBRx/w==} + engines: {node: '>=12'} + cpu: [arm] + os: [android] + requiresBuild: true + optional: true + + /@esbuild/android-x64@0.20.2: + resolution: {integrity: sha512-btzExgV+/lMGDDa194CcUQm53ncxzeBrWJcncOBxuC6ndBkKxnHdFJn86mCIgTELsooUmwUm9FkhSp5HYu00Rg==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] + requiresBuild: true + optional: true + + /@esbuild/darwin-arm64@0.20.2: + resolution: {integrity: sha512-4J6IRT+10J3aJH3l1yzEg9y3wkTDgDk7TSDFX+wKFiWjqWp/iCfLIYzGyasx9l0SAFPT1HwSCR+0w/h1ES/MjA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] + requiresBuild: true + optional: true + + /@esbuild/darwin-x64@0.20.2: + resolution: {integrity: sha512-tBcXp9KNphnNH0dfhv8KYkZhjc+H3XBkF5DKtswJblV7KlT9EI2+jeA8DgBjp908WEuYll6pF+UStUCfEpdysA==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] + requiresBuild: true + optional: true + + /@esbuild/freebsd-arm64@0.20.2: + resolution: {integrity: sha512-d3qI41G4SuLiCGCFGUrKsSeTXyWG6yem1KcGZVS+3FYlYhtNoNgYrWcvkOoaqMhwXSMrZRl69ArHsGJ9mYdbbw==} + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] + requiresBuild: true + optional: true + + /@esbuild/freebsd-x64@0.20.2: + resolution: {integrity: sha512-d+DipyvHRuqEeM5zDivKV1KuXn9WeRX6vqSqIDgwIfPQtwMP4jaDsQsDncjTDDsExT4lR/91OLjRo8bmC1e+Cw==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] + requiresBuild: true + optional: true + + /@esbuild/linux-arm64@0.20.2: + resolution: {integrity: sha512-9pb6rBjGvTFNira2FLIWqDk/uaf42sSyLE8j1rnUpuzsODBq7FvpwHYZxQ/It/8b+QOS1RYfqgGFNLRI+qlq2A==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + requiresBuild: true + optional: true + + /@esbuild/linux-arm@0.20.2: + resolution: {integrity: sha512-VhLPeR8HTMPccbuWWcEUD1Az68TqaTYyj6nfE4QByZIQEQVWBB8vup8PpR7y1QHL3CpcF6xd5WVBU/+SBEvGTg==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] + requiresBuild: true + optional: true + + /@esbuild/linux-ia32@0.20.2: + resolution: {integrity: sha512-o10utieEkNPFDZFQm9CoP7Tvb33UutoJqg3qKf1PWVeeJhJw0Q347PxMvBgVVFgouYLGIhFYG0UGdBumROyiig==} + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] + requiresBuild: true + optional: true + + /@esbuild/linux-loong64@0.20.2: + resolution: {integrity: sha512-PR7sp6R/UC4CFVomVINKJ80pMFlfDfMQMYynX7t1tNTeivQ6XdX5r2XovMmha/VjR1YN/HgHWsVcTRIMkymrgQ==} + engines: {node: '>=12'} + cpu: [loong64] + os: [linux] + requiresBuild: true + optional: true + + /@esbuild/linux-mips64el@0.20.2: + resolution: {integrity: sha512-4BlTqeutE/KnOiTG5Y6Sb/Hw6hsBOZapOVF6njAESHInhlQAghVVZL1ZpIctBOoTFbQyGW+LsVYZ8lSSB3wkjA==} + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] + requiresBuild: true + optional: true + + /@esbuild/linux-ppc64@0.20.2: + resolution: {integrity: sha512-rD3KsaDprDcfajSKdn25ooz5J5/fWBylaaXkuotBDGnMnDP1Uv5DLAN/45qfnf3JDYyJv/ytGHQaziHUdyzaAg==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] + requiresBuild: true + optional: true + + /@esbuild/linux-riscv64@0.20.2: + resolution: {integrity: sha512-snwmBKacKmwTMmhLlz/3aH1Q9T8v45bKYGE3j26TsaOVtjIag4wLfWSiZykXzXuE1kbCE+zJRmwp+ZbIHinnVg==} + engines: {node: '>=12'} + cpu: [riscv64] + os: [linux] + requiresBuild: true + optional: true + + /@esbuild/linux-s390x@0.20.2: + resolution: {integrity: sha512-wcWISOobRWNm3cezm5HOZcYz1sKoHLd8VL1dl309DiixxVFoFe/o8HnwuIwn6sXre88Nwj+VwZUvJf4AFxkyrQ==} + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] + requiresBuild: true + optional: true + + /@esbuild/linux-x64@0.20.2: + resolution: {integrity: sha512-1MdwI6OOTsfQfek8sLwgyjOXAu+wKhLEoaOLTjbijk6E2WONYpH9ZU2mNtR+lZ2B4uwr+usqGuVfFT9tMtGvGw==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] + requiresBuild: true + optional: true + + /@esbuild/netbsd-x64@0.20.2: + resolution: {integrity: sha512-K8/DhBxcVQkzYc43yJXDSyjlFeHQJBiowJ0uVL6Tor3jGQfSGHNNJcWxNbOI8v5k82prYqzPuwkzHt3J1T1iZQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] + requiresBuild: true + optional: true + + /@esbuild/openbsd-x64@0.20.2: + resolution: {integrity: sha512-eMpKlV0SThJmmJgiVyN9jTPJ2VBPquf6Kt/nAoo6DgHAoN57K15ZghiHaMvqjCye/uU4X5u3YSMgVBI1h3vKrQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] + requiresBuild: true + optional: true + + /@esbuild/sunos-x64@0.20.2: + resolution: {integrity: sha512-2UyFtRC6cXLyejf/YEld4Hajo7UHILetzE1vsRcGL3earZEW77JxrFjH4Ez2qaTiEfMgAXxfAZCm1fvM/G/o8w==} + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] + requiresBuild: true + optional: true + + /@esbuild/win32-arm64@0.20.2: + resolution: {integrity: sha512-GRibxoawM9ZCnDxnP3usoUDO9vUkpAxIIZ6GQI+IlVmr5kP3zUq+l17xELTHMWTWzjxa2guPNyrpq1GWmPvcGQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] + requiresBuild: true + optional: true + + /@esbuild/win32-ia32@0.20.2: + resolution: {integrity: sha512-HfLOfn9YWmkSKRQqovpnITazdtquEW8/SoHW7pWpuEeguaZI4QnCRW6b+oZTztdBnZOS2hqJ6im/D5cPzBTTlQ==} + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] + requiresBuild: true + optional: true + + /@esbuild/win32-x64@0.20.2: + resolution: {integrity: sha512-N49X4lJX27+l9jbLKSqZ6bKNjzQvHaT8IIFUy+YIqmXQdjYCToGWwOItDrfby14c78aDd5NHQl29xingXfCdLQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + requiresBuild: true + optional: true + + /@eslint-community/eslint-utils@4.4.0(eslint@8.57.0): + resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 + dependencies: + eslint: 8.57.0 + eslint-visitor-keys: 3.4.3 + dev: true + + /@eslint-community/regexpp@4.10.0: + resolution: {integrity: sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==} + engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} + dev: true + + /@eslint/eslintrc@2.1.4: + resolution: {integrity: sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + ajv: 6.12.6 + debug: 4.3.4 + espree: 9.6.1 + globals: 13.24.0 + ignore: 5.3.1 + import-fresh: 3.3.0 + js-yaml: 4.1.0 + minimatch: 3.1.2 + strip-json-comments: 3.1.1 + transitivePeerDependencies: + - supports-color + dev: true + + /@eslint/js@8.57.0: + resolution: {integrity: sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dev: true + + /@humanwhocodes/config-array@0.11.14: + resolution: {integrity: sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==} + engines: {node: '>=10.10.0'} + dependencies: + '@humanwhocodes/object-schema': 2.0.2 + debug: 4.3.4 + minimatch: 3.1.2 + transitivePeerDependencies: + - supports-color + dev: true + + /@humanwhocodes/module-importer@1.0.1: + resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} + engines: {node: '>=12.22'} + dev: true + + /@humanwhocodes/object-schema@2.0.2: + resolution: {integrity: sha512-6EwiSjwWYP7pTckG6I5eyFANjPhmPjUX9JRLUSfNPC7FX7zK9gyZAfUEaECL6ALTpGX5AjnBq3C9XmVWPitNpw==} + dev: true + + /@isaacs/cliui@8.0.2: + resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} + engines: {node: '>=12'} + dependencies: + string-width: 5.1.2 + string-width-cjs: /string-width@4.2.3 + strip-ansi: 7.1.0 + strip-ansi-cjs: /strip-ansi@6.0.1 + wrap-ansi: 8.1.0 + wrap-ansi-cjs: /wrap-ansi@7.0.0 + dev: true + + /@istanbuljs/load-nyc-config@1.1.0: + resolution: {integrity: sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==} + engines: {node: '>=8'} + dependencies: + camelcase: 5.3.1 + find-up: 4.1.0 + get-package-type: 0.1.0 + js-yaml: 3.14.1 + resolve-from: 5.0.0 + dev: true + + /@istanbuljs/schema@0.1.3: + resolution: {integrity: sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==} + engines: {node: '>=8'} + dev: true + + /@jest/console@29.7.0: + resolution: {integrity: sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/types': 29.6.3 + '@types/node': 20.12.2 + chalk: 4.1.2 + jest-message-util: 29.7.0 + jest-util: 29.7.0 + slash: 3.0.0 + dev: true + + /@jest/core@29.7.0: + resolution: {integrity: sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + dependencies: + '@jest/console': 29.7.0 + '@jest/reporters': 29.7.0 + '@jest/test-result': 29.7.0 + '@jest/transform': 29.7.0 + '@jest/types': 29.6.3 + '@types/node': 20.12.2 + ansi-escapes: 4.3.2 + chalk: 4.1.2 + ci-info: 3.9.0 + exit: 0.1.2 + graceful-fs: 4.2.11 + jest-changed-files: 29.7.0 + jest-config: 29.7.0(@types/node@20.12.2) + jest-haste-map: 29.7.0 + jest-message-util: 29.7.0 + jest-regex-util: 29.6.3 + jest-resolve: 29.7.0 + jest-resolve-dependencies: 29.7.0 + jest-runner: 29.7.0 + jest-runtime: 29.7.0 + jest-snapshot: 29.7.0 + jest-util: 29.7.0 + jest-validate: 29.7.0 + jest-watcher: 29.7.0 + micromatch: 4.0.5 + pretty-format: 29.7.0 + slash: 3.0.0 + strip-ansi: 6.0.1 + transitivePeerDependencies: + - babel-plugin-macros + - supports-color + - ts-node + dev: true + + /@jest/environment@29.7.0: + resolution: {integrity: sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/fake-timers': 29.7.0 + '@jest/types': 29.6.3 + '@types/node': 20.12.2 + jest-mock: 29.7.0 + dev: true + + /@jest/expect-utils@29.7.0: + resolution: {integrity: sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + jest-get-type: 29.6.3 + dev: true + + /@jest/expect@29.7.0: + resolution: {integrity: sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + expect: 29.7.0 + jest-snapshot: 29.7.0 + transitivePeerDependencies: + - supports-color + dev: true + + /@jest/fake-timers@29.7.0: + resolution: {integrity: sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/types': 29.6.3 + '@sinonjs/fake-timers': 10.3.0 + '@types/node': 20.12.2 + jest-message-util: 29.7.0 + jest-mock: 29.7.0 + jest-util: 29.7.0 + dev: true + + /@jest/globals@29.7.0: + resolution: {integrity: sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/environment': 29.7.0 + '@jest/expect': 29.7.0 + '@jest/types': 29.6.3 + jest-mock: 29.7.0 + transitivePeerDependencies: + - supports-color + dev: true + + /@jest/reporters@29.7.0: + resolution: {integrity: sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + dependencies: + '@bcoe/v8-coverage': 0.2.3 + '@jest/console': 29.7.0 + '@jest/test-result': 29.7.0 + '@jest/transform': 29.7.0 + '@jest/types': 29.6.3 + '@jridgewell/trace-mapping': 0.3.25 + '@types/node': 20.12.2 + chalk: 4.1.2 + collect-v8-coverage: 1.0.2 + exit: 0.1.2 + glob: 7.2.3 + graceful-fs: 4.2.11 + istanbul-lib-coverage: 3.2.2 + istanbul-lib-instrument: 6.0.2 + istanbul-lib-report: 3.0.1 + istanbul-lib-source-maps: 4.0.1 + istanbul-reports: 3.1.7 + jest-message-util: 29.7.0 + jest-util: 29.7.0 + jest-worker: 29.7.0 + slash: 3.0.0 + string-length: 4.0.2 + strip-ansi: 6.0.1 + v8-to-istanbul: 9.2.0 + transitivePeerDependencies: + - supports-color + dev: true + + /@jest/schemas@29.6.3: + resolution: {integrity: sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@sinclair/typebox': 0.27.8 + dev: true + + /@jest/source-map@29.6.3: + resolution: {integrity: sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jridgewell/trace-mapping': 0.3.25 + callsites: 3.1.0 + graceful-fs: 4.2.11 + dev: true + + /@jest/test-result@29.7.0: + resolution: {integrity: sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/console': 29.7.0 + '@jest/types': 29.6.3 + '@types/istanbul-lib-coverage': 2.0.6 + collect-v8-coverage: 1.0.2 + dev: true + + /@jest/test-sequencer@29.7.0: + resolution: {integrity: sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/test-result': 29.7.0 + graceful-fs: 4.2.11 + jest-haste-map: 29.7.0 + slash: 3.0.0 + dev: true + + /@jest/transform@29.7.0: + resolution: {integrity: sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@babel/core': 7.24.3 + '@jest/types': 29.6.3 + '@jridgewell/trace-mapping': 0.3.25 + babel-plugin-istanbul: 6.1.1 + chalk: 4.1.2 + convert-source-map: 2.0.0 + fast-json-stable-stringify: 2.1.0 + graceful-fs: 4.2.11 + jest-haste-map: 29.7.0 + jest-regex-util: 29.6.3 + jest-util: 29.7.0 + micromatch: 4.0.5 + pirates: 4.0.6 + slash: 3.0.0 + write-file-atomic: 4.0.2 + transitivePeerDependencies: + - supports-color + dev: true + + /@jest/types@29.6.3: + resolution: {integrity: sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/schemas': 29.6.3 + '@types/istanbul-lib-coverage': 2.0.6 + '@types/istanbul-reports': 3.0.4 + '@types/node': 20.12.2 + '@types/yargs': 17.0.32 + chalk: 4.1.2 + dev: true + + /@jridgewell/gen-mapping@0.3.5: + resolution: {integrity: sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==} + engines: {node: '>=6.0.0'} + dependencies: + '@jridgewell/set-array': 1.2.1 + '@jridgewell/sourcemap-codec': 1.4.15 + '@jridgewell/trace-mapping': 0.3.25 + dev: true + + /@jridgewell/resolve-uri@3.1.2: + resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} + engines: {node: '>=6.0.0'} + dev: true + + /@jridgewell/set-array@1.2.1: + resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==} + engines: {node: '>=6.0.0'} + dev: true + + /@jridgewell/sourcemap-codec@1.4.15: + resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} + + /@jridgewell/trace-mapping@0.3.25: + resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} + dependencies: + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.4.15 + dev: true + + /@nodelib/fs.scandir@2.1.5: + resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} + engines: {node: '>= 8'} + dependencies: + '@nodelib/fs.stat': 2.0.5 + run-parallel: 1.2.0 + dev: true + + /@nodelib/fs.stat@2.0.5: + resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} + engines: {node: '>= 8'} + dev: true + + /@nodelib/fs.walk@1.2.8: + resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} + engines: {node: '>= 8'} + dependencies: + '@nodelib/fs.scandir': 2.1.5 + fastq: 1.17.1 + dev: true + + /@pkgjs/parseargs@0.11.0: + resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} + engines: {node: '>=14'} + requiresBuild: true + dev: true + optional: true + + /@rollup/plugin-json@6.1.0(rollup@4.13.2): + resolution: {integrity: sha512-EGI2te5ENk1coGeADSIwZ7G2Q8CJS2sF120T7jLw4xFw9n7wIOXHo+kIYRAoVpJAN+kmqZSoO3Fp4JtoNF4ReA==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 + peerDependenciesMeta: + rollup: + optional: true + dependencies: + '@rollup/pluginutils': 5.1.0(rollup@4.13.2) + rollup: 4.13.2 + dev: true + + /@rollup/pluginutils@5.1.0(rollup@4.13.2): + resolution: {integrity: sha512-XTIWOPPcpvyKI6L1NHo0lFlCyznUEyPmPY1mc3KpPVDYulHSTvyeLNVW00QTLIAFNhR3kYnJTQHeGqU4M3n09g==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 + peerDependenciesMeta: + rollup: + optional: true + dependencies: + '@types/estree': 1.0.5 + estree-walker: 2.0.2 + picomatch: 2.3.1 + rollup: 4.13.2 + + /@rollup/rollup-android-arm-eabi@4.13.2: + resolution: {integrity: sha512-3XFIDKWMFZrMnao1mJhnOT1h2g0169Os848NhhmGweEcfJ4rCi+3yMCOLG4zA61rbJdkcrM/DjVZm9Hg5p5w7g==} + cpu: [arm] + os: [android] + requiresBuild: true + optional: true + + /@rollup/rollup-android-arm64@4.13.2: + resolution: {integrity: sha512-GdxxXbAuM7Y/YQM9/TwwP+L0omeE/lJAR1J+olu36c3LqqZEBdsIWeQ91KBe6nxwOnb06Xh7JS2U5ooWU5/LgQ==} + cpu: [arm64] + os: [android] + requiresBuild: true + optional: true + + /@rollup/rollup-darwin-arm64@4.13.2: + resolution: {integrity: sha512-mCMlpzlBgOTdaFs83I4XRr8wNPveJiJX1RLfv4hggyIVhfB5mJfN4P8Z6yKh+oE4Luz+qq1P3kVdWrCKcMYrrA==} + cpu: [arm64] + os: [darwin] + requiresBuild: true + optional: true + + /@rollup/rollup-darwin-x64@4.13.2: + resolution: {integrity: sha512-yUoEvnH0FBef/NbB1u6d3HNGyruAKnN74LrPAfDQL3O32e3k3OSfLrPgSJmgb3PJrBZWfPyt6m4ZhAFa2nZp2A==} + cpu: [x64] + os: [darwin] + requiresBuild: true + optional: true + + /@rollup/rollup-linux-arm-gnueabihf@4.13.2: + resolution: {integrity: sha512-GYbLs5ErswU/Xs7aGXqzc3RrdEjKdmoCrgzhJWyFL0r5fL3qd1NPcDKDowDnmcoSiGJeU68/Vy+OMUluRxPiLQ==} + cpu: [arm] + os: [linux] + requiresBuild: true + optional: true + + /@rollup/rollup-linux-arm64-gnu@4.13.2: + resolution: {integrity: sha512-L1+D8/wqGnKQIlh4Zre9i4R4b4noxzH5DDciyahX4oOz62CphY7WDWqJoQ66zNR4oScLNOqQJfNSIAe/6TPUmQ==} + cpu: [arm64] + os: [linux] + requiresBuild: true + optional: true + + /@rollup/rollup-linux-arm64-musl@4.13.2: + resolution: {integrity: sha512-tK5eoKFkXdz6vjfkSTCupUzCo40xueTOiOO6PeEIadlNBkadH1wNOH8ILCPIl8by/Gmb5AGAeQOFeLev7iZDOA==} + cpu: [arm64] + os: [linux] + requiresBuild: true + optional: true + + /@rollup/rollup-linux-powerpc64le-gnu@4.13.2: + resolution: {integrity: sha512-zvXvAUGGEYi6tYhcDmb9wlOckVbuD+7z3mzInCSTACJ4DQrdSLPNUeDIcAQW39M3q6PDquqLWu7pnO39uSMRzQ==} + cpu: [ppc64le] + os: [linux] + requiresBuild: true + optional: true + + /@rollup/rollup-linux-riscv64-gnu@4.13.2: + resolution: {integrity: sha512-C3GSKvMtdudHCN5HdmAMSRYR2kkhgdOfye4w0xzyii7lebVr4riCgmM6lRiSCnJn2w1Xz7ZZzHKuLrjx5620kw==} + cpu: [riscv64] + os: [linux] + requiresBuild: true + optional: true + + /@rollup/rollup-linux-s390x-gnu@4.13.2: + resolution: {integrity: sha512-l4U0KDFwzD36j7HdfJ5/TveEQ1fUTjFFQP5qIt9gBqBgu1G8/kCaq5Ok05kd5TG9F8Lltf3MoYsUMw3rNlJ0Yg==} + cpu: [s390x] + os: [linux] + requiresBuild: true + optional: true + + /@rollup/rollup-linux-x64-gnu@4.13.2: + resolution: {integrity: sha512-xXMLUAMzrtsvh3cZ448vbXqlUa7ZL8z0MwHp63K2IIID2+DeP5iWIT6g1SN7hg1VxPzqx0xZdiDM9l4n9LRU1A==} + cpu: [x64] + os: [linux] + requiresBuild: true + optional: true + + /@rollup/rollup-linux-x64-musl@4.13.2: + resolution: {integrity: sha512-M/JYAWickafUijWPai4ehrjzVPKRCyDb1SLuO+ZyPfoXgeCEAlgPkNXewFZx0zcnoIe3ay4UjXIMdXQXOZXWqA==} + cpu: [x64] + os: [linux] + requiresBuild: true + optional: true + + /@rollup/rollup-win32-arm64-msvc@4.13.2: + resolution: {integrity: sha512-2YWwoVg9KRkIKaXSh0mz3NmfurpmYoBBTAXA9qt7VXk0Xy12PoOP40EFuau+ajgALbbhi4uTj3tSG3tVseCjuA==} + cpu: [arm64] + os: [win32] + requiresBuild: true + optional: true + + /@rollup/rollup-win32-ia32-msvc@4.13.2: + resolution: {integrity: sha512-2FSsE9aQ6OWD20E498NYKEQLneShWes0NGMPQwxWOdws35qQXH+FplabOSP5zEe1pVjurSDOGEVCE2agFwSEsw==} + cpu: [ia32] + os: [win32] + requiresBuild: true + optional: true + + /@rollup/rollup-win32-x64-msvc@4.13.2: + resolution: {integrity: sha512-7h7J2nokcdPePdKykd8wtc8QqqkqxIrUz7MHj6aNr8waBRU//NLDVnNjQnqQO6fqtjrtCdftpbTuOKAyrAQETQ==} + cpu: [x64] + os: [win32] + requiresBuild: true + optional: true + + /@sinclair/typebox@0.27.8: + resolution: {integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==} + dev: true + + /@sinclair/typebox@0.31.28: + resolution: {integrity: sha512-/s55Jujywdw/Jpan+vsy6JZs1z2ZTGxTmbZTPiuSL2wz9mfzA2gN1zzaqmvfi4pq+uOt7Du85fkiwv5ymW84aQ==} + dev: false + + /@sinonjs/commons@3.0.1: + resolution: {integrity: sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==} + dependencies: + type-detect: 4.0.8 + dev: true + + /@sinonjs/fake-timers@10.3.0: + resolution: {integrity: sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==} + dependencies: + '@sinonjs/commons': 3.0.1 + dev: true + + /@types/babel__core@7.20.5: + resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==} + dependencies: + '@babel/parser': 7.24.1 + '@babel/types': 7.24.0 + '@types/babel__generator': 7.6.8 + '@types/babel__template': 7.4.4 + '@types/babel__traverse': 7.20.5 + dev: true + + /@types/babel__generator@7.6.8: + resolution: {integrity: sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==} + dependencies: + '@babel/types': 7.24.0 + dev: true + + /@types/babel__template@7.4.4: + resolution: {integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==} + dependencies: + '@babel/parser': 7.24.1 + '@babel/types': 7.24.0 + dev: true + + /@types/babel__traverse@7.20.5: + resolution: {integrity: sha512-WXCyOcRtH37HAUkpXhUduaxdm82b4GSlyTqajXviN4EfiuPgNYR109xMCKvpl6zPIpua0DGlMEDCq+g8EdoheQ==} + dependencies: + '@babel/types': 7.24.0 + dev: true + + /@types/estree@1.0.5: + resolution: {integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==} + + /@types/graceful-fs@4.1.9: + resolution: {integrity: sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==} + dependencies: + '@types/node': 20.12.2 + dev: true + + /@types/istanbul-lib-coverage@2.0.6: + resolution: {integrity: sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==} + dev: true + + /@types/istanbul-lib-report@3.0.3: + resolution: {integrity: sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==} + dependencies: + '@types/istanbul-lib-coverage': 2.0.6 + dev: true + + /@types/istanbul-reports@3.0.4: + resolution: {integrity: sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==} + dependencies: + '@types/istanbul-lib-report': 3.0.3 + dev: true + + /@types/jest@29.5.12: + resolution: {integrity: sha512-eDC8bTvT/QhYdxJAulQikueigY5AsdBRH2yDKW3yveW7svY3+DzN84/2NUgkw10RTiJbWqZrTtoGVdYlvFJdLw==} + dependencies: + expect: 29.7.0 + pretty-format: 29.7.0 + dev: true + + /@types/node@20.11.30: + resolution: {integrity: sha512-dHM6ZxwlmuZaRmUPfv1p+KrdD1Dci04FbdEm/9wEMouFqxYoFl5aMkt0VMAUtYRQDyYvD41WJLukhq/ha3YuTw==} + dependencies: + undici-types: 5.26.5 + dev: true + + /@types/node@20.12.2: + resolution: {integrity: sha512-zQ0NYO87hyN6Xrclcqp7f8ZbXNbRfoGWNcMvHTPQp9UUrwI0mI7XBz+cu7/W6/VClYo2g63B0cjull/srU7LgQ==} + dependencies: + undici-types: 5.26.5 + dev: true + + /@types/sha256@0.2.2: + resolution: {integrity: sha512-uKMaDzyzfcDYGEwTgLh+hmgDMxXWyIVodY8T+qt7A+NYvikW0lmGLMGbQ7BipCB8dzXHa55C9g+Ii/3Lgt1KmA==} + dependencies: + '@types/node': 20.12.2 + dev: true + + /@types/stack-utils@2.0.3: + resolution: {integrity: sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==} + dev: true + + /@types/ws@8.5.10: + resolution: {integrity: sha512-vmQSUcfalpIq0R9q7uTo2lXs6eGIpt9wtnLdMv9LVpIjCA/+ufZRozlVoVelIYixx1ugCBKDhn89vnsEGOCx9A==} + dependencies: + '@types/node': 20.12.2 + dev: true + + /@types/yargs-parser@21.0.3: + resolution: {integrity: sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==} + dev: true + + /@types/yargs@17.0.32: + resolution: {integrity: sha512-xQ67Yc/laOG5uMfX/093MRlGGCIBzZMarVa+gfNKJxWAIgykYpVGkBdbqEzGDDfCrVUj6Hiff4mTZ5BA6TmAog==} + dependencies: + '@types/yargs-parser': 21.0.3 + dev: true + + /@ungap/structured-clone@1.2.0: + resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==} + dev: true + + /acorn-jsx@5.3.2(acorn@8.11.3): + resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} + peerDependencies: + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + dependencies: + acorn: 8.11.3 + dev: true + + /acorn@8.11.3: + resolution: {integrity: sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==} + engines: {node: '>=0.4.0'} + hasBin: true + dev: true + + /ajv@6.12.6: + resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} + dependencies: + fast-deep-equal: 3.1.3 + fast-json-stable-stringify: 2.1.0 + json-schema-traverse: 0.4.1 + uri-js: 4.4.1 + dev: true + + /ansi-escapes@4.3.2: + resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==} + engines: {node: '>=8'} + dependencies: + type-fest: 0.21.3 + dev: true + + /ansi-regex@5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} + dev: true + + /ansi-regex@6.0.1: + resolution: {integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==} + engines: {node: '>=12'} + dev: true + + /ansi-styles@3.2.1: + resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} + engines: {node: '>=4'} + dependencies: + color-convert: 1.9.3 + + /ansi-styles@4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} + dependencies: + color-convert: 2.0.1 + dev: true + + /ansi-styles@5.2.0: + resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} + engines: {node: '>=10'} + dev: true + + /ansi-styles@6.2.1: + resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} + engines: {node: '>=12'} + dev: true + + /anymatch@3.1.3: + resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} + engines: {node: '>= 8'} + dependencies: + normalize-path: 3.0.0 + picomatch: 2.3.1 + dev: true + + /argparse@1.0.10: + resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} + dependencies: + sprintf-js: 1.0.3 + dev: true + + /argparse@2.0.1: + resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + dev: true + + /babel-jest@29.7.0(@babel/core@7.24.3): + resolution: {integrity: sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + peerDependencies: + '@babel/core': ^7.8.0 + dependencies: + '@babel/core': 7.24.3 + '@jest/transform': 29.7.0 + '@types/babel__core': 7.20.5 + babel-plugin-istanbul: 6.1.1 + babel-preset-jest: 29.6.3(@babel/core@7.24.3) + chalk: 4.1.2 + graceful-fs: 4.2.11 + slash: 3.0.0 + transitivePeerDependencies: + - supports-color + dev: true + + /babel-plugin-istanbul@6.1.1: + resolution: {integrity: sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==} + engines: {node: '>=8'} + dependencies: + '@babel/helper-plugin-utils': 7.24.0 + '@istanbuljs/load-nyc-config': 1.1.0 + '@istanbuljs/schema': 0.1.3 + istanbul-lib-instrument: 5.2.1 + test-exclude: 6.0.0 + transitivePeerDependencies: + - supports-color + dev: true + + /babel-plugin-jest-hoist@29.6.3: + resolution: {integrity: sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@babel/template': 7.24.0 + '@babel/types': 7.24.0 + '@types/babel__core': 7.20.5 + '@types/babel__traverse': 7.20.5 + dev: true + + /babel-preset-current-node-syntax@1.0.1(@babel/core@7.24.3): + resolution: {integrity: sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.24.3 + '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.24.3) + '@babel/plugin-syntax-bigint': 7.8.3(@babel/core@7.24.3) + '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.24.3) + '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.24.3) + '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.24.3) + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.24.3) + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.24.3) + '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.24.3) + '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.24.3) + '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.24.3) + '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.24.3) + '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.24.3) + dev: true + + /babel-preset-jest@29.6.3(@babel/core@7.24.3): + resolution: {integrity: sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.24.3 + babel-plugin-jest-hoist: 29.6.3 + babel-preset-current-node-syntax: 1.0.1(@babel/core@7.24.3) + dev: true + + /balanced-match@1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + dev: true + + /brace-expansion@1.1.11: + resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} + dependencies: + balanced-match: 1.0.2 + concat-map: 0.0.1 + dev: true + + /brace-expansion@2.0.1: + resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} + dependencies: + balanced-match: 1.0.2 + dev: true + + /braces@3.0.2: + resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} + engines: {node: '>=8'} + dependencies: + fill-range: 7.0.1 + dev: true + + /browserslist@4.23.0: + resolution: {integrity: sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true + dependencies: + caniuse-lite: 1.0.30001603 + electron-to-chromium: 1.4.722 + node-releases: 2.0.14 + update-browserslist-db: 1.0.13(browserslist@4.23.0) + dev: true + + /bs-logger@0.2.6: + resolution: {integrity: sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==} + engines: {node: '>= 6'} + dependencies: + fast-json-stable-stringify: 2.1.0 + dev: true + + /bser@2.1.1: + resolution: {integrity: sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==} + dependencies: + node-int64: 0.4.0 + dev: true + + /buffer-from@1.1.2: + resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} + dev: true + + /bun-types@1.0.36: + resolution: {integrity: sha512-gaIb1SyhB0JZfIEg73/kSFhqolUqJXC68peguhXGwqr27HuvI8nkD0LTIHp/1DY4cNadfXHYgYrZIWX7oEoXlg==} + dependencies: + '@types/node': 20.11.30 + '@types/ws': 8.5.10 + dev: true + + /callsites@3.1.0: + resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} + engines: {node: '>=6'} + dev: true + + /camelcase@5.3.1: + resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==} + engines: {node: '>=6'} + dev: true + + /camelcase@6.3.0: + resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} + engines: {node: '>=10'} + dev: true + + /caniuse-lite@1.0.30001603: + resolution: {integrity: sha512-iL2iSS0eDILMb9n5yKQoTBim9jMZ0Yrk8g0N9K7UzYyWnfIKzXBZD5ngpM37ZcL/cv0Mli8XtVMRYMQAfFpi5Q==} + dev: true + + /chalk@2.4.2: + resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} + engines: {node: '>=4'} + dependencies: + ansi-styles: 3.2.1 + escape-string-regexp: 1.0.5 + supports-color: 5.5.0 + + /chalk@4.1.2: + resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} + engines: {node: '>=10'} + dependencies: + ansi-styles: 4.3.0 + supports-color: 7.2.0 + dev: true + + /char-regex@1.0.2: + resolution: {integrity: sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==} + engines: {node: '>=10'} + dev: true + + /ci-info@3.9.0: + resolution: {integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==} + engines: {node: '>=8'} + dev: true + + /cjs-module-lexer@1.2.3: + resolution: {integrity: sha512-0TNiGstbQmCFwt4akjjBg5pLRTSyj/PkWQ1ZoO2zntmg9yLqSRxwEa4iCfQLGjqhiqBfOJa7W/E8wfGrTDmlZQ==} + dev: true + + /cliui@8.0.1: + resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} + engines: {node: '>=12'} + dependencies: + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 7.0.0 + dev: true + + /co@4.6.0: + resolution: {integrity: sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==} + engines: {iojs: '>= 1.0.0', node: '>= 0.12.0'} + dev: true + + /collect-v8-coverage@1.0.2: + resolution: {integrity: sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==} + dev: true + + /color-convert@1.9.3: + resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} + dependencies: + color-name: 1.1.3 + + /color-convert@2.0.1: + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + engines: {node: '>=7.0.0'} + dependencies: + color-name: 1.1.4 + dev: true + + /color-name@1.1.3: + resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} + + /color-name@1.1.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + dev: true + + /concat-map@0.0.1: + resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + dev: true + + /convert-hex@0.1.0: + resolution: {integrity: sha512-w20BOb1PiR/sEJdS6wNrUjF5CSfscZFUp7R9NSlXH8h2wynzXVEPFPJECAnkNylZ+cvf3p7TyRUHggDmrwXT9A==} + dev: false + + /convert-source-map@2.0.0: + resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} + dev: true + + /convert-string@0.1.0: + resolution: {integrity: sha512-1KX9ESmtl8xpT2LN2tFnKSbV4NiarbVi8DVb39ZriijvtTklyrT+4dT1wsGMHKD3CJUjXgvJzstm9qL9ICojGA==} + dev: false + + /create-jest@29.7.0(@types/node@20.12.2): + resolution: {integrity: sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + hasBin: true + dependencies: + '@jest/types': 29.6.3 + chalk: 4.1.2 + exit: 0.1.2 + graceful-fs: 4.2.11 + jest-config: 29.7.0(@types/node@20.12.2) + jest-util: 29.7.0 + prompts: 2.4.2 + transitivePeerDependencies: + - '@types/node' + - babel-plugin-macros + - supports-color + - ts-node + dev: true + + /cross-spawn@7.0.3: + resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} + engines: {node: '>= 8'} + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + dev: true + + /debug@4.3.4: + resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + dependencies: + ms: 2.1.2 + + /dedent@1.5.1: + resolution: {integrity: sha512-+LxW+KLWxu3HW3M2w2ympwtqPrqYRzU8fqi6Fhd18fBALe15blJPI/I4+UHveMVG6lJqB4JNd4UG0S5cnVHwIg==} + peerDependencies: + babel-plugin-macros: ^3.1.0 + peerDependenciesMeta: + babel-plugin-macros: + optional: true + dev: true + + /deep-is@0.1.4: + resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} + dev: true + + /deepmerge@4.3.1: + resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} + engines: {node: '>=0.10.0'} + dev: true + + /detect-newline@3.1.0: + resolution: {integrity: sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==} + engines: {node: '>=8'} + dev: true + + /diff-sequences@29.6.3: + resolution: {integrity: sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dev: true + + /doctrine@3.0.0: + resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} + engines: {node: '>=6.0.0'} + dependencies: + esutils: 2.0.3 + dev: true + + /eastasianwidth@0.2.0: + resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} + dev: true + + /electron-to-chromium@1.4.722: + resolution: {integrity: sha512-5nLE0TWFFpZ80Crhtp4pIp8LXCztjYX41yUcV6b+bKR2PqzjskTMOOlBi1VjBHlvHwS+4gar7kNKOrsbsewEZQ==} + dev: true + + /emittery@0.13.1: + resolution: {integrity: sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==} + engines: {node: '>=12'} + dev: true + + /emoji-regex@8.0.0: + resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + dev: true + + /emoji-regex@9.2.2: + resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} + dev: true + + /error-ex@1.3.2: + resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} + dependencies: + is-arrayish: 0.2.1 + dev: true + + /es-module-lexer@1.5.0: + resolution: {integrity: sha512-pqrTKmwEIgafsYZAGw9kszYzmagcE/n4dbgwGWLEXg7J4QFJVQRBld8j3Q3GNez79jzxZshq0bcT962QHOghjw==} + dev: false + + /esbuild@0.20.2: + resolution: {integrity: sha512-WdOOppmUNU+IbZ0PaDiTst80zjnrOkyJNHoKupIcVyU8Lvla3Ugx94VzkQ32Ijqd7UhHJy75gNWDMUekcrSJ6g==} + engines: {node: '>=12'} + hasBin: true + requiresBuild: true + optionalDependencies: + '@esbuild/aix-ppc64': 0.20.2 + '@esbuild/android-arm': 0.20.2 + '@esbuild/android-arm64': 0.20.2 + '@esbuild/android-x64': 0.20.2 + '@esbuild/darwin-arm64': 0.20.2 + '@esbuild/darwin-x64': 0.20.2 + '@esbuild/freebsd-arm64': 0.20.2 + '@esbuild/freebsd-x64': 0.20.2 + '@esbuild/linux-arm': 0.20.2 + '@esbuild/linux-arm64': 0.20.2 + '@esbuild/linux-ia32': 0.20.2 + '@esbuild/linux-loong64': 0.20.2 + '@esbuild/linux-mips64el': 0.20.2 + '@esbuild/linux-ppc64': 0.20.2 + '@esbuild/linux-riscv64': 0.20.2 + '@esbuild/linux-s390x': 0.20.2 + '@esbuild/linux-x64': 0.20.2 + '@esbuild/netbsd-x64': 0.20.2 + '@esbuild/openbsd-x64': 0.20.2 + '@esbuild/sunos-x64': 0.20.2 + '@esbuild/win32-arm64': 0.20.2 + '@esbuild/win32-ia32': 0.20.2 + '@esbuild/win32-x64': 0.20.2 + + /escalade@3.1.2: + resolution: {integrity: sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==} + engines: {node: '>=6'} + dev: true + + /escape-string-regexp@1.0.5: + resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} + engines: {node: '>=0.8.0'} + + /escape-string-regexp@2.0.0: + resolution: {integrity: sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==} + engines: {node: '>=8'} + dev: true + + /escape-string-regexp@4.0.0: + resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} + engines: {node: '>=10'} + dev: true + + /eslint-scope@7.2.2: + resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + esrecurse: 4.3.0 + estraverse: 5.3.0 + dev: true + + /eslint-visitor-keys@3.4.3: + resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dev: true + + /eslint@8.57.0: + resolution: {integrity: sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + hasBin: true + dependencies: + '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) + '@eslint-community/regexpp': 4.10.0 + '@eslint/eslintrc': 2.1.4 + '@eslint/js': 8.57.0 + '@humanwhocodes/config-array': 0.11.14 + '@humanwhocodes/module-importer': 1.0.1 + '@nodelib/fs.walk': 1.2.8 + '@ungap/structured-clone': 1.2.0 + ajv: 6.12.6 + chalk: 4.1.2 + cross-spawn: 7.0.3 + debug: 4.3.4 + doctrine: 3.0.0 + escape-string-regexp: 4.0.0 + eslint-scope: 7.2.2 + eslint-visitor-keys: 3.4.3 + espree: 9.6.1 + esquery: 1.5.0 + esutils: 2.0.3 + fast-deep-equal: 3.1.3 + file-entry-cache: 6.0.1 + find-up: 5.0.0 + glob-parent: 6.0.2 + globals: 13.24.0 + graphemer: 1.4.0 + ignore: 5.3.1 + imurmurhash: 0.1.4 + is-glob: 4.0.3 + is-path-inside: 3.0.3 + js-yaml: 4.1.0 + json-stable-stringify-without-jsonify: 1.0.1 + levn: 0.4.1 + lodash.merge: 4.6.2 + minimatch: 3.1.2 + natural-compare: 1.4.0 + optionator: 0.9.3 + strip-ansi: 6.0.1 + text-table: 0.2.0 + transitivePeerDependencies: + - supports-color + dev: true + + /espree@9.6.1: + resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + acorn: 8.11.3 + acorn-jsx: 5.3.2(acorn@8.11.3) + eslint-visitor-keys: 3.4.3 + dev: true + + /esprima@4.0.1: + resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} + engines: {node: '>=4'} + hasBin: true + dev: true + + /esquery@1.5.0: + resolution: {integrity: sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==} + engines: {node: '>=0.10'} + dependencies: + estraverse: 5.3.0 + dev: true + + /esrecurse@4.3.0: + resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} + engines: {node: '>=4.0'} + dependencies: + estraverse: 5.3.0 + dev: true + + /estraverse@5.3.0: + resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} + engines: {node: '>=4.0'} + dev: true + + /estree-walker@2.0.2: + resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} + + /esutils@2.0.3: + resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} + engines: {node: '>=0.10.0'} + dev: true + + /execa@5.1.1: + resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} + engines: {node: '>=10'} + dependencies: + cross-spawn: 7.0.3 + get-stream: 6.0.1 + human-signals: 2.1.0 + is-stream: 2.0.1 + merge-stream: 2.0.0 + npm-run-path: 4.0.1 + onetime: 5.1.2 + signal-exit: 3.0.7 + strip-final-newline: 2.0.0 + dev: true + + /exit@0.1.2: + resolution: {integrity: sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==} + engines: {node: '>= 0.8.0'} + dev: true + + /expect@29.7.0: + resolution: {integrity: sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/expect-utils': 29.7.0 + jest-get-type: 29.6.3 + jest-matcher-utils: 29.7.0 + jest-message-util: 29.7.0 + jest-util: 29.7.0 + dev: true + + /fast-check@3.17.1: + resolution: {integrity: sha512-jIKXJVe6ZO0SpwEgVtEVujTf8TwjI9wMXFJCjsDHUB3RroUbXBgF4kOSz3A7MW0UR26aqsoB8i9O2mjtjERAiA==} + engines: {node: '>=8.0.0'} + dependencies: + pure-rand: 6.1.0 + dev: true + + /fast-deep-equal@3.1.3: + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + dev: true + + /fast-json-stable-stringify@2.1.0: + resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} + dev: true + + /fast-levenshtein@2.0.6: + resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} + dev: true + + /fastq@1.17.1: + resolution: {integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==} + dependencies: + reusify: 1.0.4 + dev: true + + /fb-watchman@2.0.2: + resolution: {integrity: sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==} + dependencies: + bser: 2.1.1 + dev: true + + /file-entry-cache@6.0.1: + resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} + engines: {node: ^10.12.0 || >=12.0.0} + dependencies: + flat-cache: 3.2.0 + dev: true + + /fill-range@7.0.1: + resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} + engines: {node: '>=8'} + dependencies: + to-regex-range: 5.0.1 + dev: true + + /find-up@4.1.0: + resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} + engines: {node: '>=8'} + dependencies: + locate-path: 5.0.0 + path-exists: 4.0.0 + dev: true + + /find-up@5.0.0: + resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} + engines: {node: '>=10'} + dependencies: + locate-path: 6.0.0 + path-exists: 4.0.0 + dev: true + + /flat-cache@3.2.0: + resolution: {integrity: sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==} + engines: {node: ^10.12.0 || >=12.0.0} + dependencies: + flatted: 3.3.1 + keyv: 4.5.4 + rimraf: 3.0.2 + dev: true + + /flatted@3.3.1: + resolution: {integrity: sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==} + dev: true + + /foreground-child@3.1.1: + resolution: {integrity: sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==} + engines: {node: '>=14'} + dependencies: + cross-spawn: 7.0.3 + signal-exit: 4.1.0 + dev: true + + /fs.realpath@1.0.0: + resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} + dev: true + + /fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + requiresBuild: true + optional: true + + /function-bind@1.1.2: + resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + dev: true + + /gensync@1.0.0-beta.2: + resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} + engines: {node: '>=6.9.0'} + dev: true + + /get-caller-file@2.0.5: + resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} + engines: {node: 6.* || 8.* || >= 10.*} + dev: true + + /get-package-type@0.1.0: + resolution: {integrity: sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==} + engines: {node: '>=8.0.0'} + dev: true + + /get-stream@6.0.1: + resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} + engines: {node: '>=10'} + dev: true + + /get-tsconfig@4.7.3: + resolution: {integrity: sha512-ZvkrzoUA0PQZM6fy6+/Hce561s+faD1rsNwhnO5FelNjyy7EMGJ3Rz1AQ8GYDWjhRs/7dBLOEJvhK8MiEJOAFg==} + dependencies: + resolve-pkg-maps: 1.0.0 + dev: false + + /glob-parent@6.0.2: + resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} + engines: {node: '>=10.13.0'} + dependencies: + is-glob: 4.0.3 + dev: true + + /glob@10.3.12: + resolution: {integrity: sha512-TCNv8vJ+xz4QiqTpfOJA7HvYv+tNIRHKfUWw/q+v2jdgN4ebz+KY9tGx5J4rHP0o84mNP+ApH66HRX8us3Khqg==} + engines: {node: '>=16 || 14 >=14.17'} + hasBin: true + dependencies: + foreground-child: 3.1.1 + jackspeak: 2.3.6 + minimatch: 9.0.4 + minipass: 7.0.4 + path-scurry: 1.10.2 + dev: true + + /glob@7.2.3: + resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 3.1.2 + once: 1.4.0 + path-is-absolute: 1.0.1 + dev: true + + /globals@11.12.0: + resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} + engines: {node: '>=4'} + dev: true + + /globals@13.24.0: + resolution: {integrity: sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==} + engines: {node: '>=8'} + dependencies: + type-fest: 0.20.2 + dev: true + + /graceful-fs@4.2.11: + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + dev: true + + /graphemer@1.4.0: + resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} + dev: true + + /has-flag@3.0.0: + resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} + engines: {node: '>=4'} + + /has-flag@4.0.0: + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + engines: {node: '>=8'} + dev: true + + /hasown@2.0.2: + resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} + engines: {node: '>= 0.4'} + dependencies: + function-bind: 1.1.2 + dev: true + + /html-escaper@2.0.2: + resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} + dev: true + + /human-signals@2.1.0: + resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} + engines: {node: '>=10.17.0'} + dev: true + + /ignore@5.3.1: + resolution: {integrity: sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==} + engines: {node: '>= 4'} + dev: true + + /import-fresh@3.3.0: + resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} + engines: {node: '>=6'} + dependencies: + parent-module: 1.0.1 + resolve-from: 4.0.0 + dev: true + + /import-local@3.1.0: + resolution: {integrity: sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==} + engines: {node: '>=8'} + hasBin: true + dependencies: + pkg-dir: 4.2.0 + resolve-cwd: 3.0.0 + dev: true + + /imurmurhash@0.1.4: + resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} + engines: {node: '>=0.8.19'} + dev: true + + /inflight@1.0.6: + resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} + dependencies: + once: 1.4.0 + wrappy: 1.0.2 + dev: true + + /inherits@2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + dev: true + + /is-arrayish@0.2.1: + resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} + dev: true + + /is-core-module@2.13.1: + resolution: {integrity: sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==} + dependencies: + hasown: 2.0.2 + dev: true + + /is-extglob@2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} + dev: true + + /is-fullwidth-code-point@3.0.0: + resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} + engines: {node: '>=8'} + dev: true + + /is-generator-fn@2.1.0: + resolution: {integrity: sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==} + engines: {node: '>=6'} + dev: true + + /is-glob@4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} + dependencies: + is-extglob: 2.1.1 + dev: true + + /is-number@7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} + dev: true + + /is-path-inside@3.0.3: + resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} + engines: {node: '>=8'} + dev: true + + /is-stream@2.0.1: + resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} + engines: {node: '>=8'} + dev: true + + /isexe@2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + dev: true + + /istanbul-lib-coverage@3.2.2: + resolution: {integrity: sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==} + engines: {node: '>=8'} + dev: true + + /istanbul-lib-instrument@5.2.1: + resolution: {integrity: sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==} + engines: {node: '>=8'} + dependencies: + '@babel/core': 7.24.3 + '@babel/parser': 7.24.1 + '@istanbuljs/schema': 0.1.3 + istanbul-lib-coverage: 3.2.2 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + dev: true + + /istanbul-lib-instrument@6.0.2: + resolution: {integrity: sha512-1WUsZ9R1lA0HtBSohTkm39WTPlNKSJ5iFk7UwqXkBLoHQT+hfqPsfsTDVuZdKGaBwn7din9bS7SsnoAr943hvw==} + engines: {node: '>=10'} + dependencies: + '@babel/core': 7.24.3 + '@babel/parser': 7.24.1 + '@istanbuljs/schema': 0.1.3 + istanbul-lib-coverage: 3.2.2 + semver: 7.6.0 + transitivePeerDependencies: + - supports-color + dev: true + + /istanbul-lib-report@3.0.1: + resolution: {integrity: sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==} + engines: {node: '>=10'} + dependencies: + istanbul-lib-coverage: 3.2.2 + make-dir: 4.0.0 + supports-color: 7.2.0 + dev: true + + /istanbul-lib-source-maps@4.0.1: + resolution: {integrity: sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==} + engines: {node: '>=10'} + dependencies: + debug: 4.3.4 + istanbul-lib-coverage: 3.2.2 + source-map: 0.6.1 + transitivePeerDependencies: + - supports-color + dev: true + + /istanbul-reports@3.1.7: + resolution: {integrity: sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==} + engines: {node: '>=8'} + dependencies: + html-escaper: 2.0.2 + istanbul-lib-report: 3.0.1 + dev: true + + /jackspeak@2.3.6: + resolution: {integrity: sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==} + engines: {node: '>=14'} + dependencies: + '@isaacs/cliui': 8.0.2 + optionalDependencies: + '@pkgjs/parseargs': 0.11.0 + dev: true + + /jest-changed-files@29.7.0: + resolution: {integrity: sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + execa: 5.1.1 + jest-util: 29.7.0 + p-limit: 3.1.0 + dev: true + + /jest-circus@29.7.0: + resolution: {integrity: sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/environment': 29.7.0 + '@jest/expect': 29.7.0 + '@jest/test-result': 29.7.0 + '@jest/types': 29.6.3 + '@types/node': 20.12.2 + chalk: 4.1.2 + co: 4.6.0 + dedent: 1.5.1 + is-generator-fn: 2.1.0 + jest-each: 29.7.0 + jest-matcher-utils: 29.7.0 + jest-message-util: 29.7.0 + jest-runtime: 29.7.0 + jest-snapshot: 29.7.0 + jest-util: 29.7.0 + p-limit: 3.1.0 + pretty-format: 29.7.0 + pure-rand: 6.1.0 + slash: 3.0.0 + stack-utils: 2.0.6 + transitivePeerDependencies: + - babel-plugin-macros + - supports-color + dev: true + + /jest-cli@29.7.0(@types/node@20.12.2): + resolution: {integrity: sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + hasBin: true + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + dependencies: + '@jest/core': 29.7.0 + '@jest/test-result': 29.7.0 + '@jest/types': 29.6.3 + chalk: 4.1.2 + create-jest: 29.7.0(@types/node@20.12.2) + exit: 0.1.2 + import-local: 3.1.0 + jest-config: 29.7.0(@types/node@20.12.2) + jest-util: 29.7.0 + jest-validate: 29.7.0 + yargs: 17.7.2 + transitivePeerDependencies: + - '@types/node' + - babel-plugin-macros + - supports-color + - ts-node + dev: true + + /jest-config@29.7.0(@types/node@20.12.2): + resolution: {integrity: sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + peerDependencies: + '@types/node': '*' + ts-node: '>=9.0.0' + peerDependenciesMeta: + '@types/node': + optional: true + ts-node: + optional: true + dependencies: + '@babel/core': 7.24.3 + '@jest/test-sequencer': 29.7.0 + '@jest/types': 29.6.3 + '@types/node': 20.12.2 + babel-jest: 29.7.0(@babel/core@7.24.3) + chalk: 4.1.2 + ci-info: 3.9.0 + deepmerge: 4.3.1 + glob: 7.2.3 + graceful-fs: 4.2.11 + jest-circus: 29.7.0 + jest-environment-node: 29.7.0 + jest-get-type: 29.6.3 + jest-regex-util: 29.6.3 + jest-resolve: 29.7.0 + jest-runner: 29.7.0 + jest-util: 29.7.0 + jest-validate: 29.7.0 + micromatch: 4.0.5 + parse-json: 5.2.0 + pretty-format: 29.7.0 + slash: 3.0.0 + strip-json-comments: 3.1.1 + transitivePeerDependencies: + - babel-plugin-macros + - supports-color + dev: true + + /jest-diff@29.7.0: + resolution: {integrity: sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + chalk: 4.1.2 + diff-sequences: 29.6.3 + jest-get-type: 29.6.3 + pretty-format: 29.7.0 + dev: true + + /jest-docblock@29.7.0: + resolution: {integrity: sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + detect-newline: 3.1.0 + dev: true + + /jest-each@29.7.0: + resolution: {integrity: sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/types': 29.6.3 + chalk: 4.1.2 + jest-get-type: 29.6.3 + jest-util: 29.7.0 + pretty-format: 29.7.0 + dev: true + + /jest-environment-node@29.7.0: + resolution: {integrity: sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/environment': 29.7.0 + '@jest/fake-timers': 29.7.0 + '@jest/types': 29.6.3 + '@types/node': 20.12.2 + jest-mock: 29.7.0 + jest-util: 29.7.0 + dev: true + + /jest-get-type@29.6.3: + resolution: {integrity: sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dev: true + + /jest-haste-map@29.7.0: + resolution: {integrity: sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/types': 29.6.3 + '@types/graceful-fs': 4.1.9 + '@types/node': 20.12.2 + anymatch: 3.1.3 + fb-watchman: 2.0.2 + graceful-fs: 4.2.11 + jest-regex-util: 29.6.3 + jest-util: 29.7.0 + jest-worker: 29.7.0 + micromatch: 4.0.5 + walker: 1.0.8 + optionalDependencies: + fsevents: 2.3.3 + dev: true + + /jest-leak-detector@29.7.0: + resolution: {integrity: sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + jest-get-type: 29.6.3 + pretty-format: 29.7.0 + dev: true + + /jest-matcher-utils@29.7.0: + resolution: {integrity: sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + chalk: 4.1.2 + jest-diff: 29.7.0 + jest-get-type: 29.6.3 + pretty-format: 29.7.0 + dev: true + + /jest-message-util@29.7.0: + resolution: {integrity: sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@babel/code-frame': 7.24.2 + '@jest/types': 29.6.3 + '@types/stack-utils': 2.0.3 + chalk: 4.1.2 + graceful-fs: 4.2.11 + micromatch: 4.0.5 + pretty-format: 29.7.0 + slash: 3.0.0 + stack-utils: 2.0.6 + dev: true + + /jest-mock@29.7.0: + resolution: {integrity: sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/types': 29.6.3 + '@types/node': 20.12.2 + jest-util: 29.7.0 + dev: true + + /jest-pnp-resolver@1.2.3(jest-resolve@29.7.0): + resolution: {integrity: sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==} + engines: {node: '>=6'} + peerDependencies: + jest-resolve: '*' + peerDependenciesMeta: + jest-resolve: + optional: true + dependencies: + jest-resolve: 29.7.0 + dev: true + + /jest-regex-util@29.6.3: + resolution: {integrity: sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dev: true + + /jest-resolve-dependencies@29.7.0: + resolution: {integrity: sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + jest-regex-util: 29.6.3 + jest-snapshot: 29.7.0 + transitivePeerDependencies: + - supports-color + dev: true + + /jest-resolve@29.7.0: + resolution: {integrity: sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + chalk: 4.1.2 + graceful-fs: 4.2.11 + jest-haste-map: 29.7.0 + jest-pnp-resolver: 1.2.3(jest-resolve@29.7.0) + jest-util: 29.7.0 + jest-validate: 29.7.0 + resolve: 1.22.8 + resolve.exports: 2.0.2 + slash: 3.0.0 + dev: true + + /jest-runner@29.7.0: + resolution: {integrity: sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/console': 29.7.0 + '@jest/environment': 29.7.0 + '@jest/test-result': 29.7.0 + '@jest/transform': 29.7.0 + '@jest/types': 29.6.3 + '@types/node': 20.12.2 + chalk: 4.1.2 + emittery: 0.13.1 + graceful-fs: 4.2.11 + jest-docblock: 29.7.0 + jest-environment-node: 29.7.0 + jest-haste-map: 29.7.0 + jest-leak-detector: 29.7.0 + jest-message-util: 29.7.0 + jest-resolve: 29.7.0 + jest-runtime: 29.7.0 + jest-util: 29.7.0 + jest-watcher: 29.7.0 + jest-worker: 29.7.0 + p-limit: 3.1.0 + source-map-support: 0.5.13 + transitivePeerDependencies: + - supports-color + dev: true + + /jest-runtime@29.7.0: + resolution: {integrity: sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/environment': 29.7.0 + '@jest/fake-timers': 29.7.0 + '@jest/globals': 29.7.0 + '@jest/source-map': 29.6.3 + '@jest/test-result': 29.7.0 + '@jest/transform': 29.7.0 + '@jest/types': 29.6.3 + '@types/node': 20.12.2 + chalk: 4.1.2 + cjs-module-lexer: 1.2.3 + collect-v8-coverage: 1.0.2 + glob: 7.2.3 + graceful-fs: 4.2.11 + jest-haste-map: 29.7.0 + jest-message-util: 29.7.0 + jest-mock: 29.7.0 + jest-regex-util: 29.6.3 + jest-resolve: 29.7.0 + jest-snapshot: 29.7.0 + jest-util: 29.7.0 + slash: 3.0.0 + strip-bom: 4.0.0 + transitivePeerDependencies: + - supports-color + dev: true + + /jest-snapshot@29.7.0: + resolution: {integrity: sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@babel/core': 7.24.3 + '@babel/generator': 7.24.1 + '@babel/plugin-syntax-jsx': 7.24.1(@babel/core@7.24.3) + '@babel/plugin-syntax-typescript': 7.24.1(@babel/core@7.24.3) + '@babel/types': 7.24.0 + '@jest/expect-utils': 29.7.0 + '@jest/transform': 29.7.0 + '@jest/types': 29.6.3 + babel-preset-current-node-syntax: 1.0.1(@babel/core@7.24.3) + chalk: 4.1.2 + expect: 29.7.0 + graceful-fs: 4.2.11 + jest-diff: 29.7.0 + jest-get-type: 29.6.3 + jest-matcher-utils: 29.7.0 + jest-message-util: 29.7.0 + jest-util: 29.7.0 + natural-compare: 1.4.0 + pretty-format: 29.7.0 + semver: 7.6.0 + transitivePeerDependencies: + - supports-color + dev: true + + /jest-util@29.7.0: + resolution: {integrity: sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/types': 29.6.3 + '@types/node': 20.12.2 + chalk: 4.1.2 + ci-info: 3.9.0 + graceful-fs: 4.2.11 + picomatch: 2.3.1 + dev: true + + /jest-validate@29.7.0: + resolution: {integrity: sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/types': 29.6.3 + camelcase: 6.3.0 + chalk: 4.1.2 + jest-get-type: 29.6.3 + leven: 3.1.0 + pretty-format: 29.7.0 + dev: true + + /jest-watcher@29.7.0: + resolution: {integrity: sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/test-result': 29.7.0 + '@jest/types': 29.6.3 + '@types/node': 20.12.2 + ansi-escapes: 4.3.2 + chalk: 4.1.2 + emittery: 0.13.1 + jest-util: 29.7.0 + string-length: 4.0.2 + dev: true + + /jest-worker@29.7.0: + resolution: {integrity: sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@types/node': 20.12.2 + jest-util: 29.7.0 + merge-stream: 2.0.0 + supports-color: 8.1.1 + dev: true + + /jest@29.7.0(@types/node@20.12.2): + resolution: {integrity: sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + hasBin: true + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + dependencies: + '@jest/core': 29.7.0 + '@jest/types': 29.6.3 + import-local: 3.1.0 + jest-cli: 29.7.0(@types/node@20.12.2) + transitivePeerDependencies: + - '@types/node' + - babel-plugin-macros + - supports-color + - ts-node + dev: true + + /js-tokens@4.0.0: + resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + + /js-yaml@3.14.1: + resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==} + hasBin: true + dependencies: + argparse: 1.0.10 + esprima: 4.0.1 + dev: true + + /js-yaml@4.1.0: + resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} + hasBin: true + dependencies: + argparse: 2.0.1 + dev: true + + /jsesc@2.5.2: + resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==} + engines: {node: '>=4'} + hasBin: true + dev: true + + /json-buffer@3.0.1: + resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} + dev: true + + /json-parse-even-better-errors@2.3.1: + resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} + dev: true + + /json-schema-traverse@0.4.1: + resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} + dev: true + + /json-stable-stringify-without-jsonify@1.0.1: + resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} + dev: true + + /json5@2.2.3: + resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} + engines: {node: '>=6'} + hasBin: true + dev: true + + /keyv@4.5.4: + resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} + dependencies: + json-buffer: 3.0.1 + dev: true + + /kleur@3.0.3: + resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==} + engines: {node: '>=6'} + dev: true + + /leven@3.1.0: + resolution: {integrity: sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==} + engines: {node: '>=6'} + dev: true + + /levn@0.4.1: + resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} + engines: {node: '>= 0.8.0'} + dependencies: + prelude-ls: 1.2.1 + type-check: 0.4.0 + dev: true + + /lines-and-columns@1.2.4: + resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} + dev: true + + /locate-path@5.0.0: + resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} + engines: {node: '>=8'} + dependencies: + p-locate: 4.1.0 + dev: true + + /locate-path@6.0.0: + resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} + engines: {node: '>=10'} + dependencies: + p-locate: 5.0.0 + dev: true + + /lodash.memoize@4.1.2: + resolution: {integrity: sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==} + dev: true + + /lodash.merge@4.6.2: + resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} + dev: true + + /lru-cache@10.2.0: + resolution: {integrity: sha512-2bIM8x+VAf6JT4bKAljS1qUWgMsqZRPGJS6FSahIMPVvctcNhyVp7AJu7quxOW9jwkryBReKZY5tY5JYv2n/7Q==} + engines: {node: 14 || >=16.14} + dev: true + + /lru-cache@5.1.1: + resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} + dependencies: + yallist: 3.1.1 + dev: true + + /lru-cache@6.0.0: + resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} + engines: {node: '>=10'} + dependencies: + yallist: 4.0.0 + dev: true + + /magic-string@0.30.8: + resolution: {integrity: sha512-ISQTe55T2ao7XtlAStud6qwYPZjE4GK1S/BeVPus4jrq6JuOnQ00YKQC581RWhR122W7msZV263KzVeLoqidyQ==} + engines: {node: '>=12'} + dependencies: + '@jridgewell/sourcemap-codec': 1.4.15 + dev: false + + /make-dir@4.0.0: + resolution: {integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==} + engines: {node: '>=10'} + dependencies: + semver: 7.6.0 + dev: true + + /make-error@1.3.6: + resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} + dev: true + + /makeerror@1.0.12: + resolution: {integrity: sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==} + dependencies: + tmpl: 1.0.5 + dev: true + + /merge-stream@2.0.0: + resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} + dev: true + + /micromatch@4.0.5: + resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} + engines: {node: '>=8.6'} + dependencies: + braces: 3.0.2 + picomatch: 2.3.1 + dev: true + + /mimic-fn@2.1.0: + resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} + engines: {node: '>=6'} + dev: true + + /minimatch@3.1.2: + resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + dependencies: + brace-expansion: 1.1.11 + dev: true + + /minimatch@9.0.4: + resolution: {integrity: sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==} + engines: {node: '>=16 || 14 >=14.17'} + dependencies: + brace-expansion: 2.0.1 + dev: true + + /minipass@7.0.4: + resolution: {integrity: sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==} + engines: {node: '>=16 || 14 >=14.17'} + dev: true + + /ms@2.1.2: + resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} + + /natural-compare@1.4.0: + resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} + dev: true + + /node-int64@0.4.0: + resolution: {integrity: sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==} + dev: true + + /node-releases@2.0.14: + resolution: {integrity: sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==} + dev: true + + /normalize-path@3.0.0: + resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} + engines: {node: '>=0.10.0'} + dev: true + + /npm-run-path@4.0.1: + resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} + engines: {node: '>=8'} + dependencies: + path-key: 3.1.1 + dev: true + + /once@1.4.0: + resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + dependencies: + wrappy: 1.0.2 + dev: true + + /onetime@5.1.2: + resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} + engines: {node: '>=6'} + dependencies: + mimic-fn: 2.1.0 + dev: true + + /optionator@0.9.3: + resolution: {integrity: sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==} + engines: {node: '>= 0.8.0'} + dependencies: + '@aashutoshrathi/word-wrap': 1.2.6 + deep-is: 0.1.4 + fast-levenshtein: 2.0.6 + levn: 0.4.1 + prelude-ls: 1.2.1 + type-check: 0.4.0 + dev: true + + /p-limit@2.3.0: + resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} + engines: {node: '>=6'} + dependencies: + p-try: 2.2.0 + dev: true + + /p-limit@3.1.0: + resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} + engines: {node: '>=10'} + dependencies: + yocto-queue: 0.1.0 + dev: true + + /p-locate@4.1.0: + resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} + engines: {node: '>=8'} + dependencies: + p-limit: 2.3.0 + dev: true + + /p-locate@5.0.0: + resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} + engines: {node: '>=10'} + dependencies: + p-limit: 3.1.0 + dev: true + + /p-try@2.2.0: + resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} + engines: {node: '>=6'} + dev: true + + /parent-module@1.0.1: + resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} + engines: {node: '>=6'} + dependencies: + callsites: 3.1.0 + dev: true + + /parse-json@5.2.0: + resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} + engines: {node: '>=8'} + dependencies: + '@babel/code-frame': 7.24.2 + error-ex: 1.3.2 + json-parse-even-better-errors: 2.3.1 + lines-and-columns: 1.2.4 + dev: true + + /path-exists@4.0.0: + resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} + engines: {node: '>=8'} + dev: true + + /path-is-absolute@1.0.1: + resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} + engines: {node: '>=0.10.0'} + dev: true + + /path-key@3.1.1: + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + engines: {node: '>=8'} + dev: true + + /path-parse@1.0.7: + resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + dev: true + + /path-scurry@1.10.2: + resolution: {integrity: sha512-7xTavNy5RQXnsjANvVvMkEjvloOinkAjv/Z6Ildz9v2RinZ4SBKTWFOVRbaF8p0vpHnyjV/UwNDdKuUv6M5qcA==} + engines: {node: '>=16 || 14 >=14.17'} + dependencies: + lru-cache: 10.2.0 + minipass: 7.0.4 + dev: true + + /picocolors@1.0.0: + resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} + + /picomatch@2.3.1: + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + engines: {node: '>=8.6'} + + /pirates@4.0.6: + resolution: {integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==} + engines: {node: '>= 6'} + dev: true + + /pkg-dir@4.2.0: + resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==} + engines: {node: '>=8'} + dependencies: + find-up: 4.1.0 + dev: true + + /prelude-ls@1.2.1: + resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} + engines: {node: '>= 0.8.0'} + dev: true + + /prettier@3.2.5: + resolution: {integrity: sha512-3/GWa9aOC0YeD7LUfvOG2NiDyhOWRvt1k+rcKhOuYnMY24iiCphgneUfJDyFXd6rZCAnuLBv6UeAULtrhT/F4A==} + engines: {node: '>=14'} + hasBin: true + dev: true + + /pretty-format@29.7.0: + resolution: {integrity: sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/schemas': 29.6.3 + ansi-styles: 5.2.0 + react-is: 18.2.0 + dev: true + + /prompts@2.4.2: + resolution: {integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==} + engines: {node: '>= 6'} + dependencies: + kleur: 3.0.3 + sisteransi: 1.0.5 + dev: true + + /punycode@2.3.1: + resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} + engines: {node: '>=6'} + dev: true + + /pure-rand@6.1.0: + resolution: {integrity: sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA==} + dev: true + + /queue-microtask@1.2.3: + resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + dev: true + + /react-is@18.2.0: + resolution: {integrity: sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==} + dev: true + + /require-directory@2.1.1: + resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} + engines: {node: '>=0.10.0'} + dev: true + + /resolve-cwd@3.0.0: + resolution: {integrity: sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==} + engines: {node: '>=8'} + dependencies: + resolve-from: 5.0.0 + dev: true + + /resolve-from@4.0.0: + resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} + engines: {node: '>=4'} + dev: true + + /resolve-from@5.0.0: + resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} + engines: {node: '>=8'} + dev: true + + /resolve-pkg-maps@1.0.0: + resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} + dev: false + + /resolve.exports@2.0.2: + resolution: {integrity: sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg==} + engines: {node: '>=10'} + dev: true + + /resolve@1.22.8: + resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==} + hasBin: true + dependencies: + is-core-module: 2.13.1 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + dev: true + + /reusify@1.0.4: + resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} + engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + dev: true + + /rimraf@3.0.2: + resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} + hasBin: true + dependencies: + glob: 7.2.3 + dev: true + + /rimraf@5.0.5: + resolution: {integrity: sha512-CqDakW+hMe/Bz202FPEymy68P+G50RfMQK+Qo5YUqc9SPipvbGjCGKd0RSKEelbsfQuw3g5NZDSrlZZAJurH1A==} + engines: {node: '>=14'} + hasBin: true + dependencies: + glob: 10.3.12 + dev: true + + /rollup-plugin-dts@6.1.0(rollup@4.13.2)(typescript@5.4.3): + resolution: {integrity: sha512-ijSCPICkRMDKDLBK9torss07+8dl9UpY9z1N/zTeA1cIqdzMlpkV3MOOC7zukyvQfDyxa1s3Dl2+DeiP/G6DOw==} + engines: {node: '>=16'} + peerDependencies: + rollup: ^3.29.4 || ^4 + typescript: ^4.5 || ^5.0 + dependencies: + magic-string: 0.30.8 + rollup: 4.13.2 + typescript: 5.4.3 + optionalDependencies: + '@babel/code-frame': 7.24.2 + dev: false + + /rollup-plugin-esbuild@6.1.1(esbuild@0.20.2)(rollup@4.13.2): + resolution: {integrity: sha512-CehMY9FAqJD5OUaE/Mi1r5z0kNeYxItmRO2zG4Qnv2qWKF09J2lTy5GUzjJR354ZPrLkCj4fiBN41lo8PzBUhw==} + engines: {node: '>=14.18.0'} + peerDependencies: + esbuild: '>=0.18.0' + rollup: ^1.20.0 || ^2.0.0 || ^3.0.0 || ^4.0.0 + dependencies: + '@rollup/pluginutils': 5.1.0(rollup@4.13.2) + debug: 4.3.4 + es-module-lexer: 1.5.0 + esbuild: 0.20.2 + get-tsconfig: 4.7.3 + rollup: 4.13.2 + transitivePeerDependencies: + - supports-color + dev: false + + /rollup@4.13.2: + resolution: {integrity: sha512-MIlLgsdMprDBXC+4hsPgzWUasLO9CE4zOkj/u6j+Z6j5A4zRY+CtiXAdJyPtgCsc42g658Aeh1DlrdVEJhsL2g==} + engines: {node: '>=18.0.0', npm: '>=8.0.0'} + hasBin: true + dependencies: + '@types/estree': 1.0.5 + optionalDependencies: + '@rollup/rollup-android-arm-eabi': 4.13.2 + '@rollup/rollup-android-arm64': 4.13.2 + '@rollup/rollup-darwin-arm64': 4.13.2 + '@rollup/rollup-darwin-x64': 4.13.2 + '@rollup/rollup-linux-arm-gnueabihf': 4.13.2 + '@rollup/rollup-linux-arm64-gnu': 4.13.2 + '@rollup/rollup-linux-arm64-musl': 4.13.2 + '@rollup/rollup-linux-powerpc64le-gnu': 4.13.2 + '@rollup/rollup-linux-riscv64-gnu': 4.13.2 + '@rollup/rollup-linux-s390x-gnu': 4.13.2 + '@rollup/rollup-linux-x64-gnu': 4.13.2 + '@rollup/rollup-linux-x64-musl': 4.13.2 + '@rollup/rollup-win32-arm64-msvc': 4.13.2 + '@rollup/rollup-win32-ia32-msvc': 4.13.2 + '@rollup/rollup-win32-x64-msvc': 4.13.2 + fsevents: 2.3.3 + + /run-parallel@1.2.0: + resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + dependencies: + queue-microtask: 1.2.3 + dev: true + + /semver@6.3.1: + resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} + hasBin: true + dev: true + + /semver@7.6.0: + resolution: {integrity: sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==} + engines: {node: '>=10'} + hasBin: true + dependencies: + lru-cache: 6.0.0 + dev: true + + /sha256@0.2.0: + resolution: {integrity: sha512-kTWMJUaez5iiT9CcMv8jSq6kMhw3ST0uRdcIWl3D77s6AsLXNXRp3heeqqfu5+Dyfu4hwpQnMzhqHh8iNQxw0w==} + dependencies: + convert-hex: 0.1.0 + convert-string: 0.1.0 + dev: false + + /shebang-command@2.0.0: + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} + engines: {node: '>=8'} + dependencies: + shebang-regex: 3.0.0 + dev: true + + /shebang-regex@3.0.0: + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} + engines: {node: '>=8'} + dev: true + + /signal-exit@3.0.7: + resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} + dev: true + + /signal-exit@4.1.0: + resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} + engines: {node: '>=14'} + dev: true + + /sisteransi@1.0.5: + resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} + dev: true + + /slash@3.0.0: + resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} + engines: {node: '>=8'} + dev: true + + /source-map-support@0.5.13: + resolution: {integrity: sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==} + dependencies: + buffer-from: 1.1.2 + source-map: 0.6.1 + dev: true + + /source-map@0.6.1: + resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} + engines: {node: '>=0.10.0'} + dev: true + + /sprintf-js@1.0.3: + resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} + dev: true + + /stack-utils@2.0.6: + resolution: {integrity: sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==} + engines: {node: '>=10'} + dependencies: + escape-string-regexp: 2.0.0 + dev: true + + /string-length@4.0.2: + resolution: {integrity: sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==} + engines: {node: '>=10'} + dependencies: + char-regex: 1.0.2 + strip-ansi: 6.0.1 + dev: true + + /string-width@4.2.3: + resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} + engines: {node: '>=8'} + dependencies: + emoji-regex: 8.0.0 + is-fullwidth-code-point: 3.0.0 + strip-ansi: 6.0.1 + dev: true + + /string-width@5.1.2: + resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} + engines: {node: '>=12'} + dependencies: + eastasianwidth: 0.2.0 + emoji-regex: 9.2.2 + strip-ansi: 7.1.0 + dev: true + + /strip-ansi@6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} + dependencies: + ansi-regex: 5.0.1 + dev: true + + /strip-ansi@7.1.0: + resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} + engines: {node: '>=12'} + dependencies: + ansi-regex: 6.0.1 + dev: true + + /strip-bom@4.0.0: + resolution: {integrity: sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==} + engines: {node: '>=8'} + dev: true + + /strip-final-newline@2.0.0: + resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} + engines: {node: '>=6'} + dev: true + + /strip-json-comments@3.1.1: + resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} + engines: {node: '>=8'} + dev: true + + /supports-color@5.5.0: + resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} + engines: {node: '>=4'} + dependencies: + has-flag: 3.0.0 + + /supports-color@7.2.0: + resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} + engines: {node: '>=8'} + dependencies: + has-flag: 4.0.0 + dev: true + + /supports-color@8.1.1: + resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} + engines: {node: '>=10'} + dependencies: + has-flag: 4.0.0 + dev: true + + /supports-preserve-symlinks-flag@1.0.0: + resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} + engines: {node: '>= 0.4'} + dev: true + + /test-exclude@6.0.0: + resolution: {integrity: sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==} + engines: {node: '>=8'} + dependencies: + '@istanbuljs/schema': 0.1.3 + glob: 7.2.3 + minimatch: 3.1.2 + dev: true + + /text-table@0.2.0: + resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} + dev: true + + /tmpl@1.0.5: + resolution: {integrity: sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==} + dev: true + + /to-fast-properties@2.0.0: + resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==} + engines: {node: '>=4'} + dev: true + + /to-regex-range@5.0.1: + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + engines: {node: '>=8.0'} + dependencies: + is-number: 7.0.0 + dev: true + + /ts-jest@29.1.2(@babel/core@7.24.3)(esbuild@0.20.2)(jest@29.7.0)(typescript@5.4.3): + resolution: {integrity: sha512-br6GJoH/WUX4pu7FbZXuWGKGNDuU7b8Uj77g/Sp7puZV6EXzuByl6JrECvm0MzVzSTkSHWTihsXt+5XYER5b+g==} + engines: {node: ^16.10.0 || ^18.0.0 || >=20.0.0} + hasBin: true + peerDependencies: + '@babel/core': '>=7.0.0-beta.0 <8' + '@jest/types': ^29.0.0 + babel-jest: ^29.0.0 + esbuild: '*' + jest: ^29.0.0 + typescript: '>=4.3 <6' + peerDependenciesMeta: + '@babel/core': + optional: true + '@jest/types': + optional: true + babel-jest: + optional: true + esbuild: + optional: true + dependencies: + '@babel/core': 7.24.3 + bs-logger: 0.2.6 + esbuild: 0.20.2 + fast-json-stable-stringify: 2.1.0 + jest: 29.7.0(@types/node@20.12.2) + jest-util: 29.7.0 + json5: 2.2.3 + lodash.memoize: 4.1.2 + make-error: 1.3.6 + semver: 7.6.0 + typescript: 5.4.3 + yargs-parser: 21.1.1 + dev: true + + /type-check@0.4.0: + resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} + engines: {node: '>= 0.8.0'} + dependencies: + prelude-ls: 1.2.1 + dev: true + + /type-detect@4.0.8: + resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==} + engines: {node: '>=4'} + dev: true + + /type-fest@0.20.2: + resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} + engines: {node: '>=10'} + dev: true + + /type-fest@0.21.3: + resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==} + engines: {node: '>=10'} + dev: true + + /typescript@5.4.3: + resolution: {integrity: sha512-KrPd3PKaCLr78MalgiwJnA25Nm8HAmdwN3mYUYZgG/wizIo9EainNVQI9/yDavtVFRN2h3k8uf3GLHuhDMgEHg==} + engines: {node: '>=14.17'} + hasBin: true + + /undici-types@5.26.5: + resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} + dev: true + + /update-browserslist-db@1.0.13(browserslist@4.23.0): + resolution: {integrity: sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==} + hasBin: true + peerDependencies: + browserslist: '>= 4.21.0' + dependencies: + browserslist: 4.23.0 + escalade: 3.1.2 + picocolors: 1.0.0 + dev: true + + /uplc-node@0.0.3: + resolution: {integrity: sha512-4vr7+RzsRmzS2xuMMMsAs7/VgUzq0Y6ha03IKY1yvTwTz4JQcrlOB0wISzpQ0wJUCxXCirsWKh95BJdrC9OT+w==} + dev: false + + /uplc-web@0.0.3: + resolution: {integrity: sha512-eRdaVvVzQJoEQ8+ZuXPeI47BhuJJG68sKsteJ/E21pIPY2/omZn49wZ6gcmevWoQuzEtKdPUjjPDiToUfWm0kw==} + dev: false + + /uri-js@4.4.1: + resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + dependencies: + punycode: 2.3.1 + dev: true + + /v8-to-istanbul@9.2.0: + resolution: {integrity: sha512-/EH/sDgxU2eGxajKdwLCDmQ4FWq+kpi3uCmBGpw1xJtnAxEjlD8j8PEiGWpCIMIs3ciNAgH0d3TTJiUkYzyZjA==} + engines: {node: '>=10.12.0'} + dependencies: + '@jridgewell/trace-mapping': 0.3.25 + '@types/istanbul-lib-coverage': 2.0.6 + convert-source-map: 2.0.0 + dev: true + + /walker@1.0.8: + resolution: {integrity: sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==} + dependencies: + makeerror: 1.0.12 + dev: true + + /which@2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true + dependencies: + isexe: 2.0.0 + dev: true + + /wrap-ansi@7.0.0: + resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} + engines: {node: '>=10'} + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + dev: true + + /wrap-ansi@8.1.0: + resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} + engines: {node: '>=12'} + dependencies: + ansi-styles: 6.2.1 + string-width: 5.1.2 + strip-ansi: 7.1.0 + dev: true + + /wrappy@1.0.2: + resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + dev: true + + /write-file-atomic@4.0.2: + resolution: {integrity: sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==} + engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + dependencies: + imurmurhash: 0.1.4 + signal-exit: 3.0.7 + dev: true + + /y18n@5.0.8: + resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} + engines: {node: '>=10'} + dev: true + + /yallist@3.1.1: + resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} + dev: true + + /yallist@4.0.0: + resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} + dev: true + + /yargs-parser@21.1.1: + resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} + engines: {node: '>=12'} + dev: true + + /yargs@17.7.2: + resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} + engines: {node: '>=12'} + dependencies: + cliui: 8.0.1 + escalade: 3.1.2 + get-caller-file: 2.0.5 + require-directory: 2.1.1 + string-width: 4.2.3 + y18n: 5.0.8 + yargs-parser: 21.1.1 + dev: true + + /yocto-queue@0.1.0: + resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} + engines: {node: '>=10'} + dev: true diff --git a/packages/translucent/rollup.config.mjs b/packages/translucent/rollup.config.mjs new file mode 100644 index 0000000..181e6d0 --- /dev/null +++ b/packages/translucent/rollup.config.mjs @@ -0,0 +1,36 @@ +import dts from "rollup-plugin-dts"; +import esbuild from "rollup-plugin-esbuild"; +import json from "@rollup/plugin-json"; + +const name = "index" + +const bundle = (config) => ({ + ...config, + input: "index.ts", + external: (id) => !/^[./]/.test(id), +}); + +export default [ + bundle({ + plugins: [esbuild(), json()], + output: [ + { + file: `build/${name}.js`, + format: "cjs", + sourcemap: true, + }, + { + file: `build/${name}.es.js`, + format: "es", + sourcemap: true, + }, + ], + }), + bundle({ + plugins: [dts()], + output: { + file: `build/${name}.d.ts`, + format: "es", + }, + }), +]; diff --git a/packages/translucent/src/core/core-browser.ts b/packages/translucent/src/core/core-browser.ts deleted file mode 100644 index b016fd7..0000000 --- a/packages/translucent/src/core/core-browser.ts +++ /dev/null @@ -1,5 +0,0 @@ -import * as C from "@dcspark/cardano-multiplatform-lib-browser"; -import * as U from "uplc-web"; -import * as M from "@emurgo/cardano-message-signing-browser"; - -export { C, U, M }; diff --git a/packages/translucent/src/core/core.ts b/packages/translucent/src/core/core.ts index 0964f45..61e14ba 100644 --- a/packages/translucent/src/core/core.ts +++ b/packages/translucent/src/core/core.ts @@ -1,5 +1,138 @@ -import * as C from "@dcspark/cardano-multiplatform-lib-nodejs"; -import * as U from "uplc-node"; -import * as M from "@emurgo/cardano-message-signing-nodejs"; +type CModule = typeof import("@dcspark/cardano-multiplatform-lib-nodejs"); +type UModule = typeof import("uplc-node"); +type MModule = typeof import("@emurgo/cardano-message-signing-nodejs"); -export { C, U, M }; +let C: CModule; +let U: UModule; +let M: MModule; + +async function loadModule() { + if (process.browser) { + C = await import("@dcspark/cardano-multiplatform-lib-browser"); + U = await import("uplc-web"); + M = await import("@emurgo/cardano-message-signing-browser"); + } else { + C = await import("@dcspark/cardano-multiplatform-lib-nodejs"); + U = await import("uplc-node"); + M = await import("@emurgo/cardano-message-signing-nodejs"); + } +} + +class CModuleLoader { + private _wasm: CModule | null = null; + + get get(): CModule { + if (this._wasm === null) { + throw new Error("C has not been loaded"); + } + return this._wasm; + } + + async load(): Promise { + if (this._wasm !== null) { + return; + } + + if (process.browser) { + this._wasm = await import("@dcspark/cardano-multiplatform-lib-browser"); + } else { + this._wasm = await import("@dcspark/cardano-multiplatform-lib-nodejs"); + } + } +} + +class UModuleLoader { + private _wasm: UModule | null = null; + + get get(): UModule { + if (this._wasm === null) { + throw new Error("U has not been loaded"); + } + return this._wasm; + } + + async load(): Promise { + if (this._wasm !== null) { + return; + } + + if (process.browser) { + this._wasm = await import("uplc-web"); + } else { + this._wasm = await import("uplc-node"); + } + } +} + +class MModuleLoader { + private _wasm: MModule | null = null; + + get get(): MModule { + if (this._wasm === null) { + throw new Error("M has not been loaded"); + } + return this._wasm; + } + + async load(): Promise { + if (this._wasm !== null) { + return; + } + + if (process.browser) { + this._wasm = await import("@emurgo/cardano-message-signing-browser"); + } else { + this._wasm = await import("@emurgo/cardano-message-signing-nodejs"); + } + } +} + +export const cModuleLoader: CModuleLoader = new CModuleLoader(); +export const uModuleLoader: UModuleLoader = new UModuleLoader(); +export const mModuleLoader: MModuleLoader = new MModuleLoader(); + +export type { + Address as CAddress, + BigNum as CBigNum, + ByronAddress as CByronAddress, + CertificateBuilderResult as CCertificateBuilderResult, + Ed25519KeyHash as CEd25519KeyHash, + Ed25519KeyHashes as CEd25519KeyHashes, + InputBuilderResult as CInputBuilderResult, + MintBuilderResult as CMintBuilderResult, + NativeScript as CNativeScript, + PlutusData as CPlutusData, + PlutusScript as CPlutusScript, + PlutusV2Script as CPlutusV2Script, + PoolRegistration as CPoolRegistration, + PrivateKey as CPrivateKey, + Redeemer as CRedeemer, + ScriptRef as CScriptRef, + StakeCredential as CStakeCredential, + Transaction as CTransaction, + TransactionBuilder as CTransactionBuilder, + TransactionBuilderConfig as CTransactionBuilderConfig, + TransactionUnspentOutput as CTransactionUnspentOutput, + TransactionUnspentOutputs as CTransactionUnspentOutputs, + TransactionWitnessSet as CTransactionWitnessSet, + Value as CValue, + WithdrawalBuilderResult as CWithdrawalBuilderResult, +} from "@dcspark/cardano-multiplatform-lib-nodejs"; + +export { + C, + U, + M, + loadModule, + cModuleLoader as CModuleLoader, + uModuleLoader as UModuleLoader, + mModuleLoader as MModuleLoader, +}; + +declare global { + namespace NodeJS { + interface Process { + browser: boolean; + } + } +} diff --git a/packages/translucent/src/core/mod.ts b/packages/translucent/src/core/mod.ts index b384d59..8d119de 100644 --- a/packages/translucent/src/core/mod.ts +++ b/packages/translucent/src/core/mod.ts @@ -1 +1 @@ -export * from "./core.ts"; +export * from "./core"; diff --git a/packages/translucent/src/misc/wallet.ts b/packages/translucent/src/misc/wallet.ts index d048e6c..202ea51 100644 --- a/packages/translucent/src/misc/wallet.ts +++ b/packages/translucent/src/misc/wallet.ts @@ -1,6 +1,7 @@ import { Address, C, + CTransaction, fromHex, getAddressDetails, KeyHash, @@ -57,27 +58,27 @@ export function walletFromSeed( const address = options.addressType === "Base" ? C.BaseAddress.new( - networkId, - C.StakeCredential.from_keyhash(paymentKeyHash), - C.StakeCredential.from_keyhash(stakeKeyHash), - ) - .to_address() - .to_bech32(undefined) + networkId, + C.StakeCredential.from_keyhash(paymentKeyHash), + C.StakeCredential.from_keyhash(stakeKeyHash), + ) + .to_address() + .to_bech32(undefined) : C.EnterpriseAddress.new( - networkId, - C.StakeCredential.from_keyhash(paymentKeyHash), - ) - .to_address() - .to_bech32(undefined); + networkId, + C.StakeCredential.from_keyhash(paymentKeyHash), + ) + .to_address() + .to_bech32(undefined); const rewardAddress = options.addressType === "Base" ? C.RewardAddress.new( - networkId, - C.StakeCredential.from_keyhash(stakeKeyHash), - ) - .to_address() - .to_bech32(undefined) + networkId, + C.StakeCredential.from_keyhash(stakeKeyHash), + ) + .to_address() + .to_bech32(undefined) : null; return { @@ -89,7 +90,7 @@ export function walletFromSeed( } export function discoverOwnUsedTxKeyHashes( - tx: C.Transaction, + tx: CTransaction, ownKeyHashes: Array, ownUtxos: Array, ): Array { diff --git a/packages/translucent/src/mod.ts b/packages/translucent/src/mod.ts index 34a19d4..efff5cc 100644 --- a/packages/translucent/src/mod.ts +++ b/packages/translucent/src/mod.ts @@ -1,7 +1,7 @@ -export * from "./core/mod.ts"; -export * from "./translucent/mod.ts"; -export * from "./provider/mod.ts"; -export * from "./types/mod.ts"; -export * from "./utils/mod.ts"; -export * from "./wallets/mod.ts"; -export * from "./plutus/mod.ts"; +export * from "./core/mod"; +export * from "./translucent/mod"; +export * from "./provider/mod"; +export * from "./types/mod"; +export * from "./utils/mod"; +export * from "./wallets/mod"; +export * from "./plutus/mod"; diff --git a/packages/translucent/src/plutus/data.ts b/packages/translucent/src/plutus/data.ts index d746346..73d3987 100644 --- a/packages/translucent/src/plutus/data.ts +++ b/packages/translucent/src/plutus/data.ts @@ -7,9 +7,9 @@ import { TSchema, Type, } from "@sinclair/typebox"; -import { C } from "../core/mod.ts"; -import { Datum, Exact, Json, Redeemer } from "../types/mod.ts"; -import { fromHex, fromText, toHex } from "../utils/utils.ts"; +import { C, CPlutusData } from "../core/mod"; +import { Datum, Exact, Json, Redeemer } from "../types/mod"; +import { fromHex, fromText, toHex } from "../utils/utils"; export class Constr { index: number; @@ -147,28 +147,28 @@ export const Data = { anyOf: items.map((item, index) => item.anyOf[0].fields.length === 0 ? { - ...item.anyOf[0], - index, - } + ...item.anyOf[0], + index, + } : { - dataType: "constructor", - title: (() => { - const title = item.anyOf[0].fields[0].title; - if ( - (title as string).charAt(0) !== - (title as string).charAt(0).toUpperCase() - ) { - throw new Error( - `Enum '${title}' needs to start with an uppercase letter.`, - ); - } - return item.anyOf[0].fields[0].title; - })(), - index, - fields: - item.anyOf[0].fields[0].items || - item.anyOf[0].fields[0].anyOf[0].fields, - }, + dataType: "constructor", + title: (() => { + const title = item.anyOf[0].fields[0].title; + if ( + (title as string).charAt(0) !== + (title as string).charAt(0).toUpperCase() + ) { + throw new Error( + `Enum '${title}' needs to start with an uppercase letter.`, + ); + } + return item.anyOf[0].fields[0].title; + })(), + index, + fields: + item.anyOf[0].fields[0].items || + item.anyOf[0].fields[0].anyOf[0].fields, + }, ), }); return union; @@ -267,7 +267,7 @@ function to( type?: T, recType?: string, ): Datum | Redeemer { - function serialize(data: Data): C.PlutusData { + function serialize(data: Data): CPlutusData { try { if (typeof data === "bigint") { return C.PlutusData.new_integer(C.BigInt.from_str(data.toString())); @@ -314,7 +314,7 @@ function to( * Or apply a shape and cast the cbor encoded data to a certain type. */ function from(raw: Datum | Redeemer, type?: T): T { - function deserialize(data: C.PlutusData): Data { + function deserialize(data: CPlutusData): Data { if (data.kind() === 0) { const constr = data.as_constr_plutus_data()!; const l = constr.data(); @@ -563,14 +563,14 @@ function castFrom(data: Data, type: T): T { // check if named args const args = enumShape.fields[0].title ? Object.fromEntries( - enumShape.fields.map((field: Json, index: number) => [ - field.title, - castFrom(data.fields[index], field), - ]), - ) - : enumShape.fields.map((field: Json, index: number) => + enumShape.fields.map((field: Json, index: number) => [ + field.title, castFrom(data.fields[index], field), - ); + ]), + ) + : enumShape.fields.map((field: Json, index: number) => + castFrom(data.fields[index], field), + ); return { [enumShape.title]: args, @@ -744,14 +744,14 @@ function castTo( // check if named args args instanceof Array ? args.map((item, index) => - castTo(item, enumEntry.fields[index], recType, recShape), - ) + castTo(item, enumEntry.fields[index], recType, recShape), + ) : enumEntry.fields.map((entry: Json) => { - const [_, item]: [string, Json] = Object.entries(args).find( - ([title]) => title === entry.title, - )!; - return castTo(item, entry, recType, recShape); - }), + const [_, item]: [string, Json] = Object.entries(args).find( + ([title]) => title === entry.title, + )!; + return castTo(item, entry, recType, recShape); + }), ); } } diff --git a/packages/translucent/src/plutus/mod.ts b/packages/translucent/src/plutus/mod.ts index c85d3a2..7ee29c3 100644 --- a/packages/translucent/src/plutus/mod.ts +++ b/packages/translucent/src/plutus/mod.ts @@ -1,2 +1,2 @@ -export * from "./data.ts"; -export * from "./time.ts"; +export * from "./data"; +export * from "./time"; diff --git a/packages/translucent/src/plutus/time.ts b/packages/translucent/src/plutus/time.ts index e31ec47..b7e69ac 100644 --- a/packages/translucent/src/plutus/time.ts +++ b/packages/translucent/src/plutus/time.ts @@ -1,4 +1,4 @@ -import { Network, Slot, SlotConfig, UnixTime } from "../types/mod.ts"; +import { Network, Slot, SlotConfig, UnixTime } from "../types/mod"; export const SLOT_CONFIG_NETWORK: Record = { Mainnet: { zeroTime: 1596059091000, zeroSlot: 4492800, slotLength: 1000 }, // Starting at Shelley era diff --git a/packages/translucent/src/provider/emulator.ts b/packages/translucent/src/provider/emulator.ts index 5b0f30a..77e2d91 100644 --- a/packages/translucent/src/provider/emulator.ts +++ b/packages/translucent/src/provider/emulator.ts @@ -1,5 +1,5 @@ -import { C } from "../core/core.ts"; -import { +import { C, CBigNum, CEd25519KeyHashes, CNativeScript } from "../core/core"; +import type { Address, Assets, Credential, @@ -20,22 +20,22 @@ import { UnixTime, UTxO, } from "../types/types.ts"; -import { PROTOCOL_PARAMETERS_DEFAULT } from "../utils/mod.ts"; +import { PROTOCOL_PARAMETERS_DEFAULT } from "../utils/mod"; import { coreToUtxo, fromHex, getAddressDetails, toHex, -} from "../utils/utils.ts"; +} from "../utils/utils"; /** Concatentation of txHash + outputIndex */ type FlatOutRef = string; function verifyNativeScript( - ns: C.NativeScript, - start?: C.BigNum, - end?: C.BigNum, - edKeyHashes?: C.Ed25519KeyHashes, + ns: CNativeScript, + start?: CBigNum, + end?: CBigNum, + edKeyHashes?: CEd25519KeyHashes, ) { return true; } @@ -89,8 +89,8 @@ export class Emulator implements Provider { assets, datumHash: outputData?.asHash ? C.hash_plutus_data( - C.PlutusData.from_bytes(fromHex(outputData.asHash)), - ).to_hex() + C.PlutusData.from_bytes(fromHex(outputData.asHash)), + ).to_hex() : outputData?.hash, datum: outputData?.inline, scriptRef: outputData?.scriptRef, @@ -101,6 +101,13 @@ export class Emulator implements Provider { this.protocolParameters = protocolParameters; } + addUTxO(utxo: UTxO) { + this.ledger[utxo.txHash + utxo.outputIndex] = { + utxo, + spent: false, + } + } + now(): UnixTime { return this.time; } @@ -352,7 +359,7 @@ export class Emulator implements Provider { return scriptHashes; })(); - const nativeHashesOptional: Record = {}; + const nativeHashesOptional: Record = {}; const plutusHashesOptional: ScriptHash[] = []; const plutusHashes = (() => { diff --git a/packages/translucent/src/provider/kupmios.ts b/packages/translucent/src/provider/kupmios.ts index 21e533e..a44aea2 100644 --- a/packages/translucent/src/provider/kupmios.ts +++ b/packages/translucent/src/provider/kupmios.ts @@ -1,4 +1,4 @@ -import { +import type { Address, Assets, CostModels, @@ -14,9 +14,9 @@ import { TxHash, Unit, UTxO, -} from "../types/mod.ts"; -import { C } from "../core/mod.ts"; -import { costModelKeys, fromUnit } from "../utils/mod.ts"; +} from "../types/mod"; +import { C } from "../core/mod"; +import { costModelKeys, fromUnit } from "../utils/mod"; import * as ogmios from "@cardano-ogmios/schema"; function fromMaybeBuffer(x: string | Buffer) { @@ -97,11 +97,11 @@ export class Kupmios implements Provider { result.scriptExecutionPrices!.cpu.split("/"); const protocolParams: ProtocolParameters = { minFeeA: result.minFeeCoefficient, - minFeeB: Number(result.minFeeConstant.lovelace), + minFeeB: Number(result.minFeeConstant.ada.lovelace), maxTxSize: result.maxTransactionSize!.bytes, maxValSize: result.maxValueSize!.bytes, - keyDeposit: BigInt(result.stakeCredentialDeposit.lovelace), - poolDeposit: BigInt(result.stakePoolDeposit.lovelace), + keyDeposit: BigInt(result.stakeCredentialDeposit.ada.lovelace), + poolDeposit: BigInt(result.stakePoolDeposit.ada.lovelace), priceMem: [BigInt(memNum), BigInt(memDenom)], priceStep: [BigInt(stepsNum), BigInt(stepsDenom)], maxTxExMem: BigInt( @@ -130,13 +130,13 @@ export class Kupmios implements Provider { typeof addressOrCredential == "string" ? addressOrCredential : C.EnterpriseAddress.new( - 0, - C.StakeCredential.from_keyhash( - C.Ed25519KeyHash.from_hex(addressOrCredential.hash), - ), - ) - .to_address() - .to_bech32(undefined); + 0, + C.StakeCredential.from_keyhash( + C.Ed25519KeyHash.from_hex(addressOrCredential.hash), + ), + ) + .to_address() + .to_bech32(undefined); let params: ogmios.UtxoByAddresses | ogmios.UtxoByOutputReferences = { addresses: [addy], }; @@ -150,8 +150,8 @@ export class Kupmios implements Provider { | ogmios.QueryLedgerStateUtxoResponse | ogmios.QueryLedgerStateEraMismatch | ogmios.QueryLedgerStateAcquiredExpired = JSON.parse( - fromMaybeBuffer(msg.data), - ); + fromMaybeBuffer(msg.data), + ); if ("result" in response) { res( response.result.map((utxo) => { @@ -169,7 +169,7 @@ export class Kupmios implements Provider { } else { console.error("UTXO Fetch error", response.error); } - } catch {} + } catch { } }, ); }); @@ -185,10 +185,8 @@ export class Kupmios implements Provider { : addressOrCredential.hash; const { policyId, assetName } = fromUnit(unit); const result = (await fetch( - `${this.kupoUrl}/matches/${queryPredicate}${ - isAddress ? "" : "/*" - }?unspent&policy_id=${policyId}${ - assetName ? `&asset_name=${assetName}` : "" + `${this.kupoUrl}/matches/${queryPredicate}${isAddress ? "" : "/*" + }?unspent&policy_id=${policyId}${assetName ? `&asset_name=${assetName}` : "" }`, { headers: this.headers, @@ -207,8 +205,7 @@ export class Kupmios implements Provider { async getUtxoByUnit(unit: Unit): Promise { const { policyId, assetName } = fromUnit(unit); const result = (await fetch( - `${this.kupoUrl}/matches/${policyId}.${ - assetName ? `${assetName}` : "*" + `${this.kupoUrl}/matches/${policyId}.${assetName ? `${assetName}` : "*" }?unspent`, { headers: this.headers, @@ -246,8 +243,8 @@ export class Kupmios implements Provider { | ogmios.QueryLedgerStateUtxoResponse | ogmios.QueryLedgerStateEraMismatch | ogmios.QueryLedgerStateAcquiredExpired = JSON.parse( - fromMaybeBuffer(msg.data), - ); + fromMaybeBuffer(msg.data), + ); if ("result" in response) { res( response.result.map((utxo) => { @@ -265,7 +262,7 @@ export class Kupmios implements Provider { } else { console.error("UTXO Fetch error", response.error); } - } catch {} + } catch { } }, ); }); diff --git a/packages/translucent/src/provider/kupmiosv5.ts b/packages/translucent/src/provider/kupmiosv5.ts index 0e81078..287243a 100644 --- a/packages/translucent/src/provider/kupmiosv5.ts +++ b/packages/translucent/src/provider/kupmiosv5.ts @@ -1,4 +1,4 @@ -import { +import type { Address, Assets, Credential, @@ -13,9 +13,9 @@ import { TxHash, Unit, UTxO, -} from "../types/mod.ts"; -import { C } from "../core/mod.ts"; -import { fromHex, fromUnit, toHex } from "../utils/mod.ts"; +} from "../types/mod"; +import { C } from "../core/mod"; +import { fromHex, fromUnit, toHex } from "../utils/mod"; export class KupmiosV5 implements Provider { kupoUrl: string; ogmiosUrl: string; @@ -87,8 +87,7 @@ export class KupmiosV5 implements Provider { ? addressOrCredential : addressOrCredential.hash; const result = await fetch( - `${this.kupoUrl}/matches/${queryPredicate}${ - isAddress ? "" : "/*" + `${this.kupoUrl}/matches/${queryPredicate}${isAddress ? "" : "/*" }?unspent`, ).then((res) => res.json()); return this.kupmiosUtxosToUtxos(result); @@ -104,10 +103,8 @@ export class KupmiosV5 implements Provider { : addressOrCredential.hash; const { policyId, assetName } = fromUnit(unit); const result = await fetch( - `${this.kupoUrl}/matches/${queryPredicate}${ - isAddress ? "" : "/*" - }?unspent&policy_id=${policyId}${ - assetName ? `&asset_name=${assetName}` : "" + `${this.kupoUrl}/matches/${queryPredicate}${isAddress ? "" : "/*" + }?unspent&policy_id=${policyId}${assetName ? `&asset_name=${assetName}` : "" }`, ).then((res) => res.json()); return this.kupmiosUtxosToUtxos(result); @@ -116,8 +113,7 @@ export class KupmiosV5 implements Provider { async getUtxoByUnit(unit: Unit): Promise { const { policyId, assetName } = fromUnit(unit); const result = await fetch( - `${this.kupoUrl}/matches/${policyId}.${ - assetName ? `${assetName}` : "*" + `${this.kupoUrl}/matches/${policyId}.${assetName ? `${assetName}` : "*" }?unspent`, ).then((res) => res.json()); diff --git a/packages/translucent/src/provider/maestro.ts b/packages/translucent/src/provider/maestro.ts index ee95c0a..26a3524 100644 --- a/packages/translucent/src/provider/maestro.ts +++ b/packages/translucent/src/provider/maestro.ts @@ -1,6 +1,6 @@ -import { C } from "../core/mod.ts"; -import { applyDoubleCborEncoding, fromHex } from "../utils/mod.ts"; -import { +import { C } from "../core/mod"; +import { applyDoubleCborEncoding, fromHex } from "../utils/mod"; +import type { Address, Assets, Credential, @@ -17,7 +17,7 @@ import { Unit, UTxO, } from "../types/mod.ts"; -import packageJson from "../../package.json" assert { type: "json" }; +import packageJson from "../../package.json"; export type MaestroSupportedNetworks = "Mainnet" | "Preprod" | "Preview"; @@ -101,11 +101,11 @@ export class Maestro implements Provider { credentialBech32Query += addressOrCredential.type === "Key" ? C.Ed25519KeyHash.from_hex(addressOrCredential.hash).to_bech32( - "addr_vkh", - ) + "addr_vkh", + ) : C.ScriptHash.from_hex(addressOrCredential.hash).to_bech32( - "addr_shared_vkh", - ); + "addr_shared_vkh", + ); return credentialBech32Query; })(); const qparams = new URLSearchParams({ @@ -147,7 +147,7 @@ export class Maestro implements Provider { } throw new Error( "Location: getUtxoByUnit. Error: Couldn't perform query. Received status code: " + - timestampedAddressesResponse.status, + timestampedAddressesResponse.status, ); } const addressesWithAmount = timestampedAddresses.data; @@ -224,7 +224,7 @@ export class Maestro implements Provider { } else { throw new Error( "Location: getDatum. Error: Couldn't successfully perform query. Received status code: " + - timestampedResultResponse.status, + timestampedResultResponse.status, ); } } @@ -269,7 +269,7 @@ export class Maestro implements Provider { else { throw new Error( "Could not submit transaction. Received status code: " + - response.status, + response.status, ); } } @@ -309,12 +309,12 @@ export class Maestro implements Provider { ? result.reference_script.type == "native" ? undefined : { - type: - result.reference_script.type == "plutusv1" - ? "PlutusV1" - : "PlutusV2", - script: applyDoubleCborEncoding(result.reference_script.bytes!), - } + type: + result.reference_script.type == "plutusv1" + ? "PlutusV1" + : "PlutusV2", + script: applyDoubleCborEncoding(result.reference_script.bytes!), + } : undefined, }; } diff --git a/packages/translucent/src/provider/mod.ts b/packages/translucent/src/provider/mod.ts index 0764b0e..42cfedb 100644 --- a/packages/translucent/src/provider/mod.ts +++ b/packages/translucent/src/provider/mod.ts @@ -1,4 +1,4 @@ -export * from "./kupmios.ts"; -export * from "./kupmiosv5.ts"; -export * from "./maestro.ts"; -export * from "./emulator.ts"; +export * from "./kupmios"; +export * from "./kupmiosv5"; +export * from "./maestro"; +export * from "./emulator"; diff --git a/packages/translucent/src/translucent/message.ts b/packages/translucent/src/translucent/message.ts index 0b0e550..705bb3a 100644 --- a/packages/translucent/src/translucent/message.ts +++ b/packages/translucent/src/translucent/message.ts @@ -1,13 +1,13 @@ -import { Translucent } from "./mod.ts"; -import { +import { Translucent } from "./mod"; +import type { Address, Payload, PrivateKey, RewardAddress, SignedMessage, } from "../types/mod.ts"; -import { signData } from "../misc/sign_data.ts"; -import { C } from "../mod.ts"; +import { signData } from "../misc/sign_data"; +import { C } from "../mod"; export class Message { translucent: Translucent; diff --git a/packages/translucent/src/translucent/mod.ts b/packages/translucent/src/translucent/mod.ts index 6de181f..c849dd7 100644 --- a/packages/translucent/src/translucent/mod.ts +++ b/packages/translucent/src/translucent/mod.ts @@ -1,4 +1,4 @@ -export * from "./translucent.ts"; -export * from "./tx.ts"; -export * from "./tx_complete.ts"; -export * from "./tx_signed.ts"; +export * from "./translucent"; +export * from "./tx"; +export * from "./tx_complete"; +export * from "./tx_signed"; diff --git a/packages/translucent/src/translucent/translucent.ts b/packages/translucent/src/translucent/translucent.ts index 6cbaf58..b43c6df 100644 --- a/packages/translucent/src/translucent/translucent.ts +++ b/packages/translucent/src/translucent/translucent.ts @@ -1,19 +1,16 @@ -import { C } from "../core/mod.ts"; +import { C, CTransactionBuilderConfig } from "../core/mod"; import { createCostModels, fromHex, fromUnit, - paymentCredentialOf, toUnit, Utils, - utxoToCore, -} from "../utils/mod.ts"; -import { +} from "../utils/mod"; +import type { Address, Credential, Delegation, Json, - KeyHash, Network, OutRef, Payload, @@ -27,24 +24,22 @@ import { Unit, UTxO, WalletApi, -} from "../types/mod.ts"; -import { Tx } from "./tx.ts"; -import { TxComplete } from "./tx_complete.ts"; -import { discoverOwnUsedTxKeyHashes, walletFromSeed } from "../misc/wallet.ts"; -import { signData, verifyData } from "../misc/sign_data.ts"; -import { Message } from "./message.ts"; -import { SLOT_CONFIG_NETWORK } from "../plutus/time.ts"; -import { Constr, Data } from "../plutus/data.ts"; -import { Emulator } from "../provider/emulator.ts"; -import { toCore } from "../utils/to.ts"; -import { WalletConnector } from "../wallets/wallet_connector.ts"; -import { AbstractWallet } from "../wallets/abstract.ts"; -import { PrivateKeyWallet } from "../wallets/private_key.ts"; -import { SeedWallet } from "../wallets/seed.ts"; -import { ExternalWallet } from "../wallets/public_wallet.ts"; +} from "../types/mod"; +import { Tx } from "./tx"; +import { TxComplete } from "./tx_complete"; +import { verifyData } from "../misc/sign_data"; +import { Message } from "./message"; +import { SLOT_CONFIG_NETWORK } from "../plutus/time"; +import { Constr, Data } from "../plutus/data"; +import { Emulator } from "../provider/emulator"; +import { WalletConnector } from "../wallets/wallet_connector"; +import { AbstractWallet } from "../wallets/abstract"; +import { PrivateKeyWallet } from "../wallets/private_key"; +import { SeedWallet } from "../wallets/seed"; +import { ExternalWallet } from "../wallets/public_wallet"; export class Translucent { - txBuilderConfig!: C.TransactionBuilderConfig; + txBuilderConfig!: CTransactionBuilderConfig; wallet!: AbstractWallet; provider!: Provider; network: Network = "Mainnet"; diff --git a/packages/translucent/src/translucent/tx.ts b/packages/translucent/src/translucent/tx.ts index cc0b62a..9e1414f 100644 --- a/packages/translucent/src/translucent/tx.ts +++ b/packages/translucent/src/translucent/tx.ts @@ -1,6 +1,6 @@ -import { C, U } from "../core/mod.ts"; -import { Data } from "../mod.ts"; -import { +import { C, CAddress, CCertificateBuilderResult, CInputBuilderResult, CMintBuilderResult, CNativeScript, CPlutusScript, CPlutusV2Script, CPoolRegistration, CRedeemer, CTransactionBuilder, CTransactionUnspentOutput, CWithdrawalBuilderResult, U } from "../core/mod"; +import { Data } from "../mod"; +import type { Address, Assets, CertificateValidator, @@ -10,7 +10,6 @@ import { Lovelace, MintingPolicy, OutputData, - OutRef, PaymentKeyHash, PoolId, PoolParams, @@ -32,29 +31,29 @@ import { PROTOCOL_PARAMETERS_DEFAULT, toScriptRef, utxoToCore, -} from "../utils/mod.ts"; -import { applyDoubleCborEncoding } from "../utils/utils.ts"; -import { Translucent } from "./translucent.ts"; -import { TxComplete } from "./tx_complete.ts"; -import { SLOT_CONFIG_NETWORK } from "../plutus/time.ts"; -import { toCore } from "../utils/to.ts"; +} from "../utils/mod"; +import { applyDoubleCborEncoding, toHex } from "../utils/utils"; +import { Translucent } from "./translucent"; +import { TxComplete } from "./tx_complete"; +import { SLOT_CONFIG_NETWORK } from "../plutus/time"; +import { toCore } from "../utils/to"; type ScriptOrRef = - | { inlineScript: C.PlutusScript } - | { referenceScript: C.PlutusV2Script }; + | { inlineScript: CPlutusScript } + | { referenceScript: CPlutusV2Script }; export class Tx { - txBuilder: C.TransactionBuilder; + txBuilder: CTransactionBuilder; private scripts: Record; - private native_scripts: Record; + private native_scripts: Record; /** Stores the tx instructions, which get executed after calling .complete() */ private tasks: ((that: Tx) => unknown)[]; private earlyTasks: ((that: Tx) => unknown)[]; private translucent: Translucent; - private UTxOs: C.TransactionUnspentOutput[] = []; - private referencedUTxOs: C.TransactionUnspentOutput[] = []; + private UTxOs: CTransactionUnspentOutput[] = []; + private referencedUTxOs: CTransactionUnspentOutput[] = []; constructor(translucent: Translucent) { this.translucent = translucent; @@ -68,6 +67,7 @@ export class Tx { /** Read data from utxos. These utxos are only referenced and not spent. */ readFrom(utxos: UTxO[]): Tx { this.earlyTasks.push(async (that) => { + const refUtxos = new Set(this.referencedUTxOs.map((u) => toHex(u.to_bytes()))); for (const utxo of utxos) { if (utxo.datumHash) { throw "Reference hash not supported"; @@ -77,17 +77,20 @@ export class Tx { // that.txBuilder.add_plutus_data(plutusData); } const coreUtxo = utxoToCore(utxo); - { - let scriptRef = coreUtxo.output().script_ref(); - if (scriptRef) { - let script = scriptRef.script(); - if (!script.as_plutus_v2()) { - throw "Reference script wasn't V2 compatible"; - } - this.scripts[script.hash().to_hex()] = { - referenceScript: script.as_plutus_v2()!, - }; + const coreUtxoHex = toHex(coreUtxo.to_bytes()); + if (refUtxos.has(coreUtxoHex)) { + continue; + } + refUtxos.add(coreUtxoHex); + let scriptRef = coreUtxo.output().script_ref(); + if (scriptRef) { + let script = scriptRef.script(); + if (!script.as_plutus_v2()) { + throw "Reference script wasn't V2 compatible"; } + this.scripts[script.hash().to_hex()] = { + referenceScript: script.as_plutus_v2()!, + }; } this.referencedUTxOs.push(coreUtxo); that.txBuilder.add_reference_input(coreUtxo); @@ -112,7 +115,7 @@ export class Tx { coreUtxo.input(), coreUtxo.output(), ); - let mr: C.InputBuilderResult; + let mr: CInputBuilderResult; let address = coreUtxo.output().address(); let paymentCredential = address.payment_cred(); if (redeemer && paymentCredential?.to_scripthash()) { @@ -192,7 +195,7 @@ export class Tx { ); }); let mintBuilder = C.SingleMintBuilder.new(mintAssets); - let mr: C.MintBuilderResult; + let mr: CMintBuilderResult; if (redeemer) { let script = this.scripts[policyId]; if (!script) { @@ -259,10 +262,16 @@ export class Tx { parseInt(output.output().amount().coin().to_str()), Number(assets.lovelace || 0), ); - valueBuilder = valueBuilder.with_coin_and_asset( - C.BigNum.from_str(coin.toString()), - masset, - ); + if (masset.len() > 0) { + valueBuilder = valueBuilder.with_coin_and_asset( + C.BigNum.from_str(coin.toString()), + masset, + ); + } else { + valueBuilder = valueBuilder.with_coin( + C.BigNum.from_str(coin.toString()) + ); + } } that.txBuilder.add_output(valueBuilder.build()); }); @@ -325,10 +334,16 @@ export class Tx { parseInt(output.output().amount().coin().to_str()), Number(assets.lovelace || 0), ); - valueBuilder = valueBuilder.with_coin_and_asset( - C.BigNum.from_str(coin.toString()), - masset, - ); + if (masset.len() > 0) { + valueBuilder = valueBuilder.with_coin_and_asset( + C.BigNum.from_str(coin.toString()), + masset, + ); + } else { + valueBuilder = valueBuilder.with_coin( + C.BigNum.from_str(coin.toString()) + ); + } } let output = valueBuilder.build(); that.txBuilder.add_output(output); @@ -377,7 +392,7 @@ export class Tx { ), ), ); - let cr: C.CertificateBuilderResult; + let cr: CCertificateBuilderResult; if (redeemer) { let script = this.scripts[credential.to_scripthash()?.to_hex()!]; if (!script) { @@ -455,22 +470,22 @@ export class Tx { const credential = addressDetails.stakeCredential.type === "Key" ? C.StakeCredential.from_keyhash( - C.Ed25519KeyHash.from_bytes( - fromHex(addressDetails.stakeCredential.hash), - ), - ) + C.Ed25519KeyHash.from_bytes( + fromHex(addressDetails.stakeCredential.hash), + ), + ) : C.StakeCredential.from_scripthash( - C.ScriptHash.from_bytes( - fromHex(addressDetails.stakeCredential.hash), - ), - ); + C.ScriptHash.from_bytes( + fromHex(addressDetails.stakeCredential.hash), + ), + ); let certBuilder = C.SingleCertificateBuilder.new( C.Certificate.new_stake_deregistration( C.StakeDeregistration.new(credential), ), ); - let cr: C.CertificateBuilderResult; + let cr: CCertificateBuilderResult; if (redeemer) { let script = this.scripts[credential.to_scripthash()?.to_hex()!]; if (!script) { @@ -573,7 +588,7 @@ export class Tx { rewAdd, C.BigNum.from_str(amount.toString()), ); - let wr: C.WithdrawalBuilderResult; + let wr: CWithdrawalBuilderResult; if (redeemer) { let script = this.scripts[rewAdd.payment_cred()?.to_scripthash()?.to_hex()!]; @@ -603,7 +618,7 @@ export class Tx { } else { let ns = this.native_scripts[ - rewAdd.payment_cred()?.to_scripthash()?.to_hex()! + rewAdd.payment_cred()?.to_scripthash()?.to_hex()! ]; if (!ns) { throw "Script with no redeemer should be a nativescript, but none provided"; @@ -762,7 +777,7 @@ export class Tx { let ns = C.NativeScript.from_bytes(fromHex(script)); this.native_scripts[ns.hash().to_hex()] = ns; } else if (type === "PlutusV1" || type === "PlutusV2") { - let ps: C.PlutusScript; + let ps: CPlutusScript; if (type === "PlutusV1") { ps = C.PlutusScript.from_v1( C.PlutusV1Script.from_bytes(fromHex(applyDoubleCborEncoding(script))), @@ -825,13 +840,13 @@ export class Tx { // } const rawWalletUTxOs = await this.translucent.wallet.getUtxosCore(); - let walletUTxOs: C.TransactionUnspentOutput[] = []; + let walletUTxOs: CTransactionUnspentOutput[] = []; for (let i = 0; i < rawWalletUTxOs.len(); i++) { walletUTxOs.push(rawWalletUTxOs.get(i)); } let allUtxos = [...this.UTxOs, ...walletUTxOs, ...this.referencedUTxOs]; - const changeAddress: C.Address = addressFromWithNetworkCheck( + const changeAddress: CAddress = addressFromWithNetworkCheck( options?.change?.address || (await this.translucent.wallet.address()), this.translucent, ); @@ -841,8 +856,8 @@ export class Tx { ); } this.txBuilder.select_utxos(2); - - { + const isUsingPlutus = Object.keys(this.scripts).length > 0; + if (isUsingPlutus) { let foundUtxo = walletUTxOs.find( (x) => BigInt(x.output().amount().coin().to_str()) >= @@ -865,11 +880,16 @@ export class Tx { let params = this.translucent.provider ? await this.translucent.provider.getProtocolParameters() : PROTOCOL_PARAMETERS_DEFAULT; - let multiAsset = foundUtxo.output().amount().multiasset(); + let multiAsset = foundUtxo.output().amount().multiasset() ?? C.MultiAsset.new(); amtBuilder = amtBuilder.with_asset_and_min_required_coin( - multiAsset || C.MultiAsset.new(), + multiAsset, C.BigNum.from_str(params.coinsPerUtxoByte.toString()), ); + if (multiAsset.len() == 0) { + amtBuilder = amtBuilder.with_coin( + C.BigNum.from_str(amtBuilder.build().output().amount().coin().to_str()) + ); + } const collateralReturn = amtBuilder.build().output(); this.txBuilder.add_collateral(collateralUTxO); this.txBuilder.set_collateral_return(collateralReturn); @@ -928,7 +948,7 @@ export class Tx { ); const redeemers = C.Redeemers.new(); for (const redeemerBytes of uplcResults) { - let redeemer: C.Redeemer = C.Redeemer.from_bytes(redeemerBytes); + let redeemer: CRedeemer = C.Redeemer.from_bytes(redeemerBytes); const exUnits = C.ExUnits.new( C.BigNum.from_str( Math.floor( @@ -955,11 +975,11 @@ export class Tx { const unhashedData = builtTx.witness_set().plutus_data(); let hashes = []; if (unhashedData) { - for (let i = 0; i < unhashedData.len(), i++; ) { + for (let i = 0; i < unhashedData.len(), i++;) { hashes.push(C.hash_plutus_data(unhashedData.get(i)).to_hex()); } } - for (let i = 0; i < builtTx.body().inputs().len(), i++; ) { + for (let i = 0; i < builtTx.body().inputs().len(), i++;) { const input = builtTx.body().inputs().get(i); const utxo = allUtxos.find( (utxo) => utxo.input().to_bytes() == input.to_bytes(), @@ -1010,7 +1030,7 @@ export class Tx { async function createPoolRegistration( poolParams: PoolParams, translucent: Translucent, -): Promise { +): Promise { const poolOwners = C.Ed25519KeyHashes.new(); poolParams.owners.forEach((owner) => { const { stakeCredential } = translucent.utils.getAddressDetails(owner); @@ -1025,8 +1045,8 @@ async function createPoolRegistration( const metadataHash = metadata ? C.PoolMetadata.from_bytes( - Buffer.from(new Uint8Array(metadata)), - ).pool_metadata_hash() + Buffer.from(new Uint8Array(metadata)), + ).pool_metadata_hash() : null; const relays = C.Relays.new(); @@ -1035,8 +1055,8 @@ async function createPoolRegistration( case "SingleHostIp": { const ipV4 = relay.ipV4 ? C.Ipv4.new( - new Uint8Array(relay.ipV4.split(".").map((b) => parseInt(b))), - ) + new Uint8Array(relay.ipV4.split(".").map((b) => parseInt(b))), + ) : undefined; const ipV6 = relay.ipV6 ? C.Ipv6.new(fromHex(relay.ipV6.replaceAll(":", ""))) @@ -1095,7 +1115,7 @@ async function createPoolRegistration( function addressFromWithNetworkCheck( address: Address | RewardAddress, translucent: Translucent, -): C.Address { +): CAddress { const { type, networkId } = translucent.utils.getAddressDetails(address); const actualNetworkId = networkToId(translucent.network); diff --git a/packages/translucent/src/translucent/tx_complete.ts b/packages/translucent/src/translucent/tx_complete.ts index 68a2688..326617c 100644 --- a/packages/translucent/src/translucent/tx_complete.ts +++ b/packages/translucent/src/translucent/tx_complete.ts @@ -1,23 +1,23 @@ -import { C } from "../core/mod.ts"; -import { +import { C, CTransaction } from "../core/mod"; +import type { PrivateKey, Transaction, TransactionWitnesses, TxHash, -} from "../types/mod.ts"; -import { Translucent } from "./translucent.ts"; -import { TxSigned } from "./tx_signed.ts"; -import { fromHex, toHex } from "../utils/mod.ts"; +} from "../types/mod"; +import { Translucent } from "./translucent"; +import { TxSigned } from "./tx_signed"; +import { fromHex, toHex } from "../utils/mod"; export class TxComplete { - txComplete: C.Transaction; - witnessSetBuilder: C.TransactionWitnessSetBuilder; + txComplete: CTransaction; + witnessSetBuilder; private tasks: (() => Promise)[]; private translucent: Translucent; fee: number; exUnits: { cpu: number; mem: number } | null = null; - constructor(translucent: Translucent, tx: C.Transaction) { + constructor(translucent: Translucent, tx: CTransaction) { this.translucent = translucent; this.txComplete = tx; this.witnessSetBuilder = C.TransactionWitnessSetBuilder.new(); diff --git a/packages/translucent/src/translucent/tx_signed.ts b/packages/translucent/src/translucent/tx_signed.ts index 8d4e4b6..222b090 100644 --- a/packages/translucent/src/translucent/tx_signed.ts +++ b/packages/translucent/src/translucent/tx_signed.ts @@ -1,12 +1,12 @@ -import { C } from "../core/mod.ts"; -import { Transaction, TxHash } from "../types/mod.ts"; -import { Translucent } from "./translucent.ts"; -import { toHex } from "../utils/mod.ts"; +import { C, CTransaction } from "../core/mod"; +import type { Transaction, TxHash } from "../types/mod"; +import { Translucent } from "./translucent"; +import { toHex } from "../utils/mod"; export class TxSigned { - txSigned: C.Transaction; + txSigned: CTransaction; private translucent: Translucent; - constructor(translucent: Translucent, tx: C.Transaction) { + constructor(translucent: Translucent, tx: CTransaction) { this.translucent = translucent; this.txSigned = tx; } diff --git a/packages/translucent/src/types/mod.ts b/packages/translucent/src/types/mod.ts index 1aba71e..a478542 100644 --- a/packages/translucent/src/types/mod.ts +++ b/packages/translucent/src/types/mod.ts @@ -1,2 +1,2 @@ -export * from "./types.ts"; -export * from "./global.ts"; +export * from "./types"; +export * from "./global"; diff --git a/packages/translucent/src/types/types.ts b/packages/translucent/src/types/types.ts index 8547fdf..c7022e8 100644 --- a/packages/translucent/src/types/types.ts +++ b/packages/translucent/src/types/types.ts @@ -1,5 +1,3 @@ -import { C } from "../core/mod.ts"; - type CostModel = Record; export type CostModels = Record; diff --git a/packages/translucent/src/utils/cost_model.ts b/packages/translucent/src/utils/cost_model.ts index 19d611a..03472ce 100644 --- a/packages/translucent/src/utils/cost_model.ts +++ b/packages/translucent/src/utils/cost_model.ts @@ -1,8 +1,8 @@ -import { C } from "../core/mod.ts"; -import { CostModels } from "../mod.ts"; -import { ProtocolParameters } from "../types/types.ts"; +import { C } from "../core/mod"; +import type { CostModels } from "../mod"; +import type { ProtocolParameters } from "../types/types"; -export function createCostModels(costModels: CostModels): C.Costmdls { +export function createCostModels(costModels: CostModels) { const costmdls = C.Costmdls.new(); // add plutus v1 diff --git a/packages/translucent/src/utils/mod.ts b/packages/translucent/src/utils/mod.ts index 360943f..d290973 100644 --- a/packages/translucent/src/utils/mod.ts +++ b/packages/translucent/src/utils/mod.ts @@ -1,2 +1,2 @@ -export * from "./cost_model.ts"; -export * from "./utils.ts"; +export * from "./cost_model"; +export * from "./utils"; diff --git a/packages/translucent/src/utils/to.ts b/packages/translucent/src/utils/to.ts index ca0ac7c..44100f9 100644 --- a/packages/translucent/src/utils/to.ts +++ b/packages/translucent/src/utils/to.ts @@ -1,8 +1,7 @@ -import * as C from "@dcspark/cardano-multiplatform-lib-nodejs"; -import { Credential } from "../mod"; +import { C, type CStakeCredential, type Credential } from "../mod"; export const toCore = { - credential(credential: Credential): C.StakeCredential { + credential(credential: Credential): CStakeCredential { if (credential.type == "Key") { return C.StakeCredential.from_keyhash( C.Ed25519KeyHash.from_hex(credential.hash), diff --git a/packages/translucent/src/utils/utils.ts b/packages/translucent/src/utils/utils.ts index ec9eff3..66cd63e 100644 --- a/packages/translucent/src/utils/utils.ts +++ b/packages/translucent/src/utils/utils.ts @@ -1,5 +1,5 @@ -import { C, U } from "../core/mod.ts"; -import { +import { C, CAddress, CByronAddress, CNativeScript, CScriptRef, CTransactionUnspentOutput, CValue, U } from "../core/mod"; +import type { Address, AddressDetails, Assets, @@ -25,16 +25,16 @@ import { UTxO, Validator, WithdrawalValidator, -} from "../types/mod.ts"; -import { Translucent } from "../translucent/mod.ts"; -import { generateMnemonic } from "../misc/bip39.ts"; -import { crc8 } from "../misc/crc8.ts"; +} from "../types/mod"; +import { Translucent } from "../translucent/mod"; +import { generateMnemonic } from "../misc/bip39"; +import { crc8 } from "../misc/crc8"; import { SLOT_CONFIG_NETWORK, slotToBeginUnixTime, unixTimeToEnclosingSlot, -} from "../plutus/time.ts"; -import { Data } from "../plutus/data.ts"; +} from "../plutus/time"; +import { Data } from "../plutus/data"; import { toCore } from "./to"; export class Utils { @@ -75,18 +75,18 @@ export class Utils { networkToId(this.translucent.network), paymentCredential.type === "Key" ? C.StakeCredential.from_keyhash( - C.Ed25519KeyHash.from_hex(paymentCredential.hash), - ) + C.Ed25519KeyHash.from_hex(paymentCredential.hash), + ) : C.StakeCredential.from_scripthash( - C.ScriptHash.from_hex(paymentCredential.hash), - ), + C.ScriptHash.from_hex(paymentCredential.hash), + ), stakeCredential.type === "Key" ? C.StakeCredential.from_keyhash( - C.Ed25519KeyHash.from_hex(stakeCredential.hash), - ) + C.Ed25519KeyHash.from_hex(stakeCredential.hash), + ) : C.StakeCredential.from_scripthash( - C.ScriptHash.from_hex(stakeCredential.hash), - ), + C.ScriptHash.from_hex(stakeCredential.hash), + ), ) .to_address() .to_bech32(undefined); @@ -95,11 +95,11 @@ export class Utils { networkToId(this.translucent.network), paymentCredential.type === "Key" ? C.StakeCredential.from_keyhash( - C.Ed25519KeyHash.from_hex(paymentCredential.hash), - ) + C.Ed25519KeyHash.from_hex(paymentCredential.hash), + ) : C.StakeCredential.from_scripthash( - C.ScriptHash.from_hex(paymentCredential.hash), - ), + C.ScriptHash.from_hex(paymentCredential.hash), + ), ) .to_address() .to_bech32(undefined); @@ -123,11 +123,11 @@ export class Utils { networkToId(this.translucent.network), stakeCredential.type === "Key" ? C.StakeCredential.from_keyhash( - C.Ed25519KeyHash.from_hex(stakeCredential.hash), - ) + C.Ed25519KeyHash.from_hex(stakeCredential.hash), + ) : C.StakeCredential.from_scripthash( - C.ScriptHash.from_hex(stakeCredential.hash), - ), + C.ScriptHash.from_hex(stakeCredential.hash), + ), ) .to_address() .to_bech32(undefined); @@ -226,7 +226,7 @@ export class Utils { } } -function addressFromHexOrBech32(address: string): C.Address { +function addressFromHexOrBech32(address: string): CAddress { try { return C.Address.from_bytes(fromHex(address)); } catch (_e) { @@ -248,25 +248,25 @@ export function getAddressDetails(address: string): AddressDetails { const paymentCredential: Credential = parsedAddress.payment_cred().kind() === 0 ? { - type: "Key", - hash: toHex(parsedAddress.payment_cred().to_keyhash()!.to_bytes()), - } + type: "Key", + hash: toHex(parsedAddress.payment_cred().to_keyhash()!.to_bytes()), + } : { - type: "Script", - hash: toHex( - parsedAddress.payment_cred().to_scripthash()!.to_bytes(), - ), - }; + type: "Script", + hash: toHex( + parsedAddress.payment_cred().to_scripthash()!.to_bytes(), + ), + }; const stakeCredential: Credential = parsedAddress.stake_cred().kind() === 0 ? { - type: "Key", - hash: toHex(parsedAddress.stake_cred().to_keyhash()!.to_bytes()), - } + type: "Key", + hash: toHex(parsedAddress.stake_cred().to_keyhash()!.to_bytes()), + } : { - type: "Script", - hash: toHex(parsedAddress.stake_cred().to_scripthash()!.to_bytes()), - }; + type: "Script", + hash: toHex(parsedAddress.stake_cred().to_scripthash()!.to_bytes()), + }; return { type: "Base", networkId: parsedAddress.to_address().network_id(), @@ -289,15 +289,15 @@ export function getAddressDetails(address: string): AddressDetails { const paymentCredential: Credential = parsedAddress.payment_cred().kind() === 0 ? { - type: "Key", - hash: toHex(parsedAddress.payment_cred().to_keyhash()!.to_bytes()), - } + type: "Key", + hash: toHex(parsedAddress.payment_cred().to_keyhash()!.to_bytes()), + } : { - type: "Script", - hash: toHex( - parsedAddress.payment_cred().to_scripthash()!.to_bytes(), - ), - }; + type: "Script", + hash: toHex( + parsedAddress.payment_cred().to_scripthash()!.to_bytes(), + ), + }; return { type: "Enterprise", networkId: parsedAddress.to_address().network_id(), @@ -319,15 +319,15 @@ export function getAddressDetails(address: string): AddressDetails { const paymentCredential: Credential = parsedAddress.payment_cred().kind() === 0 ? { - type: "Key", - hash: toHex(parsedAddress.payment_cred().to_keyhash()!.to_bytes()), - } + type: "Key", + hash: toHex(parsedAddress.payment_cred().to_keyhash()!.to_bytes()), + } : { - type: "Script", - hash: toHex( - parsedAddress.payment_cred().to_scripthash()!.to_bytes(), - ), - }; + type: "Script", + hash: toHex( + parsedAddress.payment_cred().to_scripthash()!.to_bytes(), + ), + }; return { type: "Pointer", networkId: parsedAddress.to_address().network_id(), @@ -349,15 +349,15 @@ export function getAddressDetails(address: string): AddressDetails { const stakeCredential: Credential = parsedAddress.payment_cred().kind() === 0 ? { - type: "Key", - hash: toHex(parsedAddress.payment_cred().to_keyhash()!.to_bytes()), - } + type: "Key", + hash: toHex(parsedAddress.payment_cred().to_keyhash()!.to_bytes()), + } : { - type: "Script", - hash: toHex( - parsedAddress.payment_cred().to_scripthash()!.to_bytes(), - ), - }; + type: "Script", + hash: toHex( + parsedAddress.payment_cred().to_scripthash()!.to_bytes(), + ), + }; return { type: "Reward", networkId: parsedAddress.to_address().network_id(), @@ -373,7 +373,7 @@ export function getAddressDetails(address: string): AddressDetails { // Limited support for Byron addresses try { - const parsedAddress = ((address: string): C.ByronAddress => { + const parsedAddress = ((address: string): CByronAddress => { try { return C.ByronAddress.from_bytes(fromHex(address)); } catch (_e) { @@ -428,7 +428,7 @@ export function generateSeedPhrase(): string { return generateMnemonic(256); } -export function valueToAssets(value: C.Value): Assets { +export function valueToAssets(value: CValue): Assets { const assets: Assets = {}; assets["lovelace"] = BigInt(value.coin().to_str()); const ma = value.multiasset(); @@ -449,7 +449,7 @@ export function valueToAssets(value: C.Value): Assets { return assets; } -export function assetsToValue(assets: Assets): C.Value { +export function assetsToValue(assets: Assets): CValue { const multiAsset = C.MultiAsset.new(); const lovelace = assets["lovelace"]; const units = Object.keys(assets); @@ -474,11 +474,11 @@ export function assetsToValue(assets: Assets): C.Value { const value = C.Value.new( C.BigNum.from_str(lovelace ? lovelace.toString() : "0"), ); - if (units.length > 1 || !lovelace) value.set_multiasset(multiAsset); + if (policies.length > 0) value.set_multiasset(multiAsset); return value; } -export function fromScriptRef(scriptRef: C.ScriptRef): Script { +export function fromScriptRef(scriptRef: CScriptRef): Script { const kind = scriptRef.script().kind(); switch (kind) { case 0: @@ -501,7 +501,7 @@ export function fromScriptRef(scriptRef: C.ScriptRef): Script { } } -export function toScriptRef(script: Script): C.ScriptRef { +export function toScriptRef(script: Script): CScriptRef { switch (script.type) { case "Native": return C.ScriptRef.new( @@ -528,8 +528,8 @@ export function toScriptRef(script: Script): C.ScriptRef { } } -export function utxoToCore(utxo: UTxO): C.TransactionUnspentOutput { - const address: C.Address = (() => { +export function utxoToCore(utxo: UTxO): CTransactionUnspentOutput { + const address: CAddress = (() => { try { return C.Address.from_bech32(utxo.address); } catch (_e) { @@ -562,7 +562,7 @@ export function utxoToCore(utxo: UTxO): C.TransactionUnspentOutput { ); } -export function coreToUtxo(coreUtxo: C.TransactionUnspentOutput): UTxO { +export function coreToUtxo(coreUtxo: CTransactionUnspentOutput): UTxO { return { txHash: toHex(coreUtxo.input().transaction_id().to_bytes()), outputIndex: parseInt(coreUtxo.input().index().to_str()), @@ -697,7 +697,7 @@ export function nativeScriptFromJson(nativeScript: NativeScript): Script { }; } -function doNativeScriptFromJSON(nativeScript: NativeScript): C.NativeScript { +function doNativeScriptFromJSON(nativeScript: NativeScript): CNativeScript { if (nativeScript.type === "sig") { return C.NativeScript.new_script_pubkey( C.ScriptPubkey.new(C.Ed25519KeyHash.from_hex(nativeScript.keyHash)), diff --git a/packages/translucent/src/wallets/abstract.ts b/packages/translucent/src/wallets/abstract.ts index 8de38e3..7b4eddd 100644 --- a/packages/translucent/src/wallets/abstract.ts +++ b/packages/translucent/src/wallets/abstract.ts @@ -1,6 +1,5 @@ -import { +import type { UTxO, - C, Delegation, Payload, TxHash, @@ -8,15 +7,18 @@ import { RewardAddress, Transaction, SignedMessage, + CTransactionWitnessSet, + CTransactionUnspentOutputs, + CTransaction, } from "../mod"; export abstract class AbstractWallet { abstract address(): Promise
; abstract rewardAddress(): Promise; abstract getUtxos(): Promise; - abstract getUtxosCore(): Promise; + abstract getUtxosCore(): Promise; abstract getDelegation(): Promise; - abstract signTx(tx: C.Transaction): Promise; + abstract signTx(tx: CTransaction): Promise; abstract signMessage( address: Address | RewardAddress, payload: Payload, diff --git a/packages/translucent/src/wallets/chained.ts b/packages/translucent/src/wallets/chained.ts index a41cb9f..690035a 100644 --- a/packages/translucent/src/wallets/chained.ts +++ b/packages/translucent/src/wallets/chained.ts @@ -1,17 +1,20 @@ import { - UTxO, + type UTxO, C, - Delegation, - Payload, - TxHash, - SignedMessage, - Address, - RewardAddress, - Transaction, + type Delegation, + type Payload, + type TxHash, + type SignedMessage, + type Address, + type RewardAddress, + type Transaction, Translucent, utxoToCore, fromHex, coreToUtxo, + CTransaction, + CTransactionWitnessSet, + CTransactionUnspentOutputs, } from "../mod"; import { AbstractWallet } from "./abstract"; @@ -67,7 +70,7 @@ export class ChainedWallet implements AbstractWallet { return Promise.resolve(this.utxos); } - getUtxosCore(): Promise { + getUtxosCore(): Promise { const outputs = C.TransactionUnspentOutputs.new(); const utxos = this.utxos.map(utxoToCore); for (const utxo of utxos) { @@ -80,7 +83,7 @@ export class ChainedWallet implements AbstractWallet { return this.wallet.getDelegation(); } - signTx(tx: C.Transaction): Promise { + signTx(tx: CTransaction): Promise { return this.wallet.signTx(tx); } diff --git a/packages/translucent/src/wallets/private_key.ts b/packages/translucent/src/wallets/private_key.ts index 2b42428..7acf6ba 100644 --- a/packages/translucent/src/wallets/private_key.ts +++ b/packages/translucent/src/wallets/private_key.ts @@ -1,19 +1,23 @@ import { signData } from "../misc/sign_data"; import { - SignedMessage, - PrivateKey, - Address, - RewardAddress, - Transaction, + type SignedMessage, + type PrivateKey, + type Address, + type RewardAddress, + type Transaction, Translucent, - WalletApi, C, - UTxO, + type UTxO, paymentCredentialOf, utxoToCore, - Delegation, - Payload, - TxHash, + type Delegation, + type Payload, + type TxHash, + CTransactionUnspentOutputs, + CTransactionWitnessSet, + CTransaction, + CPrivateKey, + CEd25519KeyHash, } from "../mod"; import { AbstractWallet } from "./abstract"; @@ -24,8 +28,8 @@ import { AbstractWallet } from "./abstract"; export class PrivateKeyWallet implements AbstractWallet { translucent: Translucent; private privateKey: PrivateKey; - private priv: C.PrivateKey; - pubKeyHash: C.Ed25519KeyHash; + private priv: CPrivateKey; + pubKeyHash: CEd25519KeyHash; constructor(translucent: Translucent, privateKey: PrivateKey) { this.translucent = translucent; @@ -51,7 +55,7 @@ export class PrivateKeyWallet implements AbstractWallet { paymentCredentialOf(await this.address()), ); } - async getUtxosCore(): Promise { + async getUtxosCore(): Promise { const utxos = await this.translucent.utxosAt( paymentCredentialOf(await this.address()), ); @@ -66,7 +70,7 @@ export class PrivateKeyWallet implements AbstractWallet { return { poolId: null, rewards: 0n }; } // deno-lint-ignore require-await - async signTx(tx: C.Transaction): Promise { + async signTx(tx: CTransaction): Promise { const witness = C.make_vkey_witness( C.hash_transaction(tx.body()), this.priv, diff --git a/packages/translucent/src/wallets/public_wallet.ts b/packages/translucent/src/wallets/public_wallet.ts index 9a79ab3..c591004 100644 --- a/packages/translucent/src/wallets/public_wallet.ts +++ b/packages/translucent/src/wallets/public_wallet.ts @@ -1,16 +1,18 @@ import { C, - UTxO, + type UTxO, paymentCredentialOf, utxoToCore, - Delegation, - TxHash, - Address, - RewardAddress, - Transaction, - SignedMessage, + type Delegation, + type TxHash, + type Address, + type RewardAddress, + type Transaction, + type SignedMessage, Translucent, - AddressDetails, + type AddressDetails, + CTransactionWitnessSet, + CTransactionUnspentOutputs, } from "../mod"; import { toCore } from "../utils/to"; import { AbstractWallet } from "./abstract"; @@ -51,12 +53,12 @@ export class ExternalWallet implements AbstractWallet { const rewardAddr = !this.walletDetails.rewardAddress && this.addressDetails.stakeCredential ? (() => - C.RewardAddress.new( - this.translucent.network === "Mainnet" ? 1 : 0, - toCore.credential(this.addressDetails.stakeCredential), - ) - .to_address() - .to_bech32(undefined))() + C.RewardAddress.new( + this.translucent.network === "Mainnet" ? 1 : 0, + toCore.credential(this.addressDetails.stakeCredential), + ) + .to_address() + .to_bech32(undefined))() : this.walletDetails.rewardAddress; return rewardAddr || null; } @@ -64,16 +66,16 @@ export class ExternalWallet implements AbstractWallet { return this.walletDetails.utxos ? this.walletDetails.utxos : await this.translucent.utxosAt( - paymentCredentialOf(this.walletDetails.address), - ); + paymentCredentialOf(this.walletDetails.address), + ); } - async getUtxosCore(): Promise { + async getUtxosCore(): Promise { const coreUtxos = C.TransactionUnspentOutputs.new(); (this.walletDetails.utxos ? this.walletDetails.utxos : await this.translucent.utxosAt( - paymentCredentialOf(this.walletDetails.address), - ) + paymentCredentialOf(this.walletDetails.address), + ) ).forEach((utxo) => coreUtxos.add(utxoToCore(utxo))); return coreUtxos; } @@ -84,7 +86,7 @@ export class ExternalWallet implements AbstractWallet { ? await this.translucent.delegationAt(rewardAddr) : { poolId: null, rewards: 0n }; } - async signTx(): Promise { + async signTx(): Promise { throw new Error("Not implemented"); } async signMessage(): Promise { diff --git a/packages/translucent/src/wallets/seed.ts b/packages/translucent/src/wallets/seed.ts index 265f661..30be5b1 100644 --- a/packages/translucent/src/wallets/seed.ts +++ b/packages/translucent/src/wallets/seed.ts @@ -1,19 +1,22 @@ import { signData } from "../misc/sign_data"; import { discoverOwnUsedTxKeyHashes, walletFromSeed } from "../misc/wallet"; import { - Address, + type Address, C, - Delegation, - KeyHash, - Payload, - RewardAddress, - SignedMessage, - Transaction, + type Delegation, + type KeyHash, + type Payload, + type RewardAddress, + type SignedMessage, + type Transaction, Translucent, - TxHash, - UTxO, + type TxHash, + type UTxO, paymentCredentialOf, utxoToCore, + CTransaction, + CTransactionWitnessSet, + CTransactionUnspentOutputs, } from "../mod"; import { AbstractWallet } from "./abstract"; @@ -25,8 +28,6 @@ export class SeedWallet implements AbstractWallet { translucent: Translucent; private address_: string; private rewardAddress_: string | null; - private paymentKey: string; - private stakeKey: string | null; private paymentKeyHash: string; private stakeKeyHash: string; private privKeyHashMap: Record; @@ -51,8 +52,6 @@ export class SeedWallet implements AbstractWallet { ); this.address_ = address; this.rewardAddress_ = rewardAddress; - this.paymentKey = paymentKey; - this.stakeKey = stakeKey; const paymentKeyHash = C.PrivateKey.from_bech32(paymentKey) .to_public() .hash() @@ -81,7 +80,7 @@ export class SeedWallet implements AbstractWallet { async getUtxos(): Promise { return this.translucent.utxosAt(paymentCredentialOf(this.address_)); } - async getUtxosCore(): Promise { + async getUtxosCore(): Promise { const coreUtxos = C.TransactionUnspentOutputs.new(); ( await this.translucent.utxosAt(paymentCredentialOf(this.address_)) @@ -96,7 +95,7 @@ export class SeedWallet implements AbstractWallet { ? await this.translucent.delegationAt(rewardAddr) : { poolId: null, rewards: 0n }; } - async signTx(tx: C.Transaction): Promise { + async signTx(tx: CTransaction): Promise { const utxos = await this.translucent.utxosAt(this.address_); const ownKeyHashes: Array = [ this.paymentKeyHash, diff --git a/packages/translucent/src/wallets/wallet_connector.ts b/packages/translucent/src/wallets/wallet_connector.ts index e16f081..67381c0 100644 --- a/packages/translucent/src/wallets/wallet_connector.ts +++ b/packages/translucent/src/wallets/wallet_connector.ts @@ -1,18 +1,21 @@ import { - Address, - Delegation, - Payload, - RewardAddress, - SignedMessage, - Transaction, - TxHash, - UTxO, - WalletApi, + type Address, + type Delegation, + type Payload, + type RewardAddress, + type SignedMessage, + type Transaction, + type TxHash, + type UTxO, + type WalletApi, coreToUtxo, fromHex, toHex, C, Translucent, + CTransactionUnspentOutputs, + CTransaction, + CTransactionWitnessSet, } from "../mod"; import { AbstractWallet } from "./abstract"; @@ -42,10 +45,10 @@ export class WalletConnector implements AbstractWallet { const [rewardAddressHex] = await this.api.getRewardAddresses(); const rewardAddress = rewardAddressHex ? C.RewardAddress.from_address( - C.Address.from_bytes(fromHex(rewardAddressHex)), - )! - .to_address() - .to_bech32(undefined) + C.Address.from_bytes(fromHex(rewardAddressHex)), + )! + .to_address() + .to_bech32(undefined) : null; return rewardAddress; } @@ -56,7 +59,7 @@ export class WalletConnector implements AbstractWallet { }); return utxos; } - async getUtxosCore(): Promise { + async getUtxosCore(): Promise { const utxos = C.TransactionUnspentOutputs.new(); ((await this.api.getUtxos()) || []).forEach((utxo) => { utxos.add(C.TransactionUnspentOutput.from_bytes(fromHex(utxo))); @@ -69,7 +72,7 @@ export class WalletConnector implements AbstractWallet { ? await this.translucent.delegationAt(rewardAddr) : { poolId: null, rewards: 0n }; } - async signTx(tx: C.Transaction): Promise { + async signTx(tx: CTransaction): Promise { const witnessSet = await this.api.signTx(toHex(tx.to_bytes()), true); return C.TransactionWitnessSet.from_bytes(fromHex(witnessSet)); } diff --git a/packages/translucent/tests/data.test.ts b/packages/translucent/tests/data.test.ts deleted file mode 100644 index 6e3ea7e..0000000 --- a/packages/translucent/tests/data.test.ts +++ /dev/null @@ -1,356 +0,0 @@ -import { Constr, Data, applyParamsToScript } from "../src/mod.ts"; - -it("Roundtrip data bigint", () => { - /* - - TypeScript: - - type MyDatum = bigint - - - Aiken: - - type MyDatum = Int - */ - const MyDatumSchema = Data.Integer(); - type MyDatum = Data.Static; - const MyDatum = MyDatumSchema as unknown as MyDatum; - - const datum: MyDatum = 1234n; - const newDatum = Data.from(Data.to(datum, MyDatum), MyDatum); - expect(datum).toEqual(newDatum); -}); - -it("Roundtrip data string", () => { - /* - - TypeScript: - - type MyDatum = string - - - Aiken: - - type MyDatum = ByteArray - */ - const MyDatumSchema = Data.Bytes(); - type MyDatum = Data.Static; - const MyDatum = MyDatumSchema as unknown as MyDatum; - - const datum: MyDatum = "31313131"; //hex - const newDatum = Data.from(Data.to(datum, MyDatum), MyDatum); - expect(datum).toEqual(newDatum); -}); - -it("Roundtrip data boolean", () => { - /* - - TypeScript: - - type MyDatum = boolean - - - Aiken: - - type MyDatum = Bool - */ - const MyDatumSchema = Data.Boolean(); - type MyDatum = Data.Static; - const MyDatum = MyDatumSchema as unknown as MyDatum; - - const datum: MyDatum = true; - const newDatum = Data.from(Data.to(datum, MyDatum), MyDatum); - expect(datum).toEqual(newDatum); -}); - -it("Roundtrip data object", () => { - /* - - TypeScript: - - type MyDatum = { - myVariableA: string; - myVariableB: bigint | null; - } - - - Aiken: - - type MyDatum { - myVariableA: ByteArray, - myVariableB: Option(Int), - } - */ - const MyDatumSchema = Data.Object({ - myVariableA: Data.Bytes(), - myVariableB: Data.Nullable(Data.Integer()), - }); - type MyDatum = Data.Static; - const MyDatum = MyDatumSchema as unknown as MyDatum; - - const datum: MyDatum = { - myVariableA: "313131", - myVariableB: 5555n, - }; - const newDatum = Data.from(Data.to(datum, MyDatum), MyDatum); - expect(datum).toEqual(newDatum); - - const datumNullable: MyDatum = { - myVariableA: "313131", - myVariableB: null, - }; - const newDatumNullable = Data.from(Data.to(datumNullable, MyDatum), MyDatum); - - expect(datumNullable).toEqual(newDatumNullable); -}); - -it("Roundtrip data array", () => { - /* - - TypeScript: - - type MyDatum = bigint[] - - - Aiken: - - type MyDatum = List - */ - const MyDatumSchema = Data.Array(Data.Integer(), { - minItems: 3, - maxItems: 4, - }); - type MyDatum = Data.Static; - const MyDatum = MyDatumSchema as unknown as MyDatum; - - const datum: MyDatum = [45n, 100n, 9994n, 4281958210985912095n]; - const newDatum = Data.from(Data.to(datum, MyDatum), MyDatum); - expect(datum).toEqual(newDatum); -}); - -it("Roundtrip data map", () => { - /* - - TypeScript: - - type MyDatum = Map - - - Aiken: - - type MyDatum = Dict - */ - const MyDatumSchema = Data.Map(Data.Integer(), Data.Bytes()); - type MyDatum = Data.Static; - const MyDatum = MyDatumSchema as unknown as MyDatum; - - const datum: MyDatum = new Map([ - [3209n, "3131"], - [249218490182n, "32323232"], - ]); - const newDatum = Data.from(Data.to(datum, MyDatum), MyDatum); - expect(datum).toEqual(newDatum); -}); - -it("Roundtrip data enum", () => { - /* - - TypeScript: - - type MyDatum = "Left" | "Down" | "Right" | { Up: [string]; } - - - Aiken: - - type MyDatum { - Left - Down - Right - Up(ByteArray) - } - */ - const MyDatumSchema = Data.Enum([ - Data.Literal("Left"), - Data.Literal("Down"), - Data.Literal("Right"), - Data.Object({ Up: Data.Tuple([Data.Bytes()]) }), - ]); - - type MyDatum = Data.Static; - const MyDatum = MyDatumSchema as unknown as MyDatum; - - const datumLeft: MyDatum = "Left"; - const newDatumLeft = Data.from(Data.to(datumLeft, MyDatum), MyDatum); - expect(datumLeft as MyDatum).toEqual(newDatumLeft); - - const datumUp: MyDatum = { Up: ["313131"] }; - const newDatumUp = Data.from(Data.to(datumUp, MyDatum), MyDatum); - expect(datumUp as MyDatum).toEqual(newDatumUp); -}); - -it("Roundtrip data enum with named args", () => { - /* - - TypeScript: - - type MyDatum = "Left" | "Down" | { Right: [string]; } | { Up: { x: bigint; y: bigint;}; } - - - Aiken: - - type MyDatum { - Left - Down - Right(ByteArray) - Up {x: Int, y: Int} - } - */ - const MyDatumSchema = Data.Enum([ - Data.Literal("Left"), - Data.Literal("Down"), - Data.Object({ Right: Data.Tuple([Data.Bytes()]) }), - Data.Object({ Up: Data.Object({ x: Data.Integer(), y: Data.Bytes() }) }), - ]); - type MyDatum = Data.Static; - const MyDatum = MyDatumSchema as unknown as MyDatum; - - const datumLeft: MyDatum = "Left"; - const newDatumLeft = Data.from(Data.to(datumLeft, MyDatum), MyDatum); - expect(datumLeft as MyDatum).toEqual(newDatumLeft); - - const datumUp: MyDatum = { Up: { x: 100n, y: "3131" } }; - const newDatumUp = Data.from(Data.to(datumUp, MyDatum), MyDatum); - expect(datumUp as MyDatum).toEqual(newDatumUp); - expect(Data.to({ Up: { x: 100n, y: "3131" } }, MyDatum)).toEqual( - Data.to({ Up: { y: "3131", x: 100n } }, MyDatum), - ); -}); - -it("Roundtrip data any", () => { - /* - - TypeScript: - - type MyDatum = Data - - - Aiken: - - type MyDatum = Data - */ - const datum: Data = new Constr(0, []); - const newDatum = Data.from( - Data.to(datum, Data.Any() as unknown as Data), - Data.Any() as unknown as Data, - ); - expect(datum as Data).toEqual(newDatum); -}); - -it("Roundtrip data void", () => { - /* - - TypeScript: - - type MyDatum = undefined - - - Aiken: - - type MyDatum = Void - */ - const MyDatum = { - anyOf: [{ dataType: "constructor", index: 0, fields: [] }], - } as unknown as MyDatum; - type MyDatum = undefined; - const datum: MyDatum = void 0; - const newDatum = Data.from(Data.to(void 0, MyDatum), MyDatum); - expect(datum).toEqual(newDatum); -}); - -it("Roundtrip data tuple", () => { - /* - - TypeScript: - - type MyDatum = [bigint, string] - - - Aiken: - - type MyDatum = (Int, ByteArray) - */ - const MyDatumSchema = Data.Tuple([Data.Integer(), Data.Bytes()]); - type MyDatum = Data.Static; - const MyDatum = MyDatumSchema as unknown as MyDatum; - const datum: MyDatum = [123n, "313131"]; - const newDatum = Data.from(Data.to(datum, MyDatum), MyDatum); - expect(datum).toEqual(newDatum); -}); - -it("Complex data structure", () => { - /* - - TypeScript: - - type MyDatum = "Down" | { - Up: [{ - someVariable: bigint | null; - }[]]; - } - - - Aiken: - - type MyDatum { - Down - Up(List) - } - - type Item { - someVariable: Option(Int) - } - */ - const MyDatumSchema = Data.Enum([ - Data.Object({ - Up: Data.Tuple([ - Data.Array( - Data.Object({ someVariable: Data.Nullable(Data.Integer()) }), - ), - Data.Bytes({ maxLength: 2 }), - ]), - }), - Data.Literal("Down"), - ]); - type MyDatum = Data.Static; - const MyDatum = MyDatumSchema as unknown as MyDatum; - const datum: MyDatum = { - Up: [ - [ - { someVariable: null }, - { someVariable: 123n }, - { - someVariable: 9990324235325n, - }, - ], - "3131", - ], - }; - const newDatum = Data.from(Data.to(datum, MyDatum), MyDatum); - expect(datum as MyDatum).toEqual(newDatum); -}); - -it("Apply params to script", () => { - const script = - "5907945907910100003233223232323232323232323232323322323232323222232325335332232333573466e1c005201401d01c375a00e6666ae68cdc39aab9d37540089000100c11931900c19ab9c0190180163333573466e1cd55cea80124000466442466002006004646464646464646464646464646666ae68cdc39aab9d500c480008cccccccccccc88888888888848cccccccccccc00403403002c02802402001c01801401000c008cd4054058d5d0a80619a80a80b1aba1500b33501501735742a014666aa032eb94060d5d0a804999aa80cbae501835742a01066a02a0406ae85401cccd54064085d69aba150063232323333573466e1cd55cea801240004664424660020060046464646666ae68cdc39aab9d5002480008cc8848cc00400c008cd40add69aba15002302c357426ae8940088c98c80b8cd5ce01781701609aab9e5001137540026ae854008c8c8c8cccd5cd19b8735573aa004900011991091980080180119a815bad35742a00460586ae84d5d1280111931901719ab9c02f02e02c135573ca00226ea8004d5d09aba2500223263202a33573805605405026aae7940044dd50009aba1500533501575c6ae854010ccd540640748004d5d0a801999aa80cbae200135742a004603e6ae84d5d1280111931901319ab9c027026024135744a00226ae8940044d5d1280089aba25001135744a00226ae8940044d5d1280089aba25001135744a00226ae8940044d55cf280089baa00135742a004601e6ae84d5d1280111931900c19ab9c01901801610171326320173357389210350543500017135573ca00226ea800448c88c008dd6000990009aa80b111999aab9f0012500a233500930043574200460066ae880080508c8c8cccd5cd19b8735573aa004900011991091980080180118061aba150023005357426ae8940088c98c8050cd5ce00a80a00909aab9e5001137540024646464646666ae68cdc39aab9d5004480008cccc888848cccc00401401000c008c8c8c8cccd5cd19b8735573aa0049000119910919800801801180a9aba1500233500f014357426ae8940088c98c8064cd5ce00d00c80b89aab9e5001137540026ae854010ccd54021d728039aba150033232323333573466e1d4005200423212223002004357426aae79400c8cccd5cd19b875002480088c84888c004010dd71aba135573ca00846666ae68cdc3a801a400042444006464c6403666ae7007006c06406005c4d55cea80089baa00135742a00466a016eb8d5d09aba2500223263201533573802c02a02626ae8940044d5d1280089aab9e500113754002266aa002eb9d6889119118011bab00132001355013223233335573e0044a010466a00e66442466002006004600c6aae754008c014d55cf280118021aba200301213574200222440042442446600200800624464646666ae68cdc3a800a40004642446004006600a6ae84d55cf280191999ab9a3370ea0049001109100091931900819ab9c01101000e00d135573aa00226ea80048c8c8cccd5cd19b875001480188c848888c010014c01cd5d09aab9e500323333573466e1d400920042321222230020053009357426aae7940108cccd5cd19b875003480088c848888c004014c01cd5d09aab9e500523333573466e1d40112000232122223003005375c6ae84d55cf280311931900819ab9c01101000e00d00c00b135573aa00226ea80048c8c8cccd5cd19b8735573aa004900011991091980080180118029aba15002375a6ae84d5d1280111931900619ab9c00d00c00a135573ca00226ea80048c8cccd5cd19b8735573aa002900011bae357426aae7940088c98c8028cd5ce00580500409baa001232323232323333573466e1d4005200c21222222200323333573466e1d4009200a21222222200423333573466e1d400d2008233221222222233001009008375c6ae854014dd69aba135744a00a46666ae68cdc3a8022400c4664424444444660040120106eb8d5d0a8039bae357426ae89401c8cccd5cd19b875005480108cc8848888888cc018024020c030d5d0a8049bae357426ae8940248cccd5cd19b875006480088c848888888c01c020c034d5d09aab9e500b23333573466e1d401d2000232122222223005008300e357426aae7940308c98c804ccd5ce00a00980880800780700680600589aab9d5004135573ca00626aae7940084d55cf280089baa0012323232323333573466e1d400520022333222122333001005004003375a6ae854010dd69aba15003375a6ae84d5d1280191999ab9a3370ea0049000119091180100198041aba135573ca00c464c6401866ae700340300280244d55cea80189aba25001135573ca00226ea80048c8c8cccd5cd19b875001480088c8488c00400cdd71aba135573ca00646666ae68cdc3a8012400046424460040066eb8d5d09aab9e500423263200933573801401200e00c26aae7540044dd500089119191999ab9a3370ea00290021091100091999ab9a3370ea00490011190911180180218031aba135573ca00846666ae68cdc3a801a400042444004464c6401466ae7002c02802001c0184d55cea80089baa0012323333573466e1d40052002200823333573466e1d40092000200823263200633573800e00c00800626aae74dd5000a4c240029210350543100122002122001112323001001223300330020020011"; - try { - const mintingPolicy = { - type: "PlutusV2", - script: applyParamsToScript( - script, - [10n], - Data.Tuple([Data.Integer()]) as unknown as [bigint], - ), - }; - expect(mintingPolicy).toBeTruthy(); - } catch (e) { - expect(false).toBeTruthy(); - } - try { - const mintingPolicy = { - type: "PlutusV2", - script: applyParamsToScript( - script, - [10n, "3131"], - Data.Tuple([Data.Integer()]) as unknown as unknown[], - ), - }; - expect(!mintingPolicy).toBeTruthy(); - } catch (e) { - expect(true).toBeTruthy(); - } - try { - const mintingPolicy = { - type: "PlutusV2", - script: applyParamsToScript(script, [10n]), - }; - expect(mintingPolicy).toBeTruthy(); - } catch (e) { - expect(false).toBeTruthy(); - } -}); diff --git a/packages/translucent/tests/emulator.test.ts b/packages/translucent/tests/emulator.test.ts deleted file mode 100644 index e735c8f..0000000 --- a/packages/translucent/tests/emulator.test.ts +++ /dev/null @@ -1,271 +0,0 @@ -import { - Assets, - Data, - Emulator, - fromText, - generateSeedPhrase, - getAddressDetails, - Translucent, - SpendingValidator, - toUnit, - TxHash, -} from "../src/mod.ts"; - -async function generateAccount(assets: Assets) { - const seedPhrase = generateSeedPhrase(); - return { - seedPhrase, - address: await (await Translucent.new(undefined, "Custom")) - .selectWalletFromSeed(seedPhrase) - .wallet.address(), - assets, - }; -} - -const ACCOUNT_0 = await generateAccount({ lovelace: 75000000000n }); -const ACCOUNT_1 = await generateAccount({ lovelace: 100000000n }); - -const emulator = new Emulator([ACCOUNT_0, ACCOUNT_1]); - -const translucent = await Translucent.new(emulator); - -translucent.selectWalletFromSeed(ACCOUNT_0.seedPhrase); - -it("Correct start balance", async () => { - const utxos = await translucent.wallet.getUtxos(); - const lovelace = utxos.reduce( - (amount, utxo) => amount + utxo.assets.lovelace, - 0n, - ); - expect(lovelace).toEqual(ACCOUNT_0.assets.lovelace); -}); - -it("Paid to address", async () => { - const recipient = - "addr_test1qrupyvhe20s0hxcusrzlwp868c985dl8ukyr44gfvpqg4ek3vp92wfpentxz4f853t70plkp3vvkzggjxknd93v59uysvc54h7"; - - const datum = Data.to(123n); - const lovelace = 3000000n; - - const tx = await translucent - .newTx() - .payToAddressWithData( - recipient, - { - inline: datum, - }, - { lovelace }, - ) - .complete(); - - const signedTx = await tx.sign().complete(); - const txHash = await signedTx.submit(); - await translucent.awaitTx(txHash); - - const utxos = await translucent.utxosAt(recipient); - - expect(utxos.length).toEqual(1); - - expect(utxos[0].assets.lovelace).toEqual(lovelace); - expect(utxos[0].datum).toEqual(datum); -}); - -it("Missing vkey witness", async () => { - const recipient = - "addr_test1wqag3rt979nep9g2wtdwu8mr4gz6m4kjdpp5zp705km8wys6t2kla"; - - const lovelace = 100000n; - - const tx = await translucent - .newTx() - .payToAddress(recipient, { lovelace }) - .complete(); - - const notSignedTx = await tx.complete(); - try { - const txHash = await notSignedTx.submit(); - await translucent.awaitTx(txHash); - console.log("The tx was never signed. The vkey witness could not exist."); - expect(false).toEqual(false); - } catch (_e) { - expect(true).toEqual(true); - } -}); - -// todo: validate nativescripts & bring this test back -// it("Mint asset in slot range", async () => { -// const { paymentCredential } = getAddressDetails(ACCOUNT_0.address); -// const { paymentCredential: paymentCredential2 } = getAddressDetails( -// ACCOUNT_1.address, -// ); -// const mintingPolicy = translucent.utils.nativeScriptFromJson({ -// type: "all", -// scripts: [ -// { -// type: "before", -// slot: translucent.utils.unixTimeToSlot(emulator.now() + 60000), -// }, -// { type: "sig", keyHash: paymentCredential?.hash! }, -// { type: "sig", keyHash: paymentCredential2?.hash! }, -// ], -// }); - -// const policyId = translucent.utils.mintingPolicyToId(mintingPolicy); -// async function mint(): Promise { -// const tx = await translucent.newTx() -// .mintAssets({ -// [toUnit(policyId, fromText("Wow"))]: 123n, -// }) -// .validTo(emulator.now() + 30000) -// .attachMintingPolicy(mintingPolicy) -// .complete(); - -// await tx.partialSign(); -// translucent.selectWalletFromSeed(ACCOUNT_1.seedPhrase); -// await tx.partialSign(); -// translucent.selectWalletFromSeed(ACCOUNT_0.seedPhrase); -// const signedTx = await tx.complete(); - -// return signedTx.submit(); -// } - -// await mint(); - -// emulator.awaitBlock(4); -// let success = false; -// try { -// await mint(); -// success = true -// } catch (_e) { -// // Failed successfully -// } -// if (success){ -// throw "The transactions should have failed because of exceeding slot range."; -// } -// expect(success).toBeFalsy() -// }); - -it("Reward withdrawal", async () => { - const rewardAddress = await translucent.wallet.rewardAddress(); - const poolId = "pool1jsa3rv0dqtkv2dv2rcx349yfx6rxqyvrnvdye4ps3wxyws6q95m"; - const REWARD_AMOUNT = 100000000n; - expect(await translucent.wallet.getDelegation()).toEqual({ - poolId: null, - rewards: 0n, - }); - emulator.distributeRewards(REWARD_AMOUNT); - expect(await translucent.wallet.getDelegation()).toEqual({ - poolId: null, - rewards: 0n, - }); - // Registration - await translucent.awaitTx( - await ( - await (await translucent.newTx().registerStake(rewardAddress!).complete()) - .sign() - .complete() - ).submit(), - ); - emulator.distributeRewards(REWARD_AMOUNT); - expect(await translucent.wallet.getDelegation()).toEqual({ - poolId: null, - rewards: 0n, - }); - // Delegation - await translucent.awaitTx( - await ( - await ( - await translucent.newTx().delegateTo(rewardAddress!, poolId).complete() - ) - .sign() - .complete() - ).submit(), - ); - emulator.distributeRewards(REWARD_AMOUNT); - expect(await translucent.wallet.getDelegation()).toEqual({ - poolId, - rewards: REWARD_AMOUNT, - }); - // Deregistration - await translucent.awaitTx( - await ( - await ( - await translucent.newTx().deregisterStake(rewardAddress!).complete() - ) - .sign() - .complete() - ).submit(), - ); - expect(await translucent.wallet.getDelegation()).toEqual({ - poolId: null, - rewards: REWARD_AMOUNT, - }); - // Withdrawal - await translucent.awaitTx( - await ( - await ( - await translucent - .newTx() - .withdraw(rewardAddress!, REWARD_AMOUNT) - .complete() - ) - .sign() - .complete() - ).submit(), - ); - expect(await translucent.wallet.getDelegation()).toEqual({ - poolId: null, - rewards: 0n, - }); -}); - -it("Evaluate a contract", async () => { - const alwaysSucceedScript: SpendingValidator = { - type: "PlutusV2", - script: "49480100002221200101", - }; - const scriptAddress = - translucent.utils.validatorToAddress(alwaysSucceedScript); - - const tx = await translucent - .newTx() - .payToContract( - scriptAddress, - { - inline: Data.void(), - }, - { lovelace: 50000000n }, - ) - .complete(); - const signedTx = await tx.sign().complete(); - const txHash = await signedTx.submit(); - await translucent.awaitTx(txHash); - - const scriptUtxos = await translucent.utxosAt(scriptAddress); - - expect(scriptUtxos.length).toEqual(1); - const _txHash = await ( - await ( - await translucent - .newTx() - .collectFrom(scriptUtxos, Data.void()) - .attachSpendingValidator(alwaysSucceedScript) - .complete() - ) - .sign() - .complete() - ).submit(); - emulator.awaitSlot(100); -}); - -it("Check required signer", async () => { - const tx = await translucent - .newTx() - .addSigner(ACCOUNT_1.address) - .payToAddress(ACCOUNT_1.address, { lovelace: 5000000n }) - .complete(); - await tx.partialSign(); - translucent.selectWalletFromSeed(ACCOUNT_1.seedPhrase); - await tx.partialSign(); - await translucent.awaitTx(await tx.complete().then((tx) => tx.submit())); -}); diff --git a/packages/translucent/tests/mod.test.ts b/packages/translucent/tests/mod.test.ts deleted file mode 100644 index 6e6cbf4..0000000 --- a/packages/translucent/tests/mod.test.ts +++ /dev/null @@ -1,460 +0,0 @@ -import { - Assets, - assetsToValue, - C, - Constr, - coreToUtxo, - createCostModels, - Data, - fromHex, - fromLabel, - fromUnit, - Translucent, - PROTOCOL_PARAMETERS_DEFAULT, - SLOT_CONFIG_NETWORK, - toHex, - toLabel, - toUnit, - utxoToCore, - valueToAssets, -} from "../src/mod.ts"; -import * as fc from "fast-check"; - -const privateKey = C.PrivateKey.generate_ed25519().to_bech32(); -const translucent = await Translucent.new(undefined, "Preprod"); - -// Preprod testing parameters - -const slotConfig = SLOT_CONFIG_NETWORK[translucent.network]; - -const protocolParameters = PROTOCOL_PARAMETERS_DEFAULT; - -translucent.txBuilderConfig = C.TransactionBuilderConfigBuilder.new() - .coins_per_utxo_byte( - C.BigNum.from_str(protocolParameters.coinsPerUtxoByte.toString()), - ) - .fee_algo( - C.LinearFee.new( - C.BigNum.from_str(protocolParameters.minFeeA.toString()), - C.BigNum.from_str(protocolParameters.minFeeB.toString()), - ), - ) - .key_deposit(C.BigNum.from_str(protocolParameters.keyDeposit.toString())) - .pool_deposit(C.BigNum.from_str(protocolParameters.poolDeposit.toString())) - .max_tx_size(protocolParameters.maxTxSize) - .max_value_size(protocolParameters.maxValSize) - .collateral_percentage(protocolParameters.collateralPercentage) - .max_collateral_inputs(protocolParameters.maxCollateralInputs) - .ex_unit_prices( - C.ExUnitPrices.new( - C.UnitInterval.new( - C.BigNum.from_str(protocolParameters.priceMem[0].toString()), - C.BigNum.from_str(protocolParameters.priceMem[1].toString()), - ), - C.UnitInterval.new( - C.BigNum.from_str(protocolParameters.priceStep[0].toString()), - C.BigNum.from_str(protocolParameters.priceStep[1].toString()), - ), - ), - ) - .costmdls(createCostModels(protocolParameters.costModels)) - .build(); - -translucent.selectWalletFromPrivateKey(privateKey); - -it("PaymentKeyHash length", async () => { - const { paymentCredential } = translucent.utils.getAddressDetails( - await translucent.wallet.address(), - ); - if (paymentCredential) { - expect(fromHex(paymentCredential.hash).length).toEqual(28); - } else { - expect(paymentCredential).toBeDefined(); - } -}); - -it("Address type", async () => { - const { - address: { bech32 }, - } = translucent.utils.getAddressDetails(await translucent.wallet.address()); - const enterpriseAddress = C.EnterpriseAddress.from_address( - C.Address.from_bech32(bech32), - )! - .to_address() - .to_bech32(undefined); - expect(bech32).toEqual(enterpriseAddress); - expect(bech32).toEqual(await translucent.wallet.address()); -}); - -it("No reward address", async () => { - const { stakeCredential } = translucent.utils.getAddressDetails( - await translucent.wallet.address(), - ); - expect(stakeCredential).toEqual(undefined); - expect(await translucent.wallet.rewardAddress()).toEqual(null); -}); - -it("Switch wallet", async () => { - const oldAddress = await translucent.wallet.address(); - - const newPrivateKey = C.PrivateKey.generate_ed25519().to_bech32(); - translucent.selectWalletFromPrivateKey(newPrivateKey); - - const address = await translucent.wallet.address(); - expect(oldAddress).not.toEqual(address); -}); - -it("Wallet from utxos roundtrip (legacy utxos)", async () => { - const rawUtxos = [ - "8282582040d1e106e587e6123aef50fa4347e34ec8c76f405ee9802ce90a345077b4e264018258390093de07f8feeda49b93c4cfd6817ebcfb7bfc4a0b18237c0196b205da3446b33ae55d27691cbbed080df5182262c307cdab62d3a4883f39df821a009a29bab82d581c126b8676446c84a5cd6e3259223b16a2314c5676b88ae1c1f8579a8fa144744d494e199d72581c3044e869070c8acf8f0ee6c87c285008fde6990f956a07cb9fd1e070a1444e616d6901581c34d1adbf3a7e95b253fd0999fb85e2d41d4121b36b834b83ac069ebba144414749581903ef581c370e055e07af274b588dc9bf3ef3203ec8b6830b7cdfaca9de38fc8fa146506c616e657401581c4122bca203030a36d8b605ab488335b1f2ee40dd7cd1454ce42f545ea143666c7901581c416e45fb08dc61a59a6bea82bde19e3014cef27ac4616c4f583adc15a144436f6f6c01581c4371ba767200e3e50e5dc1ff17f3f8d5154fa606534b03251a58e273a146436f6c6f727301581c46eea81aeed38d5e3595c4bf148a60f28006332ea9721a55748758f4a148456c657068616e7401581c54c1878edf4e6d49eab5b47b95c1bb9c6cf0622bf8dc5df1de6dc51fa1426a6f01581c55b2100ca1ac2f6ad955c5cc8c1c87d0f6155fd6ccb6857b7da5754ca145746f75636801581c57fca08abbaddee36da742a839f7d83a7e1d2419f1507fcbf3916522a54443484f431a0096dfcb444d494e541b0000000129f4a1764556414e494c1a013373b6465242455252591a3b9ac9d4465342455252591a3b9ac985581c5b7e2b5608c0f38eb186241f8b883d2e7bcad382f78c1e4e8993e513a14763616c76696e3101581c5c1c784a488bde15f9519142a9ee07886266598052f3dcc2105a6329a146526f636b657401581c60614c06bc93079c4e884db4dd966d2912aaae32a07a4506f749426ca1445472656501581c64834db34a8719177ee5ce1eda1c4cb91d2dca28bfc536073ba2176aa1445761766501581c648fd48f82c0a0687fb3d48178d0bcb3f0c5fe6cec68a1385129d4faa1444e616d6901581c68fdca4411f9a96df98e5517db3b49be01afc306655bf5e17ace78aea1477363656e65727901581c6998f4f9478186f3c182a4b334ef4e7d440658af06562ace55f74587a1444475636b01581c715b818224e0f83c747e8ab443a647ccf4dd2a6f0b2b37d7af8b3a60a149427574746572666c7901581c7509d2c7f0f3eb36d0336fcb7127bf3db1d5336583908d049e5a3716a1444e616d6901581c75ac2ca896ba71faee950eff23ad269b8dbd7c66e0806164ae74352ca14b526f636b6574416761696e01581c766bb5e84dc3438a5d7b2d686da04047f5c3ea981eac03de63071444a145576174657201581c83e1588347feaa9183030a82aa301b6a60b97c3844cdfd56b4bde133a144526f736501581c844c30a27b7756379ddae50e0dbe86c001d1a576d7adfdccc42c0b0da1444e616d6901581c868c245e1d99b32509542230fe744c120358353f195b6c19845134aca151526f636b6574202121202320242066736401581c890b7c122f3383fc859eecec99fa0ced3521b6e96f521a37de49e8baa1414b01581c9733e6e8f97a60b3a5c1ce6fe82f5c75b030766330bc5b4ea92b8b07a14a416e6f746865724170651842581c9d6eed0860acf0020af0d1f42c4c5eca26a2fb65aa09ed06bfe8d6ffa146666f7265737401581c9e6e63bbd52f0106716c6c920dcc9ad716ac9b001a18259eb20948e2a144436f6f6c01581c9ee64af489f0f8c6b64524988397b17269137d69830ae36c8b1530eba1414101581ca302467c86dfa2ae00e391745ba2de255ea2ec6f634e97a0a8c8bf27a1445374617201581ca380eb65f09337b3a562647823bc7edc9200f1fb8ff3bf1007263b69a1444a4f4f4f01581cbef61059036b3a7dbdb881d8239994f481d521c52908ad4c07421ce0a145506172697301581cc0355288172685f5732362b2bb4b8524223ad80b9cd97510b1460ef0a1414601581cc2f3a2c1af2d8cf25a89c4ed6c5c3bec4a4881341722ff42a31bf8cca1444d6f6f6e01581cc316c4d73ecb737ec21145a2dab42b4ad0dd5409118b482d7c601861a1445465737401581cc5d47df9211545b6b3bcb72e16654b1e46c9151fddbbe87ca0569e2ea14753636f6f74657201581cc921e0caf5ea1d4e313c96a4b416a91e085ba1355d9cd51e1d1e51f0a1414a01581ccf997119d2bf1fcbf73da2648e7eb047d4d0c5d8da04a426f46ee1a3a14472696e6701581cd311d3488cc4fef19d05634adce8534977a3bc6fc18136ad65df1d4fa1446c7120041a00b5b5b9581cd3840433dfd5720677fbcd3a4e14f44b249e3327fe1b8821f549bfd0a14349636501581ce3f3eb3f4f343fae935cea3a95f13cfba4eb7262919aec4b6d497d3aa1414901581ce7273c2510d45ec13847d2371a5289b2e3c132af29a1f8571bc15625a14f526f636b65744c61756e636831323301581cea15a43c13f242786c69c2ad448739430a666d66adf19c1701b1cbefa1414b01581cf334fced32a07a832b57d8795994e59e49c3d7dd8809748ff2eb3f0ea1434a4f4f01", - "82825820109fbbedaa6d8c0ed0262411802ddaf9e8596396cb9e010248f52df65a7d0d87018258390093de07f8feeda49b93c4cfd6817ebcfb7bfc4a0b18237c0196b205da3446b33ae55d27691cbbed080df5182262c307cdab62d3a4883f39df1a1f069542", - ]; - translucent.selectWalletFrom( - "addr_test1qzfauplclmk6fxuncn8adqt7hnahhlz2pvvzxlqpj6eqtk35g6en4e2aya53ewldpqxl2xpzvtps0ndtvtf6fzpl880srm02gc", - rawUtxos.map((raw) => - coreToUtxo(C.TransactionUnspentOutput.from_bytes(fromHex(raw))), - ), - ); - - const rawUtxos_ = (await translucent.wallet.getUtxos()).map((utxo) => - toHex(utxoToCore(utxo).to_bytes()), - ); - - expect(rawUtxos).toEqual(rawUtxos_); -}); - -it("Construct plutus data", () => { - const data = Data.to( - new Constr(1, [BigInt(1), "abcd", "deff", new Constr(0, [])]), - ); - - expect(data).toEqual("d87a9f0142abcd42deffd87980ff"); - // == 122([1, h'ABCD', h'DEFF', 121([])]) -}); - -it("Deserialize plutus data", () => { - const data = "d87a9f0141ab41ded87980ff"; - const desData = Data.from(data); - expect(data).toEqual(Data.to(desData)); -}); - -it("(De)serialize plutus bigint data", () => { - const data = 42n; - const datum = Data.to(data); - expect(data).toEqual(Data.from(datum)); -}); - -it("(De)serialize map", () => { - const m = new Map(); - m.set(2n, 1n); - m.set("53706163654275647a", 2n); - const datum = Data.to(m); - expect(m).toEqual(Data.from(datum) as Map); -}); -it("More complex datum structure", () => { - const data = [new Constr(1, [new Map([[2n, 3n]])])]; - const datum = Data.to(data); - expect(data).toEqual(Data.from(datum)); -}); - -// it("json datum to cbor datum", () => { -// const jsonDatum = { -// fields: [ -// { -// fields: [ -// { -// bytes: "bdd5402a608267d8d47e021a61e5c1ae6aa62a1f770579aa38b88143", -// }, -// { -// map: [ -// { -// k: { -// bytes: "", -// }, -// v: { -// map: [ -// { -// k: { -// bytes: "", -// }, -// v: { -// int: 49000000, -// }, -// }, -// ], -// }, -// }, -// ], -// }, -// { -// list: [ -// { -// fields: [ -// { -// bytes: -// "bdd5402a608267d8d47e021a61e5c1ae6aa62a1f770579aa38b88143", -// }, -// { -// map: [ -// { -// k: { -// bytes: "", -// }, -// v: { -// map: [ -// { -// k: { -// bytes: "", -// }, -// v: { -// int: 49000000, -// }, -// }, -// ], -// }, -// }, -// ], -// }, -// ], -// constructor: 0, -// }, -// { -// fields: [ -// { -// bytes: -// "6900ecb87083dbbe74a65b1036186bc9c12df2878842d936902f0b51", -// }, -// { -// map: [ -// { -// k: { -// bytes: "", -// }, -// v: { -// map: [ -// { -// k: { -// bytes: "", -// }, -// v: { -// int: 735000, -// }, -// }, -// ], -// }, -// }, -// ], -// }, -// ], -// constructor: 0, -// }, -// ], -// }, -// { -// int: 1653325108875, -// }, -// { -// bytes: "f4a4a183be0b0da6e7a7548d1b26f2191b1ab7b2d20ac1c7d97b681c", -// }, -// ], -// constructor: 0, -// }, -// ], -// constructor: 0, -// }; -// const cborDatum = -// "d8799fd8799f581cbdd5402a608267d8d47e021a61e5c1ae6aa62a1f770579aa38b88143a140a1401a02ebae409fd8799f581cbdd5402a608267d8d47e021a61e5c1ae6aa62a1f770579aa38b88143a140a1401a02ebae40ffd8799f581c6900ecb87083dbbe74a65b1036186bc9c12df2878842d936902f0b51a140a1401a000b3718ffff1b00000180f1db168b581cf4a4a183be0b0da6e7a7548d1b26f2191b1ab7b2d20ac1c7d97b681cffff"; -// expect(cborDatum).toEqual(datumJsonToCbor(jsonDatum)); -// }); - -it("Assets to value", () => { - const unit = "0".repeat(56); - const assets = { lovelace: 5000000n, [unit]: 8n }; - - const value = assetsToValue(assets); - expect(BigInt(value.coin().to_str())).toEqual(assets.lovelace); - expect(value.multiasset()!.len()).toEqual(1); -}); - -it("Value to assets", () => { - const value = C.Value.new(C.BigNum.from_str("5000000")); - - const assets = valueToAssets(value); - expect(BigInt(value.coin().to_str())).toEqual(assets.lovelace); -}); - -it("Assets/value conversion property test", () => { - fc.assert( - fc.property( - fc.array( - fc.tuple( - fc.uint8Array({ minLength: 28, maxLength: 28 }), - fc.uint8Array({ minLength: 0, maxLength: 32 }), - fc.bigInt({ min: 0n, max: 18446744073709551615n }), - ), - ), - fc.bigInt({ min: 0n, max: 18446744073709551615n }), - ( - assetsArray: Array<[Uint8Array, Uint8Array, bigint]>, - lovelace: bigint, - ) => { - const assets: Assets = assetsArray.reduce( - (acc, asset) => ({ - ...acc, - [toHex(asset[0]) + toHex(asset[1])]: asset[2], - }), - {}, - ); - assets.lovelace = lovelace; - - expect(assets).toEqual(valueToAssets(assetsToValue(assets))); - }, - ), - ); -}); - -it("PlutusData from JSON", () => { - const plutusData = Data.fromJson({ - test: 123, - }); - expect(plutusData).toEqual(new Map([["74657374", 123n]])); -}); - -it("PlutusData to JSON", () => { - const json = Data.toJson(new Map([["74657374", 123n]])); - expect(json).toEqual({ - test: 123, - }); -}); - -it("JSON Metadata to CBOR Datum", () => { - const cborDatum = Data.to( - Data.fromJson({ - test: 123, - }), - ); - expect(cborDatum).toEqual("a14474657374187b"); -}); - -it("CBOR Datum to JSON Metadata", () => { - const cborDatum = Data.toJson(Data.from("a14474657374187b")); - expect(cborDatum).toEqual({ - test: 123, - }); -}); - -it("toLabel/fromLabel property test", () => { - fc.assert( - fc.property(fc.integer({ min: -1, max: 65536 }), (n: number) => { - if (n < 0 || n > 65535) { - try { - fromLabel(toLabel(n)); - expect(false).toBeFalsy(); - } catch (_e) { - expect(true).toBeTruthy(); - } - } else { - expect(n).toEqual(fromLabel(toLabel(n))); - } - }), - ); -}); - -it("toUnit/fromUnit property test", () => { - fc.assert( - fc.property( - fc.uint8Array({ minLength: 28, maxLength: 28 }), - fc.uint8Array({ minLength: 0, maxLength: 10 }), - fc.integer({ min: 0, max: 65535 }), - (policyRaw: Uint8Array, nameRaw: Uint8Array, label: number) => { - const policyId = toHex(policyRaw); - const name = nameRaw.length > 0 ? toHex(nameRaw) : null; - const assetName = toLabel(label) + (name || ""); - expect(fromUnit(toUnit(policyId, name, label))).toEqual({ - policyId, - assetName, - name, - label, - }); - }, - ), - ); -}); - -it("Preserve task/transaction order", async () => { - translucent.selectWalletFrom( - "addr_test1qq90qrxyw5qtkex0l7mc86xy9a6xkn5t3fcwm6wq33c38t8nhh356yzp7k3qwmhe4fk0g5u6kx5ka4rz5qcq4j7mvh2sts2cfa", - [ - { - txHash: - "2eefc93bc0dda80e78890f1f965733239e1f64f76555e8dcde1a4aa7db67b129", - outputIndex: 3, - assets: { lovelace: 6770556044n }, - address: - "addr_test1qq90qrxyw5qtkex0l7mc86xy9a6xkn5t3fcwm6wq33c38t8nhh356yzp7k3qwmhe4fk0g5u6kx5ka4rz5qcq4j7mvh2sts2cfa", - datumHash: null, - datum: null, - scriptRef: null, - }, - ], - ); - - const txCompA = translucent - .newTx() - .payToAddressWithData( - await translucent.wallet.address(), - { inline: Data.to(0n) }, - {}, - ); - - const txCompB = translucent - .newTx() - .payToAddressWithData( - await translucent.wallet.address(), - { inline: Data.to(10n) }, - {}, - ) - .compose( - translucent - .newTx() - .payToAddressWithData( - await translucent.wallet.address(), - { inline: Data.to(1n) }, - {}, - ) - .compose( - translucent - .newTx() - .payToAddressWithData( - await translucent.wallet.address(), - { inline: Data.to(2n) }, - {}, - ), - ), - ); - - const tx = await translucent - .newTx() - .compose(txCompA) - .compose(txCompB) - .payToAddressWithData( - await translucent.wallet.address(), - { inline: Data.to(3n) }, - {}, - ) - .complete(); - - [0n, 10n, 1n, 2n, 3n].forEach((num, i) => { - const outputNum = BigInt( - tx.txComplete - .body() - .outputs() - .get(i) - .datum() - ?.as_inline_data() - ?.as_integer() - ?.to_str()!, - ); - expect(num).toEqual(outputNum); - }); -}); diff --git a/packages/translucent/tests/test_utils/config.ts b/packages/translucent/tests/test_utils/config.ts deleted file mode 100644 index 946da37..0000000 --- a/packages/translucent/tests/test_utils/config.ts +++ /dev/null @@ -1,13 +0,0 @@ -const CONFIG = { - KUPO_PREVIEW_URL: process.env.KUPO_PREVIEW_URL ?? "", - KUPO_PREVIEW_APIKEY: process.env.KUPO_PREVIEW_APIKEY ?? "", - - OGMIOS_PREVIEW_URL: process.env.OGMIOS_PREVIEW_URL ?? "", - OGMIOS_PREVIEW_APIKEY: process.env.OGMIOS_PREVIEW_APIKEY ?? "", - USE_OGMIOS_V5: process.env.USE_OGMIOS_V5 === "1", - - MAESTRO_API_KEY: process.env.MAESTRO_API_KEY ?? "", - - SEED_PHRASE: process.env.SEED_PHRASE ?? "", -}; -export default CONFIG; diff --git a/packages/translucent/tests/test_utils/mod.ts b/packages/translucent/tests/test_utils/mod.ts deleted file mode 100644 index 5a776e1..0000000 --- a/packages/translucent/tests/test_utils/mod.ts +++ /dev/null @@ -1,29 +0,0 @@ -import { Translucent, KupmiosV5, Kupmios } from "../../src/mod.ts"; -import {} from "../../src/provider/kupmiosv5.ts"; -import CONFIG from "./config.ts"; - -export async function setupTestInstance({ - accountIndex = 0, -}: { - accountIndex: number; -}) { - if (!CONFIG.KUPO_PREVIEW_URL || !CONFIG.OGMIOS_PREVIEW_URL) { - throw new Error("Missing KUPO_URL or OGMIOS_URL environment variable"); - } - const provider = CONFIG.USE_OGMIOS_V5 - ? new KupmiosV5(CONFIG.KUPO_PREVIEW_URL, CONFIG.OGMIOS_PREVIEW_URL) - : new Kupmios(CONFIG.KUPO_PREVIEW_URL, CONFIG.OGMIOS_PREVIEW_URL); - // Using maestro until we rollback Kupmios - // const provider = new Maestro({ - // network: "Preview", - // apiKey: "", - // }); - const translucent = await Translucent.new(provider, "Preview"); - if (!CONFIG.SEED_PHRASE) { - throw new Error("Missing SEED_PHRASE environment variable"); - } - translucent.selectWalletFromSeed(CONFIG.SEED_PHRASE, { accountIndex }); - const address = await translucent.wallet.address(); - const details = translucent.utils.getAddressDetails(address); - return { translucent, address, details }; -} diff --git a/packages/translucent/tests/txs/mint.test.ts b/packages/translucent/tests/txs/mint.test.ts deleted file mode 100644 index 22030c9..0000000 --- a/packages/translucent/tests/txs/mint.test.ts +++ /dev/null @@ -1,42 +0,0 @@ -import { setupTestInstance } from "../test_utils/mod.ts"; - -it("Mint(success): policy with required signature", async () => { - const { translucent, details } = await setupTestInstance({ accountIndex: 0 }); - const mintingPolicy = translucent.utils.nativeScriptFromJson({ - type: "sig", - keyHash: details.paymentCredential?.hash!, - }); - const policyId = translucent.utils.mintingPolicyToId(mintingPolicy); - const unit = policyId.concat("test"); - const tx = await translucent - .newTx() - .attachMintingPolicy(mintingPolicy) - .mintAssets({ [unit]: 1n }) - .addSignerKey(details.paymentCredential?.hash!) - .complete(); - - const signedTx = await tx.sign().complete(); - - await expect(signedTx.submit()).resolves.toBeDefined(); -}); - -it("Mint(fails): policy with required signature - Missing signature", async () => { - const { details: detailsAccount0, address: adr } = await setupTestInstance({ - accountIndex: 0, - }); - const { translucent, address } = await setupTestInstance({ accountIndex: 1 }); - const mintingPolicy = translucent.utils.nativeScriptFromJson({ - type: "sig", - keyHash: detailsAccount0.paymentCredential?.hash!, - }); - const policyId = translucent.utils.mintingPolicyToId(mintingPolicy); - const unit = policyId.concat("test"); - const tx = await translucent - .newTx() - .attachMintingPolicy(mintingPolicy) - .mintAssets({ [unit]: 1n }) - .complete(); - - const signedTx = await tx.sign().complete(); - await expect(signedTx.submit()).rejects.toThrow(); -}); diff --git a/packages/translucent/tsconfig.json b/packages/translucent/tsconfig.json new file mode 100644 index 0000000..ce60339 --- /dev/null +++ b/packages/translucent/tsconfig.json @@ -0,0 +1,24 @@ +{ + "compilerOptions": { + "target": "ES2022", + "module": "ES2022", + "moduleResolution": "node", + "lib": [ + "ES2022", + "DOM" + ], + "outDir": "build-tsc", + "skipLibCheck": true, + "esModuleInterop": true, + "strict": true, + "resolveJsonModule": true + }, + "ts-node": { + "compilerOptions": { + "module": "CommonJS" + } + }, + "include": [ + "src" + ], +} \ No newline at end of file diff --git a/scripts/pump-version.sh b/scripts/pump-version.sh new file mode 100755 index 0000000..2fbace9 --- /dev/null +++ b/scripts/pump-version.sh @@ -0,0 +1,25 @@ +#!/usr/bin/env bash + +set -euo pipefail + +version=$1 + +cd packages/translucent + +echo "update version field" +sed -i -E 's/"version": ".+minswap.+"/"version": "'"$version"'"/' package.json + +echo "publish" +pnpm run build +pnpm publish --no-git-checks + +echo "commit new version" +git add package.json +git commit -m "publish version $version" + +echo "tag version" +git tag "$version" + +echo "push to remote" +git push origin minswap +git push origin "$version"